2 * DO NOT EDIT THIS FILE.
3 * See the following change record for more information,
4 * https://www.drupal.org/node/2815083
8 (function ($, Drupal, CKEDITOR) {
9 CKEDITOR.plugins.add('drupalimage', {
14 beforeInit: function beforeInit(editor) {
15 editor.on('widgetDefinition', function (event) {
16 var widgetDefinition = event.data;
17 if (widgetDefinition.name !== 'image') {
21 widgetDefinition.allowedContent = {
33 widgetDefinition.requiredContent = new CKEDITOR.style({
41 var requiredContent = widgetDefinition.requiredContent.getDefinition();
42 requiredContent.attributes['data-entity-type'] = '';
43 requiredContent.attributes['data-entity-uuid'] = '';
44 widgetDefinition.requiredContent = new CKEDITOR.style(requiredContent);
45 widgetDefinition.allowedContent.img.attributes['!data-entity-type'] = true;
46 widgetDefinition.allowedContent.img.attributes['!data-entity-uuid'] = true;
48 widgetDefinition.downcast = function (element) {
49 element.attributes['data-entity-type'] = this.data['data-entity-type'];
50 element.attributes['data-entity-uuid'] = this.data['data-entity-uuid'];
53 widgetDefinition.upcast = function (element, data) {
54 if (element.name !== 'img') {
56 } else if (element.attributes['data-cke-realelement']) {
60 data['data-entity-type'] = element.attributes['data-entity-type'];
62 data['data-entity-uuid'] = element.attributes['data-entity-uuid'];
67 var originalGetClasses = widgetDefinition.getClasses;
68 widgetDefinition.getClasses = function () {
69 var classes = originalGetClasses.call(this);
70 var captionedClasses = (this.editor.config.image2_captionedClass || '').split(/\s+/);
72 if (captionedClasses.length && classes) {
73 for (var i = 0; i < captionedClasses.length; i++) {
74 if (captionedClasses[i] in classes) {
75 delete classes[captionedClasses[i]];
83 widgetDefinition._mapDataToDialog = {
88 'data-entity-type': 'data-entity-type',
89 'data-entity-uuid': 'data-entity-uuid'
92 widgetDefinition._dataToDialogValues = function (data) {
93 var dialogValues = {};
94 var map = widgetDefinition._mapDataToDialog;
95 Object.keys(widgetDefinition._mapDataToDialog).forEach(function (key) {
96 dialogValues[map[key]] = data[key];
101 widgetDefinition._dialogValuesToData = function (dialogReturnValues) {
103 var map = widgetDefinition._mapDataToDialog;
104 Object.keys(widgetDefinition._mapDataToDialog).forEach(function (key) {
105 if (dialogReturnValues.hasOwnProperty(map[key])) {
106 data[key] = dialogReturnValues[map[key]];
112 widgetDefinition._createDialogSaveCallback = function (editor, widget) {
113 return function (dialogReturnValues) {
114 var firstEdit = !widget.ready;
120 editor.fire('saveSnapshot');
122 var container = widget.wrapper.getParent(true);
123 var image = widget.parts.image;
125 var data = widgetDefinition._dialogValuesToData(dialogReturnValues.attributes);
126 widget.setData(data);
128 widget = editor.widgets.getByElement(image);
131 editor.widgets.finalizeCreation(container);
134 setTimeout(function () {
137 editor.fire('saveSnapshot');
144 var originalInit = widgetDefinition.init;
145 widgetDefinition.init = function () {
146 originalInit.call(this);
148 if (this.parts.link) {
149 this.setData('link', CKEDITOR.plugins.image2.getLinkAttributesParser()(editor, this.parts.link));
154 editor.widgets.on('instanceCreated', function (event) {
155 var widget = event.data;
157 if (widget.name !== 'image') {
161 widget.on('edit', function (event) {
164 editor.execCommand('editdrupalimage', {
165 existingValues: widget.definition._dataToDialogValues(widget.data),
166 saveCallback: widget.definition._createDialogSaveCallback(editor, widget),
168 dialogTitle: widget.data.src ? editor.config.drupalImage_dialogTitleEdit : editor.config.drupalImage_dialogTitleAdd
173 editor.addCommand('editdrupalimage', {
174 allowedContent: 'img[alt,!src,width,height,!data-entity-type,!data-entity-uuid]',
175 requiredContent: 'img[alt,src,data-entity-type,data-entity-uuid]',
176 modes: { wysiwyg: 1 },
178 exec: function exec(editor, data) {
179 var dialogSettings = {
180 title: data.dialogTitle,
181 dialogClass: 'editor-image-dialog'
183 Drupal.ckeditor.openDialog(editor, Drupal.url('editor/dialog/image/' + editor.config.drupal.format), data.existingValues, data.saveCallback, dialogSettings);
187 if (editor.ui.addButton) {
188 editor.ui.addButton('DrupalImage', {
189 label: Drupal.t('Image'),
195 afterInit: function afterInit(editor) {
196 linkCommandIntegrator(editor);
200 CKEDITOR.plugins.image2.getLinkAttributesParser = function () {
201 return CKEDITOR.plugins.drupallink.parseLinkAttributes;
203 CKEDITOR.plugins.image2.getLinkAttributesGetter = function () {
204 return CKEDITOR.plugins.drupallink.getLinkAttributes;
207 function linkCommandIntegrator(editor) {
208 if (!editor.plugins.drupallink) {
212 editor.getCommand('drupalunlink').on('exec', function (evt) {
213 var widget = getFocusedWidget(editor);
215 if (!widget || !widget.parts.link) {
219 widget.setData('link', null);
221 this.refresh(editor, editor.elementPath());
226 editor.getCommand('drupalunlink').on('refresh', function (evt) {
227 var widget = getFocusedWidget(editor);
233 this.setState(widget.data.link || widget.wrapper.getAscendant('a') ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED);
239 function getFocusedWidget(editor) {
240 var widget = editor.widgets.focused;
242 if (widget && widget.name === 'image') {
249 CKEDITOR.plugins.drupalimage = {
250 getFocusedWidget: getFocusedWidget
252 })(jQuery, Drupal, CKEDITOR);