annotate core/modules/ckeditor/js/views/ControllerView.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 1fec387a4317
children
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, Backbone, CKEDITOR, _) {
Chris@0 9 Drupal.ckeditor.ControllerView = Backbone.View.extend({
Chris@0 10 events: {},
Chris@0 11
Chris@0 12 initialize: function initialize() {
Chris@0 13 this.getCKEditorFeatures(this.model.get('hiddenEditorConfig'), this.disableFeaturesDisallowedByFilters.bind(this));
Chris@0 14
Chris@0 15 this.model.listenTo(this.model, 'change:activeEditorConfig', this.model.sync);
Chris@0 16 this.listenTo(this.model, 'change:isDirty', this.parseEditorDOM);
Chris@0 17 },
Chris@0 18 parseEditorDOM: function parseEditorDOM(model, isDirty, options) {
Chris@0 19 if (isDirty) {
Chris@0 20 var currentConfig = this.model.get('activeEditorConfig');
Chris@0 21
Chris@0 22 var rows = [];
Chris@0 23 this.$el.find('.ckeditor-active-toolbar-configuration').children('.ckeditor-row').each(function () {
Chris@0 24 var groups = [];
Chris@0 25
Chris@0 26 $(this).find('.ckeditor-toolbar-group').each(function () {
Chris@0 27 var $group = $(this);
Chris@0 28 var $buttons = $group.find('.ckeditor-button');
Chris@0 29 if ($buttons.length) {
Chris@0 30 var group = {
Chris@0 31 name: $group.attr('data-drupal-ckeditor-toolbar-group-name'),
Chris@0 32 items: []
Chris@0 33 };
Chris@0 34 $group.find('.ckeditor-button, .ckeditor-multiple-button').each(function () {
Chris@0 35 group.items.push($(this).attr('data-drupal-ckeditor-button-name'));
Chris@0 36 });
Chris@0 37 groups.push(group);
Chris@0 38 }
Chris@0 39 });
Chris@0 40 if (groups.length) {
Chris@0 41 rows.push(groups);
Chris@0 42 }
Chris@0 43 });
Chris@0 44 this.model.set('activeEditorConfig', rows);
Chris@0 45
Chris@0 46 this.model.set('isDirty', false);
Chris@0 47
Chris@0 48 if (options.broadcast !== false) {
Chris@0 49 var prev = this.getButtonList(currentConfig);
Chris@0 50 var next = this.getButtonList(rows);
Chris@0 51 if (prev.length !== next.length) {
Chris@0 52 this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', [prev.length < next.length ? 'added' : 'removed', _.difference(_.union(prev, next), _.intersection(prev, next))[0]]);
Chris@0 53 }
Chris@0 54 }
Chris@0 55 }
Chris@0 56 },
Chris@0 57 getCKEditorFeatures: function getCKEditorFeatures(CKEditorConfig, callback) {
Chris@0 58 var getProperties = function getProperties(CKEPropertiesList) {
Chris@0 59 return _.isObject(CKEPropertiesList) ? _.keys(CKEPropertiesList) : [];
Chris@0 60 };
Chris@0 61
Chris@0 62 var convertCKERulesToEditorFeature = function convertCKERulesToEditorFeature(feature, CKEFeatureRules) {
Chris@0 63 for (var i = 0; i < CKEFeatureRules.length; i++) {
Chris@0 64 var CKERule = CKEFeatureRules[i];
Chris@0 65 var rule = new Drupal.EditorFeatureHTMLRule();
Chris@0 66
Chris@0 67 var tags = getProperties(CKERule.elements);
Chris@0 68 rule.required.tags = CKERule.propertiesOnly ? [] : tags;
Chris@0 69 rule.allowed.tags = tags;
Chris@0 70
Chris@0 71 rule.required.attributes = getProperties(CKERule.requiredAttributes);
Chris@0 72 rule.allowed.attributes = getProperties(CKERule.attributes);
Chris@0 73
Chris@0 74 rule.required.styles = getProperties(CKERule.requiredStyles);
Chris@0 75 rule.allowed.styles = getProperties(CKERule.styles);
Chris@0 76
Chris@0 77 rule.required.classes = getProperties(CKERule.requiredClasses);
Chris@0 78 rule.allowed.classes = getProperties(CKERule.classes);
Chris@0 79
Chris@0 80 rule.raw = CKERule;
Chris@0 81
Chris@0 82 feature.addHTMLRule(rule);
Chris@0 83 }
Chris@0 84 };
Chris@0 85
Chris@0 86 var hiddenCKEditorID = 'ckeditor-hidden';
Chris@0 87 if (CKEDITOR.instances[hiddenCKEditorID]) {
Chris@0 88 CKEDITOR.instances[hiddenCKEditorID].destroy(true);
Chris@0 89 }
Chris@0 90
Chris@0 91 var hiddenEditorConfig = this.model.get('hiddenEditorConfig');
Chris@0 92 if (hiddenEditorConfig.drupalExternalPlugins) {
Chris@0 93 var externalPlugins = hiddenEditorConfig.drupalExternalPlugins;
Chris@14 94 Object.keys(externalPlugins || {}).forEach(function (pluginName) {
Chris@14 95 CKEDITOR.plugins.addExternal(pluginName, externalPlugins[pluginName], '');
Chris@14 96 });
Chris@0 97 }
Chris@0 98 CKEDITOR.inline($('#' + hiddenCKEditorID).get(0), CKEditorConfig);
Chris@0 99
Chris@0 100 CKEDITOR.once('instanceReady', function (e) {
Chris@0 101 if (e.editor.name === hiddenCKEditorID) {
Chris@0 102 var CKEFeatureRulesMap = {};
Chris@0 103 var rules = e.editor.filter.allowedContent;
Chris@0 104 var rule = void 0;
Chris@0 105 var name = void 0;
Chris@0 106 for (var i = 0; i < rules.length; i++) {
Chris@0 107 rule = rules[i];
Chris@0 108 name = rule.featureName || ':(';
Chris@0 109 if (!CKEFeatureRulesMap[name]) {
Chris@0 110 CKEFeatureRulesMap[name] = [];
Chris@0 111 }
Chris@0 112 CKEFeatureRulesMap[name].push(rule);
Chris@0 113 }
Chris@0 114
Chris@0 115 var features = {};
Chris@0 116 var buttonsToFeatures = {};
Chris@14 117 Object.keys(CKEFeatureRulesMap).forEach(function (featureName) {
Chris@14 118 var feature = new Drupal.EditorFeature(featureName);
Chris@14 119 convertCKERulesToEditorFeature(feature, CKEFeatureRulesMap[featureName]);
Chris@14 120 features[featureName] = feature;
Chris@14 121 var command = e.editor.getCommand(featureName);
Chris@14 122 if (command) {
Chris@14 123 buttonsToFeatures[command.uiItems[0].name] = featureName;
Chris@0 124 }
Chris@14 125 });
Chris@0 126
Chris@0 127 callback(features, buttonsToFeatures);
Chris@0 128 }
Chris@0 129 });
Chris@0 130 },
Chris@0 131 getFeatureForButton: function getFeatureForButton(button) {
Chris@0 132 if (button === '-') {
Chris@0 133 return false;
Chris@0 134 }
Chris@0 135
Chris@0 136 var featureName = this.model.get('buttonsToFeatures')[button.toLowerCase()];
Chris@0 137
Chris@0 138 if (!featureName) {
Chris@0 139 featureName = button.toLowerCase();
Chris@0 140 }
Chris@0 141 var featuresMetadata = this.model.get('featuresMetadata');
Chris@0 142 if (!featuresMetadata[featureName]) {
Chris@0 143 featuresMetadata[featureName] = new Drupal.EditorFeature(featureName);
Chris@0 144 this.model.set('featuresMetadata', featuresMetadata);
Chris@0 145 }
Chris@0 146 return featuresMetadata[featureName];
Chris@0 147 },
Chris@0 148 disableFeaturesDisallowedByFilters: function disableFeaturesDisallowedByFilters(features, buttonsToFeatures) {
Chris@0 149 this.model.set('featuresMetadata', features);
Chris@0 150
Chris@0 151 this.model.set('buttonsToFeatures', buttonsToFeatures);
Chris@0 152
Chris@0 153 this.broadcastConfigurationChanges(this.$el);
Chris@0 154
Chris@0 155 var existingButtons = [];
Chris@0 156
Chris@0 157 var buttonGroups = _.flatten(this.model.get('activeEditorConfig'));
Chris@0 158 for (var i = 0; i < buttonGroups.length; i++) {
Chris@0 159 var buttons = buttonGroups[i].items;
Chris@0 160 for (var k = 0; k < buttons.length; k++) {
Chris@0 161 existingButtons.push(buttons[k]);
Chris@0 162 }
Chris@0 163 }
Chris@0 164
Chris@0 165 existingButtons = _.unique(existingButtons);
Chris@0 166
Chris@0 167 for (var n = 0; n < existingButtons.length; n++) {
Chris@0 168 var button = existingButtons[n];
Chris@0 169 var feature = this.getFeatureForButton(button);
Chris@0 170
Chris@0 171 if (feature === false) {
Chris@0 172 continue;
Chris@0 173 }
Chris@0 174
Chris@0 175 if (Drupal.editorConfiguration.featureIsAllowedByFilters(feature)) {
Chris@0 176 this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', ['added', existingButtons[n]]);
Chris@0 177 } else {
Chris@0 178 $('.ckeditor-toolbar-active li[data-drupal-ckeditor-button-name="' + button + '"]').detach().appendTo('.ckeditor-toolbar-disabled > .ckeditor-toolbar-available > ul');
Chris@0 179
Chris@0 180 this.model.set({ isDirty: true }, { broadcast: false });
Chris@0 181 }
Chris@0 182 }
Chris@0 183 },
Chris@0 184 broadcastConfigurationChanges: function broadcastConfigurationChanges($ckeditorToolbar) {
Chris@0 185 var view = this;
Chris@0 186 var hiddenEditorConfig = this.model.get('hiddenEditorConfig');
Chris@0 187 var getFeatureForButton = this.getFeatureForButton.bind(this);
Chris@0 188 var getCKEditorFeatures = this.getCKEditorFeatures.bind(this);
Chris@0 189 $ckeditorToolbar.find('.ckeditor-toolbar-active').on('CKEditorToolbarChanged.ckeditorAdmin', function (event, action, button) {
Chris@0 190 var feature = getFeatureForButton(button);
Chris@0 191
Chris@0 192 if (feature === false) {
Chris@0 193 return;
Chris@0 194 }
Chris@0 195
Chris@0 196 var configEvent = action === 'added' ? 'addedFeature' : 'removedFeature';
Chris@0 197 Drupal.editorConfiguration[configEvent](feature);
Chris@0 198 }).on('CKEditorPluginSettingsChanged.ckeditorAdmin', function (event, settingsChanges) {
Chris@14 199 Object.keys(settingsChanges || {}).forEach(function (key) {
Chris@14 200 hiddenEditorConfig[key] = settingsChanges[key];
Chris@14 201 });
Chris@0 202
Chris@0 203 getCKEditorFeatures(hiddenEditorConfig, function (features) {
Chris@0 204 var featuresMetadata = view.model.get('featuresMetadata');
Chris@14 205 Object.keys(features || {}).forEach(function (name) {
Chris@14 206 var feature = features[name];
Chris@14 207 if (featuresMetadata.hasOwnProperty(name) && !_.isEqual(featuresMetadata[name], feature)) {
Chris@14 208 Drupal.editorConfiguration.modifiedFeature(feature);
Chris@0 209 }
Chris@14 210 });
Chris@0 211
Chris@0 212 view.model.set('featuresMetadata', features);
Chris@0 213 });
Chris@0 214 });
Chris@0 215 },
Chris@0 216 getButtonList: function getButtonList(config) {
Chris@0 217 var buttons = [];
Chris@0 218
Chris@0 219 config = _.flatten(config);
Chris@0 220
Chris@0 221 config.forEach(function (group) {
Chris@0 222 group.items.forEach(function (button) {
Chris@0 223 buttons.push(button);
Chris@0 224 });
Chris@0 225 });
Chris@0 226
Chris@0 227 return _.without(buttons, '-');
Chris@0 228 }
Chris@0 229 });
Chris@0 230 })(jQuery, Drupal, Backbone, CKEDITOR, _);