@cluetec/ngcx-tree 0.1.0 → 16.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"cluetec-ngcx-tree.mjs","sources":["../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-data.source.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.html","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-utils.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.html","../../../projects/ngcx-tree/src/public-api.ts","../../../projects/ngcx-tree/src/cluetec-ngcx-tree.ts"],"sourcesContent":["import { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport class NgcxTreeDataSource<T> extends DataSource<T> {\n data$: BehaviorSubject<T[]>;\n\n constructor(data: T[]) {\n super();\n this.data$ = new BehaviorSubject(data);\n }\n\n connect(): Observable<readonly T[]> {\n return this.data$.asObservable();\n }\n disconnect(): void {}\n\n update(data: T[]) {\n this.data$.next([...data]);\n }\n}\n","import { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgcxTreeConfig, NgcxTreeNodeWrapper } from '../ngcx-tree-models';\n\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'ngcx-tree-node',\n templateUrl: './ngcx-tree-node.component.html',\n styleUrls: ['./ngcx-tree-node.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, NgTemplateOutlet, NgIf],\n})\nexport class NgcxTreeNodeComponent implements OnInit, OnDestroy {\n @Input() nodeWrapper!: NgcxTreeNodeWrapper<any>;\n @Input() treeControl!: NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;\n @Input() treeConfig?: NgcxTreeConfig<any>;\n @Input() isSelected = false;\n\n @Output() customEvent = new EventEmitter<any>();\n @Output() clickEvent = new EventEmitter<void>();\n\n @ViewChild('ref', { read: ViewContainerRef, static: true })\n vcRef?: ViewContainerRef;\n\n ngUnsubscribe = new Subject();\n\n ngOnInit() {\n if (this.vcRef && this.treeConfig?.treeNodeContentComponent) {\n const nodeComponent = this.vcRef.createComponent(\n this.treeConfig.treeNodeContentComponent\n );\n nodeComponent.instance.nodeWrapper = this.nodeWrapper;\n\n nodeComponent.instance.customEvent\n ?.pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((value: any) => this.customEvent.emit(value));\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next(undefined);\n this.ngUnsubscribe.complete();\n }\n}\n","<div\n class=\"tree-node-content-container\"\n [class.selected]=\"isSelected\"\n [class.first]=\"nodeWrapper.isFirstChild\"\n [class.last]=\"nodeWrapper.isLastChild\"\n [class.is-selectable]=\"nodeWrapper.isSelectable\"\n (click)=\"clickEvent.emit()\">\n <div class=\"tree-node-expand-container\">\n <button\n *ngIf=\"nodeWrapper.children.length > 0\"\n class=\"tree-node-expand\"\n cdkTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + nodeWrapper.data.title\"\n (click)=\"$event.preventDefault()\">\n <div class=\"chevron\" [class.rotate]=\"treeControl.isExpanded(nodeWrapper)\">\n <svg id=\"a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 9\">\n <path\n d=\"m2.83.09l4.2,4.2c.05.05.09.14.09.21s-.04.15-.09.21l-4.2,4.2c-.05.05-.14.09-.21.09s-.15-.04-.21-.09l-.45-.45c-.05-.05-.09-.13-.09-.21,0-.07.04-.15.09-.21l3.54-3.54L1.97.96c-.05-.05-.09-.14-.09-.21s.04-.15.09-.21l.45-.45c.05-.05.14-.09.21-.09s.15.04.21.09Z\"\n style=\"fill: var(--icon-color, #333); stroke-width: 0px\" />\n </svg>\n </div>\n </button>\n </div>\n <div class=\"small-horizontal-tree-line\"></div>\n <div class=\"tree-node-icon-container\" *ngIf=\"nodeWrapper.data.faIcon\">\n <i class=\"fa\" [class]=\"nodeWrapper.data.faIcon\"></i>\n </div>\n <div class=\"tree-node-content\">\n <span\n *ngIf=\"\n !treeConfig?.treeNodeContentComponent &&\n !treeConfig?.treeNodeContentTemplate\n \">\n {{ nodeWrapper.data.title }}\n </span>\n <ng-container #ref></ng-container>\n <ng-container *ngIf=\"treeConfig?.treeNodeContentTemplate as template\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: {\n nodeWrapper: nodeWrapper\n }\n \"></ng-container>\n </ng-container>\n </div>\n</div>\n","import { NgcxTreeNodeWrapper } from './ngcx-tree-models';\n\nexport const isParentOf = (\n parent: NgcxTreeNodeWrapper<any>,\n node: NgcxTreeNodeWrapper<any>\n): boolean => {\n if (!node.parent) {\n return false;\n }\n if (parent.id === node.parent.id) {\n return true;\n }\n return isParentOf(parent, node.parent);\n};\n","import {\n CdkDrag,\n CdkDragRelease,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';\nimport { NgIf } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { NgcxTreeDataSource } from './ngcx-tree-data.source';\nimport {\n NgcxTreeApi,\n NgcxTreeConfig,\n NgcxTreeNode,\n NgcxTreeNodeMovedEvent,\n NgcxTreeNodeWrapper,\n} from './ngcx-tree-models';\nimport { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';\nimport { isParentOf } from './ngcx-tree-utils';\n\n@Component({\n selector: 'ngcx-tree',\n templateUrl: 'ngcx-tree.component.html',\n styleUrls: ['ngcx-tree.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf],\n})\nexport class NgcxTreeComponent implements OnChanges, OnInit {\n @Input() nodes?: NgcxTreeNode[];\n @Input() config?: NgcxTreeConfig<any>;\n\n @Output() nodeMoved = new EventEmitter<NgcxTreeNodeMovedEvent<any>>();\n @Output() customEvent = new EventEmitter<any>();\n @Output() clickEvent = new EventEmitter<NgcxTreeNodeWrapper<any>>();\n @Output() selectEvent = new EventEmitter<NgcxTreeNodeWrapper<any>>();\n\n public readonly api: NgcxTreeApi<any> = new NgcxTreeControl(this);\n\n dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<any>> =\n new NgcxTreeDataSource<NgcxTreeNodeWrapper<any>>([]);\n treeControl: NestedTreeControl<NgcxTreeNodeWrapper<any>, string> =\n new NestedTreeControl<NgcxTreeNodeWrapper<any>, string>(\n (node) => node.children,\n {\n trackBy: (node: NgcxTreeNodeWrapper<any>) => node.id,\n }\n );\n dragging?: NgcxTreeNodeWrapper<any>;\n\n selectedNode?: NgcxTreeNodeWrapper<any>;\n\n DropType = DropType;\n\n disable = () => false;\n\n private canceledByEsq?: boolean;\n\n ngOnInit(): void {\n this.updateTree();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['nodes']) {\n if (this.treeControl) {\n // initialized already\n this.updateTree();\n }\n if (this.selectedNode) {\n const selectedNodeId = this.selectedNode.id;\n setTimeout(() => this.api.selectNodeById(selectedNodeId));\n }\n }\n }\n\n updateTree() {\n const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);\n this.dataSource = new NgcxTreeDataSource(wrapperNodes);\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n createWrapperNodes(\n nodes: NgcxTreeNode[],\n parent?: NgcxTreeNodeWrapper<any>,\n depth: number = 0\n ): NgcxTreeNodeWrapper<any>[] {\n const childCount = nodes.length;\n const wrapperNodes = nodes.map((node, idx) => {\n const nodeWrapper: NgcxTreeNodeWrapper<any> = {\n id: node.id,\n data: node,\n isFirstChild: idx === 0,\n isLastChild: idx === childCount - 1,\n index: idx,\n parent: parent,\n depth: depth,\n children: [],\n };\n nodeWrapper.children = node.children\n ? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)\n : [];\n\n return nodeWrapper;\n });\n wrapperNodes.forEach((wrapperNode) => {\n if (!wrapperNode.isLastChild) {\n wrapperNode.next = wrapperNodes[wrapperNode.index + 1];\n }\n if (!wrapperNode.isFirstChild) {\n wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];\n }\n if (this.config?.allowSelection?.(wrapperNode)) {\n wrapperNode.isSelectable = true;\n }\n });\n return wrapperNodes;\n }\n\n hasChild = (_: number, node: NgcxTreeNodeWrapper<any>) =>\n node.children.length > 0;\n\n allowDrop(dropNode: NgcxTreeNodeWrapper<any>, dropType: DropType): boolean {\n if (\n !this.dragging ||\n this.dragging.id === dropNode.id ||\n isParentOf(this.dragging, dropNode)\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return false;\n }\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n if (this.config?.allowDrop) {\n return this.config.allowDrop(this.dragging, intoNode);\n }\n return true;\n }\n\n // prevent drop directly after a node on same level, that is expanded\n sortPredicate(): (\n index: number,\n drag: CdkDrag,\n drop: CdkDropList\n ) => boolean {\n return (\n index: number,\n _drag: CdkDrag<NgcxTreeNodeWrapper<any>>,\n drop: CdkDropList<NgcxTreeNodeWrapper<any>>\n ) => {\n return index == 0 || !this.treeControl.isExpanded(drop.data);\n };\n }\n\n disableDrag(node: NgcxTreeNodeWrapper<any>) {\n return this.config?.allowDrag ? !this.config.allowDrag(node) : false;\n }\n\n keyDownArrowUp(event: Event) {\n console.log('arrow up');\n\n if (this.selectedNode) {\n if (!this.selectedNode.isFirstChild) {\n this.selectNode(this.selectedNode.previous);\n } else if (this.selectedNode.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[nodes.length - 1]);\n }\n }\n event.preventDefault();\n }\n\n keyDownArrowDown(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isLastChild) {\n this.selectNode(this.selectedNode.next);\n } else if (this.selectedNode.parent?.next) {\n this.selectNode(this.selectedNode.parent.next);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n keyDownArrowLeft(event: Event) {\n if (this.selectedNode?.parent) {\n this.selectNode(this.selectedNode.parent);\n } else if (!this.selectedNode) {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n keyDownArrowRight(event: Event) {\n if (this.selectedNode && this.selectedNode.children.length > 0) {\n this.selectNode(this.selectedNode.children[0]);\n } else if (!this.selectedNode) {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n @HostListener('window:keydown.escape')\n keyEscapeWhileDragging() {\n if (this.dragging) {\n this.canceledByEsq = true;\n document.dispatchEvent(new Event('mouseup'));\n }\n }\n\n handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<any>>) {\n this.dragging = undefined;\n const movedNode = event.source.data;\n const dropZoneId = (<any>event.event.target).id;\n if (!dropZoneId) {\n // no valid drop zone\n return;\n }\n\n const dropZoneInfo = new DropZoneInfo(dropZoneId);\n const toNode = this.api.findNodeById(dropZoneInfo.nodeId);\n if (!toNode) {\n console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);\n return;\n }\n\n // dropType undefined can happen if dropped directly without moving\n if (this.canceledByEsq || dropZoneInfo.dropType === undefined) {\n this.canceledByEsq = false;\n return;\n }\n\n const insertIntoNode =\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;\n const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;\n const addAtNodeIdx = this.findAddIndex(\n dropZoneInfo,\n insertIntoNode,\n wrapperList\n );\n\n const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);\n // add element to new Position, subtract one if inserted in same list after the remove position\n (insertIntoNode?.data.children ?? this.nodes!).splice(\n movedNode.parent?.id === insertIntoNode?.id &&\n removedFromIdx < addAtNodeIdx\n ? addAtNodeIdx - 1\n : addAtNodeIdx,\n 0,\n movedNode.data\n );\n\n const afterNodeIdx = addAtNodeIdx - 1;\n const afterNode =\n afterNodeIdx > -1 && wrapperList.length > afterNodeIdx\n ? wrapperList[afterNodeIdx]\n : undefined;\n\n const beforeNode =\n addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx\n ? wrapperList[addAtNodeIdx]\n : undefined;\n this.nodeMoved.emit({\n node: movedNode,\n parent:\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,\n afterNode: afterNode,\n beforeNode: beforeNode,\n });\n this.dataSource = new NgcxTreeDataSource(\n this.createWrapperNodes(this.nodes!)\n );\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private findAddIndex(\n dropZoneInfo: DropZoneInfo,\n insertIntoNode: NgcxTreeNodeWrapper<any> | undefined,\n insertIntoList: NgcxTreeNodeWrapper<any>[]\n ) {\n if (\n insertIntoNode &&\n dropZoneInfo.dropType === DropType.DROP_INTO &&\n !insertIntoNode.data.children\n ) {\n insertIntoNode.data.children = [];\n }\n let addAtNodeIdx = 0;\n if (\n dropZoneInfo.dropType === DropType.DROP_AFTER ||\n dropZoneInfo.dropType === DropType.DROP_BEFORE\n ) {\n addAtNodeIdx = insertIntoList.findIndex(\n (child) => child.id === dropZoneInfo.nodeId\n );\n if (dropZoneInfo.dropType === DropType.DROP_AFTER) {\n addAtNodeIdx++;\n }\n }\n return addAtNodeIdx;\n }\n\n private removeElementFromPreviousPosition(\n movedNode: NgcxTreeNodeWrapper<any>\n ): number {\n const removeFromList = movedNode.parent?.data.children ?? this.nodes!;\n const removeIndex = removeFromList.findIndex(\n (child: any) => child.id === movedNode.id\n );\n removeFromList.splice(removeIndex, 1);\n return removeIndex;\n }\n\n nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<any>) {\n this.clickEvent.emit(nodeWrapper);\n if (nodeWrapper.isSelectable) {\n this.selectedNode =\n nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;\n this.selectEvent.emit(this.selectedNode);\n }\n }\n\n selectNode(nodeWrapper: NgcxTreeNodeWrapper<any> | undefined) {\n if (!nodeWrapper || nodeWrapper.isSelectable) {\n this.selectedNode = nodeWrapper;\n let expandNode = this.selectedNode?.parent;\n while (expandNode) {\n this.treeControl.expand(expandNode);\n expandNode = expandNode.parent;\n }\n this.selectEvent.emit(this.selectedNode);\n }\n }\n}\n\nenum DropType {\n DROP_AFTER = 'DROP_AFTER',\n DROP_BEFORE = 'DROP_BEFORE',\n DROP_INTO = 'DROP_INTO',\n}\n\nexport class NgcxTreeControl implements NgcxTreeApi<any> {\n constructor(private treeComponent: NgcxTreeComponent) {}\n\n get treeControl(): NestedTreeControl<NgcxTreeNodeWrapper<any>, string> {\n return this.treeComponent.treeControl;\n }\n\n selectNodeById(id: string) {\n this.treeComponent.selectNode(this.findNodeById(id));\n }\n\n findNodeById(id: string): NgcxTreeNodeWrapper<any> | undefined {\n return this.findNodeByIdInNodes(\n this.treeComponent.dataSource.data$.value,\n id\n );\n }\n\n private findNodeByIdInNodes(\n nodes: NgcxTreeNodeWrapper<any>[],\n id: string\n ): NgcxTreeNodeWrapper<any> | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n if (node.children?.length > 0) {\n const foundNode = this.findNodeByIdInNodes(node.children, id);\n if (foundNode) {\n return foundNode;\n }\n }\n }\n\n return undefined;\n }\n}\n\nclass DropZoneInfo {\n dropType: DropType;\n nodeId: string;\n\n constructor(id: string) {\n const pos = id.indexOf('_');\n this.nodeId = id.substring(0, pos);\n this.dropType = <any>id.substring(pos + 1);\n }\n}\n","<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !dragging ||\n !allowDrop(node, DropType.DROP_AFTER) ||\n !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !dragging ||\n !node.isFirstChild ||\n !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!dragging || !allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n !dragging ||\n treeControl.isExpanded(node) ||\n !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n","/*\n * Public API Surface of ngcx-tree\n */\n\nexport * from './lib/ngcx-tree/ngcx-tree-models';\nexport * from './lib/ngcx-tree/ngcx-tree.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cluetec-ngcx-tree.mjs","sources":["../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-data.source.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.html","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-utils.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.html","../../../projects/ngcx-tree/src/public-api.ts","../../../projects/ngcx-tree/src/cluetec-ngcx-tree.ts"],"sourcesContent":["import { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport class NgcxTreeDataSource<T> extends DataSource<T> {\n data$: BehaviorSubject<T[]>;\n\n constructor(data: T[]) {\n super();\n this.data$ = new BehaviorSubject(data);\n }\n\n connect(): Observable<readonly T[]> {\n return this.data$.asObservable();\n }\n disconnect(): void {}\n\n update(data: T[]) {\n this.data$.next([...data]);\n }\n}\n","import { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgcxTreeConfig, NgcxTreeNodeWrapper } from '../ngcx-tree-models';\n\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'ngcx-tree-node',\n templateUrl: './ngcx-tree-node.component.html',\n styleUrls: ['./ngcx-tree-node.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, NgTemplateOutlet, NgIf],\n})\nexport class NgcxTreeNodeComponent implements OnInit, OnDestroy {\n @Input() nodeWrapper!: NgcxTreeNodeWrapper<any>;\n @Input() treeControl!: NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;\n @Input() treeConfig?: NgcxTreeConfig<any>;\n @Input() isSelected = false;\n\n @Output() customEvent = new EventEmitter<any>();\n @Output() clickEvent = new EventEmitter<void>();\n\n @ViewChild('ref', { read: ViewContainerRef, static: true })\n vcRef?: ViewContainerRef;\n\n ngUnsubscribe = new Subject();\n\n ngOnInit() {\n if (this.vcRef && this.treeConfig?.treeNodeContentComponent) {\n const nodeComponent = this.vcRef.createComponent(\n this.treeConfig.treeNodeContentComponent\n );\n nodeComponent.instance.nodeWrapper = this.nodeWrapper;\n\n nodeComponent.instance.customEvent\n ?.pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((value: any) => this.customEvent.emit(value));\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next(undefined);\n this.ngUnsubscribe.complete();\n }\n}\n","<div\n class=\"tree-node-content-container\"\n [class.selected]=\"isSelected\"\n [class.first]=\"nodeWrapper.isFirstChild\"\n [class.last]=\"nodeWrapper.isLastChild\"\n [class.is-selectable]=\"nodeWrapper.isSelectable\"\n (click)=\"clickEvent.emit()\">\n <div class=\"tree-node-expand-container\">\n <button\n *ngIf=\"nodeWrapper.children.length > 0\"\n class=\"tree-node-expand\"\n cdkTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + nodeWrapper.data.title\"\n (click)=\"$event.preventDefault()\">\n <div class=\"chevron\" [class.rotate]=\"treeControl.isExpanded(nodeWrapper)\">\n <svg id=\"a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 9\">\n <path\n d=\"m2.83.09l4.2,4.2c.05.05.09.14.09.21s-.04.15-.09.21l-4.2,4.2c-.05.05-.14.09-.21.09s-.15-.04-.21-.09l-.45-.45c-.05-.05-.09-.13-.09-.21,0-.07.04-.15.09-.21l3.54-3.54L1.97.96c-.05-.05-.09-.14-.09-.21s.04-.15.09-.21l.45-.45c.05-.05.14-.09.21-.09s.15.04.21.09Z\"\n style=\"fill: var(--icon-color, #333); stroke-width: 0px\" />\n </svg>\n </div>\n </button>\n </div>\n <div class=\"small-horizontal-tree-line\"></div>\n <div class=\"tree-node-icon-container\" *ngIf=\"nodeWrapper.data.faIcon\">\n <i class=\"fa\" [class]=\"nodeWrapper.data.faIcon\"></i>\n </div>\n <div class=\"tree-node-content\">\n <span\n *ngIf=\"\n !treeConfig?.treeNodeContentComponent &&\n !treeConfig?.treeNodeContentTemplate\n \">\n {{ nodeWrapper.data.title }}\n </span>\n <ng-container #ref></ng-container>\n <ng-container *ngIf=\"treeConfig?.treeNodeContentTemplate as template\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: {\n nodeWrapper: nodeWrapper\n }\n \"></ng-container>\n </ng-container>\n </div>\n</div>\n","import { NgcxTreeNodeWrapper } from './ngcx-tree-models';\n\nexport const isParentOf = (\n parent: NgcxTreeNodeWrapper<any>,\n node: NgcxTreeNodeWrapper<any>\n): boolean => {\n if (!node.parent) {\n return false;\n }\n if (parent.id === node.parent.id) {\n return true;\n }\n return isParentOf(parent, node.parent);\n};\n","import {\n CdkDrag,\n CdkDragRelease,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport {\n CdkTreeModule,\n NestedTreeControl,\n NestedTreeControlOptions,\n} from '@angular/cdk/tree';\nimport { NgIf } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { NgcxTreeDataSource } from './ngcx-tree-data.source';\nimport {\n NgcxTreeConfig,\n NgcxTreeNode,\n NgcxTreeNodeMovedEvent,\n NgcxTreeNodeWrapper,\n} from './ngcx-tree-models';\nimport { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';\nimport { isParentOf } from './ngcx-tree-utils';\n\n@Component({\n selector: 'ngcx-tree',\n templateUrl: 'ngcx-tree.component.html',\n styleUrls: ['ngcx-tree.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf],\n})\nexport class NgcxTreeComponent<T extends NgcxTreeNode>\n implements OnChanges, OnInit\n{\n @Input() nodes?: NgcxTreeNode[];\n @Input() config?: NgcxTreeConfig<T>;\n\n @Output() nodeMoved = new EventEmitter<NgcxTreeNodeMovedEvent<T>>();\n @Output() customEvent = new EventEmitter<T>();\n @Output() clickEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n @Output() selectEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n\n /**\n * Api for finding and selecting node. Extends from the CDK treeControl for expanding/collapsing the tree\n */\n public readonly treeControl: NgcxTreeControl<T> = new NgcxTreeControl<T>(\n this,\n (node) => node.children,\n {\n trackBy: (node: NgcxTreeNodeWrapper<T>) => node.id,\n }\n );\n\n dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<T>> =\n new NgcxTreeDataSource<NgcxTreeNodeWrapper<T>>([]);\n\n protected dragging?: NgcxTreeNodeWrapper<T>;\n\n protected selectedNode?: NgcxTreeNodeWrapper<T>;\n\n protected readonly DropType = DropType;\n\n protected readonly disable = () => false;\n\n private canceledByEsc?: boolean;\n\n ngOnInit(): void {\n this.updateTree();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['nodes']) {\n if (this.treeControl) {\n // initialized already\n this.updateTree();\n }\n if (this.selectedNode) {\n const selectedNodeId = this.selectedNode.id;\n setTimeout(() => this.treeControl.selectNodeById(selectedNodeId));\n }\n }\n }\n\n private updateTree() {\n const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);\n this.dataSource = new NgcxTreeDataSource(wrapperNodes);\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private createWrapperNodes(\n nodes: NgcxTreeNode[],\n parent?: NgcxTreeNodeWrapper<T>,\n depth: number = 0\n ): NgcxTreeNodeWrapper<T>[] {\n const childCount = nodes.length;\n const wrapperNodes = nodes.map((node, idx) => {\n const nodeWrapper: NgcxTreeNodeWrapper<T> = {\n id: node.id,\n data: <T>node,\n isFirstChild: idx === 0,\n isLastChild: idx === childCount - 1,\n index: idx,\n parent: parent,\n depth: depth,\n children: [],\n };\n nodeWrapper.children = node.children\n ? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)\n : [];\n\n return nodeWrapper;\n });\n wrapperNodes.forEach((wrapperNode) => {\n if (!wrapperNode.isLastChild) {\n wrapperNode.next = wrapperNodes[wrapperNode.index + 1];\n }\n if (!wrapperNode.isFirstChild) {\n wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];\n }\n if (this.config?.allowSelection?.(wrapperNode)) {\n wrapperNode.isSelectable = true;\n }\n });\n return wrapperNodes;\n }\n\n protected allowDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): boolean {\n if (\n !this.dragging ||\n this.dragging.id === dropNode.id ||\n isParentOf(this.dragging, dropNode)\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return false;\n }\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n if (this.config?.allowDrop) {\n return this.config.allowDrop(this.dragging, intoNode);\n }\n return true;\n }\n\n // prevent drop directly after a node on same level, that is expanded\n protected sortPredicate(): (\n index: number,\n drag: CdkDrag,\n drop: CdkDropList\n ) => boolean {\n return (\n index: number,\n _drag: CdkDrag<NgcxTreeNodeWrapper<T>>,\n drop: CdkDropList<NgcxTreeNodeWrapper<T>>\n ) => {\n return index == 0 || !this.treeControl.isExpanded(drop.data);\n };\n }\n\n protected disableDrag(node: NgcxTreeNodeWrapper<T>) {\n return this.config?.allowDrag ? !this.config.allowDrag(node) : false;\n }\n\n protected keyDownArrowUp(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isFirstChild) {\n this.selectNode(this.selectedNode.previous);\n } else if (this.selectedNode.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[nodes.length - 1]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowDown(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isLastChild) {\n this.selectNode(this.selectedNode.next);\n } else if (this.selectedNode.parent?.next) {\n this.selectNode(this.selectedNode.parent.next);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowLeft(event: Event) {\n if (this.selectedNode) {\n if (this.treeControl.isExpanded(this.selectedNode)) {\n this.treeControl.collapse(this.selectedNode);\n } else if (this.selectedNode?.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowRight(event: Event) {\n if (this.selectedNode && this.selectedNode.children.length > 0) {\n this.selectNode(this.selectedNode.children[0]);\n } else if (!this.selectedNode) {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n @HostListener('window:keydown.escape')\n protected keyEscapeWhileDragging() {\n if (this.dragging) {\n this.canceledByEsc = true;\n document.dispatchEvent(new Event('mouseup'));\n }\n }\n\n protected handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<T>>) {\n this.dragging = undefined;\n const movedNode = event.source.data;\n const dropZoneId = (<any>event.event.target).id;\n if (!dropZoneId) {\n // no valid drop zone\n return;\n }\n\n const dropZoneInfo = new DropZoneInfo(dropZoneId);\n const toNode = this.treeControl.findNodeById(dropZoneInfo.nodeId);\n if (!toNode) {\n console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);\n return;\n }\n\n // dropType undefined can happen if dropped directly without moving\n if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {\n this.canceledByEsc = false;\n return;\n }\n\n const insertIntoNode =\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;\n const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;\n const addAtNodeIdx = this.findAddIndex(\n dropZoneInfo,\n insertIntoNode,\n wrapperList\n );\n\n const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);\n // add element to new Position, subtract one if inserted in same list after the remove position\n (insertIntoNode?.data.children ?? this.nodes!).splice(\n movedNode.parent?.id === insertIntoNode?.id &&\n removedFromIdx < addAtNodeIdx\n ? addAtNodeIdx - 1\n : addAtNodeIdx,\n 0,\n movedNode.data\n );\n\n const afterNodeIdx = addAtNodeIdx - 1;\n const afterNode =\n afterNodeIdx > -1 && wrapperList.length > afterNodeIdx\n ? wrapperList[afterNodeIdx]\n : undefined;\n\n const beforeNode =\n addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx\n ? wrapperList[addAtNodeIdx]\n : undefined;\n this.nodeMoved.emit({\n node: movedNode,\n parent:\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,\n afterNode: afterNode,\n beforeNode: beforeNode,\n });\n this.dataSource = new NgcxTreeDataSource(\n this.createWrapperNodes(this.nodes!)\n );\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private findAddIndex(\n dropZoneInfo: DropZoneInfo,\n insertIntoNode: NgcxTreeNodeWrapper<T> | undefined,\n insertIntoList: NgcxTreeNodeWrapper<T>[]\n ) {\n if (\n insertIntoNode &&\n dropZoneInfo.dropType === DropType.DROP_INTO &&\n !insertIntoNode.data.children\n ) {\n insertIntoNode.data.children = [];\n }\n let addAtNodeIdx = 0;\n if (\n dropZoneInfo.dropType === DropType.DROP_AFTER ||\n dropZoneInfo.dropType === DropType.DROP_BEFORE\n ) {\n addAtNodeIdx = insertIntoList.findIndex(\n (child) => child.id === dropZoneInfo.nodeId\n );\n if (dropZoneInfo.dropType === DropType.DROP_AFTER) {\n addAtNodeIdx++;\n }\n }\n return addAtNodeIdx;\n }\n\n private removeElementFromPreviousPosition(\n movedNode: NgcxTreeNodeWrapper<T>\n ): number {\n const removeFromList = movedNode.parent?.data.children ?? this.nodes!;\n const removeIndex = removeFromList.findIndex(\n (child: any) => child.id === movedNode.id\n );\n removeFromList.splice(removeIndex, 1);\n return removeIndex;\n }\n\n nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<T>) {\n this.clickEvent.emit(nodeWrapper);\n if (nodeWrapper.isSelectable) {\n this.selectedNode =\n nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;\n this.selectEvent.emit(this.selectedNode);\n }\n }\n\n selectNode(nodeWrapper: NgcxTreeNodeWrapper<T> | undefined) {\n if (!nodeWrapper || nodeWrapper.isSelectable) {\n this.selectedNode = nodeWrapper;\n let expandNode = this.selectedNode?.parent;\n while (expandNode) {\n this.treeControl.expand(expandNode);\n expandNode = expandNode.parent;\n }\n this.selectEvent.emit(this.selectedNode);\n }\n }\n}\n\nenum DropType {\n DROP_AFTER = 'DROP_AFTER',\n DROP_BEFORE = 'DROP_BEFORE',\n DROP_INTO = 'DROP_INTO',\n}\n\nexport class NgcxTreeControl<T extends NgcxTreeNode> extends NestedTreeControl<\n NgcxTreeNodeWrapper<T>,\n string\n> {\n constructor(\n private treeComponent: NgcxTreeComponent<T>,\n getChildren: (dataNode: NgcxTreeNodeWrapper<T>) => NgcxTreeNodeWrapper<T>[],\n options?: NestedTreeControlOptions<NgcxTreeNodeWrapper<T>, string>\n ) {\n super(getChildren, options);\n }\n\n /**\n * select a node by id. the selectEvent is fired afterwards.\n */\n selectNodeById(id: string) {\n this.treeComponent.selectNode(this.findNodeById(id));\n }\n\n /**\n * find a node by id.\n */\n findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined {\n return this.findNodeByIdInNodes(\n this.treeComponent.dataSource.data$.value,\n id\n );\n }\n\n private findNodeByIdInNodes(\n nodes: NgcxTreeNodeWrapper<T>[],\n id: string\n ): NgcxTreeNodeWrapper<T> | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n if (node.children?.length > 0) {\n const foundNode = this.findNodeByIdInNodes(node.children, id);\n if (foundNode) {\n return foundNode;\n }\n }\n }\n\n return undefined;\n }\n}\n\nclass DropZoneInfo {\n dropType: DropType;\n nodeId: string;\n\n constructor(id: string) {\n const pos = id.indexOf('_');\n this.nodeId = id.substring(0, pos);\n this.dropType = <DropType>id.substring(pos + 1);\n }\n}\n","<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n","/*\n * Public API Surface of ngcx-tree\n */\n\nexport * from './lib/ngcx-tree/ngcx-tree-models';\nexport * from './lib/ngcx-tree/ngcx-tree.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,12 @@
1
- import { NestedTreeControl } from '@angular/cdk/tree';
2
1
  import { EventEmitter, TemplateRef, Type } from '@angular/core';
3
- export interface NgcxTreeConfig<T> {
2
+ export interface NgcxTreeConfig<T extends NgcxTreeNode> {
4
3
  treeNodeContentComponent?: Type<NgcxCustomComponent<T>>;
5
4
  treeNodeContentTemplate?: TemplateRef<any>;
6
5
  allowDrop?: (node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => boolean;
7
6
  allowDrag?: (node: NgcxTreeNodeWrapper<T>) => boolean;
8
7
  allowSelection?: (node: NgcxTreeNodeWrapper<T>) => boolean;
9
8
  }
10
- export interface NgcxCustomComponent<T> {
9
+ export interface NgcxCustomComponent<T extends NgcxTreeNode> {
11
10
  nodeWrapper?: NgcxTreeNodeWrapper<T>;
12
11
  customEvent?: EventEmitter<any>;
13
12
  }
@@ -17,7 +16,7 @@ export interface NgcxTreeNode {
17
16
  faIcon?: string;
18
17
  children?: NgcxTreeNode[];
19
18
  }
20
- export interface NgcxTreeNodeWrapper<T> {
19
+ export interface NgcxTreeNodeWrapper<T extends NgcxTreeNode> {
21
20
  id: string;
22
21
  data: T;
23
22
  depth: number;
@@ -30,17 +29,12 @@ export interface NgcxTreeNodeWrapper<T> {
30
29
  next?: NgcxTreeNodeWrapper<T>;
31
30
  previous?: NgcxTreeNodeWrapper<T>;
32
31
  }
33
- export interface NgcxTreeNodeComponent<T> {
32
+ export interface NgcxTreeNodeComponent<T extends NgcxTreeNode> {
34
33
  nodeWrapper?: NgcxTreeNodeWrapper<T>;
35
34
  }
36
- export interface NgcxTreeNodeMovedEvent<T> {
35
+ export interface NgcxTreeNodeMovedEvent<T extends NgcxTreeNode> {
37
36
  node: NgcxTreeNodeWrapper<T>;
38
37
  parent?: NgcxTreeNodeWrapper<T>;
39
38
  afterNode?: NgcxTreeNodeWrapper<T>;
40
39
  beforeNode?: NgcxTreeNodeWrapper<T>;
41
40
  }
42
- export interface NgcxTreeApi<T> {
43
- selectNodeById(id: string): void;
44
- findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined;
45
- get treeControl(): NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;
46
- }
@@ -1,56 +1,62 @@
1
1
  import { CdkDrag, CdkDragRelease, CdkDropList } from '@angular/cdk/drag-drop';
2
- import { NestedTreeControl } from '@angular/cdk/tree';
2
+ import { NestedTreeControl, NestedTreeControlOptions } from '@angular/cdk/tree';
3
3
  import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
4
4
  import { NgcxTreeDataSource } from './ngcx-tree-data.source';
5
- import { NgcxTreeApi, NgcxTreeConfig, NgcxTreeNode, NgcxTreeNodeMovedEvent, NgcxTreeNodeWrapper } from './ngcx-tree-models';
5
+ import { NgcxTreeConfig, NgcxTreeNode, NgcxTreeNodeMovedEvent, NgcxTreeNodeWrapper } from './ngcx-tree-models';
6
6
  import * as i0 from "@angular/core";
7
- export declare class NgcxTreeComponent implements OnChanges, OnInit {
7
+ export declare class NgcxTreeComponent<T extends NgcxTreeNode> implements OnChanges, OnInit {
8
8
  nodes?: NgcxTreeNode[];
9
- config?: NgcxTreeConfig<any>;
10
- nodeMoved: EventEmitter<NgcxTreeNodeMovedEvent<any>>;
11
- customEvent: EventEmitter<any>;
12
- clickEvent: EventEmitter<NgcxTreeNodeWrapper<any>>;
13
- selectEvent: EventEmitter<NgcxTreeNodeWrapper<any>>;
14
- readonly api: NgcxTreeApi<any>;
15
- dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<any>>;
16
- treeControl: NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;
17
- dragging?: NgcxTreeNodeWrapper<any>;
18
- selectedNode?: NgcxTreeNodeWrapper<any>;
19
- DropType: typeof DropType;
20
- disable: () => boolean;
21
- private canceledByEsq?;
9
+ config?: NgcxTreeConfig<T>;
10
+ nodeMoved: EventEmitter<NgcxTreeNodeMovedEvent<T>>;
11
+ customEvent: EventEmitter<T>;
12
+ clickEvent: EventEmitter<NgcxTreeNodeWrapper<T>>;
13
+ selectEvent: EventEmitter<NgcxTreeNodeWrapper<T>>;
14
+ /**
15
+ * Api for finding and selecting node. Extends from the CDK treeControl for expanding/collapsing the tree
16
+ */
17
+ readonly treeControl: NgcxTreeControl<T>;
18
+ dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<T>>;
19
+ protected dragging?: NgcxTreeNodeWrapper<T>;
20
+ protected selectedNode?: NgcxTreeNodeWrapper<T>;
21
+ protected readonly DropType: typeof DropType;
22
+ protected readonly disable: () => boolean;
23
+ private canceledByEsc?;
22
24
  ngOnInit(): void;
23
25
  ngOnChanges(changes: SimpleChanges): void;
24
- updateTree(): void;
25
- createWrapperNodes(nodes: NgcxTreeNode[], parent?: NgcxTreeNodeWrapper<any>, depth?: number): NgcxTreeNodeWrapper<any>[];
26
- hasChild: (_: number, node: NgcxTreeNodeWrapper<any>) => boolean;
27
- allowDrop(dropNode: NgcxTreeNodeWrapper<any>, dropType: DropType): boolean;
28
- sortPredicate(): (index: number, drag: CdkDrag, drop: CdkDropList) => boolean;
29
- disableDrag(node: NgcxTreeNodeWrapper<any>): boolean;
30
- keyDownArrowUp(event: Event): void;
31
- keyDownArrowDown(event: Event): void;
32
- keyDownArrowLeft(event: Event): void;
33
- keyDownArrowRight(event: Event): void;
34
- keyEscapeWhileDragging(): void;
35
- handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<any>>): void;
26
+ private updateTree;
27
+ private createWrapperNodes;
28
+ protected allowDrop(dropNode: NgcxTreeNodeWrapper<T>, dropType: DropType): boolean;
29
+ protected sortPredicate(): (index: number, drag: CdkDrag, drop: CdkDropList) => boolean;
30
+ protected disableDrag(node: NgcxTreeNodeWrapper<T>): boolean;
31
+ protected keyDownArrowUp(event: Event): void;
32
+ protected keyDownArrowDown(event: Event): void;
33
+ protected keyDownArrowLeft(event: Event): void;
34
+ protected keyDownArrowRight(event: Event): void;
35
+ protected keyEscapeWhileDragging(): void;
36
+ protected handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<T>>): void;
36
37
  private findAddIndex;
37
38
  private removeElementFromPreviousPosition;
38
- nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<any>): void;
39
- selectNode(nodeWrapper: NgcxTreeNodeWrapper<any> | undefined): void;
40
- static ɵfac: i0.ɵɵFactoryDeclaration<NgcxTreeComponent, never>;
41
- static ɵcmp: i0.ɵɵComponentDeclaration<NgcxTreeComponent, "ngcx-tree", never, { "nodes": { "alias": "nodes"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "nodeMoved": "nodeMoved"; "customEvent": "customEvent"; "clickEvent": "clickEvent"; "selectEvent": "selectEvent"; }, never, never, true, never>;
39
+ nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<T>): void;
40
+ selectNode(nodeWrapper: NgcxTreeNodeWrapper<T> | undefined): void;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgcxTreeComponent<any>, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgcxTreeComponent<any>, "ngcx-tree", never, { "nodes": { "alias": "nodes"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "nodeMoved": "nodeMoved"; "customEvent": "customEvent"; "clickEvent": "clickEvent"; "selectEvent": "selectEvent"; }, never, never, true, never>;
42
43
  }
43
44
  declare enum DropType {
44
45
  DROP_AFTER = "DROP_AFTER",
45
46
  DROP_BEFORE = "DROP_BEFORE",
46
47
  DROP_INTO = "DROP_INTO"
47
48
  }
48
- export declare class NgcxTreeControl implements NgcxTreeApi<any> {
49
+ export declare class NgcxTreeControl<T extends NgcxTreeNode> extends NestedTreeControl<NgcxTreeNodeWrapper<T>, string> {
49
50
  private treeComponent;
50
- constructor(treeComponent: NgcxTreeComponent);
51
- get treeControl(): NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;
51
+ constructor(treeComponent: NgcxTreeComponent<T>, getChildren: (dataNode: NgcxTreeNodeWrapper<T>) => NgcxTreeNodeWrapper<T>[], options?: NestedTreeControlOptions<NgcxTreeNodeWrapper<T>, string>);
52
+ /**
53
+ * select a node by id. the selectEvent is fired afterwards.
54
+ */
52
55
  selectNodeById(id: string): void;
53
- findNodeById(id: string): NgcxTreeNodeWrapper<any> | undefined;
56
+ /**
57
+ * find a node by id.
58
+ */
59
+ findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined;
54
60
  private findNodeByIdInNodes;
55
61
  }
56
62
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cluetec/ngcx-tree",
3
- "version": "0.1.0",
3
+ "version": "16.0.0",
4
4
  "description": "An angular tree component that allows to move nodes by drag and drop.",
5
5
  "author": "Michael Niedermaier <mn@cluetec.de>",
6
6
  "repository": "https://github.com/cluetec/ngcx-tree",
@@ -10,9 +10,9 @@
10
10
  "url": "https://github.com/cluetec/ngcx-tree/issues"
11
11
  },
12
12
  "peerDependencies": {
13
- "@angular/common": "^16.1.0",
14
- "@angular/core": "^16.1.0",
15
- "@angular/cdk": "^16.1.0"
13
+ "@angular/common": "^16.2.0",
14
+ "@angular/core": "^16.2.0",
15
+ "@angular/cdk": "^16.2.0"
16
16
  },
17
17
  "dependencies": {
18
18
  "tslib": "^2.6.1"
@@ -28,7 +28,9 @@
28
28
  "and",
29
29
  "drop",
30
30
  "drag and drop",
31
- "cluetec"
31
+ "cluetec",
32
+ "ngcx",
33
+ "cx"
32
34
  ],
33
35
  "module": "fesm2022/cluetec-ngcx-tree.mjs",
34
36
  "typings": "index.d.ts",
@@ -0,0 +1,60 @@
1
+ .ngcx-tree .cdk-drop-list {
2
+ width: 100%;
3
+ }
4
+
5
+ .tree-node-content-container,
6
+ .tree-node-children-container {
7
+ position: relative;
8
+ cursor: default;
9
+ }
10
+ .tree-node-content-container::before,
11
+ .tree-node-children-container::before {
12
+ content: "";
13
+ position: absolute;
14
+ border-left: 1px solid lightgrey;
15
+ top: 0;
16
+ bottom: 0px;
17
+ left: 25px;
18
+ }
19
+ .tree-node-content-container .small-horizontal-tree-line,
20
+ .tree-node-children-container .small-horizontal-tree-line {
21
+ width: 5px;
22
+ position: absolute;
23
+ left: 25px;
24
+ border-top: 1px solid lightgrey;
25
+ }
26
+
27
+ .tree-node-content-container.first::before {
28
+ top: 5px;
29
+ }
30
+ .tree-node-content-container.last:not(.expanded)::before {
31
+ bottom: 14px;
32
+ }
33
+
34
+ .tree-node-children-container.last::before {
35
+ bottom: 14px;
36
+ }
37
+
38
+ .cdk-drag-preview .tree-node-content-container::before {
39
+ border-left: none;
40
+ }
41
+ .cdk-drag-preview .tree-node-content-container .small-horizontal-tree-line {
42
+ border-top: none;
43
+ }
44
+
45
+ .ngcx-tree .tree-node-content-container.selected .tree-node-content {
46
+ font-weight: 600;
47
+ }
48
+ .ngcx-tree:not(.dragging) .tree-node-content-container.is-selectable:hover .tree-node-content {
49
+ font-weight: 600;
50
+ }
51
+
52
+ .cdk-drag-preview .ngcx-tree .tree-node-content-container.selected .tree-node-content {
53
+ background-color: inherit;
54
+ }
55
+
56
+ .ngcx-tree .tree-node-content-container .chevron {
57
+ --icon-color: #444;
58
+ }
59
+
60
+ /*# sourceMappingURL=styles.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../projects/ngcx-tree/styles/_ngcx-common.scss","../../../projects/ngcx-tree/styles/_ngcx-doted-tree-line.scss","../../../projects/ngcx-tree/styles/_ngcx-selection.scss","../../../projects/ngcx-tree/styles/_ngcx-icon-color.scss"],"names":[],"mappings":"AACE;EACE;;;ACFJ;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;AAAA;EACE;EACA;EACA;EACA;;;AAKF;EACE;;AAEF;EACE;;;AAIJ;EACE;;;AAKE;EACE;;AAEF;EACE;;;ACrCA;EACE;;AAOF;EACE;;;AAOJ;EACE;;;AClBF;EACE","file":"styles.css"}