@memberjunction/ng-trees 5.43.0 → 5.44.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/dist/lib/ng-trees.module.d.ts +2 -1
- package/dist/lib/ng-trees.module.d.ts.map +1 -1
- package/dist/lib/ng-trees.module.js +7 -3
- package/dist/lib/ng-trees.module.js.map +1 -1
- package/dist/lib/tree/tree.component.js +31 -37
- package/dist/lib/tree/tree.component.js.map +1 -1
- package/package.json +7 -5
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/tree-events.test.d.ts +0 -2
- package/dist/__tests__/tree-events.test.d.ts.map +0 -1
- package/dist/__tests__/tree-events.test.js +0 -101
- package/dist/__tests__/tree-events.test.js.map +0 -1
- package/dist/__tests__/tree-types.test.d.ts +0 -2
- package/dist/__tests__/tree-types.test.d.ts.map +0 -1
- package/dist/__tests__/tree-types.test.js +0 -82
- package/dist/__tests__/tree-types.test.js.map +0 -1
|
@@ -3,9 +3,10 @@ import * as i1 from "./tree/tree.component";
|
|
|
3
3
|
import * as i2 from "./tree-dropdown/tree-dropdown.component";
|
|
4
4
|
import * as i3 from "@angular/common";
|
|
5
5
|
import * as i4 from "@angular/forms";
|
|
6
|
+
import * as i5 from "@memberjunction/ng-ui-components";
|
|
6
7
|
export declare class NgTreesModule {
|
|
7
8
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgTreesModule, never>;
|
|
8
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<NgTreesModule, [typeof i1.TreeComponent, typeof i2.TreeDropdownComponent], [typeof i3.CommonModule, typeof i4.FormsModule], [typeof i1.TreeComponent, typeof i2.TreeDropdownComponent]>;
|
|
9
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgTreesModule, [typeof i1.TreeComponent, typeof i2.TreeDropdownComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.MJEmptyStateComponent], [typeof i1.TreeComponent, typeof i2.TreeDropdownComponent]>;
|
|
9
10
|
static ɵinj: i0.ɵɵInjectorDeclaration<NgTreesModule>;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=ng-trees.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-trees.module.d.ts","sourceRoot":"","sources":["../../src/lib/ng-trees.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ng-trees.module.d.ts","sourceRoot":"","sources":["../../src/lib/ng-trees.module.ts"],"names":[],"mappings":";;;;;;AAeA,qBAea,aAAa;yCAAb,aAAa;0CAAb,aAAa;0CAAb,aAAa;CAAI"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { NgModule } from '@angular/core';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
8
|
import { FormsModule } from '@angular/forms';
|
|
9
|
+
import { MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
|
|
9
10
|
// Components
|
|
10
11
|
import { TreeComponent } from './tree/tree.component';
|
|
11
12
|
import { TreeDropdownComponent } from './tree-dropdown/tree-dropdown.component';
|
|
@@ -14,7 +15,8 @@ export class NgTreesModule {
|
|
|
14
15
|
static ɵfac = function NgTreesModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || NgTreesModule)(); };
|
|
15
16
|
static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: NgTreesModule });
|
|
16
17
|
static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
|
|
17
|
-
FormsModule
|
|
18
|
+
FormsModule,
|
|
19
|
+
MJEmptyStateComponent] });
|
|
18
20
|
}
|
|
19
21
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NgTreesModule, [{
|
|
20
22
|
type: NgModule,
|
|
@@ -25,7 +27,8 @@ export class NgTreesModule {
|
|
|
25
27
|
],
|
|
26
28
|
imports: [
|
|
27
29
|
CommonModule,
|
|
28
|
-
FormsModule
|
|
30
|
+
FormsModule,
|
|
31
|
+
MJEmptyStateComponent
|
|
29
32
|
],
|
|
30
33
|
exports: [
|
|
31
34
|
TreeComponent,
|
|
@@ -35,6 +38,7 @@ export class NgTreesModule {
|
|
|
35
38
|
}], null, null); })();
|
|
36
39
|
(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(NgTreesModule, { declarations: [TreeComponent,
|
|
37
40
|
TreeDropdownComponent], imports: [CommonModule,
|
|
38
|
-
FormsModule
|
|
41
|
+
FormsModule,
|
|
42
|
+
MJEmptyStateComponent], exports: [TreeComponent,
|
|
39
43
|
TreeDropdownComponent] }); })();
|
|
40
44
|
//# sourceMappingURL=ng-trees.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-trees.module.js","sourceRoot":"","sources":["../../src/lib/ng-trees.module.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ng-trees.module.js","sourceRoot":"","sources":["../../src/lib/ng-trees.module.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;;AAiBhF,MAAM,OAAO,aAAa;uGAAb,aAAa;4DAAb,aAAa;gEATlB,YAAY;YACZ,WAAW;YACX,qBAAqB;;iFAOhB,aAAa;cAfzB,QAAQ;eAAC;gBACN,YAAY,EAAE;oBACV,aAAa;oBACb,qBAAqB;iBACxB;gBACD,OAAO,EAAE;oBACL,YAAY;oBACZ,WAAW;oBACX,qBAAqB;iBACxB;gBACD,OAAO,EAAE;oBACL,aAAa;oBACb,qBAAqB;iBACxB;aACJ;;wFACY,aAAa,mBAblB,aAAa;QACb,qBAAqB,aAGrB,YAAY;QACZ,WAAW;QACX,qBAAqB,aAGrB,aAAa;QACb,qBAAqB","sourcesContent":["/**\n * NgTrees Module for @memberjunction/ng-trees\n *\n * Provides tree and tree dropdown components for hierarchical entity selection.\n */\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MJEmptyStateComponent } from '@memberjunction/ng-ui-components';\n\n// Components\nimport { TreeComponent } from './tree/tree.component';\nimport { TreeDropdownComponent } from './tree-dropdown/tree-dropdown.component';\n\n@NgModule({\n declarations: [\n TreeComponent,\n TreeDropdownComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n MJEmptyStateComponent\n ],\n exports: [\n TreeComponent,\n TreeDropdownComponent\n ]\n})\nexport class NgTreesModule { }\n"]}
|
|
@@ -10,6 +10,7 @@ import { createDefaultTreeNode } from '../models/tree-types';
|
|
|
10
10
|
import { BeforeNodeSelectEventArgs, AfterNodeSelectEventArgs, BeforeNodeDeselectEventArgs, AfterNodeDeselectEventArgs, BeforeNodeExpandEventArgs, AfterNodeExpandEventArgs, BeforeNodeCollapseEventArgs, AfterNodeCollapseEventArgs, BeforeNodeClickEventArgs, AfterNodeClickEventArgs, BeforeNodeDoubleClickEventArgs, AfterNodeDoubleClickEventArgs, BeforeDataLoadEventArgs, AfterDataLoadEventArgs, BeforeKeyboardNavigateEventArgs, AfterKeyboardNavigateEventArgs } from '../events/tree-events';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
13
14
|
const _c0 = a0 => ({ node: a0 });
|
|
14
15
|
const _c1 = (a0, a1) => ({ "fa-chevron-right": a0, "fa-chevron-down": a1 });
|
|
15
16
|
function TreeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -49,23 +50,16 @@ function TreeComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
|
49
50
|
i0.ɵɵelementEnd()();
|
|
50
51
|
} }
|
|
51
52
|
function TreeComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
-
i0.ɵɵ
|
|
53
|
-
i0.ɵɵelement(1, "i");
|
|
54
|
-
i0.ɵɵelementStart(2, "span", 18);
|
|
55
|
-
i0.ɵɵtext(3);
|
|
56
|
-
i0.ɵɵelementEnd()();
|
|
53
|
+
i0.ɵɵelement(0, "mj-empty-state", 5);
|
|
57
54
|
} if (rf & 2) {
|
|
58
55
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
59
|
-
i0.ɵɵ
|
|
60
|
-
i0.ɵɵclassMap(ctx_r1.EmptyIcon + " tree-empty__icon");
|
|
61
|
-
i0.ɵɵadvance(2);
|
|
62
|
-
i0.ɵɵtextInterpolate(ctx_r1.EmptyMessage);
|
|
56
|
+
i0.ɵɵproperty("Icon", ctx_r1.EmptyIcon)("Title", ctx_r1.EmptyMessage);
|
|
63
57
|
} }
|
|
64
58
|
function TreeComponent_Conditional_5_For_2_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
65
59
|
i0.ɵɵelementContainer(0);
|
|
66
60
|
} }
|
|
67
61
|
function TreeComponent_Conditional_5_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
-
i0.ɵɵtemplate(0, TreeComponent_Conditional_5_For_2_Conditional_0_ng_container_0_Template, 1, 0, "ng-container",
|
|
62
|
+
i0.ɵɵtemplate(0, TreeComponent_Conditional_5_For_2_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 18);
|
|
69
63
|
} if (rf & 2) {
|
|
70
64
|
const node_r4 = i0.ɵɵnextContext().$implicit;
|
|
71
65
|
i0.ɵɵnextContext(2);
|
|
@@ -88,20 +82,20 @@ function TreeComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
|
88
82
|
i0.ɵɵrepeater(ctx_r1.Nodes);
|
|
89
83
|
} }
|
|
90
84
|
function TreeComponent_ng_template_6_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
91
|
-
i0.ɵɵelement(0, "i",
|
|
85
|
+
i0.ɵɵelement(0, "i", 30);
|
|
92
86
|
} if (rf & 2) {
|
|
93
87
|
const node_r7 = i0.ɵɵnextContext(2).node;
|
|
94
88
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(1, _c1, !node_r7.Expanded, node_r7.Expanded));
|
|
95
89
|
} }
|
|
96
90
|
function TreeComponent_ng_template_6_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
97
|
-
i0.ɵɵelement(0, "span",
|
|
91
|
+
i0.ɵɵelement(0, "span", 31);
|
|
98
92
|
} }
|
|
99
93
|
function TreeComponent_ng_template_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
100
94
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
101
|
-
i0.ɵɵelementStart(0, "span",
|
|
95
|
+
i0.ɵɵelementStart(0, "span", 29);
|
|
102
96
|
i0.ɵɵlistener("click", function TreeComponent_ng_template_6_Conditional_1_Template_span_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const node_r7 = i0.ɵɵnextContext().node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onToggleClick(node_r7, $event)); });
|
|
103
|
-
i0.ɵɵconditionalCreate(1, TreeComponent_ng_template_6_Conditional_1_Conditional_1_Template, 1, 4, "i",
|
|
104
|
-
i0.ɵɵconditionalCreate(2, TreeComponent_ng_template_6_Conditional_1_Conditional_2_Template, 1, 0, "span",
|
|
97
|
+
i0.ɵɵconditionalCreate(1, TreeComponent_ng_template_6_Conditional_1_Conditional_1_Template, 1, 4, "i", 30);
|
|
98
|
+
i0.ɵɵconditionalCreate(2, TreeComponent_ng_template_6_Conditional_1_Conditional_2_Template, 1, 0, "span", 31);
|
|
105
99
|
i0.ɵɵelementEnd();
|
|
106
100
|
} if (rf & 2) {
|
|
107
101
|
const node_r7 = i0.ɵɵnextContext().node;
|
|
@@ -111,10 +105,10 @@ function TreeComponent_ng_template_6_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
111
105
|
i0.ɵɵconditional(node_r7.Children.length === 0 ? 2 : -1);
|
|
112
106
|
} }
|
|
113
107
|
function TreeComponent_ng_template_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
114
|
-
i0.ɵɵelement(0, "span",
|
|
108
|
+
i0.ɵɵelement(0, "span", 21);
|
|
115
109
|
} }
|
|
116
110
|
function TreeComponent_ng_template_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
117
|
-
i0.ɵɵelementStart(0, "span",
|
|
111
|
+
i0.ɵɵelementStart(0, "span", 32);
|
|
118
112
|
i0.ɵɵelement(1, "i");
|
|
119
113
|
i0.ɵɵelementEnd();
|
|
120
114
|
} if (rf & 2) {
|
|
@@ -124,7 +118,7 @@ function TreeComponent_ng_template_6_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
124
118
|
i0.ɵɵclassMap(node_r7.Icon);
|
|
125
119
|
} }
|
|
126
120
|
function TreeComponent_ng_template_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
127
|
-
i0.ɵɵelementStart(0, "span",
|
|
121
|
+
i0.ɵɵelementStart(0, "span", 25);
|
|
128
122
|
i0.ɵɵtext(1);
|
|
129
123
|
i0.ɵɵelementEnd();
|
|
130
124
|
} if (rf & 2) {
|
|
@@ -133,7 +127,7 @@ function TreeComponent_ng_template_6_Conditional_6_Template(rf, ctx) { if (rf &
|
|
|
133
127
|
i0.ɵɵtextInterpolate1(" ", node_r7.Description, " ");
|
|
134
128
|
} }
|
|
135
129
|
function TreeComponent_ng_template_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
-
i0.ɵɵelementStart(0, "span",
|
|
130
|
+
i0.ɵɵelementStart(0, "span", 26);
|
|
137
131
|
i0.ɵɵtext(1);
|
|
138
132
|
i0.ɵɵelementEnd();
|
|
139
133
|
} if (rf & 2) {
|
|
@@ -142,15 +136,15 @@ function TreeComponent_ng_template_6_Conditional_7_Template(rf, ctx) { if (rf &
|
|
|
142
136
|
i0.ɵɵtextInterpolate1(" ", node_r7.Badge, " ");
|
|
143
137
|
} }
|
|
144
138
|
function TreeComponent_ng_template_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
145
|
-
i0.ɵɵelementStart(0, "span",
|
|
146
|
-
i0.ɵɵelement(1, "i",
|
|
139
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
140
|
+
i0.ɵɵelement(1, "i", 33);
|
|
147
141
|
i0.ɵɵelementEnd();
|
|
148
142
|
} }
|
|
149
143
|
function TreeComponent_ng_template_6_Conditional_9_For_2_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
150
144
|
i0.ɵɵelementContainer(0);
|
|
151
145
|
} }
|
|
152
146
|
function TreeComponent_ng_template_6_Conditional_9_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
-
i0.ɵɵtemplate(0, TreeComponent_ng_template_6_Conditional_9_For_2_Conditional_0_ng_container_0_Template, 1, 0, "ng-container",
|
|
147
|
+
i0.ɵɵtemplate(0, TreeComponent_ng_template_6_Conditional_9_For_2_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 18);
|
|
154
148
|
} if (rf & 2) {
|
|
155
149
|
const child_r9 = i0.ɵɵnextContext().$implicit;
|
|
156
150
|
i0.ɵɵnextContext(3);
|
|
@@ -164,7 +158,7 @@ function TreeComponent_ng_template_6_Conditional_9_For_2_Template(rf, ctx) { if
|
|
|
164
158
|
i0.ɵɵconditional(child_r9.Visible ? 0 : -1);
|
|
165
159
|
} }
|
|
166
160
|
function TreeComponent_ng_template_6_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
167
|
-
i0.ɵɵelementStart(0, "div",
|
|
161
|
+
i0.ɵɵelementStart(0, "div", 34);
|
|
168
162
|
i0.ɵɵrepeaterCreate(1, TreeComponent_ng_template_6_Conditional_9_For_2_Template, 1, 1, null, null, i0.ɵɵcomponentInstance().trackNode, true);
|
|
169
163
|
i0.ɵɵelementEnd();
|
|
170
164
|
} if (rf & 2) {
|
|
@@ -176,19 +170,19 @@ function TreeComponent_ng_template_6_Conditional_9_Template(rf, ctx) { if (rf &
|
|
|
176
170
|
} }
|
|
177
171
|
function TreeComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
|
|
178
172
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
179
|
-
i0.ɵɵelementStart(0, "div",
|
|
173
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
180
174
|
i0.ɵɵlistener("click", function TreeComponent_ng_template_6_Template_div_click_0_listener($event) { const node_r7 = i0.ɵɵrestoreView(_r6).node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeClick(node_r7, $event)); })("dblclick", function TreeComponent_ng_template_6_Template_div_dblclick_0_listener($event) { const node_r7 = i0.ɵɵrestoreView(_r6).node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeDoubleClick(node_r7, $event)); });
|
|
181
|
-
i0.ɵɵconditionalCreate(1, TreeComponent_ng_template_6_Conditional_1_Template, 3, 2, "span",
|
|
182
|
-
i0.ɵɵconditionalCreate(2, TreeComponent_ng_template_6_Conditional_2_Template, 1, 0, "span",
|
|
183
|
-
i0.ɵɵconditionalCreate(3, TreeComponent_ng_template_6_Conditional_3_Template, 2, 4, "span",
|
|
184
|
-
i0.ɵɵelementStart(4, "span",
|
|
185
|
-
i0.ɵɵelement(5, "span",
|
|
186
|
-
i0.ɵɵconditionalCreate(6, TreeComponent_ng_template_6_Conditional_6_Template, 2, 1, "span",
|
|
175
|
+
i0.ɵɵconditionalCreate(1, TreeComponent_ng_template_6_Conditional_1_Template, 3, 2, "span", 20);
|
|
176
|
+
i0.ɵɵconditionalCreate(2, TreeComponent_ng_template_6_Conditional_2_Template, 1, 0, "span", 21);
|
|
177
|
+
i0.ɵɵconditionalCreate(3, TreeComponent_ng_template_6_Conditional_3_Template, 2, 4, "span", 22);
|
|
178
|
+
i0.ɵɵelementStart(4, "span", 23);
|
|
179
|
+
i0.ɵɵelement(5, "span", 24);
|
|
180
|
+
i0.ɵɵconditionalCreate(6, TreeComponent_ng_template_6_Conditional_6_Template, 2, 1, "span", 25);
|
|
187
181
|
i0.ɵɵelementEnd();
|
|
188
|
-
i0.ɵɵconditionalCreate(7, TreeComponent_ng_template_6_Conditional_7_Template, 2, 1, "span",
|
|
189
|
-
i0.ɵɵconditionalCreate(8, TreeComponent_ng_template_6_Conditional_8_Template, 2, 0, "span",
|
|
182
|
+
i0.ɵɵconditionalCreate(7, TreeComponent_ng_template_6_Conditional_7_Template, 2, 1, "span", 26);
|
|
183
|
+
i0.ɵɵconditionalCreate(8, TreeComponent_ng_template_6_Conditional_8_Template, 2, 0, "span", 27);
|
|
190
184
|
i0.ɵɵelementEnd();
|
|
191
|
-
i0.ɵɵconditionalCreate(9, TreeComponent_ng_template_6_Conditional_9_Template, 3, 2, "div",
|
|
185
|
+
i0.ɵɵconditionalCreate(9, TreeComponent_ng_template_6_Conditional_9_Template, 3, 2, "div", 28);
|
|
192
186
|
} if (rf & 2) {
|
|
193
187
|
const node_r7 = ctx.node;
|
|
194
188
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1625,12 +1619,12 @@ export class TreeComponent {
|
|
|
1625
1619
|
static ɵfac = function TreeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TreeComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
1626
1620
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TreeComponent, selectors: [["mj-tree"]], hostBindings: function TreeComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1627
1621
|
i0.ɵɵlistener("keydown", function TreeComponent_keydown_HostBindingHandler($event) { return ctx.onKeyDown($event); });
|
|
1628
|
-
} }, inputs: { BranchConfig: "BranchConfig", LeafConfig: "LeafConfig", SelectionMode: "SelectionMode", SelectableTypes: "SelectableTypes", SelectedIDs: "SelectedIDs", ExpandedIDs: "ExpandedIDs", ShowExpandCollapseAll: "ShowExpandCollapseAll", EnableKeyboardNavigation: "EnableKeyboardNavigation", KeyboardConfig: "KeyboardConfig", StyleConfig: "StyleConfig", IndentSize: "IndentSize", ShowLoading: "ShowLoading", EmptyMessage: "EmptyMessage", EmptyIcon: "EmptyIcon", AutoLoad: "AutoLoad", ShowIcons: "ShowIcons", ShowDescriptions: "ShowDescriptions", ShowBadges: "ShowBadges", AnimateExpandCollapse: "AnimateExpandCollapse" }, outputs: { BeforeNodeSelect: "BeforeNodeSelect", AfterNodeSelect: "AfterNodeSelect", BeforeNodeDeselect: "BeforeNodeDeselect", AfterNodeDeselect: "AfterNodeDeselect", BeforeNodeExpand: "BeforeNodeExpand", AfterNodeExpand: "AfterNodeExpand", BeforeNodeCollapse: "BeforeNodeCollapse", AfterNodeCollapse: "AfterNodeCollapse", BeforeNodeClick: "BeforeNodeClick", AfterNodeClick: "AfterNodeClick", BeforeNodeDoubleClick: "BeforeNodeDoubleClick", AfterNodeDoubleClick: "AfterNodeDoubleClick", BeforeDataLoad: "BeforeDataLoad", AfterDataLoad: "AfterDataLoad", BeforeKeyboardNavigate: "BeforeKeyboardNavigate", AfterKeyboardNavigate: "AfterKeyboardNavigate", SelectionChange: "SelectionChange" }, standalone: false, decls: 8, vars: 6, consts: [["nodeTemplate", ""], ["tabindex", "0", 3, "ngClass"], [1, "tree-loading"], [1, "tree-error"], [1, "tree-toolbar"], [1, "tree-empty"], [1, "tree-content"], [1, "tree-loading__spinner"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "tree-loading__text"], [1, "fa-solid", "fa-exclamation-triangle", "tree-error__icon"], [1, "tree-error__message"], [1, "tree-error__retry", 3, "click"], [1, "fa-solid", "fa-refresh"], ["title", "Expand All", 1, "tree-toolbar__btn", 3, "click"], [1, "fa-solid", "fa-plus-square"], ["title", "Collapse All", 1, "tree-toolbar__btn", 3, "click"], [1, "fa-solid", "fa-minus-square"], [
|
|
1622
|
+
} }, inputs: { BranchConfig: "BranchConfig", LeafConfig: "LeafConfig", SelectionMode: "SelectionMode", SelectableTypes: "SelectableTypes", SelectedIDs: "SelectedIDs", ExpandedIDs: "ExpandedIDs", ShowExpandCollapseAll: "ShowExpandCollapseAll", EnableKeyboardNavigation: "EnableKeyboardNavigation", KeyboardConfig: "KeyboardConfig", StyleConfig: "StyleConfig", IndentSize: "IndentSize", ShowLoading: "ShowLoading", EmptyMessage: "EmptyMessage", EmptyIcon: "EmptyIcon", AutoLoad: "AutoLoad", ShowIcons: "ShowIcons", ShowDescriptions: "ShowDescriptions", ShowBadges: "ShowBadges", AnimateExpandCollapse: "AnimateExpandCollapse" }, outputs: { BeforeNodeSelect: "BeforeNodeSelect", AfterNodeSelect: "AfterNodeSelect", BeforeNodeDeselect: "BeforeNodeDeselect", AfterNodeDeselect: "AfterNodeDeselect", BeforeNodeExpand: "BeforeNodeExpand", AfterNodeExpand: "AfterNodeExpand", BeforeNodeCollapse: "BeforeNodeCollapse", AfterNodeCollapse: "AfterNodeCollapse", BeforeNodeClick: "BeforeNodeClick", AfterNodeClick: "AfterNodeClick", BeforeNodeDoubleClick: "BeforeNodeDoubleClick", AfterNodeDoubleClick: "AfterNodeDoubleClick", BeforeDataLoad: "BeforeDataLoad", AfterDataLoad: "AfterDataLoad", BeforeKeyboardNavigate: "BeforeKeyboardNavigate", AfterKeyboardNavigate: "AfterKeyboardNavigate", SelectionChange: "SelectionChange" }, standalone: false, decls: 8, vars: 6, consts: [["nodeTemplate", ""], ["tabindex", "0", 3, "ngClass"], [1, "tree-loading"], [1, "tree-error"], [1, "tree-toolbar"], ["Size", "compact", 1, "tree-empty", 3, "Icon", "Title"], [1, "tree-content"], [1, "tree-loading__spinner"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "tree-loading__text"], [1, "fa-solid", "fa-exclamation-triangle", "tree-error__icon"], [1, "tree-error__message"], [1, "tree-error__retry", 3, "click"], [1, "fa-solid", "fa-refresh"], ["title", "Expand All", 1, "tree-toolbar__btn", 3, "click"], [1, "fa-solid", "fa-plus-square"], ["title", "Collapse All", 1, "tree-toolbar__btn", 3, "click"], [1, "fa-solid", "fa-minus-square"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["role", "treeitem", 3, "click", "dblclick", "ngClass"], [1, "tree-node-toggle"], [1, "tree-node-leaf-spacer"], [1, "tree-node-icon", 3, "color"], [1, "tree-node-content"], [1, "tree-node-label", 3, "innerHTML"], [1, "tree-node-description"], [1, "tree-node-badge"], [1, "tree-node-selected-indicator"], ["role", "group", 1, "tree-node-children", 3, "tree-node-children--animated"], [1, "tree-node-toggle", 3, "click"], [1, "fa-solid", "tree-node-toggle__icon", 3, "ngClass"], [1, "tree-node-toggle__spacer"], [1, "tree-node-icon"], [1, "fa-solid", "fa-check"], ["role", "group", 1, "tree-node-children"]], template: function TreeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1629
1623
|
i0.ɵɵelementStart(0, "div", 1);
|
|
1630
1624
|
i0.ɵɵconditionalCreate(1, TreeComponent_Conditional_1_Template, 5, 0, "div", 2);
|
|
1631
1625
|
i0.ɵɵconditionalCreate(2, TreeComponent_Conditional_2_Template, 7, 1, "div", 3);
|
|
1632
1626
|
i0.ɵɵconditionalCreate(3, TreeComponent_Conditional_3_Template, 5, 0, "div", 4);
|
|
1633
|
-
i0.ɵɵconditionalCreate(4, TreeComponent_Conditional_4_Template,
|
|
1627
|
+
i0.ɵɵconditionalCreate(4, TreeComponent_Conditional_4_Template, 1, 2, "mj-empty-state", 5);
|
|
1634
1628
|
i0.ɵɵconditionalCreate(5, TreeComponent_Conditional_5_Template, 3, 0, "div", 6);
|
|
1635
1629
|
i0.ɵɵelementEnd();
|
|
1636
1630
|
i0.ɵɵtemplate(6, TreeComponent_ng_template_6_Template, 10, 15, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
@@ -1646,11 +1640,11 @@ export class TreeComponent {
|
|
|
1646
1640
|
i0.ɵɵconditional(ctx.IsLoaded && ctx.Nodes.length === 0 && !ctx.ErrorMessage && !ctx.IsLoading ? 4 : -1);
|
|
1647
1641
|
i0.ɵɵadvance();
|
|
1648
1642
|
i0.ɵɵconditional(ctx.Nodes.length > 0 && !ctx.IsLoading ? 5 : -1);
|
|
1649
|
-
} }, dependencies: [i1.NgClass, i1.NgTemplateOutlet], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n \n\n --tree-bg: var(--mj-bg-surface);\n --tree-border-color: var(--mj-border-default);\n --tree-text-color: var(--mj-text-primary);\n --tree-text-secondary: var(--mj-text-muted);\n --tree-text-muted: var(--mj-text-disabled);\n\n \n\n --tree-node-hover-bg: var(--mj-bg-surface-sunken);\n --tree-node-selected-bg: var(--mj-brand-primary-subtle);\n --tree-node-selected-border: var(--mj-brand-primary);\n --tree-node-focused-outline: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n --tree-node-match-bg: var(--mj-status-warning-subtle);\n\n \n\n --tree-icon-color: var(--mj-brand-primary);\n --tree-icon-leaf-color: var(--mj-text-muted);\n --tree-toggle-color: var(--mj-text-disabled);\n\n \n\n --tree-node-padding-y: 8px;\n --tree-node-padding-x: 12px;\n --tree-node-gap: 8px;\n --tree-icon-size: 16px;\n --tree-toggle-size: 12px;\n\n \n\n --tree-transition-duration: 150ms;\n --tree-animation-easing: ease-out;\n\n \n\n --tree-badge-bg: var(--mj-border-default);\n --tree-badge-color: var(--mj-text-muted);\n --tree-badge-size: 12px;\n\n display: block;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n.tree-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--tree-bg);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n outline: none;\n}\n\n.tree-container[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n\n\n\n\n\n.tree-loading[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-loading__spinner[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n color: var(--tree-icon-color);\n}\n\n.tree-loading__text[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n.tree-error[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n text-align: center;\n}\n\n.tree-error__icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-status-error);\n}\n\n.tree-error__message[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--tree-text-secondary);\n max-width: 280px;\n}\n\n.tree-error__retry[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--tree-border-color);\n border-radius: var(--mj-radius-md);\n background: var(--tree-bg);\n color: var(--tree-text-color);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-error__retry[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-hover-bg);\n border-color: var(--tree-icon-color);\n color: var(--tree-icon-color);\n}\n\n\n\n\n\n\n.tree-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-empty__icon[_ngcontent-%COMP%] {\n font-size: 40px;\n opacity: 0.5;\n}\n\n.tree-empty__message[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n.tree-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--tree-border-color);\n background: var(--tree-node-hover-bg);\n}\n\n.tree-toolbar__btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--tree-text-secondary);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-toolbar__btn[_ngcontent-%COMP%]:hover {\n background: var(--tree-bg);\n color: var(--tree-icon-color);\n}\n\n\n\n\n\n\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n}\n\n\n\n\n\n\n.tree-node[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--tree-node-gap);\n padding: var(--tree-node-padding-y) var(--tree-node-padding-x);\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n min-height: 36px;\n}\n\n.tree-node[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-hover-bg);\n}\n\n.tree-node--selected[_ngcontent-%COMP%] {\n background: var(--tree-node-selected-bg);\n border-left-color: var(--tree-node-selected-border);\n}\n\n.tree-node--selected[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-selected-bg);\n}\n\n.tree-node--focused[_ngcontent-%COMP%] {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n\n\n.tree-search-highlight[_ngcontent-%COMP%] {\n background: var(--tree-node-match-bg);\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n}\n\n\n\n\n\n\n.tree-node-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n border-radius: var(--mj-radius-sm);\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node-toggle[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.tree-node-toggle__icon[_ngcontent-%COMP%] {\n font-size: var(--tree-toggle-size);\n color: var(--tree-toggle-color);\n transition: transform var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node--expanded[_ngcontent-%COMP%] .tree-node-toggle__icon[_ngcontent-%COMP%] {\n color: var(--tree-icon-color);\n}\n\n.tree-node-toggle__spacer[_ngcontent-%COMP%] {\n width: var(--tree-toggle-size);\n}\n\n.tree-node-leaf-spacer[_ngcontent-%COMP%] {\n width: 20px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-icon-size);\n flex-shrink: 0;\n font-size: var(--tree-icon-size);\n color: var(--tree-icon-color);\n}\n\n.tree-node--leaf[_ngcontent-%COMP%] .tree-node-icon[_ngcontent-%COMP%] {\n color: var(--tree-icon-leaf-color);\n}\n\n\n\n\n\n\n.tree-node-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tree-node-label[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: 500;\n color: var(--tree-text-color);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tree-node--leaf[_ngcontent-%COMP%] .tree-node-label[_ngcontent-%COMP%] {\n font-weight: 400;\n}\n\n.tree-node-description[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--tree-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n\n\n\n.tree-node-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: var(--tree-badge-bg);\n color: var(--tree-badge-color);\n font-size: var(--tree-badge-size);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-selected-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--mj-radius-full);\n background: var(--tree-node-selected-border);\n color: var(--mj-text-inverse);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-children[_ngcontent-%COMP%] {\n overflow: hidden;\n}\n\n.tree-node-children--animated[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_tree-expand var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n@keyframes _ngcontent-%COMP%_tree-expand {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--tree-border-color);\n border-radius: var(--mj-radius-sm);\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--tree-toggle-color);\n}\n\n\n\n\n\n\n@media (max-width: 480px) {\n [_nghost-%COMP%] {\n --tree-node-padding-y: 10px;\n --tree-node-padding-x: 10px;\n --tree-icon-size: 18px;\n }\n\n .tree-node-label[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n }\n}"] });
|
|
1643
|
+
} }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.MJEmptyStateComponent], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n \n\n --tree-bg: var(--mj-bg-surface);\n --tree-border-color: var(--mj-border-default);\n --tree-text-color: var(--mj-text-primary);\n --tree-text-secondary: var(--mj-text-muted);\n --tree-text-muted: var(--mj-text-disabled);\n\n \n\n --tree-node-hover-bg: var(--mj-bg-surface-sunken);\n --tree-node-selected-bg: var(--mj-brand-primary-subtle);\n --tree-node-selected-border: var(--mj-brand-primary);\n --tree-node-focused-outline: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n --tree-node-match-bg: var(--mj-status-warning-subtle);\n\n \n\n --tree-icon-color: var(--mj-brand-primary);\n --tree-icon-leaf-color: var(--mj-text-muted);\n --tree-toggle-color: var(--mj-text-disabled);\n\n \n\n --tree-node-padding-y: 8px;\n --tree-node-padding-x: 12px;\n --tree-node-gap: 8px;\n --tree-icon-size: 16px;\n --tree-toggle-size: 12px;\n\n \n\n --tree-transition-duration: 150ms;\n --tree-animation-easing: ease-out;\n\n \n\n --tree-badge-bg: var(--mj-border-default);\n --tree-badge-color: var(--mj-text-muted);\n --tree-badge-size: 12px;\n\n display: block;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n.tree-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--tree-bg);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n outline: none;\n}\n\n.tree-container[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n\n\n\n\n\n.tree-loading[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-loading__spinner[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n color: var(--tree-icon-color);\n}\n\n.tree-loading__text[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n.tree-error[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n text-align: center;\n}\n\n.tree-error__icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-status-error);\n}\n\n.tree-error__message[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--tree-text-secondary);\n max-width: 280px;\n}\n\n.tree-error__retry[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--tree-border-color);\n border-radius: var(--mj-radius-md);\n background: var(--tree-bg);\n color: var(--tree-text-color);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-error__retry[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-hover-bg);\n border-color: var(--tree-icon-color);\n color: var(--tree-icon-color);\n}\n\n\n\n\n\n\n.tree-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-empty__icon[_ngcontent-%COMP%] {\n font-size: 40px;\n opacity: 0.5;\n}\n\n.tree-empty__message[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n.tree-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--tree-border-color);\n background: var(--tree-node-hover-bg);\n}\n\n.tree-toolbar__btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--tree-text-secondary);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-toolbar__btn[_ngcontent-%COMP%]:hover {\n background: var(--tree-bg);\n color: var(--tree-icon-color);\n}\n\n\n\n\n\n\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n}\n\n\n\n\n\n\n.tree-node[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--tree-node-gap);\n padding: var(--tree-node-padding-y) var(--tree-node-padding-x);\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n min-height: 36px;\n}\n\n.tree-node[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-hover-bg);\n}\n\n.tree-node--selected[_ngcontent-%COMP%] {\n background: var(--tree-node-selected-bg);\n border-left-color: var(--tree-node-selected-border);\n}\n\n.tree-node--selected[_ngcontent-%COMP%]:hover {\n background: var(--tree-node-selected-bg);\n}\n\n.tree-node--focused[_ngcontent-%COMP%] {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n\n\n.tree-search-highlight[_ngcontent-%COMP%] {\n background: var(--tree-node-match-bg);\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n}\n\n\n\n\n\n\n.tree-node-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n border-radius: var(--mj-radius-sm);\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node-toggle[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.tree-node-toggle__icon[_ngcontent-%COMP%] {\n font-size: var(--tree-toggle-size);\n color: var(--tree-toggle-color);\n transition: transform var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node--expanded[_ngcontent-%COMP%] .tree-node-toggle__icon[_ngcontent-%COMP%] {\n color: var(--tree-icon-color);\n}\n\n.tree-node-toggle__spacer[_ngcontent-%COMP%] {\n width: var(--tree-toggle-size);\n}\n\n.tree-node-leaf-spacer[_ngcontent-%COMP%] {\n width: 20px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-icon-size);\n flex-shrink: 0;\n font-size: var(--tree-icon-size);\n color: var(--tree-icon-color);\n}\n\n.tree-node--leaf[_ngcontent-%COMP%] .tree-node-icon[_ngcontent-%COMP%] {\n color: var(--tree-icon-leaf-color);\n}\n\n\n\n\n\n\n.tree-node-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tree-node-label[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: 500;\n color: var(--tree-text-color);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tree-node--leaf[_ngcontent-%COMP%] .tree-node-label[_ngcontent-%COMP%] {\n font-weight: 400;\n}\n\n.tree-node-description[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--tree-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n\n\n\n.tree-node-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: var(--tree-badge-bg);\n color: var(--tree-badge-color);\n font-size: var(--tree-badge-size);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-selected-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--mj-radius-full);\n background: var(--tree-node-selected-border);\n color: var(--mj-text-inverse);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.tree-node-children[_ngcontent-%COMP%] {\n overflow: hidden;\n}\n\n.tree-node-children--animated[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_tree-expand var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n@keyframes _ngcontent-%COMP%_tree-expand {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--tree-border-color);\n border-radius: var(--mj-radius-sm);\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--tree-toggle-color);\n}\n\n\n\n\n\n\n@media (max-width: 480px) {\n [_nghost-%COMP%] {\n --tree-node-padding-y: 10px;\n --tree-node-padding-x: 10px;\n --tree-icon-size: 18px;\n }\n\n .tree-node-label[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n }\n}"] });
|
|
1650
1644
|
}
|
|
1651
1645
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TreeComponent, [{
|
|
1652
1646
|
type: Component,
|
|
1653
|
-
args: [{ standalone: false, selector: 'mj-tree', template: "<!-- Tree Component Template -->\n<div [ngClass]=\"getContainerClasses()\" tabindex=\"0\">\n\n <!-- Loading State -->\n @if (IsLoading && ShowLoading) {\n <div class=\"tree-loading\">\n <div class=\"tree-loading__spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <span class=\"tree-loading__text\">Loading...</span>\n </div>\n }\n\n <!-- Error State -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"tree-error\">\n <i class=\"fa-solid fa-exclamation-triangle tree-error__icon\"></i>\n <span class=\"tree-error__message\">{{ ErrorMessage }}</span>\n <button class=\"tree-error__retry\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Toolbar -->\n @if (ShowExpandCollapseAll && Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-toolbar\">\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"ExpandAll()\"\n title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"CollapseAll()\"\n title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n }\n\n <!-- Empty State -->\n @if (IsLoaded && Nodes.length === 0 && !ErrorMessage && !IsLoading) {\n <div class=\"tree-empty\">\n <i [class]=\"EmptyIcon + ' tree-empty__icon'\"></i>\n <span class=\"tree-empty__message\">{{ EmptyMessage }}</span>\n </div>\n }\n\n <!-- Tree Content -->\n @if (Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-content\">\n @for (node of Nodes; track trackNode($index, node)) {\n @if (node.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: node }\"></ng-container>\n }\n }\n </div>\n }\n</div>\n\n<!-- Recursive Node Template -->\n<ng-template #nodeTemplate let-node=\"node\">\n <div\n [ngClass]=\"getNodeClasses(node)\"\n [style.padding-left]=\"getNodePadding(node)\"\n [attr.data-node-id]=\"node.ID\"\n [attr.data-node-type]=\"node.Type\"\n [attr.aria-expanded]=\"node.Type === 'branch' ? node.Expanded : null\"\n [attr.aria-selected]=\"node.Selected\"\n role=\"treeitem\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\">\n\n <!-- Toggle Button (for branches with children) -->\n @if (node.Type === 'branch') {\n <span\n class=\"tree-node-toggle\"\n (click)=\"onToggleClick(node, $event)\">\n @if (node.Children.length > 0) {\n <i\n class=\"fa-solid tree-node-toggle__icon\"\n [ngClass]=\"{\n 'fa-chevron-right': !node.Expanded,\n 'fa-chevron-down': node.Expanded\n }\">\n </i>\n }\n @if (node.Children.length === 0) {\n <span\n class=\"tree-node-toggle__spacer\">\n </span>\n }\n </span>\n }\n\n <!-- Leaf Spacer (to align with branches, only when not at root level) -->\n @if (node.Type === 'leaf' && node.Level > 0) {\n <span\n class=\"tree-node-leaf-spacer\"\n >\n </span>\n }\n\n <!-- Icon -->\n @if (ShowIcons) {\n <span\n class=\"tree-node-icon\"\n [style.color]=\"node.Color || null\">\n <i [class]=\"node.Icon\"></i>\n </span>\n }\n\n <!-- Content -->\n <span class=\"tree-node-content\">\n <!-- Label with search highlight -->\n <span class=\"tree-node-label\" [innerHTML]=\"getHighlightedLabel(node)\"></span>\n\n <!-- Description -->\n @if (ShowDescriptions && node.Description) {\n <span\n class=\"tree-node-description\"\n >\n {{ node.Description }}\n </span>\n }\n </span>\n\n <!-- Badge -->\n @if (ShowBadges && node.Badge) {\n <span\n class=\"tree-node-badge\"\n >\n {{ node.Badge }}\n </span>\n }\n\n <!-- Selection Indicator -->\n @if (node.Selected) {\n <span class=\"tree-node-selected-indicator\">\n <i class=\"fa-solid fa-check\"></i>\n </span>\n }\n </div>\n\n <!-- Children (if expanded) -->\n @if (node.Type === 'branch' && node.Expanded && node.Children.length > 0) {\n <div\n class=\"tree-node-children\"\n [class.tree-node-children--animated]=\"AnimateExpandCollapse\"\n role=\"group\">\n @for (child of node.Children; track trackNode($index, child)) {\n @if (child.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n", styles: ["/**\n * Tree Component Styles\n *\n * Uses CSS custom properties for easy theming.\n * Containers can override these variables to customize appearance.\n */\n\n/* ========================================\n CSS Variables (Theming)\n ======================================== */\n\n:host {\n /* Colors */\n --tree-bg: var(--mj-bg-surface);\n --tree-border-color: var(--mj-border-default);\n --tree-text-color: var(--mj-text-primary);\n --tree-text-secondary: var(--mj-text-muted);\n --tree-text-muted: var(--mj-text-disabled);\n\n /* Node Colors */\n --tree-node-hover-bg: var(--mj-bg-surface-sunken);\n --tree-node-selected-bg: var(--mj-brand-primary-subtle);\n --tree-node-selected-border: var(--mj-brand-primary);\n --tree-node-focused-outline: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n --tree-node-match-bg: var(--mj-status-warning-subtle);\n\n /* Icon Colors */\n --tree-icon-color: var(--mj-brand-primary);\n --tree-icon-leaf-color: var(--mj-text-muted);\n --tree-toggle-color: var(--mj-text-disabled);\n\n /* Spacing */\n --tree-node-padding-y: 8px;\n --tree-node-padding-x: 12px;\n --tree-node-gap: 8px;\n --tree-icon-size: 16px;\n --tree-toggle-size: 12px;\n\n /* Animation */\n --tree-transition-duration: 150ms;\n --tree-animation-easing: ease-out;\n\n /* Badge */\n --tree-badge-bg: var(--mj-border-default);\n --tree-badge-color: var(--mj-text-muted);\n --tree-badge-size: 12px;\n\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Container\n ======================================== */\n\n.tree-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--tree-bg);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n outline: none;\n}\n\n.tree-container:focus-visible {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n/* ========================================\n Loading State\n ======================================== */\n\n.tree-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-loading__spinner {\n font-size: var(--mj-text-2xl);\n color: var(--tree-icon-color);\n}\n\n.tree-loading__text {\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Error State\n ======================================== */\n\n.tree-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n text-align: center;\n}\n\n.tree-error__icon {\n font-size: 32px;\n color: var(--mj-status-error);\n}\n\n.tree-error__message {\n font-size: var(--mj-text-sm);\n color: var(--tree-text-secondary);\n max-width: 280px;\n}\n\n.tree-error__retry {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--tree-border-color);\n border-radius: var(--mj-radius-md);\n background: var(--tree-bg);\n color: var(--tree-text-color);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-error__retry:hover {\n background: var(--tree-node-hover-bg);\n border-color: var(--tree-icon-color);\n color: var(--tree-icon-color);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n\n.tree-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-empty__icon {\n font-size: 40px;\n opacity: 0.5;\n}\n\n.tree-empty__message {\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Toolbar\n ======================================== */\n\n.tree-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--tree-border-color);\n background: var(--tree-node-hover-bg);\n}\n\n.tree-toolbar__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--tree-text-secondary);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-toolbar__btn:hover {\n background: var(--tree-bg);\n color: var(--tree-icon-color);\n}\n\n/* ========================================\n Tree Content\n ======================================== */\n\n.tree-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n}\n\n/* ========================================\n Tree Node\n ======================================== */\n\n.tree-node {\n display: flex;\n align-items: center;\n gap: var(--tree-node-gap);\n padding: var(--tree-node-padding-y) var(--tree-node-padding-x);\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n min-height: 36px;\n}\n\n.tree-node:hover {\n background: var(--tree-node-hover-bg);\n}\n\n.tree-node--selected {\n background: var(--tree-node-selected-bg);\n border-left-color: var(--tree-node-selected-border);\n}\n\n.tree-node--selected:hover {\n background: var(--tree-node-selected-bg);\n}\n\n.tree-node--focused {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n/* Search highlight for matching text portion */\n.tree-search-highlight {\n background: var(--tree-node-match-bg);\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n}\n\n/* ========================================\n Toggle Button\n ======================================== */\n\n.tree-node-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n border-radius: var(--mj-radius-sm);\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node-toggle:hover {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.tree-node-toggle__icon {\n font-size: var(--tree-toggle-size);\n color: var(--tree-toggle-color);\n transition: transform var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node--expanded .tree-node-toggle__icon {\n color: var(--tree-icon-color);\n}\n\n.tree-node-toggle__spacer {\n width: var(--tree-toggle-size);\n}\n\n.tree-node-leaf-spacer {\n width: 20px;\n flex-shrink: 0;\n}\n\n/* ========================================\n Node Icon\n ======================================== */\n\n.tree-node-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-icon-size);\n flex-shrink: 0;\n font-size: var(--tree-icon-size);\n color: var(--tree-icon-color);\n}\n\n.tree-node--leaf .tree-node-icon {\n color: var(--tree-icon-leaf-color);\n}\n\n/* ========================================\n Node Content\n ======================================== */\n\n.tree-node-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tree-node-label {\n font-size: var(--mj-text-sm);\n font-weight: 500;\n color: var(--tree-text-color);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tree-node--leaf .tree-node-label {\n font-weight: 400;\n}\n\n.tree-node-description {\n font-size: var(--mj-text-xs);\n color: var(--tree-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ========================================\n Node Badge\n ======================================== */\n\n.tree-node-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: var(--tree-badge-bg);\n color: var(--tree-badge-color);\n font-size: var(--tree-badge-size);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n/* ========================================\n Selection Indicator\n ======================================== */\n\n.tree-node-selected-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--mj-radius-full);\n background: var(--tree-node-selected-border);\n color: var(--mj-text-inverse);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n/* ========================================\n Children Container\n ======================================== */\n\n.tree-node-children {\n overflow: hidden;\n}\n\n.tree-node-children--animated {\n animation: tree-expand var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n@keyframes tree-expand {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ========================================\n Scrollbar Styling\n ======================================== */\n\n.tree-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.tree-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.tree-content::-webkit-scrollbar-thumb {\n background: var(--tree-border-color);\n border-radius: var(--mj-radius-sm);\n}\n\n.tree-content::-webkit-scrollbar-thumb:hover {\n background: var(--tree-toggle-color);\n}\n\n/* ========================================\n Responsive Adjustments\n ======================================== */\n\n@media (max-width: 480px) {\n :host {\n --tree-node-padding-y: 10px;\n --tree-node-padding-x: 10px;\n --tree-icon-size: 18px;\n }\n\n .tree-node-label {\n font-size: var(--mj-text-base);\n }\n}\n"] }]
|
|
1647
|
+
args: [{ standalone: false, selector: 'mj-tree', template: "<!-- Tree Component Template -->\n<div [ngClass]=\"getContainerClasses()\" tabindex=\"0\">\n\n <!-- Loading State -->\n @if (IsLoading && ShowLoading) {\n <div class=\"tree-loading\">\n <div class=\"tree-loading__spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <span class=\"tree-loading__text\">Loading...</span>\n </div>\n }\n\n <!-- Error State -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"tree-error\">\n <i class=\"fa-solid fa-exclamation-triangle tree-error__icon\"></i>\n <span class=\"tree-error__message\">{{ ErrorMessage }}</span>\n <button class=\"tree-error__retry\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Toolbar -->\n @if (ShowExpandCollapseAll && Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-toolbar\">\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"ExpandAll()\"\n title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"CollapseAll()\"\n title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n }\n\n <!-- Empty State -->\n @if (IsLoaded && Nodes.length === 0 && !ErrorMessage && !IsLoading) {\n <mj-empty-state class=\"tree-empty\" Size=\"compact\"\n [Icon]=\"EmptyIcon\" [Title]=\"EmptyMessage\" />\n }\n\n <!-- Tree Content -->\n @if (Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-content\">\n @for (node of Nodes; track trackNode($index, node)) {\n @if (node.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: node }\"></ng-container>\n }\n }\n </div>\n }\n</div>\n\n<!-- Recursive Node Template -->\n<ng-template #nodeTemplate let-node=\"node\">\n <div\n [ngClass]=\"getNodeClasses(node)\"\n [style.padding-left]=\"getNodePadding(node)\"\n [attr.data-node-id]=\"node.ID\"\n [attr.data-node-type]=\"node.Type\"\n [attr.aria-expanded]=\"node.Type === 'branch' ? node.Expanded : null\"\n [attr.aria-selected]=\"node.Selected\"\n role=\"treeitem\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\">\n\n <!-- Toggle Button (for branches with children) -->\n @if (node.Type === 'branch') {\n <span\n class=\"tree-node-toggle\"\n (click)=\"onToggleClick(node, $event)\">\n @if (node.Children.length > 0) {\n <i\n class=\"fa-solid tree-node-toggle__icon\"\n [ngClass]=\"{\n 'fa-chevron-right': !node.Expanded,\n 'fa-chevron-down': node.Expanded\n }\">\n </i>\n }\n @if (node.Children.length === 0) {\n <span\n class=\"tree-node-toggle__spacer\">\n </span>\n }\n </span>\n }\n\n <!-- Leaf Spacer (to align with branches, only when not at root level) -->\n @if (node.Type === 'leaf' && node.Level > 0) {\n <span\n class=\"tree-node-leaf-spacer\"\n >\n </span>\n }\n\n <!-- Icon -->\n @if (ShowIcons) {\n <span\n class=\"tree-node-icon\"\n [style.color]=\"node.Color || null\">\n <i [class]=\"node.Icon\"></i>\n </span>\n }\n\n <!-- Content -->\n <span class=\"tree-node-content\">\n <!-- Label with search highlight -->\n <span class=\"tree-node-label\" [innerHTML]=\"getHighlightedLabel(node)\"></span>\n\n <!-- Description -->\n @if (ShowDescriptions && node.Description) {\n <span\n class=\"tree-node-description\"\n >\n {{ node.Description }}\n </span>\n }\n </span>\n\n <!-- Badge -->\n @if (ShowBadges && node.Badge) {\n <span\n class=\"tree-node-badge\"\n >\n {{ node.Badge }}\n </span>\n }\n\n <!-- Selection Indicator -->\n @if (node.Selected) {\n <span class=\"tree-node-selected-indicator\">\n <i class=\"fa-solid fa-check\"></i>\n </span>\n }\n </div>\n\n <!-- Children (if expanded) -->\n @if (node.Type === 'branch' && node.Expanded && node.Children.length > 0) {\n <div\n class=\"tree-node-children\"\n [class.tree-node-children--animated]=\"AnimateExpandCollapse\"\n role=\"group\">\n @for (child of node.Children; track trackNode($index, child)) {\n @if (child.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n", styles: ["/**\n * Tree Component Styles\n *\n * Uses CSS custom properties for easy theming.\n * Containers can override these variables to customize appearance.\n */\n\n/* ========================================\n CSS Variables (Theming)\n ======================================== */\n\n:host {\n /* Colors */\n --tree-bg: var(--mj-bg-surface);\n --tree-border-color: var(--mj-border-default);\n --tree-text-color: var(--mj-text-primary);\n --tree-text-secondary: var(--mj-text-muted);\n --tree-text-muted: var(--mj-text-disabled);\n\n /* Node Colors */\n --tree-node-hover-bg: var(--mj-bg-surface-sunken);\n --tree-node-selected-bg: var(--mj-brand-primary-subtle);\n --tree-node-selected-border: var(--mj-brand-primary);\n --tree-node-focused-outline: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n --tree-node-match-bg: var(--mj-status-warning-subtle);\n\n /* Icon Colors */\n --tree-icon-color: var(--mj-brand-primary);\n --tree-icon-leaf-color: var(--mj-text-muted);\n --tree-toggle-color: var(--mj-text-disabled);\n\n /* Spacing */\n --tree-node-padding-y: 8px;\n --tree-node-padding-x: 12px;\n --tree-node-gap: 8px;\n --tree-icon-size: 16px;\n --tree-toggle-size: 12px;\n\n /* Animation */\n --tree-transition-duration: 150ms;\n --tree-animation-easing: ease-out;\n\n /* Badge */\n --tree-badge-bg: var(--mj-border-default);\n --tree-badge-color: var(--mj-text-muted);\n --tree-badge-size: 12px;\n\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Container\n ======================================== */\n\n.tree-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--tree-bg);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n outline: none;\n}\n\n.tree-container:focus-visible {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n/* ========================================\n Loading State\n ======================================== */\n\n.tree-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-loading__spinner {\n font-size: var(--mj-text-2xl);\n color: var(--tree-icon-color);\n}\n\n.tree-loading__text {\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Error State\n ======================================== */\n\n.tree-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px 16px;\n gap: 12px;\n text-align: center;\n}\n\n.tree-error__icon {\n font-size: 32px;\n color: var(--mj-status-error);\n}\n\n.tree-error__message {\n font-size: var(--mj-text-sm);\n color: var(--tree-text-secondary);\n max-width: 280px;\n}\n\n.tree-error__retry {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--tree-border-color);\n border-radius: var(--mj-radius-md);\n background: var(--tree-bg);\n color: var(--tree-text-color);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-error__retry:hover {\n background: var(--tree-node-hover-bg);\n border-color: var(--tree-icon-color);\n color: var(--tree-icon-color);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n\n.tree-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--tree-text-muted);\n}\n\n.tree-empty__icon {\n font-size: 40px;\n opacity: 0.5;\n}\n\n.tree-empty__message {\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Toolbar\n ======================================== */\n\n.tree-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--tree-border-color);\n background: var(--tree-node-hover-bg);\n}\n\n.tree-toolbar__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--tree-text-secondary);\n cursor: pointer;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-toolbar__btn:hover {\n background: var(--tree-bg);\n color: var(--tree-icon-color);\n}\n\n/* ========================================\n Tree Content\n ======================================== */\n\n.tree-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n}\n\n/* ========================================\n Tree Node\n ======================================== */\n\n.tree-node {\n display: flex;\n align-items: center;\n gap: var(--tree-node-gap);\n padding: var(--tree-node-padding-y) var(--tree-node-padding-x);\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n min-height: 36px;\n}\n\n.tree-node:hover {\n background: var(--tree-node-hover-bg);\n}\n\n.tree-node--selected {\n background: var(--tree-node-selected-bg);\n border-left-color: var(--tree-node-selected-border);\n}\n\n.tree-node--selected:hover {\n background: var(--tree-node-selected-bg);\n}\n\n.tree-node--focused {\n outline: 2px solid var(--tree-node-focused-outline);\n outline-offset: -2px;\n}\n\n/* Search highlight for matching text portion */\n.tree-search-highlight {\n background: var(--tree-node-match-bg);\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n}\n\n/* ========================================\n Toggle Button\n ======================================== */\n\n.tree-node-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n border-radius: var(--mj-radius-sm);\n transition: all var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node-toggle:hover {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.tree-node-toggle__icon {\n font-size: var(--tree-toggle-size);\n color: var(--tree-toggle-color);\n transition: transform var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n.tree-node--expanded .tree-node-toggle__icon {\n color: var(--tree-icon-color);\n}\n\n.tree-node-toggle__spacer {\n width: var(--tree-toggle-size);\n}\n\n.tree-node-leaf-spacer {\n width: 20px;\n flex-shrink: 0;\n}\n\n/* ========================================\n Node Icon\n ======================================== */\n\n.tree-node-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-icon-size);\n flex-shrink: 0;\n font-size: var(--tree-icon-size);\n color: var(--tree-icon-color);\n}\n\n.tree-node--leaf .tree-node-icon {\n color: var(--tree-icon-leaf-color);\n}\n\n/* ========================================\n Node Content\n ======================================== */\n\n.tree-node-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tree-node-label {\n font-size: var(--mj-text-sm);\n font-weight: 500;\n color: var(--tree-text-color);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tree-node--leaf .tree-node-label {\n font-weight: 400;\n}\n\n.tree-node-description {\n font-size: var(--mj-text-xs);\n color: var(--tree-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ========================================\n Node Badge\n ======================================== */\n\n.tree-node-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: var(--tree-badge-bg);\n color: var(--tree-badge-color);\n font-size: var(--tree-badge-size);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n/* ========================================\n Selection Indicator\n ======================================== */\n\n.tree-node-selected-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--mj-radius-full);\n background: var(--tree-node-selected-border);\n color: var(--mj-text-inverse);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n/* ========================================\n Children Container\n ======================================== */\n\n.tree-node-children {\n overflow: hidden;\n}\n\n.tree-node-children--animated {\n animation: tree-expand var(--tree-transition-duration) var(--tree-animation-easing);\n}\n\n@keyframes tree-expand {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ========================================\n Scrollbar Styling\n ======================================== */\n\n.tree-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.tree-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.tree-content::-webkit-scrollbar-thumb {\n background: var(--tree-border-color);\n border-radius: var(--mj-radius-sm);\n}\n\n.tree-content::-webkit-scrollbar-thumb:hover {\n background: var(--tree-toggle-color);\n}\n\n/* ========================================\n Responsive Adjustments\n ======================================== */\n\n@media (max-width: 480px) {\n :host {\n --tree-node-padding-y: 10px;\n --tree-node-padding-x: 10px;\n --tree-icon-size: 18px;\n }\n\n .tree-node-label {\n font-size: var(--mj-text-base);\n }\n}\n"] }]
|
|
1654
1648
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { BranchConfig: [{
|
|
1655
1649
|
type: Input
|
|
1656
1650
|
}], LeafConfig: [{
|