UNPKG

ngx-drag-to-select

Version:

A lightweight, fast, configurable and reactive drag-to-select component for Angular 8 and beyond

81 lines 11.7 kB
import { MIN_HEIGHT, MIN_WIDTH } from './constants'; export const isObject = (item) => { return item && typeof item === 'object' && !Array.isArray(item) && item !== null; }; export function mergeDeep(target, source) { if (isObject(target) && isObject(source)) { Object.keys(source).forEach((key) => { if (isObject(source[key])) { if (!target[key]) { Object.assign(target, { [key]: {} }); } mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } }); } return target; } export const hasMinimumSize = (selectBox, minWidth = MIN_WIDTH, minHeight = MIN_HEIGHT) => { return selectBox.width > minWidth || selectBox.height > minHeight; }; export const clearSelection = (window) => { const selection = window.getSelection(); if (!selection) { return; } if (selection.removeAllRanges) { selection.removeAllRanges(); } else if (selection.empty) { selection.empty(); } }; export const inBoundingBox = (point, box) => { return (box.left <= point.x && point.x <= box.left + box.width && box.top <= point.y && point.y <= box.top + box.height); }; export const boxIntersects = (boxA, boxB) => { return (boxA.left <= boxB.left + boxB.width && boxA.left + boxA.width >= boxB.left && boxA.top <= boxB.top + boxB.height && boxA.top + boxA.height >= boxB.top); }; export const calculateBoundingClientRect = (element) => { return element.getBoundingClientRect(); }; export const getMousePosition = (event) => { return { x: event.clientX, y: event.clientY, }; }; export const getScroll = () => { if (!document || !document.documentElement) { return { x: 0, y: 0, }; } return { x: document.documentElement.scrollLeft || document.body.scrollLeft, y: document.documentElement.scrollTop || document.body.scrollTop, }; }; export const getRelativeMousePosition = (event, container) => { const { x: clientX, y: clientY } = getMousePosition(event); const scroll = getScroll(); const borderSize = (container.boundingClientRect.width - container.clientWidth) / 2; const offsetLeft = container.boundingClientRect.left + scroll.x; const offsetTop = container.boundingClientRect.top + scroll.y; return { x: clientX - borderSize - (offsetLeft - window.pageXOffset) + container.scrollLeft, y: clientY - borderSize - (offsetTop - window.pageYOffset) + container.scrollTop, }; }; export const cursorWithinElement = (event, element) => { const mousePoint = getMousePosition(event); return inBoundingBox(mousePoint, calculateBoundingClientRect(element)); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHJhZy10by1zZWxlY3Qvc3JjL2xpYi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdwRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtJQUNwQyxPQUFPLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUM7QUFDbkYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUEyQixFQUFFLE1BQTJCO0lBQ2hGLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzth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LEVBQUUsU0FBOEIsRUFBaUIsRUFBRTtJQUMzRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFFM0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEYsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU5RCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLE9BQU8sR0FBRyxVQUFVLEdBQUcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxVQUFVO1FBQ2xGLENBQUMsRUFBRSxPQUFPLEdBQUcsVUFBVSxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUztLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQW9CLEVBQUUsRUFBRTtJQUM3RSxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLEVBQUUsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNSU5fSEVJR0hULCBNSU5fV0lEVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCb3VuZGluZ0JveCwgTW91c2VQb3NpdGlvbiwgU2VsZWN0Qm94LCBTZWxlY3RDb250YWluZXJIb3N0IH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSAoaXRlbTogYW55KSA9PiB7XG4gIHJldHVybiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSAmJiBpdGVtICE9PSBudWxsO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICBpZiAoaXNPYmplY3QodGFyZ2V0KSAmJiBpc09iamVjdChzb3VyY2UpKSB7XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBjb25zdCBoYXNNaW5pbXVtU2l6ZSA9IChzZWxlY3RCb3g6IFNlbGVjdEJveDxudW1iZXI+LCBtaW5XaWR0aCA9IE1JTl9XSURUSCwgbWluSGVpZ2h0ID0gTUlOX0hFSUdIVCkgPT4ge1xuICByZXR1cm4gc2VsZWN0Qm94LndpZHRoID4gbWluV2lkdGggfHwgc2VsZWN0Qm94LmhlaWdodCA+IG1pbkhlaWdodDtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlbGVjdGlvbiA9ICh3aW5kb3c6IFdpbmRvdykgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcykge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZW1wdHkpIHtcbiAgICBzZWxlY3Rpb24uZW1wdHkoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluQm91bmRpbmdCb3ggPSAocG9pbnQ6IE1vdXNlUG9zaXRpb24sIGJveDogQm91bmRpbmdCb3gpID0+IHtcbiAgcmV0dXJuIChcbiAgICBib3gubGVmdCA8PSBwb2ludC54ICYmIHBvaW50LnggPD0gYm94LmxlZnQgKyBib3gud2lkdGggJiYgYm94LnRvcCA8PSBwb2ludC55ICYmIHBvaW50LnkgPD0gYm94LnRvcCArIGJveC5oZWlnaHRcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBib3hJbnRlcnNlY3RzID0gKGJveEE6IEJvdW5kaW5nQm94LCBib3hCOiBCb3VuZGluZ0JveCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGJveEEubGVmdCA8PSBib3hCLmxlZnQgKyBib3hCLndpZHRoICYmXG4gICAgYm94QS5sZWZ0ICsgYm94QS53aWR0aCA+PSBib3hCLmxlZnQgJiZcbiAgICBib3hBLnRvcCA8PSBib3hCLnRvcCArIGJveEIuaGVpZ2h0ICYmXG4gICAgYm94QS50b3AgKyBib3hBLmhlaWdodCA+PSBib3hCLnRvcFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUJvdW5kaW5nQ2xpZW50UmVjdCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEJvdW5kaW5nQm94ID0+IHtcbiAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TW91c2VQb3NpdGlvbiA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgeTogZXZlbnQuY2xpZW50WSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTY3JvbGwgPSAoKSA9PiB7XG4gIGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsXG4gICAgeTogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGl2ZU1vdXNlUG9zaXRpb24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbnRhaW5lcjogU2VsZWN0Q29udGFpbmVySG9zdCk6IE1vdXNlUG9zaXRpb24gPT4ge1xuICBjb25zdCB7IHg6IGNsaWVudFgsIHk6IGNsaWVudFkgfSA9IGdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICBjb25zdCBzY3JvbGwgPSBnZXRTY3JvbGwoKTtcblxuICBjb25zdCBib3JkZXJTaXplID0gKGNvbnRhaW5lci5ib3VuZGluZ0NsaWVudFJlY3Qud2lkdGggLSBjb250YWluZXIuY2xpZW50V2lkdGgpIC8gMjtcbiAgY29uc3Qgb2Zmc2V0TGVmdCA9IGNvbnRhaW5lci5ib3VuZGluZ0NsaWVudFJlY3QubGVmdCArIHNjcm9sbC54O1xuICBjb25zdCBvZmZzZXRUb3AgPSBjb250YWluZXIuYm91bmRpbmdDbGllbnRSZWN0LnRvcCArIHNjcm9sbC55O1xuXG4gIHJldHVybiB7XG4gICAgeDogY2xpZW50WCAtIGJvcmRlclNpemUgLSAob2Zmc2V0TGVmdCAtIHdpbmRvdy5wYWdlWE9mZnNldCkgKyBjb250YWluZXIuc2Nyb2xsTGVmdCxcbiAgICB5OiBjbGllbnRZIC0gYm9yZGVyU2l6ZSAtIChvZmZzZXRUb3AgLSB3aW5kb3cucGFnZVlPZmZzZXQpICsgY29udGFpbmVyLnNjcm9sbFRvcCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBjdXJzb3JXaXRoaW5FbGVtZW50ID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICBjb25zdCBtb3VzZVBvaW50ID0gZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KG1vdXNlUG9pbnQsIGNhbGN1bGF0ZUJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSk7XG59O1xuIl19