Chris@0: /** Chris@0: * DO NOT EDIT THIS FILE. Chris@0: * See the following change record for more information, Chris@0: * https://www.drupal.org/node/2815083 Chris@0: * @preserve Chris@0: **/ Chris@0: Chris@0: (function ($, _, Drupal) { Chris@0: Drupal.quickedit.editors.image = Drupal.quickedit.EditorView.extend({ Chris@0: initialize: function initialize(options) { Chris@0: Drupal.quickedit.EditorView.prototype.initialize.call(this, options); Chris@0: Chris@0: this.model.set('originalValue', this.$el.html().trim()); Chris@0: Chris@0: this.model.set('currentValue', function (index, value) { Chris@0: var matches = $(this).attr('name').match(/(alt|title)]$/); Chris@0: if (matches) { Chris@0: var name = matches[1]; Chris@0: var $toolgroup = $('#' + options.fieldModel.toolbarView.getMainWysiwygToolgroupId()); Chris@0: var $input = $toolgroup.find('.quickedit-image-field-info input[name="' + name + '"]'); Chris@0: if ($input.length) { Chris@0: return $input.val(); Chris@0: } Chris@0: } Chris@0: }); Chris@0: }, Chris@0: stateChange: function stateChange(fieldModel, state, options) { Chris@0: var from = fieldModel.previous('state'); Chris@0: switch (state) { Chris@0: case 'inactive': Chris@0: break; Chris@0: Chris@0: case 'candidate': Chris@0: if (from !== 'inactive') { Chris@0: this.$el.find('.quickedit-image-dropzone').remove(); Chris@0: this.$el.removeClass('quickedit-image-element'); Chris@0: } Chris@0: if (from === 'invalid') { Chris@0: this.removeValidationErrors(); Chris@0: } Chris@0: break; Chris@0: Chris@0: case 'highlighted': Chris@0: break; Chris@0: Chris@0: case 'activating': Chris@0: _.defer(function () { Chris@0: fieldModel.set('state', 'active'); Chris@0: }); Chris@0: break; Chris@0: Chris@0: case 'active': Chris@14: { Chris@14: var self = this; Chris@0: Chris@14: this.$el.addClass('quickedit-image-element'); Chris@0: Chris@14: var $dropzone = this.renderDropzone('upload', Drupal.t('Drop file here or click to upload')); Chris@0: Chris@14: $dropzone.on('dragenter', function (e) { Chris@14: $(this).addClass('hover'); Chris@14: }); Chris@14: $dropzone.on('dragleave', function (e) { Chris@14: $(this).removeClass('hover'); Chris@14: }); Chris@0: Chris@14: $dropzone.on('drop', function (e) { Chris@14: if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) { Chris@14: $(this).removeClass('hover'); Chris@14: self.uploadImage(e.originalEvent.dataTransfer.files[0]); Chris@0: } Chris@0: }); Chris@0: Chris@14: $dropzone.on('click', function (e) { Chris@14: $('').trigger('click').on('change', function () { Chris@14: if (this.files.length) { Chris@14: self.uploadImage(this.files[0]); Chris@14: } Chris@14: }); Chris@14: }); Chris@0: Chris@14: $dropzone.on('dragover dragenter dragleave drop click', function (e) { Chris@14: e.preventDefault(); Chris@14: e.stopPropagation(); Chris@14: }); Chris@14: Chris@14: this.renderToolbar(fieldModel); Chris@14: break; Chris@14: } Chris@0: Chris@0: case 'changed': Chris@0: break; Chris@0: Chris@0: case 'saving': Chris@0: if (from === 'invalid') { Chris@0: this.removeValidationErrors(); Chris@0: } Chris@0: Chris@0: this.save(options); Chris@0: break; Chris@0: Chris@0: case 'saved': Chris@0: break; Chris@0: Chris@0: case 'invalid': Chris@0: this.showValidationErrors(); Chris@0: break; Chris@0: } Chris@0: }, Chris@0: uploadImage: function uploadImage(file) { Chris@0: this.renderDropzone('upload loading', Drupal.t('Uploading @file…', { '@file': file.name })); Chris@0: Chris@0: var fieldID = this.fieldModel.get('fieldID'); Chris@0: var url = Drupal.quickedit.util.buildUrl(fieldID, Drupal.url('quickedit/image/upload/!entity_type/!id/!field_name/!langcode/!view_mode')); Chris@0: Chris@0: var data = new FormData(); Chris@0: data.append('files[image]', file); Chris@0: Chris@0: var self = this; Chris@0: this.ajax({ Chris@0: type: 'POST', Chris@0: url: url, Chris@0: data: data, Chris@0: success: function success(response) { Chris@0: var $el = $(self.fieldModel.get('el')); Chris@0: Chris@0: self.fieldModel.set('state', 'changed'); Chris@0: self.fieldModel.get('entity').set('inTempStore', true); Chris@0: self.removeValidationErrors(); Chris@0: Chris@0: var $content = $(response.html).closest('[data-quickedit-field-id]').children(); Chris@0: $el.empty().append($content); Chris@0: } Chris@0: }); Chris@0: }, Chris@0: ajax: function ajax(options) { Chris@0: var defaultOptions = { Chris@0: context: this, Chris@0: dataType: 'json', Chris@0: cache: false, Chris@0: contentType: false, Chris@0: processData: false, Chris@0: error: function error() { Chris@0: this.renderDropzone('error', Drupal.t('A server error has occurred.')); Chris@0: } Chris@0: }; Chris@0: Chris@0: var ajaxOptions = $.extend(defaultOptions, options); Chris@0: var successCallback = ajaxOptions.success; Chris@0: Chris@0: ajaxOptions.success = function (response) { Chris@0: if (response.main_error) { Chris@0: this.renderDropzone('error', response.main_error); Chris@0: if (response.errors.length) { Chris@0: this.model.set('validationErrors', response.errors); Chris@0: } Chris@0: this.showValidationErrors(); Chris@0: } else { Chris@0: successCallback(response); Chris@0: } Chris@0: }; Chris@0: Chris@0: $.ajax(ajaxOptions); Chris@0: }, Chris@0: renderToolbar: function renderToolbar(fieldModel) { Chris@0: var $toolgroup = $('#' + fieldModel.toolbarView.getMainWysiwygToolgroupId()); Chris@0: var $toolbar = $toolgroup.find('.quickedit-image-field-info'); Chris@0: if ($toolbar.length === 0) { Chris@0: var fieldID = fieldModel.get('fieldID'); Chris@0: var url = Drupal.quickedit.util.buildUrl(fieldID, Drupal.url('quickedit/image/info/!entity_type/!id/!field_name/!langcode/!view_mode')); Chris@0: var self = this; Chris@0: self.ajax({ Chris@0: type: 'GET', Chris@0: url: url, Chris@0: success: function success(response) { Chris@0: $toolbar = $(Drupal.theme.quickeditImageToolbar(response)); Chris@0: $toolgroup.append($toolbar); Chris@0: $toolbar.on('keyup paste', function () { Chris@0: fieldModel.set('state', 'changed'); Chris@0: }); Chris@0: Chris@0: fieldModel.get('entity').toolbarView.position(); Chris@0: } Chris@0: }); Chris@0: } Chris@0: }, Chris@0: renderDropzone: function renderDropzone(state, text) { Chris@0: var $dropzone = this.$el.find('.quickedit-image-dropzone'); Chris@0: Chris@0: if ($dropzone.length) { Chris@0: $dropzone.removeClass('upload error hover loading').addClass('.quickedit-image-dropzone ' + state).children('.quickedit-image-text').html(text); Chris@0: } else { Chris@0: $dropzone = $(Drupal.theme('quickeditImageDropzone', { Chris@0: state: state, Chris@0: text: text Chris@0: })); Chris@0: this.$el.append($dropzone); Chris@0: } Chris@0: Chris@0: return $dropzone; Chris@0: }, Chris@0: revert: function revert() { Chris@0: this.$el.html(this.model.get('originalValue')); Chris@0: }, Chris@0: getQuickEditUISettings: function getQuickEditUISettings() { Chris@17: return { Chris@17: padding: false, Chris@17: unifiedToolbar: true, Chris@17: fullWidthToolbar: true, Chris@17: popup: false Chris@17: }; Chris@0: }, Chris@0: showValidationErrors: function showValidationErrors() { Chris@0: var errors = Drupal.theme('quickeditImageErrors', { Chris@0: errors: this.model.get('validationErrors') Chris@0: }); Chris@0: $('#' + this.fieldModel.toolbarView.getMainWysiwygToolgroupId()).append(errors); Chris@0: this.getEditedElement().addClass('quickedit-validation-error'); Chris@0: Chris@0: this.fieldModel.get('entity').toolbarView.position(); Chris@0: }, Chris@0: removeValidationErrors: function removeValidationErrors() { Chris@0: $('#' + this.fieldModel.toolbarView.getMainWysiwygToolgroupId()).find('.quickedit-image-errors').remove(); Chris@0: this.getEditedElement().removeClass('quickedit-validation-error'); Chris@0: } Chris@0: }); Chris@0: })(jQuery, _, Drupal);