61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
/** @odoo-module */
|
|
|
|
/**
|
|
* @param {String} string - Name of the drag event
|
|
* @param {DataTransfer} dataTransfer - Object used to store data
|
|
* @param {HTMLElement} target - Target element
|
|
*/
|
|
export function dragAndDrop(type, dataTransfer, target) {
|
|
const fakeDragAndDrop = new Event(type, {
|
|
bubbles: true,
|
|
cancelable: true,
|
|
composed: true,
|
|
});
|
|
fakeDragAndDrop.dataTransfer = dataTransfer;
|
|
target.dispatchEvent(fakeDragAndDrop);
|
|
}
|
|
|
|
/**
|
|
* @param {DataTransfer} dataTransfer - Object used to store data
|
|
* @param {HTMLElement} target - Target element
|
|
*/
|
|
export function pasteElements(dataTransfer, target) {
|
|
const fakePaste = new Event('paste', {
|
|
bubbles: true,
|
|
cancelable: true,
|
|
composed: true,
|
|
});
|
|
fakePaste.clipboardData = dataTransfer;
|
|
|
|
const sel = document.getSelection();
|
|
sel.removeAllRanges();
|
|
const range = document.createRange();
|
|
const lastChild = target.lastChild;
|
|
if (!lastChild) {
|
|
range.setStart(target, 0);
|
|
range.setEnd(target, 0);
|
|
} else {
|
|
const subLastChild = lastChild.lastChild;
|
|
if (subLastChild) {
|
|
if (subLastChild.nodeType === Node.ELEMENT_NODE && subLastChild.tagName === 'BR') {
|
|
range.setStartBefore(subLastChild);
|
|
range.setEndBefore(subLastChild);
|
|
} else {
|
|
range.setStartAfter(subLastChild);
|
|
range.setEndAfter(subLastChild);
|
|
}
|
|
} else {
|
|
range.setStartAfter(lastChild);
|
|
range.setEndAfter(lastChild);
|
|
}
|
|
}
|
|
const lastElementChild = target.lastElementChild;
|
|
if (lastElementChild) {
|
|
lastElementChild.scrollIntoView();
|
|
} else {
|
|
target.scrollIntoView();
|
|
}
|
|
sel.addRange(range);
|
|
target.dispatchEvent(fakePaste);
|
|
}
|