jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
135 lines (112 loc) • 2.79 kB
text/typescript
/*!
* Jodit Editor (https://xdsoft.net/jodit/)
* Released under MIT see LICENSE.txt in the project root for license information.
* Copyright (c) 2013-2020 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
*/
import { ToolbarCollection } from './collection';
import * as consts from '../../../core/constants';
import { Dom } from '../../../core/dom';
import {
IDictionary,
IToolbarButton,
IViewBased,
IJodit
} from '../../../types';
import { css, isFunction } from '../../../core/helpers';
export class ToolbarEditorCollection extends ToolbarCollection<IJodit> {
/** @override */
shouldBeDisabled(button: IToolbarButton): boolean {
const disabled = super.shouldBeDisabled(button);
if (disabled !== undefined) {
return disabled;
}
const mode: number =
button.control.mode === undefined
? consts.MODE_WYSIWYG
: button.control.mode;
return !(mode === consts.MODE_SPLIT || mode === this.j.getRealMode());
}
/** @override */
shouldBeActive(button: IToolbarButton): boolean {
const active = super.shouldBeActive(button);
if (active !== undefined) {
return active;
}
const element = this.j.selection ? this.j.s.current() : null;
if (!element) {
return false;
}
let elm: Node | false;
if (button.control.tags) {
const tags: string[] = button.control.tags;
elm = element;
if (
Dom.up(
elm,
(node: Node | null): boolean | void => {
if (
node &&
tags.indexOf(node.nodeName.toLowerCase()) !== -1
) {
return true;
}
},
this.j.editor
)
) {
return true;
}
}
// activate by supposed css
if (button.control.css) {
const css = button.control.css;
elm = element;
if (
Dom.up(
elm,
(node: Node | null): boolean | void => {
if (node && !Dom.isText(node)) {
return this.checkActiveStatus(
css,
node as HTMLElement
);
}
},
this.j.editor
)
) {
return true;
}
}
return false;
}
private checkActiveStatus = (
cssObject:
| IDictionary<string | string[]>
| IDictionary<(editor: IViewBased, value: string) => boolean>,
node: HTMLElement
): boolean => {
let matches: number = 0,
total: number = 0;
Object.keys(cssObject).forEach((cssProperty: string) => {
const cssValue = cssObject[cssProperty];
if (isFunction(cssValue)) {
if (cssValue(this.j, css(node, cssProperty).toString())) {
matches += 1;
}
} else {
if (
cssValue.indexOf(css(node, cssProperty).toString()) !== -1
) {
matches += 1;
}
}
total += 1;
});
return total === matches;
};
/** @override */
getTarget(button: IToolbarButton): Node | null {
return button.target || this.j.s.current() || null;
}
}