123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /**
- * DO NOT EDIT THIS FILE.
- * See the following change record for more information,
- * https://www.drupal.org/node/2815083
- * @preserve
- **/
- (function ($, Drupal, Backbone, CKEDITOR, _) {
- Drupal.ckeditor.ControllerView = Backbone.View.extend({
- events: {},
- initialize: function initialize() {
- this.getCKEditorFeatures(this.model.get('hiddenEditorConfig'), this.disableFeaturesDisallowedByFilters.bind(this));
- this.model.listenTo(this.model, 'change:activeEditorConfig', this.model.sync);
- this.listenTo(this.model, 'change:isDirty', this.parseEditorDOM);
- },
- parseEditorDOM: function parseEditorDOM(model, isDirty, options) {
- if (isDirty) {
- var currentConfig = this.model.get('activeEditorConfig');
- var rows = [];
- this.$el.find('.ckeditor-active-toolbar-configuration').children('.ckeditor-row').each(function () {
- var groups = [];
- $(this).find('.ckeditor-toolbar-group').each(function () {
- var $group = $(this);
- var $buttons = $group.find('.ckeditor-button');
- if ($buttons.length) {
- var group = {
- name: $group.attr('data-drupal-ckeditor-toolbar-group-name'),
- items: []
- };
- $group.find('.ckeditor-button, .ckeditor-multiple-button').each(function () {
- group.items.push($(this).attr('data-drupal-ckeditor-button-name'));
- });
- groups.push(group);
- }
- });
- if (groups.length) {
- rows.push(groups);
- }
- });
- this.model.set('activeEditorConfig', rows);
- this.model.set('isDirty', false);
- if (options.broadcast !== false) {
- var prev = this.getButtonList(currentConfig);
- var next = this.getButtonList(rows);
- if (prev.length !== next.length) {
- this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', [prev.length < next.length ? 'added' : 'removed', _.difference(_.union(prev, next), _.intersection(prev, next))[0]]);
- }
- }
- }
- },
- getCKEditorFeatures: function getCKEditorFeatures(CKEditorConfig, callback) {
- var getProperties = function getProperties(CKEPropertiesList) {
- return _.isObject(CKEPropertiesList) ? _.keys(CKEPropertiesList) : [];
- };
- var convertCKERulesToEditorFeature = function convertCKERulesToEditorFeature(feature, CKEFeatureRules) {
- for (var i = 0; i < CKEFeatureRules.length; i++) {
- var CKERule = CKEFeatureRules[i];
- var rule = new Drupal.EditorFeatureHTMLRule();
- var tags = getProperties(CKERule.elements);
- rule.required.tags = CKERule.propertiesOnly ? [] : tags;
- rule.allowed.tags = tags;
- rule.required.attributes = getProperties(CKERule.requiredAttributes);
- rule.allowed.attributes = getProperties(CKERule.attributes);
- rule.required.styles = getProperties(CKERule.requiredStyles);
- rule.allowed.styles = getProperties(CKERule.styles);
- rule.required.classes = getProperties(CKERule.requiredClasses);
- rule.allowed.classes = getProperties(CKERule.classes);
- rule.raw = CKERule;
- feature.addHTMLRule(rule);
- }
- };
- var hiddenCKEditorID = 'ckeditor-hidden';
- if (CKEDITOR.instances[hiddenCKEditorID]) {
- CKEDITOR.instances[hiddenCKEditorID].destroy(true);
- }
- var hiddenEditorConfig = this.model.get('hiddenEditorConfig');
- if (hiddenEditorConfig.drupalExternalPlugins) {
- var externalPlugins = hiddenEditorConfig.drupalExternalPlugins;
- Object.keys(externalPlugins || {}).forEach(function (pluginName) {
- CKEDITOR.plugins.addExternal(pluginName, externalPlugins[pluginName], '');
- });
- }
- CKEDITOR.inline($('#' + hiddenCKEditorID).get(0), CKEditorConfig);
- CKEDITOR.once('instanceReady', function (e) {
- if (e.editor.name === hiddenCKEditorID) {
- var CKEFeatureRulesMap = {};
- var rules = e.editor.filter.allowedContent;
- var rule = void 0;
- var name = void 0;
- for (var i = 0; i < rules.length; i++) {
- rule = rules[i];
- name = rule.featureName || ':(';
- if (!CKEFeatureRulesMap[name]) {
- CKEFeatureRulesMap[name] = [];
- }
- CKEFeatureRulesMap[name].push(rule);
- }
- var features = {};
- var buttonsToFeatures = {};
- Object.keys(CKEFeatureRulesMap).forEach(function (featureName) {
- var feature = new Drupal.EditorFeature(featureName);
- convertCKERulesToEditorFeature(feature, CKEFeatureRulesMap[featureName]);
- features[featureName] = feature;
- var command = e.editor.getCommand(featureName);
- if (command) {
- buttonsToFeatures[command.uiItems[0].name] = featureName;
- }
- });
- callback(features, buttonsToFeatures);
- }
- });
- },
- getFeatureForButton: function getFeatureForButton(button) {
- if (button === '-') {
- return false;
- }
- var featureName = this.model.get('buttonsToFeatures')[button.toLowerCase()];
- if (!featureName) {
- featureName = button.toLowerCase();
- }
- var featuresMetadata = this.model.get('featuresMetadata');
- if (!featuresMetadata[featureName]) {
- featuresMetadata[featureName] = new Drupal.EditorFeature(featureName);
- this.model.set('featuresMetadata', featuresMetadata);
- }
- return featuresMetadata[featureName];
- },
- disableFeaturesDisallowedByFilters: function disableFeaturesDisallowedByFilters(features, buttonsToFeatures) {
- this.model.set('featuresMetadata', features);
- this.model.set('buttonsToFeatures', buttonsToFeatures);
- this.broadcastConfigurationChanges(this.$el);
- var existingButtons = [];
- var buttonGroups = _.flatten(this.model.get('activeEditorConfig'));
- for (var i = 0; i < buttonGroups.length; i++) {
- var buttons = buttonGroups[i].items;
- for (var k = 0; k < buttons.length; k++) {
- existingButtons.push(buttons[k]);
- }
- }
- existingButtons = _.unique(existingButtons);
- for (var n = 0; n < existingButtons.length; n++) {
- var button = existingButtons[n];
- var feature = this.getFeatureForButton(button);
- if (feature === false) {
- continue;
- }
- if (Drupal.editorConfiguration.featureIsAllowedByFilters(feature)) {
- this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', ['added', existingButtons[n]]);
- } else {
- $('.ckeditor-toolbar-active li[data-drupal-ckeditor-button-name="' + button + '"]').detach().appendTo('.ckeditor-toolbar-disabled > .ckeditor-toolbar-available > ul');
- this.model.set({ isDirty: true }, { broadcast: false });
- }
- }
- },
- broadcastConfigurationChanges: function broadcastConfigurationChanges($ckeditorToolbar) {
- var view = this;
- var hiddenEditorConfig = this.model.get('hiddenEditorConfig');
- var getFeatureForButton = this.getFeatureForButton.bind(this);
- var getCKEditorFeatures = this.getCKEditorFeatures.bind(this);
- $ckeditorToolbar.find('.ckeditor-toolbar-active').on('CKEditorToolbarChanged.ckeditorAdmin', function (event, action, button) {
- var feature = getFeatureForButton(button);
- if (feature === false) {
- return;
- }
- var configEvent = action === 'added' ? 'addedFeature' : 'removedFeature';
- Drupal.editorConfiguration[configEvent](feature);
- }).on('CKEditorPluginSettingsChanged.ckeditorAdmin', function (event, settingsChanges) {
- Object.keys(settingsChanges || {}).forEach(function (key) {
- hiddenEditorConfig[key] = settingsChanges[key];
- });
- getCKEditorFeatures(hiddenEditorConfig, function (features) {
- var featuresMetadata = view.model.get('featuresMetadata');
- Object.keys(features || {}).forEach(function (name) {
- var feature = features[name];
- if (featuresMetadata.hasOwnProperty(name) && !_.isEqual(featuresMetadata[name], feature)) {
- Drupal.editorConfiguration.modifiedFeature(feature);
- }
- });
- view.model.set('featuresMetadata', features);
- });
- });
- },
- getButtonList: function getButtonList(config) {
- var buttons = [];
- config = _.flatten(config);
- config.forEach(function (group) {
- group.items.forEach(function (button) {
- buttons.push(button);
- });
- });
- return _.without(buttons, '-');
- }
- });
- })(jQuery, Drupal, Backbone, CKEDITOR, _);
|