@memberjunction/ng-hierarchy-tree 6.1.0-edge.5 → 6.1.0-edge.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"hierarchy-tree.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/hierarchy-tree.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hierarchy-tree.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/hierarchy-tree.component.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
- import { RunView, CompositeKey } from '@memberjunction/core';
4
+ import { RunView, CompositeKey, KeyValuePair } from '@memberjunction/core';
5
5
  import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
6
6
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
7
7
  import * as d3 from 'd3';
@@ -13,9 +13,9 @@ const _c1 = ["svgElement"];
13
13
  const _forTrack0 = ($index, $item) => $item.ID;
14
14
  const _forTrack1 = ($index, $item) => $item.key;
15
15
  function HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
16
- const _r4 = i0.ɵɵgetCurrentView();
16
+ const _r3 = i0.ɵɵgetCurrentView();
17
17
  i0.ɵɵelementStart(0, "button", 23);
18
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.clearSearch()); });
18
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
19
19
  i0.ɵɵelement(1, "i", 24);
20
20
  i0.ɵɵelementEnd();
21
21
  } }
@@ -24,32 +24,32 @@ function HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_4_Templa
24
24
  i0.ɵɵtext(1);
25
25
  i0.ɵɵelementEnd();
26
26
  } if (rf & 2) {
27
- const ctx_r2 = i0.ɵɵnextContext(3);
27
+ const ctx_r1 = i0.ɵɵnextContext(3);
28
28
  i0.ɵɵadvance();
29
- i0.ɵɵtextInterpolate1("", ctx_r2.MatchingNodeCount, " found");
29
+ i0.ɵɵtextInterpolate1("", ctx_r1.MatchingNodeCount, " found");
30
30
  } }
31
31
  function HierarchyTreeComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
32
- const _r2 = i0.ɵɵgetCurrentView();
32
+ const _r1 = i0.ɵɵgetCurrentView();
33
33
  i0.ɵɵelementStart(0, "div", 16);
34
34
  i0.ɵɵelement(1, "i", 19);
35
35
  i0.ɵɵelementStart(2, "input", 20);
36
- i0.ɵɵtwoWayListener("ngModelChange", function HierarchyTreeComponent_Conditional_1_Conditional_1_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.SearchQuery, $event) || (ctx_r2.SearchQuery = $event); return i0.ɵɵresetView($event); });
37
- i0.ɵɵlistener("input", function HierarchyTreeComponent_Conditional_1_Conditional_1_Template_input_input_2_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSearchInput()); });
36
+ i0.ɵɵtwoWayListener("ngModelChange", function HierarchyTreeComponent_Conditional_1_Conditional_1_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SearchQuery, $event) || (ctx_r1.SearchQuery = $event); return i0.ɵɵresetView($event); });
37
+ i0.ɵɵlistener("input", function HierarchyTreeComponent_Conditional_1_Conditional_1_Template_input_input_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSearchInput()); });
38
38
  i0.ɵɵelementEnd();
39
39
  i0.ɵɵconditionalCreate(3, HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_3_Template, 2, 0, "button", 21);
40
40
  i0.ɵɵconditionalCreate(4, HierarchyTreeComponent_Conditional_1_Conditional_1_Conditional_4_Template, 2, 1, "span", 22);
41
41
  i0.ɵɵelementEnd();
42
42
  } if (rf & 2) {
43
- const ctx_r2 = i0.ɵɵnextContext(2);
43
+ const ctx_r1 = i0.ɵɵnextContext(2);
44
44
  i0.ɵɵadvance(2);
45
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.SearchQuery);
45
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SearchQuery);
46
46
  i0.ɵɵadvance();
47
- i0.ɵɵconditional(ctx_r2.SearchQuery ? 3 : -1);
47
+ i0.ɵɵconditional(ctx_r1.SearchQuery ? 3 : -1);
48
48
  i0.ɵɵadvance();
49
- i0.ɵɵconditional(ctx_r2.SearchQuery && ctx_r2.MatchingNodeCount > 0 ? 4 : -1);
49
+ i0.ɵɵconditional(ctx_r1.SearchQuery && ctx_r1.MatchingNodeCount > 0 ? 4 : -1);
50
50
  } }
51
51
  function HierarchyTreeComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
52
- const _r5 = i0.ɵɵgetCurrentView();
52
+ const _r4 = i0.ɵɵgetCurrentView();
53
53
  i0.ɵɵelementStart(0, "div", 17);
54
54
  i0.ɵɵelement(1, "i", 25);
55
55
  i0.ɵɵelementStart(2, "span");
@@ -58,41 +58,41 @@ function HierarchyTreeComponent_Conditional_1_Conditional_2_Template(rf, ctx) {
58
58
  i0.ɵɵtext(5);
59
59
  i0.ɵɵelementEnd()();
60
60
  i0.ɵɵelementStart(6, "button", 26);
61
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_2_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.resetFocus()); });
61
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_2_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.resetFocus()); });
62
62
  i0.ɵɵelement(7, "i", 27);
63
63
  i0.ɵɵtext(8, " View Full Hierarchy ");
64
64
  i0.ɵɵelementEnd()();
65
65
  } if (rf & 2) {
66
- const ctx_r2 = i0.ɵɵnextContext(2);
66
+ const ctx_r1 = i0.ɵɵnextContext(2);
67
67
  i0.ɵɵadvance(5);
68
- i0.ɵɵtextInterpolate(ctx_r2.FocusedNode.Name);
68
+ i0.ɵɵtextInterpolate(ctx_r1.FocusedNode.Name);
69
69
  } }
70
70
  function HierarchyTreeComponent_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
71
- const _r6 = i0.ɵɵgetCurrentView();
71
+ const _r5 = i0.ɵɵgetCurrentView();
72
72
  i0.ɵɵelementStart(0, "div", 18)(1, "button", 28);
73
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.expandAll()); });
73
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.expandAll()); });
74
74
  i0.ɵɵelement(2, "i", 29);
75
75
  i0.ɵɵelementEnd();
76
76
  i0.ɵɵelementStart(3, "button", 30);
77
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.collapseAll()); });
77
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.collapseAll()); });
78
78
  i0.ɵɵelement(4, "i", 31);
79
79
  i0.ɵɵelementEnd();
80
80
  i0.ɵɵelement(5, "div", 32);
81
81
  i0.ɵɵelementStart(6, "button", 33);
82
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.zoomIn()); });
82
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.zoomIn()); });
83
83
  i0.ɵɵelement(7, "i", 34);
84
84
  i0.ɵɵelementEnd();
85
85
  i0.ɵɵelementStart(8, "button", 35);
86
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.zoomOut()); });
86
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.zoomOut()); });
87
87
  i0.ɵɵelement(9, "i", 36);
88
88
  i0.ɵɵelementEnd();
89
89
  i0.ɵɵelementStart(10, "button", 37);
90
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onFitToViewClick()); });
90
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFitToViewClick()); });
91
91
  i0.ɵɵelement(11, "i", 38);
92
92
  i0.ɵɵelementEnd();
93
93
  i0.ɵɵelement(12, "div", 32);
94
94
  i0.ɵɵelementStart(13, "button", 39);
95
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.refresh()); });
95
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_1_Conditional_3_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.refresh()); });
96
96
  i0.ɵɵelement(14, "i", 40);
97
97
  i0.ɵɵelementEnd()();
98
98
  } }
@@ -103,13 +103,13 @@ function HierarchyTreeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
103
103
  i0.ɵɵconditionalCreate(3, HierarchyTreeComponent_Conditional_1_Conditional_3_Template, 15, 0, "div", 18);
104
104
  i0.ɵɵelementEnd();
105
105
  } if (rf & 2) {
106
- const ctx_r2 = i0.ɵɵnextContext();
106
+ const ctx_r1 = i0.ɵɵnextContext();
107
107
  i0.ɵɵadvance();
108
- i0.ɵɵconditional(ctx_r2.Config.ShowSearch ? 1 : -1);
108
+ i0.ɵɵconditional(ctx_r1.Config.ShowSearch ? 1 : -1);
109
109
  i0.ɵɵadvance();
110
- i0.ɵɵconditional(ctx_r2.FocusedNode ? 2 : -1);
110
+ i0.ɵɵconditional(ctx_r1.FocusedNode ? 2 : -1);
111
111
  i0.ɵɵadvance();
112
- i0.ɵɵconditional(ctx_r2.Config.ShowToolbar ? 3 : -1);
112
+ i0.ɵɵconditional(ctx_r1.Config.ShowToolbar ? 3 : -1);
113
113
  } }
114
114
  function HierarchyTreeComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
115
115
  i0.ɵɵelementStart(0, "div", 5);
@@ -119,20 +119,20 @@ function HierarchyTreeComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
119
119
  i0.ɵɵelementEnd()();
120
120
  } }
121
121
  function HierarchyTreeComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
122
- const _r7 = i0.ɵɵgetCurrentView();
122
+ const _r6 = i0.ɵɵgetCurrentView();
123
123
  i0.ɵɵelementStart(0, "div", 6);
124
124
  i0.ɵɵelement(1, "i", 42);
125
125
  i0.ɵɵelementStart(2, "span");
126
126
  i0.ɵɵtext(3);
127
127
  i0.ɵɵelementEnd();
128
128
  i0.ɵɵelementStart(4, "button", 43);
129
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.loadData()); });
129
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadData()); });
130
130
  i0.ɵɵtext(5, "Retry");
131
131
  i0.ɵɵelementEnd()();
132
132
  } if (rf & 2) {
133
- const ctx_r2 = i0.ɵɵnextContext();
133
+ const ctx_r1 = i0.ɵɵnextContext();
134
134
  i0.ɵɵadvance(3);
135
- i0.ɵɵtextInterpolate(ctx_r2.ErrorMessage);
135
+ i0.ɵɵtextInterpolate(ctx_r1.ErrorMessage);
136
136
  } }
137
137
  function HierarchyTreeComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
138
138
  i0.ɵɵelementStart(0, "div", 7);
@@ -146,26 +146,26 @@ function HierarchyTreeComponent_For_17_Conditional_0_Conditional_9_Template(rf,
146
146
  i0.ɵɵtext(1);
147
147
  i0.ɵɵelementEnd();
148
148
  } if (rf & 2) {
149
- const node_r9 = i0.ɵɵnextContext(2).$implicit;
149
+ const node_r8 = i0.ɵɵnextContext(2).$implicit;
150
150
  i0.ɵɵadvance();
151
- i0.ɵɵtextInterpolate(node_r9.Subtitle);
151
+ i0.ɵɵtextInterpolate(node_r8.Subtitle);
152
152
  } }
153
153
  function HierarchyTreeComponent_For_17_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
154
- const _r10 = i0.ɵɵgetCurrentView();
154
+ const _r9 = i0.ɵɵgetCurrentView();
155
155
  i0.ɵɵelementStart(0, "button", 57);
156
- i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_11_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const node_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleNodeExpansion(node_r9, $event)); });
156
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_11_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r9); const node_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleNodeExpansion(node_r8, $event)); });
157
157
  i0.ɵɵelement(1, "i", 58);
158
158
  i0.ɵɵelementStart(2, "span");
159
159
  i0.ɵɵtext(3);
160
160
  i0.ɵɵelementEnd()();
161
161
  } if (rf & 2) {
162
- const node_r9 = i0.ɵɵnextContext(2).$implicit;
163
- i0.ɵɵclassProp("collapsed", !node_r9.IsExpanded);
164
- i0.ɵɵproperty("title", node_r9.IsExpanded ? "Collapse sub-branch" : "Expand " + node_r9.DirectChildCount + " children");
162
+ const node_r8 = i0.ɵɵnextContext(2).$implicit;
163
+ i0.ɵɵclassProp("collapsed", !node_r8.IsExpanded);
164
+ i0.ɵɵproperty("title", node_r8.IsExpanded ? "Collapse sub-branch" : "Expand " + node_r8.DirectChildCount + " children");
165
165
  i0.ɵɵadvance();
166
- i0.ɵɵclassProp("fa-chevron-down", node_r9.IsExpanded)("fa-chevron-right", !node_r9.IsExpanded);
166
+ i0.ɵɵclassProp("fa-chevron-down", node_r8.IsExpanded)("fa-chevron-right", !node_r8.IsExpanded);
167
167
  i0.ɵɵadvance(2);
168
- i0.ɵɵtextInterpolate(node_r9.DirectChildCount);
168
+ i0.ɵɵtextInterpolate(node_r8.DirectChildCount);
169
169
  } }
170
170
  function HierarchyTreeComponent_For_17_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
171
171
  i0.ɵɵelementStart(0, "span", 55);
@@ -173,23 +173,23 @@ function HierarchyTreeComponent_For_17_Conditional_0_Conditional_12_Template(rf,
173
173
  i0.ɵɵelementEnd();
174
174
  } }
175
175
  function HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
176
- const _r11 = i0.ɵɵgetCurrentView();
176
+ const _r10 = i0.ɵɵgetCurrentView();
177
177
  i0.ɵɵelementStart(0, "div", 56)(1, "button", 59);
178
- i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r11); const node_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNodeAction(node_r9, "focus", $event)); });
178
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r10); const node_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeAction(node_r8, "focus", $event)); });
179
179
  i0.ɵɵelement(2, "i", 25);
180
180
  i0.ɵɵelementEnd();
181
181
  i0.ɵɵelementStart(3, "button", 60);
182
- i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template_button_click_3_listener($event) { i0.ɵɵrestoreView(_r11); const node_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNodeAction(node_r9, "open", $event)); });
182
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template_button_click_3_listener($event) { i0.ɵɵrestoreView(_r10); const node_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeAction(node_r8, "open", $event)); });
183
183
  i0.ɵɵelement(4, "i", 61);
184
184
  i0.ɵɵelementEnd()();
185
185
  } }
186
186
  function HierarchyTreeComponent_For_17_Conditional_0_Template(rf, ctx) { if (rf & 1) {
187
- const _r8 = i0.ɵɵgetCurrentView();
187
+ const _r7 = i0.ɵɵgetCurrentView();
188
188
  i0.ɵɵnamespaceSVG();
189
189
  i0.ɵɵelementStart(0, "foreignObject", 45);
190
190
  i0.ɵɵnamespaceHTML();
191
191
  i0.ɵɵelementStart(1, "div", 46);
192
- i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r8); const node_r9 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNodeClick(node_r9, $event)); })("dblclick", function HierarchyTreeComponent_For_17_Conditional_0_Template_div_dblclick_1_listener($event) { i0.ɵɵrestoreView(_r8); const node_r9 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNodeDoubleClick(node_r9, $event)); });
192
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_For_17_Conditional_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); const node_r8 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeClick(node_r8, $event)); })("dblclick", function HierarchyTreeComponent_For_17_Conditional_0_Template_div_dblclick_1_listener($event) { i0.ɵɵrestoreView(_r7); const node_r8 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeDoubleClick(node_r8, $event)); });
193
193
  i0.ɵɵelement(2, "div", 47);
194
194
  i0.ɵɵelementStart(3, "div", 48)(4, "div", 49);
195
195
  i0.ɵɵelement(5, "i");
@@ -204,42 +204,42 @@ function HierarchyTreeComponent_For_17_Conditional_0_Template(rf, ctx) { if (rf
204
204
  i0.ɵɵconditionalCreate(13, HierarchyTreeComponent_For_17_Conditional_0_Conditional_13_Template, 5, 0, "div", 56);
205
205
  i0.ɵɵelementEnd()()();
206
206
  } if (rf & 2) {
207
- const node_r9 = i0.ɵɵnextContext().$implicit;
208
- const ctx_r2 = i0.ɵɵnextContext();
209
- i0.ɵɵattribute("x", node_r9.x)("y", node_r9.y)("width", ctx_r2.Config.NodeWidth || 230)("height", ctx_r2.Config.NodeHeight || 90);
207
+ const node_r8 = i0.ɵɵnextContext().$implicit;
208
+ const ctx_r1 = i0.ɵɵnextContext();
209
+ i0.ɵɵattribute("x", node_r8.x)("y", node_r8.y)("width", ctx_r1.Config.NodeWidth || 230)("height", ctx_r1.Config.NodeHeight || 90);
210
210
  i0.ɵɵadvance();
211
- i0.ɵɵclassProp("selected", node_r9.IsSelected)("highlighted", node_r9.IsHighlighted)("focus-root", node_r9.IsFocusRoot);
211
+ i0.ɵɵclassProp("selected", node_r8.IsSelected)("highlighted", node_r8.IsHighlighted)("focus-root", node_r8.IsFocusRoot);
212
212
  i0.ɵɵadvance();
213
- i0.ɵɵstyleProp("background", node_r9.Color || ctx_r2.Config.DefaultColor);
213
+ i0.ɵɵstyleProp("background", node_r8.Color || ctx_r1.Config.DefaultColor);
214
214
  i0.ɵɵadvance(2);
215
- i0.ɵɵstyleProp("color", node_r9.Color || ctx_r2.Config.DefaultColor);
215
+ i0.ɵɵstyleProp("color", node_r8.Color || ctx_r1.Config.DefaultColor);
216
216
  i0.ɵɵadvance();
217
- i0.ɵɵclassMap(node_r9.Icon || ctx_r2.Config.DefaultIcon);
217
+ i0.ɵɵclassMap(node_r8.Icon || ctx_r1.Config.DefaultIcon);
218
218
  i0.ɵɵadvance(2);
219
- i0.ɵɵproperty("title", node_r9.Name);
219
+ i0.ɵɵproperty("title", node_r8.Name);
220
220
  i0.ɵɵadvance();
221
- i0.ɵɵtextInterpolate(node_r9.Name);
221
+ i0.ɵɵtextInterpolate(node_r8.Name);
222
222
  i0.ɵɵadvance();
223
- i0.ɵɵconditional(node_r9.Subtitle ? 9 : -1);
223
+ i0.ɵɵconditional(node_r8.Subtitle ? 9 : -1);
224
224
  i0.ɵɵadvance(2);
225
- i0.ɵɵconditional(node_r9.DirectChildCount > 0 ? 11 : 12);
225
+ i0.ɵɵconditional(node_r8.DirectChildCount > 0 ? 11 : 12);
226
226
  i0.ɵɵadvance(2);
227
- i0.ɵɵconditional(ctx_r2.AllowNodeActions ? 13 : -1);
227
+ i0.ɵɵconditional(ctx_r1.AllowNodeActions ? 13 : -1);
228
228
  } }
229
229
  function HierarchyTreeComponent_For_17_Template(rf, ctx) { if (rf & 1) {
230
230
  i0.ɵɵconditionalCreate(0, HierarchyTreeComponent_For_17_Conditional_0_Template, 14, 21, ":svg:foreignObject", 45);
231
231
  } if (rf & 2) {
232
- const node_r9 = ctx.$implicit;
233
- i0.ɵɵconditional(node_r9.x != null && node_r9.y != null ? 0 : -1);
232
+ const node_r8 = ctx.$implicit;
233
+ i0.ɵɵconditional(node_r8.x != null && node_r8.y != null ? 0 : -1);
234
234
  } }
