koco-tinymce
Version:
Knockout Components handlers and utilities for the TinyMCE editor
172 lines (136 loc) • 5.49 kB
JavaScript
// Copyright (c) CBC/Radio-Canada. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
import $ from 'jquery';
var ctor = function(editor) {
var self = this;
self.editor = editor;
self.previousZone = null;
self.allManagedButtons = [];
self.noop = function() {};
// Register dummy command to use it as place holder to stop shortcuts
editor.addCommand('noop', self.noop);
self.buttonTogglerConfig = editor.settings.buttonTogglerConfig || {};
self.buttonTogglerConfig.shortcuts = self.buttonTogglerConfig.shortcuts || {};
self.zones = self.buttonTogglerConfig.zones;
editor.onNodeChange.add(function(ed, cm, n) {
self.onNodeChange(n);
var c = ed.selection ? ed.selection.getContent() : '';
var config = self.buttonTogglerConfig && self.buttonTogglerConfig.additionalNodeChangeCallbacks ?
self.buttonTogglerConfig.additionalNodeChangeCallbacks : [];
$(config).each(function(i, obj) {
//console.log(obj.buttonName);
obj.callback(cm, c, n);
});
});
self.initAllManagedButtons = function() {
var controls = self.controlManager.controls,
controlKey,
control,
controlId;
for (controlKey in controls) {
if (controls.hasOwnProperty(controlKey)) {
control = controls[controlKey];
controlId = self.parseButtonId(control);
if (self.isControlAToolbar(control) === false && self.isControlAManagedButton(controlId)) {
self.allManagedButtons.push(controlId);
}
}
}
};
self.disableAllShortcuts = function() {
var prop;
for (prop in self.editor.shortcuts) {
// Don<t disable Undo (90), Redo (90), Save (83)
if (prop !== 'ctrl,,,89' && prop !== 'ctrl,,,90' && prop !== 'ctrl,,,83') {
if (self.editor.shortcuts.hasOwnProperty(prop)) {
self.editor.shortcuts[prop].func = self.noop;
}
}
}
};
self.isControlAManagedButton = function(controlId) {
return $.inArray(controlId, self.buttonTogglerConfig.notManagedButtons) === -1;
};
self.isControlAToolbar = function(control) {
return (typeof control.controls !== 'undefined');
};
self.parseButtonId = function(control) {
return control.id.slice(self.editor.editorId.length + 1);
};
self.initDefaultZone = function() {
var defaultZone = {
name: 'default',
enabledButtons: self.allManagedButtons,
activeButtons: [],
inZoneSelector: '*'
};
//Default must be the last zone
self.zones.push(defaultZone);
self.enterCurrentZone(defaultZone);
self.previousZone = defaultZone;
};
//--------------------------------------------------------------
//Button Toggler Logic
//--------------------------------------------------------------
self.onNodeChange = function(currentNode) {
var currentZone = self.findCurrentZone(currentNode);
if (currentZone !== self.previousZone) {
self.exitPreviousZone();
self.enterCurrentZone(currentZone);
self.previousZone = currentZone;
}
};
self.findCurrentZone = function(currentNode) {
var zone,
i = 0,
zoneLength = self.zones.length;
for (; i < zoneLength; i++) {
zone = self.zones[i];
if (self.isCurrentNodeInZone(currentNode, zone.inZoneSelector)) {
return zone;
}
}
//Ne peut atteindre ce point, le currentNode est toujours dans la zone par defaut
};
self.isCurrentNodeInZone = function(currentNode, inZoneSelector) {
return $(currentNode).closest(inZoneSelector).length > 0;
};
self.exitPreviousZone = function() {
self.setEnabledButtons(self.allManagedButtons, false);
self.setActiveButtons(self.allManagedButtons, false);
};
self.enterCurrentZone = function(currentZone) {
self.setEnabledButtons(currentZone.enabledButtons, true);
self.setActiveButtons(currentZone.activeButtons, true);
};
self.setEnabledButtons = function(buttons, isEnabled) {
var i = 0,
buttonsLength = buttons.length;
for (; i < buttonsLength; i++) {
self.controlManager.setDisabled(buttons[i], !isEnabled);
self.setShortcut(buttons[i], isEnabled);
}
};
self.setActiveButtons = function(buttons, isActive) {
var i = 0,
buttonsLength = buttons.length;
for (; i < buttonsLength; i++) {
self.controlManager.setActive(buttons[i], isActive);
}
};
self.setShortcut = function(buttonName, isEnabled) {
var shortcut = self.buttonTogglerConfig.shortcuts[buttonName];
if (typeof shortcut === 'undefined') {
return;
}
self.editor.addShortcut(shortcut[0], shortcut[1], isEnabled ? shortcut[2] : 'noop');
};
self.editor.onPreInit.add(function() {
self.controlManager = self.editor.controlManager;
self.disableAllShortcuts();
self.initAllManagedButtons();
self.initDefaultZone();
});
return self;
};
export default ctor;