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