235
235
  function HierarchyTreeComponent_Conditional_19_Conditional_7_Template(rf, ctx) { if (rf & 1) {
236
236
  i0.ɵɵelementStart(0, "p", 67);
237
237
  i0.ɵɵtext(1);
238
238
  i0.ɵɵelementEnd();
239
239
  } if (rf & 2) {
240
- const ctx_r2 = i0.ɵɵnextContext(2);
240
+ const ctx_r1 = i0.ɵɵnextContext(2);
241
241
  i0.ɵɵadvance();
242
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.Subtitle);
242
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.Subtitle);
243
243
  } }
244
244
  function HierarchyTreeComponent_Conditional_19_Conditional_27_For_5_Template(rf, ctx) { if (rf & 1) {
245
245
  i0.ɵɵelementStart(0, "div", 82)(1, "dt", 83);
@@ -249,13 +249,13 @@ function HierarchyTreeComponent_Conditional_19_Conditional_27_For_5_Template(rf,
249
249
  i0.ɵɵtext(4);
250
250
  i0.ɵɵelementEnd()();
251
251
  } if (rf & 2) {
252
- const attr_r13 = ctx.$implicit;
252
+ const attr_r12 = ctx.$implicit;
253
253
  i0.ɵɵadvance(2);
254
- i0.ɵɵtextInterpolate(attr_r13.label);
254
+ i0.ɵɵtextInterpolate(attr_r12.label);
255
255
  i0.ɵɵadvance();
256
- i0.ɵɵproperty("title", attr_r13.value);
256
+ i0.ɵɵproperty("title", attr_r12.value);
257
257
  i0.ɵɵadvance();
258
- i0.ɵɵtextInterpolate(attr_r13.value);
258
+ i0.ɵɵtextInterpolate(attr_r12.value);
259
259
  } }
260
260
  function HierarchyTreeComponent_Conditional_19_Conditional_27_Template(rf, ctx) { if (rf & 1) {
261
261
  i0.ɵɵelementStart(0, "div", 74)(1, "h5", 80);
@@ -265,27 +265,27 @@ function HierarchyTreeComponent_Conditional_19_Conditional_27_Template(rf, ctx)
265
265
  i0.ɵɵrepeaterCreate(4, HierarchyTreeComponent_Conditional_19_Conditional_27_For_5_Template, 5, 3, "div", 82, _forTrack1);
266
266
  i0.ɵɵelementEnd()();
267
267
  } if (rf & 2) {
268
- const ctx_r2 = i0.ɵɵnextContext(2);
268
+ const ctx_r1 = i0.ɵɵnextContext(2);
269
269
  i0.ɵɵadvance(4);
270
- i0.ɵɵrepeater(ctx_r2.getRecordAttributeEntries(ctx_r2.SelectedNode.Record));
270
+ i0.ɵɵrepeater(ctx_r1.getRecordAttributeEntries(ctx_r1.SelectedNode.Record));
271
271
  } }
272
272
  function HierarchyTreeComponent_Conditional_19_Conditional_34_Template(rf, ctx) { if (rf & 1) {
273
- const _r14 = i0.ɵɵgetCurrentView();
273
+ const _r13 = i0.ɵɵgetCurrentView();
274
274
  i0.ɵɵelementStart(0, "button", 85);
275
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Conditional_34_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleNodeExpansion(ctx_r2.SelectedNode)); });
275
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Conditional_34_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleNodeExpansion(ctx_r1.SelectedNode)); });
276
276
  i0.ɵɵelement(1, "i", 58);
277
277
  i0.ɵɵelementStart(2, "span");
278
278
  i0.ɵɵtext(3);
279
279
  i0.ɵɵelementEnd()();
280
280
  } if (rf & 2) {
281
- const ctx_r2 = i0.ɵɵnextContext(2);
281
+ const ctx_r1 = i0.ɵɵnextContext(2);
282
282
  i0.ɵɵadvance();
283
- i0.ɵɵclassProp("fa-folder-open", ctx_r2.SelectedNode.IsExpanded)("fa-folder", !ctx_r2.SelectedNode.IsExpanded);
283
+ i0.ɵɵclassProp("fa-folder-open", ctx_r1.SelectedNode.IsExpanded)("fa-folder", !ctx_r1.SelectedNode.IsExpanded);
284
284
  i0.ɵɵadvance(2);
285
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.IsExpanded ? "Collapse" : "Expand");
285
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.IsExpanded ? "Collapse" : "Expand");
286
286
  } }
287
287
  function HierarchyTreeComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
288
- const _r12 = i0.ɵɵgetCurrentView();
288
+ const _r11 = i0.ɵɵgetCurrentView();
289
289
  i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "div", 64);
290
290
  i0.ɵɵelement(3, "i");
291
291
  i0.ɵɵelementEnd();
@@ -295,7 +295,7 @@ function HierarchyTreeComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
295
295
  i0.ɵɵconditionalCreate(7, HierarchyTreeComponent_Conditional_19_Conditional_7_Template, 2, 1, "p", 67);
296
296
  i0.ɵɵelementEnd()();
297
297
  i0.ɵɵelementStart(8, "button", 68);
298
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeDetailsDrawer()); });
298
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDetailsDrawer()); });
299
299
  i0.ɵɵelement(9, "i", 24);
300
300
  i0.ɵɵelementEnd()();
301
301
  i0.ɵɵelementStart(10, "div", 69)(11, "div", 70)(12, "div", 71)(13, "span", 72);
@@ -318,7 +318,7 @@ function HierarchyTreeComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
318
318
  i0.ɵɵelementEnd()()();
319
319
  i0.ɵɵconditionalCreate(27, HierarchyTreeComponent_Conditional_19_Conditional_27_Template, 6, 0, "div", 74);
320
320
  i0.ɵɵelementStart(28, "div", 75)(29, "button", 76);
321
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.navigateToRecord(ctx_r2.SelectedNode)); });
321
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.navigateToRecord(ctx_r1.SelectedNode)); });
322
322
  i0.ɵɵelement(30, "i", 61);
323
323
  i0.ɵɵelementStart(31, "span");
324
324
  i0.ɵɵtext(32, "Open Record");
@@ -326,33 +326,33 @@ function HierarchyTreeComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
326
326
  i0.ɵɵelementStart(33, "div", 77);
327
327
  i0.ɵɵconditionalCreate(34, HierarchyTreeComponent_Conditional_19_Conditional_34_Template, 4, 5, "button", 78);
328
328
  i0.ɵɵelementStart(35, "button", 79);
329
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setFocusRoot(ctx_r2.SelectedNode.ID)); });
329
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Conditional_19_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFocusRoot(ctx_r1.SelectedNode.ID)); });
330
330
  i0.ɵɵelement(36, "i", 25);
331
331
  i0.ɵɵelementStart(37, "span");
332
332
  i0.ɵɵtext(38, "Focus Tree");
333
333
  i0.ɵɵelementEnd()()()()();
334
334
  } if (rf & 2) {
335
- const ctx_r2 = i0.ɵɵnextContext();
335
+ const ctx_r1 = i0.ɵɵnextContext();
336
336
  i0.ɵɵadvance(2);
337
- i0.ɵɵstyleProp("color", ctx_r2.SelectedNode.Color || ctx_r2.Config.DefaultColor);
337
+ i0.ɵɵstyleProp("color", ctx_r1.SelectedNode.Color || ctx_r1.Config.DefaultColor);
338
338
  i0.ɵɵadvance();
339
- i0.ɵɵclassMap(ctx_r2.SelectedNode.Icon || ctx_r2.Config.DefaultIcon);
339
+ i0.ɵɵclassMap(ctx_r1.SelectedNode.Icon || ctx_r1.Config.DefaultIcon);
340
340
  i0.ɵɵadvance(2);
341
- i0.ɵɵproperty("title", ctx_r2.SelectedNode.Name);
341
+ i0.ɵɵproperty("title", ctx_r1.SelectedNode.Name);
342
342
  i0.ɵɵadvance();
343
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.Name);
343
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.Name);
344
344
  i0.ɵɵadvance();
345
- i0.ɵɵconditional(ctx_r2.SelectedNode.Subtitle ? 7 : -1);
345
+ i0.ɵɵconditional(ctx_r1.SelectedNode.Subtitle ? 7 : -1);
346
346
  i0.ɵɵadvance(7);
347
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.Depth);
347
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.Depth);
348
348
  i0.ɵɵadvance(5);
349
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.DirectChildCount);
349
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.DirectChildCount);
350
350
  i0.ɵɵadvance(5);
351
- i0.ɵɵtextInterpolate(ctx_r2.SelectedNode.TotalDescendantCount);
351
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedNode.TotalDescendantCount);
352
352
  i0.ɵɵadvance(3);
353
- i0.ɵɵconditional(ctx_r2.SelectedNode.Record && ctx_r2.getRecordAttributeEntries(ctx_r2.SelectedNode.Record).length > 0 ? 27 : -1);
353
+ i0.ɵɵconditional(ctx_r1.SelectedNode.Record && ctx_r1.getRecordAttributeEntries(ctx_r1.SelectedNode.Record).length > 0 ? 27 : -1);
354
354
  i0.ɵɵadvance(7);
355
- i0.ɵɵconditional(ctx_r2.SelectedNode.DirectChildCount > 0 ? 34 : -1);
355
+ i0.ɵɵconditional(ctx_r1.SelectedNode.DirectChildCount > 0 ? 34 : -1);
356
356
  } }
