Chris@0
|
1 /**
|
Chris@0
|
2 * DO NOT EDIT THIS FILE.
|
Chris@0
|
3 * See the following change record for more information,
|
Chris@0
|
4 * https://www.drupal.org/node/2815083
|
Chris@0
|
5 * @preserve
|
Chris@0
|
6 **/
|
Chris@0
|
7
|
Chris@0
|
8 (function ($, _, Drupal) {
|
Chris@0
|
9 Drupal.quickedit.editors.image = Drupal.quickedit.EditorView.extend({
|
Chris@0
|
10 initialize: function initialize(options) {
|
Chris@0
|
11 Drupal.quickedit.EditorView.prototype.initialize.call(this, options);
|
Chris@0
|
12
|
Chris@0
|
13 this.model.set('originalValue', this.$el.html().trim());
|
Chris@0
|
14
|
Chris@0
|
15 this.model.set('currentValue', function (index, value) {
|
Chris@0
|
16 var matches = $(this).attr('name').match(/(alt|title)]$/);
|
Chris@0
|
17 if (matches) {
|
Chris@0
|
18 var name = matches[1];
|
Chris@0
|
19 var $toolgroup = $('#' + options.fieldModel.toolbarView.getMainWysiwygToolgroupId());
|
Chris@0
|
20 var $input = $toolgroup.find('.quickedit-image-field-info input[name="' + name + '"]');
|
Chris@0
|
21 if ($input.length) {
|
Chris@0
|
22 return $input.val();
|
Chris@0
|
23 }
|
Chris@0
|
24 }
|
Chris@0
|
25 });
|
Chris@0
|
26 },
|
Chris@0
|
27 stateChange: function stateChange(fieldModel, state, options) {
|
Chris@0
|
28 var from = fieldModel.previous('state');
|
Chris@0
|
29 switch (state) {
|
Chris@0
|
30 case 'inactive':
|
Chris@0
|
31 break;
|
Chris@0
|
32
|
Chris@0
|
33 case 'candidate':
|
Chris@0
|
34 if (from !== 'inactive') {
|
Chris@0
|
35 this.$el.find('.quickedit-image-dropzone').remove();
|
Chris@0
|
36 this.$el.removeClass('quickedit-image-element');
|
Chris@0
|
37 }
|
Chris@0
|
38 if (from === 'invalid') {
|
Chris@0
|
39 this.removeValidationErrors();
|
Chris@0
|
40 }
|
Chris@0
|
41 break;
|
Chris@0
|
42
|
Chris@0
|
43 case 'highlighted':
|
Chris@0
|
44 break;
|
Chris@0
|
45
|
Chris@0
|
46 case 'activating':
|
Chris@0
|
47 _.defer(function () {
|
Chris@0
|
48 fieldModel.set('state', 'active');
|
Chris@0
|
49 });
|
Chris@0
|
50 break;
|
Chris@0
|
51
|
Chris@0
|
52 case 'active':
|
Chris@14
|
53 {
|
Chris@14
|
54 var self = this;
|
Chris@0
|
55
|
Chris@14
|
56 this.$el.addClass('quickedit-image-element');
|
Chris@0
|
57
|
Chris@14
|
58 var $dropzone = this.renderDropzone('upload', Drupal.t('Drop file here or click to upload'));
|
Chris@0
|
59
|
Chris@14
|
60 $dropzone.on('dragenter', function (e) {
|
Chris@14
|
61 $(this).addClass('hover');
|
Chris@14
|
62 });
|
Chris@14
|
63 $dropzone.on('dragleave', function (e) {
|
Chris@14
|
64 $(this).removeClass('hover');
|
Chris@14
|
65 });
|
Chris@0
|
66
|
Chris@14
|
67 $dropzone.on('drop', function (e) {
|
Chris@14
|
68 if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) {
|
Chris@14
|
69 $(this).removeClass('hover');
|
Chris@14
|
70 self.uploadImage(e.originalEvent.dataTransfer.files[0]);
|
Chris@0
|
71 }
|
Chris@0
|
72 });
|
Chris@0
|
73
|
Chris@14
|
74 $dropzone.on('click', function (e) {
|
Chris@14
|
75 $('<input type="file">').trigger('click').on('change', function () {
|
Chris@14
|
76 if (this.files.length) {
|
Chris@14
|
77 self.uploadImage(this.files[0]);
|
Chris@14
|
78 }
|
Chris@14
|
79 });
|
Chris@14
|
80 });
|
Chris@0
|
81
|
Chris@14
|
82 $dropzone.on('dragover dragenter dragleave drop click', function (e) {
|
Chris@14
|
83 e.preventDefault();
|
Chris@14
|
84 e.stopPropagation();
|
Chris@14
|
85 });
|
Chris@14
|
86
|
Chris@14
|
87 this.renderToolbar(fieldModel);
|
Chris@14
|
88 break;
|
Chris@14
|
89 }
|
Chris@0
|
90
|
Chris@0
|
91 case 'changed':
|
Chris@0
|
92 break;
|
Chris@0
|
93
|
Chris@0
|
94 case 'saving':
|
Chris@0
|
95 if (from === 'invalid') {
|
Chris@0
|
96 this.removeValidationErrors();
|
Chris@0
|
97 }
|
Chris@0
|
98
|
Chris@0
|
99 this.save(options);
|
Chris@0
|
100 break;
|
Chris@0
|
101
|
Chris@0
|
102 case 'saved':
|
Chris@0
|
103 break;
|
Chris@0
|
104
|
Chris@0
|
105 case 'invalid':
|
Chris@0
|
106 this.showValidationErrors();
|
Chris@0
|
107 break;
|
Chris@0
|
108 }
|
Chris@0
|
109 },
|
Chris@0
|
110 uploadImage: function uploadImage(file) {
|
Chris@0
|
111 this.renderDropzone('upload loading', Drupal.t('Uploading <i>@file</i>…', { '@file': file.name }));
|
Chris@0
|
112
|
Chris@0
|
113 var fieldID = this.fieldModel.get('fieldID');
|
Chris@0
|
114 var url = Drupal.quickedit.util.buildUrl(fieldID, Drupal.url('quickedit/image/upload/!entity_type/!id/!field_name/!langcode/!view_mode'));
|
Chris@0
|
115
|
Chris@0
|
116 var data = new FormData();
|
Chris@0
|
117 data.append('files[image]', file);
|
Chris@0
|
118
|
Chris@0
|
119 var self = this;
|
Chris@0
|
120 this.ajax({
|
Chris@0
|
121 type: 'POST',
|
Chris@0
|
122 url: url,
|
Chris@0
|
123 data: data,
|
Chris@0
|
124 success: function success(response) {
|
Chris@0
|
125 var $el = $(self.fieldModel.get('el'));
|
Chris@0
|
126
|
Chris@0
|
127 self.fieldModel.set('state', 'changed');
|
Chris@0
|
128 self.fieldModel.get('entity').set('inTempStore', true);
|
Chris@0
|
129 self.removeValidationErrors();
|
Chris@0
|
130
|
Chris@0
|
131 var $content = $(response.html).closest('[data-quickedit-field-id]').children();
|
Chris@0
|
132 $el.empty().append($content);
|
Chris@0
|
133 }
|
Chris@0
|
134 });
|
Chris@0
|
135 },
|
Chris@0
|
136 ajax: function ajax(options) {
|
Chris@0
|
137 var defaultOptions = {
|
Chris@0
|
138 context: this,
|
Chris@0
|
139 dataType: 'json',
|
Chris@0
|
140 cache: false,
|
Chris@0
|
141 contentType: false,
|
Chris@0
|
142 processData: false,
|
Chris@0
|
143 error: function error() {
|
Chris@0
|
144 this.renderDropzone('error', Drupal.t('A server error has occurred.'));
|
Chris@0
|
145 }
|
Chris@0
|
146 };
|
Chris@0
|
147
|
Chris@0
|
148 var ajaxOptions = $.extend(defaultOptions, options);
|
Chris@0
|
149 var successCallback = ajaxOptions.success;
|
Chris@0
|
150
|
Chris@0
|
151 ajaxOptions.success = function (response) {
|
Chris@0
|
152 if (response.main_error) {
|
Chris@0
|
153 this.renderDropzone('error', response.main_error);
|
Chris@0
|
154 if (response.errors.length) {
|
Chris@0
|
155 this.model.set('validationErrors', response.errors);
|
Chris@0
|
156 }
|
Chris@0
|
157 this.showValidationErrors();
|
Chris@0
|
158 } else {
|
Chris@0
|
159 successCallback(response);
|
Chris@0
|
160 }
|
Chris@0
|
161 };
|
Chris@0
|
162
|
Chris@0
|
163 $.ajax(ajaxOptions);
|
Chris@0
|
164 },
|
Chris@0
|
165 renderToolbar: function renderToolbar(fieldModel) {
|
Chris@0
|
166 var $toolgroup = $('#' + fieldModel.toolbarView.getMainWysiwygToolgroupId());
|
Chris@0
|
167 var $toolbar = $toolgroup.find('.quickedit-image-field-info');
|
Chris@0
|
168 if ($toolbar.length === 0) {
|
Chris@0
|
169 var fieldID = fieldModel.get('fieldID');
|
Chris@0
|
170 var url = Drupal.quickedit.util.buildUrl(fieldID, Drupal.url('quickedit/image/info/!entity_type/!id/!field_name/!langcode/!view_mode'));
|
Chris@0
|
171 var self = this;
|
Chris@0
|
172 self.ajax({
|
Chris@0
|
173 type: 'GET',
|
Chris@0
|
174 url: url,
|
Chris@0
|
175 success: function success(response) {
|
Chris@0
|
176 $toolbar = $(Drupal.theme.quickeditImageToolbar(response));
|
Chris@0
|
177 $toolgroup.append($toolbar);
|
Chris@0
|
178 $toolbar.on('keyup paste', function () {
|
Chris@0
|
179 fieldModel.set('state', 'changed');
|
Chris@0
|
180 });
|
Chris@0
|
181
|
Chris@0
|
182 fieldModel.get('entity').toolbarView.position();
|
Chris@0
|
183 }
|
Chris@0
|
184 });
|
Chris@0
|
185 }
|
Chris@0
|
186 },
|
Chris@0
|
187 renderDropzone: function renderDropzone(state, text) {
|
Chris@0
|
188 var $dropzone = this.$el.find('.quickedit-image-dropzone');
|
Chris@0
|
189
|
Chris@0
|
190 if ($dropzone.length) {
|
Chris@0
|
191 $dropzone.removeClass('upload error hover loading').addClass('.quickedit-image-dropzone ' + state).children('.quickedit-image-text').html(text);
|
Chris@0
|
192 } else {
|
Chris@0
|
193 $dropzone = $(Drupal.theme('quickeditImageDropzone', {
|
Chris@0
|
194 state: state,
|
Chris@0
|
195 text: text
|
Chris@0
|
196 }));
|
Chris@0
|
197 this.$el.append($dropzone);
|
Chris@0
|
198 }
|
Chris@0
|
199
|
Chris@0
|
200 return $dropzone;
|
Chris@0
|
201 },
|
Chris@0
|
202 revert: function revert() {
|
Chris@0
|
203 this.$el.html(this.model.get('originalValue'));
|
Chris@0
|
204 },
|
Chris@0
|
205 getQuickEditUISettings: function getQuickEditUISettings() {
|
Chris@17
|
206 return {
|
Chris@17
|
207 padding: false,
|
Chris@17
|
208 unifiedToolbar: true,
|
Chris@17
|
209 fullWidthToolbar: true,
|
Chris@17
|
210 popup: false
|
Chris@17
|
211 };
|
Chris@0
|
212 },
|
Chris@0
|
213 showValidationErrors: function showValidationErrors() {
|
Chris@0
|
214 var errors = Drupal.theme('quickeditImageErrors', {
|
Chris@0
|
215 errors: this.model.get('validationErrors')
|
Chris@0
|
216 });
|
Chris@0
|
217 $('#' + this.fieldModel.toolbarView.getMainWysiwygToolgroupId()).append(errors);
|
Chris@0
|
218 this.getEditedElement().addClass('quickedit-validation-error');
|
Chris@0
|
219
|
Chris@0
|
220 this.fieldModel.get('entity').toolbarView.position();
|
Chris@0
|
221 },
|
Chris@0
|
222 removeValidationErrors: function removeValidationErrors() {
|
Chris@0
|
223 $('#' + this.fieldModel.toolbarView.getMainWysiwygToolgroupId()).find('.quickedit-image-errors').remove();
|
Chris@0
|
224 this.getEditedElement().removeClass('quickedit-validation-error');
|
Chris@0
|
225 }
|
Chris@0
|
226 });
|
Chris@0
|
227 })(jQuery, _, Drupal); |