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, debounce, CKEDITOR, $, displace, AjaxCommands) {
|
Chris@0
|
9 Drupal.editors.ckeditor = {
|
Chris@0
|
10 attach: function attach(element, format) {
|
Chris@0
|
11 this._loadExternalPlugins(format);
|
Chris@0
|
12
|
Chris@0
|
13 format.editorSettings.drupal = {
|
Chris@0
|
14 format: format.format
|
Chris@0
|
15 };
|
Chris@0
|
16
|
Chris@0
|
17 var label = $('label[for=' + element.getAttribute('id') + ']').html();
|
Chris@0
|
18 format.editorSettings.title = Drupal.t('Rich Text Editor, !label field', { '!label': label });
|
Chris@0
|
19
|
Chris@0
|
20 return !!CKEDITOR.replace(element, format.editorSettings);
|
Chris@0
|
21 },
|
Chris@0
|
22 detach: function detach(element, format, trigger) {
|
Chris@0
|
23 var editor = CKEDITOR.dom.element.get(element).getEditor();
|
Chris@0
|
24 if (editor) {
|
Chris@0
|
25 if (trigger === 'serialize') {
|
Chris@0
|
26 editor.updateElement();
|
Chris@0
|
27 } else {
|
Chris@0
|
28 editor.destroy();
|
Chris@0
|
29 element.removeAttribute('contentEditable');
|
Chris@0
|
30 }
|
Chris@0
|
31 }
|
Chris@0
|
32 return !!editor;
|
Chris@0
|
33 },
|
Chris@0
|
34 onChange: function onChange(element, callback) {
|
Chris@0
|
35 var editor = CKEDITOR.dom.element.get(element).getEditor();
|
Chris@0
|
36 if (editor) {
|
Chris@0
|
37 editor.on('change', debounce(function () {
|
Chris@0
|
38 callback(editor.getData());
|
Chris@0
|
39 }, 400));
|
Chris@0
|
40
|
Chris@0
|
41 editor.on('mode', function () {
|
Chris@0
|
42 var editable = editor.editable();
|
Chris@0
|
43 if (!editable.isInline()) {
|
Chris@0
|
44 editor.on('autoGrow', function (evt) {
|
Chris@0
|
45 var doc = evt.editor.document;
|
Chris@0
|
46 var scrollable = CKEDITOR.env.quirks ? doc.getBody() : doc.getDocumentElement();
|
Chris@0
|
47
|
Chris@0
|
48 if (scrollable.$.scrollHeight < scrollable.$.clientHeight) {
|
Chris@0
|
49 scrollable.setStyle('overflow-y', 'hidden');
|
Chris@0
|
50 } else {
|
Chris@0
|
51 scrollable.removeStyle('overflow-y');
|
Chris@0
|
52 }
|
Chris@0
|
53 }, null, null, 10000);
|
Chris@0
|
54 }
|
Chris@0
|
55 });
|
Chris@0
|
56 }
|
Chris@0
|
57 return !!editor;
|
Chris@0
|
58 },
|
Chris@0
|
59 attachInlineEditor: function attachInlineEditor(element, format, mainToolbarId, floatedToolbarId) {
|
Chris@0
|
60 this._loadExternalPlugins(format);
|
Chris@0
|
61
|
Chris@0
|
62 format.editorSettings.drupal = {
|
Chris@0
|
63 format: format.format
|
Chris@0
|
64 };
|
Chris@0
|
65
|
Chris@0
|
66 var settings = $.extend(true, {}, format.editorSettings);
|
Chris@0
|
67
|
Chris@0
|
68 if (mainToolbarId) {
|
Chris@0
|
69 var settingsOverride = {
|
Chris@0
|
70 extraPlugins: 'sharedspace',
|
Chris@0
|
71 removePlugins: 'floatingspace,elementspath',
|
Chris@0
|
72 sharedSpaces: {
|
Chris@0
|
73 top: mainToolbarId
|
Chris@0
|
74 }
|
Chris@0
|
75 };
|
Chris@0
|
76
|
Chris@0
|
77 var sourceButtonFound = false;
|
Chris@0
|
78 for (var i = 0; !sourceButtonFound && i < settings.toolbar.length; i++) {
|
Chris@0
|
79 if (settings.toolbar[i] !== '/') {
|
Chris@0
|
80 for (var j = 0; !sourceButtonFound && j < settings.toolbar[i].items.length; j++) {
|
Chris@0
|
81 if (settings.toolbar[i].items[j] === 'Source') {
|
Chris@0
|
82 sourceButtonFound = true;
|
Chris@0
|
83
|
Chris@0
|
84 settings.toolbar[i].items[j] = 'Sourcedialog';
|
Chris@0
|
85 settingsOverride.extraPlugins += ',sourcedialog';
|
Chris@0
|
86 settingsOverride.removePlugins += ',sourcearea';
|
Chris@0
|
87 }
|
Chris@0
|
88 }
|
Chris@0
|
89 }
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 settings.extraPlugins += ',' + settingsOverride.extraPlugins;
|
Chris@0
|
93 settings.removePlugins += ',' + settingsOverride.removePlugins;
|
Chris@0
|
94 settings.sharedSpaces = settingsOverride.sharedSpaces;
|
Chris@0
|
95 }
|
Chris@0
|
96
|
Chris@0
|
97 element.setAttribute('contentEditable', 'true');
|
Chris@0
|
98
|
Chris@0
|
99 return !!CKEDITOR.inline(element, settings);
|
Chris@0
|
100 },
|
Chris@0
|
101 _loadExternalPlugins: function _loadExternalPlugins(format) {
|
Chris@0
|
102 var externalPlugins = format.editorSettings.drupalExternalPlugins;
|
Chris@0
|
103
|
Chris@0
|
104 if (externalPlugins) {
|
Chris@0
|
105 Object.keys(externalPlugins || {}).forEach(function (pluginName) {
|
Chris@0
|
106 CKEDITOR.plugins.addExternal(pluginName, externalPlugins[pluginName], '');
|
Chris@0
|
107 });
|
Chris@0
|
108 delete format.editorSettings.drupalExternalPlugins;
|
Chris@0
|
109 }
|
Chris@0
|
110 }
|
Chris@0
|
111 };
|
Chris@0
|
112
|
Chris@0
|
113 Drupal.ckeditor = {
|
Chris@0
|
114 saveCallback: null,
|
Chris@0
|
115
|
Chris@0
|
116 openDialog: function openDialog(editor, url, existingValues, saveCallback, dialogSettings) {
|
Chris@0
|
117 var $target = $(editor.container.$);
|
Chris@0
|
118 if (editor.elementMode === CKEDITOR.ELEMENT_MODE_REPLACE) {
|
Chris@0
|
119 $target = $target.find('.cke_contents');
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 $target.css('position', 'relative').find('.ckeditor-dialog-loading').remove();
|
Chris@0
|
123
|
Chris@0
|
124 var classes = dialogSettings.dialogClass ? dialogSettings.dialogClass.split(' ') : [];
|
Chris@0
|
125 classes.push('ui-dialog--narrow');
|
Chris@0
|
126 dialogSettings.dialogClass = classes.join(' ');
|
Chris@0
|
127 dialogSettings.autoResize = window.matchMedia('(min-width: 600px)').matches;
|
Chris@0
|
128 dialogSettings.width = 'auto';
|
Chris@0
|
129
|
Chris@0
|
130 var $content = $('<div class="ckeditor-dialog-loading"><span style="top: -40px;" class="ckeditor-dialog-loading-link">' + Drupal.t('Loading...') + '</span></div>');
|
Chris@0
|
131 $content.appendTo($target);
|
Chris@0
|
132
|
Chris@0
|
133 var ckeditorAjaxDialog = Drupal.ajax({
|
Chris@0
|
134 dialog: dialogSettings,
|
Chris@0
|
135 dialogType: 'modal',
|
Chris@0
|
136 selector: '.ckeditor-dialog-loading-link',
|
Chris@0
|
137 url: url,
|
Chris@0
|
138 progress: { type: 'throbber' },
|
Chris@0
|
139 submit: {
|
Chris@0
|
140 editor_object: existingValues
|
Chris@0
|
141 }
|
Chris@0
|
142 });
|
Chris@0
|
143 ckeditorAjaxDialog.execute();
|
Chris@0
|
144
|
Chris@0
|
145 window.setTimeout(function () {
|
Chris@0
|
146 $content.find('span').animate({ top: '0px' });
|
Chris@0
|
147 }, 1000);
|
Chris@0
|
148
|
Chris@0
|
149 Drupal.ckeditor.saveCallback = saveCallback;
|
Chris@0
|
150 }
|
Chris@0
|
151 };
|
Chris@0
|
152
|
Chris@0
|
153 $(window).on('dialogcreate', function (e, dialog, $element, settings) {
|
Chris@0
|
154 $('.ui-dialog--narrow').css('zIndex', CKEDITOR.config.baseFloatZIndex + 1);
|
Chris@0
|
155 });
|
Chris@0
|
156
|
Chris@0
|
157 $(window).on('dialog:beforecreate', function (e, dialog, $element, settings) {
|
Chris@0
|
158 $('.ckeditor-dialog-loading').animate({ top: '-40px' }, function () {
|
Chris@0
|
159 $(this).remove();
|
Chris@0
|
160 });
|
Chris@0
|
161 });
|
Chris@0
|
162
|
Chris@0
|
163 $(window).on('editor:dialogsave', function (e, values) {
|
Chris@0
|
164 if (Drupal.ckeditor.saveCallback) {
|
Chris@0
|
165 Drupal.ckeditor.saveCallback(values);
|
Chris@0
|
166 }
|
Chris@0
|
167 });
|
Chris@0
|
168
|
Chris@0
|
169 $(window).on('dialog:afterclose', function (e, dialog, $element) {
|
Chris@0
|
170 if (Drupal.ckeditor.saveCallback) {
|
Chris@0
|
171 Drupal.ckeditor.saveCallback = null;
|
Chris@0
|
172 }
|
Chris@0
|
173 });
|
Chris@0
|
174
|
Chris@0
|
175 $(document).on('drupalViewportOffsetChange', function () {
|
Chris@0
|
176 CKEDITOR.config.autoGrow_maxHeight = 0.7 * (window.innerHeight - displace.offsets.top - displace.offsets.bottom);
|
Chris@0
|
177 });
|
Chris@0
|
178
|
Chris@0
|
179 function redirectTextareaFragmentToCKEditorInstance() {
|
Chris@0
|
180 var hash = location.hash.substr(1);
|
Chris@0
|
181 var element = document.getElementById(hash);
|
Chris@0
|
182 if (element) {
|
Chris@0
|
183 var editor = CKEDITOR.dom.element.get(element).getEditor();
|
Chris@0
|
184 if (editor) {
|
Chris@0
|
185 var id = editor.container.getAttribute('id');
|
Chris@0
|
186 location.replace('#' + id);
|
Chris@0
|
187 }
|
Chris@0
|
188 }
|
Chris@0
|
189 }
|
Chris@0
|
190 $(window).on('hashchange.ckeditor', redirectTextareaFragmentToCKEditorInstance);
|
Chris@0
|
191
|
Chris@0
|
192 CKEDITOR.config.autoGrow_onStartup = true;
|
Chris@0
|
193
|
Chris@0
|
194 CKEDITOR.timestamp = drupalSettings.ckeditor.timestamp;
|
Chris@0
|
195
|
Chris@0
|
196 if (AjaxCommands) {
|
Chris@0
|
197 AjaxCommands.prototype.ckeditor_add_stylesheet = function (ajax, response, status) {
|
Chris@0
|
198 var editor = CKEDITOR.instances[response.editor_id];
|
Chris@0
|
199
|
Chris@0
|
200 if (editor) {
|
Chris@0
|
201 response.stylesheets.forEach(function (url) {
|
Chris@0
|
202 editor.document.appendStyleSheet(url);
|
Chris@0
|
203 });
|
Chris@0
|
204 }
|
Chris@0
|
205 };
|
Chris@0
|
206 }
|
Chris@0
|
207 })(Drupal, Drupal.debounce, CKEDITOR, jQuery, Drupal.displace, Drupal.AjaxCommands); |