357
357
  /**
358
358
  * Modern, interactive, canvas-based visual hierarchy and organizational chart component.
@@ -826,23 +826,11 @@ export class HierarchyTreeComponent extends BaseAngularComponent {
826
826
  return 'Name';
827
827
  }
828
828
  extractPrimaryKey(item) {
829
- const pk = new CompositeKey();
830
- if (this.entityInfo && this.entityInfo.PrimaryKeys.length > 0) {
831
- for (const k of this.entityInfo.PrimaryKeys) {
832
- pk.KeyValuePairs.push({
833
- FieldName: k.Name,
834
- Value: this.getItemValue(item, k.Name)
835
- });
836
- }
837
- }
838
- else {
839
- pk.KeyValuePairs.push({
840
- FieldName: 'ID',
841
- Value: this.getItemValue(item, 'ID') ?? this.getItemValue(item, 'id') ?? ''
842
- });
843
- }
844
- const id = pk.KeyValuePairs.length === 1 ? String(pk.KeyValuePairs[0].Value) : pk.ToURLSegment();
845
- return { pk, id };
829
+ const pk = this.entityInfo && this.entityInfo.PrimaryKeys.length > 0
830
+ ? new CompositeKey(this.entityInfo.PrimaryKeys.map(k => new KeyValuePair(k.Name, this.getItemValue(item, k.Name))))
831
+ // No entity metadata: the tree's default item shape is keyed by ID/id.
832
+ : CompositeKey.FromID(this.getItemValue(item, 'ID') ?? this.getItemValue(item, 'id') ?? ''); // first-pk-ok: reached only when no entity metadata is available; the metadata branch above uses every PrimaryKeys column
833
+ return { pk, id: pk.ToCompactURLSegment() };
846
834
  }
847
835
  wouldCreateCycle(node, proposedParent) {
848
836
  let curr = proposedParent;
@@ -1309,11 +1297,10 @@ export class HierarchyTreeComponent extends BaseAngularComponent {
1309
1297
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.svgContainerRef = _t.first);
1310
1298
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.svgRef = _t.first);
1311
1299
  } }, inputs: { Config: "Config", Data: "Data", ActiveRecordID: "ActiveRecordID", FocusRecordID: "FocusRecordID", AllowNodeActions: "AllowNodeActions", ZoomLevel: "ZoomLevel" }, outputs: { NodeClick: "NodeClick", NodeDoubleClick: "NodeDoubleClick", NodeSelect: "NodeSelect", BeforeNodeExpand: "BeforeNodeExpand", AfterNodeExpand: "AfterNodeExpand", BeforeNodeCollapse: "BeforeNodeCollapse", AfterNodeCollapse: "AfterNodeCollapse", BeforeReparent: "BeforeReparent", AfterReparent: "AfterReparent", NodeAction: "NodeAction", ZoomChange: "ZoomChange", Navigate: "Navigate" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 20, vars: 9, consts: [["svgContainer", ""], ["svgElement", ""], [1, "mj-hierarchy-wrapper"], [1, "mj-hierarchy-toolbar"], [1, "mj-canvas-container", 3, "click"], [1, "mj-state-overlay"], [1, "mj-state-overlay", "mj-error-state"], [1, "mj-state-overlay", "mj-empty-state"], [1, "mj-hierarchy-svg"], ["id", "mj-tree-grid", "width", "24", "height", "24", "patternUnits", "userSpaceOnUse"], ["cx", "12", "cy", "12", "r", "1", "fill", "var(--mj-border-subtle, #1e293b)", "opacity", "0.4"], ["width", "100%", "height", "100%", "fill", "url(#mj-tree-grid)"], [1, "mj-hierarchy-canvas"], [1, "mj-links-group"], [1, "mj-nodes-group"], ["aria-label", "Node details panel", 1, "mj-details-drawer"], [1, "mj-search-box"], [1, "mj-focus-indicator"], [1, "mj-toolbar-actions"], [1, "fa-solid", "fa-magnifying-glass", "mj-search-icon"], ["type", "text", "placeholder", "Search hierarchy...", 1, "mj-search-input", 3, "ngModelChange", "input", "ngModel"], ["type", "button", "title", "Clear search", 1, "mj-clear-btn"], [1, "mj-match-badge"], ["type", "button", "title", "Clear search", 1, "mj-clear-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-crosshairs"], ["type", "button", "title", "Show entire hierarchy", 1, "mj-reset-focus-btn", 3, "click"], [1, "fa-solid", "fa-rotate-left"], ["type", "button", "title", "Expand all subtrees", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-folder-open"], ["type", "button", "title", "Collapse all subtrees", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "mj-tool-divider"], ["type", "button", "title", "Zoom in", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["type", "button", "title", "Zoom out", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-minus"], ["type", "button", "title", "Fit hierarchy to view", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-expand"], ["type", "button", "title", "Reload hierarchy data", 1, "mj-tool-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], [1, "mj-spinner"], [1, "fa-solid", "fa-circle-exclamation", "mj-error-icon"], ["type", "button", 1, "mj-retry-btn", 3, "click"], [1, "fa-solid", "fa-sitemap", "mj-empty-icon"], [1, "mj-node-foreign-object"], [1, "mj-node-card", 3, "click", "dblclick"], [1, "mj-card-accent"], [1, "mj-node-header"], [1, "mj-node-icon"], [1, "mj-node-title-group"], [1, "mj-node-name", 3, "title"], [1, "mj-node-subtitle"], [1, "mj-node-footer"], ["type", "button", 1, "mj-expand-badge", 3, "collapsed", "title"], [1, "mj-leaf-indicator"], [1, "mj-node-actions"], ["type", "button", 1, "mj-expand-badge", 3, "click", "title"], [1, "fa-solid"], ["type", "button", "title", "Focus on this subtree", 1, "mj-node-action-btn", 3, "click"], ["type", "button", "title", "Open record in Explorer", 1, "mj-node-action-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "mj-drawer-header"], [1, "mj-drawer-title-group"], [1, "mj-drawer-icon"], [1, "mj-drawer-titles"], [1, "mj-drawer-name", 3, "title"], [1, "mj-drawer-subtitle"], ["type", "button", "title", "Close details", 1, "mj-drawer-close-btn", 3, "click"], [1, "mj-drawer-body"], [1, "mj-drawer-stats"], [1, "mj-stat-card"], [1, "mj-stat-num"], [1, "mj-stat-label"], [1, "mj-drawer-section"], [1, "mj-drawer-actions"], ["type", "button", "title", "Open this record in Explorer", 1, "mj-drawer-btn-primary", 3, "click"], [1, "mj-drawer-btn-row"], ["type", "button", 1, "mj-drawer-btn-secondary"], ["type", "button", "title", "Focus hierarchy on this subtree", 1, "mj-drawer-btn-secondary", 3, "click"], [1, "mj-section-heading"], [1, "mj-attr-list"], [1, "mj-attr-row"], [1, "mj-attr-dt"], [1, "mj-attr-dd", 3, "title"], ["type", "button", 1, "mj-drawer-btn-secondary", 3, "click"]], template: function HierarchyTreeComponent_Template(rf, ctx) { if (rf & 1) {
1312
- const _r1 = i0.ɵɵgetCurrentView();
1313
1300
  i0.ɵɵelementStart(0, "div", 2);
1314
1301
  i0.ɵɵconditionalCreate(1, HierarchyTreeComponent_Conditional_1_Template, 4, 3, "div", 3);
1315
1302
  i0.ɵɵelementStart(2, "div", 4, 0);
1316
- i0.ɵɵlistener("click", function HierarchyTreeComponent_Template_div_click_2_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCanvasBackgroundClick($event)); });
1303
+ i0.ɵɵlistener("click", function HierarchyTreeComponent_Template_div_click_2_listener($event) { return ctx.onCanvasBackgroundClick($event); });
1317
1304
  i0.ɵɵconditionalCreate(4, HierarchyTreeComponent_Conditional_4_Template, 4, 0, "div", 5)(5, HierarchyTreeComponent_Conditional_5_Template, 6, 1, "div", 6)(6, HierarchyTreeComponent_Conditional_6_Template, 4, 0, "div", 7);
1318
1305
  i0.ɵɵnamespaceSVG();
1319
1306
  i0.ɵɵelementStart(7, "svg", 8, 1)(9, "defs")(10, "pattern", 9);
@@ -1341,7 +1328,7 @@ export class HierarchyTreeComponent extends BaseAngularComponent {
1341
1328
  i0.ɵɵclassProp("open", ctx.SelectedNode != null && ctx.ShowDetailsDrawer);
1342
1329
  i0.ɵɵadvance();
1343
1330
  i0.ɵɵconditional(ctx.SelectedNode ? 19 : -1);
1344
- } }, dependencies: [CommonModule, FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 500px;\n position: relative;\n box-sizing: border-box;\n font-family: inherit;\n flex: 1;\n}\n\n.mj-hierarchy-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: inherit;\n flex: 1;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 12px;\n overflow: hidden;\n position: relative;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n\n\n\n.mj-hierarchy-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface, #0f172a);\n border-bottom: 1px solid var(--mj-border-default, #1e293b);\n gap: 12px;\n z-index: 10;\n flex-wrap: wrap;\n}\n\n\n\n.mj-search-box[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 4px 10px;\n min-width: 240px;\n max-width: 340px;\n flex: 1;\n transition: border-color 0.18s ease;\n}\n\n.mj-search-box[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary, #38bdf8);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 18%, transparent);\n}\n\n.mj-search-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-search-input[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n outline: none;\n color: var(--mj-text-primary, #f8fafc);\n font-size: 12.5px;\n width: 100%;\n}\n\n.mj-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-muted, #64748b);\n cursor: pointer;\n font-size: 11px;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.mj-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary, #f8fafc);\n}\n\n.mj-match-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n padding: 2px 7px;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 15%, transparent);\n color: var(--mj-brand-primary, #38bdf8);\n white-space: nowrap;\n}\n\n\n\n.mj-focus-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-brand-primary, #38bdf8);\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 30%, transparent);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.mj-reset-focus-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 700;\n cursor: pointer;\n margin-left: 6px;\n transition: opacity 0.15s ease;\n}\n\n.mj-reset-focus-btn[_ngcontent-%COMP%]:hover {\n opacity: 0.9;\n}\n\n\n\n.mj-toolbar-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: 1px solid var(--mj-border-subtle, #1e293b);\n border-radius: 6px;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.18s ease;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated, #1e293b);\n color: var(--mj-text-primary, #f8fafc);\n border-color: var(--mj-border-default, #334155);\n}\n\n.mj-tool-divider[_ngcontent-%COMP%] {\n width: 1px;\n height: 18px;\n background: var(--mj-border-subtle, #1e293b);\n margin: 0 4px;\n}\n\n\n\n.mj-canvas-container[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n min-height: 450px;\n cursor: grab;\n}\n\n.mj-canvas-container[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.mj-hierarchy-svg[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n}\n\n\n\n.mj-state-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(4px);\n z-index: 20;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 13px;\n}\n\n.mj-spinner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 3px solid color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 20%, transparent);\n border-top-color: var(--mj-brand-primary, #38bdf8);\n border-radius: 50%;\n animation: _ngcontent-%COMP%_mj-spin 0.8s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-error-icon[_ngcontent-%COMP%], .mj-empty-icon[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-retry-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n font-size: 12px;\n font-weight: 700;\n border-radius: 6px;\n cursor: pointer;\n}\n\n\n\n.mj-node-foreign-object[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n\n.mj-node-card[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n background: var(--mj-bg-surface-card, #111a2e);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 10px;\n padding: 8px 12px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);\n position: relative;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n user-select: none;\n}\n\n.mj-node-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary, #38bdf8);\n transform: translateY(-2px);\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5), 0 0 12px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 20%, transparent);\n}\n\n.mj-node-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary, #38bdf8);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 40%, transparent), 0 6px 20px rgba(0, 0, 0, 0.6);\n}\n\n.mj-node-card.highlighted[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 40%, transparent), 0 6px 20px rgba(0, 0, 0, 0.6);\n}\n\n.mj-node-card.focus-root[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n\n\n.mj-card-accent[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 3px;\n border-radius: 3px 3px 0 0;\n opacity: 0.85;\n}\n\n\n\n.mj-node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 4px;\n}\n\n.mj-node-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.mj-node-title-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.mj-node-name[_ngcontent-%COMP%] {\n font-size: 12.5px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.mj-node-subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted, #94a3b8);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n\n\n.mj-node-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 6px;\n border-top: 1px solid rgba(255, 255, 255, 0.06);\n}\n\n\n\n.mj-expand-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 9999px;\n padding: 2px 8px;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 11px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-expand-badge[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary, #38bdf8);\n}\n\n.mj-expand-badge.collapsed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 15%, transparent);\n color: var(--mj-brand-primary, #38bdf8);\n border-color: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 35%, transparent);\n}\n\n.mj-leaf-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding-left: 2px;\n}\n\n\n\n.mj-node-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-node-action-btn[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border-radius: 4px;\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted, #64748b);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10.5px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-node-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated, #1a2744);\n border-color: var(--mj-border-default, #223254);\n color: var(--mj-brand-primary, #38bdf8);\n}\n\n\n\n\n\n.mj-details-drawer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 330px;\n max-width: 85%;\n background: var(--mj-bg-surface, #0f172a);\n border-left: 1px solid var(--mj-border-default, #1e293b);\n box-shadow: -6px 0 24px rgba(0, 0, 0, 0.45);\n z-index: 30;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.26s cubic-bezier(0.16, 1, 0.3, 1);\n pointer-events: none;\n user-select: text;\n}\n\n.mj-details-drawer.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n pointer-events: auto;\n}\n\n.mj-drawer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 16px 18px;\n background: var(--mj-bg-surface-elevated, #151f36);\n border-bottom: 1px solid var(--mj-border-default, #1e293b);\n gap: 12px;\n}\n\n.mj-drawer-title-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-drawer-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.mj-drawer-titles[_ngcontent-%COMP%] {\n min-width: 0;\n flex: 1;\n}\n\n.mj-drawer-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.mj-drawer-subtitle[_ngcontent-%COMP%] {\n margin: 2px 0 0 0;\n font-size: 12px;\n color: var(--mj-text-muted, #94a3b8);\n line-height: 1.3;\n}\n\n.mj-drawer-close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted, #94a3b8);\n cursor: pointer;\n font-size: 14px;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.mj-drawer-close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.08);\n color: var(--mj-text-primary, #f8fafc);\n border-color: var(--mj-border-default, #223254);\n}\n\n.mj-drawer-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n}\n\n.mj-drawer-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.mj-stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 8px 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n\n.mj-stat-num[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-brand-primary, #38bdf8);\n line-height: 1.2;\n}\n\n.mj-stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n margin-top: 2px;\n}\n\n.mj-drawer-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-section-heading[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-attr-list[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 10px 12px;\n}\n\n.mj-attr-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.04);\n padding-bottom: 4px;\n}\n\n.mj-attr-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.mj-attr-dt[_ngcontent-%COMP%] {\n color: var(--mj-text-muted, #94a3b8);\n font-weight: 500;\n}\n\n.mj-attr-dd[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-primary, #f8fafc);\n font-weight: 600;\n text-align: right;\n max-width: 170px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-drawer-actions[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: auto;\n padding-top: 12px;\n}\n\n.mj-drawer-btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n padding: 9px 16px;\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.18s ease;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 30%, transparent);\n}\n\n.mj-drawer-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 14px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 45%, transparent);\n transform: translateY(-1px);\n}\n\n.mj-drawer-btn-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.mj-drawer-btn-secondary[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 8px;\n padding: 7px 12px;\n color: var(--mj-text-primary, #f8fafc);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-drawer-btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default, #223254);\n border-color: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-brand-primary, #38bdf8);\n}"] });
1331
+ } }, dependencies: [CommonModule, FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 500px;\n position: relative;\n box-sizing: border-box;\n font-family: inherit;\n flex: 1;\n}\n\n.mj-hierarchy-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: inherit;\n flex: 1;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 12px;\n overflow: hidden;\n position: relative;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n\n\n.mj-hierarchy-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface, #0f172a);\n border-bottom: 1px solid var(--mj-border-default, #1e293b);\n gap: 12px;\n z-index: 10;\n flex-wrap: wrap;\n}\n\n\n.mj-search-box[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 4px 10px;\n min-width: 240px;\n max-width: 340px;\n flex: 1;\n transition: border-color 0.18s ease;\n}\n\n.mj-search-box[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary, #38bdf8);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 18%, transparent);\n}\n\n.mj-search-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-search-input[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n outline: none;\n color: var(--mj-text-primary, #f8fafc);\n font-size: 12.5px;\n width: 100%;\n}\n\n.mj-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-muted, #64748b);\n cursor: pointer;\n font-size: 11px;\n padding: 2px 4px;\n border-radius: 4px;\n}\n\n.mj-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary, #f8fafc);\n}\n\n.mj-match-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n padding: 2px 7px;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 15%, transparent);\n color: var(--mj-brand-primary, #38bdf8);\n white-space: nowrap;\n}\n\n\n.mj-focus-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-brand-primary, #38bdf8);\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 30%, transparent);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.mj-reset-focus-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 700;\n cursor: pointer;\n margin-left: 6px;\n transition: opacity 0.15s ease;\n}\n\n.mj-reset-focus-btn[_ngcontent-%COMP%]:hover {\n opacity: 0.9;\n}\n\n\n.mj-toolbar-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: 1px solid var(--mj-border-subtle, #1e293b);\n border-radius: 6px;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.18s ease;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated, #1e293b);\n color: var(--mj-text-primary, #f8fafc);\n border-color: var(--mj-border-default, #334155);\n}\n\n.mj-tool-divider[_ngcontent-%COMP%] {\n width: 1px;\n height: 18px;\n background: var(--mj-border-subtle, #1e293b);\n margin: 0 4px;\n}\n\n\n.mj-canvas-container[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n min-height: 450px;\n cursor: grab;\n}\n\n.mj-canvas-container[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.mj-hierarchy-svg[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n}\n\n\n.mj-state-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(4px);\n z-index: 20;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 13px;\n}\n\n.mj-spinner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 3px solid color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 20%, transparent);\n border-top-color: var(--mj-brand-primary, #38bdf8);\n border-radius: 50%;\n animation: _ngcontent-%COMP%_mj-spin 0.8s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-error-icon[_ngcontent-%COMP%], .mj-empty-icon[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-retry-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n font-size: 12px;\n font-weight: 700;\n border-radius: 6px;\n cursor: pointer;\n}\n\n\n.mj-node-foreign-object[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n.mj-node-card[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n background: var(--mj-bg-surface-card, #111a2e);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 10px;\n padding: 8px 12px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);\n position: relative;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n user-select: none;\n}\n\n.mj-node-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary, #38bdf8);\n transform: translateY(-2px);\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5), 0 0 12px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 20%, transparent);\n}\n\n.mj-node-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary, #38bdf8);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 40%, transparent), 0 6px 20px rgba(0, 0, 0, 0.6);\n}\n\n.mj-node-card.highlighted[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 40%, transparent), 0 6px 20px rgba(0, 0, 0, 0.6);\n}\n\n.mj-node-card.focus-root[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n\n.mj-card-accent[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 3px;\n border-radius: 3px 3px 0 0;\n opacity: 0.85;\n}\n\n\n.mj-node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 4px;\n}\n\n.mj-node-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.mj-node-title-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n}\n\n.mj-node-name[_ngcontent-%COMP%] {\n font-size: 12.5px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.mj-node-subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted, #94a3b8);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n\n.mj-node-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 6px;\n border-top: 1px solid rgba(255, 255, 255, 0.06);\n}\n\n\n.mj-expand-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 9999px;\n padding: 2px 8px;\n color: var(--mj-text-secondary, #94a3b8);\n font-size: 11px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-expand-badge[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary, #38bdf8);\n}\n\n.mj-expand-badge.collapsed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 15%, transparent);\n color: var(--mj-brand-primary, #38bdf8);\n border-color: color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 35%, transparent);\n}\n\n.mj-leaf-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding-left: 2px;\n}\n\n\n.mj-node-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-node-action-btn[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border-radius: 4px;\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted, #64748b);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10.5px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-node-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated, #1a2744);\n border-color: var(--mj-border-default, #223254);\n color: var(--mj-brand-primary, #38bdf8);\n}\n\n\n\n\n.mj-details-drawer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 330px;\n max-width: 85%;\n background: var(--mj-bg-surface, #0f172a);\n border-left: 1px solid var(--mj-border-default, #1e293b);\n box-shadow: -6px 0 24px rgba(0, 0, 0, 0.45);\n z-index: 30;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.26s cubic-bezier(0.16, 1, 0.3, 1);\n pointer-events: none;\n user-select: text;\n}\n\n.mj-details-drawer.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n pointer-events: auto;\n}\n\n.mj-drawer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 16px 18px;\n background: var(--mj-bg-surface-elevated, #151f36);\n border-bottom: 1px solid var(--mj-border-default, #1e293b);\n gap: 12px;\n}\n\n.mj-drawer-title-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-drawer-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.mj-drawer-titles[_ngcontent-%COMP%] {\n min-width: 0;\n flex: 1;\n}\n\n.mj-drawer-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.mj-drawer-subtitle[_ngcontent-%COMP%] {\n margin: 2px 0 0 0;\n font-size: 12px;\n color: var(--mj-text-muted, #94a3b8);\n line-height: 1.3;\n}\n\n.mj-drawer-close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted, #94a3b8);\n cursor: pointer;\n font-size: 14px;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.mj-drawer-close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.08);\n color: var(--mj-text-primary, #f8fafc);\n border-color: var(--mj-border-default, #223254);\n}\n\n.mj-drawer-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n}\n\n.mj-drawer-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.mj-stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 8px 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n\n.mj-stat-num[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-brand-primary, #38bdf8);\n line-height: 1.2;\n}\n\n.mj-stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n margin-top: 2px;\n}\n\n.mj-drawer-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-section-heading[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--mj-text-muted, #64748b);\n}\n\n.mj-attr-list[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--mj-bg-surface-sunken, #080d1a);\n border: 1px solid var(--mj-border-default, #1e293b);\n border-radius: 8px;\n padding: 10px 12px;\n}\n\n.mj-attr-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.04);\n padding-bottom: 4px;\n}\n\n.mj-attr-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.mj-attr-dt[_ngcontent-%COMP%] {\n color: var(--mj-text-muted, #94a3b8);\n font-weight: 500;\n}\n\n.mj-attr-dd[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-primary, #f8fafc);\n font-weight: 600;\n text-align: right;\n max-width: 170px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-drawer-actions[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: auto;\n padding-top: 12px;\n}\n\n.mj-drawer-btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n padding: 9px 16px;\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.18s ease;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 30%, transparent);\n}\n\n.mj-drawer-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 14px color-mix(in srgb, var(--mj-brand-primary, #38bdf8) 45%, transparent);\n transform: translateY(-1px);\n}\n\n.mj-drawer-btn-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.mj-drawer-btn-secondary[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 8px;\n padding: 7px 12px;\n color: var(--mj-text-primary, #f8fafc);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-drawer-btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default, #223254);\n border-color: var(--mj-brand-primary, #38bdf8);\n color: var(--mj-brand-primary, #38bdf8);\n}"] });
1345
1332
  }
1346
1333
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(HierarchyTreeComponent, [{
1347
1334
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"hierarchy-tree.component.js","sourceRoot":"","sources":["../../../src/lib/components/hierarchy-tree.component.ts","../../../src/lib/components/hierarchy-tree.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n AfterViewInit\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RunView, CompositeKey, EntityInfo } from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { FormNavigationEvent, RecordNavigationEvent } from '@memberjunction/ng-base-forms';\nimport * as d3 from 'd3';\nimport {\n HierarchyTreeConfig,\n HierarchyNodeData,\n HierarchyTreeOrientation,\n HierarchyNodeStyle\n} from '../models/hierarchy-tree.types';\nimport {\n HierarchyNodeEvent,\n CancelableHierarchyNodeEvent,\n ReparentEvent,\n CancelableReparentEvent,\n NodeActionEvent\n} from '../events/hierarchy-tree.events';\n\n/**\n * Modern, interactive, canvas-based visual hierarchy and organizational chart component.\n *\n * Automatically generates a dynamic, zoomable tree visualization for any MemberJunction entity\n * with a self-referencing parent foreign key (such as Corporate Subsidiaries, Product Categories,\n * Committee Governance structures, Tag Taxonomies, and Management Lines).\n *\n * Features:\n * - **Metadata Driven**: Auto-derives primary keys (including composite keys) and parent fields from MJ metadata.\n * - **Interactive Canvas**: D3-powered smooth pan, zoom, auto-fit, and mini-toolbar controls.\n * - **Collapsible Subtrees**: Interactive `[+]` / `[-]` badges with direct and total descendant counts.\n * - **Live Search & Path Expansion**: Instant keyword search that highlights matches and auto-expands ancestor branches.\n * - **Subtree Focus**: Isolate any node as the root of the view with 1-click return to full hierarchy.\n * - **Full Design Token Theming**: Uses `--mj-*` surface, border, typography, and accent tokens.\n * - **Extensive Cancelable Events**: Before/After events for expansion, collapse, reparenting, and navigation.\n *\n * @example\n * ```html\n * <mj-hierarchy-tree\n * [Config]=\"{\n * EntityName: 'MJ_BizApps_Common: Organizations',\n * ParentField: 'ParentID',\n * SubtitleField: 'OrganizationType',\n * DefaultIcon: 'fa-solid fa-building'\n * }\"\n * (Navigate)=\"onNavigate($event)\">\n * </mj-hierarchy-tree>\n * ```\n */\n@Component({\n selector: 'mj-hierarchy-tree',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './hierarchy-tree.component.html',\n styleUrls: ['./hierarchy-tree.component.css']\n})\nexport class HierarchyTreeComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n constructor(private cdr?: ChangeDetectorRef) {\n super();\n }\n\n @ViewChild('svgContainer', { static: false }) svgContainerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('svgElement', { static: false }) svgRef!: ElementRef<SVGSVGElement>;\n\n /**\n * Declarative configuration defining the target entity and visual layout properties.\n */\n @Input() Config!: HierarchyTreeConfig;\n\n /**\n * Optional pre-loaded data array. If provided, the component skips the automated\n * `RunView` query and constructs the tree directly from these items.\n */\n @Input() Data?: Record<string, unknown>[];\n\n /**\n * Optional active / selected record ID. When provided, the node is highlighted and all ancestors\n * are expanded so it is visible in full tree context.\n */\n @Input() ActiveRecordID?: string;\n\n /**\n * Primary key ID to focus as the subtree root.\n */\n @Input() FocusRecordID?: string;\n\n /**\n * Controls whether action buttons (Open Record, Focus, Add Child) appear on node cards.\n */\n @Input() AllowNodeActions = true;\n\n /**\n * Emitted when a node is clicked.\n */\n @Output() NodeClick = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted when a node is double-clicked.\n */\n @Output() NodeDoubleClick = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted when a node is selected / set as active.\n */\n @Output() NodeSelect = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node expands its children. Cancelable.\n */\n @Output() BeforeNodeExpand = new EventEmitter<CancelableHierarchyNodeEvent>();\n\n /**\n * Emitted after a node has expanded its children.\n */\n @Output() AfterNodeExpand = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node collapses its children. Cancelable.\n */\n @Output() BeforeNodeCollapse = new EventEmitter<CancelableHierarchyNodeEvent>();\n\n /**\n * Emitted after a node has collapsed its children.\n */\n @Output() AfterNodeCollapse = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node is reparented. Cancelable.\n */\n @Output() BeforeReparent = new EventEmitter<CancelableReparentEvent>();\n\n /**\n * Emitted after a node has been reparented.\n */\n @Output() AfterReparent = new EventEmitter<ReparentEvent>();\n\n /**\n * Emitted when an action button (e.g. Open, Add Child, Focus) is invoked on a node.\n */\n @Output() NodeAction = new EventEmitter<NodeActionEvent>();\n\n /**\n * Optional persisted zoom scale factor to restore.\n */\n @Input() ZoomLevel?: number;\n\n /**\n * Emitted when the user zooms in or out on the hierarchy canvas.\n */\n @Output() ZoomChange = new EventEmitter<number>();\n\n /**\n * Emitted when the user requests navigation to a full entity record.\n */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // --- State ---\n public Loading = false;\n public ErrorMessage: string | null = null;\n public SearchQuery = '';\n public MatchingNodeCount = 0;\n public FocusedNode: HierarchyNodeData | null = null;\n public SelectedNode: HierarchyNodeData | null = null;\n public ShowDetailsDrawer = false;\n\n /** Flattened list of all loaded hierarchy nodes for search and lookup. */\n public AllNodes: HierarchyNodeData[] = [];\n private nodeMap = new Map<string, HierarchyNodeData>();\n\n /** The root nodes of the active view. */\n public RootNodes: HierarchyNodeData[] = [];\n\n /** D3 zoom behavior and SVG group selection */\n private zoomBehavior: d3.ZoomBehavior<SVGSVGElement, unknown> | null = null;\n private svgSelection: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private gSelection: d3.Selection<SVGGElement, unknown, null, undefined> | null = null;\n private currentZoomTransform: d3.ZoomTransform = d3.zoomIdentity;\n\n private resizeObserver: ResizeObserver | null = null;\n private entityInfo: EntityInfo | null = null;\n private previousConfigState: Partial<HierarchyTreeConfig> = {};\n\n public ngOnInit(): void {\n this.initializeConfig();\n this.log('[HierarchyTree:ngOnInit] Initializing with Config:', this.Config);\n if (this.Config) {\n this.previousConfigState = {\n EntityName: this.Config.EntityName,\n ExtraFilter: this.Config.ExtraFilter,\n OrderBy: this.Config.OrderBy,\n MaxRows: this.Config.MaxRows,\n ParentField: this.Config.ParentField\n };\n }\n this.loadData();\n }\n\n public ngAfterViewInit(): void {\n this.log('[HierarchyTree:ngAfterViewInit] Initializing D3 Zoom & ResizeObserver. svgRef:', !!this.svgRef?.nativeElement, 'containerRect:', this.svgContainerRef?.nativeElement?.getBoundingClientRect());\n this.initD3Zoom();\n this.setupResizeObserver();\n if (this.AllNodes.length > 0) {\n this.log('[HierarchyTree:ngAfterViewInit] AllNodes already loaded (' + this.AllNodes.length + '), triggering renderTree');\n this.renderTree();\n }\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.log('[HierarchyTree:ngOnChanges] Changes detected:', Object.keys(changes));\n if (changes['Config'] && !changes['Config'].isFirstChange()) {\n this.initializeConfig();\n if (this.hasDataConfigChanged(this.Config)) {\n this.log('[HierarchyTree:ngOnChanges] Data config changed, triggering loadData');\n this.loadData();\n } else {\n const activeId = this.ActiveRecordID || this.Config?.ActiveRecordID;\n this.log('[HierarchyTree:ngOnChanges] Config changed but data identical, updating active node:', activeId);\n this.updateActiveNodeSelection(activeId);\n }\n } else if (changes['ActiveRecordID'] && !changes['ActiveRecordID'].isFirstChange()) {\n this.updateActiveNodeSelection(this.ActiveRecordID);\n } else if (changes['Data'] && !changes['Data'].isFirstChange()) {\n this.buildTreeFromData(this.Data || []);\n } else if (changes['FocusRecordID'] && !changes['FocusRecordID'].isFirstChange()) {\n this.setFocusRoot(this.FocusRecordID);\n } else if (changes['ZoomLevel'] && !changes['ZoomLevel'].isFirstChange() && this.ZoomLevel !== undefined) {\n this.setZoomLevel(this.ZoomLevel, true);\n }\n }\n\n private hasDataConfigChanged(newConfig?: HierarchyTreeConfig): boolean {\n if (!newConfig) return false;\n const prev = this.previousConfigState;\n const hasChanged =\n prev.EntityName !== newConfig.EntityName ||\n prev.ExtraFilter !== newConfig.ExtraFilter ||\n prev.OrderBy !== newConfig.OrderBy ||\n prev.MaxRows !== newConfig.MaxRows ||\n prev.ParentField !== newConfig.ParentField;\n\n if (hasChanged) {\n this.previousConfigState = {\n EntityName: newConfig.EntityName,\n ExtraFilter: newConfig.ExtraFilter,\n OrderBy: newConfig.OrderBy,\n MaxRows: newConfig.MaxRows,\n ParentField: newConfig.ParentField\n };\n }\n return hasChanged;\n }\n\n private updateActiveNodeSelection(activeId?: string): void {\n if (!activeId) return;\n const activeNode = this.nodeMap.get(NormalizeUUID(activeId));\n if (activeNode && (!this.SelectedNode || !UUIDsEqual(this.SelectedNode.ID, activeNode.ID))) {\n for (const n of this.AllNodes) {\n n.IsSelected = UUIDsEqual(n.ID, activeNode.ID);\n }\n this.SelectedNode = activeNode;\n this.expandAncestors(activeNode);\n this.renderTree();\n }\n }\n\n public ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n // --- Configuration Initialization ---\n private initializeConfig(): void {\n if (!this.Config) return;\n this.Config = {\n DefaultIcon: 'fa-solid fa-sitemap',\n // Design token, not a literal — the accent is bound to [style.background]/[style.color],\n // so a var() resolves at paint time and follows the active theme. The fallback keeps the\n // original rendering wherever the token stylesheet isn't loaded.\n DefaultColor: 'var(--mj-brand-primary, #38bdf8)',\n Orientation: 'top-to-bottom',\n NodeStyle: 'card',\n AllowDragDropReparent: false,\n AllowNodeActions: true,\n ShowSearch: true,\n ShowToolbar: true,\n NodeWidth: 230,\n NodeHeight: 90,\n SiblingSpacing: 40,\n LevelSpacing: 75,\n Height: '100%',\n MinHeight: '500px',\n NavigateOnNodeClick: true,\n AutoRootFocus: true,\n Verbose: false,\n ...this.Config\n };\n }\n\n private log(message: string, ...args: unknown[]): void {\n if (this.Config?.Verbose) {\n console.log(message, ...args);\n }\n }\n\n // --- Data Loading & Tree Construction ---\n\n /**\n * Loads records from the server via `RunView` using entity metadata.\n */\n public async loadData(): Promise<void> {\n if (!this.Config?.EntityName) return;\n\n this.Loading = true;\n this.ErrorMessage = null;\n this.cdr?.detectChanges();\n\n try {\n // ProviderToUse, not `new Metadata()` — this is an L1 widget, so it must read metadata\n // from whatever provider the host bound via @Input() Provider (BaseAngularComponent\n // falls back to the ambient one). Binding the global provider here would silently query\n // the wrong database wherever the component is hosted against a non-default connection.\n const configEntityLower = this.Config.EntityName.toLowerCase();\n const configEntityStripped = this.Config.EntityName.replace(/^mj[:_\\s]+/i, '').trim().toLowerCase();\n this.entityInfo = this.ProviderToUse.Entities.find((e) => {\n const eNameLower = e.Name.toLowerCase();\n const eNameStripped = e.Name.replace(/^mj[:_\\s]+/i, '').trim().toLowerCase();\n return eNameLower === configEntityLower || eNameStripped === configEntityStripped;\n }) || null;\n\n const targetEntityName = this.entityInfo ? this.entityInfo.Name : this.Config.EntityName;\n this.log('[HierarchyTree:loadData] Starting load for:', targetEntityName, {\n configuredEntity: this.Config.EntityName,\n resolvedEntity: this.entityInfo?.Name,\n activeRecordId: this.ActiveRecordID || this.Config?.ActiveRecordID,\n focusRecordId: this.FocusRecordID || this.Config?.FocusRecordID,\n extraFilter: this.Config.ExtraFilter\n });\n\n if (this.Data) {\n this.log('[HierarchyTree:loadData] Using provided Data prop:', this.Data.length, 'items');\n this.buildTreeFromData(this.Data);\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const defaultOrderBy = `${this.resolveNameFieldName()} ASC`;\n const rvParams = {\n EntityName: targetEntityName,\n ExtraFilter: this.Config.ExtraFilter || '',\n OrderBy: this.Config.OrderBy || defaultOrderBy,\n ResultType: 'simple' as const,\n MaxRows: this.Config.MaxRows ?? 0\n };\n this.log('[HierarchyTree:loadData] Calling RunView with params:', rvParams);\n const result = await rv.RunView(rvParams);\n\n this.log('[HierarchyTree:loadData] RunView response:', {\n success: result.Success,\n rowCount: result.RowCount,\n resultsLength: result.Results?.length,\n errorMessage: result.ErrorMessage,\n sampleRow: result.Results?.[0]\n });\n\n if (!result.Success) {\n this.ErrorMessage = result.ErrorMessage || 'Failed to load hierarchy data.';\n return;\n }\n\n const rawItems = (result.Results as Record<string, unknown>[]) || [];\n this.buildTreeFromData(rawItems);\n } catch (err) {\n this.ErrorMessage = err instanceof Error ? err.message : 'Error loading hierarchy tree.';\n console.error('[HierarchyTree:loadData] Error:', err);\n } finally {\n this.Loading = false;\n this.cdr?.detectChanges();\n setTimeout(() => {\n this.renderTree();\n this.fitToScreen(false);\n }, 80);\n }\n }\n\n /**\n * Helper to retrieve a property value from a record item in a case-insensitive manner.\n */\n private getItemValue(item: Record<string, unknown>, fieldName?: string): unknown {\n if (!item || !fieldName) return undefined;\n if (item[fieldName] !== undefined) return item[fieldName];\n const lower = fieldName.toLowerCase();\n for (const [k, v] of Object.entries(item)) {\n if (k.toLowerCase() === lower) return v;\n }\n return undefined;\n }\n\n /**\n * Constructs the in-memory tree nodes, computes composite keys, descendant counts, and depths.\n */\n public buildTreeFromData(items: Record<string, unknown>[]): void {\n this.nodeMap.clear();\n this.AllNodes = [];\n\n const parentFieldName = this.resolveParentFieldName();\n const nameFieldName = this.resolveNameFieldName();\n const subtitleFieldName = this.Config?.SubtitleField;\n const iconFieldName = this.Config?.IconField;\n const colorFieldName = this.Config?.ColorField;\n\n this.log(`[HierarchyTree:buildTreeFromData] Input items: ${items.length}, parentField=\"${parentFieldName}\", nameField=\"${nameFieldName}\"`);\n\n // 1. Create flat nodes\n for (const item of items) {\n const { pk, id } = this.extractPrimaryKey(item);\n const parentVal = this.getItemValue(item, parentFieldName);\n const parentId = parentVal != null && String(parentVal).trim() !== '' ? String(parentVal) : null;\n\n const nameVal = this.getItemValue(item, nameFieldName) ?? this.getItemValue(item, 'Name') ?? 'Unnamed';\n const name = String(nameVal);\n const subtitleVal = this.getItemValue(item, subtitleFieldName);\n const subtitle = subtitleVal != null ? String(subtitleVal) : undefined;\n const iconVal = this.getItemValue(item, iconFieldName);\n const icon = iconVal != null ? String(iconVal) : this.Config.DefaultIcon;\n const colorVal = this.getItemValue(item, colorFieldName);\n const color = colorVal != null ? String(colorVal) : this.Config.DefaultColor;\n\n const node: HierarchyNodeData = {\n ID: id,\n PrimaryKey: pk,\n Name: name,\n Subtitle: subtitle || undefined,\n Icon: icon,\n Color: color,\n ParentID: parentId,\n DirectChildCount: 0,\n TotalDescendantCount: 0,\n Depth: 0,\n IsExpanded: true,\n IsSelected: false,\n IsHighlighted: false,\n IsFocusRoot: false,\n Record: item,\n Children: []\n };\n\n this.nodeMap.set(NormalizeUUID(id), node);\n this.AllNodes.push(node);\n }\n\n // 2. Build parent-child relationships and detect cycles\n const roots: HierarchyNodeData[] = [];\n for (const node of this.AllNodes) {\n if (node.ParentID && this.nodeMap.has(NormalizeUUID(node.ParentID))) {\n const parentNode = this.nodeMap.get(NormalizeUUID(node.ParentID))!;\n if (!this.wouldCreateCycle(node, parentNode)) {\n parentNode.Children.push(node);\n } else {\n console.warn(`[HierarchyTree] Circular reference detected between ${node.ID} and ${parentNode.ID}. Promoting to root.`);\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // 3. Compute counts and depths\n for (const root of roots) {\n this.computeSubtreeMetrics(root, 0);\n }\n\n // 4. Preserve _allChildren for collapse/expand\n for (const node of this.AllNodes) {\n node._allChildren = [...node.Children];\n }\n\n this.RootNodes = roots;\n this.log(`[HierarchyTree:buildTreeFromData] Built ${this.AllNodes.length} nodes, ${roots.length} root(s):`, roots.map(r => ({ Name: r.Name, ID: r.ID, Children: r.Children.length, TotalDescendants: r.TotalDescendantCount })));\n\n // 5. Apply active record selection & auto-expand ancestors\n const activeId = this.ActiveRecordID || this.Config?.ActiveRecordID;\n if (activeId) {\n const activeNode = this.nodeMap.get(NormalizeUUID(activeId));\n if (activeNode) {\n activeNode.IsSelected = true;\n activeNode.IsHighlighted = true;\n this.SelectedNode = activeNode;\n // Expand all ancestors so the active node is visible in full context\n let curr = activeNode.ParentID ? this.nodeMap.get(NormalizeUUID(activeNode.ParentID)) : undefined;\n while (curr) {\n curr.IsExpanded = true;\n curr.Children = [...(curr._allChildren || [])];\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n\n // If AutoRootFocus is enabled and multiple roots exist, focus on the active root tree\n if (this.Config.AutoRootFocus !== false && roots.length > 1 && !this.FocusRecordID && !this.Config.FocusRecordID) {\n let rootAncestor = activeNode;\n while (rootAncestor.ParentID && this.nodeMap.has(NormalizeUUID(rootAncestor.ParentID))) {\n rootAncestor = this.nodeMap.get(NormalizeUUID(rootAncestor.ParentID))!;\n }\n rootAncestor.IsFocusRoot = true;\n this.FocusedNode = rootAncestor;\n }\n }\n }\n\n // 6. Apply initial expand depth if configured (and not explicitly expanded by active node)\n if (this.Config.InitialExpandDepth && this.Config.InitialExpandDepth > 0 && !activeId) {\n for (const node of this.AllNodes) {\n if (node.Depth >= this.Config.InitialExpandDepth) {\n node.IsExpanded = false;\n node.Children = [];\n }\n }\n }\n\n if (this.FocusRecordID || this.Config?.FocusRecordID) {\n this.setFocusRoot(this.FocusRecordID || this.Config?.FocusRecordID);\n }\n }\n\n private resolveParentFieldName(): string {\n if (this.Config?.ParentField) return this.Config.ParentField;\n if (this.entityInfo) {\n // Check self-referencing foreign keys\n const selfFk = this.entityInfo.Fields.find(\n (f) => f.RelatedEntity && f.RelatedEntity.toLowerCase() === this.entityInfo!.Name.toLowerCase()\n );\n if (selfFk) return selfFk.Name;\n }\n return 'ParentID';\n }\n\n private resolveNameFieldName(): string {\n if (this.Config?.NameField) return this.Config.NameField;\n if (this.entityInfo?.NameField) return this.entityInfo.NameField.Name;\n return 'Name';\n }\n\n private extractPrimaryKey(item: Record<string, unknown>): { pk: CompositeKey; id: string } {\n const pk = new CompositeKey();\n if (this.entityInfo && this.entityInfo.PrimaryKeys.length > 0) {\n for (const k of this.entityInfo.PrimaryKeys) {\n pk.KeyValuePairs.push({\n FieldName: k.Name,\n Value: this.getItemValue(item, k.Name)\n });\n }\n } else {\n pk.KeyValuePairs.push({\n FieldName: 'ID',\n Value: this.getItemValue(item, 'ID') ?? this.getItemValue(item, 'id') ?? ''\n });\n }\n const id = pk.KeyValuePairs.length === 1 ? String(pk.KeyValuePairs[0].Value) : pk.ToURLSegment();\n return { pk, id };\n }\n\n private wouldCreateCycle(node: HierarchyNodeData, proposedParent: HierarchyNodeData): boolean {\n let curr: HierarchyNodeData | undefined = proposedParent;\n while (curr) {\n if (UUIDsEqual(curr.ID, node.ID)) return true;\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n return false;\n }\n\n private computeSubtreeMetrics(node: HierarchyNodeData, depth: number): number {\n node.Depth = depth;\n node.DirectChildCount = node.Children.length;\n let descendantCount = node.Children.length;\n\n for (const child of node.Children) {\n descendantCount += this.computeSubtreeMetrics(child, depth + 1);\n }\n\n node.TotalDescendantCount = descendantCount;\n return descendantCount;\n }\n\n // --- D3 Layout & Visual Rendering ---\n\n private initD3Zoom(): void {\n if (!this.svgRef?.nativeElement) return;\n\n this.svgSelection = d3.select(this.svgRef.nativeElement);\n this.gSelection = this.svgSelection.select<SVGGElement>('g.mj-hierarchy-canvas');\n\n this.zoomBehavior = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4.0])\n .on('zoom', (event: d3.D3ZoomEvent<SVGSVGElement, unknown>) => {\n this.currentZoomTransform = event.transform;\n if (this.gSelection) {\n this.gSelection.attr('transform', event.transform.toString());\n }\n if (event.sourceEvent != null) {\n this.ZoomLevel = event.transform.k;\n this.ZoomChange.emit(event.transform.k);\n }\n });\n\n this.svgSelection.call(this.zoomBehavior);\n }\n\n private setupResizeObserver(): void {\n if (!this.svgContainerRef?.nativeElement) return;\n\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 50 && entry.contentRect.height > 50) {\n if (this.AllNodes.length > 0) {\n this.renderTree();\n }\n }\n }\n });\n this.resizeObserver.observe(this.svgContainerRef.nativeElement);\n }\n\n /**\n * Computes the D3 hierarchy tree layout and updates the SVG rendering.\n */\n public renderTree(preserveTransform = false): void {\n if (!this.svgRef?.nativeElement || !this.gSelection) {\n if (this.svgRef?.nativeElement) {\n this.initD3Zoom();\n }\n if (!this.gSelection) {\n setTimeout(() => this.renderTree(preserveTransform), 30);\n return;\n }\n }\n\n // Reset positions across all nodes\n for (const n of this.AllNodes) {\n n.x = undefined;\n n.y = undefined;\n }\n\n const isVertical = this.Config.Orientation !== 'left-to-right';\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n const siblingGap = this.Config.SiblingSpacing || 40;\n const levelGap = this.Config.LevelSpacing || 75;\n\n const activeRoots = this.FocusedNode ? [this.FocusedNode] : this.RootNodes;\n this.log(`[HierarchyTree:renderTree] Starting render for ${activeRoots.length} active root(s):`, activeRoots.map(r => r.Name));\n\n if (activeRoots.length === 0) {\n this.gSelection.selectAll('*').remove();\n return;\n }\n\n // 1. Create root hierarchy\n let rootHierarchy: d3.HierarchyNode<HierarchyNodeData>;\n if (activeRoots.length === 1) {\n rootHierarchy = d3.hierarchy(activeRoots[0], (d) => (d.IsExpanded ? d.Children : []));\n } else {\n // Multiple roots: wrap under a synthetic virtual root\n const virtualRoot: HierarchyNodeData = {\n ID: '__virtual_root__',\n PrimaryKey: new CompositeKey(),\n Name: 'Root',\n DirectChildCount: activeRoots.length,\n TotalDescendantCount: activeRoots.length,\n Depth: -1,\n IsExpanded: true,\n IsSelected: false,\n IsHighlighted: false,\n IsFocusRoot: false,\n Children: activeRoots\n };\n rootHierarchy = d3.hierarchy(virtualRoot, (d) => (d.IsExpanded ? d.Children : []));\n }\n\n // 2. Compute tree layout\n const treeLayout = d3.tree<HierarchyNodeData>()\n .nodeSize(isVertical ? [nodeWidth + siblingGap, nodeHeight + levelGap] : [nodeHeight + siblingGap, nodeWidth + levelGap])\n .separation((a, b) => (a.parent === b.parent ? 1.05 : 1.2));\n\n const treeData = treeLayout(rootHierarchy);\n\n // Filter out virtual root if multi-root\n const nodes = treeData.descendants().filter((d) => d.data.ID !== '__virtual_root__');\n const links = treeData.links().filter((d) => d.source.data.ID !== '__virtual_root__');\n\n // Update positions on node data (centered on D3 node point)\n for (const n of nodes) {\n n.data.x = isVertical ? n.x - nodeWidth / 2 : n.y;\n n.data.y = isVertical ? n.y : n.x - nodeHeight / 2;\n }\n\n this.log(`[HierarchyTree:renderTree] Tree layout computed: ${nodes.length} nodes, ${links.length} links. Node positions:`, nodes.map(n => ({ Name: n.data.Name, x: n.data.x, y: n.data.y })));\n\n // 3. Render Links\n const linkPathGen = (d: d3.HierarchyLink<HierarchyNodeData>): string => {\n const sx = isVertical ? d.source.data.x! + nodeWidth / 2 : d.source.data.x! + nodeWidth;\n const sy = isVertical ? d.source.data.y! + nodeHeight : d.source.data.y! + nodeHeight / 2;\n const tx = isVertical ? d.target.data.x! + nodeWidth / 2 : d.target.data.x!;\n const ty = isVertical ? d.target.data.y! : d.target.data.y! + nodeHeight / 2;\n\n if (isVertical) {\n const midY = (sy + ty) / 2;\n return `M ${sx} ${sy} C ${sx} ${midY}, ${tx} ${midY}, ${tx} ${ty}`;\n } else {\n const midX = (sx + tx) / 2;\n return `M ${sx} ${sy} C ${midX} ${sy}, ${midX} ${ty}, ${tx} ${ty}`;\n }\n };\n\n const linkGroup = this.gSelection.select<SVGGElement>('g.mj-links-group');\n const linkSelection = linkGroup.selectAll<SVGPathElement, d3.HierarchyLink<HierarchyNodeData>>('path.mj-tree-link')\n .data(links, (d) => `${d.source.data.ID}->${d.target.data.ID}`);\n\n linkSelection.exit().remove();\n\n linkSelection.enter()\n .append('path')\n .attr('class', 'mj-tree-link')\n .merge(linkSelection)\n .attr('d', linkPathGen)\n .attr('stroke', (d) => (d.target.data.IsHighlighted ? 'var(--mj-brand-primary, #38bdf8)' : 'var(--mj-border-default, #223254)'))\n .attr('stroke-width', (d) => (d.target.data.IsHighlighted ? 2.5 : 1.5))\n .attr('fill', 'none');\n\n this.AllNodes = [...this.AllNodes];\n this.cdr?.markForCheck();\n this.cdr?.detectChanges();\n if (!preserveTransform) {\n this.fitToScreen(true);\n }\n }\n\n // --- Interactive Actions ---\n\n /**\n * Toggles the expand/collapse state of a node, firing cancelable Before and After events.\n */\n public toggleNodeExpansion(node: HierarchyNodeData, event?: MouseEvent): void {\n if (event) event.stopPropagation();\n\n if (node.IsExpanded) {\n const beforeEvt = new CancelableHierarchyNodeEvent(node, event);\n this.BeforeNodeCollapse.emit(beforeEvt);\n if (beforeEvt.IsCanceled) return;\n\n node.IsExpanded = false;\n node.Children = [];\n this.AfterNodeCollapse.emit({ Node: node, OriginalEvent: event });\n } else {\n const beforeEvt = new CancelableHierarchyNodeEvent(node, event);\n this.BeforeNodeExpand.emit(beforeEvt);\n if (beforeEvt.IsCanceled) return;\n\n node.IsExpanded = true;\n node.Children = [...(node._allChildren || [])];\n this.AfterNodeExpand.emit({ Node: node, OriginalEvent: event });\n }\n\n this.renderTree(true);\n }\n\n public closeDetailsDrawer(): void {\n this.ShowDetailsDrawer = false;\n this.cdr?.markForCheck();\n }\n\n public openDetailsDrawer(): void {\n this.ShowDetailsDrawer = true;\n this.cdr?.markForCheck();\n }\n\n public onCanvasBackgroundClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target?.closest('.mj-details-drawer') || target?.closest('.mj-node-card') || target?.closest('.mj-tool-btn')) {\n return;\n }\n }\n\n public onNodeClick(node: HierarchyNodeData, event: MouseEvent): void {\n event.stopPropagation();\n this.SelectedNode = node;\n this.ShowDetailsDrawer = true;\n for (const n of this.AllNodes) {\n n.IsSelected = UUIDsEqual(n.ID, node.ID);\n }\n this.NodeClick.emit({ Node: node, OriginalEvent: event });\n this.NodeSelect.emit({ Node: node, OriginalEvent: event });\n this.cdr?.markForCheck();\n }\n\n public onNodeDoubleClick(node: HierarchyNodeData, event: MouseEvent): void {\n event.stopPropagation();\n this.NodeDoubleClick.emit({ Node: node, OriginalEvent: event });\n this.navigateToRecord(node, event);\n }\n\n public onNodeAction(node: HierarchyNodeData, action: string, event: MouseEvent): void {\n event.stopPropagation();\n this.NodeAction.emit({ Node: node, Action: action });\n\n switch (action) {\n case 'open':\n this.navigateToRecord(node, event);\n break;\n case 'focus':\n this.setFocusRoot(node.ID);\n break;\n case 'reset-focus':\n this.resetFocus();\n break;\n case 'add-child':\n // Handled via custom subscriber or event\n break;\n }\n }\n\n public navigateToRecord(node: HierarchyNodeData, event?: MouseEvent): void {\n const entityName = this.entityInfo ? this.entityInfo.Name : this.Config.EntityName;\n const navEvent: RecordNavigationEvent = {\n Kind: 'record',\n EntityName: entityName,\n PrimaryKey: node.PrimaryKey,\n OpenInNewTab: event ? event.ctrlKey || event.metaKey : false\n };\n this.Navigate.emit(navEvent);\n }\n\n public getRecordAttributeEntries(record: Record<string, unknown>): { key: string; label: string; value: string }[] {\n const entries: { key: string; label: string; value: string }[] = [];\n const skipFields = new Set([\n 'id', 'parentid', 'parentproductcategoryid', 'parentcategoryid',\n 'companyid', '__mj_version', 'createdat', 'updatedat', 'name'\n ]);\n\n for (const [k, v] of Object.entries(record)) {\n if (skipFields.has(k.toLowerCase()) || k.startsWith('__mj_') || v == null) continue;\n const strVal = typeof v === 'object' ? JSON.stringify(v) : String(v);\n if (strVal.trim() === '') continue;\n entries.push({\n key: k,\n label: k.replace(/([A-Z])/g, ' $1').trim(),\n value: strVal\n });\n }\n return entries.slice(0, 8);\n }\n\n // --- Search & Highlight ---\n\n public onSearchInput(): void {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) {\n for (const n of this.AllNodes) {\n n.IsHighlighted = false;\n }\n this.MatchingNodeCount = 0;\n this.renderTree(true);\n return;\n }\n\n let count = 0;\n let firstMatch: HierarchyNodeData | null = null;\n for (const n of this.AllNodes) {\n const matches = n.Name.toLowerCase().includes(q) || (n.Subtitle && n.Subtitle.toLowerCase().includes(q));\n n.IsHighlighted = !!matches;\n if (matches) {\n count++;\n if (!firstMatch) firstMatch = n;\n this.expandAncestors(n);\n }\n }\n\n this.MatchingNodeCount = count;\n this.renderTree(true);\n\n if (firstMatch && firstMatch.x != null && firstMatch.y != null) {\n this.centerOnNode(firstMatch);\n }\n }\n\n public clearSearch(): void {\n this.SearchQuery = '';\n this.onSearchInput();\n }\n\n public centerOnNode(node: HierarchyNodeData): void {\n if (!this.svgSelection || !this.zoomBehavior || !this.svgContainerRef?.nativeElement) return;\n if (node.x == null || node.y == null) return;\n\n const rect = this.svgContainerRef.nativeElement.getBoundingClientRect();\n const width = rect.width > 50 ? rect.width : (this.svgContainerRef.nativeElement.clientWidth || 800);\n const height = rect.height > 50 ? rect.height : (this.svgContainerRef.nativeElement.clientHeight || 500);\n const rightMargin = (this.ShowDetailsDrawer && this.SelectedNode) ? 340 : 0;\n const visibleWidth = Math.max(width - rightMargin, 200);\n\n const currentScale = this.currentZoomTransform?.k || this.ZoomLevel || 1;\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n\n const nodeCenterX = node.x + nodeWidth / 2;\n const nodeCenterY = node.y + nodeHeight / 2;\n\n const tx = visibleWidth / 2 - nodeCenterX * currentScale;\n const ty = height / 2 - nodeCenterY * currentScale;\n\n const target = d3.zoomIdentity.translate(tx, ty).scale(currentScale);\n this.svgSelection.interrupt().transition().duration(400).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, target);\n }\n\n private expandAncestors(node: HierarchyNodeData): void {\n let curr = node.ParentID ? this.nodeMap.get(NormalizeUUID(node.ParentID)) : undefined;\n while (curr) {\n curr.IsExpanded = true;\n curr.Children = [...(curr._allChildren || [])];\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n }\n\n // --- Subtree Focus ---\n\n public setFocusRoot(recordId?: string): void {\n if (!recordId) {\n this.resetFocus();\n return;\n }\n\n const target = this.nodeMap.get(NormalizeUUID(recordId));\n if (!target) return;\n\n for (const n of this.AllNodes) n.IsFocusRoot = false;\n target.IsFocusRoot = true;\n this.FocusedNode = target;\n this.renderTree();\n this.onFitToViewClick();\n }\n\n public resetFocus(): void {\n for (const n of this.AllNodes) n.IsFocusRoot = false;\n this.FocusedNode = null;\n this.renderTree();\n this.onFitToViewClick();\n }\n\n // --- Toolbar Actions / Verbs ---\n\n public expandAll(): void {\n for (const n of this.AllNodes) {\n n.IsExpanded = true;\n n.Children = [...(n._allChildren || [])];\n }\n this.renderTree(true);\n }\n\n public collapseAll(): void {\n for (const n of this.AllNodes) {\n if (n.Depth > 0) {\n n.IsExpanded = false;\n n.Children = [];\n }\n }\n this.renderTree(true);\n }\n\n public zoomIn(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n const currentScale = this.currentZoomTransform?.k || 1;\n const targetScale = Math.min(currentScale * 1.25, 4.0);\n this.setZoomLevel(targetScale, true);\n this.ZoomLevel = targetScale;\n this.ZoomChange.emit(targetScale);\n }\n\n public zoomOut(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n const currentScale = this.currentZoomTransform?.k || 1;\n const targetScale = Math.max(currentScale * 0.8, 0.1);\n this.setZoomLevel(targetScale, true);\n this.ZoomLevel = targetScale;\n this.ZoomChange.emit(targetScale);\n }\n\n public setZoomLevel(scale: number, animated = true): void {\n if (!this.svgSelection || !this.zoomBehavior || !scale) return;\n const container = this.svgContainerRef?.nativeElement;\n const rect = container?.getBoundingClientRect();\n const width = rect?.width && rect.width > 50 ? rect.width : (container?.clientWidth || 800);\n const height = rect?.height && rect.height > 50 ? rect.height : (container?.clientHeight || 500);\n const current = this.currentZoomTransform || d3.zoomIdentity;\n const cx = width / 2;\n const cy = height / 2;\n const newX = cx - (cx - current.x) * (scale / (current.k || 1));\n const newY = cy - (cy - current.y) * (scale / (current.k || 1));\n const target = d3.zoomIdentity.translate(newX, newY).scale(scale);\n\n if (animated) {\n this.svgSelection.interrupt().transition().duration(250).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, target);\n } else {\n this.svgSelection.interrupt().call(this.zoomBehavior.transform, target);\n }\n }\n\n public resetZoom(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n this.onFitToViewClick();\n }\n\n public onFitToViewClick(): void {\n this.fitToScreen(false, true);\n setTimeout(() => {\n this.fitToScreen(false, true);\n }, 320);\n }\n\n public fitToScreen(immediate = false, forceAutoScale = false): void {\n if (!this.svgSelection || !this.zoomBehavior || !this.svgContainerRef?.nativeElement) return;\n\n const visibleNodes = this.AllNodes.filter((n) => n.x != null && n.y != null);\n if (visibleNodes.length === 0) return;\n\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (const n of visibleNodes) {\n minX = Math.min(minX, n.x!);\n maxX = Math.max(maxX, n.x! + nodeWidth);\n minY = Math.min(minY, n.y!);\n maxY = Math.max(maxY, n.y! + nodeHeight);\n }\n\n const treeWidth = Math.max(maxX - minX, 1);\n const treeHeight = Math.max(maxY - minY, 1);\n const treeCenterX = (minX + maxX) / 2;\n const treeCenterY = (minY + maxY) / 2;\n\n const rect = this.svgContainerRef.nativeElement.getBoundingClientRect();\n const width = rect.width > 50 ? rect.width : (this.svgContainerRef.nativeElement.clientWidth || 800);\n const height = rect.height > 50 ? rect.height : (this.svgContainerRef.nativeElement.clientHeight || 500);\n const rightMargin = (this.ShowDetailsDrawer && this.SelectedNode) ? 340 : 0;\n const visibleWidth = Math.max(width - rightMargin, 200);\n const padding = 40;\n\n const availWidth = Math.max(visibleWidth - padding * 2, 100);\n const availHeight = Math.max(height - padding * 2, 100);\n const autoScale = Math.max(\n Math.min(\n availWidth / treeWidth,\n availHeight / treeHeight,\n 1.05\n ),\n 0.15\n );\n\n const scale = (forceAutoScale || !this.ZoomLevel) ? autoScale : this.ZoomLevel;\n\n if (forceAutoScale) {\n this.ZoomLevel = autoScale;\n this.ZoomChange.emit(autoScale);\n }\n\n const tx = visibleWidth / 2 - treeCenterX * scale;\n const ty = height / 2 - treeCenterY * scale;\n\n const targetTransform = d3.zoomIdentity.translate(tx, ty).scale(scale);\n\n this.log(`[HierarchyTree:fitToScreen] Container=${width}x${height} (visible=${visibleWidth}), visibleNodes=${visibleNodes.length}, bounds=[${minX.toFixed(1)}, ${minY.toFixed(1)}] to [${maxX.toFixed(1)}, ${maxY.toFixed(1)}] (${treeWidth.toFixed(1)}x${treeHeight.toFixed(1)}), autoScale=${autoScale.toFixed(3)}, usingScale=${scale.toFixed(3)}, translate=(${tx.toFixed(1)}, ${ty.toFixed(1)})`);\n\n if (immediate) {\n this.svgSelection.interrupt().call(this.zoomBehavior.transform, targetTransform);\n } else {\n this.svgSelection.interrupt().transition().duration(300).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, targetTransform);\n }\n }\n\n public exportAsSVG(): string {\n return this.svgRef?.nativeElement ? this.svgRef.nativeElement.outerHTML : '';\n }\n\n public async refresh(): Promise<void> {\n await this.loadData();\n }\n}\n","<div class=\"mj-hierarchy-wrapper\" [style.height]=\"Config.Height || '100%'\" [style.min-height]=\"Config.MinHeight || '500px'\">\n <!-- Top Controls Bar -->\n @if (Config.ShowToolbar || Config.ShowSearch) {\n <div class=\"mj-hierarchy-toolbar\">\n <!-- Search Box -->\n @if (Config.ShowSearch) {\n <div class=\"mj-search-box\">\n <i class=\"fa-solid fa-magnifying-glass mj-search-icon\"></i>\n <input\n type=\"text\"\n class=\"mj-search-input\"\n placeholder=\"Search hierarchy...\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"onSearchInput()\"\n />\n @if (SearchQuery) {\n <button type=\"button\" class=\"mj-clear-btn\" (click)=\"clearSearch()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n @if (SearchQuery && MatchingNodeCount > 0) {\n <span class=\"mj-match-badge\">{{ MatchingNodeCount }} found</span>\n }\n </div>\n }\n\n <!-- Focus Subtree Indicator -->\n @if (FocusedNode) {\n <div class=\"mj-focus-indicator\">\n <i class=\"fa-solid fa-crosshairs\"></i>\n <span>Focusing subtree: <strong>{{ FocusedNode.Name }}</strong></span>\n <button type=\"button\" class=\"mj-reset-focus-btn\" (click)=\"resetFocus()\" title=\"Show entire hierarchy\">\n <i class=\"fa-solid fa-rotate-left\"></i> View Full Hierarchy\n </button>\n </div>\n }\n\n <!-- Toolbar Action Buttons -->\n @if (Config.ShowToolbar) {\n <div class=\"mj-toolbar-actions\">\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"expandAll()\" title=\"Expand all subtrees\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"collapseAll()\" title=\"Collapse all subtrees\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <div class=\"mj-tool-divider\"></div>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"onFitToViewClick()\" title=\"Fit hierarchy to view\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <div class=\"mj-tool-divider\"></div>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"refresh()\" title=\"Reload hierarchy data\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- SVG Canvas Container -->\n <div #svgContainer class=\"mj-canvas-container\" (click)=\"onCanvasBackgroundClick($event)\">\n @if (Loading) {\n <div class=\"mj-state-overlay\">\n <div class=\"mj-spinner\"></div>\n <span>Loading hierarchy...</span>\n </div>\n } @else if (ErrorMessage) {\n <div class=\"mj-state-overlay mj-error-state\">\n <i class=\"fa-solid fa-circle-exclamation mj-error-icon\"></i>\n <span>{{ ErrorMessage }}</span>\n <button type=\"button\" class=\"mj-retry-btn\" (click)=\"loadData()\">Retry</button>\n </div>\n } @else if (AllNodes.length === 0) {\n <div class=\"mj-state-overlay mj-empty-state\">\n <i class=\"fa-solid fa-sitemap mj-empty-icon\"></i>\n <span>No hierarchy records found.</span>\n </div>\n }\n\n <svg #svgElement class=\"mj-hierarchy-svg\">\n <defs>\n <pattern id=\"mj-tree-grid\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"var(--mj-border-subtle, #1e293b)\" opacity=\"0.4\" />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#mj-tree-grid)\" />\n\n <!-- Main Canvas Group (Zoomable & Pannable) -->\n <g class=\"mj-hierarchy-canvas\">\n <!-- Connective Link Curves -->\n <g class=\"mj-links-group\"></g>\n\n <!-- Interactive Node Cards via ForeignObject -->\n <g class=\"mj-nodes-group\">\n @for (node of AllNodes; track node.ID) {\n @if (node.x != null && node.y != null) {\n <foreignObject\n [attr.x]=\"node.x\"\n [attr.y]=\"node.y\"\n [attr.width]=\"Config.NodeWidth || 230\"\n [attr.height]=\"Config.NodeHeight || 90\"\n class=\"mj-node-foreign-object\"\n >\n <div\n class=\"mj-node-card\"\n [class.selected]=\"node.IsSelected\"\n [class.highlighted]=\"node.IsHighlighted\"\n [class.focus-root]=\"node.IsFocusRoot\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n >\n <!-- Accent Top Border -->\n <div class=\"mj-card-accent\" [style.background]=\"node.Color || Config.DefaultColor\"></div>\n\n <!-- Node Card Header -->\n <div class=\"mj-node-header\">\n <div class=\"mj-node-icon\" [style.color]=\"node.Color || Config.DefaultColor\">\n <i [class]=\"node.Icon || Config.DefaultIcon\"></i>\n </div>\n <div class=\"mj-node-title-group\">\n <div class=\"mj-node-name\" [title]=\"node.Name\">{{ node.Name }}</div>\n @if (node.Subtitle) {\n <div class=\"mj-node-subtitle\">{{ node.Subtitle }}</div>\n }\n </div>\n </div>\n\n <!-- Node Card Footer & Actions -->\n <div class=\"mj-node-footer\">\n <!-- Subtree Expansion Pill -->\n @if (node.DirectChildCount > 0) {\n <button\n type=\"button\"\n class=\"mj-expand-badge\"\n [class.collapsed]=\"!node.IsExpanded\"\n (click)=\"toggleNodeExpansion(node, $event)\"\n [title]=\"node.IsExpanded ? 'Collapse sub-branch' : 'Expand ' + node.DirectChildCount + ' children'\"\n >\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"node.IsExpanded\" [class.fa-chevron-right]=\"!node.IsExpanded\"></i>\n <span>{{ node.DirectChildCount }}</span>\n </button>\n } @else {\n <span class=\"mj-leaf-indicator\">Leaf</span>\n }\n\n <!-- Quick Action Buttons -->\n @if (AllowNodeActions) {\n <div class=\"mj-node-actions\">\n <button\n type=\"button\"\n class=\"mj-node-action-btn\"\n (click)=\"onNodeAction(node, 'focus', $event)\"\n title=\"Focus on this subtree\"\n >\n <i class=\"fa-solid fa-crosshairs\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mj-node-action-btn\"\n (click)=\"onNodeAction(node, 'open', $event)\"\n title=\"Open record in Explorer\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n </foreignObject>\n }\n }\n </g>\n </g>\n </svg>\n\n <!-- Slide-In Node Details Drawer -->\n <aside\n class=\"mj-details-drawer\"\n [class.open]=\"SelectedNode != null && ShowDetailsDrawer\"\n aria-label=\"Node details panel\"\n >\n @if (SelectedNode) {\n <div class=\"mj-drawer-header\">\n <div class=\"mj-drawer-title-group\">\n <div class=\"mj-drawer-icon\" [style.color]=\"SelectedNode.Color || Config.DefaultColor\">\n <i [class]=\"SelectedNode.Icon || Config.DefaultIcon\"></i>\n </div>\n <div class=\"mj-drawer-titles\">\n <h4 class=\"mj-drawer-name\" [title]=\"SelectedNode.Name\">{{ SelectedNode.Name }}</h4>\n @if (SelectedNode.Subtitle) {\n <p class=\"mj-drawer-subtitle\">{{ SelectedNode.Subtitle }}</p>\n }\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mj-drawer-close-btn\"\n (click)=\"closeDetailsDrawer()\"\n title=\"Close details\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-drawer-body\">\n <div class=\"mj-drawer-stats\">\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.Depth }}</span>\n <span class=\"mj-stat-label\">Hierarchy Level</span>\n </div>\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.DirectChildCount }}</span>\n <span class=\"mj-stat-label\">Direct Children</span>\n </div>\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.TotalDescendantCount }}</span>\n <span class=\"mj-stat-label\">Total Subtree</span>\n </div>\n </div>\n\n @if (SelectedNode.Record && getRecordAttributeEntries(SelectedNode.Record).length > 0) {\n <div class=\"mj-drawer-section\">\n <h5 class=\"mj-section-heading\">Attributes</h5>\n <dl class=\"mj-attr-list\">\n @for (attr of getRecordAttributeEntries(SelectedNode.Record); track attr.key) {\n <div class=\"mj-attr-row\">\n <dt class=\"mj-attr-dt\">{{ attr.label }}</dt>\n <dd class=\"mj-attr-dd\" [title]=\"attr.value\">{{ attr.value }}</dd>\n </div>\n }\n </dl>\n </div>\n }\n\n <div class=\"mj-drawer-actions\">\n <button\n type=\"button\"\n class=\"mj-drawer-btn-primary\"\n (click)=\"navigateToRecord(SelectedNode)\"\n title=\"Open this record in Explorer\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open Record</span>\n </button>\n\n <div class=\"mj-drawer-btn-row\">\n @if (SelectedNode.DirectChildCount > 0) {\n <button\n type=\"button\"\n class=\"mj-drawer-btn-secondary\"\n (click)=\"toggleNodeExpansion(SelectedNode)\"\n >\n <i class=\"fa-solid\" [class.fa-folder-open]=\"SelectedNode.IsExpanded\" [class.fa-folder]=\"!SelectedNode.IsExpanded\"></i>\n <span>{{ SelectedNode.IsExpanded ? 'Collapse' : 'Expand' }}</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-drawer-btn-secondary\"\n (click)=\"setFocusRoot(SelectedNode.ID)\"\n title=\"Focus hierarchy on this subtree\"\n >\n <i class=\"fa-solid fa-crosshairs\"></i>\n <span>Focus Tree</span>\n </button>\n </div>\n </div>\n </div>\n }\n </aside>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"hierarchy-tree.component.js","sourceRoot":"","sources":["../../../src/lib/components/hierarchy-tree.component.ts","../../../src/lib/components/hierarchy-tree.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n AfterViewInit\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RunView, CompositeKey, EntityInfo, KeyValuePair } from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { FormNavigationEvent, RecordNavigationEvent } from '@memberjunction/ng-base-forms';\nimport * as d3 from 'd3';\nimport {\n HierarchyTreeConfig,\n HierarchyNodeData,\n HierarchyTreeOrientation,\n HierarchyNodeStyle\n} from '../models/hierarchy-tree.types';\nimport {\n HierarchyNodeEvent,\n CancelableHierarchyNodeEvent,\n ReparentEvent,\n CancelableReparentEvent,\n NodeActionEvent\n} from '../events/hierarchy-tree.events';\n\n/**\n * Modern, interactive, canvas-based visual hierarchy and organizational chart component.\n *\n * Automatically generates a dynamic, zoomable tree visualization for any MemberJunction entity\n * with a self-referencing parent foreign key (such as Corporate Subsidiaries, Product Categories,\n * Committee Governance structures, Tag Taxonomies, and Management Lines).\n *\n * Features:\n * - **Metadata Driven**: Auto-derives primary keys (including composite keys) and parent fields from MJ metadata.\n * - **Interactive Canvas**: D3-powered smooth pan, zoom, auto-fit, and mini-toolbar controls.\n * - **Collapsible Subtrees**: Interactive `[+]` / `[-]` badges with direct and total descendant counts.\n * - **Live Search & Path Expansion**: Instant keyword search that highlights matches and auto-expands ancestor branches.\n * - **Subtree Focus**: Isolate any node as the root of the view with 1-click return to full hierarchy.\n * - **Full Design Token Theming**: Uses `--mj-*` surface, border, typography, and accent tokens.\n * - **Extensive Cancelable Events**: Before/After events for expansion, collapse, reparenting, and navigation.\n *\n * @example\n * ```html\n * <mj-hierarchy-tree\n * [Config]=\"{\n * EntityName: 'MJ_BizApps_Common: Organizations',\n * ParentField: 'ParentID',\n * SubtitleField: 'OrganizationType',\n * DefaultIcon: 'fa-solid fa-building'\n * }\"\n * (Navigate)=\"onNavigate($event)\">\n * </mj-hierarchy-tree>\n * ```\n */\n@Component({\n selector: 'mj-hierarchy-tree',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './hierarchy-tree.component.html',\n styleUrls: ['./hierarchy-tree.component.css']\n})\nexport class HierarchyTreeComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n constructor(private cdr?: ChangeDetectorRef) {\n super();\n }\n\n @ViewChild('svgContainer', { static: false }) svgContainerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('svgElement', { static: false }) svgRef!: ElementRef<SVGSVGElement>;\n\n /**\n * Declarative configuration defining the target entity and visual layout properties.\n */\n @Input() Config!: HierarchyTreeConfig;\n\n /**\n * Optional pre-loaded data array. If provided, the component skips the automated\n * `RunView` query and constructs the tree directly from these items.\n */\n @Input() Data?: Record<string, unknown>[];\n\n /**\n * Optional active / selected record ID. When provided, the node is highlighted and all ancestors\n * are expanded so it is visible in full tree context.\n */\n @Input() ActiveRecordID?: string;\n\n /**\n * Primary key ID to focus as the subtree root.\n */\n @Input() FocusRecordID?: string;\n\n /**\n * Controls whether action buttons (Open Record, Focus, Add Child) appear on node cards.\n */\n @Input() AllowNodeActions = true;\n\n /**\n * Emitted when a node is clicked.\n */\n @Output() NodeClick = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted when a node is double-clicked.\n */\n @Output() NodeDoubleClick = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted when a node is selected / set as active.\n */\n @Output() NodeSelect = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node expands its children. Cancelable.\n */\n @Output() BeforeNodeExpand = new EventEmitter<CancelableHierarchyNodeEvent>();\n\n /**\n * Emitted after a node has expanded its children.\n */\n @Output() AfterNodeExpand = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node collapses its children. Cancelable.\n */\n @Output() BeforeNodeCollapse = new EventEmitter<CancelableHierarchyNodeEvent>();\n\n /**\n * Emitted after a node has collapsed its children.\n */\n @Output() AfterNodeCollapse = new EventEmitter<HierarchyNodeEvent>();\n\n /**\n * Emitted before a node is reparented. Cancelable.\n */\n @Output() BeforeReparent = new EventEmitter<CancelableReparentEvent>();\n\n /**\n * Emitted after a node has been reparented.\n */\n @Output() AfterReparent = new EventEmitter<ReparentEvent>();\n\n /**\n * Emitted when an action button (e.g. Open, Add Child, Focus) is invoked on a node.\n */\n @Output() NodeAction = new EventEmitter<NodeActionEvent>();\n\n /**\n * Optional persisted zoom scale factor to restore.\n */\n @Input() ZoomLevel?: number;\n\n /**\n * Emitted when the user zooms in or out on the hierarchy canvas.\n */\n @Output() ZoomChange = new EventEmitter<number>();\n\n /**\n * Emitted when the user requests navigation to a full entity record.\n */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // --- State ---\n public Loading = false;\n public ErrorMessage: string | null = null;\n public SearchQuery = '';\n public MatchingNodeCount = 0;\n public FocusedNode: HierarchyNodeData | null = null;\n public SelectedNode: HierarchyNodeData | null = null;\n public ShowDetailsDrawer = false;\n\n /** Flattened list of all loaded hierarchy nodes for search and lookup. */\n public AllNodes: HierarchyNodeData[] = [];\n private nodeMap = new Map<string, HierarchyNodeData>();\n\n /** The root nodes of the active view. */\n public RootNodes: HierarchyNodeData[] = [];\n\n /** D3 zoom behavior and SVG group selection */\n private zoomBehavior: d3.ZoomBehavior<SVGSVGElement, unknown> | null = null;\n private svgSelection: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private gSelection: d3.Selection<SVGGElement, unknown, null, undefined> | null = null;\n private currentZoomTransform: d3.ZoomTransform = d3.zoomIdentity;\n\n private resizeObserver: ResizeObserver | null = null;\n private entityInfo: EntityInfo | null = null;\n private previousConfigState: Partial<HierarchyTreeConfig> = {};\n\n public ngOnInit(): void {\n this.initializeConfig();\n this.log('[HierarchyTree:ngOnInit] Initializing with Config:', this.Config);\n if (this.Config) {\n this.previousConfigState = {\n EntityName: this.Config.EntityName,\n ExtraFilter: this.Config.ExtraFilter,\n OrderBy: this.Config.OrderBy,\n MaxRows: this.Config.MaxRows,\n ParentField: this.Config.ParentField\n };\n }\n this.loadData();\n }\n\n public ngAfterViewInit(): void {\n this.log('[HierarchyTree:ngAfterViewInit] Initializing D3 Zoom & ResizeObserver. svgRef:', !!this.svgRef?.nativeElement, 'containerRect:', this.svgContainerRef?.nativeElement?.getBoundingClientRect());\n this.initD3Zoom();\n this.setupResizeObserver();\n if (this.AllNodes.length > 0) {\n this.log('[HierarchyTree:ngAfterViewInit] AllNodes already loaded (' + this.AllNodes.length + '), triggering renderTree');\n this.renderTree();\n }\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.log('[HierarchyTree:ngOnChanges] Changes detected:', Object.keys(changes));\n if (changes['Config'] && !changes['Config'].isFirstChange()) {\n this.initializeConfig();\n if (this.hasDataConfigChanged(this.Config)) {\n this.log('[HierarchyTree:ngOnChanges] Data config changed, triggering loadData');\n this.loadData();\n } else {\n const activeId = this.ActiveRecordID || this.Config?.ActiveRecordID;\n this.log('[HierarchyTree:ngOnChanges] Config changed but data identical, updating active node:', activeId);\n this.updateActiveNodeSelection(activeId);\n }\n } else if (changes['ActiveRecordID'] && !changes['ActiveRecordID'].isFirstChange()) {\n this.updateActiveNodeSelection(this.ActiveRecordID);\n } else if (changes['Data'] && !changes['Data'].isFirstChange()) {\n this.buildTreeFromData(this.Data || []);\n } else if (changes['FocusRecordID'] && !changes['FocusRecordID'].isFirstChange()) {\n this.setFocusRoot(this.FocusRecordID);\n } else if (changes['ZoomLevel'] && !changes['ZoomLevel'].isFirstChange() && this.ZoomLevel !== undefined) {\n this.setZoomLevel(this.ZoomLevel, true);\n }\n }\n\n private hasDataConfigChanged(newConfig?: HierarchyTreeConfig): boolean {\n if (!newConfig) return false;\n const prev = this.previousConfigState;\n const hasChanged =\n prev.EntityName !== newConfig.EntityName ||\n prev.ExtraFilter !== newConfig.ExtraFilter ||\n prev.OrderBy !== newConfig.OrderBy ||\n prev.MaxRows !== newConfig.MaxRows ||\n prev.ParentField !== newConfig.ParentField;\n\n if (hasChanged) {\n this.previousConfigState = {\n EntityName: newConfig.EntityName,\n ExtraFilter: newConfig.ExtraFilter,\n OrderBy: newConfig.OrderBy,\n MaxRows: newConfig.MaxRows,\n ParentField: newConfig.ParentField\n };\n }\n return hasChanged;\n }\n\n private updateActiveNodeSelection(activeId?: string): void {\n if (!activeId) return;\n const activeNode = this.nodeMap.get(NormalizeUUID(activeId));\n if (activeNode && (!this.SelectedNode || !UUIDsEqual(this.SelectedNode.ID, activeNode.ID))) {\n for (const n of this.AllNodes) {\n n.IsSelected = UUIDsEqual(n.ID, activeNode.ID);\n }\n this.SelectedNode = activeNode;\n this.expandAncestors(activeNode);\n this.renderTree();\n }\n }\n\n public ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n // --- Configuration Initialization ---\n private initializeConfig(): void {\n if (!this.Config) return;\n this.Config = {\n DefaultIcon: 'fa-solid fa-sitemap',\n // Design token, not a literal — the accent is bound to [style.background]/[style.color],\n // so a var() resolves at paint time and follows the active theme. The fallback keeps the\n // original rendering wherever the token stylesheet isn't loaded.\n DefaultColor: 'var(--mj-brand-primary, #38bdf8)',\n Orientation: 'top-to-bottom',\n NodeStyle: 'card',\n AllowDragDropReparent: false,\n AllowNodeActions: true,\n ShowSearch: true,\n ShowToolbar: true,\n NodeWidth: 230,\n NodeHeight: 90,\n SiblingSpacing: 40,\n LevelSpacing: 75,\n Height: '100%',\n MinHeight: '500px',\n NavigateOnNodeClick: true,\n AutoRootFocus: true,\n Verbose: false,\n ...this.Config\n };\n }\n\n private log(message: string, ...args: unknown[]): void {\n if (this.Config?.Verbose) {\n console.log(message, ...args);\n }\n }\n\n // --- Data Loading & Tree Construction ---\n\n /**\n * Loads records from the server via `RunView` using entity metadata.\n */\n public async loadData(): Promise<void> {\n if (!this.Config?.EntityName) return;\n\n this.Loading = true;\n this.ErrorMessage = null;\n this.cdr?.detectChanges();\n\n try {\n // ProviderToUse, not `new Metadata()` — this is an L1 widget, so it must read metadata\n // from whatever provider the host bound via @Input() Provider (BaseAngularComponent\n // falls back to the ambient one). Binding the global provider here would silently query\n // the wrong database wherever the component is hosted against a non-default connection.\n const configEntityLower = this.Config.EntityName.toLowerCase();\n const configEntityStripped = this.Config.EntityName.replace(/^mj[:_\\s]+/i, '').trim().toLowerCase();\n this.entityInfo = this.ProviderToUse.Entities.find((e) => {\n const eNameLower = e.Name.toLowerCase();\n const eNameStripped = e.Name.replace(/^mj[:_\\s]+/i, '').trim().toLowerCase();\n return eNameLower === configEntityLower || eNameStripped === configEntityStripped;\n }) || null;\n\n const targetEntityName = this.entityInfo ? this.entityInfo.Name : this.Config.EntityName;\n this.log('[HierarchyTree:loadData] Starting load for:', targetEntityName, {\n configuredEntity: this.Config.EntityName,\n resolvedEntity: this.entityInfo?.Name,\n activeRecordId: this.ActiveRecordID || this.Config?.ActiveRecordID,\n focusRecordId: this.FocusRecordID || this.Config?.FocusRecordID,\n extraFilter: this.Config.ExtraFilter\n });\n\n if (this.Data) {\n this.log('[HierarchyTree:loadData] Using provided Data prop:', this.Data.length, 'items');\n this.buildTreeFromData(this.Data);\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const defaultOrderBy = `${this.resolveNameFieldName()} ASC`;\n const rvParams = {\n EntityName: targetEntityName,\n ExtraFilter: this.Config.ExtraFilter || '',\n OrderBy: this.Config.OrderBy || defaultOrderBy,\n ResultType: 'simple' as const,\n MaxRows: this.Config.MaxRows ?? 0\n };\n this.log('[HierarchyTree:loadData] Calling RunView with params:', rvParams);\n const result = await rv.RunView(rvParams);\n\n this.log('[HierarchyTree:loadData] RunView response:', {\n success: result.Success,\n rowCount: result.RowCount,\n resultsLength: result.Results?.length,\n errorMessage: result.ErrorMessage,\n sampleRow: result.Results?.[0]\n });\n\n if (!result.Success) {\n this.ErrorMessage = result.ErrorMessage || 'Failed to load hierarchy data.';\n return;\n }\n\n const rawItems = (result.Results as Record<string, unknown>[]) || [];\n this.buildTreeFromData(rawItems);\n } catch (err) {\n this.ErrorMessage = err instanceof Error ? err.message : 'Error loading hierarchy tree.';\n console.error('[HierarchyTree:loadData] Error:', err);\n } finally {\n this.Loading = false;\n this.cdr?.detectChanges();\n setTimeout(() => {\n this.renderTree();\n this.fitToScreen(false);\n }, 80);\n }\n }\n\n /**\n * Helper to retrieve a property value from a record item in a case-insensitive manner.\n */\n private getItemValue(item: Record<string, unknown>, fieldName?: string): unknown {\n if (!item || !fieldName) return undefined;\n if (item[fieldName] !== undefined) return item[fieldName];\n const lower = fieldName.toLowerCase();\n for (const [k, v] of Object.entries(item)) {\n if (k.toLowerCase() === lower) return v;\n }\n return undefined;\n }\n\n /**\n * Constructs the in-memory tree nodes, computes composite keys, descendant counts, and depths.\n */\n public buildTreeFromData(items: Record<string, unknown>[]): void {\n this.nodeMap.clear();\n this.AllNodes = [];\n\n const parentFieldName = this.resolveParentFieldName();\n const nameFieldName = this.resolveNameFieldName();\n const subtitleFieldName = this.Config?.SubtitleField;\n const iconFieldName = this.Config?.IconField;\n const colorFieldName = this.Config?.ColorField;\n\n this.log(`[HierarchyTree:buildTreeFromData] Input items: ${items.length}, parentField=\"${parentFieldName}\", nameField=\"${nameFieldName}\"`);\n\n // 1. Create flat nodes\n for (const item of items) {\n const { pk, id } = this.extractPrimaryKey(item);\n const parentVal = this.getItemValue(item, parentFieldName);\n const parentId = parentVal != null && String(parentVal).trim() !== '' ? String(parentVal) : null;\n\n const nameVal = this.getItemValue(item, nameFieldName) ?? this.getItemValue(item, 'Name') ?? 'Unnamed';\n const name = String(nameVal);\n const subtitleVal = this.getItemValue(item, subtitleFieldName);\n const subtitle = subtitleVal != null ? String(subtitleVal) : undefined;\n const iconVal = this.getItemValue(item, iconFieldName);\n const icon = iconVal != null ? String(iconVal) : this.Config.DefaultIcon;\n const colorVal = this.getItemValue(item, colorFieldName);\n const color = colorVal != null ? String(colorVal) : this.Config.DefaultColor;\n\n const node: HierarchyNodeData = {\n ID: id,\n PrimaryKey: pk,\n Name: name,\n Subtitle: subtitle || undefined,\n Icon: icon,\n Color: color,\n ParentID: parentId,\n DirectChildCount: 0,\n TotalDescendantCount: 0,\n Depth: 0,\n IsExpanded: true,\n IsSelected: false,\n IsHighlighted: false,\n IsFocusRoot: false,\n Record: item,\n Children: []\n };\n\n this.nodeMap.set(NormalizeUUID(id), node);\n this.AllNodes.push(node);\n }\n\n // 2. Build parent-child relationships and detect cycles\n const roots: HierarchyNodeData[] = [];\n for (const node of this.AllNodes) {\n if (node.ParentID && this.nodeMap.has(NormalizeUUID(node.ParentID))) {\n const parentNode = this.nodeMap.get(NormalizeUUID(node.ParentID))!;\n if (!this.wouldCreateCycle(node, parentNode)) {\n parentNode.Children.push(node);\n } else {\n console.warn(`[HierarchyTree] Circular reference detected between ${node.ID} and ${parentNode.ID}. Promoting to root.`);\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // 3. Compute counts and depths\n for (const root of roots) {\n this.computeSubtreeMetrics(root, 0);\n }\n\n // 4. Preserve _allChildren for collapse/expand\n for (const node of this.AllNodes) {\n node._allChildren = [...node.Children];\n }\n\n this.RootNodes = roots;\n this.log(`[HierarchyTree:buildTreeFromData] Built ${this.AllNodes.length} nodes, ${roots.length} root(s):`, roots.map(r => ({ Name: r.Name, ID: r.ID, Children: r.Children.length, TotalDescendants: r.TotalDescendantCount })));\n\n // 5. Apply active record selection & auto-expand ancestors\n const activeId = this.ActiveRecordID || this.Config?.ActiveRecordID;\n if (activeId) {\n const activeNode = this.nodeMap.get(NormalizeUUID(activeId));\n if (activeNode) {\n activeNode.IsSelected = true;\n activeNode.IsHighlighted = true;\n this.SelectedNode = activeNode;\n // Expand all ancestors so the active node is visible in full context\n let curr = activeNode.ParentID ? this.nodeMap.get(NormalizeUUID(activeNode.ParentID)) : undefined;\n while (curr) {\n curr.IsExpanded = true;\n curr.Children = [...(curr._allChildren || [])];\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n\n // If AutoRootFocus is enabled and multiple roots exist, focus on the active root tree\n if (this.Config.AutoRootFocus !== false && roots.length > 1 && !this.FocusRecordID && !this.Config.FocusRecordID) {\n let rootAncestor = activeNode;\n while (rootAncestor.ParentID && this.nodeMap.has(NormalizeUUID(rootAncestor.ParentID))) {\n rootAncestor = this.nodeMap.get(NormalizeUUID(rootAncestor.ParentID))!;\n }\n rootAncestor.IsFocusRoot = true;\n this.FocusedNode = rootAncestor;\n }\n }\n }\n\n // 6. Apply initial expand depth if configured (and not explicitly expanded by active node)\n if (this.Config.InitialExpandDepth && this.Config.InitialExpandDepth > 0 && !activeId) {\n for (const node of this.AllNodes) {\n if (node.Depth >= this.Config.InitialExpandDepth) {\n node.IsExpanded = false;\n node.Children = [];\n }\n }\n }\n\n if (this.FocusRecordID || this.Config?.FocusRecordID) {\n this.setFocusRoot(this.FocusRecordID || this.Config?.FocusRecordID);\n }\n }\n\n private resolveParentFieldName(): string {\n if (this.Config?.ParentField) return this.Config.ParentField;\n if (this.entityInfo) {\n // Check self-referencing foreign keys\n const selfFk = this.entityInfo.Fields.find(\n (f) => f.RelatedEntity && f.RelatedEntity.toLowerCase() === this.entityInfo!.Name.toLowerCase()\n );\n if (selfFk) return selfFk.Name;\n }\n return 'ParentID';\n }\n\n private resolveNameFieldName(): string {\n if (this.Config?.NameField) return this.Config.NameField;\n if (this.entityInfo?.NameField) return this.entityInfo.NameField.Name;\n return 'Name';\n }\n\n private extractPrimaryKey(item: Record<string, unknown>): { pk: CompositeKey; id: string } {\n const pk = this.entityInfo && this.entityInfo.PrimaryKeys.length > 0\n ? new CompositeKey(this.entityInfo.PrimaryKeys.map(k => new KeyValuePair(k.Name, this.getItemValue(item, k.Name))))\n // No entity metadata: the tree's default item shape is keyed by ID/id.\n : CompositeKey.FromID(this.getItemValue(item, 'ID') ?? this.getItemValue(item, 'id') ?? ''); // first-pk-ok: reached only when no entity metadata is available; the metadata branch above uses every PrimaryKeys column\n return { pk, id: pk.ToCompactURLSegment() };\n }\n\n private wouldCreateCycle(node: HierarchyNodeData, proposedParent: HierarchyNodeData): boolean {\n let curr: HierarchyNodeData | undefined = proposedParent;\n while (curr) {\n if (UUIDsEqual(curr.ID, node.ID)) return true;\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n return false;\n }\n\n private computeSubtreeMetrics(node: HierarchyNodeData, depth: number): number {\n node.Depth = depth;\n node.DirectChildCount = node.Children.length;\n let descendantCount = node.Children.length;\n\n for (const child of node.Children) {\n descendantCount += this.computeSubtreeMetrics(child, depth + 1);\n }\n\n node.TotalDescendantCount = descendantCount;\n return descendantCount;\n }\n\n // --- D3 Layout & Visual Rendering ---\n\n private initD3Zoom(): void {\n if (!this.svgRef?.nativeElement) return;\n\n this.svgSelection = d3.select(this.svgRef.nativeElement);\n this.gSelection = this.svgSelection.select<SVGGElement>('g.mj-hierarchy-canvas');\n\n this.zoomBehavior = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4.0])\n .on('zoom', (event: d3.D3ZoomEvent<SVGSVGElement, unknown>) => {\n this.currentZoomTransform = event.transform;\n if (this.gSelection) {\n this.gSelection.attr('transform', event.transform.toString());\n }\n if (event.sourceEvent != null) {\n this.ZoomLevel = event.transform.k;\n this.ZoomChange.emit(event.transform.k);\n }\n });\n\n this.svgSelection.call(this.zoomBehavior);\n }\n\n private setupResizeObserver(): void {\n if (!this.svgContainerRef?.nativeElement) return;\n\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 50 && entry.contentRect.height > 50) {\n if (this.AllNodes.length > 0) {\n this.renderTree();\n }\n }\n }\n });\n this.resizeObserver.observe(this.svgContainerRef.nativeElement);\n }\n\n /**\n * Computes the D3 hierarchy tree layout and updates the SVG rendering.\n */\n public renderTree(preserveTransform = false): void {\n if (!this.svgRef?.nativeElement || !this.gSelection) {\n if (this.svgRef?.nativeElement) {\n this.initD3Zoom();\n }\n if (!this.gSelection) {\n setTimeout(() => this.renderTree(preserveTransform), 30);\n return;\n }\n }\n\n // Reset positions across all nodes\n for (const n of this.AllNodes) {\n n.x = undefined;\n n.y = undefined;\n }\n\n const isVertical = this.Config.Orientation !== 'left-to-right';\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n const siblingGap = this.Config.SiblingSpacing || 40;\n const levelGap = this.Config.LevelSpacing || 75;\n\n const activeRoots = this.FocusedNode ? [this.FocusedNode] : this.RootNodes;\n this.log(`[HierarchyTree:renderTree] Starting render for ${activeRoots.length} active root(s):`, activeRoots.map(r => r.Name));\n\n if (activeRoots.length === 0) {\n this.gSelection.selectAll('*').remove();\n return;\n }\n\n // 1. Create root hierarchy\n let rootHierarchy: d3.HierarchyNode<HierarchyNodeData>;\n if (activeRoots.length === 1) {\n rootHierarchy = d3.hierarchy(activeRoots[0], (d) => (d.IsExpanded ? d.Children : []));\n } else {\n // Multiple roots: wrap under a synthetic virtual root\n const virtualRoot: HierarchyNodeData = {\n ID: '__virtual_root__',\n PrimaryKey: new CompositeKey(),\n Name: 'Root',\n DirectChildCount: activeRoots.length,\n TotalDescendantCount: activeRoots.length,\n Depth: -1,\n IsExpanded: true,\n IsSelected: false,\n IsHighlighted: false,\n IsFocusRoot: false,\n Children: activeRoots\n };\n rootHierarchy = d3.hierarchy(virtualRoot, (d) => (d.IsExpanded ? d.Children : []));\n }\n\n // 2. Compute tree layout\n const treeLayout = d3.tree<HierarchyNodeData>()\n .nodeSize(isVertical ? [nodeWidth + siblingGap, nodeHeight + levelGap] : [nodeHeight + siblingGap, nodeWidth + levelGap])\n .separation((a, b) => (a.parent === b.parent ? 1.05 : 1.2));\n\n const treeData = treeLayout(rootHierarchy);\n\n // Filter out virtual root if multi-root\n const nodes = treeData.descendants().filter((d) => d.data.ID !== '__virtual_root__');\n const links = treeData.links().filter((d) => d.source.data.ID !== '__virtual_root__');\n\n // Update positions on node data (centered on D3 node point)\n for (const n of nodes) {\n n.data.x = isVertical ? n.x - nodeWidth / 2 : n.y;\n n.data.y = isVertical ? n.y : n.x - nodeHeight / 2;\n }\n\n this.log(`[HierarchyTree:renderTree] Tree layout computed: ${nodes.length} nodes, ${links.length} links. Node positions:`, nodes.map(n => ({ Name: n.data.Name, x: n.data.x, y: n.data.y })));\n\n // 3. Render Links\n const linkPathGen = (d: d3.HierarchyLink<HierarchyNodeData>): string => {\n const sx = isVertical ? d.source.data.x! + nodeWidth / 2 : d.source.data.x! + nodeWidth;\n const sy = isVertical ? d.source.data.y! + nodeHeight : d.source.data.y! + nodeHeight / 2;\n const tx = isVertical ? d.target.data.x! + nodeWidth / 2 : d.target.data.x!;\n const ty = isVertical ? d.target.data.y! : d.target.data.y! + nodeHeight / 2;\n\n if (isVertical) {\n const midY = (sy + ty) / 2;\n return `M ${sx} ${sy} C ${sx} ${midY}, ${tx} ${midY}, ${tx} ${ty}`;\n } else {\n const midX = (sx + tx) / 2;\n return `M ${sx} ${sy} C ${midX} ${sy}, ${midX} ${ty}, ${tx} ${ty}`;\n }\n };\n\n const linkGroup = this.gSelection.select<SVGGElement>('g.mj-links-group');\n const linkSelection = linkGroup.selectAll<SVGPathElement, d3.HierarchyLink<HierarchyNodeData>>('path.mj-tree-link')\n .data(links, (d) => `${d.source.data.ID}->${d.target.data.ID}`);\n\n linkSelection.exit().remove();\n\n linkSelection.enter()\n .append('path')\n .attr('class', 'mj-tree-link')\n .merge(linkSelection)\n .attr('d', linkPathGen)\n .attr('stroke', (d) => (d.target.data.IsHighlighted ? 'var(--mj-brand-primary, #38bdf8)' : 'var(--mj-border-default, #223254)'))\n .attr('stroke-width', (d) => (d.target.data.IsHighlighted ? 2.5 : 1.5))\n .attr('fill', 'none');\n\n this.AllNodes = [...this.AllNodes];\n this.cdr?.markForCheck();\n this.cdr?.detectChanges();\n if (!preserveTransform) {\n this.fitToScreen(true);\n }\n }\n\n // --- Interactive Actions ---\n\n /**\n * Toggles the expand/collapse state of a node, firing cancelable Before and After events.\n */\n public toggleNodeExpansion(node: HierarchyNodeData, event?: MouseEvent): void {\n if (event) event.stopPropagation();\n\n if (node.IsExpanded) {\n const beforeEvt = new CancelableHierarchyNodeEvent(node, event);\n this.BeforeNodeCollapse.emit(beforeEvt);\n if (beforeEvt.IsCanceled) return;\n\n node.IsExpanded = false;\n node.Children = [];\n this.AfterNodeCollapse.emit({ Node: node, OriginalEvent: event });\n } else {\n const beforeEvt = new CancelableHierarchyNodeEvent(node, event);\n this.BeforeNodeExpand.emit(beforeEvt);\n if (beforeEvt.IsCanceled) return;\n\n node.IsExpanded = true;\n node.Children = [...(node._allChildren || [])];\n this.AfterNodeExpand.emit({ Node: node, OriginalEvent: event });\n }\n\n this.renderTree(true);\n }\n\n public closeDetailsDrawer(): void {\n this.ShowDetailsDrawer = false;\n this.cdr?.markForCheck();\n }\n\n public openDetailsDrawer(): void {\n this.ShowDetailsDrawer = true;\n this.cdr?.markForCheck();\n }\n\n public onCanvasBackgroundClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target?.closest('.mj-details-drawer') || target?.closest('.mj-node-card') || target?.closest('.mj-tool-btn')) {\n return;\n }\n }\n\n public onNodeClick(node: HierarchyNodeData, event: MouseEvent): void {\n event.stopPropagation();\n this.SelectedNode = node;\n this.ShowDetailsDrawer = true;\n for (const n of this.AllNodes) {\n n.IsSelected = UUIDsEqual(n.ID, node.ID);\n }\n this.NodeClick.emit({ Node: node, OriginalEvent: event });\n this.NodeSelect.emit({ Node: node, OriginalEvent: event });\n this.cdr?.markForCheck();\n }\n\n public onNodeDoubleClick(node: HierarchyNodeData, event: MouseEvent): void {\n event.stopPropagation();\n this.NodeDoubleClick.emit({ Node: node, OriginalEvent: event });\n this.navigateToRecord(node, event);\n }\n\n public onNodeAction(node: HierarchyNodeData, action: string, event: MouseEvent): void {\n event.stopPropagation();\n this.NodeAction.emit({ Node: node, Action: action });\n\n switch (action) {\n case 'open':\n this.navigateToRecord(node, event);\n break;\n case 'focus':\n this.setFocusRoot(node.ID);\n break;\n case 'reset-focus':\n this.resetFocus();\n break;\n case 'add-child':\n // Handled via custom subscriber or event\n break;\n }\n }\n\n public navigateToRecord(node: HierarchyNodeData, event?: MouseEvent): void {\n const entityName = this.entityInfo ? this.entityInfo.Name : this.Config.EntityName;\n const navEvent: RecordNavigationEvent = {\n Kind: 'record',\n EntityName: entityName,\n PrimaryKey: node.PrimaryKey,\n OpenInNewTab: event ? event.ctrlKey || event.metaKey : false\n };\n this.Navigate.emit(navEvent);\n }\n\n public getRecordAttributeEntries(record: Record<string, unknown>): { key: string; label: string; value: string }[] {\n const entries: { key: string; label: string; value: string }[] = [];\n const skipFields = new Set([\n 'id', 'parentid', 'parentproductcategoryid', 'parentcategoryid',\n 'companyid', '__mj_version', 'createdat', 'updatedat', 'name'\n ]);\n\n for (const [k, v] of Object.entries(record)) {\n if (skipFields.has(k.toLowerCase()) || k.startsWith('__mj_') || v == null) continue;\n const strVal = typeof v === 'object' ? JSON.stringify(v) : String(v);\n if (strVal.trim() === '') continue;\n entries.push({\n key: k,\n label: k.replace(/([A-Z])/g, ' $1').trim(),\n value: strVal\n });\n }\n return entries.slice(0, 8);\n }\n\n // --- Search & Highlight ---\n\n public onSearchInput(): void {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) {\n for (const n of this.AllNodes) {\n n.IsHighlighted = false;\n }\n this.MatchingNodeCount = 0;\n this.renderTree(true);\n return;\n }\n\n let count = 0;\n let firstMatch: HierarchyNodeData | null = null;\n for (const n of this.AllNodes) {\n const matches = n.Name.toLowerCase().includes(q) || (n.Subtitle && n.Subtitle.toLowerCase().includes(q));\n n.IsHighlighted = !!matches;\n if (matches) {\n count++;\n if (!firstMatch) firstMatch = n;\n this.expandAncestors(n);\n }\n }\n\n this.MatchingNodeCount = count;\n this.renderTree(true);\n\n if (firstMatch && firstMatch.x != null && firstMatch.y != null) {\n this.centerOnNode(firstMatch);\n }\n }\n\n public clearSearch(): void {\n this.SearchQuery = '';\n this.onSearchInput();\n }\n\n public centerOnNode(node: HierarchyNodeData): void {\n if (!this.svgSelection || !this.zoomBehavior || !this.svgContainerRef?.nativeElement) return;\n if (node.x == null || node.y == null) return;\n\n const rect = this.svgContainerRef.nativeElement.getBoundingClientRect();\n const width = rect.width > 50 ? rect.width : (this.svgContainerRef.nativeElement.clientWidth || 800);\n const height = rect.height > 50 ? rect.height : (this.svgContainerRef.nativeElement.clientHeight || 500);\n const rightMargin = (this.ShowDetailsDrawer && this.SelectedNode) ? 340 : 0;\n const visibleWidth = Math.max(width - rightMargin, 200);\n\n const currentScale = this.currentZoomTransform?.k || this.ZoomLevel || 1;\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n\n const nodeCenterX = node.x + nodeWidth / 2;\n const nodeCenterY = node.y + nodeHeight / 2;\n\n const tx = visibleWidth / 2 - nodeCenterX * currentScale;\n const ty = height / 2 - nodeCenterY * currentScale;\n\n const target = d3.zoomIdentity.translate(tx, ty).scale(currentScale);\n this.svgSelection.interrupt().transition().duration(400).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, target);\n }\n\n private expandAncestors(node: HierarchyNodeData): void {\n let curr = node.ParentID ? this.nodeMap.get(NormalizeUUID(node.ParentID)) : undefined;\n while (curr) {\n curr.IsExpanded = true;\n curr.Children = [...(curr._allChildren || [])];\n curr = curr.ParentID ? this.nodeMap.get(NormalizeUUID(curr.ParentID)) : undefined;\n }\n }\n\n // --- Subtree Focus ---\n\n public setFocusRoot(recordId?: string): void {\n if (!recordId) {\n this.resetFocus();\n return;\n }\n\n const target = this.nodeMap.get(NormalizeUUID(recordId));\n if (!target) return;\n\n for (const n of this.AllNodes) n.IsFocusRoot = false;\n target.IsFocusRoot = true;\n this.FocusedNode = target;\n this.renderTree();\n this.onFitToViewClick();\n }\n\n public resetFocus(): void {\n for (const n of this.AllNodes) n.IsFocusRoot = false;\n this.FocusedNode = null;\n this.renderTree();\n this.onFitToViewClick();\n }\n\n // --- Toolbar Actions / Verbs ---\n\n public expandAll(): void {\n for (const n of this.AllNodes) {\n n.IsExpanded = true;\n n.Children = [...(n._allChildren || [])];\n }\n this.renderTree(true);\n }\n\n public collapseAll(): void {\n for (const n of this.AllNodes) {\n if (n.Depth > 0) {\n n.IsExpanded = false;\n n.Children = [];\n }\n }\n this.renderTree(true);\n }\n\n public zoomIn(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n const currentScale = this.currentZoomTransform?.k || 1;\n const targetScale = Math.min(currentScale * 1.25, 4.0);\n this.setZoomLevel(targetScale, true);\n this.ZoomLevel = targetScale;\n this.ZoomChange.emit(targetScale);\n }\n\n public zoomOut(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n const currentScale = this.currentZoomTransform?.k || 1;\n const targetScale = Math.max(currentScale * 0.8, 0.1);\n this.setZoomLevel(targetScale, true);\n this.ZoomLevel = targetScale;\n this.ZoomChange.emit(targetScale);\n }\n\n public setZoomLevel(scale: number, animated = true): void {\n if (!this.svgSelection || !this.zoomBehavior || !scale) return;\n const container = this.svgContainerRef?.nativeElement;\n const rect = container?.getBoundingClientRect();\n const width = rect?.width && rect.width > 50 ? rect.width : (container?.clientWidth || 800);\n const height = rect?.height && rect.height > 50 ? rect.height : (container?.clientHeight || 500);\n const current = this.currentZoomTransform || d3.zoomIdentity;\n const cx = width / 2;\n const cy = height / 2;\n const newX = cx - (cx - current.x) * (scale / (current.k || 1));\n const newY = cy - (cy - current.y) * (scale / (current.k || 1));\n const target = d3.zoomIdentity.translate(newX, newY).scale(scale);\n\n if (animated) {\n this.svgSelection.interrupt().transition().duration(250).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, target);\n } else {\n this.svgSelection.interrupt().call(this.zoomBehavior.transform, target);\n }\n }\n\n public resetZoom(): void {\n if (!this.svgSelection || !this.zoomBehavior) return;\n this.onFitToViewClick();\n }\n\n public onFitToViewClick(): void {\n this.fitToScreen(false, true);\n setTimeout(() => {\n this.fitToScreen(false, true);\n }, 320);\n }\n\n public fitToScreen(immediate = false, forceAutoScale = false): void {\n if (!this.svgSelection || !this.zoomBehavior || !this.svgContainerRef?.nativeElement) return;\n\n const visibleNodes = this.AllNodes.filter((n) => n.x != null && n.y != null);\n if (visibleNodes.length === 0) return;\n\n const nodeWidth = this.Config.NodeWidth || 230;\n const nodeHeight = this.Config.NodeHeight || 90;\n\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (const n of visibleNodes) {\n minX = Math.min(minX, n.x!);\n maxX = Math.max(maxX, n.x! + nodeWidth);\n minY = Math.min(minY, n.y!);\n maxY = Math.max(maxY, n.y! + nodeHeight);\n }\n\n const treeWidth = Math.max(maxX - minX, 1);\n const treeHeight = Math.max(maxY - minY, 1);\n const treeCenterX = (minX + maxX) / 2;\n const treeCenterY = (minY + maxY) / 2;\n\n const rect = this.svgContainerRef.nativeElement.getBoundingClientRect();\n const width = rect.width > 50 ? rect.width : (this.svgContainerRef.nativeElement.clientWidth || 800);\n const height = rect.height > 50 ? rect.height : (this.svgContainerRef.nativeElement.clientHeight || 500);\n const rightMargin = (this.ShowDetailsDrawer && this.SelectedNode) ? 340 : 0;\n const visibleWidth = Math.max(width - rightMargin, 200);\n const padding = 40;\n\n const availWidth = Math.max(visibleWidth - padding * 2, 100);\n const availHeight = Math.max(height - padding * 2, 100);\n const autoScale = Math.max(\n Math.min(\n availWidth / treeWidth,\n availHeight / treeHeight,\n 1.05\n ),\n 0.15\n );\n\n const scale = (forceAutoScale || !this.ZoomLevel) ? autoScale : this.ZoomLevel;\n\n if (forceAutoScale) {\n this.ZoomLevel = autoScale;\n this.ZoomChange.emit(autoScale);\n }\n\n const tx = visibleWidth / 2 - treeCenterX * scale;\n const ty = height / 2 - treeCenterY * scale;\n\n const targetTransform = d3.zoomIdentity.translate(tx, ty).scale(scale);\n\n this.log(`[HierarchyTree:fitToScreen] Container=${width}x${height} (visible=${visibleWidth}), visibleNodes=${visibleNodes.length}, bounds=[${minX.toFixed(1)}, ${minY.toFixed(1)}] to [${maxX.toFixed(1)}, ${maxY.toFixed(1)}] (${treeWidth.toFixed(1)}x${treeHeight.toFixed(1)}), autoScale=${autoScale.toFixed(3)}, usingScale=${scale.toFixed(3)}, translate=(${tx.toFixed(1)}, ${ty.toFixed(1)})`);\n\n if (immediate) {\n this.svgSelection.interrupt().call(this.zoomBehavior.transform, targetTransform);\n } else {\n this.svgSelection.interrupt().transition().duration(300).ease(d3.easeCubicOut).call(this.zoomBehavior.transform, targetTransform);\n }\n }\n\n public exportAsSVG(): string {\n return this.svgRef?.nativeElement ? this.svgRef.nativeElement.outerHTML : '';\n }\n\n public async refresh(): Promise<void> {\n await this.loadData();\n }\n}\n","<div class=\"mj-hierarchy-wrapper\" [style.height]=\"Config.Height || '100%'\" [style.min-height]=\"Config.MinHeight || '500px'\">\n <!-- Top Controls Bar -->\n @if (Config.ShowToolbar || Config.ShowSearch) {\n <div class=\"mj-hierarchy-toolbar\">\n <!-- Search Box -->\n @if (Config.ShowSearch) {\n <div class=\"mj-search-box\">\n <i class=\"fa-solid fa-magnifying-glass mj-search-icon\"></i>\n <input\n type=\"text\"\n class=\"mj-search-input\"\n placeholder=\"Search hierarchy...\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"onSearchInput()\"\n />\n @if (SearchQuery) {\n <button type=\"button\" class=\"mj-clear-btn\" (click)=\"clearSearch()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n @if (SearchQuery && MatchingNodeCount > 0) {\n <span class=\"mj-match-badge\">{{ MatchingNodeCount }} found</span>\n }\n </div>\n }\n\n <!-- Focus Subtree Indicator -->\n @if (FocusedNode) {\n <div class=\"mj-focus-indicator\">\n <i class=\"fa-solid fa-crosshairs\"></i>\n <span>Focusing subtree: <strong>{{ FocusedNode.Name }}</strong></span>\n <button type=\"button\" class=\"mj-reset-focus-btn\" (click)=\"resetFocus()\" title=\"Show entire hierarchy\">\n <i class=\"fa-solid fa-rotate-left\"></i> View Full Hierarchy\n </button>\n </div>\n }\n\n <!-- Toolbar Action Buttons -->\n @if (Config.ShowToolbar) {\n <div class=\"mj-toolbar-actions\">\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"expandAll()\" title=\"Expand all subtrees\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"collapseAll()\" title=\"Collapse all subtrees\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <div class=\"mj-tool-divider\"></div>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"onFitToViewClick()\" title=\"Fit hierarchy to view\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <div class=\"mj-tool-divider\"></div>\n <button type=\"button\" class=\"mj-tool-btn\" (click)=\"refresh()\" title=\"Reload hierarchy data\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- SVG Canvas Container -->\n <div #svgContainer class=\"mj-canvas-container\" (click)=\"onCanvasBackgroundClick($event)\">\n @if (Loading) {\n <div class=\"mj-state-overlay\">\n <div class=\"mj-spinner\"></div>\n <span>Loading hierarchy...</span>\n </div>\n } @else if (ErrorMessage) {\n <div class=\"mj-state-overlay mj-error-state\">\n <i class=\"fa-solid fa-circle-exclamation mj-error-icon\"></i>\n <span>{{ ErrorMessage }}</span>\n <button type=\"button\" class=\"mj-retry-btn\" (click)=\"loadData()\">Retry</button>\n </div>\n } @else if (AllNodes.length === 0) {\n <div class=\"mj-state-overlay mj-empty-state\">\n <i class=\"fa-solid fa-sitemap mj-empty-icon\"></i>\n <span>No hierarchy records found.</span>\n </div>\n }\n\n <svg #svgElement class=\"mj-hierarchy-svg\">\n <defs>\n <pattern id=\"mj-tree-grid\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"var(--mj-border-subtle, #1e293b)\" opacity=\"0.4\" />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#mj-tree-grid)\" />\n\n <!-- Main Canvas Group (Zoomable & Pannable) -->\n <g class=\"mj-hierarchy-canvas\">\n <!-- Connective Link Curves -->\n <g class=\"mj-links-group\"></g>\n\n <!-- Interactive Node Cards via ForeignObject -->\n <g class=\"mj-nodes-group\">\n @for (node of AllNodes; track node.ID) {\n @if (node.x != null && node.y != null) {\n <foreignObject\n [attr.x]=\"node.x\"\n [attr.y]=\"node.y\"\n [attr.width]=\"Config.NodeWidth || 230\"\n [attr.height]=\"Config.NodeHeight || 90\"\n class=\"mj-node-foreign-object\"\n >\n <div\n class=\"mj-node-card\"\n [class.selected]=\"node.IsSelected\"\n [class.highlighted]=\"node.IsHighlighted\"\n [class.focus-root]=\"node.IsFocusRoot\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n >\n <!-- Accent Top Border -->\n <div class=\"mj-card-accent\" [style.background]=\"node.Color || Config.DefaultColor\"></div>\n\n <!-- Node Card Header -->\n <div class=\"mj-node-header\">\n <div class=\"mj-node-icon\" [style.color]=\"node.Color || Config.DefaultColor\">\n <i [class]=\"node.Icon || Config.DefaultIcon\"></i>\n </div>\n <div class=\"mj-node-title-group\">\n <div class=\"mj-node-name\" [title]=\"node.Name\">{{ node.Name }}</div>\n @if (node.Subtitle) {\n <div class=\"mj-node-subtitle\">{{ node.Subtitle }}</div>\n }\n </div>\n </div>\n\n <!-- Node Card Footer & Actions -->\n <div class=\"mj-node-footer\">\n <!-- Subtree Expansion Pill -->\n @if (node.DirectChildCount > 0) {\n <button\n type=\"button\"\n class=\"mj-expand-badge\"\n [class.collapsed]=\"!node.IsExpanded\"\n (click)=\"toggleNodeExpansion(node, $event)\"\n [title]=\"node.IsExpanded ? 'Collapse sub-branch' : 'Expand ' + node.DirectChildCount + ' children'\"\n >\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"node.IsExpanded\" [class.fa-chevron-right]=\"!node.IsExpanded\"></i>\n <span>{{ node.DirectChildCount }}</span>\n </button>\n } @else {\n <span class=\"mj-leaf-indicator\">Leaf</span>\n }\n\n <!-- Quick Action Buttons -->\n @if (AllowNodeActions) {\n <div class=\"mj-node-actions\">\n <button\n type=\"button\"\n class=\"mj-node-action-btn\"\n (click)=\"onNodeAction(node, 'focus', $event)\"\n title=\"Focus on this subtree\"\n >\n <i class=\"fa-solid fa-crosshairs\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mj-node-action-btn\"\n (click)=\"onNodeAction(node, 'open', $event)\"\n title=\"Open record in Explorer\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n </foreignObject>\n }\n }\n </g>\n </g>\n </svg>\n\n <!-- Slide-In Node Details Drawer -->\n <aside\n class=\"mj-details-drawer\"\n [class.open]=\"SelectedNode != null && ShowDetailsDrawer\"\n aria-label=\"Node details panel\"\n >\n @if (SelectedNode) {\n <div class=\"mj-drawer-header\">\n <div class=\"mj-drawer-title-group\">\n <div class=\"mj-drawer-icon\" [style.color]=\"SelectedNode.Color || Config.DefaultColor\">\n <i [class]=\"SelectedNode.Icon || Config.DefaultIcon\"></i>\n </div>\n <div class=\"mj-drawer-titles\">\n <h4 class=\"mj-drawer-name\" [title]=\"SelectedNode.Name\">{{ SelectedNode.Name }}</h4>\n @if (SelectedNode.Subtitle) {\n <p class=\"mj-drawer-subtitle\">{{ SelectedNode.Subtitle }}</p>\n }\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mj-drawer-close-btn\"\n (click)=\"closeDetailsDrawer()\"\n title=\"Close details\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-drawer-body\">\n <div class=\"mj-drawer-stats\">\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.Depth }}</span>\n <span class=\"mj-stat-label\">Hierarchy Level</span>\n </div>\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.DirectChildCount }}</span>\n <span class=\"mj-stat-label\">Direct Children</span>\n </div>\n <div class=\"mj-stat-card\">\n <span class=\"mj-stat-num\">{{ SelectedNode.TotalDescendantCount }}</span>\n <span class=\"mj-stat-label\">Total Subtree</span>\n </div>\n </div>\n\n @if (SelectedNode.Record && getRecordAttributeEntries(SelectedNode.Record).length > 0) {\n <div class=\"mj-drawer-section\">\n <h5 class=\"mj-section-heading\">Attributes</h5>\n <dl class=\"mj-attr-list\">\n @for (attr of getRecordAttributeEntries(SelectedNode.Record); track attr.key) {\n <div class=\"mj-attr-row\">\n <dt class=\"mj-attr-dt\">{{ attr.label }}</dt>\n <dd class=\"mj-attr-dd\" [title]=\"attr.value\">{{ attr.value }}</dd>\n </div>\n }\n </dl>\n </div>\n }\n\n <div class=\"mj-drawer-actions\">\n <button\n type=\"button\"\n class=\"mj-drawer-btn-primary\"\n (click)=\"navigateToRecord(SelectedNode)\"\n title=\"Open this record in Explorer\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open Record</span>\n </button>\n\n <div class=\"mj-drawer-btn-row\">\n @if (SelectedNode.DirectChildCount > 0) {\n <button\n type=\"button\"\n class=\"mj-drawer-btn-secondary\"\n (click)=\"toggleNodeExpansion(SelectedNode)\"\n >\n <i class=\"fa-solid\" [class.fa-folder-open]=\"SelectedNode.IsExpanded\" [class.fa-folder]=\"!SelectedNode.IsExpanded\"></i>\n <span>{{ SelectedNode.IsExpanded ? 'Collapse' : 'Expand' }}</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-drawer-btn-secondary\"\n (click)=\"setFocusRoot(SelectedNode.ID)\"\n title=\"Focus hierarchy on this subtree\"\n >\n <i class=\"fa-solid fa-crosshairs\"></i>\n <span>Focus Tree</span>\n </button>\n </div>\n </div>\n </div>\n }\n </aside>\n </div>\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-hierarchy-tree",
3
- "version": "6.1.0-edge.5",
3
+ "version": "6.1.0-edge.6",
4
4
  "description": "MemberJunction: Generic interactive visual hierarchy and org-chart component with D3 layout, Before/After cancelable events, and MJ design tokens",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -19,24 +19,24 @@
