devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
150 lines (146 loc) • 5.03 kB
JavaScript
/**
* DevExtreme (esm/ui/text_box/texteditor_button_collection/index.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import $ from "../../../core/renderer";
import CustomButton from "./custom";
import {
extend
} from "../../../core/utils/extend";
import {
find
} from "../../../core/utils/array";
import errors from "../../widget/ui.errors";
var TEXTEDITOR_BUTTONS_CONTAINER_CLASS = "dx-texteditor-buttons-container";
function checkButtonInfo(buttonInfo) {
(() => {
if (!buttonInfo || "object" !== typeof buttonInfo || Array.isArray(buttonInfo)) {
throw errors.Error("E1053")
}
})();
(() => {
if (!("name" in buttonInfo)) {
throw errors.Error("E1054")
}
})();
(() => {
var {
name: name
} = buttonInfo;
if ("string" !== typeof name) {
throw errors.Error("E1055")
}
})();
(() => {
var {
location: location
} = buttonInfo;
if ("location" in buttonInfo && "after" !== location && "before" !== location) {
buttonInfo.location = "after"
}
})()
}
function checkNamesUniqueness(existingNames, newName) {
if (-1 !== existingNames.indexOf(newName)) {
throw errors.Error("E1055", newName)
}
existingNames.push(newName)
}
function isPredefinedButtonName(name, predefinedButtonsInfo) {
return !!find(predefinedButtonsInfo, info => info.name === name)
}
export default class TextEditorButtonCollection {
constructor(editor, defaultButtonsInfo) {
this.buttons = [];
this.defaultButtonsInfo = defaultButtonsInfo;
this.editor = editor
}
_compileButtonInfo(buttons) {
var names = [];
return buttons.map(button => {
var isStringButton = "string" === typeof button;
if (!isStringButton) {
checkButtonInfo(button)
}
var isDefaultButton = isStringButton || isPredefinedButtonName(button.name, this.defaultButtonsInfo);
if (isDefaultButton) {
var defaultButtonInfo = find(this.defaultButtonsInfo, _ref => {
var {
name: name
} = _ref;
return name === button || name === button.name
});
if (!defaultButtonInfo) {
throw errors.Error("E1056", this.editor.NAME, button)
}
checkNamesUniqueness(names, button);
return defaultButtonInfo
} else {
var {
name: name
} = button;
checkNamesUniqueness(names, name);
return extend(button, {
Ctor: CustomButton
})
}
})
}
_createButton(buttonsInfo) {
var {
Ctor: Ctor,
options: options,
name: name
} = buttonsInfo;
var button = new Ctor(name, this.editor, options);
this.buttons.push(button);
return button
}
_renderButtons(buttons, $container, targetLocation) {
var $buttonsContainer = null;
var buttonsInfo = buttons ? this._compileButtonInfo(buttons) : this.defaultButtonsInfo;
buttonsInfo.forEach(buttonsInfo => {
var {
location: location = "after"
} = buttonsInfo;
if (location === targetLocation) {
this._createButton(buttonsInfo).render((() => {
$buttonsContainer = $buttonsContainer || $("<div>").addClass(TEXTEDITOR_BUTTONS_CONTAINER_CLASS);
"before" === targetLocation ? $container.prepend($buttonsContainer) : $container.append($buttonsContainer);
return $buttonsContainer
})())
}
});
return $buttonsContainer
}
clean() {
this.buttons.forEach(button => button.dispose());
this.buttons = []
}
getButton(buttonName) {
var button = find(this.buttons, _ref2 => {
var {
name: name
} = _ref2;
return name === buttonName
});
return button && button.instance
}
renderAfterButtons(buttons, $container) {
return this._renderButtons(buttons, $container, "after")
}
renderBeforeButtons(buttons, $container) {
return this._renderButtons(buttons, $container, "before")
}
updateButtons(names) {
this.buttons.forEach(button => {
if (!names || -1 !== names.indexOf(button.name)) {
button.update()
}
})
}
}