export const DROP_EFFECTS = ['move', 'copy', 'link']; export const CUSTOM_MIME_TYPE = 'application/x-dnd'; export const JSON_MIME_TYPE = 'application/json'; export const MSIE_MIME_TYPE = 'Text'; function mimeTypeIsCustom(mimeType) { return mimeType.substr(0, CUSTOM_MIME_TYPE.length) === CUSTOM_MIME_TYPE; } export function getWellKnownMimeType(event) { if (event.dataTransfer) { const types = event.dataTransfer.types; // IE 9 workaround. if (!types) { return MSIE_MIME_TYPE; } for (let i = 0; i < types.length; i++) { if (types[i] === MSIE_MIME_TYPE || types[i] === JSON_MIME_TYPE || mimeTypeIsCustom(types[i])) { return types[i]; } } } return null; } export function setDragData(event, data, effectAllowed) { // Internet Explorer and Microsoft Edge don't support custom mime types, see design doc: // https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design const mimeType = CUSTOM_MIME_TYPE + (data.type ? '-' + data.type : ''); const dataString = JSON.stringify(data); try { event.dataTransfer?.setData(mimeType, dataString); } catch (e) { // Setting a custom MIME type did not work, we are probably in IE or Edge. try { event.dataTransfer?.setData(JSON_MIME_TYPE, dataString); } catch (e) { // We are in Internet Explorer and can only use the Text MIME type. Also note that IE // does not allow changing the cursor in the dragover event, therefore we have to choose // the one we want to display now by setting effectAllowed. const effectsAllowed = filterEffects(DROP_EFFECTS, effectAllowed); if (event.dataTransfer) { event.dataTransfer.effectAllowed = effectsAllowed[0]; } event.dataTransfer?.setData(MSIE_MIME_TYPE, dataString); } } } export function getDropData(event, dragIsExternal) { // check if the mime type is well known const mimeType = getWellKnownMimeType(event); // drag did not originate from [dndDraggable] if (dragIsExternal === true) { if (mimeType !== null && mimeTypeIsCustom(mimeType)) { // the type of content is well known and safe to handle return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}'); } // the contained data is unknown, let user handle it return {}; } if (mimeType !== null) { // the type of content is well known and safe to handle return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}'); } // the contained data is unknown, let user handle it return {}; } export function filterEffects(effects, allowed) { if (allowed === 'all' || allowed === 'uninitialized') { return effects; } return effects.filter(function (effect) { return allowed.toLowerCase().indexOf(effect) !== -1; }); } export function getDirectChildElement(parentElement, childElement) { let directChild = childElement; while (directChild.parentNode !== parentElement) { // reached root node without finding given parent if (!directChild.parentNode) { return null; } directChild = directChild.parentNode; } return directChild; } export function shouldPositionPlaceholderBeforeElement(event, element, horizontal) { const bounds = element.getBoundingClientRect(); // If the pointer is in the upper half of the list item element, // we position the placeholder before the list item, otherwise after it. if (horizontal) { return event.clientX < bounds.left + bounds.width / 2; } return event.clientY < bounds.top + bounds.height / 2; } export function calculateDragImageOffset(event, dragImage) { const dragImageComputedStyle = window.getComputedStyle(dragImage); const paddingTop = parseFloat(dragImageComputedStyle.paddingTop) || 0; const paddingLeft = parseFloat(dragImageComputedStyle.paddingLeft) || 0; const borderTop = parseFloat(dragImageComputedStyle.borderTopWidth) || 0; const borderLeft = parseFloat(dragImageComputedStyle.borderLeftWidth) || 0; return { x: event.offsetX + paddingLeft + borderLeft, y: event.offsetY + paddingTop + borderTop, }; } export function setDragImage(event, dragImage, offsetFunction) { const offset = offsetFunction(event, dragImage) || { x: 0, y: 0 }; event.dataTransfer.setDragImage(dragImage, offset.x, offset.y); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZG5kL3NyYy9saWIvZG5kLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBaUIsQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUVyQyxTQUFTLGdCQUFnQixDQUFDLFFBQWdCO0lBQ3hDLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssZ0JBQWdCLENBQUM7QUFDMUUsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFnQjtJQUNuRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFFdkMsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLGNBQWMsQ0FBQztTQUN2QjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQ0UsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLGNBQWM7Z0JBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxjQUFjO2dCQUMzQixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDMUI7Z0JBQ0EsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakI7U0FDRjtLQUNGO0lBRUQs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Q0FDMUIsS0FBZ0IsRUFDaEIsU0FBa0IsRUFDbEIsY0FBMEM7SUFFMUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRWpFLEtBQUssQ0FBQyxZQUFvQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERyb3BFZmZlY3QsIEVmZmVjdEFsbG93ZWQgfSBmcm9tICcuL2RuZC10eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ0Ryb3BEYXRhIHtcbiAgZGF0YT86IGFueTtcbiAgdHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEbmRFdmVudCBleHRlbmRzIERyYWdFdmVudCB7XG4gIF9kbmRVc2luZ0hhbmRsZT86IGJvb2xlYW47XG4gIF9kbmREcm9wem9uZUFjdGl2ZT86IHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uID0gKFxuICBldmVudDogRHJhZ0V2ZW50LFxuICBkcmFnSW1hZ2U6IEVsZW1lbnRcbikgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgRFJPUF9FRkZFQ1RTID0gWydtb3ZlJywgJ2NvcHknLCAnbGluayddIGFzIERyb3BFZmZlY3RbXTtcblxuZXhwb3J0IGNvbnN0IENVU1RPTV9NSU1FX1RZUEUgPSAnYXBwbGljYXRpb24veC1kbmQnO1xuZXhwb3J0IGNvbnN0IEpTT05fTUlNRV9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNvbnN0IE1TSUVfTUlNRV9UWVBFID0gJ1RleHQnO1xuXG5mdW5jdGlvbiBtaW1lVHlwZUlzQ3VzdG9tKG1pbWVUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG1pbWVUeXBlLnN1YnN0cigwLCBDVVNUT01fTUlNRV9UWVBFLmxlbmd0aCkgPT09IENVU1RPTV9NSU1FX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWxsS25vd25NaW1lVHlwZShldmVudDogRHJhZ0V2ZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICBjb25zdCB0eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcztcblxuICAgIC8vIElFIDkgd29ya2Fyb3VuZC5cbiAgICBpZiAoIXR5cGVzKSB7XG4gICAgICByZXR1cm4gTVNJRV9NSU1FX1RZUEU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlc1tpXSA9PT0gTVNJRV9NSU1FX1RZUEUgfHxcbiAgICAgICAgdHlwZXNbaV0gPT09IEpTT05fTUlNRV9UWVBFIHx8XG4gICAgICAgIG1pbWVUeXBlSXNDdXN0b20odHlwZXNbaV0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHR5cGVzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhZ0RhdGEoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGRhdGE6IERyYWdEcm9wRGF0YSxcbiAgZWZmZWN0QWxsb3dlZDogRWZmZWN0QWxsb3dlZFxuKTogdm9pZCB7XG4gIC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBNaWNyb3NvZnQgRWRnZSBkb24ndCBzdXBwb3J0IGN1c3RvbSBtaW1lIHR5cGVzLCBzZWUgZGVzaWduIGRvYzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcmNlbGp1ZW5lbWFubi9hbmd1bGFyLWRyYWctYW5kLWRyb3AtbGlzdHMvd2lraS9EYXRhLVRyYW5zZmVyLURlc2lnblxuICBjb25zdCBtaW1lVHlwZSA9IENVU1RPTV9NSU1FX1RZUEUgKyAoZGF0YS50eXBlID8gJy0nICsgZGF0YS50eXBlIDogJycpO1xuXG4gIGNvbnN0IGRhdGFTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcblxuICB0cnkge1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YShtaW1lVHlwZSwgZGF0YVN0cmluZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgIFNldHRpbmcgYSBjdXN0b20gTUlNRSB0eXBlIGRpZCBub3Qgd29yaywgd2UgYXJlIHByb2JhYmx5IGluIElFIG9yIEVkZ2UuXG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YShKU09OX01JTUVfVFlQRSwgZGF0YVN0cmluZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gICBXZSBhcmUgaW4gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIGNhbiBvbmx5IHVzZSB0aGUgVGV4dCBNSU1FIHR5cGUuIEFsc28gbm90ZSB0aGF0IElFXG4gICAgICAvLyAgIGRvZXMgbm90IGFsbG93IGNoYW5naW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRyYWdvdmVyIGV2ZW50LCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBjaG9vc2VcbiAgICAgIC8vICAgdGhlIG9uZSB3ZSB3YW50IHRvIGRpc3BsYXkgbm93IGJ5IHNldHRpbmcgZWZmZWN0QWxsb3dlZC5cbiAgICAgIGNvbnN0IGVmZmVjdHNBbGxvd2VkID0gZmlsdGVyRWZmZWN0cyhEUk9QX0VGRkVDVFMsIGVmZmVjdEFsbG93ZWQpO1xuICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IGVmZmVjdHNBbGxvd2VkWzBdO1xuICAgICAgfVxuXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoTVNJRV9NSU1FX1RZUEUsIGRhdGFTdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcERhdGEoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGRyYWdJc0V4dGVybmFsOiBib29sZWFuXG4pOiBEcmFnRHJvcERhdGEge1xuICAvLyBjaGVjayBpZiB0aGUgbWltZSB0eXBlIGlzIHdlbGwga25vd25cbiAgY29uc3QgbWltZVR5cGUgPSBnZXRXZWxsS25vd25NaW1lVHlwZShldmVudCk7XG5cbiAgLy8gZHJhZyBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIFtkbmREcmFnZ2FibGVdXG4gIGlmIChkcmFnSXNFeHRlcm5hbCA9PT0gdHJ1ZSkge1xuICAgIGlmIChtaW1lVHlwZSAhPT0gbnVsbCAmJiBtaW1lVHlwZUlzQ3VzdG9tKG1pbWVUeXBlKSkge1xuICAgICAgLy8gdGhlIHR5cGUgb2YgY29udGVudCBpcyB3ZWxsIGtub3duIGFuZCBzYWZlIHRvIGhhbmRsZVxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXZlbnQuZGF0YVRyYW5zZmVyPy5nZXREYXRhKG1pbWVUeXBlKSA/PyAne30nKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29udGFpbmVkIGRhdGEgaXMgdW5rbm93biwgbGV0IHVzZXIgaGFuZGxlIGl0XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgaWYgKG1pbWVUeXBlICE9PSBudWxsKSB7XG4gICAgLy8gdGhlIHR5cGUgb2YgY29udGVudCBpcyB3ZWxsIGtub3duIGFuZCBzYWZlIHRvIGhhbmRsZVxuICAgIHJldHVybiBKU09OLnBhcnNlKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZ2V0RGF0YShtaW1lVHlwZSkgPz8gJ3t9Jyk7XG4gIH1cblxuICAvLyB0aGUgY29udGFpbmVkIGRhdGEgaXMgdW5rbm93biwgbGV0IHVzZXIgaGFuZGxlIGl0XG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckVmZmVjdHMoXG4gIGVmZmVjdHM6IERyb3BFZmZlY3RbXSxcbiAgYWxsb3dlZDogRWZmZWN0QWxsb3dlZCB8IERyb3BFZmZlY3Rcbik6IERyb3BFZmZlY3RbXSB7XG4gIGlmIChhbGxvd2VkID09PSAnYWxsJyB8fCBhbGxvd2VkID09PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICByZXR1cm4gZWZmZWN0cztcbiAgfVxuXG4gIHJldHVybiBlZmZlY3RzLmZpbHRlcihmdW5jdGlvbiAoZWZmZWN0KSB7XG4gICAgcmV0dXJuIGFsbG93ZWQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGVmZmVjdCkgIT09IC0xO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcmVjdENoaWxkRWxlbWVudChcbiAgcGFyZW50RWxlbWVudDogRWxlbWVudCxcbiAgY2hpbGRFbGVtZW50OiBFbGVtZW50XG4pOiBFbGVtZW50IHwgbnVsbCB7XG4gIGxldCBkaXJlY3RDaGlsZDogTm9kZSA9IGNoaWxkRWxlbWVudDtcblxuICB3aGlsZSAoZGlyZWN0Q2hpbGQucGFyZW50Tm9kZSAhPT0gcGFyZW50RWxlbWVudCkge1xuICAgIC8vIHJlYWNoZWQgcm9vdCBub2RlIHdpdGhvdXQgZmluZGluZyBnaXZlbiBwYXJlbnRcbiAgICBpZiAoIWRpcmVjdENoaWxkLnBhcmVudE5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGRpcmVjdENoaWxkID0gZGlyZWN0Q2hpbGQucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3RDaGlsZCBhcyBFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUG9zaXRpb25QbGFjZWhvbGRlckJlZm9yZUVsZW1lbnQoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGVsZW1lbnQ6IEVsZW1lbnQsXG4gIGhvcml6b250YWw6IGJvb2xlYW5cbikge1xuICBjb25zdCBib3VuZHMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIC8vIElmIHRoZSBwb2ludGVyIGlzIGluIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBsaXN0IGl0ZW0gZWxlbWVudCxcbiAgLy8gd2UgcG9zaXRpb24gdGhlIHBsYWNlaG9sZGVyIGJlZm9yZSB0aGUgbGlzdCBpdGVtLCBvdGhlcndpc2UgYWZ0ZXIgaXQuXG4gIGlmIChob3Jpem9udGFsKSB7XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFggPCBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAvIDI7XG4gIH1cblxuICByZXR1cm4gZXZlbnQuY2xpZW50WSA8IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZURyYWdJbWFnZU9mZnNldChcbiAgZXZlbnQ6IERyYWdFdmVudCxcbiAgZHJhZ0ltYWdlOiBFbGVtZW50XG4pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICBjb25zdCBkcmFnSW1hZ2VDb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZHJhZ0ltYWdlKTtcbiAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoZHJhZ0ltYWdlQ29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSB8fCAwO1xuICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlRmxvYXQoZHJhZ0ltYWdlQ29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgY29uc3QgYm9yZGVyVG9wID0gcGFyc2VGbG9hdChkcmFnSW1hZ2VDb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKSB8fCAwO1xuICBjb25zdCBib3JkZXJMZWZ0ID0gcGFyc2VGbG9hdChkcmFnSW1hZ2VDb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCkgfHwgMDtcblxuICByZXR1cm4ge1xuICAgIHg6IGV2ZW50Lm9mZnNldFggKyBwYWRkaW5nTGVmdCArIGJvcmRlckxlZnQsXG4gICAgeTogZXZlbnQub2Zmc2V0WSArIHBhZGRpbmdUb3AgKyBib3JkZXJUb3AsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREcmFnSW1hZ2UoXG4gIGV2ZW50OiBEcmFnRXZlbnQsXG4gIGRyYWdJbWFnZTogRWxlbWVudCxcbiAgb2Zmc2V0RnVuY3Rpb246IERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2Zmc2V0ID0gb2Zmc2V0RnVuY3Rpb24oZXZlbnQsIGRyYWdJbWFnZSkgfHwgeyB4OiAwLCB5OiAwIH07XG5cbiAgKGV2ZW50LmRhdGFUcmFuc2ZlciBhcyBhbnkpLnNldERyYWdJbWFnZShkcmFnSW1hZ2UsIG9mZnNldC54LCBvZmZzZXQueSk7XG59XG4iXX0=