@cluetec/ngcx-tree 18.0.0 → 19.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.
- package/fesm2022/cluetec-ngcx-tree.mjs +9 -9
- package/fesm2022/cluetec-ngcx-tree.mjs.map +1 -1
- package/package.json +4 -6
- package/esm2022/cluetec-ngcx-tree.mjs +0 -5
- package/esm2022/lib/ngcx-tree/ngcx-tree-data.source.mjs +0 -16
- package/esm2022/lib/ngcx-tree/ngcx-tree-models.mjs +0 -2
- package/esm2022/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.mjs +0 -49
- package/esm2022/lib/ngcx-tree/ngcx-tree-utils.mjs +0 -10
- package/esm2022/lib/ngcx-tree/ngcx-tree.component.mjs +0 -344
- package/esm2022/public-api.mjs +0 -6
|
@@ -42,12 +42,12 @@ class NgcxTreeNodeComponent {
|
|
|
42
42
|
this.ngUnsubscribe.next(undefined);
|
|
43
43
|
this.ngUnsubscribe.complete();
|
|
44
44
|
}
|
|
45
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
46
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: NgcxTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: NgcxTreeNodeComponent, isStandalone: true, selector: "ngcx-tree-node", inputs: { nodeWrapper: "nodeWrapper", treeControl: "treeControl", treeConfig: "treeConfig", isSelected: "isSelected" }, outputs: { customEvent: "customEvent", clickEvent: "clickEvent" }, viewQueries: [{ propertyName: "vcRef", first: true, predicate: ["ref"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<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", styles: [".tree-node-content-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%}.tree-node-content-container.is-selectable{cursor:pointer}.tree-node-content-container .tree-node-expand-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:30px;height:30px;margin-right:5px}.tree-node-content-container .tree-node-expand-container>.tree-node-expand{color:#2587be;background:none;border:none;font:inherit;cursor:pointer;outline:inherit;width:30px;height:30px;display:flex;justify-content:center;align-items:center}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron{width:10px;transition:transform .1s ease-in-out}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron.rotate{transform:rotate(90deg)}.tree-node-content-container .tree-node-icon-container{margin-right:7px;color:#2587be}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
47
47
|
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: NgcxTreeNodeComponent, decorators: [{
|
|
49
49
|
type: Component,
|
|
50
|
-
args: [{ selector: 'ngcx-tree-node',
|
|
50
|
+
args: [{ selector: 'ngcx-tree-node', imports: [CdkTreeModule, NgTemplateOutlet, NgIf], template: "<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", styles: [".tree-node-content-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%}.tree-node-content-container.is-selectable{cursor:pointer}.tree-node-content-container .tree-node-expand-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:30px;height:30px;margin-right:5px}.tree-node-content-container .tree-node-expand-container>.tree-node-expand{color:#2587be;background:none;border:none;font:inherit;cursor:pointer;outline:inherit;width:30px;height:30px;display:flex;justify-content:center;align-items:center}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron{width:10px;transition:transform .1s ease-in-out}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron.rotate{transform:rotate(90deg)}.tree-node-content-container .tree-node-icon-container{margin-right:7px;color:#2587be}\n"] }]
|
|
51
51
|
}], propDecorators: { nodeWrapper: [{
|
|
52
52
|
type: Input
|
|
53
53
|
}], treeControl: [{
|
|
@@ -248,7 +248,7 @@ class NgcxTreeComponent {
|
|
|
248
248
|
handleDragReleaseInternal(event) {
|
|
249
249
|
const movedNode = event.source.data;
|
|
250
250
|
const target = event.event.target;
|
|
251
|
-
const dropZoneId = target.id
|
|
251
|
+
const dropZoneId = target.id ? target.id : target.parentElement?.id;
|
|
252
252
|
if (!dropZoneId) {
|
|
253
253
|
// no valid drop zone
|
|
254
254
|
return;
|
|
@@ -334,12 +334,12 @@ class NgcxTreeComponent {
|
|
|
334
334
|
this.selectEvent.emit(this.selectedNode);
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
338
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
337
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: NgcxTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
338
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone.cdk-drop-list-receiving:hover .tooltip,.tree-node-container-drop-zone.cdk-drop-list-dragging .tooltip{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
339
339
|
}
|
|
340
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
340
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: NgcxTreeComponent, decorators: [{
|
|
341
341
|
type: Component,
|
|
342
|
-
args: [{ selector: 'ngcx-tree',
|
|
342
|
+
args: [{ selector: 'ngcx-tree', imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone.cdk-drop-list-receiving:hover .tooltip,.tree-node-container-drop-zone.cdk-drop-list-dragging .tooltip{display:block}\n"] }]
|
|
343
343
|
}], propDecorators: { nodes: [{
|
|
344
344
|
type: Input
|
|
345
345
|
}], config: [{
|
|
@@ -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 {\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 Output,\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> implements OnChanges {\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 ngOnChanges() {\n this.updateTree();\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 hideDrop(\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 true;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return true;\n }\n return false;\n }\n\n protected allowDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): DropControl {\n const hideDrop = this.hideDrop(dropNode, dropType);\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n\n let preventDropReason;\n let allowDrop = true;\n if (this.config?.preventDropReason && this.dragging) {\n preventDropReason = this.config.preventDropReason(\n this.dragging,\n intoNode\n );\n }\n if (this.config?.allowDrop && this.dragging) {\n allowDrop = this.config.allowDrop(this.dragging, intoNode);\n }\n\n return new DropControl(\n hideDrop,\n !allowDrop || !!preventDropReason,\n preventDropReason\n );\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.handleDragReleaseInternal(event);\n this.dragging = undefined;\n }\n\n private handleDragReleaseInternal(\n event: CdkDragRelease<NgcxTreeNodeWrapper<T>>\n ) {\n const movedNode = event.source.data;\n const target = <HTMLDivElement>event.event.target;\n const dropZoneId = target.id ?? target.parentElement?.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 const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);\n if (dropControl.hideDrop || dropControl.preventDrop) {\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\nclass DropControl {\n constructor(\n public hideDrop: boolean,\n public preventDrop: boolean,\n public preventDropReason: string = ''\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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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 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 Output,\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 imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf]\n})\nexport class NgcxTreeComponent<T extends NgcxTreeNode> implements OnChanges {\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 ngOnChanges() {\n this.updateTree();\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 hideDrop(\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 true;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return true;\n }\n return false;\n }\n\n protected allowDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): DropControl {\n const hideDrop = this.hideDrop(dropNode, dropType);\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n\n let preventDropReason;\n let allowDrop = true;\n if (this.config?.preventDropReason && this.dragging) {\n preventDropReason = this.config.preventDropReason(\n this.dragging,\n intoNode\n );\n }\n if (this.config?.allowDrop && this.dragging) {\n allowDrop = this.config.allowDrop(this.dragging, intoNode);\n }\n\n return new DropControl(\n hideDrop,\n !allowDrop || !!preventDropReason,\n preventDropReason\n );\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.handleDragReleaseInternal(event);\n this.dragging = undefined;\n }\n\n private handleDragReleaseInternal(\n event: CdkDragRelease<NgcxTreeNodeWrapper<T>>\n ) {\n const movedNode = event.source.data;\n const target = <HTMLDivElement>event.event.target;\n\n const dropZoneId = target.id ? target.id : target.parentElement?.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 const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);\n if (dropControl.hideDrop || dropControl.preventDrop) {\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\nclass DropControl {\n constructor(\n public hideDrop: boolean,\n public preventDrop: boolean,\n public preventDropReason: string = ''\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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cluetec/ngcx-tree",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "19.0.0",
|
|
4
4
|
"description": "An angular tree component with 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": "^
|
|
14
|
-
"@angular/core": "^
|
|
15
|
-
"@angular/cdk": "^
|
|
13
|
+
"@angular/common": "^19.0.0",
|
|
14
|
+
"@angular/core": "^19.0.0",
|
|
15
|
+
"@angular/cdk": "^19.0.0"
|
|
16
16
|
},
|
|
17
17
|
"sideEffects": false,
|
|
18
18
|
"keywords": [
|
|
@@ -32,8 +32,6 @@
|
|
|
32
32
|
},
|
|
33
33
|
".": {
|
|
34
34
|
"types": "./index.d.ts",
|
|
35
|
-
"esm2022": "./esm2022/cluetec-ngcx-tree.mjs",
|
|
36
|
-
"esm": "./esm2022/cluetec-ngcx-tree.mjs",
|
|
37
35
|
"default": "./fesm2022/cluetec-ngcx-tree.mjs"
|
|
38
36
|
}
|
|
39
37
|
},
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1ZXRlYy1uZ2N4LXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uZ2N4LXRyZWUvc3JjL2NsdWV0ZWMtbmdjeC10cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { DataSource } from '@angular/cdk/collections';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
export class NgcxTreeDataSource extends DataSource {
|
|
4
|
-
constructor(data) {
|
|
5
|
-
super();
|
|
6
|
-
this.data$ = new BehaviorSubject(data);
|
|
7
|
-
}
|
|
8
|
-
connect() {
|
|
9
|
-
return this.data$.asObservable();
|
|
10
|
-
}
|
|
11
|
-
disconnect() { }
|
|
12
|
-
update(data) {
|
|
13
|
-
this.data$.next([...data]);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLWRhdGEuc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS1kYXRhLnNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUVuRCxNQUFNLE9BQU8sa0JBQXNCLFNBQVEsVUFBYTtJQUd0RCxZQUFZLElBQVM7UUFDbkIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxVQUFVLEtBQVUsQ0FBQztJQUVyQixNQUFNLENBQUMsSUFBUztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBjbGFzcyBOZ2N4VHJlZURhdGFTb3VyY2U8VD4gZXh0ZW5kcyBEYXRhU291cmNlPFQ+IHtcbiAgZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDxUW10+O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFRbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZGF0YSk7XG4gIH1cblxuICBjb25uZWN0KCk6IE9ic2VydmFibGU8cmVhZG9ubHkgVFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHt9XG5cbiAgdXBkYXRlKGRhdGE6IFRbXSkge1xuICAgIHRoaXMuZGF0YSQubmV4dChbLi4uZGF0YV0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLW1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUtbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVDb25maWc8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICB0cmVlTm9kZUNvbnRlbnRDb21wb25lbnQ/OiBUeXBlPE5nY3hDdXN0b21Db21wb25lbnQ8VD4+O1xuICB0cmVlTm9kZUNvbnRlbnRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgYWxsb3dEcm9wPzogKFxuICAgIG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gICAgaW50b05vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+XG4gICkgPT4gYm9vbGVhbjtcbiAgcHJldmVudERyb3BSZWFzb24/OiAoXG4gICAgbm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgICBpbnRvTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5cbiAgKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFsbG93RHJhZz86IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBib29sZWFuO1xuICBhbGxvd1NlbGVjdGlvbj86IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5nY3hDdXN0b21Db21wb25lbnQ8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICBub2RlV3JhcHBlcj86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGN1c3RvbUV2ZW50PzogRXZlbnRFbWl0dGVyPGFueT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVOb2RlIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU/OiBhbnk7XG4gIGZhSWNvbj86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBOZ2N4VHJlZU5vZGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+IHtcbiAgaWQ6IHN0cmluZztcbiAgZGF0YTogVDtcbiAgZGVwdGg6IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgaXNTZWxlY3RhYmxlPzogYm9vbGVhbjtcbiAgaXNGaXJzdENoaWxkOiBib29sZWFuO1xuICBpc0xhc3RDaGlsZDogYm9vbGVhbjtcbiAgY2hpbGRyZW46IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXTtcbiAgcGFyZW50PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgbmV4dD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIHByZXZpb3VzPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGVDb21wb25lbnQ8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICBub2RlV3JhcHBlcj86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVOb2RlTW92ZWRFdmVudDxUIGV4dGVuZHMgTmdjeFRyZWVOb2RlPiB7XG4gIG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIHBhcmVudD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGFmdGVyTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGJlZm9yZU5vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+O1xufVxuIl19
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { CdkTreeModule } from '@angular/cdk/tree';
|
|
2
|
-
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
3
|
-
import { NgIf, NgTemplateOutlet } from '@angular/common';
|
|
4
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/cdk/tree";
|
|
7
|
-
export class NgcxTreeNodeComponent {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.isSelected = false;
|
|
10
|
-
this.customEvent = new EventEmitter();
|
|
11
|
-
this.clickEvent = new EventEmitter();
|
|
12
|
-
this.ngUnsubscribe = new Subject();
|
|
13
|
-
}
|
|
14
|
-
ngOnInit() {
|
|
15
|
-
if (this.vcRef && this.treeConfig?.treeNodeContentComponent) {
|
|
16
|
-
const nodeComponent = this.vcRef.createComponent(this.treeConfig.treeNodeContentComponent);
|
|
17
|
-
nodeComponent.instance.nodeWrapper = this.nodeWrapper;
|
|
18
|
-
nodeComponent.instance.customEvent
|
|
19
|
-
?.pipe(takeUntil(this.ngUnsubscribe))
|
|
20
|
-
.subscribe((value) => this.customEvent.emit(value));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
ngOnDestroy() {
|
|
24
|
-
this.ngUnsubscribe.next(undefined);
|
|
25
|
-
this.ngUnsubscribe.complete();
|
|
26
|
-
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgcxTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgcxTreeNodeComponent, isStandalone: true, selector: "ngcx-tree-node", inputs: { nodeWrapper: "nodeWrapper", treeControl: "treeControl", treeConfig: "treeConfig", isSelected: "isSelected" }, outputs: { customEvent: "customEvent", clickEvent: "clickEvent" }, viewQueries: [{ propertyName: "vcRef", first: true, predicate: ["ref"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<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", styles: [".tree-node-content-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%}.tree-node-content-container.is-selectable{cursor:pointer}.tree-node-content-container .tree-node-expand-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:30px;height:30px;margin-right:5px}.tree-node-content-container .tree-node-expand-container>.tree-node-expand{color:#2587be;background:none;border:none;font:inherit;cursor:pointer;outline:inherit;width:30px;height:30px;display:flex;justify-content:center;align-items:center}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron{width:10px;transition:transform .1s ease-in-out}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron.rotate{transform:rotate(90deg)}.tree-node-content-container .tree-node-icon-container{margin-right:7px;color:#2587be}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
29
|
-
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgcxTreeNodeComponent, decorators: [{
|
|
31
|
-
type: Component,
|
|
32
|
-
args: [{ selector: 'ngcx-tree-node', standalone: true, imports: [CdkTreeModule, NgTemplateOutlet, NgIf], template: "<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", styles: [".tree-node-content-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;width:100%}.tree-node-content-container.is-selectable{cursor:pointer}.tree-node-content-container .tree-node-expand-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:30px;height:30px;margin-right:5px}.tree-node-content-container .tree-node-expand-container>.tree-node-expand{color:#2587be;background:none;border:none;font:inherit;cursor:pointer;outline:inherit;width:30px;height:30px;display:flex;justify-content:center;align-items:center}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron{width:10px;transition:transform .1s ease-in-out}.tree-node-content-container .tree-node-expand-container>.tree-node-expand .chevron.rotate{transform:rotate(90deg)}.tree-node-content-container .tree-node-icon-container{margin-right:7px;color:#2587be}\n"] }]
|
|
33
|
-
}], propDecorators: { nodeWrapper: [{
|
|
34
|
-
type: Input
|
|
35
|
-
}], treeControl: [{
|
|
36
|
-
type: Input
|
|
37
|
-
}], treeConfig: [{
|
|
38
|
-
type: Input
|
|
39
|
-
}], isSelected: [{
|
|
40
|
-
type: Input
|
|
41
|
-
}], customEvent: [{
|
|
42
|
-
type: Output
|
|
43
|
-
}], clickEvent: [{
|
|
44
|
-
type: Output
|
|
45
|
-
}], vcRef: [{
|
|
46
|
-
type: ViewChild,
|
|
47
|
-
args: ['ref', { read: ViewContainerRef, static: true }]
|
|
48
|
-
}] } });
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS1ub2RlL25nY3gtdHJlZS1ub2RlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUtbm9kZS9uZ2N4LXRyZWUtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQVMxQyxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBV1csZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVsQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLaEQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0tBbUIvQjtJQWpCQyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FDekMsQ0FBQztZQUNGLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFFdEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXO2dCQUNoQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNwQyxTQUFTLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDOytHQTlCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiw4VUFTTixnQkFBZ0IsMkNDaEM1QyxxMURBK0NBLGs5QkQxQlksYUFBYSwySkFBRSxnQkFBZ0Isb0pBQUUsSUFBSTs7NEZBRXBDLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxnQkFBZ0IsY0FHZCxJQUFJLFdBQ1AsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDOzhCQUd2QyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFHUCxLQUFLO3NCQURKLFNBQVM7dUJBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtUcmVlTW9kdWxlLCBOZXN0ZWRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nY3hUcmVlQ29uZmlnLCBOZ2N4VHJlZU5vZGVXcmFwcGVyIH0gZnJvbSAnLi4vbmdjeC10cmVlLW1vZGVscyc7XG5cbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nY3gtdHJlZS1ub2RlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nY3gtdHJlZS1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmdjeC10cmVlLW5vZGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Nka1RyZWVNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nSWZdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ2N4VHJlZU5vZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIG5vZGVXcmFwcGVyITogTmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+O1xuICBASW5wdXQoKSB0cmVlQ29udHJvbCE6IE5lc3RlZFRyZWVDb250cm9sPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Piwgc3RyaW5nPjtcbiAgQElucHV0KCkgdHJlZUNvbmZpZz86IE5nY3hUcmVlQ29uZmlnPGFueT47XG4gIEBJbnB1dCgpIGlzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncmVmJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgdmNSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnZjUmVmICYmIHRoaXMudHJlZUNvbmZpZz8udHJlZU5vZGVDb250ZW50Q29tcG9uZW50KSB7XG4gICAgICBjb25zdCBub2RlQ29tcG9uZW50ID0gdGhpcy52Y1JlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgIHRoaXMudHJlZUNvbmZpZy50cmVlTm9kZUNvbnRlbnRDb21wb25lbnRcbiAgICAgICk7XG4gICAgICBub2RlQ29tcG9uZW50Lmluc3RhbmNlLm5vZGVXcmFwcGVyID0gdGhpcy5ub2RlV3JhcHBlcjtcblxuICAgICAgbm9kZUNvbXBvbmVudC5pbnN0YW5jZS5jdXN0b21FdmVudFxuICAgICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHRoaXMuY3VzdG9tRXZlbnQuZW1pdCh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGVudC1jb250YWluZXJcIlxuICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZFwiXG4gIFtjbGFzcy5maXJzdF09XCJub2RlV3JhcHBlci5pc0ZpcnN0Q2hpbGRcIlxuICBbY2xhc3MubGFzdF09XCJub2RlV3JhcHBlci5pc0xhc3RDaGlsZFwiXG4gIFtjbGFzcy5pcy1zZWxlY3RhYmxlXT1cIm5vZGVXcmFwcGVyLmlzU2VsZWN0YWJsZVwiXG4gIChjbGljayk9XCJjbGlja0V2ZW50LmVtaXQoKVwiPlxuICA8ZGl2IGNsYXNzPVwidHJlZS1ub2RlLWV4cGFuZC1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cIm5vZGVXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA+IDBcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtZXhwYW5kXCJcbiAgICAgIGNka1RyZWVOb2RlVG9nZ2xlXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGVXcmFwcGVyLmRhdGEudGl0bGVcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2hldnJvblwiIFtjbGFzcy5yb3RhdGVdPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlV3JhcHBlcilcIj5cbiAgICAgICAgPHN2ZyBpZD1cImFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA5IDlcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIm0yLjgzLjA5bDQuMiw0LjJjLjA1LjA1LjA5LjE0LjA5LjIxcy0uMDQuMTUtLjA5LjIxbC00LjIsNC4yYy0uMDUuMDUtLjE0LjA5LS4yMS4wOXMtLjE1LS4wNC0uMjEtLjA5bC0uNDUtLjQ1Yy0uMDUtLjA1LS4wOS0uMTMtLjA5LS4yMSwwLS4wNy4wNC0uMTUuMDktLjIxbDMuNTQtMy41NEwxLjk3Ljk2Yy0uMDUtLjA1LS4wOS0uMTQtLjA5LS4yMXMuMDQtLjE1LjA5LS4yMWwuNDUtLjQ1Yy4wNS0uMDUuMTQtLjA5LjIxLS4wOXMuMTUuMDQuMjEuMDlaXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZmlsbDogdmFyKC0taWNvbi1jb2xvciwgIzMzMyk7IHN0cm9rZS13aWR0aDogMHB4XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzbWFsbC1ob3Jpem9udGFsLXRyZWUtbGluZVwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidHJlZS1ub2RlLWljb24tY29udGFpbmVyXCIgKm5nSWY9XCJub2RlV3JhcHBlci5kYXRhLmZhSWNvblwiPlxuICAgIDxpIGNsYXNzPVwiZmFcIiBbY2xhc3NdPVwibm9kZVdyYXBwZXIuZGF0YS5mYUljb25cIj48L2k+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidHJlZS1ub2RlLWNvbnRlbnRcIj5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgIXRyZWVDb25maWc/LnRyZWVOb2RlQ29udGVudENvbXBvbmVudCAmJlxuICAgICAgICAhdHJlZUNvbmZpZz8udHJlZU5vZGVDb250ZW50VGVtcGxhdGVcbiAgICAgIFwiPlxuICAgICAge3sgbm9kZVdyYXBwZXIuZGF0YS50aXRsZSB9fVxuICAgIDwvc3Bhbj5cbiAgICA8bmctY29udGFpbmVyICNyZWY+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyZWVDb25maWc/LnRyZWVOb2RlQ29udGVudFRlbXBsYXRlIGFzIHRlbXBsYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgdGVtcGxhdGU7XG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgbm9kZVdyYXBwZXI6IG5vZGVXcmFwcGVyXG4gICAgICAgICAgfVxuICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const isParentOf = (parent, node) => {
|
|
2
|
-
if (!node.parent) {
|
|
3
|
-
return false;
|
|
4
|
-
}
|
|
5
|
-
if (parent.id === node.parent.id) {
|
|
6
|
-
return true;
|
|
7
|
-
}
|
|
8
|
-
return isParentOf(parent, node.parent);
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FDeEIsTUFBZ0MsRUFDaEMsSUFBOEIsRUFDckIsRUFBRTtJQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ2N4VHJlZU5vZGVXcmFwcGVyIH0gZnJvbSAnLi9uZ2N4LXRyZWUtbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGlzUGFyZW50T2YgPSAoXG4gIHBhcmVudDogTmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+LFxuICBub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT5cbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIW5vZGUucGFyZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChwYXJlbnQuaWQgPT09IG5vZGUucGFyZW50LmlkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGlzUGFyZW50T2YocGFyZW50LCBub2RlLnBhcmVudCk7XG59O1xuIl19
|
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
import { DragDropModule, } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { CdkTreeModule, NestedTreeControl, } from '@angular/cdk/tree';
|
|
3
|
-
import { NgIf } from '@angular/common';
|
|
4
|
-
import { Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
|
|
5
|
-
import { NgcxTreeDataSource } from './ngcx-tree-data.source';
|
|
6
|
-
import { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';
|
|
7
|
-
import { isParentOf } from './ngcx-tree-utils';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/cdk/tree";
|
|
10
|
-
import * as i2 from "@angular/cdk/drag-drop";
|
|
11
|
-
export class NgcxTreeComponent {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.nodeMoved = new EventEmitter();
|
|
14
|
-
this.customEvent = new EventEmitter();
|
|
15
|
-
this.clickEvent = new EventEmitter();
|
|
16
|
-
this.selectEvent = new EventEmitter();
|
|
17
|
-
/**
|
|
18
|
-
* Api for finding and selecting node. Extends from the CDK treeControl for expanding/collapsing the tree
|
|
19
|
-
*/
|
|
20
|
-
this.treeControl = new NgcxTreeControl(this, (node) => node.children, {
|
|
21
|
-
trackBy: (node) => node.id,
|
|
22
|
-
});
|
|
23
|
-
this.dataSource = new NgcxTreeDataSource([]);
|
|
24
|
-
this.DropType = DropType;
|
|
25
|
-
this.disable = () => false;
|
|
26
|
-
}
|
|
27
|
-
ngOnChanges() {
|
|
28
|
-
this.updateTree();
|
|
29
|
-
}
|
|
30
|
-
updateTree() {
|
|
31
|
-
const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);
|
|
32
|
-
this.dataSource = new NgcxTreeDataSource(wrapperNodes);
|
|
33
|
-
this.treeControl.dataNodes = this.dataSource.data$.value;
|
|
34
|
-
}
|
|
35
|
-
createWrapperNodes(nodes, parent, depth = 0) {
|
|
36
|
-
const childCount = nodes.length;
|
|
37
|
-
const wrapperNodes = nodes.map((node, idx) => {
|
|
38
|
-
const nodeWrapper = {
|
|
39
|
-
id: node.id,
|
|
40
|
-
data: node,
|
|
41
|
-
isFirstChild: idx === 0,
|
|
42
|
-
isLastChild: idx === childCount - 1,
|
|
43
|
-
index: idx,
|
|
44
|
-
parent: parent,
|
|
45
|
-
depth: depth,
|
|
46
|
-
children: [],
|
|
47
|
-
};
|
|
48
|
-
nodeWrapper.children = node.children
|
|
49
|
-
? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)
|
|
50
|
-
: [];
|
|
51
|
-
return nodeWrapper;
|
|
52
|
-
});
|
|
53
|
-
wrapperNodes.forEach((wrapperNode) => {
|
|
54
|
-
if (!wrapperNode.isLastChild) {
|
|
55
|
-
wrapperNode.next = wrapperNodes[wrapperNode.index + 1];
|
|
56
|
-
}
|
|
57
|
-
if (!wrapperNode.isFirstChild) {
|
|
58
|
-
wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];
|
|
59
|
-
}
|
|
60
|
-
if (this.config?.allowSelection?.(wrapperNode)) {
|
|
61
|
-
wrapperNode.isSelectable = true;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
return wrapperNodes;
|
|
65
|
-
}
|
|
66
|
-
hideDrop(dropNode, dropType) {
|
|
67
|
-
if (!this.dragging ||
|
|
68
|
-
this.dragging.id === dropNode.id ||
|
|
69
|
-
isParentOf(this.dragging, dropNode)) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
if (dropType == DropType.DROP_INTO &&
|
|
73
|
-
dropNode.id === this.dragging.parent?.id) {
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
if (dropType == DropType.DROP_AFTER &&
|
|
77
|
-
dropNode.next?.id === this.dragging.id) {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
if (dropType == DropType.DROP_BEFORE &&
|
|
81
|
-
dropNode.previous?.id === this.dragging.id) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
allowDrop(dropNode, dropType) {
|
|
87
|
-
const hideDrop = this.hideDrop(dropNode, dropType);
|
|
88
|
-
const intoNode = dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;
|
|
89
|
-
let preventDropReason;
|
|
90
|
-
let allowDrop = true;
|
|
91
|
-
if (this.config?.preventDropReason && this.dragging) {
|
|
92
|
-
preventDropReason = this.config.preventDropReason(this.dragging, intoNode);
|
|
93
|
-
}
|
|
94
|
-
if (this.config?.allowDrop && this.dragging) {
|
|
95
|
-
allowDrop = this.config.allowDrop(this.dragging, intoNode);
|
|
96
|
-
}
|
|
97
|
-
return new DropControl(hideDrop, !allowDrop || !!preventDropReason, preventDropReason);
|
|
98
|
-
}
|
|
99
|
-
// prevent drop directly after a node on same level, that is expanded
|
|
100
|
-
sortPredicate() {
|
|
101
|
-
return (index, _drag, drop) => {
|
|
102
|
-
return index == 0 || !this.treeControl.isExpanded(drop.data);
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
disableDrag(node) {
|
|
106
|
-
return this.config?.allowDrag ? !this.config.allowDrag(node) : false;
|
|
107
|
-
}
|
|
108
|
-
keyDownArrowUp(event) {
|
|
109
|
-
if (this.selectedNode) {
|
|
110
|
-
if (!this.selectedNode.isFirstChild) {
|
|
111
|
-
this.selectNode(this.selectedNode.previous);
|
|
112
|
-
}
|
|
113
|
-
else if (this.selectedNode.parent) {
|
|
114
|
-
this.selectNode(this.selectedNode.parent);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const nodes = this.dataSource.data$.value;
|
|
119
|
-
if (nodes.length > 0) {
|
|
120
|
-
this.selectNode(nodes[nodes.length - 1]);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
event.preventDefault();
|
|
124
|
-
}
|
|
125
|
-
keyDownArrowDown(event) {
|
|
126
|
-
if (this.selectedNode) {
|
|
127
|
-
if (!this.selectedNode.isLastChild) {
|
|
128
|
-
this.selectNode(this.selectedNode.next);
|
|
129
|
-
}
|
|
130
|
-
else if (this.selectedNode.parent?.next) {
|
|
131
|
-
this.selectNode(this.selectedNode.parent.next);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
const nodes = this.dataSource.data$.value;
|
|
136
|
-
if (nodes.length > 0) {
|
|
137
|
-
this.selectNode(nodes[0]);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
event.preventDefault();
|
|
141
|
-
}
|
|
142
|
-
keyDownArrowLeft(event) {
|
|
143
|
-
if (this.selectedNode) {
|
|
144
|
-
if (this.treeControl.isExpanded(this.selectedNode)) {
|
|
145
|
-
this.treeControl.collapse(this.selectedNode);
|
|
146
|
-
}
|
|
147
|
-
else if (this.selectedNode?.parent) {
|
|
148
|
-
this.selectNode(this.selectedNode.parent);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
const nodes = this.dataSource.data$.value;
|
|
153
|
-
if (nodes.length > 0) {
|
|
154
|
-
this.selectNode(nodes[0]);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
event.preventDefault();
|
|
158
|
-
}
|
|
159
|
-
keyDownArrowRight(event) {
|
|
160
|
-
if (this.selectedNode && this.selectedNode.children.length > 0) {
|
|
161
|
-
this.selectNode(this.selectedNode.children[0]);
|
|
162
|
-
}
|
|
163
|
-
else if (!this.selectedNode) {
|
|
164
|
-
const nodes = this.dataSource.data$.value;
|
|
165
|
-
if (nodes.length > 0) {
|
|
166
|
-
this.selectNode(nodes[0]);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
event.preventDefault();
|
|
170
|
-
}
|
|
171
|
-
keyEscapeWhileDragging() {
|
|
172
|
-
if (this.dragging) {
|
|
173
|
-
this.canceledByEsc = true;
|
|
174
|
-
document.dispatchEvent(new Event('mouseup'));
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
handleDragRelease(event) {
|
|
178
|
-
this.handleDragReleaseInternal(event);
|
|
179
|
-
this.dragging = undefined;
|
|
180
|
-
}
|
|
181
|
-
handleDragReleaseInternal(event) {
|
|
182
|
-
const movedNode = event.source.data;
|
|
183
|
-
const target = event.event.target;
|
|
184
|
-
const dropZoneId = target.id ?? target.parentElement?.id;
|
|
185
|
-
if (!dropZoneId) {
|
|
186
|
-
// no valid drop zone
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const dropZoneInfo = new DropZoneInfo(dropZoneId);
|
|
190
|
-
const toNode = this.treeControl.findNodeById(dropZoneInfo.nodeId);
|
|
191
|
-
if (!toNode) {
|
|
192
|
-
console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);
|
|
196
|
-
if (dropControl.hideDrop || dropControl.preventDrop) {
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
// dropType undefined can happen if dropped directly without moving
|
|
200
|
-
if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {
|
|
201
|
-
this.canceledByEsc = false;
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const insertIntoNode = dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;
|
|
205
|
-
const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;
|
|
206
|
-
const addAtNodeIdx = this.findAddIndex(dropZoneInfo, insertIntoNode, wrapperList);
|
|
207
|
-
const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);
|
|
208
|
-
// add element to new Position, subtract one if inserted in same list after the remove position
|
|
209
|
-
(insertIntoNode?.data.children ?? this.nodes).splice(movedNode.parent?.id === insertIntoNode?.id &&
|
|
210
|
-
removedFromIdx < addAtNodeIdx
|
|
211
|
-
? addAtNodeIdx - 1
|
|
212
|
-
: addAtNodeIdx, 0, movedNode.data);
|
|
213
|
-
const afterNodeIdx = addAtNodeIdx - 1;
|
|
214
|
-
const afterNode = afterNodeIdx > -1 && wrapperList.length > afterNodeIdx
|
|
215
|
-
? wrapperList[afterNodeIdx]
|
|
216
|
-
: undefined;
|
|
217
|
-
const beforeNode = addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx
|
|
218
|
-
? wrapperList[addAtNodeIdx]
|
|
219
|
-
: undefined;
|
|
220
|
-
this.nodeMoved.emit({
|
|
221
|
-
node: movedNode,
|
|
222
|
-
parent: dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,
|
|
223
|
-
afterNode: afterNode,
|
|
224
|
-
beforeNode: beforeNode,
|
|
225
|
-
});
|
|
226
|
-
this.dataSource = new NgcxTreeDataSource(this.createWrapperNodes(this.nodes));
|
|
227
|
-
this.treeControl.dataNodes = this.dataSource.data$.value;
|
|
228
|
-
}
|
|
229
|
-
findAddIndex(dropZoneInfo, insertIntoNode, insertIntoList) {
|
|
230
|
-
if (insertIntoNode &&
|
|
231
|
-
dropZoneInfo.dropType === DropType.DROP_INTO &&
|
|
232
|
-
!insertIntoNode.data.children) {
|
|
233
|
-
insertIntoNode.data.children = [];
|
|
234
|
-
}
|
|
235
|
-
let addAtNodeIdx = 0;
|
|
236
|
-
if (dropZoneInfo.dropType === DropType.DROP_AFTER ||
|
|
237
|
-
dropZoneInfo.dropType === DropType.DROP_BEFORE) {
|
|
238
|
-
addAtNodeIdx = insertIntoList.findIndex((child) => child.id === dropZoneInfo.nodeId);
|
|
239
|
-
if (dropZoneInfo.dropType === DropType.DROP_AFTER) {
|
|
240
|
-
addAtNodeIdx++;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return addAtNodeIdx;
|
|
244
|
-
}
|
|
245
|
-
removeElementFromPreviousPosition(movedNode) {
|
|
246
|
-
const removeFromList = movedNode.parent?.data.children ?? this.nodes;
|
|
247
|
-
const removeIndex = removeFromList.findIndex((child) => child.id === movedNode.id);
|
|
248
|
-
removeFromList.splice(removeIndex, 1);
|
|
249
|
-
return removeIndex;
|
|
250
|
-
}
|
|
251
|
-
nodeClicked(nodeWrapper) {
|
|
252
|
-
this.clickEvent.emit(nodeWrapper);
|
|
253
|
-
if (nodeWrapper.isSelectable) {
|
|
254
|
-
this.selectedNode =
|
|
255
|
-
nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;
|
|
256
|
-
this.selectEvent.emit(this.selectedNode);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
selectNode(nodeWrapper) {
|
|
260
|
-
if (!nodeWrapper || nodeWrapper.isSelectable) {
|
|
261
|
-
this.selectedNode = nodeWrapper;
|
|
262
|
-
let expandNode = this.selectedNode?.parent;
|
|
263
|
-
while (expandNode) {
|
|
264
|
-
this.treeControl.expand(expandNode);
|
|
265
|
-
expandNode = expandNode.parent;
|
|
266
|
-
}
|
|
267
|
-
this.selectEvent.emit(this.selectedNode);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgcxTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
271
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone.cdk-drop-list-receiving:hover .tooltip,.tree-node-container-drop-zone.cdk-drop-list-dragging .tooltip{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
272
|
-
}
|
|
273
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgcxTreeComponent, decorators: [{
|
|
274
|
-
type: Component,
|
|
275
|
-
args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<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 *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\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]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </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", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone.cdk-drop-list-receiving:hover .tooltip,.tree-node-container-drop-zone.cdk-drop-list-dragging .tooltip{display:block}\n"] }]
|
|
276
|
-
}], propDecorators: { nodes: [{
|
|
277
|
-
type: Input
|
|
278
|
-
}], config: [{
|
|
279
|
-
type: Input
|
|
280
|
-
}], nodeMoved: [{
|
|
281
|
-
type: Output
|
|
282
|
-
}], customEvent: [{
|
|
283
|
-
type: Output
|
|
284
|
-
}], clickEvent: [{
|
|
285
|
-
type: Output
|
|
286
|
-
}], selectEvent: [{
|
|
287
|
-
type: Output
|
|
288
|
-
}], keyEscapeWhileDragging: [{
|
|
289
|
-
type: HostListener,
|
|
290
|
-
args: ['window:keydown.escape']
|
|
291
|
-
}] } });
|
|
292
|
-
var DropType;
|
|
293
|
-
(function (DropType) {
|
|
294
|
-
DropType["DROP_AFTER"] = "DROP_AFTER";
|
|
295
|
-
DropType["DROP_BEFORE"] = "DROP_BEFORE";
|
|
296
|
-
DropType["DROP_INTO"] = "DROP_INTO";
|
|
297
|
-
})(DropType || (DropType = {}));
|
|
298
|
-
export class NgcxTreeControl extends NestedTreeControl {
|
|
299
|
-
constructor(treeComponent, getChildren, options) {
|
|
300
|
-
super(getChildren, options);
|
|
301
|
-
this.treeComponent = treeComponent;
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* select a node by id. the selectEvent is fired afterwards.
|
|
305
|
-
*/
|
|
306
|
-
selectNodeById(id) {
|
|
307
|
-
this.treeComponent.selectNode(this.findNodeById(id));
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* find a node by id.
|
|
311
|
-
*/
|
|
312
|
-
findNodeById(id) {
|
|
313
|
-
return this.findNodeByIdInNodes(this.treeComponent.dataSource.data$.value, id);
|
|
314
|
-
}
|
|
315
|
-
findNodeByIdInNodes(nodes, id) {
|
|
316
|
-
for (const node of nodes) {
|
|
317
|
-
if (node.id === id) {
|
|
318
|
-
return node;
|
|
319
|
-
}
|
|
320
|
-
if (node.children?.length > 0) {
|
|
321
|
-
const foundNode = this.findNodeByIdInNodes(node.children, id);
|
|
322
|
-
if (foundNode) {
|
|
323
|
-
return foundNode;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return undefined;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
class DropZoneInfo {
|
|
331
|
-
constructor(id) {
|
|
332
|
-
const pos = id.indexOf('_');
|
|
333
|
-
this.nodeId = id.substring(0, pos);
|
|
334
|
-
this.dropType = id.substring(pos + 1);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
class DropControl {
|
|
338
|
-
constructor(hideDrop, preventDrop, preventDropReason = '') {
|
|
339
|
-
this.hideDrop = hideDrop;
|
|
340
|
-
this.preventDrop = preventDrop;
|
|
341
|
-
this.preventDropReason = preventDropReason;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FFbEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFPN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBUy9DLE1BQU0sT0FBTyxpQkFBaUI7SUFQOUI7UUFXWSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFDMUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO1FBQ3BDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN4RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRW5FOztXQUVHO1FBQ2EsZ0JBQVcsR0FBdUIsSUFBSSxlQUFlLENBQ25FLElBQUksRUFDSixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDdkI7WUFDRSxPQUFPLEVB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LE1BQU0sV0FBVztJQUNmLFlBQ1MsUUFBaUIsRUFDakIsV0FBb0IsRUFDcEIsb0JBQTRCLEVBQUU7UUFGOUIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUNwQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWE7SUFDcEMsQ0FBQztDQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2RrRHJhZyxcbiAgQ2RrRHJhZ1JlbGVhc2UsXG4gIENka0Ryb3BMaXN0LFxuICBEcmFnRHJvcE1vZHVsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBDZGtUcmVlTW9kdWxlLFxuICBOZXN0ZWRUcmVlQ29udHJvbCxcbiAgTmVzdGVkVHJlZUNvbnRyb2xPcHRpb25zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2N4VHJlZURhdGFTb3VyY2UgfSBmcm9tICcuL25nY3gtdHJlZS1kYXRhLnNvdXJjZSc7XG5pbXBvcnQge1xuICBOZ2N4VHJlZUNvbmZpZyxcbiAgTmdjeFRyZWVOb2RlLFxuICBOZ2N4VHJlZU5vZGVNb3ZlZEV2ZW50LFxuICBOZ2N4VHJlZU5vZGVXcmFwcGVyLFxufSBmcm9tICcuL25nY3gtdHJlZS1tb2RlbHMnO1xuaW1wb3J0IHsgTmdjeFRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9uZ2N4LXRyZWUtbm9kZS9uZ2N4LXRyZWUtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNQYXJlbnRPZiB9IGZyb20gJy4vbmdjeC10cmVlLXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmdjeC10cmVlJyxcbiAgdGVtcGxhdGVVcmw6ICduZ2N4LXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbmdjeC10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDZGtUcmVlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTmdjeFRyZWVOb2RlQ29tcG9uZW50LCBOZ0lmXSxcbn0pXG5leHBvcnQgY2xhc3MgTmdjeFRyZWVDb21wb25lbnQ8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4gaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBub2Rlcz86IE5nY3hUcmVlTm9kZVtdO1xuICBASW5wdXQoKSBjb25maWc/OiBOZ2N4VHJlZUNvbmZpZzxUPjtcblxuICBAT3V0cHV0KCkgbm9kZU1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxOZ2N4VHJlZU5vZGVNb3ZlZEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4+KCk7XG5cbiAgLyoqXG4gICAqIEFwaSBmb3IgZmluZGluZyBhbmQgc2VsZWN0aW5nIG5vZGUuIEV4dGVuZHMgZnJvbSB0aGUgQ0RLIHRyZWVDb250cm9sIGZvciBleHBhbmRpbmcvY29sbGFwc2luZyB0aGUgdHJlZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyZWVDb250cm9sOiBOZ2N4VHJlZUNvbnRyb2w8VD4gPSBuZXcgTmdjeFRyZWVDb250cm9sPFQ+KFxuICAgIHRoaXMsXG4gICAgKG5vZGUpID0+IG5vZGUuY2hpbGRyZW4sXG4gICAge1xuICAgICAgdHJhY2tCeTogKG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4pID0+IG5vZGUuaWQsXG4gICAgfVxuICApO1xuXG4gIGRhdGFTb3VyY2U6IE5nY3hUcmVlRGF0YVNvdXJjZTxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PiA9XG4gICAgbmV3IE5nY3hUcmVlRGF0YVNvdXJjZTxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PihbXSk7XG5cbiAgcHJvdGVjdGVkIGRyYWdnaW5nPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcblxuICBwcm90ZWN0ZWQgc2VsZWN0ZWROb2RlPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRHJvcFR5cGUgPSBEcm9wVHlwZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzYWJsZSA9ICgpID0+IGZhbHNlO1xuXG4gIHByaXZhdGUgY2FuY2VsZWRCeUVzYz86IGJvb2xlYW47XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy51cGRhdGVUcmVlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRyZWUoKSB7XG4gICAgY29uc3Qgd3JhcHBlck5vZGVzID0gdGhpcy5jcmVhdGVXcmFwcGVyTm9kZXModGhpcy5ub2RlcyA/PyBbXSk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE5nY3hUcmVlRGF0YVNvdXJjZSh3cmFwcGVyTm9kZXMpO1xuICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXcmFwcGVyTm9kZXMoXG4gICAgbm9kZXM6IE5nY3hUcmVlTm9kZVtdLFxuICAgIHBhcmVudD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gICAgZGVwdGg6IG51bWJlciA9IDBcbiAgKTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPltdIHtcbiAgICBjb25zdCBjaGlsZENvdW50ID0gbm9kZXMubGVuZ3RoO1xuICAgIGNvbnN0IHdyYXBwZXJOb2RlcyA9IG5vZGVzLm1hcCgobm9kZSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCBub2RlV3JhcHBlcjogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPiA9IHtcbiAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgIGRhdGE6IDxUPm5vZGUsXG4gICAgICAgIGlzRmlyc3RDaGlsZDogaWR4ID09PSAwLFxuICAgICAgICBpc0xhc3RDaGlsZDogaWR4ID09PSBjaGlsZENvdW50IC0gMSxcbiAgICAgICAgaW5kZXg6IGlkeCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICAgIG5vZGVXcmFwcGVyLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlblxuICAgICAgICA/IHRoaXMuY3JlYXRlV3JhcHBlck5vZGVzKG5vZGUuY2hpbGRyZW4sIG5vZGVXcmFwcGVyLCBkZXB0aCArIDEpXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiBub2RlV3JhcHBlcjtcbiAgICB9KTtcbiAgICB3cmFwcGVyTm9kZXMuZm9yRWFjaCgod3JhcHBlck5vZGUpID0+IHtcbiAgICAgIGlmICghd3JhcHBlck5vZGUuaXNMYXN0Q2hpbGQpIHtcbiAgICAgICAgd3JhcHBlck5vZGUubmV4dCA9IHdyYXBwZXJOb2Rlc1t3cmFwcGVyTm9kZS5pbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaWYgKCF3cmFwcGVyTm9kZS5pc0ZpcnN0Q2hpbGQpIHtcbiAgICAgICAgd3JhcHBlck5vZGUucHJldmlvdXMgPSB3cmFwcGVyTm9kZXNbd3JhcHBlck5vZGUuaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uYWxsb3dTZWxlY3Rpb24/Lih3cmFwcGVyTm9kZSkpIHtcbiAgICAgICAgd3JhcHBlck5vZGUuaXNTZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd3JhcHBlck5vZGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVEcm9wKFxuICAgIGRyb3BOb2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+LFxuICAgIGRyb3BUeXBlOiBEcm9wVHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5kcmFnZ2luZyB8fFxuICAgICAgdGhpcy5kcmFnZ2luZy5pZCA9PT0gZHJvcE5vZGUuaWQgfHxcbiAgICAgIGlzUGFyZW50T2YodGhpcy5kcmFnZ2luZywgZHJvcE5vZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZHJvcFR5cGUgPT0gRHJvcFR5cGUuRFJPUF9JTlRPICYmXG4gICAgICBkcm9wTm9kZS5pZCA9PT0gdGhpcy5kcmFnZ2luZy5wYXJlbnQ/LmlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZHJvcFR5cGUgPT0gRHJvcFR5cGUuRFJPUF9BRlRFUiAmJlxuICAgICAgZHJvcE5vZGUubmV4dD8uaWQgPT09IHRoaXMuZHJhZ2dpbmcuaWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0JFRk9SRSAmJlxuICAgICAgZHJvcE5vZGUucHJldmlvdXM/LmlkID09PSB0aGlzLmRyYWdnaW5nLmlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFsbG93RHJvcChcbiAgICBkcm9wTm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgICBkcm9wVHlwZTogRHJvcFR5cGVcbiAgKTogRHJvcENvbnRyb2wge1xuICAgIGNvbnN0IGhpZGVEcm9wID0gdGhpcy5oaWRlRHJvcChkcm9wTm9kZSwgZHJvcFR5cGUpO1xuXG4gICAgY29uc3QgaW50b05vZGUgPVxuICAgICAgZHJvcFR5cGUgPT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gZHJvcE5vZGUgOiBkcm9wTm9kZS5wYXJlbnQ7XG5cbiAgICBsZXQgcHJldmVudERyb3BSZWFzb247XG4gICAgbGV0IGFsbG93RHJvcCA9IHRydWU7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5wcmV2ZW50RHJvcFJlYXNvbiAmJiB0aGlzLmRyYWdnaW5nKSB7XG4gICAgICBwcmV2ZW50RHJvcFJlYXNvbiA9IHRoaXMuY29uZmlnLnByZXZlbnREcm9wUmVhc29uKFxuICAgICAgICB0aGlzLmRyYWdnaW5nLFxuICAgICAgICBpbnRvTm9kZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnPy5hbGxvd0Ryb3AgJiYgdGhpcy5kcmFnZ2luZykge1xuICAgICAgYWxsb3dEcm9wID0gdGhpcy5jb25maWcuYWxsb3dEcm9wKHRoaXMuZHJhZ2dpbmcsIGludG9Ob2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERyb3BDb250cm9sKFxuICAgICAgaGlkZURyb3AsXG4gICAgICAhYWxsb3dEcm9wIHx8ICEhcHJldmVudERyb3BSZWFzb24sXG4gICAgICBwcmV2ZW50RHJvcFJlYXNvblxuICAgICk7XG4gIH1cblxuICAvLyBwcmV2ZW50IGRyb3AgZGlyZWN0bHkgYWZ0ZXIgYSBub2RlIG9uIHNhbWUgbGV2ZWwsIHRoYXQgaXMgZXhwYW5kZWRcbiAgcHJvdGVjdGVkIHNvcnRQcmVkaWNhdGUoKTogKFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZHJhZzogQ2RrRHJhZyxcbiAgICBkcm9wOiBDZGtEcm9wTGlzdFxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgX2RyYWc6IENka0RyYWc8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4sXG4gICAgICBkcm9wOiBDZGtEcm9wTGlzdDxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PlxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09IDAgfHwgIXRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChkcm9wLmRhdGEpO1xuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzYWJsZURyYWcobm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPikge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uYWxsb3dEcmFnID8gIXRoaXMuY29uZmlnLmFsbG93RHJhZyhub2RlKSA6IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGtleURvd25BcnJvd1VwKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5pc0ZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnByZXZpb3VzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93RG93bihldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGUuaXNMYXN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLm5leHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQ/Lm5leHQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudC5uZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUobm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGtleURvd25BcnJvd0xlZnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICBpZiAodGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKHRoaXMuc2VsZWN0ZWROb2RlKSkge1xuICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlKHRoaXMuc2VsZWN0ZWROb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE5vZGU/LnBhcmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUobm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGtleURvd25BcnJvd1JpZ2h0KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSAmJiB0aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUuY2hpbGRyZW5bMF0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5lc2NhcGUnKVxuICBwcm90ZWN0ZWQga2V5RXNjYXBlV2hpbGVEcmFnZ2luZygpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgdGhpcy5jYW5jZWxlZEJ5RXNjID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdtb3VzZXVwJykpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVEcmFnUmVsZWFzZShldmVudDogQ2RrRHJhZ1JlbGVhc2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4pIHtcbiAgICB0aGlzLmhhbmRsZURyYWdSZWxlYXNlSW50ZXJuYWwoZXZlbnQpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdSZWxlYXNlSW50ZXJuYWwoXG4gICAgZXZlbnQ6IENka0RyYWdSZWxlYXNlPE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4+XG4gICkge1xuICAgIGNvbnN0IG1vdmVkTm9kZSA9IGV2ZW50LnNvdXJjZS5kYXRhO1xuICAgIGNvbnN0IHRhcmdldCA9IDxIVE1MRGl2RWxlbWVudD5ldmVudC5ldmVudC50YXJnZXQ7XG4gICAgY29uc3QgZHJvcFpvbmVJZCA9IHRhcmdldC5pZCA/PyB0YXJnZXQucGFyZW50RWxlbWVudD8uaWQ7XG4gICAgaWYgKCFkcm9wWm9uZUlkKSB7XG4gICAgICAvLyBubyB2YWxpZCBkcm9wIHpvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkcm9wWm9uZUluZm8gPSBuZXcgRHJvcFpvbmVJbmZvKGRyb3Bab25lSWQpO1xuICAgIGNvbnN0IHRvTm9kZSA9IHRoaXMudHJlZUNvbnRyb2wuZmluZE5vZGVCeUlkKGRyb3Bab25lSW5mby5ub2RlSWQpO1xuICAgIGlmICghdG9Ob2RlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBub2RlIHdpdGggaWQgJyR7ZHJvcFpvbmVJbmZvLm5vZGVJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3BDb250cm9sID0gdGhpcy5hbGxvd0Ryb3AodG9Ob2RlLCBkcm9wWm9uZUluZm8uZHJvcFR5cGUpO1xuICAgIGlmIChkcm9wQ29udHJvbC5oaWRlRHJvcCB8fCBkcm9wQ29udHJvbC5wcmV2ZW50RHJvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRyb3BUeXBlIHVuZGVmaW5lZCBjYW4gaGFwcGVuIGlmIGRyb3BwZWQgZGlyZWN0bHkgd2l0aG91dCBtb3ZpbmdcbiAgICBpZiAodGhpcy5jYW5jZWxlZEJ5RXNjIHx8IGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNhbmNlbGVkQnlFc2MgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnNlcnRJbnRvTm9kZSA9XG4gICAgICBkcm9wWm9uZUluZm8uZHJvcFR5cGUgPT09IERyb3BUeXBlLkRST1BfSU5UTyA/IHRvTm9kZSA6IHRvTm9kZS5wYXJlbnQ7XG4gICAgY29uc3Qgd3JhcHBlckxpc3QgPSBpbnNlcnRJbnRvTm9kZT8uY2hpbGRyZW4gPz8gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgIGNvbnN0IGFkZEF0Tm9kZUlkeCA9IHRoaXMuZmluZEFkZEluZGV4KFxuICAgICAgZHJvcFpvbmVJbmZvLFxuICAgICAgaW5zZXJ0SW50b05vZGUsXG4gICAgICB3cmFwcGVyTGlzdFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkRnJvbUlkeCA9IHRoaXMucmVtb3ZlRWxlbWVudEZyb21QcmV2aW91c1Bvc2l0aW9uKG1vdmVkTm9kZSk7XG4gICAgLy8gYWRkIGVsZW1lbnQgdG8gbmV3IFBvc2l0aW9uLCBzdWJ0cmFjdCBvbmUgaWYgaW5zZXJ0ZWQgaW4gc2FtZSBsaXN0IGFmdGVyIHRoZSByZW1vdmUgcG9zaXRpb25cbiAgICAoaW5zZXJ0SW50b05vZGU/LmRhdGEuY2hpbGRyZW4gPz8gdGhpcy5ub2RlcyEpLnNwbGljZShcbiAgICAgIG1vdmVkTm9kZS5wYXJlbnQ/LmlkID09PSBpbnNlcnRJbnRvTm9kZT8uaWQgJiZcbiAgICAgICAgcmVtb3ZlZEZyb21JZHggPCBhZGRBdE5vZGVJZHhcbiAgICAgICAgPyBhZGRBdE5vZGVJZHggLSAxXG4gICAgICAgIDogYWRkQXROb2RlSWR4LFxuICAgICAgMCxcbiAgICAgIG1vdmVkTm9kZS5kYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IGFmdGVyTm9kZUlkeCA9IGFkZEF0Tm9kZUlkeCAtIDE7XG4gICAgY29uc3QgYWZ0ZXJOb2RlID1cbiAgICAgIGFmdGVyTm9kZUlkeCA+IC0xICYmIHdyYXBwZXJMaXN0Lmxlbmd0aCA+IGFmdGVyTm9kZUlkeFxuICAgICAgICA/IHdyYXBwZXJMaXN0W2FmdGVyTm9kZUlkeF1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBiZWZvcmVOb2RlID1cbiAgICAgIGFkZEF0Tm9kZUlkeCA+IC0xICYmIHdyYXBwZXJMaXN0Lmxlbmd0aCA+IGFkZEF0Tm9kZUlkeFxuICAgICAgICA/IHdyYXBwZXJMaXN0W2FkZEF0Tm9kZUlkeF1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5ub2RlTW92ZWQuZW1pdCh7XG4gICAgICBub2RlOiBtb3ZlZE5vZGUsXG4gICAgICBwYXJlbnQ6XG4gICAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gdG9Ob2RlIDogdG9Ob2RlLnBhcmVudCxcbiAgICAgIGFmdGVyTm9kZTogYWZ0ZXJOb2RlLFxuICAgICAgYmVmb3JlTm9kZTogYmVmb3JlTm9kZSxcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTmdjeFRyZWVEYXRhU291cmNlKFxuICAgICAgdGhpcy5jcmVhdGVXcmFwcGVyTm9kZXModGhpcy5ub2RlcyEpXG4gICAgKTtcbiAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEFkZEluZGV4KFxuICAgIGRyb3Bab25lSW5mbzogRHJvcFpvbmVJbmZvLFxuICAgIGluc2VydEludG9Ob2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkLFxuICAgIGluc2VydEludG9MaXN0OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W11cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgaW5zZXJ0SW50b05vZGUgJiZcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPICYmXG4gICAgICAhaW5zZXJ0SW50b05vZGUuZGF0YS5jaGlsZHJlblxuICAgICkge1xuICAgICAgaW5zZXJ0SW50b05vZGUuZGF0YS5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBsZXQgYWRkQXROb2RlSWR4ID0gMDtcbiAgICBpZiAoXG4gICAgICBkcm9wWm9uZUluZm8uZHJvcFR5cGUgPT09IERyb3BUeXBlLkRST1BfQUZURVIgfHxcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9CRUZPUkVcbiAgICApIHtcbiAgICAgIGFkZEF0Tm9kZUlkeCA9IGluc2VydEludG9MaXN0LmZpbmRJbmRleChcbiAgICAgICAgKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gZHJvcFpvbmVJbmZvLm5vZGVJZFxuICAgICAgKTtcbiAgICAgIGlmIChkcm9wWm9uZUluZm8uZHJvcFR5cGUgPT09IERyb3BUeXBlLkRST1BfQUZURVIpIHtcbiAgICAgICAgYWRkQXROb2RlSWR4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRBdE5vZGVJZHg7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVsZW1lbnRGcm9tUHJldmlvdXNQb3NpdGlvbihcbiAgICBtb3ZlZE5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5cbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCByZW1vdmVGcm9tTGlzdCA9IG1vdmVkTm9kZS5wYXJlbnQ/LmRhdGEuY2hpbGRyZW4gPz8gdGhpcy5ub2RlcyE7XG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSByZW1vdmVGcm9tTGlzdC5maW5kSW5kZXgoXG4gICAgICAoY2hpbGQ6IGFueSkgPT4gY2hpbGQuaWQgPT09IG1vdmVkTm9kZS5pZFxuICAgICk7XG4gICAgcmVtb3ZlRnJvbUxpc3Quc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICByZXR1cm4gcmVtb3ZlSW5kZXg7XG4gIH1cblxuICBub2RlQ2xpY2tlZChub2RlV3JhcHBlcjogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPikge1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KG5vZGVXcmFwcGVyKTtcbiAgICBpZiAobm9kZVdyYXBwZXIuaXNTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9XG4gICAgICAgIG5vZGVXcmFwcGVyLmlkID09PSB0aGlzLnNlbGVjdGVkTm9kZT8uaWQgPyB1bmRlZmluZWQgOiBub2RlV3JhcHBlcjtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdCh0aGlzLnNlbGVjdGVkTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Tm9kZShub2RlV3JhcHBlcjogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghbm9kZVdyYXBwZXIgfHwgbm9kZVdyYXBwZXIuaXNTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGVXcmFwcGVyO1xuICAgICAgbGV0IGV4cGFuZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZT8ucGFyZW50O1xuICAgICAgd2hpbGUgKGV4cGFuZE5vZGUpIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQoZXhwYW5kTm9kZSk7XG4gICAgICAgIGV4cGFuZE5vZGUgPSBleHBhbmROb2RlLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdCh0aGlzLnNlbGVjdGVkTm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmVudW0gRHJvcFR5cGUge1xuICBEUk9QX0FGVEVSID0gJ0RST1BfQUZURVInLFxuICBEUk9QX0JFRk9SRSA9ICdEUk9QX0JFRk9SRScsXG4gIERST1BfSU5UTyA9ICdEUk9QX0lOVE8nLFxufVxuXG5leHBvcnQgY2xhc3MgTmdjeFRyZWVDb250cm9sPFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+IGV4dGVuZHMgTmVzdGVkVHJlZUNvbnRyb2w8XG4gIE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gIHN0cmluZ1xuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdHJlZUNvbXBvbmVudDogTmdjeFRyZWVDb21wb25lbnQ8VD4sXG4gICAgZ2V0Q2hpbGRyZW46IChkYXRhTm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPikgPT4gTmdjeFRyZWVOb2RlV3JhcHBlcjxUPltdLFxuICAgIG9wdGlvbnM/OiBOZXN0ZWRUcmVlQ29udHJvbE9wdGlvbnM8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPiwgc3RyaW5nPlxuICApIHtcbiAgICBzdXBlcihnZXRDaGlsZHJlbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogc2VsZWN0IGEgbm9kZSBieSBpZC4gdGhlIHNlbGVjdEV2ZW50IGlzIGZpcmVkIGFmdGVyd2FyZHMuXG4gICAqL1xuICBzZWxlY3ROb2RlQnlJZChpZDogc3RyaW5nKSB7XG4gICAgdGhpcy50cmVlQ29tcG9uZW50LnNlbGVjdE5vZGUodGhpcy5maW5kTm9kZUJ5SWQoaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaW5kIGEgbm9kZSBieSBpZC5cbiAgICovXG4gIGZpbmROb2RlQnlJZChpZDogc3RyaW5nKTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZE5vZGVCeUlkSW5Ob2RlcyhcbiAgICAgIHRoaXMudHJlZUNvbXBvbmVudC5kYXRhU291cmNlLmRhdGEkLnZhbHVlLFxuICAgICAgaWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5SWRJbk5vZGVzKFxuICAgIG5vZGVzOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W10sXG4gICAgaWQ6IHN0cmluZ1xuICApOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmIChub2RlLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kTm9kZSA9IHRoaXMuZmluZE5vZGVCeUlkSW5Ob2Rlcyhub2RlLmNoaWxkcmVuLCBpZCk7XG4gICAgICAgIGlmIChmb3VuZE5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmROb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5jbGFzcyBEcm9wWm9uZUluZm8ge1xuICBkcm9wVHlwZTogRHJvcFR5cGU7XG4gIG5vZGVJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwb3MgPSBpZC5pbmRleE9mKCdfJyk7XG4gICAgdGhpcy5ub2RlSWQgPSBpZC5zdWJzdHJpbmcoMCwgcG9zKTtcbiAgICB0aGlzLmRyb3BUeXBlID0gPERyb3BUeXBlPmlkLnN1YnN0cmluZyhwb3MgKyAxKTtcbiAgfVxufVxuXG5jbGFzcyBEcm9wQ29udHJvbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBoaWRlRHJvcDogYm9vbGVhbixcbiAgICBwdWJsaWMgcHJldmVudERyb3A6IGJvb2xlYW4sXG4gICAgcHVibGljIHByZXZlbnREcm9wUmVhc29uOiBzdHJpbmcgPSAnJ1xuICApIHt9XG59XG4iLCI8Y2RrLXRyZWVcbiAgI3RyZWVcbiAgY2xhc3M9XCJuZ2N4LXRyZWVcIlxuICAqbmdJZj1cImRhdGFTb3VyY2VcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgY2RrRHJvcExpc3RHcm91cFxuICBbY2xhc3MuZHJhZ2dpbmddPVwiZHJhZ2dpbmdcIlxuICAoa2V5dXAuYXJyb3d1cCk9XCJrZXlEb3duQXJyb3dVcCgkZXZlbnQpXCJcbiAgKGtleWRvd24uYXJyb3dkb3duKT1cImtleURvd25BcnJvd0Rvd24oJGV2ZW50KVwiXG4gIChrZXlkb3duLmFycm93bGVmdCk9XCJrZXlEb3duQXJyb3dMZWZ0KCRldmVudClcIlxuICAoa2V5ZG93bi5hcnJvd3JpZ2h0KT1cImtleURvd25BcnJvd1JpZ2h0KCRldmVudClcIlxuICB0YWJpbmRleD1cIjBcIj5cbiAgPGNkay1uZXN0ZWQtdHJlZS1ub2RlICpjZGtUcmVlTm9kZURlZj1cImxldCBub2RlXCIgY2xhc3M9XCJ0cmVlLW5vZGVcIj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0FGVEVSKSBhcyBkcm9wQ29udHJvbFwiXG4gICAgICBjZGtEcm9wTGlzdFxuICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0FGVEVSXCJcbiAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgYWZ0ZXItZXhwYW5kZWQtbm9kZVwiXG4gICAgICBbY2xhc3MuaGlkZV09XCJkcm9wQ29udHJvbC5oaWRlRHJvcCB8fCAhdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiXG4gICAgICBbY2xhc3Mubm8tZHJvcF09XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRyb3AtaW5zZXJ0LWxpbmVcIj48L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvblwiIGNsYXNzPVwidG9vbHRpcFwiPlxuICAgICAgICB7eyBkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvbiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJhbGxvd0Ryb3Aobm9kZSwgRHJvcFR5cGUuRFJPUF9CRUZPUkUpIGFzIGRyb3BDb250cm9sXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0JFRk9SRVwiXG4gICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgYmVmb3JlLW5vZGVcIlxuICAgICAgICBbY2xhc3MuaGlkZV09XCIhbm9kZS5pc0ZpcnN0Q2hpbGQgfHwgZHJvcENvbnRyb2wuaGlkZURyb3BcIlxuICAgICAgICBbY2xhc3Mubm8tZHJvcF09XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1pbnNlcnQtbGluZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcENvbnRyb2wucHJldmVudERyb3BSZWFzb25cIiBjbGFzcz1cInRvb2x0aXBcIj5cbiAgICAgICAgICB7eyBkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvbiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0lOVE8pIGFzIGRyb3BDb250cm9sXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0lOVE9cIlxuICAgICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXItZHJvcC16b25lIGludG8tbm9kZVwiXG4gICAgICAgIFtjbGFzcy5oaWRlXT1cImRyb3BDb250cm9sLmhpZGVEcm9wXCJcbiAgICAgICAgW2NsYXNzLm5vLWRyb3BdPVwiZHJvcENvbnRyb2wucHJldmVudERyb3BcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uXCIgY2xhc3M9XCJ0b29sdGlwXCI+XG4gICAgICAgICAge3sgZHJvcENvbnRyb2wucHJldmVudERyb3BSZWFzb24gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJhbGxvd0Ryb3Aobm9kZSwgRHJvcFR5cGUuRFJPUF9BRlRFUikgYXMgZHJvcENvbnRyb2xcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfQUZURVJcIlxuICAgICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXItZHJvcC16b25lIGFmdGVyLW5vZGVcIlxuICAgICAgICBbY2xhc3MubGFzdF09XCJub2RlLmlzTGFzdENoaWxkXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSB8fCBkcm9wQ29udHJvbC5oaWRlRHJvcFwiXG4gICAgICAgIFtjbGFzcy5uby1kcm9wXT1cImRyb3BDb250cm9sLnByZXZlbnREcm9wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWluc2VydC1saW5lXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvblwiIGNsYXNzPVwidG9vbHRpcFwiPlxuICAgICAgICAgIHt7IGRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwibm9kZVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImRpc2FibGVcIlxuICAgICAgICBbY2RrRHJvcExpc3RTb3J0UHJlZGljYXRlXT1cImRpc2FibGVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cImRpc2FibGVEcmFnKG5vZGUpXCJcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibm9kZVwiXG4gICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cImRyYWdnaW5nID0gbm9kZVwiXG4gICAgICAgICAgKGNka0RyYWdSZWxlYXNlZCk9XCJoYW5kbGVEcmFnUmVsZWFzZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRlbnQtY29udGFpbmVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5maXJzdF09XCJub2RlLmlzRmlyc3RDaGlsZFwiXG4gICAgICAgICAgICBbY2xhc3MubGFzdF09XCJub2RlLmlzTGFzdENoaWxkXCJcbiAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXCI+XG4gICAgICAgICAgICA8bmdjeC10cmVlLW5vZGVcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAgICAgICAgIFtub2RlV3JhcHBlcl09XCJub2RlXCJcbiAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwibm9kZS5pZCA9PT0gc2VsZWN0ZWROb2RlPy5pZFwiXG4gICAgICAgICAgICAgIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiXG4gICAgICAgICAgICAgIFt0cmVlQ29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICAgICAgICAgIChjdXN0b21FdmVudCk9XCJjdXN0b21FdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJub2RlQ2xpY2tlZChub2RlKVwiPjwvbmdjeC10cmVlLW5vZGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmdjeC10cmVlLW5vZGVcbiAgICAgICAgICAqbmdJZj1cIm5vZGUuaWQgPT09IGRyYWdnaW5nPy5pZFwiXG4gICAgICAgICAgW25vZGVXcmFwcGVyXT1cIm5vZGVcIlxuICAgICAgICAgIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiXG4gICAgICAgICAgW3RyZWVDb25maWddPVwiY29uZmlnXCI+PC9uZ2N4LXRyZWUtbm9kZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1jaGlsZHJlbi1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLmZpcnN0XT1cIm5vZGUuaXNGaXJzdENoaWxkXCJcbiAgICAgIFtjbGFzcy5sYXN0XT1cIm5vZGUuaXNMYXN0Q2hpbGRcIj5cbiAgICAgIDxkaXYgY2RrVHJlZU5vZGVPdXRsZXQ+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvY2RrLW5lc3RlZC10cmVlLW5vZGU+XG48L2Nkay10cmVlPlxuIl19
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of ngcx-tree
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/ngcx-tree/ngcx-tree-models';
|
|
5
|
-
export * from './lib/ngcx-tree/ngcx-tree.component';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmdjeC10cmVlXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmdjeC10cmVlL25nY3gtdHJlZS1tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQnO1xuIl19
|