annotate core/modules/ckeditor/js/ckeditor.js @ 2:5311817fb629

Theme updates
author Chris Cannam
date Tue, 10 Jul 2018 13:19:18 +0000
parents c75dbcec494b
children a9cd425dd02b
rev   line source
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);