jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
200 lines (172 loc) • 4.97 kB
text/typescript
/*!
* Jodit Editor (https://xdsoft.net/jodit/)
* Licensed under GNU General Public License version 2 or later or a commercial license or MIT;
* For GPL see LICENSE-GPL.txt in the project root for license information.
* For MIT see LICENSE-MIT.txt in the project root for license information.
* For commercial licenses see https://xdsoft.net/jodit/commercial/
* Copyright (c) 2013-2019 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
*/
import { Config } from '../Config';
import { debounce, throttle } from '../modules/helpers/async';
import { css } from '../modules/helpers/css';
import { IJodit, IPointBound } from '../types';
declare module '../Config' {
interface Config {
allowResizeX: boolean;
allowResizeY: boolean;
}
}
Config.prototype.allowResizeX = false;
Config.prototype.allowResizeY = true;
/**
* Resize editor
* @param {Jodit} editor
*/
export function size(editor: IJodit) {
const setHeight = (height: number | string) => {
css(editor.container, 'height', height);
if (editor.options.saveHeightInStorage) {
editor.storage.set('height', height);
}
};
const setWidth = (width: number | string) =>
css(editor.container, 'width', width);
const setHeightWorkPlace = (height: number | string) =>
css(editor.workplace, 'height', height);
// const setWidthWorkPlace = (width: number | string) => css(editor.workplace, 'width', width);
if (
editor.options.height !== 'auto' &&
(editor.options.allowResizeX || editor.options.allowResizeY)
) {
const
handle = editor.create.div(
'jodit_editor_resize',
'<a tabindex="-1" href="javascript:void(0)"></a>'
),
start: IPointBound = {
x: 0,
y: 0,
w: 0,
h: 0
};
let isResized: boolean = false;
editor.events
.on(handle, 'mousedown touchstart', (e: MouseEvent) => {
isResized = true;
start.x = e.clientX;
start.y = e.clientY;
start.w = editor.container.offsetWidth;
start.h = editor.container.offsetHeight;
editor.lock();
e.preventDefault();
})
.on(
editor.ownerWindow,
'mousemove touchmove',
throttle((e: MouseEvent) => {
if (isResized) {
if (editor.options.allowResizeY) {
setHeight(start.h + e.clientY - start.y);
}
if (editor.options.allowResizeX) {
setWidth(start.w + e.clientX - start.x);
}
resizeWorkspaceImd();
editor.events.fire('resize');
}
}, editor.defaultTimeout / 10)
)
.on(editor.ownerWindow, 'mouseup touchsend', () => {
if (isResized) {
isResized = false;
editor.unlock();
}
})
.on('afterInit', () => {
editor.container.appendChild(handle);
})
.on('toggleFullSize', (fullsize: boolean) => {
handle.style.display = fullsize ? 'none' : 'block';
});
}
const getNotWorkHeight = (): number =>
(editor.options.toolbar ? editor.toolbar.container.offsetHeight : 0) +
(editor.statusbar ? editor.statusbar.container.offsetHeight : 0);
const calcMinHeightWorkspace = () => {
if (!editor.container || !editor.container.parentNode) {
return;
}
const minHeight: number =
(css(editor.container, 'minHeight') as number) - getNotWorkHeight();
[editor.workplace, editor.iframe, editor.editor].map(elm => {
const minHeightD: number =
elm === editor.editor ? minHeight - 2 : minHeight; // borders
elm && css(elm as HTMLElement, 'minHeight', minHeightD);
editor.events.fire('setMinHeight', minHeightD);
});
};
const resizeWorkspaceImd = () => {
if (
!editor ||
editor.isDestructed ||
!editor.options ||
editor.options.inline
) {
return;
}
calcMinHeightWorkspace();
if (
editor.container &&
(editor.options.height !== 'auto' || editor.isFullSize())
) {
setHeightWorkPlace(
editor.container.offsetHeight - getNotWorkHeight()
);
}
};
const resizeWorkspace = debounce(resizeWorkspaceImd, editor.defaultTimeout);
editor.events
.on('toggleFullSize', (fullsize: boolean) => {
if (!fullsize && editor.options.height === 'auto') {
setHeightWorkPlace('auto');
calcMinHeightWorkspace();
}
})
.on(
'afterInit',
() => {
if (!editor.options.inline) {
css(editor.editor, {
minHeight: '100%'
});
css(editor.container, {
minHeight: editor.options.minHeight,
minWidth: editor.options.minWidth,
maxWidth: editor.options.maxWidth
});
}
let height: string | number = editor.options.height;
if (editor.options.saveHeightInStorage && height !== 'auto') {
const localHeight: string | null = editor.storage.get(
'height'
);
if (localHeight) {
height = localHeight;
}
}
if (!editor.options.inline) {
setHeight(height);
setWidth(editor.options.width);
}
resizeWorkspaceImd();
},
undefined,
undefined,
true
)
.on(window, 'load', resizeWorkspace)
.on(
'afterInit resize updateToolbar scroll afterResize',
resizeWorkspace
);
}