19
19
  "author": "",
20
20
  "license": "ISC",
21
21
  "devDependencies": {
22
- "@angular/compiler": "21.1.3",
23
- "@angular/compiler-cli": "21.1.3",
24
- "@memberjunction/ng-test-utils": "6.1.0-edge.5",
22
+ "@angular/compiler": "21.2.22",
23
+ "@angular/compiler-cli": "21.2.22",
24
+ "@memberjunction/ng-test-utils": "6.1.0-edge.6",
25
25
  "@types/d3": "^7.4.3",
26
26
  "vitest": "^4.0.18"
27
27
  },
28
28
  "peerDependencies": {
29
- "@angular/common": "^21.1.3",
30
- "@angular/core": "^21.1.3",
31
- "@angular/forms": "^21.1.3"
29
+ "@angular/common": "^21.2.22",
30
+ "@angular/core": "^21.2.22",
31
+ "@angular/forms": "^21.2.22"
32
32
  },
33
33
  "dependencies": {
34
- "@memberjunction/core": "6.1.0-edge.5",
35
- "@memberjunction/core-entities": "6.1.0-edge.5",
36
- "@memberjunction/global": "6.1.0-edge.5",
37
- "@memberjunction/ng-base-forms": "6.1.0-edge.5",
38
- "@memberjunction/ng-base-types": "6.1.0-edge.5",
39
- "@memberjunction/ng-ui-components": "6.1.0-edge.5",
34
+ "@memberjunction/core": "6.1.0-edge.6",
35
+ "@memberjunction/core-entities": "6.1.0-edge.6",
36
+ "@memberjunction/global": "6.1.0-edge.6",
37
+ "@memberjunction/ng-base-forms": "6.1.0-edge.6",
38
+ "@memberjunction/ng-base-types": "6.1.0-edge.6",
39
+ "@memberjunction/ng-ui-components": "6.1.0-edge.6",
40
40
  "d3": "^7.9.0",
41
41
  "rxjs": "^7.8.2",
42
42
  "tslib": "^2.8.1"