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, _); |