{"version":3,"file":"novo-elements-elements-drag-drop.mjs","sources":["../../../projects/novo-elements/src/elements/drag-drop/drag-drop-box.ts","../../../projects/novo-elements/src/elements/drag-drop/drag-drop.module.ts","../../../projects/novo-elements/src/elements/drag-drop/novo-elements-elements-drag-drop.ts"],"sourcesContent":["import { OverlayContainer } from '@angular/cdk/overlay';\nimport { AfterViewInit, computed, Directive, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, OnDestroy, Output, Renderer2, signal } from '@angular/core';\n\nexport interface NovoDragFinishEvent<T> {\n    draggedItem: T;\n    allItems: T[];\n    event: DragEvent;\n}\n\ninterface NovoDragItem<T> {\n    item: T;\n    element: HTMLElement;\n    removeListeners: () => void;\n}\n\nconst SCROLL_DRAGGABLE_PADDING_REGION = 30;\nconst SCROLL_DRAGGABLE_EVENT_AMT = 10;\n\n@Directive({\n    selector: '[novoDragDrop]',\n    standalone: false,\n    host: {\n        class: 'novo-drag-container',\n        '[class.dragging]': '!!pickedUp',\n    },\n})\nexport class NovoDragBoxParent<T> implements AfterViewInit, OnDestroy {\n\n    pickedUp?: HTMLElement;\n    previewReplacing?: HTMLElement;\n    savedOrder?: NovoDragItem<T>[];\n\n    overlayContainer = inject(OverlayContainer, { optional: true });\n\n    @Input('novoDragDrop') items: T[];\n    /**\n     * A function to specify whether a given item in the child list is draggable.\n     * (Note that altering this after setup is not yet supported)\n     */\n    @Input('novoDragDropFilter') dragFilter?: (item: T) => boolean;\n    /**\n     * Prevents behavior that eases the act of dragging an object to the edge of a scrollable container.\n     */\n    @Input('novoDragDropDisableScroll') disableScroll?: boolean;\n\n    @Output() novoDragDropFinish = new EventEmitter<NovoDragFinishEvent<T>>();\n\n    private trackedItems: NovoDragItem<T>[];\n    private scrollContainer = signal<HTMLElement>(null);\n    private scrollContainerRect = computed(() => this.scrollContainer()?.getBoundingClientRect());\n    private scrollX = signal<boolean>(false);\n    private scrollY = signal<boolean>(false);\n\n    get itemsReordered(): T[] {\n        return this.trackedItems.map(item => item.item);\n    }\n\n    @HostBinding('class.dragging')\n    get dragging() {\n        return Boolean(this.pickedUp);\n    }\n\n    mutationObserver = new MutationObserver(this.mutationDetected.bind(this));\n\n    constructor(private elementRef: ElementRef, private renderer: Renderer2) { }\n\n    get element(): HTMLElement {\n        return this.elementRef.nativeElement;\n    }\n\n    ngAfterViewInit(): void {\n        if (this.items) {\n            this.registerChildren();\n            this.mutationObserver.observe(this.element, { childList: true });\n        }\n        // if items is falsey, then no behavior is set up. In future, this component may support late enablement,\n        // but for now it's not a priority. (It would open the question of late disablement)\n    }\n\n    ngOnDestroy(): void {\n        this.trackedItems?.forEach(item => {\n            item.removeListeners();\n        });\n    }\n\n    private registerChildren(): void {\n        if (this.items) {\n            if (this.items.length !== this.element.children.length) {\n                throw new Error(`Could not match item list to children list - drag box contains ${this.items.length} items, but has ${this.element.children.length} elements`);\n            }\n            this.trackedItems = [];\n            for (let i = 0; i < this.element.children.length; i++) {\n                this.registerChild(this.element.children[i] as HTMLElement, i);\n            }\n        }\n    }\n\n    private registerChild(element: HTMLElement, index: number) {\n        const trackedItem: Partial<NovoDragItem<T>> = {\n            item: this.items[index],\n            element,\n        };\n        if (this.dragFilter && !this.dragFilter(this.items[index])) {\n            element.draggable = false;\n            trackedItem.removeListeners = () => {};\n        } else {\n            const listeners = [\n                this.renderer.listen(element, 'dragstart', this.onDragStart.bind(this)),\n                this.renderer.listen(element, 'drop', this.onDragFinish.bind(this)),\n                this.renderer.listen(element, 'dragend', this.onDragStop.bind(this)),\n            ];\n            element.draggable = true;\n            trackedItem.removeListeners = () => listeners.forEach(cb => cb());\n        }\n        this.trackedItems.push(trackedItem as NovoDragItem<T>);\n    }\n\n    mutationDetected(mutations: MutationRecord[]) {\n        if (this.pickedUp) {\n            return;\n        }\n        const addedNodes = new Set<HTMLElement>();\n        const removedNodes = new Set<HTMLElement>();\n        for (const mutation of mutations) {\n            mutation.addedNodes.forEach((a: HTMLElement) => {\n                if (!removedNodes.delete(a)) {\n                    addedNodes.add(a);\n                }\n            });\n            mutation.removedNodes.forEach((a: HTMLElement) => {\n                if (!addedNodes.delete(a)) {\n                    removedNodes.add(a);\n                }\n            });\n        }\n        addedNodes.forEach(node => {\n            const idx = Array.prototype.indexOf.call(this.element.children, node);\n            this.registerChild(node, idx);\n        });\n        if (removedNodes.size > 0) {\n            this.trackedItems = this.trackedItems.filter(\n                item => {\n                    const keep = !removedNodes.has(item.element);\n                    if (!keep) {\n                        item.removeListeners();\n                    }\n                    return keep;\n                });\n        }\n    }\n\n    /** Per-item listeners */\n\n    onDragStart(event: DragEvent) {\n        if (this.shouldBlockDragStart(event)) {\n            event.preventDefault();\n            return;\n        }\n        const dataTransfer = event.dataTransfer;\n        // Present a native 'move item' effect\n        dataTransfer.effectAllowed = 'move';\n        if (!this.disableScroll) {\n            this.scrollContainer.set(this.findScrollableParent());\n        }\n\n        this.pickedUp = event.target as HTMLElement;\n        event.stopPropagation();\n        this.savedOrder = [...this.trackedItems];\n    }\n\n    // Equivalent of \"finally\" - this runs whether or not the drag finished on a valid ending location\n    onDragStop(event: DragEvent): void {\n        this.pickedUp = null;\n        this.previewReplacing = null;\n        this.savedOrder = null;\n        event.stopPropagation();\n    }\n\n    onDragFinish(event: DragEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n        if (!this.element.contains(event.currentTarget as HTMLElement)) {\n            // this is for a different drag region - ignore\n            return;\n        }\n        const draggedItem = this.trackedItems.find(item => item.element === this.pickedUp)?.item;\n        this.trackedItems = Array.prototype.map.call(this.element.children, child => {\n            const item = this.trackedItems.find(trackedItem => trackedItem.element === child);\n            if (!item) {\n                throw new Error('DragDrop: Error - could not reassociate an item post-drag');\n            }\n            return item;\n        });\n        this.novoDragDropFinish.emit({\n            draggedItem,\n            allItems: this.itemsReordered,\n            event,\n        });\n\n    }\n\n    /** - end per-item listeners */\n\n    @HostListener('window:dragover', ['$event'])\n    onDragOver(event: DragEvent): void {\n        if (!this.pickedUp || this.inOverlay(event)) {\n            return;\n        }\n        let target = event.target as HTMLElement;\n        if (!this.element.contains(target)) {\n            target = null;\n        }\n        // In some cases (maybe browser-specific) we may have this event reported from a sub-element of a drag destination.\n        // We need to go upwards in the tree to find the actual target\n        if (target && !target.draggable) {\n            target = this.findDraggableParentOfElement(target);\n        }\n        // Check if this drag event is within this drag box\n        if (target && target.parentElement === this.element) {\n            event.stopPropagation();\n            event.preventDefault();\n            if (event.dataTransfer) {\n                event.dataTransfer.dropEffect = 'move';\n            }\n            if (this.previewReplacing !== target) {\n                if (this.isValidTarget(target)) {\n                    this.previewReplacing = target;\n                    this.applyTempSort(this.pickedUp, target);\n                } else {\n                    event.dataTransfer.dropEffect = 'none';\n                }\n            }\n        } else {\n            // if not within this drag box, then move this item back to its original position and show a diabled drag effect\n            if (event.dataTransfer) {\n                event.dataTransfer.dropEffect = 'none';\n            }\n            this.resetSorting();\n        }\n        if (!this.disableScroll) {\n            this.processScrollDuringMove(event);\n        }\n    }\n\n    private inOverlay(event: DragEvent): boolean {\n        // Make sure a drag event is not looking at a tooltip or similar.\n        // Return false if the dragbox itself is in an overlay - these scenarios will be harder to account for.\n        const overlayElement = this.overlayContainer?.getContainerElement();\n        return overlayElement && (overlayElement.contains(event.target as Node) && !overlayElement.contains(this.element));\n    }\n\n    private isValidTarget(target: HTMLElement): boolean {\n        return target.draggable;\n    }\n\n    private findDraggableParentOfElement(target: HTMLElement): HTMLElement | null {\n        const parentElement = target.parentElement;\n        if (!parentElement) {\n            return null;\n        } else if (parentElement.draggable) {\n            return parentElement;\n        } else {\n            return this.findDraggableParentOfElement(parentElement);\n        }\n    }\n\n    private applyTempSort(showXElement: HTMLElement, inPlaceOfY: HTMLElement) {\n        if (showXElement === inPlaceOfY) {\n            // same element - ignoring\n            return;\n        }\n        // Apply the \"preview\" effect from dragging one item to another\n        const aIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, showXElement);\n        const bIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, inPlaceOfY);\n        const diff = bIndex - aIndex;\n        let insertPosition: InsertPosition;\n        if (diff > 0) {\n            insertPosition = 'afterend';\n        } else if (diff < 0) {\n            insertPosition = 'beforebegin';\n        } else {\n            throw new Error('DragDrop: Two elements are in the same position');\n        }\n        inPlaceOfY.insertAdjacentElement(insertPosition, showXElement);\n    }\n\n    private resetSorting(): void {\n        // return to the order of elements from the last time we called onDragPickup\n        if (!this.savedOrder) {\n            throw new Error('DragDrop: Cannot reset sorting with no saved order');\n        }\n        const boxElem = this.elementRef.nativeElement as HTMLElement;\n        for (let i = 0; i < boxElem.children.length; i++) {\n            const item = boxElem.children[i];\n            if (this.savedOrder[i].element !== item && i > 0) {\n                this.savedOrder[i - 1].element.insertAdjacentElement('afterend', this.savedOrder[i].element);\n            }\n        }\n    }\n\n    // If the user has provided classes indicating they only want a certain region to be draggable, ignore\n    // this drag event if it is outside of there.\n    private shouldBlockDragStart(event: DragEvent): boolean {\n        const dragTarget = event.target as HTMLElement;\n        // TODO: Allow for multiple drag targets, and drag exclusion targets\n        const userDragTarget = dragTarget.querySelector('.novo-drag-target');\n        if (userDragTarget) {\n            return !this.isElementWithinEventBounds(userDragTarget, event);\n        }\n    }\n\n    private processScrollDuringMove(event: DragEvent) {\n        const scrollElement = this.scrollContainer();\n        if (!scrollElement) {\n            return;\n        }\n        const rect = this.scrollContainerRect();\n        if (this.scrollX()) {\n            if (event.x > rect.left && event.x < rect.left + SCROLL_DRAGGABLE_PADDING_REGION) {\n                scrollElement.scrollLeft -= 10;\n            } else if (event.x < rect.right && event.x > rect.right - SCROLL_DRAGGABLE_PADDING_REGION) {\n                scrollElement.scrollLeft += 10;\n            }\n        }\n        if (this.scrollY()) {\n            if (event.y > rect.top && event.y < rect.top + SCROLL_DRAGGABLE_PADDING_REGION) {\n                scrollElement.scrollTop -= 10;\n            } else if (event.y < rect.bottom && event.y > rect.bottom - SCROLL_DRAGGABLE_PADDING_REGION) {\n                scrollElement.scrollTop += 10;\n            }\n        }\n    }\n\n    public isElementWithinEventBounds(element: Element, event: DragEvent) {\n        const rect = element.getBoundingClientRect();\n        const isInside = event.clientX > rect.left && event.clientX < rect.right &&\n            event.clientY < rect.bottom && event.clientY > rect.top;\n        return isInside;\n    }\n\n    private findScrollableParent(): HTMLElement | null {\n        let currentElement = this.element.parentElement;\n        this.scrollX.set(false);\n        this.scrollY.set(false);\n\n        while (currentElement) {\n            const hasVerticalScroll = currentElement.scrollHeight > currentElement.clientHeight;\n            const hasHorizontalScroll = currentElement.scrollWidth > currentElement.clientWidth;\n            const isScrollable = hasVerticalScroll || hasHorizontalScroll;\n\n            if (isScrollable) {\n                const computedStyle = window.getComputedStyle(currentElement);\n                const overflowY = computedStyle.overflowY;\n                const overflowX = computedStyle.overflowX;\n\n                // Check if overflow is set to allow scrolling\n                if ((overflowY === 'auto' || overflowY === 'scroll') ||\n                    (overflowX === 'auto' || overflowX === 'scroll')) {\n                    // Verify the scrollable parent is smaller than the drag container\n                    if (currentElement.clientHeight < this.element.clientHeight) {\n                        this.scrollY.set(true);\n                    }\n                    if (currentElement.clientWidth < this.element.clientWidth) {\n                        this.scrollX.set(true);\n                    }\n                    if (this.scrollX() || this.scrollY()) {\n                        return currentElement;\n                    }\n                }\n            }\n\n            currentElement = currentElement.parentElement;\n        }\n\n        return null;\n    }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NovoDragBoxParent } from './drag-drop-box';\n\n\n@NgModule({\n    declarations: [NovoDragBoxParent],\n    exports: [NovoDragBoxParent],\n})\nexport class NovoDragDropModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}