import { UnitTest } from '@ephox/bedrock-client';
import { DomEvent, Insert, Remove, SelectorFind, SugarBody, SugarElement } from '@ephox/sugar';
import { assert } from 'chai';
import { dragnDrop, dropFiles, isDraggable, sDragnDrop, sDropFiles, sDropItems } from 'ephox/agar/api/DragnDrop';
import { createFile } from 'ephox/agar/api/Files';
import * as GeneralSteps from 'ephox/agar/api/GeneralSteps';
import * as Logger from 'ephox/agar/api/Logger';
import { Pipeline } from 'ephox/agar/api/Pipeline';
import { Step } from 'ephox/agar/api/Step';
UnitTest.test('DragDrop.isDraggable', () => {
const check = (expected: boolean, html: string) => {
assert.equal(isDraggable(SugarElement.fromHtml(html)), expected);
};
check(false, '
');
check(false, '');
check(false, '');
check(true, '');
check(true, '');
check(true, '
');
check(false, '
');
check(false, '
');
check(true, '
');
});
UnitTest.asynctest('DragnDropTest', (success, failure) => {
const dropzone = SugarElement.fromHtml('');
const draggable = SugarElement.fromHtml('');
const store: string[] = [];
const sClearStore = Step.sync(() => {
store.splice(0);
});
const sAssertStoreItems = (expectedStoreItems: string[]) => Step.sync(() => {
assert.deepEqual(store, expectedStoreItems, 'Should have the expected items');
});
const dragStartUnbinder = DomEvent.bind(draggable, 'dragstart', (evt) => {
const dataTransfer = evt.raw.dataTransfer;
evt.kill();
dataTransfer.setData('text', 'hello');
store.push('dragstart');
});
const dragEnterUnbinder = DomEvent.bind(dropzone, 'dragenter', (evt) => {
evt.kill();
store.push('dragenter');
});
const dragOverUnbinder = DomEvent.bind(dropzone, 'dragover', (evt) => {
evt.kill();
store.push('dragover');
});
const dropUnbinder = DomEvent.bind(dropzone, 'drop', (evt) => {
const dataTransfer = evt.raw.dataTransfer;
evt.kill();
if (dataTransfer.getData('text')) {
store.push('drop text: ' + dataTransfer.getData('text'));
} else {
store.push(`drop files: ${dataTransfer.files.length}`);
}
});
const dragEndUnbinder = DomEvent.bind(draggable, 'dragend', (_evt) => {
store.push('dragend');
});
Insert.append(SugarBody.body(), dropzone);
Insert.append(SugarBody.body(), draggable);
Pipeline.async({}, [
Logger.t('Drag/drop element with data using selectors', GeneralSteps.sequence([
sClearStore,
sDragnDrop('.draggable', '.dropzone'),
sAssertStoreItems([ 'dragstart', 'dragenter', 'dragover', 'drop text: hello', 'dragend' ])
])),
Logger.t('Drag/drop element with data using elements', GeneralSteps.sequence([
sClearStore,
Step.sync(() => {
const from = SelectorFind.descendant(SugarBody.body(), '.draggable').getOrDie('Could not find from element.');
const to = SelectorFind.descendant(SugarBody.body(), '.dropzone').getOrDie('Could not find to element.');
dragnDrop(from, to);
}),
sAssertStoreItems([ 'dragstart', 'dragenter', 'dragover', 'drop text: hello', 'dragend' ])
])),
Logger.t('Drop files using selector', GeneralSteps.sequence([
sClearStore,
sDropFiles([
createFile('a.txt', 123, new Blob([ '' ], { type: 'text/plain' })),
createFile('b.html', 123, new Blob([ '' ], { type: 'text/html' }))
], '.dropzone'),
sAssertStoreItems([ 'dragenter', 'dragover', 'drop files: 2' ])
])),
Logger.t('Drop files using element', GeneralSteps.sequence([
sClearStore,
Step.sync(() => {
const to = SelectorFind.descendant(SugarBody.body(), '.dropzone').getOrDie('Could not find to element.');
dropFiles([
createFile('a.txt', 123, new Blob([ '' ], { type: 'text/plain' })),
createFile('b.html', 123, new Blob([ '' ], { type: 'text/html' }))
], to);
}),
sAssertStoreItems([ 'dragenter', 'dragover', 'drop files: 2' ])
])),
Logger.t('Drop items using selector', GeneralSteps.sequence([
sClearStore,
sDropItems([
{ data: 'hello', type: 'text/plain' },
{ data: 'hello
', type: 'text/html' }
], '.dropzone'),
sAssertStoreItems([ 'dragenter', 'dragover', 'drop text: hello' ])
]))
], () => {
Remove.remove(dropzone);
Remove.remove(draggable);
dropUnbinder.unbind();
dragStartUnbinder.unbind();
dragOverUnbinder.unbind();
dragEnterUnbinder.unbind();
dragEndUnbinder.unbind();
success();
}, failure);
});