@m1z23r/ngx-ui 1.1.48 → 1.1.50
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/m1z23r-ngx-ui.mjs +185 -24
- package/fesm2022/m1z23r-ngx-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/m1z23r-ngx-ui.d.ts +52 -6
|
@@ -6710,21 +6710,17 @@ class TreeNodeComponent {
|
|
|
6710
6710
|
node = input.required(...(ngDevMode ? [{ debugName: "node" }] : []));
|
|
6711
6711
|
level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : []));
|
|
6712
6712
|
indent = input(16, ...(ngDevMode ? [{ debugName: "indent" }] : []));
|
|
6713
|
+
parentPath = input([], ...(ngDevMode ? [{ debugName: "parentPath" }] : []));
|
|
6713
6714
|
nodeClick = output();
|
|
6714
6715
|
nodeExpand = output();
|
|
6715
6716
|
nodeCollapse = output();
|
|
6716
6717
|
treeHost = inject(TREE_HOST);
|
|
6717
|
-
|
|
6718
|
-
|
|
6719
|
-
|
|
6720
|
-
if (manualState !== null) {
|
|
6721
|
-
return manualState;
|
|
6722
|
-
}
|
|
6723
|
-
return this.node().expanded ?? false;
|
|
6724
|
-
}, ...(ngDevMode ? [{ debugName: "isExpanded" }] : []));
|
|
6718
|
+
contentRef = viewChild('contentRef', ...(ngDevMode ? [{ debugName: "contentRef" }] : []));
|
|
6719
|
+
path = computed(() => [...this.parentPath(), this.node()], ...(ngDevMode ? [{ debugName: "path" }] : []));
|
|
6720
|
+
isExpanded = computed(() => this.treeHost.isExpanded(this.node()), ...(ngDevMode ? [{ debugName: "isExpanded" }] : []));
|
|
6725
6721
|
hasChildren = computed(() => {
|
|
6726
6722
|
const children = this.node().children;
|
|
6727
|
-
return children && children.length > 0;
|
|
6723
|
+
return !!children && children.length > 0;
|
|
6728
6724
|
}, ...(ngDevMode ? [{ debugName: "hasChildren" }] : []));
|
|
6729
6725
|
indentGuides = computed(() => {
|
|
6730
6726
|
const lvl = this.level();
|
|
@@ -6732,28 +6728,33 @@ class TreeNodeComponent {
|
|
|
6732
6728
|
}, ...(ngDevMode ? [{ debugName: "indentGuides" }] : []));
|
|
6733
6729
|
isDraggable = computed(() => this.treeHost.draggable(), ...(ngDevMode ? [{ debugName: "isDraggable" }] : []));
|
|
6734
6730
|
isDragging = computed(() => this.treeHost._dragNode() === this.node(), ...(ngDevMode ? [{ debugName: "isDragging" }] : []));
|
|
6731
|
+
isFlashing = computed(() => this.treeHost._flashNode() === this.node(), ...(ngDevMode ? [{ debugName: "isFlashing" }] : []));
|
|
6735
6732
|
dropPosition = computed(() => {
|
|
6736
6733
|
if (this.treeHost._dragOverNode() === this.node()) {
|
|
6737
6734
|
return this.treeHost._dropPosition();
|
|
6738
6735
|
}
|
|
6739
6736
|
return null;
|
|
6740
6737
|
}, ...(ngDevMode ? [{ debugName: "dropPosition" }] : []));
|
|
6738
|
+
ngAfterViewInit() {
|
|
6739
|
+
const el = this.contentRef()?.nativeElement;
|
|
6740
|
+
if (el)
|
|
6741
|
+
this.treeHost._registerNode(this.node(), el);
|
|
6742
|
+
}
|
|
6743
|
+
ngOnDestroy() {
|
|
6744
|
+
this.treeHost._unregisterNode(this.node());
|
|
6745
|
+
}
|
|
6741
6746
|
toggle(event) {
|
|
6742
6747
|
event.stopPropagation();
|
|
6743
6748
|
if (!this.hasChildren())
|
|
6744
6749
|
return;
|
|
6745
|
-
|
|
6746
|
-
this._expanded.set(newState);
|
|
6747
|
-
if (newState) {
|
|
6748
|
-
this.nodeExpand.emit(this.node());
|
|
6749
|
-
}
|
|
6750
|
-
else {
|
|
6751
|
-
this.nodeCollapse.emit(this.node());
|
|
6752
|
-
}
|
|
6750
|
+
this.treeHost.setExpanded(this.node(), !this.isExpanded());
|
|
6753
6751
|
}
|
|
6754
6752
|
onClick(event) {
|
|
6755
6753
|
event.stopPropagation();
|
|
6756
6754
|
this.nodeClick.emit(this.node());
|
|
6755
|
+
if (this.treeHost.expandOnClick() && this.hasChildren()) {
|
|
6756
|
+
this.toggle(event);
|
|
6757
|
+
}
|
|
6757
6758
|
}
|
|
6758
6759
|
onDoubleClick(event) {
|
|
6759
6760
|
event.stopPropagation();
|
|
@@ -6761,6 +6762,13 @@ class TreeNodeComponent {
|
|
|
6761
6762
|
this.toggle(event);
|
|
6762
6763
|
}
|
|
6763
6764
|
}
|
|
6765
|
+
onContextMenu(event) {
|
|
6766
|
+
if (!this.treeHost.contextMenu())
|
|
6767
|
+
return;
|
|
6768
|
+
event.preventDefault();
|
|
6769
|
+
event.stopPropagation();
|
|
6770
|
+
this.treeHost._openContextMenu(this.node(), this.path(), event.clientX, event.clientY);
|
|
6771
|
+
}
|
|
6764
6772
|
onDragStart(event) {
|
|
6765
6773
|
if (!this.isDraggable())
|
|
6766
6774
|
return;
|
|
@@ -6779,7 +6787,6 @@ class TreeNodeComponent {
|
|
|
6779
6787
|
const dragNode = this.treeHost._dragNode();
|
|
6780
6788
|
if (!dragNode)
|
|
6781
6789
|
return;
|
|
6782
|
-
// Prevent dropping on self or own descendants
|
|
6783
6790
|
if (dragNode === this.node() || isDescendantOf(this.node(), dragNode)) {
|
|
6784
6791
|
return;
|
|
6785
6792
|
}
|
|
@@ -6845,22 +6852,26 @@ class TreeNodeComponent {
|
|
|
6845
6852
|
this.nodeCollapse.emit(node);
|
|
6846
6853
|
}
|
|
6847
6854
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6848
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TreeNodeComponent, isStandalone: true, selector: "ui-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, indent: { classPropertyName: "indent", publicName: "indent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse" }, ngImport: i0, template: "<div\n class=\"ui-tree-node\"\n [class.ui-tree-node--dragging]=\"isDragging()\"\n [attr.draggable]=\"isDraggable()\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div class=\"ui-tree-node__guides\">\n @for (guide of indentGuides(); track guide) {\n <span class=\"ui-tree-node__guide\" [style.width.px]=\"indent()\"></span>\n }\n </div>\n <div\n class=\"ui-tree-node__content\"\n [class.ui-tree-node__content--selected]=\"false\"\n [class.ui-tree-node__content--drop-before]=\"dropPosition() === 'before'\"\n [class.ui-tree-node__content--drop-after]=\"dropPosition() === 'after'\"\n [class.ui-tree-node__content--drop-inside]=\"dropPosition() === 'inside'\"\n [style.padding-left.px]=\"level() * indent() + 8\"\n (click)=\"onClick($event)\"\n (dblclick)=\"onDoubleClick($event)\"\n >\n @if (hasChildren()) {\n <button\n type=\"button\"\n class=\"ui-tree-node__toggle\"\n [class.ui-tree-node__toggle--expanded]=\"isExpanded()\"\n (click)=\"toggle($event)\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? 'Collapse' : 'Expand'\"\n >\n <svg\n class=\"ui-tree-node__chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n @if (node().icon) {\n <span class=\"ui-tree-node__icon\">{{ node().icon }}</span>\n }\n <span class=\"ui-tree-node__label\">{{ node().label }}</span>\n </div>\n</div>\n@if (isExpanded() && hasChildren()) {\n @for (child of node().children; track child) {\n <ui-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [indent]=\"indent()\"\n (nodeClick)=\"_onChildNodeClick($event)\"\n (nodeExpand)=\"_onChildNodeExpand($event)\"\n (nodeCollapse)=\"_onChildNodeCollapse($event)\"\n />\n }\n}\n", styles: [":host{display:block}.ui-tree-node{position:relative}.ui-tree-node__guides{position:absolute;top:0;bottom:0;left:0;display:flex;pointer-events:none}.ui-tree-node__guide{position:relative;flex-shrink:0}.ui-tree-node__guide:after{content:\"\";position:absolute;left:50%;top:0;bottom:0;width:1px;background-color:var(--ui-border-hover)}.ui-tree-node__content{display:flex;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm) var(--ui-spacing-xs) 0;border-radius:var(--ui-radius-sm);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-tree-node__content:hover{background-color:var(--ui-bg-hover)}.ui-tree-node__content--selected{background-color:var(--ui-option-selected-bg);color:var(--ui-option-selected-text)}.ui-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;flex-shrink:0;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-tree-node__toggle:hover{background-color:var(--ui-bg-hover);color:var(--ui-text)}.ui-tree-node__toggle:focus-visible{outline:2px solid var(--ui-primary);outline-offset:-2px}.ui-tree-node__chevron{transition:transform var(--ui-transition-fast)}.ui-tree-node__toggle--expanded .ui-tree-node__chevron{transform:rotate(90deg)}.ui-tree-node__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;font-size:var(--ui-font-sm);color:var(--ui-text-muted)}.ui-tree-node__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}.ui-tree-node--dragging{opacity:.4}.ui-tree-node__content--drop-before{position:relative}.ui-tree-node__content--drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-after{position:relative}.ui-tree-node__content--drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-inside{background-color:color-mix(in srgb,var(--ui-primary) 10%,transparent);outline:1px solid var(--ui-primary);outline-offset:-1px;border-radius:var(--ui-radius-sm)}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ui-tree-node", inputs: ["node", "level", "indent"], outputs: ["nodeClick", "nodeExpand", "nodeCollapse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
6855
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TreeNodeComponent, isStandalone: true, selector: "ui-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, indent: { classPropertyName: "indent", publicName: "indent", isSignal: true, isRequired: false, transformFunction: null }, parentPath: { classPropertyName: "parentPath", publicName: "parentPath", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse" }, viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ui-tree-node\"\n [class.ui-tree-node--dragging]=\"isDragging()\"\n [attr.draggable]=\"isDraggable()\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div class=\"ui-tree-node__guides\">\n @for (guide of indentGuides(); track guide) {\n <span class=\"ui-tree-node__guide\" [style.width.px]=\"indent()\"></span>\n }\n </div>\n <div\n #contentRef\n class=\"ui-tree-node__content\"\n [class.ui-tree-node__content--selected]=\"false\"\n [class.ui-tree-node__content--flash]=\"isFlashing()\"\n [class.ui-tree-node__content--drop-before]=\"dropPosition() === 'before'\"\n [class.ui-tree-node__content--drop-after]=\"dropPosition() === 'after'\"\n [class.ui-tree-node__content--drop-inside]=\"dropPosition() === 'inside'\"\n [style.padding-left.px]=\"level() * indent() + 8\"\n (click)=\"onClick($event)\"\n (dblclick)=\"onDoubleClick($event)\"\n (contextmenu)=\"onContextMenu($event)\"\n >\n @if (hasChildren()) {\n <button\n type=\"button\"\n class=\"ui-tree-node__toggle\"\n [class.ui-tree-node__toggle--expanded]=\"isExpanded()\"\n (click)=\"toggle($event)\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? 'Collapse' : 'Expand'\"\n >\n <svg\n class=\"ui-tree-node__chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n @if (node().icon) {\n <span class=\"ui-tree-node__icon\">{{ node().icon }}</span>\n }\n <span class=\"ui-tree-node__label\">{{ node().label }}</span>\n </div>\n</div>\n@if (isExpanded() && hasChildren()) {\n @for (child of node().children; track child) {\n <ui-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [indent]=\"indent()\"\n [parentPath]=\"path()\"\n (nodeClick)=\"_onChildNodeClick($event)\"\n (nodeExpand)=\"_onChildNodeExpand($event)\"\n (nodeCollapse)=\"_onChildNodeCollapse($event)\"\n />\n }\n}\n", styles: [":host{display:block}.ui-tree-node{position:relative}.ui-tree-node__guides{position:absolute;top:0;bottom:0;left:0;display:flex;pointer-events:none}.ui-tree-node__guide{position:relative;flex-shrink:0}.ui-tree-node__guide:after{content:\"\";position:absolute;left:50%;top:0;bottom:0;width:1px;background-color:var(--ui-border-hover)}.ui-tree-node__content{display:flex;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm) var(--ui-spacing-xs) 0;border-radius:var(--ui-radius-sm);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-tree-node__content:hover{background-color:var(--ui-bg-hover)}.ui-tree-node__content--selected{background-color:var(--ui-option-selected-bg);color:var(--ui-option-selected-text)}.ui-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;flex-shrink:0;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-tree-node__toggle:hover{background-color:var(--ui-bg-hover);color:var(--ui-text)}.ui-tree-node__toggle:focus-visible{outline:2px solid var(--ui-primary);outline-offset:-2px}.ui-tree-node__chevron{transition:transform var(--ui-transition-fast)}.ui-tree-node__toggle--expanded .ui-tree-node__chevron{transform:rotate(90deg)}.ui-tree-node__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;font-size:var(--ui-font-sm);color:var(--ui-text-muted)}.ui-tree-node__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}.ui-tree-node--dragging{opacity:.4}.ui-tree-node__content--drop-before{position:relative}.ui-tree-node__content--drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-after{position:relative}.ui-tree-node__content--drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-inside{background-color:color-mix(in srgb,var(--ui-primary) 10%,transparent);outline:1px solid var(--ui-primary);outline-offset:-1px;border-radius:var(--ui-radius-sm)}.ui-tree-node__content--flash{animation:ui-tree-node-flash 1s ease-out}@keyframes ui-tree-node-flash{0%{background-color:color-mix(in srgb,var(--ui-primary) 40%,transparent)}to{background-color:transparent}}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ui-tree-node", inputs: ["node", "level", "indent", "parentPath"], outputs: ["nodeClick", "nodeExpand", "nodeCollapse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
6849
6856
|
}
|
|
6850
6857
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TreeNodeComponent, decorators: [{
|
|
6851
6858
|
type: Component,
|
|
6852
|
-
args: [{ selector: 'ui-tree-node', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"ui-tree-node\"\n [class.ui-tree-node--dragging]=\"isDragging()\"\n [attr.draggable]=\"isDraggable()\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div class=\"ui-tree-node__guides\">\n @for (guide of indentGuides(); track guide) {\n <span class=\"ui-tree-node__guide\" [style.width.px]=\"indent()\"></span>\n }\n </div>\n <div\n class=\"ui-tree-node__content\"\n [class.ui-tree-node__content--selected]=\"false\"\n [class.ui-tree-node__content--drop-before]=\"dropPosition() === 'before'\"\n [class.ui-tree-node__content--drop-after]=\"dropPosition() === 'after'\"\n [class.ui-tree-node__content--drop-inside]=\"dropPosition() === 'inside'\"\n [style.padding-left.px]=\"level() * indent() + 8\"\n (click)=\"onClick($event)\"\n (dblclick)=\"onDoubleClick($event)\"\n >\n @if (hasChildren()) {\n <button\n type=\"button\"\n class=\"ui-tree-node__toggle\"\n [class.ui-tree-node__toggle--expanded]=\"isExpanded()\"\n (click)=\"toggle($event)\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? 'Collapse' : 'Expand'\"\n >\n <svg\n class=\"ui-tree-node__chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n @if (node().icon) {\n <span class=\"ui-tree-node__icon\">{{ node().icon }}</span>\n }\n <span class=\"ui-tree-node__label\">{{ node().label }}</span>\n </div>\n</div>\n@if (isExpanded() && hasChildren()) {\n @for (child of node().children; track child) {\n <ui-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [indent]=\"indent()\"\n (nodeClick)=\"_onChildNodeClick($event)\"\n (nodeExpand)=\"_onChildNodeExpand($event)\"\n (nodeCollapse)=\"_onChildNodeCollapse($event)\"\n />\n }\n}\n", styles: [":host{display:block}.ui-tree-node{position:relative}.ui-tree-node__guides{position:absolute;top:0;bottom:0;left:0;display:flex;pointer-events:none}.ui-tree-node__guide{position:relative;flex-shrink:0}.ui-tree-node__guide:after{content:\"\";position:absolute;left:50%;top:0;bottom:0;width:1px;background-color:var(--ui-border-hover)}.ui-tree-node__content{display:flex;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm) var(--ui-spacing-xs) 0;border-radius:var(--ui-radius-sm);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-tree-node__content:hover{background-color:var(--ui-bg-hover)}.ui-tree-node__content--selected{background-color:var(--ui-option-selected-bg);color:var(--ui-option-selected-text)}.ui-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;flex-shrink:0;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-tree-node__toggle:hover{background-color:var(--ui-bg-hover);color:var(--ui-text)}.ui-tree-node__toggle:focus-visible{outline:2px solid var(--ui-primary);outline-offset:-2px}.ui-tree-node__chevron{transition:transform var(--ui-transition-fast)}.ui-tree-node__toggle--expanded .ui-tree-node__chevron{transform:rotate(90deg)}.ui-tree-node__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;font-size:var(--ui-font-sm);color:var(--ui-text-muted)}.ui-tree-node__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}.ui-tree-node--dragging{opacity:.4}.ui-tree-node__content--drop-before{position:relative}.ui-tree-node__content--drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-after{position:relative}.ui-tree-node__content--drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-inside{background-color:color-mix(in srgb,var(--ui-primary) 10%,transparent);outline:1px solid var(--ui-primary);outline-offset:-1px;border-radius:var(--ui-radius-sm)}\n"] }]
|
|
6853
|
-
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], indent: [{ type: i0.Input, args: [{ isSignal: true, alias: "indent", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCollapse: [{ type: i0.Output, args: ["nodeCollapse"] }] } });
|
|
6859
|
+
args: [{ selector: 'ui-tree-node', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"ui-tree-node\"\n [class.ui-tree-node--dragging]=\"isDragging()\"\n [attr.draggable]=\"isDraggable()\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div class=\"ui-tree-node__guides\">\n @for (guide of indentGuides(); track guide) {\n <span class=\"ui-tree-node__guide\" [style.width.px]=\"indent()\"></span>\n }\n </div>\n <div\n #contentRef\n class=\"ui-tree-node__content\"\n [class.ui-tree-node__content--selected]=\"false\"\n [class.ui-tree-node__content--flash]=\"isFlashing()\"\n [class.ui-tree-node__content--drop-before]=\"dropPosition() === 'before'\"\n [class.ui-tree-node__content--drop-after]=\"dropPosition() === 'after'\"\n [class.ui-tree-node__content--drop-inside]=\"dropPosition() === 'inside'\"\n [style.padding-left.px]=\"level() * indent() + 8\"\n (click)=\"onClick($event)\"\n (dblclick)=\"onDoubleClick($event)\"\n (contextmenu)=\"onContextMenu($event)\"\n >\n @if (hasChildren()) {\n <button\n type=\"button\"\n class=\"ui-tree-node__toggle\"\n [class.ui-tree-node__toggle--expanded]=\"isExpanded()\"\n (click)=\"toggle($event)\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? 'Collapse' : 'Expand'\"\n >\n <svg\n class=\"ui-tree-node__chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n @if (node().icon) {\n <span class=\"ui-tree-node__icon\">{{ node().icon }}</span>\n }\n <span class=\"ui-tree-node__label\">{{ node().label }}</span>\n </div>\n</div>\n@if (isExpanded() && hasChildren()) {\n @for (child of node().children; track child) {\n <ui-tree-node\n [node]=\"child\"\n [level]=\"level() + 1\"\n [indent]=\"indent()\"\n [parentPath]=\"path()\"\n (nodeClick)=\"_onChildNodeClick($event)\"\n (nodeExpand)=\"_onChildNodeExpand($event)\"\n (nodeCollapse)=\"_onChildNodeCollapse($event)\"\n />\n }\n}\n", styles: [":host{display:block}.ui-tree-node{position:relative}.ui-tree-node__guides{position:absolute;top:0;bottom:0;left:0;display:flex;pointer-events:none}.ui-tree-node__guide{position:relative;flex-shrink:0}.ui-tree-node__guide:after{content:\"\";position:absolute;left:50%;top:0;bottom:0;width:1px;background-color:var(--ui-border-hover)}.ui-tree-node__content{display:flex;align-items:center;gap:var(--ui-spacing-xs);padding:var(--ui-spacing-xs) var(--ui-spacing-sm) var(--ui-spacing-xs) 0;border-radius:var(--ui-radius-sm);cursor:pointer;transition:background-color var(--ui-transition-fast)}.ui-tree-node__content:hover{background-color:var(--ui-bg-hover)}.ui-tree-node__content--selected{background-color:var(--ui-option-selected-bg);color:var(--ui-option-selected-text)}.ui-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-muted);cursor:pointer;flex-shrink:0;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-tree-node__toggle:hover{background-color:var(--ui-bg-hover);color:var(--ui-text)}.ui-tree-node__toggle:focus-visible{outline:2px solid var(--ui-primary);outline-offset:-2px}.ui-tree-node__chevron{transition:transform var(--ui-transition-fast)}.ui-tree-node__toggle--expanded .ui-tree-node__chevron{transform:rotate(90deg)}.ui-tree-node__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;font-size:var(--ui-font-sm);color:var(--ui-text-muted)}.ui-tree-node__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}.ui-tree-node--dragging{opacity:.4}.ui-tree-node__content--drop-before{position:relative}.ui-tree-node__content--drop-before:before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-after{position:relative}.ui-tree-node__content--drop-after:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--ui-primary);border-radius:1px;pointer-events:none}.ui-tree-node__content--drop-inside{background-color:color-mix(in srgb,var(--ui-primary) 10%,transparent);outline:1px solid var(--ui-primary);outline-offset:-1px;border-radius:var(--ui-radius-sm)}.ui-tree-node__content--flash{animation:ui-tree-node-flash 1s ease-out}@keyframes ui-tree-node-flash{0%{background-color:color-mix(in srgb,var(--ui-primary) 40%,transparent)}to{background-color:transparent}}\n"] }]
|
|
6860
|
+
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], indent: [{ type: i0.Input, args: [{ isSignal: true, alias: "indent", required: false }] }], parentPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentPath", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCollapse: [{ type: i0.Output, args: ["nodeCollapse"] }], contentRef: [{ type: i0.ViewChild, args: ['contentRef', { isSignal: true }] }] } });
|
|
6854
6861
|
|
|
6855
6862
|
const TREE_HOST = new InjectionToken('TREE_HOST');
|
|
6856
6863
|
class TreeComponent {
|
|
6857
6864
|
nodes = input([], ...(ngDevMode ? [{ debugName: "nodes" }] : []));
|
|
6858
6865
|
indent = input(16, ...(ngDevMode ? [{ debugName: "indent" }] : []));
|
|
6859
6866
|
draggable = input(false, ...(ngDevMode ? [{ debugName: "draggable" }] : []));
|
|
6867
|
+
expandOnClick = input(false, ...(ngDevMode ? [{ debugName: "expandOnClick" }] : []));
|
|
6868
|
+
contextMenu = input(false, ...(ngDevMode ? [{ debugName: "contextMenu" }] : []));
|
|
6869
|
+
pathSeparator = input(' / ', ...(ngDevMode ? [{ debugName: "pathSeparator" }] : []));
|
|
6860
6870
|
nodeClick = output();
|
|
6861
6871
|
nodeExpand = output();
|
|
6862
6872
|
nodeCollapse = output();
|
|
6863
6873
|
nodeDrop = output();
|
|
6874
|
+
nodeContextAction = output();
|
|
6864
6875
|
/** @internal */
|
|
6865
6876
|
_dragNode = signal(null, ...(ngDevMode ? [{ debugName: "_dragNode" }] : []));
|
|
6866
6877
|
/** @internal */
|
|
@@ -6868,6 +6879,53 @@ class TreeComponent {
|
|
|
6868
6879
|
/** @internal */
|
|
6869
6880
|
_dropPosition = signal(null, ...(ngDevMode ? [{ debugName: "_dropPosition" }] : []));
|
|
6870
6881
|
/** @internal */
|
|
6882
|
+
_flashNode = signal(null, ...(ngDevMode ? [{ debugName: "_flashNode" }] : []));
|
|
6883
|
+
/** @internal context-menu target — node and its path (root → node, inclusive) */
|
|
6884
|
+
_menuNode = signal(null, ...(ngDevMode ? [{ debugName: "_menuNode" }] : []));
|
|
6885
|
+
/** @internal */
|
|
6886
|
+
_menuPath = signal([], ...(ngDevMode ? [{ debugName: "_menuPath" }] : []));
|
|
6887
|
+
/** @internal whether the targeted node has children (drives expand/collapse-all visibility) */
|
|
6888
|
+
_menuHasChildren = computed(() => {
|
|
6889
|
+
const n = this._menuNode();
|
|
6890
|
+
return !!n?.children && n.children.length > 0;
|
|
6891
|
+
}, ...(ngDevMode ? [{ debugName: "_menuHasChildren" }] : []));
|
|
6892
|
+
/** @internal whether the targeted node has a parent (drives go-to/collapse-parent visibility) */
|
|
6893
|
+
_menuHasParent = computed(() => this._menuPath().length > 1, ...(ngDevMode ? [{ debugName: "_menuHasParent" }] : []));
|
|
6894
|
+
_expansion = signal(new Map(), ...(ngDevMode ? [{ debugName: "_expansion" }] : []));
|
|
6895
|
+
_nodeElements = new WeakMap();
|
|
6896
|
+
flashTimer = null;
|
|
6897
|
+
menu = viewChild('treeMenu', ...(ngDevMode ? [{ debugName: "menu" }] : []));
|
|
6898
|
+
isExpanded(node) {
|
|
6899
|
+
const override = this._expansion().get(node);
|
|
6900
|
+
return override ?? (node.expanded ?? false);
|
|
6901
|
+
}
|
|
6902
|
+
setExpanded(node, value) {
|
|
6903
|
+
const current = this.isExpanded(node);
|
|
6904
|
+
if (current === value)
|
|
6905
|
+
return;
|
|
6906
|
+
const next = new Map(this._expansion());
|
|
6907
|
+
next.set(node, value);
|
|
6908
|
+
this._expansion.set(next);
|
|
6909
|
+
if (value) {
|
|
6910
|
+
this.nodeExpand.emit(node);
|
|
6911
|
+
}
|
|
6912
|
+
else {
|
|
6913
|
+
this.nodeCollapse.emit(node);
|
|
6914
|
+
}
|
|
6915
|
+
}
|
|
6916
|
+
expandSubtree(node, value) {
|
|
6917
|
+
const next = new Map(this._expansion());
|
|
6918
|
+
const walk = (n) => {
|
|
6919
|
+
if (!n.children?.length)
|
|
6920
|
+
return;
|
|
6921
|
+
next.set(n, value);
|
|
6922
|
+
for (const c of n.children)
|
|
6923
|
+
walk(c);
|
|
6924
|
+
};
|
|
6925
|
+
walk(node);
|
|
6926
|
+
this._expansion.set(next);
|
|
6927
|
+
}
|
|
6928
|
+
/** @internal */
|
|
6871
6929
|
_onNodeClick(node) {
|
|
6872
6930
|
this.nodeClick.emit(node);
|
|
6873
6931
|
}
|
|
@@ -6883,13 +6941,116 @@ class TreeComponent {
|
|
|
6883
6941
|
_emitDrop(event) {
|
|
6884
6942
|
this.nodeDrop.emit(event);
|
|
6885
6943
|
}
|
|
6944
|
+
/** @internal */
|
|
6945
|
+
_registerNode(node, el) {
|
|
6946
|
+
this._nodeElements.set(node, el);
|
|
6947
|
+
}
|
|
6948
|
+
/** @internal */
|
|
6949
|
+
_unregisterNode(node) {
|
|
6950
|
+
this._nodeElements.delete(node);
|
|
6951
|
+
}
|
|
6952
|
+
/** @internal */
|
|
6953
|
+
_openContextMenu(node, path, x, y) {
|
|
6954
|
+
this._menuNode.set(node);
|
|
6955
|
+
this._menuPath.set(path);
|
|
6956
|
+
this.menu()?.openAt(x, y);
|
|
6957
|
+
}
|
|
6958
|
+
/** @internal */
|
|
6959
|
+
_runAction(action) {
|
|
6960
|
+
const node = this._menuNode();
|
|
6961
|
+
const path = this._menuPath();
|
|
6962
|
+
if (!node)
|
|
6963
|
+
return;
|
|
6964
|
+
switch (action) {
|
|
6965
|
+
case 'copyValue':
|
|
6966
|
+
this.copyToClipboard(node.label);
|
|
6967
|
+
break;
|
|
6968
|
+
case 'copyPath':
|
|
6969
|
+
this.copyToClipboard(path.map((n) => n.label).join(this.pathSeparator()));
|
|
6970
|
+
break;
|
|
6971
|
+
case 'copyObject':
|
|
6972
|
+
this.copyToClipboard(this.serializeNode(node));
|
|
6973
|
+
break;
|
|
6974
|
+
case 'expandAll':
|
|
6975
|
+
this.expandSubtree(node, true);
|
|
6976
|
+
break;
|
|
6977
|
+
case 'collapseAll':
|
|
6978
|
+
this.expandSubtree(node, false);
|
|
6979
|
+
break;
|
|
6980
|
+
case 'goToParent': {
|
|
6981
|
+
const parent = path[path.length - 2];
|
|
6982
|
+
if (parent)
|
|
6983
|
+
this.scrollAndFlash(parent);
|
|
6984
|
+
break;
|
|
6985
|
+
}
|
|
6986
|
+
case 'collapseParent': {
|
|
6987
|
+
const parent = path[path.length - 2];
|
|
6988
|
+
if (parent)
|
|
6989
|
+
this.setExpanded(parent, false);
|
|
6990
|
+
break;
|
|
6991
|
+
}
|
|
6992
|
+
}
|
|
6993
|
+
this.nodeContextAction.emit({ node, path, action });
|
|
6994
|
+
}
|
|
6995
|
+
serializeNode(node) {
|
|
6996
|
+
const value = node.data !== undefined ? node.data : this.sanitize(node);
|
|
6997
|
+
try {
|
|
6998
|
+
return JSON.stringify(value, null, 2);
|
|
6999
|
+
}
|
|
7000
|
+
catch {
|
|
7001
|
+
return String(value);
|
|
7002
|
+
}
|
|
7003
|
+
}
|
|
7004
|
+
sanitize(node) {
|
|
7005
|
+
return {
|
|
7006
|
+
label: node.label,
|
|
7007
|
+
...(node.icon !== undefined ? { icon: node.icon } : {}),
|
|
7008
|
+
...(node.children?.length ? { children: node.children.map((c) => this.sanitize(c)) } : {}),
|
|
7009
|
+
};
|
|
7010
|
+
}
|
|
7011
|
+
scrollAndFlash(node) {
|
|
7012
|
+
const el = this._nodeElements.get(node);
|
|
7013
|
+
if (el) {
|
|
7014
|
+
el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
7015
|
+
}
|
|
7016
|
+
this._flashNode.set(node);
|
|
7017
|
+
if (this.flashTimer)
|
|
7018
|
+
clearTimeout(this.flashTimer);
|
|
7019
|
+
this.flashTimer = setTimeout(() => {
|
|
7020
|
+
this._flashNode.set(null);
|
|
7021
|
+
this.flashTimer = null;
|
|
7022
|
+
}, 1000);
|
|
7023
|
+
}
|
|
7024
|
+
copyToClipboard(text) {
|
|
7025
|
+
if (navigator.clipboard?.writeText) {
|
|
7026
|
+
navigator.clipboard.writeText(text).catch(() => this.execCommandCopy(text));
|
|
7027
|
+
}
|
|
7028
|
+
else {
|
|
7029
|
+
this.execCommandCopy(text);
|
|
7030
|
+
}
|
|
7031
|
+
}
|
|
7032
|
+
execCommandCopy(text) {
|
|
7033
|
+
const ta = document.createElement('textarea');
|
|
7034
|
+
ta.value = text;
|
|
7035
|
+
ta.setAttribute('readonly', '');
|
|
7036
|
+
ta.style.position = 'fixed';
|
|
7037
|
+
ta.style.opacity = '0';
|
|
7038
|
+
document.body.appendChild(ta);
|
|
7039
|
+
ta.select();
|
|
7040
|
+
try {
|
|
7041
|
+
document.execCommand('copy');
|
|
7042
|
+
}
|
|
7043
|
+
finally {
|
|
7044
|
+
document.body.removeChild(ta);
|
|
7045
|
+
}
|
|
7046
|
+
}
|
|
6886
7047
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6887
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TreeComponent, isStandalone: true, selector: "ui-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, indent: { classPropertyName: "indent", publicName: "indent", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", nodeDrop: "nodeDrop" }, providers: [{ provide: TREE_HOST, useExisting: TreeComponent }], ngImport: i0, template: "<div class=\"ui-tree\">\n @for (node of nodes(); track node) {\n <ui-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [indent]=\"indent()\"\n (nodeClick)=\"_onNodeClick($event)\"\n (nodeExpand)=\"_onNodeExpand($event)\"\n (nodeCollapse)=\"_onNodeCollapse($event)\"\n />\n }\n</div>\n", styles: [":host{display:block}.ui-tree{font-size:var(--ui-font-sm);color:var(--ui-text);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ui-tree-node", inputs: ["node", "level", "indent"], outputs: ["nodeClick", "nodeExpand", "nodeCollapse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
7048
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TreeComponent, isStandalone: true, selector: "ui-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, indent: { classPropertyName: "indent", publicName: "indent", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, expandOnClick: { classPropertyName: "expandOnClick", publicName: "expandOnClick", isSignal: true, isRequired: false, transformFunction: null }, contextMenu: { classPropertyName: "contextMenu", publicName: "contextMenu", isSignal: true, isRequired: false, transformFunction: null }, pathSeparator: { classPropertyName: "pathSeparator", publicName: "pathSeparator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeExpand: "nodeExpand", nodeCollapse: "nodeCollapse", nodeDrop: "nodeDrop", nodeContextAction: "nodeContextAction" }, providers: [{ provide: TREE_HOST, useExisting: TreeComponent }], viewQueries: [{ propertyName: "menu", first: true, predicate: ["treeMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ui-tree\">\n @for (node of nodes(); track node) {\n <ui-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [indent]=\"indent()\"\n [parentPath]=\"[]\"\n (nodeClick)=\"_onNodeClick($event)\"\n (nodeExpand)=\"_onNodeExpand($event)\"\n (nodeCollapse)=\"_onNodeCollapse($event)\"\n />\n }\n</div>\n\n@if (contextMenu()) {\n <ui-dropdown #treeMenu>\n <ui-dropdown-item (clicked)=\"_runAction('copyValue')\">Copy value</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('copyPath')\">Copy path</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('copyObject')\">Copy object</ui-dropdown-item>\n @if (_menuHasChildren()) {\n <ui-dropdown-divider />\n <ui-dropdown-item (clicked)=\"_runAction('expandAll')\">Expand all</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('collapseAll')\">Collapse all</ui-dropdown-item>\n }\n @if (_menuHasParent()) {\n <ui-dropdown-divider />\n <ui-dropdown-item (clicked)=\"_runAction('goToParent')\">Go to parent</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('collapseParent')\">Collapse parent</ui-dropdown-item>\n }\n </ui-dropdown>\n}\n", styles: [":host{display:block}.ui-tree{font-size:var(--ui-font-sm);color:var(--ui-text);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "component", type: TreeNodeComponent, selector: "ui-tree-node", inputs: ["node", "level", "indent", "parentPath"], outputs: ["nodeClick", "nodeExpand", "nodeCollapse"] }, { kind: "component", type: DropdownComponent, selector: "ui-dropdown", inputs: ["position", "closeOnSelect", "matchTriggerWidth"] }, { kind: "component", type: DropdownItemComponent, selector: "ui-dropdown-item", inputs: ["disabled", "icon"], outputs: ["clicked"] }, { kind: "component", type: DropdownDividerComponent, selector: "ui-dropdown-divider" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
6888
7049
|
}
|
|
6889
7050
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TreeComponent, decorators: [{
|
|
6890
7051
|
type: Component,
|
|
6891
|
-
args: [{ selector: 'ui-tree', standalone: true, imports: [TreeNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: TREE_HOST, useExisting: TreeComponent }], template: "<div class=\"ui-tree\">\n @for (node of nodes(); track node) {\n <ui-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [indent]=\"indent()\"\n (nodeClick)=\"_onNodeClick($event)\"\n (nodeExpand)=\"_onNodeExpand($event)\"\n (nodeCollapse)=\"_onNodeCollapse($event)\"\n />\n }\n</div>\n", styles: [":host{display:block}.ui-tree{font-size:var(--ui-font-sm);color:var(--ui-text);-webkit-user-select:none;user-select:none}\n"] }]
|
|
6892
|
-
}], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], indent: [{ type: i0.Input, args: [{ isSignal: true, alias: "indent", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCollapse: [{ type: i0.Output, args: ["nodeCollapse"] }], nodeDrop: [{ type: i0.Output, args: ["nodeDrop"] }] } });
|
|
7052
|
+
args: [{ selector: 'ui-tree', standalone: true, imports: [TreeNodeComponent, DropdownComponent, DropdownItemComponent, DropdownDividerComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: TREE_HOST, useExisting: TreeComponent }], template: "<div class=\"ui-tree\">\n @for (node of nodes(); track node) {\n <ui-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [indent]=\"indent()\"\n [parentPath]=\"[]\"\n (nodeClick)=\"_onNodeClick($event)\"\n (nodeExpand)=\"_onNodeExpand($event)\"\n (nodeCollapse)=\"_onNodeCollapse($event)\"\n />\n }\n</div>\n\n@if (contextMenu()) {\n <ui-dropdown #treeMenu>\n <ui-dropdown-item (clicked)=\"_runAction('copyValue')\">Copy value</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('copyPath')\">Copy path</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('copyObject')\">Copy object</ui-dropdown-item>\n @if (_menuHasChildren()) {\n <ui-dropdown-divider />\n <ui-dropdown-item (clicked)=\"_runAction('expandAll')\">Expand all</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('collapseAll')\">Collapse all</ui-dropdown-item>\n }\n @if (_menuHasParent()) {\n <ui-dropdown-divider />\n <ui-dropdown-item (clicked)=\"_runAction('goToParent')\">Go to parent</ui-dropdown-item>\n <ui-dropdown-item (clicked)=\"_runAction('collapseParent')\">Collapse parent</ui-dropdown-item>\n }\n </ui-dropdown>\n}\n", styles: [":host{display:block}.ui-tree{font-size:var(--ui-font-sm);color:var(--ui-text);-webkit-user-select:none;user-select:none}\n"] }]
|
|
7053
|
+
}], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], indent: [{ type: i0.Input, args: [{ isSignal: true, alias: "indent", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], expandOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandOnClick", required: false }] }], contextMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "contextMenu", required: false }] }], pathSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathSeparator", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCollapse: [{ type: i0.Output, args: ["nodeCollapse"] }], nodeDrop: [{ type: i0.Output, args: ["nodeDrop"] }], nodeContextAction: [{ type: i0.Output, args: ["nodeContextAction"] }], menu: [{ type: i0.ViewChild, args: ['treeMenu', { isSignal: true }] }] } });
|
|
6893
7054
|
|
|
6894
7055
|
/** Directive to mark a custom variable popover template */
|
|
6895
7056
|
class VariablePopoverDirective {
|