jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
165 lines (139 loc) • 3.57 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 { Config } from '../config';
import * as consts from '../core/constants';
import {
Buttons,
IControlType,
IToolbarCollection,
IJodit,
CanUndef
} from '../types/';
import { splitArray } from '../core/helpers/';
import { makeCollection } from '../modules/toolbar/factory';
import { UIList } from '../core/ui';
declare module '../config' {
interface Config {
/**
* Mobile timeout for CLICK emulation
*/
mobileTapTimeout: number;
toolbarAdaptive: boolean;
}
}
Config.prototype.mobileTapTimeout = 300;
/**
* After resize it will change buttons set for different sizes
*
* @type {boolean}
*/
Config.prototype.toolbarAdaptive = true;
Config.prototype.controls.dots = {
mode: consts.MODE_SOURCE + consts.MODE_WYSIWYG,
popup: (
editor: IJodit,
current: false | Node,
control: IControlType,
close,
button
) => {
let store:
| {
toolbar: IToolbarCollection;
rebuild: () => void;
}
| undefined = control.data as any;
if (store === undefined) {
store = {
toolbar: makeCollection(editor),
rebuild: () => {
if (button) {
const buttons: CanUndef<Array<
string | IControlType
>> = editor.e.fire(
'getDiffButtons.mobile',
button.closest(UIList)
);
if (buttons && store) {
store.toolbar.build(splitArray(buttons));
const w =
editor.toolbar.firstButton?.container
.offsetWidth || 36;
store.toolbar.container.style.width =
(w + 4) * 3 + 'px';
}
}
}
};
control.data = store;
}
store.rebuild();
return store.toolbar;
},
tooltip: 'Show all'
} as IControlType;
/**
* Rebuild toolbar in depends of editor's width
*/
export function mobile(editor: IJodit): void {
let timeout: number = 0,
store: Array<string | IControlType> = splitArray(editor.o.buttons);
editor.e
.on('touchend', (e: TouchEvent) => {
if (e.changedTouches && e.changedTouches.length) {
const now = new Date().getTime();
if (now - timeout > editor.o.mobileTapTimeout) {
timeout = now;
editor.s.insertCursorAtPoint(
e.changedTouches[0].clientX,
e.changedTouches[0].clientY
);
}
}
})
.on(
'getDiffButtons.mobile',
(toolbar: IToolbarCollection): void | Buttons => {
if (toolbar === editor.toolbar) {
return splitArray(editor.o.buttons).filter(
i => !store.includes(i)
);
}
}
);
if (editor.o.toolbarAdaptive) {
editor.e
.on(
'resize afterInit recalcAdaptive changePlace afterAddPlace',
() => {
if (!editor.o.toolbar) {
return;
}
const width = editor.container.offsetWidth;
const newStore = (() => {
if (width >= editor.o.sizeLG) {
return splitArray(editor.o.buttons);
}
if (width >= editor.o.sizeMD) {
return splitArray(editor.o.buttonsMD);
}
if (width >= editor.o.sizeSM) {
return splitArray(editor.o.buttonsSM);
}
return splitArray(editor.o.buttonsXS);
})();
if (newStore.toString() !== store.toString()) {
store = newStore;
editor.e.fire('closeAllPopups');
editor.toolbar
.setRemoveButtons(editor.o.removeButtons)
.build(store.concat(editor.o.extraButtons));
}
}
)
.on(editor.ow, 'load', () => editor.e.fire('recalcAdaptive'));
}
}