import {
Assertions, Chain, GeneralSteps, Logger, Mouse, Pipeline, Step, UiFinder, Waiter
} from '@ephox/agar';
import { UnitTest } from '@ephox/bedrock';
import { Cell } from '@ephox/katamari';
import { TinyApis, TinyLoader } from '@ephox/mcagar';
import { Element, Height, Hierarchy, Width } from '@ephox/sugar';
import TablePlugin from 'tinymce/plugins/table/Plugin';
import ModernTheme from 'tinymce/themes/modern/Theme';
UnitTest.asynctest('browser.tinymce.plugins.table.DragResizeTest', function () {
const success = arguments[arguments.length - 2];
const failure = arguments[arguments.length - 1];
ModernTheme();
TablePlugin();
const sDragDrop = function (container, selector, dx, dy) {
return Chain.asStep(container, [
UiFinder.cFindIn(selector),
Mouse.cMouseDown,
Mouse.cMouseMoveTo(dx, dy),
Mouse.cMouseUpTo(dx, dy)
]);
};
const sDragDropBlocker = function (container, selector, dx, dy) {
return Chain.asStep({}, [
Chain.fromParent(Chain.inject(container), [
Chain.fromChains([
UiFinder.cFindIn(selector),
Mouse.cMouseDown
]),
Chain.fromChains([
UiFinder.cFindIn('div.ephox-dragster-blocker'),
Mouse.cMouseMove,
Mouse.cMouseMoveTo(dx, dy),
Mouse.cMouseUpTo(dx, dy)
])
])
]);
};
const sMouseover = function (container, selector) {
return Chain.asStep(container, [
UiFinder.cFindIn(selector),
Mouse.cMouseOver
]);
};
const state = Cell(null);
const sSetStateFrom = function (editor, path) {
return Step.sync(function () {
const element = Hierarchy.follow(Element.fromDom(editor.getBody()), path).getOrDie('could not find element');
const height = Height.get(element);
const width = Width.get(element);
state.set({
h: height,
w: width
});
});
};
const sResetState = Step.sync(function () {
state.set(null);
});
const looseEqual = function (exp, act, loose) {
return Math.abs(exp - act) <= loose;
};
const sAssertSizeChange = function (editor, path, change) {
return Step.sync(function () {
const element = Hierarchy.follow(Element.fromDom(editor.getBody()), path).getOrDie('could not find element');
const height = Height.get(element);
const width = Width.get(element);
const changedHeight = state.get().h + change.dh;
const changedWidth = state.get().w + change.dw;
Assertions.assertEq('height has changed as expected', true, looseEqual(changedHeight, height, 2));
Assertions.assertEq('width has changed as expected', true, looseEqual(changedWidth, width, 2));
});
};
const tableHtml = '
' +
'' +
'' +
'| a | ' +
'b | ' +
'
' +
'' +
'| 1 | ' +
'2 | ' +
'
' +
'' +
'
';
const sWaitForSelection = function (editor, tinyApis) {
return GeneralSteps.sequence([
tinyApis.sSetSelection([0, 0, 0, 0, 0], 0, [0, 0, 0, 0, 0], 0),
Waiter.sTryUntil(
'wait for resize handles',
UiFinder.sExists(Element.fromDom(editor.getBody()), '#mceResizeHandlese'),
10, 1000
)
]);
};
TinyLoader.setup(function (editor, onSuccess, onFailure) {
const tinyApis = TinyApis(editor);
Pipeline.async({}, [
tinyApis.sFocus,
Logger.t('resize table height by dragging bottom', GeneralSteps.sequence([
tinyApis.sSetContent(''),
sSetStateFrom(editor, [0, 0, 0, 0]),
sWaitForSelection(editor, tinyApis),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-row="0"]', 0, 50),
sAssertSizeChange(editor, [0, 0, 0, 0], { dh: 50, dw: 0 }),
sResetState
])),
Logger.t('resize table width by dragging right side', GeneralSteps.sequence([
tinyApis.sSetContent(''),
sSetStateFrom(editor, [0, 0, 0, 0]),
sWaitForSelection(editor, tinyApis),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-column="0"]', 50, 0),
sAssertSizeChange(editor, [0, 0, 0, 0], { dh: 0, dw: 50 }),
sResetState
])),
Logger.t('Resize table bigger with handle, then resize row height bigger by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', 50, 50),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-row="0"]', 0, 50),
sAssertSizeChange(editor, [0], { dh: 100, dw: 50 }),
sResetState
])),
Logger.t('Resize table bigger with handle, then resize row height smaller by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', 50, 50),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-row="0"]', 0, -30),
sAssertSizeChange(editor, [0], { dh: 20, dw: 50 }),
sResetState
])),
Logger.t('Resize table bigger with handle, then resize column width bigger by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', 50, 50),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-column="0"]', 50, 0),
sAssertSizeChange(editor, [0], { dh: 50, dw: 50 }),
sResetState
])),
Logger.t('Resize table bigger with handle, then resize column width smaller by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', 50, 50),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-column="0"]', -30, 0),
sAssertSizeChange(editor, [0], { dh: 50, dw: 50 }),
sResetState
])),
Logger.t('Resize table smaller with handle, then resize row height bigger by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', -10, -10),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-row="0"]', 0, 50),
sAssertSizeChange(editor, [0], { dh: 40, dw: -10 }),
sResetState
])),
Logger.t('Resize table smaller with handle, then resize row height smaller by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', -10, -10),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-row="0"]', 0, -20),
sAssertSizeChange(editor, [0], { dh: -30, dw: -10 }),
sResetState
])),
Logger.t('Resize table smaller with handle, then resize column width bigger by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', -10, -10),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-column="0"]', 50, 0),
sAssertSizeChange(editor, [0], { dh: -10, dw: -10 }),
sResetState
])),
Logger.t('Resize table smaller with handle, then resize column width smaller by dragging middle border', GeneralSteps.sequence([
tinyApis.sSetContent(tableHtml),
sSetStateFrom(editor, [0]),
sWaitForSelection(editor, tinyApis),
sDragDrop(Element.fromDom(editor.getBody()), '#mceResizeHandlese', -10, -10),
sMouseover(Element.fromDom(editor.getBody()), 'td'),
sDragDropBlocker(Element.fromDom(editor.getDoc().documentElement), 'div[data-column="0"]', -20, 0),
sAssertSizeChange(editor, [0], { dh: -10, dw: -10 }),
sResetState
]))
], onSuccess, onFailure);
}, {
plugins: 'table',
content_style: 'table {border: 0;padding:0;} td {border: 0;padding:0;}',
height: 400,
skin_url: '/project/js/tinymce/skins/lightgray'
}, success, failure);
});