@limble/limble-tree 0.12.2 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -149
- package/{esm2015/lib/classes/Branch.js → esm2020/lib/classes/Branch.mjs} +1 -1
- package/{esm2015/lib/classes/DropZone.js → esm2020/lib/classes/DropZone.mjs} +1 -1
- package/{esm2015/lib/classes/DropZoneLocation.js → esm2020/lib/classes/DropZoneLocation.mjs} +1 -1
- package/{esm2015/lib/custom-event-bindings/dragleave-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragleave-no-change-detect.directive.mjs} +0 -0
- package/{esm2015/lib/custom-event-bindings/dragover-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragover-no-change-detect.directive.mjs} +1 -1
- package/esm2020/lib/drop-zone/drop-zone.component.mjs +75 -0
- package/esm2020/lib/limble-tree-branch/limble-tree-branch.component.mjs +110 -0
- package/esm2020/lib/limble-tree-node/limble-tree-node.component.mjs +467 -0
- package/{esm2015/lib/limble-tree-placeholder/limble-tree-placeholder.component.js → esm2020/lib/limble-tree-placeholder/limble-tree-placeholder.component.mjs} +3 -8
- package/esm2020/lib/limble-tree-root/drop-zone.service.mjs +376 -0
- package/esm2020/lib/limble-tree-root/limble-tree-root.component.mjs +172 -0
- package/{esm2015/lib/limble-tree-root/tree-construction-status.service.js → esm2020/lib/limble-tree-root/tree-construction-status.service.mjs} +1 -1
- package/esm2020/lib/limble-tree-root/tree.service.mjs +297 -0
- package/{esm2015/lib/limble-tree.module.js → esm2020/lib/limble-tree.module.mjs} +5 -5
- package/{esm2015/lib/singletons/component-creator.service.js → esm2020/lib/singletons/component-creator.service.mjs} +1 -1
- package/esm2020/lib/singletons/drag-state.service.mjs +63 -0
- package/esm2020/lib/singletons/global-events.service.mjs +136 -0
- package/{esm2015/lib/util.js → esm2020/lib/util.mjs} +1 -1
- package/{esm2015/limble-limble-tree.js → esm2020/limble-limble-tree.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/limble-limble-tree.mjs +2256 -0
- package/fesm2015/limble-limble-tree.mjs.map +1 -0
- package/{fesm2015/limble-limble-tree.js → fesm2020/limble-limble-tree.mjs} +105 -147
- package/fesm2020/limble-limble-tree.mjs.map +1 -0
- package/{limble-limble-tree.d.ts → index.d.ts} +0 -0
- package/lib/custom-event-bindings/dragleave-no-change-detect.directive.d.ts +1 -1
- package/lib/custom-event-bindings/dragover-no-change-detect.directive.d.ts +1 -1
- package/lib/drop-zone/drop-zone.component.d.ts +1 -1
- package/lib/limble-tree-branch/limble-tree-branch.component.d.ts +1 -1
- package/lib/limble-tree-node/limble-tree-node.component.d.ts +1 -1
- package/lib/limble-tree-placeholder/limble-tree-placeholder.component.d.ts +1 -1
- package/lib/limble-tree-root/limble-tree-root.component.d.ts +1 -1
- package/package.json +24 -10
- package/bundles/limble-limble-tree.umd.js +0 -2905
- package/bundles/limble-limble-tree.umd.js.map +0 -1
- package/esm2015/lib/drop-zone/drop-zone.component.js +0 -81
- package/esm2015/lib/limble-tree-branch/limble-tree-branch.component.js +0 -116
- package/esm2015/lib/limble-tree-node/limble-tree-node.component.js +0 -484
- package/esm2015/lib/limble-tree-root/drop-zone.service.js +0 -372
- package/esm2015/lib/limble-tree-root/limble-tree-root.component.js +0 -178
- package/esm2015/lib/limble-tree-root/tree.service.js +0 -301
- package/esm2015/lib/singletons/drag-state.service.js +0 -64
- package/esm2015/lib/singletons/global-events.service.js +0 -137
- package/fesm2015/limble-limble-tree.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"limble-limble-tree.js","sources":["../../../projects/limble-tree/src/lib/util.ts","../../../projects/limble-tree/src/lib/classes/DropZoneLocation.ts","../../../projects/limble-tree/src/lib/classes/DropZone.ts","../../../projects/limble-tree/src/lib/singletons/drag-state.service.ts","../../../projects/limble-tree/src/lib/limble-tree-root/tree-construction-status.service.ts","../../../projects/limble-tree/src/lib/limble-tree-root/drop-zone.service.ts","../../../projects/limble-tree/src/lib/classes/Branch.ts","../../../projects/limble-tree/src/lib/drop-zone/drop-zone.component.html","../../../projects/limble-tree/src/lib/drop-zone/drop-zone.component.ts","../../../projects/limble-tree/src/lib/limble-tree-branch/limble-tree-branch.component.html","../../../projects/limble-tree/src/lib/limble-tree-branch/limble-tree-branch.component.ts","../../../projects/limble-tree/src/lib/singletons/component-creator.service.ts","../../../projects/limble-tree/src/lib/singletons/global-events.service.ts","../../../projects/limble-tree/src/lib/limble-tree-node/limble-tree-node.component.html","../../../projects/limble-tree/src/lib/limble-tree-node/limble-tree-node.component.ts","../../../projects/limble-tree/src/lib/limble-tree-root/tree.service.ts","../../../projects/limble-tree/src/lib/custom-event-bindings/dragover-no-change-detect.directive.ts","../../../projects/limble-tree/src/lib/custom-event-bindings/dragleave-no-change-detect.directive.ts","../../../projects/limble-tree/src/lib/limble-tree-placeholder/limble-tree-placeholder.component.ts","../../../projects/limble-tree/src/lib/limble-tree-placeholder/limble-tree-placeholder.component.html","../../../projects/limble-tree/src/lib/limble-tree-root/limble-tree-root.component.html","../../../projects/limble-tree/src/lib/limble-tree-root/limble-tree-root.component.ts","../../../projects/limble-tree/src/lib/limble-tree.module.ts","../../../projects/limble-tree/src/public-api.ts","../../../projects/limble-tree/src/limble-limble-tree.ts"],"sourcesContent":["import type {\r\n LimbleTreeNode,\r\n ProcessedOptions\r\n} from \"./limble-tree-root/tree.service\";\r\n\r\nexport function arraysAreEqual(\r\n array1: Array<unknown>,\r\n array2: Array<unknown>\r\n): boolean {\r\n if (array1.length !== array2.length) {\r\n return false;\r\n }\r\n for (const [index, value1] of array1.entries()) {\r\n const value2 = array2[index];\r\n if (value1 instanceof Array && value2 instanceof Array) {\r\n if (!arraysAreEqual(value1, value2)) {\r\n return false;\r\n }\r\n } else if (value1 !== value2) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isElementDescendant(\r\n potentialAncestor: Node,\r\n potentialDescendant: Node\r\n): boolean | undefined {\r\n if (potentialAncestor === potentialDescendant) {\r\n return true;\r\n }\r\n let cursor = potentialDescendant.parentNode;\r\n while (cursor !== document) {\r\n if (cursor === null) {\r\n //Did not reach `document` or ancestor. potentialDescendant is not part of the DOM.\r\n return undefined;\r\n }\r\n if (cursor === potentialAncestor) {\r\n return true;\r\n }\r\n cursor = cursor.parentNode;\r\n }\r\n return false;\r\n}\r\n\r\nexport function isNestingAllowed(\r\n options?: ProcessedOptions,\r\n nodeData?: LimbleTreeNode\r\n): boolean {\r\n return (\r\n options !== undefined &&\r\n (options.allowNesting === true ||\r\n (typeof options.allowNesting === \"function\" &&\r\n nodeData !== undefined &&\r\n options.allowNesting(nodeData) === true))\r\n );\r\n}\r\n\r\nexport function isDraggingAllowed(\r\n options?: ProcessedOptions,\r\n nodeData?: LimbleTreeNode\r\n): boolean {\r\n return (\r\n options !== undefined &&\r\n (options.allowDragging === true ||\r\n (typeof options.allowDragging === \"function\" &&\r\n nodeData !== undefined &&\r\n options.allowDragging(nodeData) === true))\r\n );\r\n}\r\n\r\nexport function isFirefox(): boolean {\r\n return navigator.userAgent.includes(\"Firefox\");\r\n}\r\n\r\n/** Because drop zones can disappear when the mouse moves, sometimes\r\n * moving the mouse just a little bit inside the tree causes the tree to\r\n * shrink such that the mouse is no longer over the tree. In this case,\r\n * a dragleave event may not fire, and we can't clear the drop zones. This\r\n * function is used to catch this edge case.\r\n */\r\nexport function suddenTreeExit(event: DragEvent): boolean {\r\n if (event.target === null || !(event.target instanceof Element)) {\r\n throw new Error(\"failed to get event target element\");\r\n }\r\n const treeEventHost = event.target.closest(\".tree-event-host\");\r\n if (treeEventHost === null) {\r\n console.log(event.target);\r\n throw new Error(\"failed to find treeEventHost\");\r\n }\r\n const rect = treeEventHost.getBoundingClientRect();\r\n const clientY = event.clientY;\r\n if (clientY > rect.bottom || clientY < rect.top) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","import { BranchCoordinates } from \"./Branch\";\r\n\r\nexport class DropZoneLocation {\r\n public parentCoordinates: BranchCoordinates;\r\n public insertIndex: number;\r\n\r\n constructor(parentCoordinates: BranchCoordinates, insertIndex: number) {\r\n this.parentCoordinates = parentCoordinates;\r\n this.insertIndex = insertIndex;\r\n }\r\n\r\n public getFullInsertCoordinates() {\r\n return [...this.parentCoordinates, this.insertIndex];\r\n }\r\n\r\n public setParentCoordinates(coordinates: BranchCoordinates) {\r\n this.parentCoordinates = coordinates;\r\n }\r\n\r\n public setInsertIndex(index: number) {\r\n this.insertIndex = index;\r\n }\r\n}\r\n","import { BranchCoordinates } from \"./Branch\";\r\nimport { DropZoneFamily } from \"../limble-tree-root/drop-zone.service\";\r\nimport { arraysAreEqual } from \"../util\";\r\nimport { Subject } from \"rxjs\";\r\nimport { DropZoneLocation } from \"./DropZoneLocation\";\r\nimport { ViewContainerRef } from \"@angular/core\";\r\n\r\nexport type CommMessage = \"checkActive\" | \"checkVisible\" | \"checkRendered\";\r\n\r\nexport class DropZone {\r\n public static dropZoneLocationsAreEqual(\r\n valueA: DropZone | DropZoneLocation,\r\n valueB: DropZone | DropZoneLocation\r\n ) {\r\n return arraysAreEqual(\r\n valueA.getFullInsertCoordinates(),\r\n valueB.getFullInsertCoordinates()\r\n );\r\n }\r\n\r\n private host: ViewContainerRef | undefined;\r\n private readonly location: DropZoneLocation;\r\n private visible: boolean;\r\n private active: boolean;\r\n private rendered: boolean;\r\n private family: DropZoneFamily | undefined;\r\n private readonly commChannel: Subject<CommMessage>;\r\n\r\n public constructor(\r\n parentCoordinates: BranchCoordinates,\r\n insertIndex: number\r\n ) {\r\n this.location = new DropZoneLocation(parentCoordinates, insertIndex);\r\n this.rendered = false;\r\n this.visible = false;\r\n this.active = false;\r\n this.commChannel = new Subject();\r\n }\r\n\r\n public isRendered(\r\n set: boolean | undefined = undefined\r\n ): DropZone[\"rendered\"] {\r\n if (set !== undefined) {\r\n this.rendered = set;\r\n if (this.commChannel !== undefined) {\r\n this.commChannel.next(\"checkRendered\");\r\n }\r\n if (this.rendered === false) {\r\n this.isVisible(false);\r\n }\r\n }\r\n return this.rendered;\r\n }\r\n\r\n public isVisible(set: boolean | undefined = undefined): DropZone[\"visible\"] {\r\n if (set !== undefined) {\r\n this.visible = set;\r\n if (this.commChannel !== undefined) {\r\n this.commChannel.next(\"checkVisible\");\r\n }\r\n if (this.visible === false) {\r\n this.isActive(false);\r\n }\r\n }\r\n return this.visible;\r\n }\r\n\r\n public isActive(set: boolean | undefined = undefined): DropZone[\"active\"] {\r\n if (set !== undefined) {\r\n this.active = set;\r\n if (this.commChannel !== undefined) {\r\n this.commChannel.next(\"checkActive\");\r\n }\r\n }\r\n return this.active;\r\n }\r\n\r\n public getLocation(): DropZone[\"location\"] {\r\n return this.location;\r\n }\r\n\r\n public getFamily(): DropZone[\"family\"] {\r\n return this.family;\r\n }\r\n\r\n public setFamily(family: DropZoneFamily): void {\r\n this.family = family;\r\n }\r\n\r\n public getCommChannel(): Subject<CommMessage> {\r\n return this.commChannel;\r\n }\r\n\r\n public getFullInsertCoordinates() {\r\n return this.location.getFullInsertCoordinates();\r\n }\r\n\r\n public setHost(host: ViewContainerRef | undefined) {\r\n this.host = host;\r\n return this.host;\r\n }\r\n\r\n public getHost() {\r\n return this.host;\r\n }\r\n}\r\n","import { Injectable, ViewContainerRef } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport type { Branch } from \"../classes/Branch\";\r\n\r\nexport type DragState = \"idle\" | \"dragging\" | \"droppable\" | \"captured\";\r\n\r\ninterface TempData {\r\n branch: Branch<any>;\r\n parentContainer: ViewContainerRef;\r\n}\r\n\r\n@Injectable()\r\nexport class DragStateService {\r\n /** pushes the new state whenever the state changes */\r\n public state$: BehaviorSubject<DragState>;\r\n\r\n /** holds data about the thing being dragged */\r\n private _tempData: TempData | undefined;\r\n\r\n /** the current state of the drag process */\r\n private state: DragState;\r\n\r\n constructor() {\r\n this.state = \"idle\";\r\n this.state$ = new BehaviorSubject<DragState>(this.state);\r\n }\r\n\r\n /** Called to indicate that something is being dragged. Stores that something for later. */\r\n public dragging(branch: Branch<any>, parentContainer: ViewContainerRef) {\r\n this._tempData = {\r\n branch: branch,\r\n parentContainer: parentContainer\r\n };\r\n this.state = \"dragging\";\r\n this.state$.next(this.state);\r\n }\r\n\r\n /** Called to indicate that there is a valid active drop zone. Drop is now possible. */\r\n public droppable() {\r\n if (this.state !== \"dragging\") {\r\n throw new Error(\"Can only call `droppable` when state is `dragging`\");\r\n }\r\n this.state = \"droppable\";\r\n this.state$.next(this.state);\r\n }\r\n\r\n /** Called to indicate that there is no longer a valid active drop zone. Drop is no longer possible. */\r\n public notDroppable() {\r\n if (this.state !== \"droppable\") {\r\n throw new Error(\r\n \"Can only call `notDroppable` when state is `droppable`\"\r\n );\r\n }\r\n this.state = \"dragging\";\r\n this.state$.next(this.state);\r\n }\r\n\r\n /** Called to indicate that a drop into a valid drop zone has occurred. Returns the item that was dropped. */\r\n public capture() {\r\n if (this.state !== \"droppable\") {\r\n throw new Error(\r\n \"Can only move to `captured` state from `droppable` state\"\r\n );\r\n }\r\n this.state = \"captured\";\r\n this.state$.next(this.state);\r\n return this._tempData?.branch;\r\n }\r\n\r\n /** Called to reset the service for future drags */\r\n public release() {\r\n this._tempData = undefined;\r\n this.state = \"idle\";\r\n this.state$.next(this.state);\r\n }\r\n\r\n /** gets the current thing being dragged, if any. */\r\n public getData() {\r\n return this._tempData;\r\n }\r\n\r\n /** gets the current state */\r\n public getState() {\r\n return this.state;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable()\r\nexport class TreeConstructionStatus {\r\n private beingBuilt: number;\r\n private isReady: boolean;\r\n public readonly stable$: BehaviorSubject<boolean>;\r\n\r\n public constructor() {\r\n this.beingBuilt = 0;\r\n this.isReady = false;\r\n this.stable$ = new BehaviorSubject(this.treeIsStable());\r\n }\r\n\r\n public constructing(): void {\r\n this.beingBuilt++;\r\n this.emit();\r\n }\r\n\r\n public doneConstructing(): void {\r\n this.beingBuilt--;\r\n this.emit();\r\n }\r\n\r\n public treeIsStable(): boolean {\r\n return this.isReady === true && this.beingBuilt === 0;\r\n }\r\n\r\n public ready(val: boolean): void {\r\n this.isReady = val;\r\n }\r\n\r\n public emit(): void {\r\n this.stable$.next(this.treeIsStable());\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Branch, BranchCoordinates } from \"../classes/Branch\";\r\nimport { DragStateService } from \"../singletons/drag-state.service\";\r\nimport type { LimbleTreeNode, ProcessedOptions } from \"./tree.service\";\r\nimport { arraysAreEqual } from \"../util\";\r\nimport { DropZone } from \"../classes/DropZone\";\r\nimport { DropZoneLocation } from \"../classes/DropZoneLocation\";\r\nimport { EMPTY, Subject } from \"rxjs\";\r\nimport { TreeConstructionStatus } from \"./tree-construction-status.service\";\r\nimport { debounce, filter, tap } from \"rxjs/operators\";\r\n\r\nexport interface DropZoneFamily {\r\n /** The deepest member of the family */\r\n founder: DropZone;\r\n /** All the drop zones that belong to this family */\r\n members: Array<DropZone>;\r\n}\r\n\r\nfunction sortFamily(memberA: DropZone, memberB: DropZone) {\r\n const aCoordinates = memberA.getFullInsertCoordinates();\r\n const bCoordinates = memberB.getFullInsertCoordinates();\r\n if (aCoordinates.length > bCoordinates.length) {\r\n return -1;\r\n }\r\n if (aCoordinates.length < bCoordinates.length) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\n@Injectable()\r\nexport class DropZoneService {\r\n private readonly dropZoneArchive: Set<DropZone>;\r\n private readonly dropZoneInventory: Array<DropZone>;\r\n private readonly dropZoneFamilies: Array<DropZoneFamily>;\r\n private visibleFamily: DropZoneFamily | null;\r\n private activeDropZone: DropZone | null;\r\n private tree: Branch<any> | undefined;\r\n private treeOptions: ProcessedOptions | undefined;\r\n private tempFamilies:\r\n | readonly [DropZoneFamily, DropZoneFamily | null]\r\n | readonly [];\r\n private readonly update$: Subject<null>;\r\n\r\n constructor(\r\n private readonly dragStateService: DragStateService,\r\n treeConstructionStatus: TreeConstructionStatus\r\n ) {\r\n this.dropZoneArchive = new Set();\r\n this.dropZoneInventory = [];\r\n this.dropZoneFamilies = [];\r\n this.visibleFamily = null;\r\n this.activeDropZone = null;\r\n this.tempFamilies = [];\r\n this.setActiveDropZone(null);\r\n let treeIsStable = false;\r\n const treeIsStable$ = treeConstructionStatus.stable$.pipe(\r\n tap((value) => {\r\n treeIsStable = value;\r\n }),\r\n filter((value) => value === true)\r\n );\r\n this.update$ = new Subject();\r\n this.update$\r\n .pipe(\r\n debounce(() => {\r\n if (treeIsStable === true) {\r\n //If tree is stable, continue right away\r\n return EMPTY;\r\n }\r\n //If tree is not stable, wait for it to become so.\r\n return treeIsStable$;\r\n })\r\n )\r\n .subscribe(() => {\r\n setTimeout(() => {\r\n this.updateDropZones();\r\n });\r\n });\r\n }\r\n\r\n public addDropZone(newDropZone: DropZone): void {\r\n this.dropZoneArchive.add(newDropZone);\r\n }\r\n\r\n /** hides all drop zones */\r\n public clearVisibleZones(): void {\r\n if (this.visibleFamily !== null) {\r\n for (const member of this.visibleFamily.members) {\r\n member.isVisible(false);\r\n }\r\n this.visibleFamily = null;\r\n }\r\n this.setActiveDropZone(null);\r\n }\r\n\r\n public getActiveDropZone(): DropZoneService[\"activeDropZone\"] {\r\n return this.activeDropZone;\r\n }\r\n\r\n public getDropZone(coordinates: BranchCoordinates): DropZone | undefined {\r\n const parent = [...coordinates];\r\n parent.pop();\r\n const index = coordinates[coordinates.length - 1];\r\n const location = new DropZoneLocation(parent, index);\r\n return this.dropZoneInventory.find((dropZone) =>\r\n DropZone.dropZoneLocationsAreEqual(dropZone, location)\r\n );\r\n }\r\n\r\n public init(tree: Branch<any>, treeOptions: ProcessedOptions): void {\r\n this.tree = tree;\r\n this.treeOptions = treeOptions;\r\n this.update();\r\n }\r\n\r\n public removeDropZone(dropZone: DropZone) {\r\n this.dropZoneArchive.delete(dropZone);\r\n }\r\n\r\n /** hides all drop zones, deletes all the family assignments,\r\n * and empties the dropZoneInventory\r\n */\r\n public reset(): void {\r\n this.clearVisibleZones();\r\n this.dropZoneFamilies.length = 0;\r\n this.dropZoneInventory.length = 0;\r\n }\r\n\r\n /**\r\n * Restores the service to its initial state: hides all drop zones,\r\n * deletes all the family assignments, and empties the dropZoneInventory\r\n * and dropZoneArchive.\r\n */\r\n public restart(): void {\r\n this.reset();\r\n this.dropZoneArchive.clear();\r\n }\r\n\r\n public restoreFamilies(): void {\r\n if (this.tempFamilies.length === 2) {\r\n this.dropZoneFamilies.pop();\r\n this.dropZoneFamilies.push(this.tempFamilies[0]);\r\n for (const member of this.tempFamilies[0].members) {\r\n member.setFamily(this.tempFamilies[0]);\r\n }\r\n if (this.tempFamilies[1] !== null) {\r\n this.dropZoneFamilies.push(this.tempFamilies[1]);\r\n for (const member of this.tempFamilies[1].members) {\r\n member.setFamily(this.tempFamilies[1]);\r\n }\r\n }\r\n this.tempFamilies = [];\r\n }\r\n }\r\n\r\n /**\r\n * Shows the drop zone family of the drop zone indicated by `coordinates`.\r\n */\r\n public showDropZoneFamily(\r\n /** Note: this drop zone may not exist in the dropZoneInventory; we have to search the inventory based on its location */\r\n dropZone: DropZone,\r\n options: {\r\n joinFamilies?: boolean;\r\n activateLowestInsteadOfFounder?: boolean;\r\n } = { joinFamilies: false, activateLowestInsteadOfFounder: false }\r\n ): void {\r\n if (\r\n this.activeDropZone !== null &&\r\n DropZone.dropZoneLocationsAreEqual(this.activeDropZone, dropZone)\r\n ) {\r\n //Already showing the family with the appropriate active drop zone\r\n return;\r\n }\r\n if (this.visibleFamily !== null || this.activeDropZone !== null) {\r\n this.clearVisibleZones();\r\n }\r\n const target = this.dropZoneInventory.find((zone) =>\r\n DropZone.dropZoneLocationsAreEqual(zone, dropZone)\r\n );\r\n if (target === undefined) {\r\n throw new Error(\r\n `Could not find drop zone to show. location: ${JSON.stringify(\r\n dropZone.getLocation()\r\n )}`\r\n );\r\n }\r\n const family = target.getFamily();\r\n if (options.joinFamilies === true) {\r\n const location1 = dropZone.getLocation();\r\n const location2 = new DropZoneLocation(\r\n [...location1.parentCoordinates],\r\n location1.insertIndex + 1\r\n );\r\n const target2 = this.dropZoneInventory.find((zone) =>\r\n DropZone.dropZoneLocationsAreEqual(zone, location2)\r\n );\r\n if (target2 === undefined) {\r\n throw new Error(\"Could not find drop zone to show\");\r\n }\r\n const family2 = target2.getFamily();\r\n if (family === undefined || family2 === undefined) {\r\n throw new Error(\"No family\");\r\n }\r\n const newFamily = {\r\n founder: family.founder,\r\n members: [...family.members]\r\n };\r\n this.showDropZone(family.founder, true);\r\n for (const member of family.members.sort(sortFamily)) {\r\n member.setFamily(newFamily);\r\n if (member !== family.founder) {\r\n if (this.activeDropZone === null) {\r\n //Failed to activate a zone so far, so activate this one instead\r\n this.showDropZone(member, true);\r\n } else {\r\n this.showDropZone(member);\r\n }\r\n }\r\n }\r\n for (const member of family2.members) {\r\n member.setFamily(newFamily);\r\n if (\r\n member.getLocation().parentCoordinates.length <\r\n target2.getLocation().parentCoordinates.length\r\n ) {\r\n newFamily.members.push(member);\r\n this.showDropZone(member);\r\n }\r\n }\r\n //Temporarily store the old families\r\n this.tempFamilies = [family, family2];\r\n //Remove the old families\r\n const familyIndex = this.dropZoneFamilies.indexOf(family);\r\n this.dropZoneFamilies.splice(familyIndex, 1);\r\n const family2Index = this.dropZoneFamilies.indexOf(family2);\r\n this.dropZoneFamilies.splice(family2Index, 1);\r\n //Add the new family\r\n this.dropZoneFamilies.push(newFamily);\r\n this.visibleFamily = newFamily;\r\n } else {\r\n if (family === undefined) {\r\n throw new Error(\"No family\");\r\n }\r\n this.visibleFamily = family;\r\n this.showDropZone(family.founder, true);\r\n if (family.members.length > 1) {\r\n for (const member of family.members.sort(sortFamily)) {\r\n if (member !== family.founder) {\r\n if (this.activeDropZone === null) {\r\n //Failed to activate a zone so far, so activate this one instead\r\n this.showDropZone(member, true);\r\n } else {\r\n this.showDropZone(member);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n options.activateLowestInsteadOfFounder === true &&\r\n this.visibleFamily.members.length > 1\r\n ) {\r\n const lowestMember = [...this.visibleFamily.members]\r\n .sort(sortFamily)\r\n .pop();\r\n if (lowestMember === undefined) {\r\n throw new Error(\"Could not get lowest member\");\r\n }\r\n this.swapActiveDropZone(lowestMember);\r\n }\r\n }\r\n\r\n public swapActiveDropZone(newActiveDropZone: DropZone): void {\r\n if (this.visibleFamily === null) {\r\n throw new Error(\"No visible family available for swapping\");\r\n }\r\n const index = this.visibleFamily.members.findIndex(\r\n (dropZone) => dropZone === newActiveDropZone\r\n );\r\n if (index === -1) {\r\n throw new Error(\"failed to swap active drop zone\");\r\n }\r\n this.setActiveDropZone(newActiveDropZone);\r\n }\r\n\r\n public update(): void {\r\n this.update$.next(null);\r\n }\r\n\r\n private assignFamilies(): void {\r\n const orphanZones = [...this.dropZoneInventory];\r\n const deepestMembers = orphanZones\r\n .filter((zone) => {\r\n const location = zone.getLocation();\r\n return (\r\n location.insertIndex === 0 &&\r\n location.parentCoordinates.length > 0\r\n );\r\n })\r\n .sort((valueA, valueB) => {\r\n const aCoordinates = valueA.getFullInsertCoordinates();\r\n const bCoordinates = valueB.getFullInsertCoordinates();\r\n const length = Math.max(aCoordinates.length, bCoordinates.length);\r\n for (let index = 0; index < length; index++) {\r\n if ((aCoordinates[index] ?? -1) > (bCoordinates[index] ?? -1)) {\r\n return -1;\r\n } else if (\r\n (aCoordinates[index] ?? -1) < (bCoordinates[index] ?? -1)\r\n ) {\r\n return 1;\r\n }\r\n }\r\n return 0;\r\n });\r\n for (const dropZone of deepestMembers) {\r\n if (!orphanZones.includes(dropZone)) {\r\n continue;\r\n }\r\n const family: DropZoneFamily = {\r\n founder: dropZone,\r\n members: []\r\n };\r\n dropZone.setFamily(family);\r\n //See if there are any orphans that belong to this family and claim them.\r\n const cursor = [...dropZone.getFullInsertCoordinates()];\r\n while (cursor.length > 0) {\r\n const familyMemberIndex = orphanZones.findIndex((zone) =>\r\n arraysAreEqual(zone.getFullInsertCoordinates(), cursor)\r\n );\r\n if (familyMemberIndex !== -1) {\r\n const familyMember = orphanZones.splice(familyMemberIndex, 1)[0];\r\n family.members.push(familyMember);\r\n familyMember.setFamily(family);\r\n }\r\n cursor.pop();\r\n cursor[cursor.length - 1]++;\r\n }\r\n this.dropZoneFamilies.push(family);\r\n }\r\n for (const dropZone of orphanZones.filter(\r\n (zone) => zone.getFullInsertCoordinates().length === 1\r\n )) {\r\n const family: DropZoneFamily = {\r\n founder: dropZone,\r\n members: [dropZone]\r\n };\r\n dropZone.setFamily(family);\r\n this.dropZoneFamilies.push(family);\r\n orphanZones.splice(orphanZones.indexOf(dropZone), 1);\r\n }\r\n if (orphanZones.length !== 0) {\r\n let orphans = \"\";\r\n for (const zone of orphanZones) {\r\n orphans += `${JSON.stringify(zone.getLocation())}, `;\r\n }\r\n orphans = orphans.slice(0, orphans.length - 2);\r\n throw new Error(\r\n `Some zones were not assigned to a family. The orphan zones have the following locations: ${orphans}`\r\n );\r\n }\r\n }\r\n\r\n private buildInventory() {\r\n //We do this funky string array because it is faster than doing direct array comparisons\r\n const inventoryCoordinates: Array<string> = [];\r\n for (const dropZone of this.dropZoneArchive) {\r\n const coordinates = dropZone.getFullInsertCoordinates().join(\",\");\r\n if (inventoryCoordinates.includes(coordinates)) {\r\n dropZone.isRendered(false);\r\n } else {\r\n this.dropZoneInventory.push(dropZone);\r\n inventoryCoordinates.push(coordinates);\r\n dropZone.isRendered(true);\r\n }\r\n }\r\n }\r\n\r\n private setActiveDropZone(dropZone: DropZone | null): void {\r\n if (this.activeDropZone !== null) {\r\n this.activeDropZone.isActive(false);\r\n }\r\n this.activeDropZone = dropZone;\r\n if (\r\n this.activeDropZone !== null &&\r\n this.dragStateService.getState() !== \"droppable\"\r\n ) {\r\n this.dragStateService.droppable();\r\n } else if (\r\n this.activeDropZone === null &&\r\n this.dragStateService.getState() === \"droppable\"\r\n ) {\r\n this.dragStateService.notDroppable();\r\n }\r\n if (this.activeDropZone !== null) {\r\n this.activeDropZone.isActive(true);\r\n }\r\n }\r\n\r\n private showDropZone(dropZone: DropZone, active = false): boolean {\r\n if (this.tree === undefined) {\r\n throw new Error(\"DropZoneService not initialized\");\r\n }\r\n if (!this.zoneIsAllowed(dropZone)) {\r\n //User settings indicate to skip this drop zone\r\n return false;\r\n }\r\n const parent = this.tree.findByCoordinates(\r\n dropZone.getLocation().parentCoordinates\r\n );\r\n if (parent === undefined) {\r\n throw new Error(\"Bad family member\");\r\n }\r\n dropZone.isVisible(true);\r\n if (active === true) {\r\n this.setActiveDropZone(dropZone);\r\n }\r\n return true;\r\n }\r\n\r\n private updateDropZones(): void {\r\n this.reset();\r\n this.buildInventory();\r\n this.assignFamilies();\r\n }\r\n\r\n private zoneIsAllowed(dropZone: DropZone): boolean {\r\n if (this.treeOptions === undefined || this.tree === undefined) {\r\n throw new Error(\"dropZoneService not initialized\");\r\n }\r\n const data = this.dragStateService.getData();\r\n if (data === undefined) {\r\n throw new Error(\"Can't get dragged node\");\r\n }\r\n const dropZoneParent = this.tree.findByCoordinates(\r\n dropZone.getLocation().parentCoordinates\r\n );\r\n if (dropZoneParent === undefined) {\r\n throw new Error(\"Could not get drop zone parent\");\r\n }\r\n const dropZoneIndex = dropZone.getLocation().insertIndex;\r\n if (dropZoneIndex === undefined) {\r\n throw new Error(\"Could not get drop zone index\");\r\n }\r\n const draggedNode = data.branch;\r\n if (\r\n this.treeOptions.allowDrop(\r\n draggedNode.data,\r\n dropZoneParent.data as LimbleTreeNode,\r\n dropZoneIndex\r\n )\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","/** An object indicating a location within a tree */\r\nexport type BranchCoordinates = Array<number>;\r\n\r\nexport class Branch<T> {\r\n public data: T;\r\n protected children: Array<Branch<T>>;\r\n protected parent: Branch<unknown> | null;\r\n\r\n public constructor(data: T) {\r\n this.data = data;\r\n this.children = [];\r\n this.parent = null;\r\n }\r\n\r\n public isRoot(): boolean {\r\n return this.parent === null;\r\n }\r\n\r\n public getParent(): Branch<unknown> | null {\r\n return this.parent;\r\n }\r\n\r\n public setParent<U>(parent: Branch<U> | null) {\r\n this.parent = parent;\r\n }\r\n\r\n public findByCoordinates(\r\n relativeCoordinates: BranchCoordinates\r\n ): Branch<unknown> | undefined {\r\n let cursor: Branch<T> | undefined = this;\r\n for (const index of relativeCoordinates.values()) {\r\n cursor = cursor.getChild(index);\r\n if (cursor === undefined) {\r\n return undefined;\r\n }\r\n }\r\n return cursor;\r\n }\r\n\r\n public getCoordinates(): BranchCoordinates {\r\n const coordinates: BranchCoordinates = [];\r\n let cursor: Branch<unknown> = this;\r\n while (cursor.parent !== null) {\r\n const cursorIndex = cursor.getIndex();\r\n if (cursorIndex === undefined || cursorIndex === null) {\r\n throw new Error(\"Could not get cursor index\");\r\n }\r\n coordinates.unshift(cursorIndex);\r\n cursor = cursor.parent;\r\n }\r\n return coordinates;\r\n }\r\n\r\n public getChild(index: number): Branch<T> | undefined {\r\n return this.children[index];\r\n }\r\n\r\n public getChildren(): Array<Branch<T>> {\r\n return this.children;\r\n }\r\n\r\n public clearChildren(): void {\r\n for (const child of this.children) {\r\n child.setParent(null);\r\n }\r\n this.children.length = 0;\r\n }\r\n\r\n public getIndex(): number | null | undefined {\r\n if (this.parent === null) {\r\n return null;\r\n }\r\n const index = this.parent.children.findIndex((branch) => branch === this);\r\n if (index === -1) {\r\n return undefined;\r\n }\r\n return index;\r\n }\r\n\r\n public getDescendant(\r\n relativeCoordinates: BranchCoordinates\r\n ): Branch<T> | undefined {\r\n let cursor: Branch<T> = this;\r\n for (const index of relativeCoordinates) {\r\n cursor = cursor.children[index];\r\n if (cursor === undefined) {\r\n return undefined;\r\n }\r\n }\r\n return cursor;\r\n }\r\n\r\n public findDescendant(\r\n predicate: (data: T) => boolean\r\n ): Branch<T> | undefined {\r\n if (predicate(this.data) === true) {\r\n return this;\r\n }\r\n if (this.children.length > 0) {\r\n for (const child of this.children) {\r\n const foundDeeper = child.findDescendant(predicate);\r\n if (foundDeeper !== undefined) {\r\n return foundDeeper;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public getAncestors(): Array<Branch<unknown>> {\r\n const result: Array<Branch<unknown>> = [];\r\n let cursor: Branch<unknown> = this;\r\n while (cursor.parent !== null) {\r\n result.push(cursor.parent);\r\n cursor = cursor.parent;\r\n }\r\n return result;\r\n }\r\n\r\n public appendChild(child: Branch<T>): Branch<T> {\r\n if (child.getParent() !== null) {\r\n child.remove();\r\n }\r\n child.setParent(this);\r\n this.children.push(child);\r\n return child;\r\n }\r\n\r\n public insertChild(child: Branch<T>, index: number): Branch<T> {\r\n const isOwnChild = this.children.indexOf(child);\r\n if (isOwnChild === -1) {\r\n if (child.getParent() !== null) {\r\n child.remove();\r\n }\r\n child.setParent(this);\r\n this.children.splice(index, 0, child);\r\n } else {\r\n if (index > isOwnChild) {\r\n //Insert first, then remove\r\n this.children.splice(index, 0, child);\r\n this.removeChild(isOwnChild);\r\n child.setParent(this);\r\n } else {\r\n //remove first, then insert\r\n child.remove();\r\n this.children.splice(index, 0, child);\r\n child.setParent(this);\r\n }\r\n }\r\n return child;\r\n }\r\n\r\n public removeChild(index: number): Branch<T> {\r\n const target = this.children.splice(index, 1)[0];\r\n target.setParent(null);\r\n return target;\r\n }\r\n\r\n public remove(): Branch<T> {\r\n const index = this.getIndex();\r\n if (this.parent === null || index === undefined || index === null) {\r\n throw new Error(\"can't remove root\");\r\n }\r\n return this.parent.removeChild(index) as Branch<T>;\r\n }\r\n\r\n public copy(): Branch<T> {\r\n const copy = this.copyHelper();\r\n copy.setParent(null);\r\n return copy;\r\n }\r\n\r\n protected copyHelper(): Branch<T> {\r\n const copy = new Branch(this.data);\r\n for (const child of this.children) {\r\n const newChild = copy.appendChild(child.copyHelper());\r\n newChild.parent = copy;\r\n }\r\n return copy;\r\n }\r\n}\r\n","<div class=\"dropZoneContainer\" (dragenter)=\"dragenterHandler()\" *ngIf=\"visible\">\r\n <div [ngClass]=\"{ active: active, related: !active }\"></div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { DropZone } from \"../classes/DropZone\";\r\nimport { DropZoneService } from \"../limble-tree-root/drop-zone.service\";\r\n\r\n@Component({\r\n selector: \"drop-zone\",\r\n templateUrl: \"./drop-zone.component.html\",\r\n styleUrls: [\"./drop-zone.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DropZoneComponent implements OnInit, OnDestroy {\r\n @Input() dropZone: DropZone | undefined;\r\n private commSubscription: Subscription | undefined;\r\n public visible: boolean;\r\n public active: boolean;\r\n\r\n constructor(\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly changeDetectorRef: ChangeDetectorRef\r\n ) {\r\n this.visible = false;\r\n this.active = false;\r\n }\r\n\r\n public dragenterHandler() {\r\n if (this.dropZone === undefined || this.active === true) {\r\n return;\r\n }\r\n this.dropZoneService.swapActiveDropZone(this.dropZone);\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.dropZone === undefined) {\r\n throw new Error(\"No drop zone object at component initialization\");\r\n }\r\n this.commSubscription = this.dropZone\r\n .getCommChannel()\r\n .subscribe((message) => {\r\n switch (message) {\r\n case \"checkVisible\": {\r\n this.visible = this.dropZone?.isVisible() ?? false;\r\n break;\r\n }\r\n case \"checkActive\": {\r\n this.active = this.dropZone?.isActive() ?? false;\r\n break;\r\n }\r\n case \"checkRendered\": {\r\n //Do nothing. This message is for other subscribers\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"unhandled comm message\");\r\n }\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n public ngOnDestroy() {\r\n if (this.commSubscription !== undefined) {\r\n this.commSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<div [style.marginLeft.px]=\"indent\">\r\n <drop-zone\r\n *ngIf=\"renderDropZoneInside\"\r\n [dropZone]=\"dropZoneInside\"\r\n ></drop-zone>\r\n <span [hidden]=\"branch && branch.data.collapsed\" class=\"limble-child-nodes\">\r\n <ng-template #children></ng-template>\r\n </span>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n ViewContainerRef\r\n} from \"@angular/core\";\r\nimport { TreeService } from \"../limble-tree-root/tree.service\";\r\nimport type { Branch } from \"../classes/Branch\";\r\nimport { DropZone } from \"../classes/DropZone\";\r\nimport { filter } from \"rxjs/operators\";\r\nimport { isNestingAllowed } from \"../util\";\r\nimport { DropZoneService } from \"../limble-tree-root/drop-zone.service\";\r\nimport { TreeConstructionStatus } from \"../limble-tree-root/tree-construction-status.service\";\r\n\r\n@Component({\r\n selector: \"limble-tree-branch\",\r\n templateUrl: \"./limble-tree-branch.component.html\",\r\n styleUrls: [\"./limble-tree-branch.component.scss\"]\r\n})\r\nexport class LimbleTreeBranchComponent\r\n implements AfterViewInit, OnInit, OnDestroy {\r\n @Input() branch: Branch<any> | undefined;\r\n\r\n @ViewChild(\"children\", { read: ViewContainerRef }) children:\r\n | ViewContainerRef\r\n | undefined;\r\n\r\n public dropZoneInside: DropZone | undefined;\r\n public renderDropZoneInside: boolean;\r\n\r\n public readonly indent;\r\n\r\n constructor(\r\n private treeService: TreeService,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly treeConstructionStatus: TreeConstructionStatus,\r\n private readonly ngZone: NgZone\r\n ) {\r\n this.treeConstructionStatus.constructing();\r\n this.indent = this.treeService.treeOptions?.indent;\r\n this.renderDropZoneInside = false;\r\n }\r\n\r\n public ngOnInit() {\r\n this.addDropZoneInside();\r\n this.ngZone.runOutsideAngular(() => {\r\n if (this.dropZoneInside === undefined) {\r\n throw new Error(\"drop zone inside is not defined\");\r\n }\r\n this.dropZoneInside\r\n .getCommChannel()\r\n .pipe(filter((message) => message === \"checkRendered\"))\r\n .subscribe(() => {\r\n if (\r\n this.dropZoneInside === undefined ||\r\n this.branch === undefined\r\n ) {\r\n throw new Error(\"Zones not registered\");\r\n }\r\n if (\r\n isNestingAllowed(\r\n this.treeService.treeOptions,\r\n this.branch.data\r\n )\r\n ) {\r\n this.renderDropZoneInside = this.dropZoneInside.isRendered();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public ngAfterViewInit() {\r\n this.reRender();\r\n this.setDropZoneHost();\r\n this.treeConstructionStatus.doneConstructing();\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n public ngOnDestroy() {\r\n if (this.dropZoneInside !== undefined) {\r\n this.dropZoneService.removeDropZone(this.dropZoneInside);\r\n }\r\n this.treeService.cleanupSignal$.next(true);\r\n }\r\n\r\n private addDropZoneInside() {\r\n if (this.branch === undefined) {\r\n throw new Error(\"failed to register drop zone inside\");\r\n }\r\n this.dropZoneInside = new DropZone([...this.branch.getCoordinates()], 0);\r\n this.dropZoneService.addDropZone(this.dropZoneInside);\r\n }\r\n\r\n public reRender() {\r\n if (this.children === undefined || this.branch === undefined) {\r\n throw new Error(\"Failed to render limble tree branch\");\r\n }\r\n this.treeService.renderBranch(this.children, this.branch);\r\n }\r\n\r\n private setDropZoneHost() {\r\n if (this.children === undefined || this.dropZoneInside === undefined) {\r\n throw new Error(\"Failed to add drop zone host\");\r\n }\r\n this.dropZoneInside.setHost(this.children);\r\n }\r\n}\r\n","import {\r\n ComponentFactoryResolver,\r\n Injectable,\r\n Type,\r\n ViewContainerRef\r\n} from \"@angular/core\";\r\n\r\n@Injectable()\r\nexport class ComponentCreatorService {\r\n constructor(private readonly factoryResolver: ComponentFactoryResolver) {\r\n this.factoryResolver = factoryResolver;\r\n }\r\n\r\n appendComponent<T = unknown>(\r\n component: Type<T>,\r\n viewContainerRef: ViewContainerRef,\r\n index: number | undefined = undefined\r\n ) {\r\n const componentFactory = this.factoryResolver.resolveComponentFactory(\r\n component\r\n );\r\n const componentRef = viewContainerRef.createComponent<T>(\r\n componentFactory,\r\n index\r\n );\r\n return componentRef;\r\n }\r\n}\r\n","import { Injectable, NgZone } from \"@angular/core\";\r\nimport { fromEvent, Observable, Subscription } from \"rxjs\";\r\nimport { filter, throttleTime } from \"rxjs/operators\";\r\n\r\nfunction getScrollParent(element: HTMLElement): HTMLElement {\r\n const regex = /(auto|scroll)/;\r\n const parents = (\r\n _node: HTMLElement | null,\r\n parentList: Array<HTMLElement>\r\n ): Array<HTMLElement> => {\r\n if (_node === null || _node.parentNode === null) {\r\n return parentList;\r\n }\r\n return parents(_node.parentElement, parentList.concat([_node]));\r\n };\r\n\r\n const style = (_node: HTMLElement, prop: string) =>\r\n getComputedStyle(_node, null).getPropertyValue(prop);\r\n const overflow = (_node: HTMLElement) =>\r\n style(_node, \"overflow\") +\r\n style(_node, \"overflow-y\") +\r\n style(_node, \"overflow-x\");\r\n const scroll = (_node: HTMLElement) => regex.test(overflow(_node));\r\n\r\n const parentList = parents(element.parentElement, []);\r\n for (const parent of parentList) {\r\n if (scroll(parent)) {\r\n return parent;\r\n }\r\n }\r\n return (\r\n (document.scrollingElement as HTMLElement) ?? document.documentElement\r\n );\r\n}\r\n\r\n@Injectable()\r\nexport class GlobalEventsService {\r\n private globalDrag$: Observable<DragEvent> | undefined;\r\n private globalDragSubscription: Subscription | undefined;\r\n public scrolling: boolean;\r\n\r\n constructor(private readonly ngZone: NgZone) {\r\n this.ngZone.runOutsideAngular(() => {\r\n this.globalDrag$ = fromEvent<DragEvent>(document, \"drag\");\r\n });\r\n this.scrolling = false;\r\n }\r\n\r\n public addScrolling() {\r\n this.ngZone.runOutsideAngular(() => {\r\n if (this.globalDragSubscription !== undefined) {\r\n return;\r\n }\r\n if (this.globalDrag$ === undefined) {\r\n throw new Error(\"Could not get observable\");\r\n }\r\n let viewPortHeight: number;\r\n let scrollAreaSize: number;\r\n let edgeTop: number;\r\n let edgeBottom: number;\r\n let isInTopScrollArea: boolean;\r\n let isInBottomScrollArea: boolean;\r\n let timer: ReturnType<typeof setTimeout>;\r\n let scrollableDiv: HTMLElement | null;\r\n let relativeY: number;\r\n this.globalDragSubscription = this.globalDrag$\r\n .pipe(\r\n throttleTime(25),\r\n filter((event) => {\r\n if (!event.target) {\r\n return false;\r\n }\r\n scrollableDiv = getScrollParent(event.target as HTMLElement);\r\n viewPortHeight = scrollableDiv.clientHeight;\r\n const viewPortWidth = scrollableDiv.clientWidth;\r\n let relativeX: number;\r\n if (\r\n window\r\n .getComputedStyle(scrollableDiv)\r\n .getPropertyValue(\"position\")\r\n .toLowerCase() === \"fixed\"\r\n ) {\r\n relativeX = event.clientX;\r\n relativeY = event.clientY;\r\n } else {\r\n const boundingRect = scrollableDiv.getBoundingClientRect();\r\n const scrollableDivAncestor = getScrollParent(\r\n scrollableDiv\r\n );\r\n relativeX =\r\n event.clientX -\r\n (boundingRect.left + scrollableDivAncestor.scrollLeft);\r\n relativeY =\r\n event.clientY -\r\n (boundingRect.top + scrollableDivAncestor.scrollTop);\r\n }\r\n if (\r\n relativeX < 0 ||\r\n relativeX > viewPortWidth ||\r\n relativeY < 0 ||\r\n relativeY > viewPortHeight\r\n ) {\r\n //Outside of scrollable div\r\n return false;\r\n }\r\n scrollAreaSize = Math.max(viewPortHeight * 0.1, 100);\r\n edgeTop = scrollAreaSize;\r\n edgeBottom = viewPortHeight - scrollAreaSize;\r\n isInTopScrollArea = relativeY < edgeTop;\r\n isInBottomScrollArea = relativeY > edgeBottom;\r\n return isInTopScrollArea || isInBottomScrollArea;\r\n })\r\n )\r\n .subscribe(() => {\r\n if (scrollableDiv === null) {\r\n return;\r\n }\r\n const height = scrollableDiv.scrollHeight;\r\n const maxScrollY = height - viewPortHeight;\r\n const currentScrollY = scrollableDiv.scrollTop;\r\n const canScrollUp = currentScrollY > 0;\r\n const canScrollDown = currentScrollY < maxScrollY;\r\n let nextScrollY: number;\r\n const maxStep = 75;\r\n if (isInTopScrollArea && canScrollUp) {\r\n const intensity = (edgeTop - relativeY) / scrollAreaSize;\r\n nextScrollY = currentScrollY - maxStep * intensity;\r\n } else if (isInBottomScrollArea && canScrollDown) {\r\n const intensity = (relativeY - edgeBottom) / scrollAreaSize;\r\n nextScrollY = currentScrollY + maxStep * intensity;\r\n } else {\r\n return;\r\n }\r\n nextScrollY = Math.max(0, Math.min(maxScrollY, nextScrollY));\r\n if (nextScrollY !== currentScrollY) {\r\n scrollableDiv.scrollTo({ top: nextScrollY });\r\n this.scrolling = true;\r\n clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n this.scrolling = false;\r\n }, 100);\r\n }\r\n });\r\n });\r\n }\r\n\r\n public removeScrolling() {\r\n if (this.globalDragSubscription !== undefined) {\r\n this.globalDragSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<drop-zone\r\n *ngIf=\"renderDropZoneAbove === true\"\r\n [dropZone]=\"dropZoneAbove\"\r\n></drop-zone>\r\n<div\r\n (dragstart)=\"dragstartHandler($event)\"\r\n (dragend)=\"dragendHandler($event)\"\r\n class=\"limble-parent-container\"\r\n #draggableDiv\r\n>\r\n <div\r\n class=\"node-host-container\"\r\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\r\n [dragoverEventThrottle]=\"10\"\r\n #nodeHostContainer\r\n >\r\n <ng-template #nodeHost></ng-template>\r\n </div>\r\n <limble-tree-branch\r\n *ngIf=\"branch !== undefined && renderInnerBranch === true\"\r\n [branch]=\"branch\"\r\n #innerBranch\r\n ></limble-tree-branch>\r\n</div>\r\n<drop-zone\r\n *ngIf=\"renderDropZoneBelow === true\"\r\n [dropZone]=\"dropZoneBelow\"\r\n></drop-zone>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n ViewContainerRef\r\n} from \"@angular/core\";\r\nimport { ComponentCreatorService } from \"../singletons/component-creator.service\";\r\nimport { DropZoneService } from \"../limble-tree-root/drop-zone.service\";\r\nimport { DragStateService } from \"../singletons/drag-state.service\";\r\nimport { LimbleTreeNode, TreeService } from \"../limble-tree-root/tree.service\";\r\nimport { Branch, BranchCoordinates } from \"../classes/Branch\";\r\nimport {\r\n arraysAreEqual,\r\n isDraggingAllowed,\r\n isNestingAllowed,\r\n suddenTreeExit\r\n} from \"../util\";\r\nimport { filter, first, skip, skipUntil } from \"rxjs/operators\";\r\nimport { GlobalEventsService } from \"../singletons/global-events.service\";\r\nimport { DropZone } from \"../classes/DropZone\";\r\nimport { fromEvent, merge, Subscription } from \"rxjs\";\r\nimport { LimbleTreeBranchComponent } from \"../limble-tree-branch/limble-tree-branch.component\";\r\nimport { TreeConstructionStatus } from \"../limble-tree-root/tree-construction-status.service\";\r\n\r\n@Component({\r\n selector: \"limble-tree-node\",\r\n templateUrl: \"./limble-tree-node.component.html\",\r\n styleUrls: [\"./limble-tree-node.component.scss\"]\r\n})\r\nexport class LimbleTreeNodeComponent\r\n implements OnInit, AfterViewInit, OnDestroy\r\n{\r\n @Input() branch: Branch<any> | undefined;\r\n @ViewChild(\"nodeHost\", { read: ViewContainerRef }) private nodeHost:\r\n | ViewContainerRef\r\n | undefined;\r\n public dropZoneAbove: DropZone | undefined;\r\n public renderDropZoneAbove: boolean;\r\n public dropZoneBelow: DropZone | undefined;\r\n public renderDropZoneBelow: boolean;\r\n public renderInnerBranch: Boolean;\r\n @ViewChild(\"draggableDiv\", { read: ElementRef }) private draggableDiv:\r\n | ElementRef<HTMLElement>\r\n | undefined;\r\n @ViewChild(\"nodeHostContainer\", { read: ElementRef })\r\n private nodeHostContainer: ElementRef<HTMLElement> | undefined;\r\n private currentBranchCoordinates: BranchCoordinates | undefined;\r\n private readonly treeChangeSubscription: Subscription;\r\n @Input() parentHost: ViewContainerRef | undefined;\r\n @ViewChild(\"innerBranch\", { read: LimbleTreeBranchComponent })\r\n private innerBranch: LimbleTreeBranchComponent | undefined;\r\n\r\n constructor(\r\n private readonly componentCreatorService: ComponentCreatorService,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly dragStateService: DragStateService,\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly treeService: TreeService,\r\n private readonly globalEventsService: GlobalEventsService,\r\n private readonly ngZone: NgZone,\r\n private readonly treeConstructionStatus: TreeConstructionStatus\r\n ) {\r\n this.treeConstructionStatus.constructing();\r\n if (\r\n this.treeService.treeOptions !== undefined &&\r\n this.treeService.treeOptions.listMode !== true\r\n ) {\r\n this.renderInnerBranch = true;\r\n } else {\r\n this.renderInnerBranch = false;\r\n }\r\n this.renderDropZoneBelow = false;\r\n this.renderDropZoneAbove = false;\r\n this.treeChangeSubscription = this.treeService.changes$\r\n .pipe(\r\n //The first one is the initial tree render, which we can ignore\r\n skip(1)\r\n )\r\n .subscribe(() => {\r\n this.treeChangeHandler();\r\n });\r\n }\r\n\r\n private treeChangeHandler() {\r\n if (\r\n this.branch !== undefined &&\r\n this.currentBranchCoordinates !== undefined &&\r\n !arraysAreEqual(\r\n this.branch.getCoordinates(),\r\n this.currentBranchCoordinates\r\n )\r\n ) {\r\n this.updateDropZones();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n if (this.treeService.treeOptions?.allowDragging === false) {\r\n return;\r\n }\r\n const parent = this.branch?.getParent();\r\n if (parent?.data !== null) {\r\n const parentData = parent?.data as LimbleTreeNode;\r\n if (!isNestingAllowed(this.treeService.treeOptions, parentData)) {\r\n this.renderInnerBranch = false;\r\n return;\r\n }\r\n }\r\n this.registerDropZones();\r\n this.currentBranchCoordinates = this.branch?.getCoordinates();\r\n this.ngZone.runOutsideAngular(() => {\r\n if (\r\n this.dropZoneAbove === undefined ||\r\n this.dropZoneBelow === undefined\r\n ) {\r\n throw new Error(\"Zones not registered\");\r\n }\r\n merge(\r\n this.dropZoneAbove.getCommChannel(),\r\n this.dropZoneBelow.getCommChannel()\r\n )\r\n .pipe(filter((message) => message === \"checkRendered\"))\r\n .subscribe(() => {\r\n if (\r\n this.dropZoneAbove === undefined ||\r\n this.dropZoneBelow === undefined ||\r\n this.branch === undefined\r\n ) {\r\n throw new Error(\"Zones not registered\");\r\n }\r\n this.renderDropZoneAbove = this.dropZoneAbove.isRendered();\r\n this.renderDropZoneBelow = this.dropZoneBelow.isRendered();\r\n });\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.renderNode();\r\n this.setDropZoneHosts();\r\n this.checkForHandle();\r\n this.treeConstructionStatus.doneConstructing();\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.treeChangeSubscription.unsubscribe();\r\n if (this.dropZoneAbove !== undefined) {\r\n this.dropZoneService.removeDropZone(this.dropZoneAbove);\r\n }\r\n if (this.dropZoneBelow !== undefined) {\r\n this.dropZoneService.removeDropZone(this.dropZoneBelow);\r\n }\r\n this.treeService.cleanupSignal$.next(true);\r\n }\r\n\r\n public dragstartHandler(event: DragEvent): void {\r\n event.stopPropagation();\r\n if (\r\n event.dataTransfer === null ||\r\n this.branch === undefined ||\r\n this.parentHost === undefined\r\n ) {\r\n throw new Error(\"failed to run dragstartHandler\");\r\n }\r\n const draggedElement = event.target as HTMLElement;\r\n if (draggedElement.parentElement?.tagName !== \"LIMBLE-TREE-NODE\") {\r\n //Don't drag stuff that isn't part of the tree\r\n event.preventDefault();\r\n return;\r\n }\r\n event.dataTransfer.effectAllowed = \"move\";\r\n this.dragStateService.dragging(this.branch, this.parentHost);\r\n const treeElement = draggedElement.closest(\"limble-tree-root\");\r\n if (treeElement === null) {\r\n throw new Error(\"could not get root of tree\");\r\n }\r\n this.ngZone.runOutsideAngular(() => {\r\n //We have to use a setTimeout due to a bug in chrome: https://stackoverflow.com/a/20733870/8796651\r\n setTimeout(() => {\r\n draggedElement.classList.add(\"dragging\");\r\n if (\r\n this.treeService.treeData?.length === 1 &&\r\n this.branch?.getCoordinates().length === 1\r\n ) {\r\n //We are dragging the only element in the tree, so we have to use the placeholder system\r\n this.treeService.placeholder$.next(true);\r\n }\r\n });\r\n //We use this weird subscription/timeout combo in order to avoid a strange bug where the dragleave event\r\n //does not fire if the user drags out of the tree too quickly. This issue would make the drop zone\r\n //remain in the UI, potentially causing drop zones to appear in multiple trees at a time. This subscription\r\n //waits for the dragover event on the tree to fire before rendering any drop zones. If the dragover\r\n //event does not fire within a half second, we know the mouse left the tree too quickly, and we won't\r\n //render the drop zone at all.\r\n const dragSubscription = fromEvent(treeElement, \"dragover\")\r\n .pipe(first())\r\n .subscribe((dragoverEvent) => {\r\n dragoverEvent.stopPropagation();\r\n if (this.branch === undefined) {\r\n throw new Error(\"Could not show surrounding drop zones\");\r\n }\r\n const parent = this.branch.getParent();\r\n let parentData: LimbleTreeNode;\r\n let parentNestingAllowed = true;\r\n if (parent?.data !== null) {\r\n parentData = parent?.data as LimbleTreeNode;\r\n parentNestingAllowed = isNestingAllowed(\r\n this.treeService.treeOptions,\r\n parentData\r\n );\r\n }\r\n if (this.dropZoneAbove !== undefined && parentNestingAllowed) {\r\n this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {\r\n joinFamilies: true\r\n });\r\n }\r\n });\r\n setTimeout(() => {\r\n if (!dragSubscription.closed) {\r\n dragSubscription.unsubscribe();\r\n }\r\n }, 500);\r\n });\r\n }\r\n\r\n public dragendHandler(event?: DragEvent): void {\r\n event?.stopPropagation();\r\n if (this.draggableDiv === undefined) {\r\n throw new Error(\"could not get draggable div\");\r\n }\r\n this.draggableDiv.nativeElement.classList.remove(\"dragging\");\r\n if (this.dragStateService.getState() === \"captured\") {\r\n if (this.treeService.captured === false) {\r\n //Dropped in a different tree. Remove the one in this tree\r\n if (this.branch === undefined) {\r\n throw new Error(\"could not get branch in dragendHandler\");\r\n }\r\n this.treeService.cleanupSignal$.next(true);\r\n this.treeService.captured = false;\r\n }\r\n this.dragStateService.release();\r\n } else {\r\n //Wasn't dropped into a valid tree, so reset for next drag and\r\n //don't do anything else.\r\n this.dragStateService.release();\r\n this.dropZoneService.clearVisibleZones();\r\n this.dropZoneService.restoreFamilies();\r\n if (\r\n this.treeService.treeData?.length === 1 &&\r\n this.branch?.getCoordinates().length === 1\r\n ) {\r\n //We were dragging the only element in the tree, so we have to\r\n //remove the placeholder that we added in the dragstart\r\n this.treeService.placeholder$.next(false);\r\n }\r\n }\r\n }\r\n\r\n public dragoverHandler(event: DragEvent) {\r\n if (this.globalEventsService.scrolling === true) {\r\n return;\r\n }\r\n if (this.branch === undefined) {\r\n throw new Error(\"Can't get current branch during dragover event\");\r\n }\r\n const data = this.dragStateService.getData();\r\n if (data === undefined) {\r\n //They might be dragging something that isn't a node. Just ignore it.\r\n return;\r\n }\r\n const sourceBranch = data.branch;\r\n //If trying to drop on self, return.\r\n if (\r\n sourceBranch === this.branch ||\r\n this.branch.getAncestors().includes(sourceBranch)\r\n ) {\r\n return;\r\n }\r\n const target = (event.currentTarget as HTMLElement).closest(\r\n \".node-host-container\"\r\n );\r\n if (!(target instanceof HTMLElement)) {\r\n throw new Error(\"Failed to find node host container while dragging\");\r\n }\r\n let topLine: number;\r\n let bottomLine: number;\r\n if (this.innerBranch?.renderDropZoneInside === false) {\r\n topLine = target.offsetHeight / 2 - 6;\r\n bottomLine = topLine;\r\n } else {\r\n topLine = target.offsetHeight / 3 - 3; //an imaginary line 1/3 of the way down from the top of the element;\r\n bottomLine = topLine * 2; //an imaginary line 1/3 of the way up from the bottom of the element;\r\n }\r\n const parent = this.branch.getParent();\r\n let parentData: LimbleTreeNode;\r\n let parentNestingAllowed = true;\r\n if (parent?.data !== null) {\r\n parentData = parent?.data as LimbleTreeNode;\r\n parentNestingAllowed = isNestingAllowed(\r\n this.treeService.treeOptions,\r\n parentData\r\n );\r\n }\r\n /** The y-coordinates of the mouse in relation to the node it is hovering over */\r\n const offsetY = event.clientY - target.getBoundingClientRect().top;\r\n const activeDropZone = this.dropZoneService.getActiveDropZone();\r\n if (\r\n offsetY < topLine &&\r\n this.dropZoneAbove !== undefined &&\r\n (activeDropZone === null ||\r\n !DropZone.dropZoneLocationsAreEqual(\r\n activeDropZone,\r\n this.dropZoneAbove\r\n )) &&\r\n parentNestingAllowed\r\n ) {\r\n const index = this.branch.getIndex();\r\n if (index === undefined || index === null) {\r\n throw new Error(\"can't get branch index\");\r\n }\r\n this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {\r\n activateLowestInsteadOfFounder: true\r\n });\r\n if (suddenTreeExit(event)) {\r\n this.dropZoneService.clearVisibleZones();\r\n }\r\n } else if (\r\n offsetY < bottomLine &&\r\n offsetY > topLine &&\r\n this.innerBranch?.renderDropZoneInside === true &&\r\n this.innerBranch?.dropZoneInside !== undefined &&\r\n (activeDropZone === null ||\r\n !DropZone.dropZoneLocationsAreEqual(\r\n activeDropZone,\r\n this.innerBranch.dropZoneInside\r\n ))\r\n ) {\r\n this.dropZoneService.showDropZoneFamily(\r\n this.innerBranch.dropZoneInside\r\n );\r\n if (suddenTreeExit(event)) {\r\n this.dropZoneService.clearVisibleZones();\r\n }\r\n } else if (\r\n offsetY >= bottomLine &&\r\n this.dropZoneBelow !== undefined &&\r\n (activeDropZone === null ||\r\n !DropZone.dropZoneLocationsAreEqual(\r\n activeDropZone,\r\n this.dropZoneBelow\r\n )) &&\r\n this.branch.getChildren().length === 0 &&\r\n parentNestingAllowed\r\n ) {\r\n const index = this.branch.getIndex();\r\n if (index === undefined || index === null) {\r\n throw new Error(\"can't get branch index\");\r\n }\r\n this.dropZoneService.showDropZoneFamily(this.dropZoneBelow);\r\n if (suddenTreeExit(event)) {\r\n this.dropZoneService.clearVisibleZones();\r\n }\r\n }\r\n }\r\n\r\n private renderNode() {\r\n if (this.nodeHost === undefined || this.branch === undefined) {\r\n throw new Error(\"Failed to render tree node\");\r\n }\r\n let component = this.branch.data.component;\r\n if (component === undefined) {\r\n component = this.treeService.treeOptions?.defaultComponent;\r\n }\r\n if (component === undefined) {\r\n throw new Error(\"limbleTree requires a component to render\");\r\n }\r\n const componentRef = this.componentCreatorService.appendComponent<any>(\r\n component.class,\r\n this.nodeHost\r\n );\r\n componentRef.instance.nodeData = this.branch.data;\r\n for (const binding in component.bindings) {\r\n componentRef.instance[binding] = component.bindings[binding];\r\n }\r\n }\r\n\r\n private registerDropZones(): void {\r\n this.addDropZoneAbove();\r\n this.addDropZoneBelow();\r\n }\r\n\r\n private addDropZoneAbove(): void {\r\n if (this.branch === undefined) {\r\n throw new Error(\"failed to register drop zone above\");\r\n }\r\n const parent = this.branch.getParent();\r\n const currentCoordinates = this.branch.getCoordinates();\r\n const index = currentCoordinates[currentCoordinates.length - 1];\r\n this.dropZoneAbove = new DropZone(\r\n [...(parent?.getCoordinates() ?? [])],\r\n index\r\n );\r\n this.dropZoneService.addDropZone(this.dropZoneAbove);\r\n }\r\n\r\n private addDropZoneBelow(): void {\r\n if (this.branch === undefined) {\r\n throw new Error(\"failed to register drop zone below\");\r\n }\r\n const parent = this.branch.getParent();\r\n const currentCoordinates = this.branch.getCoordinates();\r\n const index = currentCoordinates[currentCoordinates.length - 1];\r\n this.dropZoneBelow = new DropZone(\r\n [...(parent?.getCoordinates() ?? [])],\r\n index + 1\r\n );\r\n this.dropZoneService.addDropZone(this.dropZoneBelow);\r\n }\r\n\r\n private updateDropZones(): void {\r\n this.currentBranchCoordinates = this.branch?.getCoordinates();\r\n this.updateDropZoneAbove();\r\n this.updateDropZoneBelow();\r\n this.updateDropZoneInside();\r\n this.setDropZoneHosts();\r\n }\r\n\r\n private updateDropZoneAbove(): void {\r\n if (this.branch === undefined || this.dropZoneAbove === undefined) {\r\n throw new Error(\"failed to update drop zone above\");\r\n }\r\n const parent = this.branch.getParent();\r\n const currentCoordinates = this.branch.getCoordinates();\r\n const index = currentCoordinates[currentCoordinates.length - 1];\r\n const location = this.dropZoneAbove.getLocation();\r\n location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);\r\n location.setInsertIndex(index);\r\n }\r\n\r\n private updateDropZoneBelow(): void {\r\n if (this.branch === undefined || this.dropZoneBelow === undefined) {\r\n throw new Error(\"failed to update drop zone below\");\r\n }\r\n const parent = this.branch.getParent();\r\n const currentCoordinates = this.branch.getCoordinates();\r\n const index = currentCoordinates[currentCoordinates.length - 1];\r\n const location = this.dropZoneBelow.getLocation();\r\n location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);\r\n location.setInsertIndex(index + 1);\r\n }\r\n\r\n private updateDropZoneInside(): void {\r\n if (this.innerBranch?.dropZoneInside === undefined) {\r\n return;\r\n }\r\n if (this.branch === undefined) {\r\n throw new Error(\"failed to update drop zone inside\");\r\n }\r\n const location = this.innerBranch.dropZoneInside.getLocation();\r\n location.setParentCoordinates([...this.branch.getCoordinates()]);\r\n }\r\n\r\n private setDropZoneHosts() {\r\n if (\r\n this.dropZoneAbove === undefined ||\r\n this.dropZoneBelow === undefined\r\n ) {\r\n return;\r\n }\r\n this.dropZoneAbove.setHost(this.parentHost);\r\n this.dropZoneBelow.setHost(this.parentHost);\r\n }\r\n\r\n private checkForHandle(): void {\r\n if (\r\n this.nodeHostContainer === undefined ||\r\n this.draggableDiv === undefined\r\n ) {\r\n return;\r\n }\r\n const nodeHostContainerElement = this.nodeHostContainer.nativeElement;\r\n const handle = nodeHostContainerElement.querySelector(\r\n \".limble-tree-handle\"\r\n );\r\n const draggableDivElement = this.draggableDiv.nativeElement;\r\n if (!isDraggingAllowed(this.treeService.treeOptions, this.branch?.data)) {\r\n draggableDivElement.setAttribute(\"draggable\", \"false\");\r\n } else if (handle === null) {\r\n draggableDivElement.setAttribute(\"draggable\", \"true\");\r\n } else {\r\n handle.addEventListener(\"mousedown\", () => {\r\n draggableDivElement.setAttribute(\"draggable\", \"true\");\r\n //For some reason mouseup doesn't fire after a drag, so we use this observable sequence instead.\r\n const dragging = this.dragStateService.state$.pipe(\r\n filter((state) => state === \"dragging\"),\r\n first()\r\n );\r\n this.dragStateService.state$\r\n .pipe(\r\n skipUntil(dragging),\r\n filter((state) => state === \"idle\"),\r\n first()\r\n )\r\n .subscribe(() => {\r\n draggableDivElement.setAttribute(\"draggable\", \"false\");\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","import { Injectable, Type, ViewContainerRef } from \"@angular/core\";\r\nimport { ComponentCreatorService } from \"../singletons/component-creator.service\";\r\nimport { DropZoneService } from \"./drop-zone.service\";\r\nimport { Branch, BranchCoordinates } from \"../classes/Branch\";\r\nimport { LimbleTreeNodeComponent } from \"../limble-tree-node/limble-tree-node.component\";\r\nimport { DragStateService } from \"../singletons/drag-state.service\";\r\nimport { BehaviorSubject, EMPTY, Subject } from \"rxjs\";\r\nimport { arraysAreEqual } from \"../util\";\r\nimport { debounce, debounceTime, filter, tap } from \"rxjs/operators\";\r\nimport { TreeConstructionStatus } from \"./tree-construction-status.service\";\r\n\r\n/** An object describing a node of the tree */\r\nexport interface LimbleTreeNode {\r\n /** A list of nodes to be rendered \"under\" this one, one level deeper in the tree. */\r\n nodes?: LimbleTreeData;\r\n // /** A custom data object that will be passed into the component as an `Input()` binding called `nodeData` */\r\n // data: unknown;\r\n /** An object that describes the component which will represent this node in the visual tree */\r\n component?: ComponentObj;\r\n collapsed?: boolean;\r\n [index: string]: unknown;\r\n}\r\n\r\n/** An object that the limble-tree-root component uses to build the tree */\r\nexport type LimbleTreeData = Array<LimbleTreeNode>;\r\n\r\n/** A group of settings for changing the functionality of the tree */\r\nexport interface LimbleTreeOptions {\r\n /** The component object to use if one is not specified for a particular node */\r\n defaultComponent?: ComponentObj;\r\n /** The number of pixels to indent each level of the tree. Defaults to 45 */\r\n indent?: number;\r\n /**\r\n * Whether to allow \"nesting\" (placing a node one level deeper than currently exists on the branch).\r\n * When this is a boolean, it applies to all nodes. When this is a function, the node in question\r\n * is passed in. Defaults to true.\r\n */\r\n allowNesting?: boolean | ((nodeData: LimbleTreeNode) => boolean);\r\n /**\r\n * Whether to allow a node to be dragged. When this is a boolean, it applies to all nodes. When this\r\n * is a function, the node in question is passed in. Defaults to true.\r\n */\r\n allowDragging?: boolean | ((nodeData: LimbleTreeNode) => boolean);\r\n /** A callback to determine whether a sourceNode can be dropped at a particular location. */\r\n allowDrop?: (\r\n sourceNode: LimbleTreeNode,\r\n proposedParent: LimbleTreeNode | null,\r\n proposedIndex: number\r\n ) => boolean;\r\n /** When set to true, list mode will enforce a flat tree structure, meaning there\r\n * can only be one level of the tree. `allowNesting` is automatically set to `false`\r\n * and any children will be deleted.\r\n *\r\n * This mode can be used when the same dynamic drag and drop functionality of\r\n * the tree is desired, but the tree structure itself is not necessary. This\r\n * also opens up the pagination API on the limble-tree-root component. See the\r\n * README for details on pagination.\r\n */\r\n listMode?: boolean;\r\n}\r\n\r\n/** An object that references the component to be rendered and its bindings */\r\nexport interface ComponentObj {\r\n /** The component class */\r\n class: Type<unknown>;\r\n /** The bindings (inputs and outputs) of the class */\r\n bindings?: {\r\n [index: string]: unknown;\r\n };\r\n}\r\n\r\n/** The default value for the `indent` option */\r\nexport const INDENT = 45;\r\n\r\n/** An options object with default values loaded where applicable */\r\nexport interface ProcessedOptionsBase extends LimbleTreeOptions {\r\n defaultComponent?: ComponentObj;\r\n indent: number;\r\n allowNesting: boolean | ((nodeData: LimbleTreeNode) => boolean);\r\n allowDragging: boolean | ((nodeData: LimbleTreeNode) => boolean);\r\n allowDrop: (\r\n sourceNode: LimbleTreeNode,\r\n proposedParent: LimbleTreeNode | null,\r\n proposedIndex: number\r\n ) => boolean;\r\n listMode: boolean;\r\n itemsPerPage: number | undefined;\r\n page: number | undefined;\r\n}\r\n\r\nexport interface ProcessedOptionsWithPagination extends ProcessedOptionsBase {\r\n listMode: true;\r\n itemsPerPage: number;\r\n page: number;\r\n}\r\n\r\nexport interface ProcessedOptionsWithoutPagination\r\n extends ProcessedOptionsBase {\r\n listMode: false;\r\n itemsPerPage: undefined;\r\n page: undefined;\r\n}\r\n\r\nexport type ProcessedOptions =\r\n | ProcessedOptionsWithPagination\r\n | ProcessedOptionsWithoutPagination;\r\n\r\n/** the value emitted from the root component after a node is dropped */\r\nexport interface TreeDrop {\r\n /** The node that was dropped */\r\n target: LimbleTreeNode;\r\n /** the target's parent before the drag and drop, or null if it was a top-level node */\r\n oldParent: LimbleTreeNode | null;\r\n /** the index of the node before the drag and drop relative to its old siblings */\r\n oldIndex: number;\r\n /** the target's parent after the drag and drop, or null if it is now a top-level node */\r\n newParent: LimbleTreeNode | null;\r\n /** the index of the node after the drag and drop relative to its new siblings */\r\n newIndex: number;\r\n}\r\n\r\n@Injectable()\r\nexport class TreeService {\r\n public readonly changes$: Subject<null>;\r\n public readonly drops$: Subject<TreeDrop>;\r\n public host: ViewContainerRef | undefined;\r\n public treeData: LimbleTreeData | undefined;\r\n /** This should never be reassigned. It is assigned in init() and no where else. We need to keep the reference from breaking. */\r\n private originalData: LimbleTreeData | undefined;\r\n public treeOptions: ProcessedOptions | undefined;\r\n public treeModel: Branch<any>;\r\n private placeholder: boolean;\r\n public captured: boolean;\r\n public readonly cleanupSignal$: Subject<boolean>;\r\n public placeholder$: BehaviorSubject<boolean>;\r\n\r\n constructor(\r\n private readonly componentCreatorService: ComponentCreatorService,\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly dragStateService: DragStateService,\r\n private readonly treeConstructionStatus: TreeConstructionStatus\r\n ) {\r\n this.changes$ = new Subject();\r\n this.drops$ = new Subject();\r\n this.treeModel = new Branch(null);\r\n this.placeholder = false;\r\n this.captured = false;\r\n this.cleanupSignal$ = new Subject();\r\n let rebuild = false;\r\n let treeIsStable = false;\r\n const treeIsStable$ = this.treeConstructionStatus.stable$.pipe(\r\n tap((value) => {\r\n treeIsStable = value;\r\n }),\r\n filter((value) => value === true)\r\n );\r\n this.cleanupSignal$\r\n .pipe(\r\n tap((value) => {\r\n rebuild = value;\r\n }),\r\n debounce(() => {\r\n if (treeIsStable === true) {\r\n //If tree is stable, continue right away\r\n return EMPTY;\r\n }\r\n //If tree is not stable, wait for it to become so.\r\n return treeIsStable$;\r\n }),\r\n //We use this timed debounce to throttle chained destruction of components\r\n debounceTime(5)\r\n )\r\n .subscribe(() => {\r\n this.cleanup(rebuild);\r\n rebuild = false;\r\n });\r\n this.placeholder$ = new BehaviorSubject<boolean>(false);\r\n this.placeholder$.subscribe((value) => {\r\n this.placeholder = value;\r\n });\r\n }\r\n\r\n public drop(source: Branch<any>, targetCoordinates: BranchCoordinates) {\r\n //prep\r\n const sourceParent = source.getParent();\r\n if (sourceParent === null) {\r\n throw new Error(\"can't drop root of tree\");\r\n }\r\n const sourceIndex = source.getIndex();\r\n if (sourceIndex === undefined || sourceIndex === null) {\r\n throw new Error(\"Cannot move the hidden root node\");\r\n }\r\n let targetParentCoordinates: BranchCoordinates;\r\n let newIndex: number | undefined;\r\n if (this.placeholder === true) {\r\n targetParentCoordinates = [];\r\n newIndex = 0;\r\n } else {\r\n targetParentCoordinates = [...targetCoordinates];\r\n newIndex = targetParentCoordinates.pop();\r\n }\r\n if (newIndex === undefined) {\r\n throw new Error(\"target coordinates are empty\");\r\n }\r\n const targetParent = this.treeModel.getDescendant(\r\n targetParentCoordinates\r\n );\r\n if (targetParent === undefined) {\r\n throw new Error(\"could not get to target\");\r\n }\r\n const target = this.dropZoneService.getDropZone(targetCoordinates);\r\n const targetIndex = target?.getLocation().insertIndex;\r\n const targetHost = target?.getHost();\r\n const sourceHost = this.dragStateService.getData()?.parentContainer;\r\n if (this.placeholder === true) {\r\n this.placeholder$.next(false);\r\n }\r\n //Change the treeModel\r\n targetParent.insertChild(source, newIndex);\r\n //Prepare to update the view\r\n if (\r\n targetHost === undefined ||\r\n sourceHost === undefined ||\r\n targetIndex === undefined\r\n ) {\r\n //Hitting this means there is a bug, but not a fatal one.\r\n //Just render the whole tree again.\r\n console.warn(\r\n \"Could not perform a precise update. Re-rendering the entire tree instead\"\r\n );\r\n this.render();\r\n this.changes$.next(null);\r\n return;\r\n }\r\n //Update the view\r\n const nodesInSource = sourceHost.length;\r\n const componentRef = this.componentCreatorService.appendComponent(\r\n LimbleTreeNodeComponent,\r\n targetHost,\r\n newIndex\r\n );\r\n componentRef.instance.branch = source;\r\n componentRef.instance.parentHost = targetHost;\r\n if (\r\n targetIndex < sourceIndex &&\r\n sourceHost.length > nodesInSource &&\r\n arraysAreEqual(sourceParent.getCoordinates(), targetParentCoordinates)\r\n ) {\r\n sourceHost.remove(sourceIndex + 1);\r\n } else {\r\n sourceHost.remove(sourceIndex);\r\n }\r\n //Update the tree data\r\n this.rebuildTreeData();\r\n //Publish drop data\r\n this.drops$.next({\r\n target: source.data,\r\n oldParent: sourceParent.data as LimbleTreeNode,\r\n oldIndex: sourceIndex,\r\n newParent: targetParent.data,\r\n newIndex: newIndex\r\n });\r\n this.cleanupSignal$.next(false);\r\n }\r\n\r\n /** Initializes the service and renders the tree.\r\n * @param host - The ViewContainerRef into which the tree will be rendered.\r\n * @param data - The data array that was passed in to LimbleTreeRoot, which is\r\n * the users' representation of the tree\r\n * @param options - The options object that was passed in to LimbleTreeRoot\r\n */\r\n public init(\r\n host: ViewContainerRef,\r\n data: LimbleTreeData,\r\n options?: LimbleTreeOptions,\r\n itemsPerPage?: number,\r\n page?: number\r\n ): void {\r\n this.host = host;\r\n this.originalData = data;\r\n this.treeOptions = this.processOptions(options, itemsPerPage, page);\r\n if (this.treeOptions.listMode === true) {\r\n let start =\r\n this.treeOptions.itemsPerPage * (this.treeOptions.page - 1);\r\n if (isNaN(start)) {\r\n //This catches the case where itemsPerPage was not passed by the user,\r\n //causing `start` to equal infinity*0, which is NaN.\r\n start = 0;\r\n }\r\n const end = start + this.treeOptions.itemsPerPage;\r\n this.treeData = this.originalData.slice(start, end);\r\n } else {\r\n this.treeData = [...this.originalData];\r\n }\r\n this.render();\r\n }\r\n\r\n private cleanup(rebuild = false): void {\r\n if (rebuild) {\r\n this.rebuildTreeData();\r\n }\r\n if (this.treeData?.length === 0) {\r\n //We do a full render here because it isn't actually any slower\r\n //when there are no nodes, and it is a little more straightforward\r\n this.render();\r\n } else {\r\n this.changes$.next(null);\r\n this.dropZoneService.update();\r\n }\r\n }\r\n\r\n /** Renders the entire tree from root to leaves */\r\n private render() {\r\n if (\r\n this.host === undefined ||\r\n this.treeData === undefined ||\r\n this.treeOptions === undefined\r\n ) {\r\n throw new Error(\"TreeModel not initialized\");\r\n }\r\n this.treeConstructionStatus.ready(false);\r\n this.host.clear();\r\n this.dropZoneService.restart();\r\n this.placeholder$.next(false);\r\n this.treeModel = new Branch(null);\r\n if (this.treeData.length === 0) {\r\n //Tree is empty, but we have to to have something there so other trees' items can be dropped into it\r\n this.placeholder$.next(true);\r\n } else {\r\n for (const node of this.treeData) {\r\n const branch = new Branch(node);\r\n this.treeModel.appendChild(branch);\r\n }\r\n for (const branch of this.treeModel.getChildren()) {\r\n const componentRef = this.componentCreatorService.appendComponent<LimbleTreeNodeComponent>(\r\n LimbleTreeNodeComponent,\r\n this.host\r\n );\r\n componentRef.instance.branch = branch;\r\n componentRef.instance.parentHost = this.host;\r\n //The LimbleTreeNodeComponent will (indirectly) call the `renderBranch` method of this service to render\r\n //its own children\r\n }\r\n }\r\n this.treeConstructionStatus.ready(true);\r\n this.changes$.next(null);\r\n this.dropZoneService.init(this.treeModel, this.treeOptions);\r\n }\r\n\r\n /** Renders a branch of the tree and all of its descendants */\r\n public renderBranch(host: ViewContainerRef, branch: Branch<any>) {\r\n if (this.treeModel === undefined) {\r\n throw new Error(\"TreeModel not initialized\");\r\n }\r\n host.clear();\r\n branch.clearChildren();\r\n for (const node of branch.data?.nodes ?? []) {\r\n const newBranch = new Branch(node);\r\n branch.appendChild(newBranch);\r\n const componentRef = this.componentCreatorService.appendComponent<LimbleTreeNodeComponent>(\r\n LimbleTreeNodeComponent,\r\n host\r\n );\r\n componentRef.instance.branch = newBranch;\r\n componentRef.instance.parentHost = host;\r\n //The LimbleTreeNodeComponent will (indirectly) call the `renderBranch` method of this service to render\r\n //its own children\r\n }\r\n }\r\n\r\n private processOptions(\r\n options: LimbleTreeOptions = {},\r\n itemsPerPage: number = Infinity,\r\n page: number = 1\r\n ): ProcessedOptions {\r\n if (\r\n options.listMode === true &&\r\n options.allowNesting !== undefined &&\r\n options.allowNesting !== false\r\n ) {\r\n console.warn(\r\n \"The value of `allowNesting` will be ignored; it must be false when `listMode` is true\"\r\n );\r\n }\r\n const result: ProcessedOptionsBase = {\r\n defaultComponent: options.defaultComponent,\r\n indent: options.indent ?? INDENT,\r\n allowNesting:\r\n options.listMode !== true && (options.allowNesting ?? true),\r\n allowDragging: options.allowDragging ?? true,\r\n allowDrop: options.allowDrop ?? (() => true),\r\n listMode: options.listMode ?? false,\r\n itemsPerPage: options.listMode ? itemsPerPage : undefined,\r\n page: options.listMode ? page : undefined\r\n };\r\n return result as ProcessedOptions;\r\n }\r\n\r\n private rebuildTreeData(): void {\r\n if (\r\n this.originalData === undefined ||\r\n this.treeData === undefined ||\r\n this.treeOptions === undefined ||\r\n this.host === undefined\r\n ) {\r\n throw new Error(\"Tree data not initialized\");\r\n }\r\n this.treeData = [];\r\n for (const branch of this.treeModel.getChildren()) {\r\n this.treeData.push(this.rebuildBranch(branch));\r\n }\r\n if (\r\n this.treeOptions.listMode === true &&\r\n this.treeOptions.itemsPerPage < Infinity\r\n ) {\r\n const itemsPerPage = this.treeOptions.itemsPerPage;\r\n const start = itemsPerPage * (this.treeOptions.page - 1);\r\n this.originalData.splice(start, itemsPerPage, ...this.treeData);\r\n if (this.treeData.length !== itemsPerPage) {\r\n let action = false;\r\n if (\r\n this.treeData.length < itemsPerPage &&\r\n start + itemsPerPage <= this.originalData.length\r\n ) {\r\n //The current page does not have enough nodes. Add some to the view from the next page.\r\n const count = itemsPerPage - this.treeData.length;\r\n for (\r\n let index = itemsPerPage - 1;\r\n index < itemsPerPage + count - 1;\r\n index++\r\n ) {\r\n const branch = new Branch(this.originalData[start + index]);\r\n this.treeModel.appendChild(branch);\r\n const componentRef = this.componentCreatorService.appendComponent<LimbleTreeNodeComponent>(\r\n LimbleTreeNodeComponent,\r\n this.host\r\n );\r\n componentRef.instance.branch = branch;\r\n componentRef.instance.parentHost = this.host;\r\n }\r\n action = true;\r\n } else if (this.treeData.length > itemsPerPage) {\r\n //The current page has too many nodes. Remove some of them from the view.\r\n const count = this.treeData.length - itemsPerPage;\r\n for (\r\n let index = itemsPerPage + count - 1;\r\n index >= itemsPerPage;\r\n index--\r\n ) {\r\n this.treeModel.removeChild(index);\r\n this.host.remove(index);\r\n }\r\n action = true;\r\n }\r\n if (action === true) {\r\n const end = start + itemsPerPage;\r\n this.treeData = this.originalData.slice(start, end);\r\n }\r\n }\r\n } else {\r\n this.originalData.length = 0;\r\n this.originalData.push(...this.treeData);\r\n }\r\n }\r\n\r\n private rebuildBranch(branch: Branch<any>): LimbleTreeNode {\r\n const temp: LimbleTreeNode = branch.data;\r\n temp.nodes = [];\r\n for (const child of branch.getChildren()) {\r\n temp.nodes.push(this.rebuildBranch(child));\r\n }\r\n return temp;\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n Output\r\n} from \"@angular/core\";\r\nimport { fromEvent, Subscription } from \"rxjs\";\r\nimport { throttleTime } from \"rxjs/operators\";\r\n\r\n@Directive({\r\n selector: \"[dragoverNoChangeDetect]\"\r\n})\r\nexport class DragoverNoChangeDetectDirective implements OnInit, OnDestroy {\r\n @Input() dragoverEventThrottle: number;\r\n @Output() readonly dragoverNoChangeDetect: EventEmitter<DragEvent>;\r\n private eventSubscription: Subscription | undefined;\r\n\r\n constructor(\r\n private readonly ngZone: NgZone,\r\n private readonly el: ElementRef<Element>\r\n ) {\r\n this.dragoverNoChangeDetect = new EventEmitter<DragEvent>();\r\n this.dragoverEventThrottle = 25;\r\n }\r\n\r\n ngOnInit() {\r\n this.ngZone.runOutsideAngular(() => {\r\n this.eventSubscription = fromEvent<DragEvent>(\r\n this.el.nativeElement,\r\n \"dragover\"\r\n )\r\n .pipe(throttleTime(this.dragoverEventThrottle))\r\n .subscribe(($event) => {\r\n this.dragoverNoChangeDetect.emit($event);\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.eventSubscription !== undefined) {\r\n this.eventSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n NgZone,\n OnDestroy,\n OnInit,\n Output\n} from \"@angular/core\";\nimport { fromEvent, Subscription } from \"rxjs\";\n\n@Directive({\n selector: \"[dragleaveNoChangeDetect]\"\n})\nexport class DragleaveNoChangeDetectDirective implements OnInit, OnDestroy {\n @Output() readonly dragleaveNoChangeDetect: EventEmitter<DragEvent>;\n private eventSubscription: Subscription | undefined;\n\n constructor(\n private readonly ngZone: NgZone,\n private readonly el: ElementRef<Element>\n ) {\n this.dragleaveNoChangeDetect = new EventEmitter<DragEvent>();\n }\n\n ngOnInit() {\n this.ngZone.runOutsideAngular(() => {\n this.eventSubscription = fromEvent<DragEvent>(\n this.el.nativeElement,\n \"dragleave\"\n ).subscribe(($event) => {\n this.dragleaveNoChangeDetect.emit($event);\n });\n });\n }\n\n ngOnDestroy() {\n if (this.eventSubscription !== undefined) {\n this.eventSubscription.unsubscribe();\n }\n }\n}\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n OnInit\r\n} from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { DropZone } from \"../classes/DropZone\";\r\nimport { DropZoneService } from \"../limble-tree-root/drop-zone.service\";\r\nimport { TreeConstructionStatus } from \"../limble-tree-root/tree-construction-status.service\";\r\nimport { TreeService } from \"../limble-tree-root/tree.service\";\r\n\r\n@Component({\r\n selector: \"limble-tree-placeholder\",\r\n templateUrl: \"./limble-tree-placeholder.component.html\",\r\n styleUrls: [\"./limble-tree-placeholder.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LimbleTreePlaceholderComponent\r\n implements OnInit, AfterViewInit, OnDestroy {\r\n public dropZone: DropZone | undefined;\r\n private readonly placeholderSubscription: Subscription;\r\n\r\n public constructor(\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly treeService: TreeService,\r\n private readonly treeConstructionStatus: TreeConstructionStatus\r\n ) {\r\n this.treeConstructionStatus.constructing();\r\n //This logic is very similar to what the lifecycle hooks of this component do.\r\n //We use this subscription because sometimes we can't wait for the lifecycle hooks:\r\n //Specifically, the drop zone registration and deregistration sometimes can't happen\r\n //asynchronously without causing bugs. So we handle it synchronously here as well.\r\n this.placeholderSubscription = this.treeService.placeholder$.subscribe(\r\n (value) => {\r\n if (this.dropZone === undefined) {\r\n return;\r\n }\r\n this.dropZoneService.removeDropZone(this.dropZone);\r\n if (value === true) {\r\n this.dropZoneService.addDropZone(this.dropZone);\r\n this.dropZone.setHost(this.treeService.host);\r\n }\r\n }\r\n );\r\n }\r\n\r\n public ngOnInit() {\r\n this.dropZone = new DropZone([], 0);\r\n this.dropZoneService.addDropZone(this.dropZone);\r\n }\r\n\r\n public ngAfterViewInit() {\r\n if (this.dropZone === undefined) {\r\n throw new Error(\"placeholder drop zone is not defined\");\r\n }\r\n this.dropZone.setHost(this.treeService.host);\r\n this.treeConstructionStatus.doneConstructing();\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n public dragoverHandler() {\r\n if (this.dropZone === undefined) {\r\n return;\r\n }\r\n this.dropZoneService.showDropZoneFamily(this.dropZone);\r\n }\r\n\r\n public ngOnDestroy() {\r\n this.placeholderSubscription.unsubscribe();\r\n if (this.dropZone === undefined) {\r\n throw new Error(\"could not remove placeholder drop zone\");\r\n }\r\n this.dropZoneService.removeDropZone(this.dropZone);\r\n }\r\n}\r\n","<drop-zone [dropZone]=\"dropZone\"></drop-zone>\n<div class=\"placeholder\" (dragoverNoChangeDetect)=\"dragoverHandler()\"></div>\n","<div\r\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\r\n (dragleaveNoChangeDetect)=\"dragleaveHandler($event)\"\r\n (drop)=\"dropHandler($event)\"\r\n class=\"tree-event-host\"\r\n>\r\n <limble-tree-placeholder\r\n *ngIf=\"placeholder === true\"\r\n ></limble-tree-placeholder>\r\n <ng-template #host></ng-template>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef\r\n} from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { DropZoneService } from \"./drop-zone.service\";\r\nimport {\r\n LimbleTreeData,\r\n LimbleTreeOptions,\r\n TreeDrop\r\n} from \"../limble-tree-root/tree.service\";\r\nimport { TreeService } from \"./tree.service\";\r\nimport { isElementDescendant, isFirefox } from \"../util\";\r\nimport { DragStateService } from \"../singletons/drag-state.service\";\r\nimport { GlobalEventsService } from \"../singletons/global-events.service\";\r\nimport { first } from \"rxjs/operators\";\r\nimport { TreeConstructionStatus } from \"./tree-construction-status.service\";\r\n\r\n@Component({\r\n selector: \"limble-tree-root\",\r\n templateUrl: \"./limble-tree-root.component.html\",\r\n styleUrls: [\"./limble-tree-root.component.scss\"],\r\n providers: [TreeService, DropZoneService, TreeConstructionStatus]\r\n})\r\nexport class LimbleTreeRootComponent\r\n implements AfterViewInit, OnChanges, OnDestroy\r\n{\r\n @Input() data: LimbleTreeData | undefined;\r\n @Input() options: LimbleTreeOptions | undefined;\r\n @Input() itemsPerPage: number | undefined;\r\n @Input() page: number | undefined;\r\n\r\n @ViewChild(\"host\", { read: ViewContainerRef }) private host:\r\n | ViewContainerRef\r\n | undefined;\r\n\r\n @Output() readonly treeChange = new EventEmitter<null>();\r\n\r\n @Output() readonly treeDrop = new EventEmitter<TreeDrop>();\r\n\r\n private readonly changesSubscription: Subscription;\r\n private readonly dropSubscription: Subscription;\r\n public placeholder: boolean;\r\n\r\n constructor(\r\n private readonly treeService: TreeService,\r\n private readonly dropZoneService: DropZoneService,\r\n private readonly dragStateService: DragStateService,\r\n private readonly globalEventsService: GlobalEventsService,\r\n private readonly ngZone: NgZone,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly el: ElementRef<Element>\r\n ) {\r\n this.changesSubscription = this.treeService.changes$.subscribe(() => {\r\n //\"In dev mode, Angular performs an additional check after each change\r\n //detection run, to ensure the bindings haven’t changed.\" We use a timeout here\r\n //to preclude the possibility of causing a binding to update in the parent\r\n //component after change detection runs but before the additional check.\r\n //See https://angular.io/errors/NG0100 for details.\r\n setTimeout(() => {\r\n this.treeChange.emit();\r\n });\r\n });\r\n this.dropSubscription = this.treeService.drops$.subscribe((drop) => {\r\n setTimeout(() => {\r\n this.treeDrop.emit(drop);\r\n });\r\n });\r\n this.placeholder = false;\r\n this.treeService.placeholder$.subscribe((value) => {\r\n this.placeholder = value;\r\n if (!NgZone.isInAngularZone()) {\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (\r\n this.options?.listMode !== true &&\r\n (this.itemsPerPage !== undefined || this.page !== undefined)\r\n ) {\r\n console.warn(\r\n \"pagination is only allowed in listMode; `itemsPerPage` and `page` inputs will be ignored\"\r\n );\r\n }\r\n this.update();\r\n this.changeDetectorRef.detectChanges();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n //this is for mac os - without this dragover handler drop events aren't firing correctly\r\n this.el.nativeElement.addEventListener(\"dragover\", (event) => {\r\n event.preventDefault();\r\n });\r\n });\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.host !== undefined && this.data !== undefined) {\r\n this.update();\r\n }\r\n }\r\n\r\n /** Rebuild the tree */\r\n public update() {\r\n if (this.host === undefined) {\r\n throw new Error(\r\n \"Failed to render limble tree. Failure occurred at root.\"\r\n );\r\n }\r\n if (this.data === undefined) {\r\n throw new Error(`limbleTree requires a data object`);\r\n }\r\n this.treeService.init(\r\n this.host,\r\n this.data,\r\n this.options,\r\n this.itemsPerPage,\r\n this.page\r\n );\r\n //We check for firefox here because there is a bug in Firefox that causes the\r\n //custom scrolling to break. See https://bugzilla.mozilla.org/show_bug.cgi?id=505521#c80\r\n if (!isFirefox()) {\r\n this.globalEventsService.addScrolling();\r\n }\r\n }\r\n\r\n public dragoverHandler(event: DragEvent) {\r\n if (event.dataTransfer === null) {\r\n return;\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n event.dataTransfer.dropEffect = \"move\";\r\n }\r\n\r\n public dragleaveHandler(event: DragEvent) {\r\n const currentTarget = event.currentTarget;\r\n const relatedTarget = event.relatedTarget;\r\n if (\r\n !(currentTarget instanceof Node) ||\r\n !(relatedTarget instanceof Node) ||\r\n isElementDescendant(currentTarget, relatedTarget) !== false\r\n ) {\r\n //event came from deeper in the tree. Ignore it.\r\n return;\r\n }\r\n //Mouse has left the tree, so clear the drop zones\r\n this.dropZoneService.clearVisibleZones();\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n public dropHandler(event: DragEvent) {\r\n event.stopPropagation();\r\n if (this.dragStateService.getState() !== \"droppable\") {\r\n return;\r\n }\r\n const sourceBranch = this.dragStateService.capture();\r\n if (sourceBranch === undefined) {\r\n throw new Error(\"failed to get current branch in dragendHandler\");\r\n }\r\n const dropZone = this.dropZoneService.getActiveDropZone();\r\n if (dropZone === null) {\r\n throw new Error(\"failed to get active drop zone at drop handler\");\r\n }\r\n this.treeService.captured = true;\r\n this.dragStateService.state$\r\n .pipe(first((message) => message === \"idle\"))\r\n .subscribe(() => {\r\n this.treeService.captured = false;\r\n });\r\n this.dropZoneService.clearVisibleZones();\r\n this.treeService.drop(sourceBranch, dropZone.getFullInsertCoordinates());\r\n }\r\n\r\n ngOnDestroy() {\r\n this.changesSubscription.unsubscribe();\r\n this.dropSubscription.unsubscribe();\r\n }\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { ComponentCreatorService } from \"./singletons/component-creator.service\";\r\nimport { DropZoneComponent } from \"./drop-zone/drop-zone.component\";\r\nimport { LimbleTreeBranchComponent } from \"./limble-tree-branch/limble-tree-branch.component\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { LimbleTreeNodeComponent } from \"./limble-tree-node/limble-tree-node.component\";\r\nimport { DragStateService } from \"./singletons/drag-state.service\";\r\nimport { LimbleTreeRootComponent } from \"./limble-tree-root/limble-tree-root.component\";\r\nimport { LimbleTreePlaceholderComponent } from \"./limble-tree-placeholder/limble-tree-placeholder.component\";\r\nimport { GlobalEventsService } from \"./singletons/global-events.service\";\r\nimport { DragoverNoChangeDetectDirective } from \"./custom-event-bindings/dragover-no-change-detect.directive\";\r\nimport { DragleaveNoChangeDetectDirective } from \"./custom-event-bindings/dragleave-no-change-detect.directive\";\r\n\r\n@NgModule({\r\n declarations: [\r\n LimbleTreeBranchComponent,\r\n DropZoneComponent,\r\n LimbleTreeNodeComponent,\r\n LimbleTreeRootComponent,\r\n LimbleTreePlaceholderComponent,\r\n DragoverNoChangeDetectDirective,\r\n DragleaveNoChangeDetectDirective\r\n ],\r\n imports: [CommonModule],\r\n exports: [LimbleTreeRootComponent],\r\n providers: [ComponentCreatorService, DragStateService, GlobalEventsService]\r\n})\r\nexport class LimbleTreeModule {}\r\n","/*\r\n * Public API Surface of limble-tree\r\n */\r\n\r\nexport {\r\n LimbleTreeNode,\r\n LimbleTreeData,\r\n LimbleTreeOptions,\r\n ComponentObj,\r\n TreeDrop\r\n} from \"./lib/limble-tree-root/tree.service\";\r\nexport { LimbleTreeRootComponent } from \"./lib/limble-tree-root/limble-tree-root.component\";\r\nexport { LimbleTreeModule } from \"./lib/limble-tree.module\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|