import { Mouse, UiFinder } from '@ephox/agar';
import { beforeEach, context, describe, it } from '@ephox/bedrock-client';
import { Attribute, Html, Insert, Remove, SelectorFind, SugarBody, SugarElement } from '@ephox/sugar';
import { TinyDom, TinyHooks, TinyUiActions } from '@ephox/wrap-mcagar';
import { assert } from 'chai';
import Editor from 'tinymce/core/api/Editor';
import Plugin from 'tinymce/plugins/table/Plugin';
const findAll = (selector: string) => UiFinder.findAllIn(SugarBody.body(), selector);
describe('browser.tinymce.plugins.table.InlineEditorInsideTableTest', () => {
const setupElement = () => {
const containerHtml = '
' +
'' +
'' +
'| ' +
' a ' +
' | ' +
'
' +
'' +
'
';
const container = SugarElement.fromTag('div');
Attribute.set(container, 'id', 'test-container-div');
Html.set(container, containerHtml);
Insert.append(SugarBody.body(), container);
const editorDiv = SelectorFind.descendant(container, 'div.tinymce').getOrDie('Cannot find TinyMCE div');
return {
element: editorDiv,
teardown: () => Remove.remove(container)
};
};
const hook = TinyHooks.bddSetupFromElement({
inline: true,
base_url: '/project/tinymce/js/tinymce',
plugins: 'table',
menubar: 'table',
statusbar: false
}, setupElement, [ Plugin ]);
beforeEach(() => {
const editor = hook.editor();
editor.focus();
});
const pWaitForMenuBar = (editor: Editor) => TinyUiActions.pWaitForUi(editor, '.tox-menubar');
const pAssertMenuButtonDisabled = (editor: Editor, selector: string, disabled: boolean) =>
TinyUiActions.pWaitForUi(editor, `div.tox-collection__item[title="${selector}"][aria-disabled="${disabled}"]`);
it('TBA: Table outside of inline editor should not become resizable', () => {
const editor = hook.editor();
Mouse.mouseOver(TinyDom.targetElement(editor));
UiFinder.notExists(SugarBody.body(), 'div[data-row="0"]');
});
it('TINY-6625: Table menu items of inline editor shoud be disabled', async () => {
const editor = hook.editor();
await pWaitForMenuBar(editor);
TinyUiActions.clickOnMenu(editor, 'span:contains("Table")');
await pAssertMenuButtonDisabled(editor, 'Delete table', true);
await pAssertMenuButtonDisabled(editor, 'Table properties', true);
});
context('TINY-6625: Table outside of inline editor should not be affected by table plugin commands', () => {
it('TINY-6625: mceTableApplyCellStyle', () => {
const editor = hook.editor();
editor.execCommand('mceTableApplyCellStyle', false, { 'background-color': 'pink' });
const td = editor.getBody().parentElement as HTMLTableCellElement;
assert.notEqual(td.style.backgroundColor, 'pink');
});
it('TINY-6625: mceTableInsertRowBefore', () => {
const editor = hook.editor();
editor.execCommand('mceTableInsertRowBefore');
assert.lengthOf(findAll('tr'), 1);
});
it('TINY-6625: mceTableInsertRowAfter', () => {
const editor = hook.editor();
editor.execCommand('mceTableInsertRowAfter');
assert.lengthOf(findAll('tr'), 1);
});
it('TINY-6625: mceTableInsertColBefore', () => {
const editor = hook.editor();
editor.execCommand('mceTableInsertColBefore');
assert.lengthOf(findAll('td'), 1);
});
it('TINY-6625: mceTableInsertColAfter', () => {
const editor = hook.editor();
editor.execCommand('mceTableInsertColAfter');
assert.lengthOf(findAll('td'), 1);
});
it('TINY-6625: mceTableDeleteCol', () => {
const editor = hook.editor();
editor.execCommand('mceTableDeleteCol');
assert.lengthOf(findAll('td'), 1);
});
it('TINY-6625: mceTableDeleteRow', () => {
const editor = hook.editor();
editor.execCommand('mceTableDeleteRow');
assert.lengthOf(findAll('tr'), 1);
});
it('TINY-6625: mceTableDelete', () => {
const editor = hook.editor();
editor.execCommand('mceTableDelete');
assert.lengthOf(findAll('table'), 1);
});
});
});