concepto-user-controls 0.0.8 → 0.0.10

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.
Files changed (37) hide show
  1. package/esm2022/lib/concepto-input/concepto-input.component.mjs +20 -0
  2. package/esm2022/lib/concepto-tree/components/tree-node/tree-node.component.mjs +301 -0
  3. package/esm2022/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.mjs +90 -0
  4. package/esm2022/lib/concepto-tree/components/tree-node-content/tree-node-content.component.mjs +65 -0
  5. package/esm2022/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.mjs +74 -0
  6. package/esm2022/lib/concepto-tree/components/tree-root/tree-root.component.mjs +230 -0
  7. package/esm2022/lib/concepto-tree/components/tree-viewport/tree-viewport.component.mjs +216 -0
  8. package/esm2022/lib/concepto-tree/concepto-tree.component.mjs +214 -13
  9. package/esm2022/lib/concepto-tree/core/models/tree-events.model.mjs +2 -0
  10. package/esm2022/lib/concepto-tree/core/models/tree-node.model.mjs +102 -0
  11. package/esm2022/lib/concepto-tree/core/models/tree-options.model.mjs +24 -0
  12. package/esm2022/lib/concepto-tree/core/models/tree.model.mjs +313 -0
  13. package/esm2022/lib/concepto-tree/core/services/tree-drag-drop.service.mjs +27 -0
  14. package/esm2022/lib/concepto-tree/directives/tree-drag.directive.mjs +69 -0
  15. package/esm2022/lib/concepto-tree/directives/tree-drop.directive.mjs +124 -0
  16. package/esm2022/lib/concepto-tree/directives/tree-node-template.directive.mjs +19 -0
  17. package/esm2022/public-api.mjs +2 -1
  18. package/fesm2022/concepto-user-controls.mjs +1837 -13
  19. package/fesm2022/concepto-user-controls.mjs.map +1 -1
  20. package/lib/concepto-input/concepto-input.component.d.ts +8 -0
  21. package/lib/concepto-tree/components/tree-node/tree-node.component.d.ts +19 -0
  22. package/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.d.ts +17 -0
  23. package/lib/concepto-tree/components/tree-node-content/tree-node-content.component.d.ts +18 -0
  24. package/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.d.ts +12 -0
  25. package/lib/concepto-tree/components/tree-root/tree-root.component.d.ts +35 -0
  26. package/lib/concepto-tree/components/tree-viewport/tree-viewport.component.d.ts +33 -0
  27. package/lib/concepto-tree/concepto-tree.component.d.ts +32 -1
  28. package/lib/concepto-tree/core/models/tree-events.model.d.ts +13 -0
  29. package/lib/concepto-tree/core/models/tree-node.model.d.ts +39 -0
  30. package/lib/concepto-tree/core/models/tree-options.model.d.ts +28 -0
  31. package/lib/concepto-tree/core/models/tree.model.d.ts +54 -0
  32. package/lib/concepto-tree/core/services/tree-drag-drop.service.d.ts +11 -0
  33. package/lib/concepto-tree/directives/tree-drag.directive.d.ts +16 -0
  34. package/lib/concepto-tree/directives/tree-drop.directive.d.ts +25 -0
  35. package/lib/concepto-tree/directives/tree-node-template.directive.d.ts +8 -0
  36. package/package.json +1 -1
  37. package/public-api.d.ts +1 -0
@@ -0,0 +1,313 @@
1
+ // lib/core/models/tree.model.ts
2
+ import { signal, computed } from '@angular/core';
3
+ import { Subject } from 'rxjs';
4
+ import { TreeNode } from './tree-node.model';
5
+ export class TreeModel {
6
+ options;
7
+ // Reactive state with signals
8
+ roots = signal([]);
9
+ focusedNodeId = signal(null);
10
+ expandedNodeIds = signal(new Set());
11
+ activeNodeIds = signal(new Set());
12
+ selectedNodeIds = signal(new Set());
13
+ hiddenNodeIds = signal(new Set());
14
+ // Computed signals
15
+ focusedNode = computed(() => {
16
+ const id = this.focusedNodeId();
17
+ return id ? this.getNodeById(id) : null;
18
+ });
19
+ expandedNodes = computed(() => this.getAllNodes().filter(node => this.expandedNodeIds().has(node.id)));
20
+ activeNodes = computed(() => this.getAllNodes().filter(node => this.activeNodeIds().has(node.id)));
21
+ selectedNodes = computed(() => this.getAllNodes().filter(node => this.selectedNodeIds().has(node.id)));
22
+ visibleNodes = computed(() => this.getAllNodes().filter(node => !node.isHidden()));
23
+ flattenedNodes = computed(() => {
24
+ const flattened = [];
25
+ const traverse = (nodes) => {
26
+ nodes.forEach(node => {
27
+ if (!node.isHidden()) {
28
+ flattened.push(node);
29
+ if (node.isExpanded() && node.children.length > 0) {
30
+ traverse(node.children);
31
+ }
32
+ }
33
+ });
34
+ };
35
+ traverse(this.roots());
36
+ return flattened;
37
+ });
38
+ // Event streams
39
+ events$ = new Subject();
40
+ // Virtual root for unified handling
41
+ virtualRoot = null;
42
+ // Node registry for quick lookup
43
+ nodeRegistry = new Map();
44
+ constructor(options) {
45
+ this.options = options;
46
+ // Constructor sin effects - se sincronizan en las operaciones
47
+ }
48
+ // Data management
49
+ setData(data) {
50
+ this.nodeRegistry.clear();
51
+ const roots = this.buildNodes(data, null, 0);
52
+ this.roots.set(roots);
53
+ this.emitEvent({ type: 'initialized', treeModel: this });
54
+ }
55
+ buildNodes(data, parent, level) {
56
+ return data.map((item, index) => {
57
+ const node = new TreeNode(item, parent, level, index, this.options);
58
+ this.nodeRegistry.set(node.id, node);
59
+ // Recursively build children
60
+ const childrenData = item[this.options.childrenField || 'children'];
61
+ if (Array.isArray(childrenData) && childrenData.length > 0) {
62
+ node.children = this.buildNodes(childrenData, node, level + 1);
63
+ }
64
+ return node;
65
+ });
66
+ }
67
+ update() {
68
+ // Trigger change detection by creating new signal values
69
+ this.roots.set([...this.roots()]);
70
+ this.emitEvent({ type: 'update', treeModel: this });
71
+ }
72
+ // Node lookup
73
+ getNodeById(id) {
74
+ return this.nodeRegistry.get(id) || null;
75
+ }
76
+ getNodeBy(predicate) {
77
+ return this.getAllNodes().find(predicate) || null;
78
+ }
79
+ getAllNodes() {
80
+ const nodes = [];
81
+ const traverse = (nodeList) => {
82
+ nodeList.forEach(node => {
83
+ nodes.push(node);
84
+ if (node.children.length > 0) {
85
+ traverse(node.children);
86
+ }
87
+ });
88
+ };
89
+ traverse(this.roots());
90
+ return nodes;
91
+ }
92
+ // Navigation
93
+ focusNode(node) {
94
+ if (this.focusedNode()) {
95
+ this.focusedNode().setFocus(false);
96
+ }
97
+ if (node) {
98
+ this.focusedNodeId.set(node.id);
99
+ node.setFocus(true);
100
+ this.emitEvent({ type: 'focus', node });
101
+ }
102
+ else {
103
+ this.focusedNodeId.set(null);
104
+ }
105
+ }
106
+ focusNextNode() {
107
+ const flattened = this.flattenedNodes();
108
+ const currentIndex = flattened.findIndex(n => n.id === this.focusedNodeId());
109
+ if (currentIndex < flattened.length - 1) {
110
+ this.focusNode(flattened[currentIndex + 1]);
111
+ }
112
+ }
113
+ focusPreviousNode() {
114
+ const flattened = this.flattenedNodes();
115
+ const currentIndex = flattened.findIndex(n => n.id === this.focusedNodeId());
116
+ if (currentIndex > 0) {
117
+ this.focusNode(flattened[currentIndex - 1]);
118
+ }
119
+ }
120
+ focusDrillDown() {
121
+ const focused = this.focusedNode();
122
+ if (focused) {
123
+ if (!focused.isExpanded() && focused.hasChildren) {
124
+ focused.expand();
125
+ }
126
+ else if (focused.children.length > 0) {
127
+ this.focusNode(focused.children[0]);
128
+ }
129
+ }
130
+ }
131
+ focusDrillUp() {
132
+ const focused = this.focusedNode();
133
+ if (focused) {
134
+ if (focused.isExpanded() && focused.hasChildren) {
135
+ focused.collapse();
136
+ }
137
+ else if (focused.parent) {
138
+ this.focusNode(focused.parent);
139
+ }
140
+ }
141
+ }
142
+ // Operations
143
+ expandAll() {
144
+ const ids = new Set(this.getAllNodes().map(n => n.id));
145
+ this.expandedNodeIds.set(ids);
146
+ this.emitEvent({ type: 'expandAll', treeModel: this });
147
+ }
148
+ collapseAll() {
149
+ this.expandedNodeIds.set(new Set());
150
+ this.emitEvent({ type: 'collapseAll', treeModel: this });
151
+ }
152
+ expandNode(node) {
153
+ this.expandedNodeIds.update(ids => {
154
+ const newIds = new Set(ids);
155
+ newIds.add(node.id);
156
+ return newIds;
157
+ });
158
+ node.isExpanded.set(true);
159
+ this.emitEvent({ type: 'expand', node });
160
+ }
161
+ collapseNode(node) {
162
+ this.expandedNodeIds.update(ids => {
163
+ const newIds = new Set(ids);
164
+ newIds.delete(node.id);
165
+ return newIds;
166
+ });
167
+ node.isExpanded.set(false);
168
+ this.emitEvent({ type: 'collapse', node });
169
+ }
170
+ activateNode(node, multi = false) {
171
+ if (!multi) {
172
+ this.activeNodeIds.set(new Set([node.id]));
173
+ this.getAllNodes().forEach(n => n.isActive.set(n.id === node.id));
174
+ }
175
+ else {
176
+ this.activeNodeIds.update(ids => {
177
+ const newIds = new Set(ids);
178
+ newIds.add(node.id);
179
+ return newIds;
180
+ });
181
+ node.isActive.set(true);
182
+ }
183
+ this.emitEvent({ type: 'activate', node });
184
+ }
185
+ deactivateNode(node) {
186
+ this.activeNodeIds.update(ids => {
187
+ const newIds = new Set(ids);
188
+ newIds.delete(node.id);
189
+ return newIds;
190
+ });
191
+ node.isActive.set(false);
192
+ this.emitEvent({ type: 'deactivate', node });
193
+ }
194
+ selectNode(node, multi = false) {
195
+ if (!multi) {
196
+ this.selectedNodeIds.set(new Set([node.id]));
197
+ }
198
+ else {
199
+ this.selectedNodeIds.update(ids => {
200
+ const newIds = new Set(ids);
201
+ if (ids.has(node.id)) {
202
+ newIds.delete(node.id);
203
+ }
204
+ else {
205
+ newIds.add(node.id);
206
+ }
207
+ return newIds;
208
+ });
209
+ }
210
+ this.emitEvent({ type: 'select', node });
211
+ }
212
+ // Filtering
213
+ filterNodes(filterFn, autoShow = true) {
214
+ const hiddenIds = new Set();
215
+ this.getAllNodes().forEach(node => {
216
+ const matches = filterFn(node);
217
+ if (!matches) {
218
+ hiddenIds.add(node.id);
219
+ }
220
+ else if (autoShow) {
221
+ // Show ancestors of matching nodes
222
+ node.getAncestors().forEach(ancestor => {
223
+ hiddenIds.delete(ancestor.id);
224
+ });
225
+ }
226
+ });
227
+ this.hiddenNodeIds.set(hiddenIds);
228
+ this.emitEvent({ type: 'filter', treeModel: this });
229
+ }
230
+ clearFilter() {
231
+ this.hiddenNodeIds.set(new Set());
232
+ this.emitEvent({ type: 'clearFilter', treeModel: this });
233
+ }
234
+ // Drag & Drop
235
+ canMoveNode(node, to) {
236
+ // Prevent moving to itself or descendants
237
+ if (node === to.parent)
238
+ return false;
239
+ if (to.parent.getAncestors().includes(node))
240
+ return false;
241
+ // Custom validation
242
+ if (this.options.allowDrop) {
243
+ if (typeof this.options.allowDrop === 'function') {
244
+ return this.options.allowDrop(node, to);
245
+ }
246
+ return this.options.allowDrop;
247
+ }
248
+ return true;
249
+ }
250
+ moveNode(node, to) {
251
+ if (!this.canMoveNode(node, to))
252
+ return;
253
+ // Remove from old parent
254
+ if (node.parent) {
255
+ const oldIndex = node.parent.children.indexOf(node);
256
+ if (oldIndex !== -1) {
257
+ // Create new array to trigger change detection
258
+ node.parent.children = [
259
+ ...node.parent.children.slice(0, oldIndex),
260
+ ...node.parent.children.slice(oldIndex + 1)
261
+ ];
262
+ }
263
+ }
264
+ else {
265
+ // Handle root nodes
266
+ const rootIndex = this.roots().indexOf(node);
267
+ if (rootIndex !== -1) {
268
+ this.roots.set([
269
+ ...this.roots().slice(0, rootIndex),
270
+ ...this.roots().slice(rootIndex + 1)
271
+ ]);
272
+ }
273
+ }
274
+ // Add to new parent - create new array to trigger change detection
275
+ const newChildren = [...to.parent.children];
276
+ newChildren.splice(to.index, 0, node);
277
+ to.parent.children = newChildren;
278
+ node.parent = to.parent;
279
+ // Update levels
280
+ this.updateNodeLevels(node);
281
+ this.emitEvent({ type: 'moveNode', node, to });
282
+ this.update();
283
+ }
284
+ updateNodeLevels(node) {
285
+ const newLevel = node.parent ? node.parent.level + 1 : 0;
286
+ node.level = newLevel;
287
+ node.children.forEach(child => this.updateNodeLevels(child));
288
+ }
289
+ // Async children loading
290
+ async loadChildren(node) {
291
+ if (!this.options.getChildren)
292
+ return;
293
+ node.setLoading(true);
294
+ try {
295
+ const childrenData = await this.options.getChildren(node);
296
+ node.children = this.buildNodes(childrenData, node, node.level + 1);
297
+ node.hasChildren = node.children.length > 0;
298
+ this.emitEvent({ type: 'loadChildren', node });
299
+ this.update();
300
+ }
301
+ catch (error) {
302
+ this.emitEvent({ type: 'loadChildrenError', node, error });
303
+ }
304
+ finally {
305
+ node.setLoading(false);
306
+ }
307
+ }
308
+ // Events
309
+ emitEvent(event) {
310
+ this.events$.next(event);
311
+ }
312
+ }
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by10cmVlL2NvcmUvbW9kZWxzL3RyZWUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTdDLE1BQU0sT0FBTyxTQUFTO0lBOEREO0lBN0RuQiw4QkFBOEI7SUFDckIsS0FBSyxHQUFHLE1BQU0sQ0FBYSxFQUFFLENBQUMsQ0FBQztJQUMvQixhQUFhLEdBQUcsTUFBTSxDQUF5QixJQUFJLENBQUMsQ0FBQztJQUNyRCxlQUFlLEdBQUcsTUFBTSxDQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUQsYUFBYSxHQUFHLE1BQU0sQ0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELGVBQWUsR0FBRyxNQUFNLENBQXVCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxRCxhQUFhLEdBQUcsTUFBTSxDQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFakUsbUJBQW1CO0lBQ1YsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcs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QUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVM7SUFDRCxTQUFTLENBQUMsS0FBZ0I7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbGliL2NvcmUvbW9kZWxzL3RyZWUubW9kZWwudHNcclxuaW1wb3J0IHsgc2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL3RyZWUtbm9kZS5tb2RlbCc7XHJcbmltcG9ydCB7IFRyZWVPcHRpb25zIH0gZnJvbSAnLi90cmVlLW9wdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmVlRXZlbnQgfSBmcm9tICcuL3RyZWUtZXZlbnRzLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmVlTW9kZWwge1xyXG4gIC8vIFJlYWN0aXZlIHN0YXRlIHdpdGggc2lnbmFsc1xyXG4gIHJlYWRvbmx5IHJvb3RzID0gc2lnbmFsPFRyZWVOb2RlW10+KFtdKTtcclxuICByZWFkb25seSBmb2N1c2VkTm9kZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bWJlciB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5IGV4cGFuZGVkTm9kZUlkcyA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcclxuICByZWFkb25seSBhY3RpdmVOb2RlSWRzID0gc2lnbmFsPFNldDxzdHJpbmcgfCBudW1iZXI+PihuZXcgU2V0KCkpO1xyXG4gIHJlYWRvbmx5IHNlbGVjdGVkTm9kZUlkcyA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcclxuICByZWFkb25seSBoaWRkZW5Ob2RlSWRzID0gc2lnbmFsPFNldDxzdHJpbmcgfCBudW1iZXI+PihuZXcgU2V0KCkpO1xyXG4gIFxyXG4gIC8vIENvbXB1dGVkIHNpZ25hbHNcclxuICByZWFkb25seSBmb2N1c2VkTm9kZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mb2N1c2VkTm9kZUlkKCk7XHJcbiAgICByZXR1cm4gaWQgPyB0aGlzLmdldE5vZGVCeUlkKGlkKSA6IG51bGw7XHJcbiAgfSk7XHJcbiAgXHJcbiAgcmVhZG9ubHkgZXhwYW5kZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+IFxyXG4gICAgdGhpcy5nZXRBbGxOb2RlcygpLmZpbHRlcihub2RlID0+IFxyXG4gICAgICB0aGlzLmV4cGFuZGVkTm9kZUlkcygpLmhhcyhub2RlLmlkKVxyXG4gICAgKVxyXG4gICk7XHJcbiAgXHJcbiAgcmVhZG9ubHkgYWN0aXZlTm9kZXMgPSBjb21wdXRlZCgoKSA9PlxyXG4gICAgdGhpcy5nZXRBbGxOb2RlcygpLmZpbHRlcihub2RlID0+XHJcbiAgICAgIHRoaXMuYWN0aXZlTm9kZUlkcygpLmhhcyhub2RlLmlkKVxyXG4gICAgKVxyXG4gICk7XHJcbiAgXHJcbiAgcmVhZG9ubHkgc2VsZWN0ZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICB0aGlzLmdldEFsbE5vZGVzKCkuZmlsdGVyKG5vZGUgPT5cclxuICAgICAgdGhpcy5zZWxlY3RlZE5vZGVJZHMoKS5oYXMobm9kZS5pZClcclxuICAgIClcclxuICApO1xyXG4gIFxyXG4gIHJlYWRvbmx5IHZpc2libGVOb2RlcyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICB0aGlzLmdldEFsbE5vZGVzKCkuZmlsdGVyKG5vZGUgPT4gIW5vZGUuaXNIaWRkZW4oKSlcclxuICApO1xyXG4gIFxyXG4gIHJlYWRvbmx5IGZsYXR0ZW5lZE5vZGVzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZmxhdHRlbmVkOiBUcmVlTm9kZVtdID0gW107XHJcbiAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlczogVHJlZU5vZGVbXSkgPT4ge1xyXG4gICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgIGlmICghbm9kZS5pc0hpZGRlbigpKSB7XHJcbiAgICAgICAgICBmbGF0dGVuZWQucHVzaChub2RlKTtcclxuICAgICAgICAgIGlmIChub2RlLmlzRXhwYW5kZWQoKSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdHJhdmVyc2Uobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICB0cmF2ZXJzZSh0aGlzLnJvb3RzKCkpO1xyXG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcclxuICB9KTtcclxuICBcclxuICAvLyBFdmVudCBzdHJlYW1zXHJcbiAgcmVhZG9ubHkgZXZlbnRzJCA9IG5ldyBTdWJqZWN0PFRyZWVFdmVudD4oKTtcclxuICBcclxuICAvLyBWaXJ0dWFsIHJvb3QgZm9yIHVuaWZpZWQgaGFuZGxpbmdcclxuICB2aXJ0dWFsUm9vdDogVHJlZU5vZGUgfCBudWxsID0gbnVsbDtcclxuICBcclxuICAvLyBOb2RlIHJlZ2lzdHJ5IGZvciBxdWljayBsb29rdXBcclxuICBwcml2YXRlIG5vZGVSZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBUcmVlTm9kZT4oKTtcclxuICBcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJlZU9wdGlvbnMpIHtcclxuICAgIC8vIENvbnN0cnVjdG9yIHNpbiBlZmZlY3RzIC0gc2Ugc2luY3Jvbml6YW4gZW4gbGFzIG9wZXJhY2lvbmVzXHJcbiAgfVxyXG4gIFxyXG4gIC8vIERhdGEgbWFuYWdlbWVudFxyXG4gIHNldERhdGEoZGF0YTogYW55W10pOiB2b2lkIHtcclxuICAgIHRoaXMubm9kZVJlZ2lzdHJ5LmNsZWFyKCk7XHJcbiAgICBjb25zdCByb290cyA9IHRoaXMuYnVpbGROb2RlcyhkYXRhLCBudWxsLCAwKTtcclxuICAgIHRoaXMucm9vdHMuc2V0KHJvb3RzKTtcclxuICAgIHRoaXMuZW1pdEV2ZW50KHsgdHlwZTogJ2luaXRpYWxpemVkJywgdHJlZU1vZGVsOiB0aGlzIH0pO1xyXG4gIH1cclxuICBcclxuICBwcml2YXRlIGJ1aWxkTm9kZXMoXHJcbiAgICBkYXRhOiBhbnlbXSxcclxuICAgIHBhcmVudDogVHJlZU5vZGUgfCBudWxsLFxyXG4gICAgbGV2ZWw6IG51bWJlclxyXG4gICk6IFRyZWVOb2RlW10ge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gbmV3IFRyZWVOb2RlKGl0ZW0sIHBhcmVudCwgbGV2ZWwsIGluZGV4LCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICB0aGlzLm5vZGVSZWdpc3RyeS5zZXQobm9kZS5pZCwgbm9kZSk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZWN1cnNpdmVseSBidWlsZCBjaGlsZHJlblxyXG4gICAgICBjb25zdCBjaGlsZHJlbkRhdGEgPSBpdGVtW3RoaXMub3B0aW9ucy5jaGlsZHJlbkZpZWxkIHx8ICdjaGlsZHJlbiddO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbkRhdGEpICYmIGNoaWxkcmVuRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHRoaXMuYnVpbGROb2RlcyhjaGlsZHJlbkRhdGEsIG5vZGUsIGxldmVsICsgMSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIHVwZGF0ZSgpOiB2b2lkIHtcclxuICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBieSBjcmVhdGluZyBuZXcgc2lnbmFsIHZhbHVlc1xyXG4gICAgdGhpcy5yb290cy5zZXQoWy4uLnRoaXMucm9vdHMoKV0pO1xyXG4gICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAndXBkYXRlJywgdHJlZU1vZGVsOiB0aGlzIH0pO1xyXG4gIH1cclxuICBcclxuICAvLyBOb2RlIGxvb2t1cFxyXG4gIGdldE5vZGVCeUlkKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBUcmVlTm9kZSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubm9kZVJlZ2lzdHJ5LmdldChpZCkgfHwgbnVsbDtcclxuICB9XHJcbiAgXHJcbiAgZ2V0Tm9kZUJ5KHByZWRpY2F0ZTogKG5vZGU6IFRyZWVOb2RlKSA9PiBib29sZWFuKTogVHJlZU5vZGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmdldEFsbE5vZGVzKCkuZmluZChwcmVkaWNhdGUpIHx8IG51bGw7XHJcbiAgfVxyXG4gIFxyXG4gIGdldEFsbE5vZGVzKCk6IFRyZWVOb2RlW10ge1xyXG4gICAgY29uc3Qgbm9kZXM6IFRyZWVOb2RlW10gPSBbXTtcclxuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVMaXN0OiBUcmVlTm9kZVtdKSA9PiB7XHJcbiAgICAgIG5vZGVMaXN0LmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0cmF2ZXJzZShub2RlLmNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHRyYXZlcnNlKHRoaXMucm9vdHMoKSk7XHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIE5hdmlnYXRpb25cclxuICBmb2N1c05vZGUobm9kZTogVHJlZU5vZGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb2N1c2VkTm9kZSgpKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNlZE5vZGUoKSEuc2V0Rm9jdXMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGUpIHtcclxuICAgICAgdGhpcy5mb2N1c2VkTm9kZUlkLnNldChub2RlLmlkKTtcclxuICAgICAgbm9kZS5zZXRGb2N1cyh0cnVlKTtcclxuICAgICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnZm9jdXMnLCBub2RlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb2N1c2VkTm9kZUlkLnNldChudWxsKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZm9jdXNOZXh0Tm9kZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IHRoaXMuZmxhdHRlbmVkTm9kZXMoKTtcclxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZsYXR0ZW5lZC5maW5kSW5kZXgoXHJcbiAgICAgIG4gPT4gbi5pZCA9PT0gdGhpcy5mb2N1c2VkTm9kZUlkKClcclxuICAgICk7XHJcbiAgICBpZiAoY3VycmVudEluZGV4IDwgZmxhdHRlbmVkLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5mb2N1c05vZGUoZmxhdHRlbmVkW2N1cnJlbnRJbmRleCArIDFdKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZm9jdXNQcmV2aW91c05vZGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmbGF0dGVuZWQgPSB0aGlzLmZsYXR0ZW5lZE5vZGVzKCk7XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmbGF0dGVuZWQuZmluZEluZGV4KFxyXG4gICAgICBuID0+IG4uaWQgPT09IHRoaXMuZm9jdXNlZE5vZGVJZCgpXHJcbiAgICApO1xyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcclxuICAgICAgdGhpcy5mb2N1c05vZGUoZmxhdHRlbmVkW2N1cnJlbnRJbmRleCAtIDFdKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZm9jdXNEcmlsbERvd24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkTm9kZSgpO1xyXG4gICAgaWYgKGZvY3VzZWQpIHtcclxuICAgICAgaWYgKCFmb2N1c2VkLmlzRXhwYW5kZWQoKSAmJiBmb2N1c2VkLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgZm9jdXNlZC5leHBhbmQoKTtcclxuICAgICAgfSBlbHNlIGlmIChmb2N1c2VkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmZvY3VzTm9kZShmb2N1c2VkLmNoaWxkcmVuWzBdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBmb2N1c0RyaWxsVXAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkTm9kZSgpO1xyXG4gICAgaWYgKGZvY3VzZWQpIHtcclxuICAgICAgaWYgKGZvY3VzZWQuaXNFeHBhbmRlZCgpICYmIGZvY3VzZWQuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICBmb2N1c2VkLmNvbGxhcHNlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9jdXNlZC5wYXJlbnQpIHtcclxuICAgICAgICB0aGlzLmZvY3VzTm9kZShmb2N1c2VkLnBhcmVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gT3BlcmF0aW9uc1xyXG4gIGV4cGFuZEFsbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpLm1hcChuID0+IG4uaWQpKTtcclxuICAgIHRoaXMuZXhwYW5kZWROb2RlSWRzLnNldChpZHMpO1xyXG4gICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnZXhwYW5kQWxsJywgdHJlZU1vZGVsOiB0aGlzIH0pO1xyXG4gIH1cclxuICBcclxuICBjb2xsYXBzZUFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kZWROb2RlSWRzLnNldChuZXcgU2V0KCkpO1xyXG4gICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnY29sbGFwc2VBbGwnLCB0cmVlTW9kZWw6IHRoaXMgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIGV4cGFuZE5vZGUobm9kZTogVHJlZU5vZGUpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kZWROb2RlSWRzLnVwZGF0ZShpZHMgPT4ge1xyXG4gICAgICBjb25zdCBuZXdJZHMgPSBuZXcgU2V0KGlkcyk7XHJcbiAgICAgIG5ld0lkcy5hZGQobm9kZS5pZCk7XHJcbiAgICAgIHJldHVybiBuZXdJZHM7XHJcbiAgICB9KTtcclxuICAgIG5vZGUuaXNFeHBhbmRlZC5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmVtaXRFdmVudCh7IHR5cGU6ICdleHBhbmQnLCBub2RlIH0pO1xyXG4gIH1cclxuXHJcbiAgY29sbGFwc2VOb2RlKG5vZGU6IFRyZWVOb2RlKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGVkTm9kZUlkcy51cGRhdGUoaWRzID0+IHtcclxuICAgICAgY29uc3QgbmV3SWRzID0gbmV3IFNldChpZHMpO1xyXG4gICAgICBuZXdJZHMuZGVsZXRlKG5vZGUuaWQpO1xyXG4gICAgICByZXR1cm4gbmV3SWRzO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmlzRXhwYW5kZWQuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMuZW1pdEV2ZW50KHsgdHlwZTogJ2NvbGxhcHNlJywgbm9kZSB9KTtcclxuICB9XHJcblxyXG4gIGFjdGl2YXRlTm9kZShub2RlOiBUcmVlTm9kZSwgbXVsdGk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgaWYgKCFtdWx0aSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU5vZGVJZHMuc2V0KG5ldyBTZXQoW25vZGUuaWRdKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsTm9kZXMoKS5mb3JFYWNoKG4gPT4gbi5pc0FjdGl2ZS5zZXQobi5pZCA9PT0gbm9kZS5pZCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVOb2RlSWRzLnVwZGF0ZShpZHMgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0lkcyA9IG5ldyBTZXQoaWRzKTtcclxuICAgICAgICBuZXdJZHMuYWRkKG5vZGUuaWQpO1xyXG4gICAgICAgIHJldHVybiBuZXdJZHM7XHJcbiAgICAgIH0pO1xyXG4gICAgICBub2RlLmlzQWN0aXZlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdEV2ZW50KHsgdHlwZTogJ2FjdGl2YXRlJywgbm9kZSB9KTtcclxuICB9XHJcbiAgXHJcbiAgZGVhY3RpdmF0ZU5vZGUobm9kZTogVHJlZU5vZGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlTm9kZUlkcy51cGRhdGUoaWRzID0+IHtcclxuICAgICAgY29uc3QgbmV3SWRzID0gbmV3IFNldChpZHMpO1xyXG4gICAgICBuZXdJZHMuZGVsZXRlKG5vZGUuaWQpO1xyXG4gICAgICByZXR1cm4gbmV3SWRzO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmlzQWN0aXZlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmVtaXRFdmVudCh7IHR5cGU6ICdkZWFjdGl2YXRlJywgbm9kZSB9KTtcclxuICB9XHJcbiAgXHJcbiAgc2VsZWN0Tm9kZShub2RlOiBUcmVlTm9kZSwgbXVsdGk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgaWYgKCFtdWx0aSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZUlkcy5zZXQobmV3IFNldChbbm9kZS5pZF0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlSWRzLnVwZGF0ZShpZHMgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0lkcyA9IG5ldyBTZXQoaWRzKTtcclxuICAgICAgICBpZiAoaWRzLmhhcyhub2RlLmlkKSkge1xyXG4gICAgICAgICAgbmV3SWRzLmRlbGV0ZShub2RlLmlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3SWRzLmFkZChub2RlLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ld0lkcztcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVtaXRFdmVudCh7IHR5cGU6ICdzZWxlY3QnLCBub2RlIH0pO1xyXG4gIH1cclxuICBcclxuICAvLyBGaWx0ZXJpbmdcclxuICBmaWx0ZXJOb2RlcyhmaWx0ZXJGbjogKG5vZGU6IFRyZWVOb2RlKSA9PiBib29sZWFuLCBhdXRvU2hvdyA9IHRydWUpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhpZGRlbklkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xyXG4gICAgXHJcbiAgICB0aGlzLmdldEFsbE5vZGVzKCkuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGZpbHRlckZuKG5vZGUpO1xyXG4gICAgICBpZiAoIW1hdGNoZXMpIHtcclxuICAgICAgICBoaWRkZW5JZHMuYWRkKG5vZGUuaWQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGF1dG9TaG93KSB7XHJcbiAgICAgICAgLy8gU2hvdyBhbmNlc3RvcnMgb2YgbWF0Y2hpbmcgbm9kZXNcclxuICAgICAgICBub2RlLmdldEFuY2VzdG9ycygpLmZvckVhY2goYW5jZXN0b3IgPT4ge1xyXG4gICAgICAgICAgaGlkZGVuSWRzLmRlbGV0ZShhbmNlc3Rvci5pZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB0aGlzLmhpZGRlbk5vZGVJZHMuc2V0KGhpZGRlbklkcyk7XHJcbiAgICB0aGlzLmVtaXRFdmVudCh7IHR5cGU6ICdmaWx0ZXInLCB0cmVlTW9kZWw6IHRoaXMgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIGNsZWFyRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRkZW5Ob2RlSWRzLnNldChuZXcgU2V0KCkpO1xyXG4gICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnY2xlYXJGaWx0ZXInLCB0cmVlTW9kZWw6IHRoaXMgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIERyYWcgJiBEcm9wXHJcbiAgY2FuTW92ZU5vZGUoXHJcbiAgICBub2RlOiBUcmVlTm9kZSxcclxuICAgIHRvOiB7IHBhcmVudDogVHJlZU5vZGU7IGluZGV4OiBudW1iZXIgfVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgLy8gUHJldmVudCBtb3ZpbmcgdG8gaXRzZWxmIG9yIGRlc2NlbmRhbnRzXHJcbiAgICBpZiAobm9kZSA9PT0gdG8ucGFyZW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodG8ucGFyZW50LmdldEFuY2VzdG9ycygpLmluY2x1ZGVzKG5vZGUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBcclxuICAgIC8vIEN1c3RvbSB2YWxpZGF0aW9uXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93RHJvcCkge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJvcChub2RlLCB0byk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3A7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICBcclxuICBtb3ZlTm9kZShub2RlOiBUcmVlTm9kZSwgdG86IHsgcGFyZW50OiBUcmVlTm9kZTsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuTW92ZU5vZGUobm9kZSwgdG8pKSByZXR1cm47XHJcblxyXG4gICAgLy8gUmVtb3ZlIGZyb20gb2xkIHBhcmVudFxyXG4gICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gbm9kZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcclxuICAgICAgaWYgKG9sZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgYXJyYXkgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgICAgbm9kZS5wYXJlbnQuY2hpbGRyZW4gPSBbXHJcbiAgICAgICAgICAuLi5ub2RlLnBhcmVudC5jaGlsZHJlbi5zbGljZSgwLCBvbGRJbmRleCksXHJcbiAgICAgICAgICAuLi5ub2RlLnBhcmVudC5jaGlsZHJlbi5zbGljZShvbGRJbmRleCArIDEpXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSGFuZGxlIHJvb3Qgbm9kZXNcclxuICAgICAgY29uc3Qgcm9vdEluZGV4ID0gdGhpcy5yb290cygpLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIGlmIChyb290SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5yb290cy5zZXQoW1xyXG4gICAgICAgICAgLi4udGhpcy5yb290cygpLnNsaWNlKDAsIHJvb3RJbmRleCksXHJcbiAgICAgICAgICAuLi50aGlzLnJvb3RzKCkuc2xpY2Uocm9vdEluZGV4ICsgMSlcclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCB0byBuZXcgcGFyZW50IC0gY3JlYXRlIG5ldyBhcnJheSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgIGNvbnN0IG5ld0NoaWxkcmVuID0gWy4uLnRvLnBhcmVudC5jaGlsZHJlbl07XHJcbiAgICBuZXdDaGlsZHJlbi5zcGxpY2UodG8uaW5kZXgsIDAsIG5vZGUpO1xyXG4gICAgdG8ucGFyZW50LmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XHJcbiAgICBub2RlLnBhcmVudCA9IHRvLnBhcmVudDtcclxuXHJcbiAgICAvLyBVcGRhdGUgbGV2ZWxzXHJcbiAgICB0aGlzLnVwZGF0ZU5vZGVMZXZlbHMobm9kZSk7XHJcblxyXG4gICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnbW92ZU5vZGUnLCBub2RlLCB0byB9KTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgdXBkYXRlTm9kZUxldmVscyhub2RlOiBUcmVlTm9kZSk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV3TGV2ZWwgPSBub2RlLnBhcmVudCA/IG5vZGUucGFyZW50LmxldmVsICsgMSA6IDA7XHJcbiAgICBub2RlLmxldmVsID0gbmV3TGV2ZWw7XHJcbiAgICBcclxuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB0aGlzLnVwZGF0ZU5vZGVMZXZlbHMoY2hpbGQpKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gQXN5bmMgY2hpbGRyZW4gbG9hZGluZ1xyXG4gIGFzeW5jIGxvYWRDaGlsZHJlbihub2RlOiBUcmVlTm9kZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZ2V0Q2hpbGRyZW4pIHJldHVybjtcclxuICAgIFxyXG4gICAgbm9kZS5zZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjaGlsZHJlbkRhdGEgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ2V0Q2hpbGRyZW4obm9kZSk7XHJcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLmJ1aWxkTm9kZXMoY2hpbGRyZW5EYXRhLCBub2RlLCBub2RlLmxldmVsICsgMSk7XHJcbiAgICAgIG5vZGUuaGFzQ2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDA7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmVtaXRFdmVudCh7IHR5cGU6ICdsb2FkQ2hpbGRyZW4nLCBub2RlIH0pO1xyXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5lbWl0RXZlbnQoeyB0eXBlOiAnbG9hZENoaWxkcmVuRXJyb3InLCBub2RlLCBlcnJvciB9KTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIG5vZGUuc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8vIEV2ZW50c1xyXG4gIHByaXZhdGUgZW1pdEV2ZW50KGV2ZW50OiBUcmVlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZXZlbnRzJC5uZXh0KGV2ZW50KTtcclxuICB9XHJcbn0iXX0=
@@ -0,0 +1,27 @@
1
+ // lib/core/services/tree-drag-drop.service.ts
2
+ import { Injectable, signal } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class TreeDragDropService {
5
+ draggedNode = signal(null);
6
+ setDraggedNode(node) {
7
+ this.draggedNode.set(node);
8
+ }
9
+ getDraggedNode() {
10
+ return this.draggedNode();
11
+ }
12
+ clearDraggedNode() {
13
+ this.draggedNode.set(null);
14
+ }
15
+ isDragging() {
16
+ return this.draggedNode() !== null;
17
+ }
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropService, providedIn: 'root' });
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropService, decorators: [{
22
+ type: Injectable,
23
+ args: [{
24
+ providedIn: 'root',
25
+ }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWRyb3Auc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by10cmVlL2NvcmUvc2VydmljZXMvdHJlZS1kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTW5ELE1BQU0sT0FBTyxtQkFBbUI7SUFDYixXQUFXLEdBQUcsTUFBTSxDQUFrQixJQUFJLENBQUMsQ0FBQztJQUU5RCxjQUFjLENBQUMsSUFBYztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQztJQUNyQyxDQUFDO3dHQWpCVSxtQkFBbUI7NEdBQW5CLG1CQUFtQixjQUZsQixNQUFNOzs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbGliL2NvcmUvc2VydmljZXMvdHJlZS1kcmFnLWRyb3Auc2VydmljZS50c1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS1ub2RlLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlRHJhZ0Ryb3BTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdnZWROb2RlID0gc2lnbmFsPFRyZWVOb2RlIHwgbnVsbD4obnVsbCk7XHJcbiAgXHJcbiBzZXREcmFnZ2VkTm9kZShub2RlOiBUcmVlTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFnZ2VkTm9kZS5zZXQobm9kZSk7XHJcbiAgfVxyXG4gIFxyXG4gIGdldERyYWdnZWROb2RlKCk6IFRyZWVOb2RlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2VkTm9kZSgpO1xyXG4gIH1cclxuICBcclxuICBjbGVhckRyYWdnZWROb2RlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFnZ2VkTm9kZS5zZXQobnVsbCk7XHJcbiAgfVxyXG4gIFxyXG4gIGlzRHJhZ2dpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2VkTm9kZSgpICE9PSBudWxsO1xyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,69 @@
1
+ // lib/directives/tree-drag.directive.ts
2
+ import { Directive, Input, HostListener, HostBinding, ElementRef, inject, // Add inject
3
+ } from '@angular/core';
4
+ import { TreeDragDropService } from '../core/services/tree-drag-drop.service';
5
+ import * as i0 from "@angular/core";
6
+ export class TreeDragDirective {
7
+ node;
8
+ treeModel;
9
+ options;
10
+ // Use inject() function instead of constructor injection
11
+ elementRef = inject(ElementRef);
12
+ dragDropService = inject(TreeDragDropService);
13
+ get draggable() {
14
+ if (typeof this.options.allowDrag === 'function') {
15
+ return this.options.allowDrag(this.node);
16
+ }
17
+ return this.options.allowDrag || false;
18
+ }
19
+ onDragStart(event) {
20
+ if (!this.draggable) {
21
+ event.preventDefault();
22
+ return;
23
+ }
24
+ this.dragDropService.setDraggedNode(this.node);
25
+ if (event.dataTransfer) {
26
+ event.dataTransfer.effectAllowed = 'move';
27
+ event.dataTransfer.setData('text/plain', this.node.id.toString());
28
+ // Create drag image
29
+ const dragImage = this.elementRef.nativeElement.cloneNode(true);
30
+ dragImage.style.opacity = '0.7';
31
+ document.body.appendChild(dragImage);
32
+ event.dataTransfer.setDragImage(dragImage, 0, 0);
33
+ setTimeout(() => document.body.removeChild(dragImage), 0);
34
+ }
35
+ this.elementRef.nativeElement.classList.add('tree-node-dragging');
36
+ }
37
+ onDragEnd(event) {
38
+ this.dragDropService.clearDraggedNode();
39
+ this.elementRef.nativeElement.classList.remove('tree-node-dragging');
40
+ }
41
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
42
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TreeDragDirective, isStandalone: true, selector: "[treeDrag]", inputs: { node: ["treeDrag", "node"], treeModel: "treeModel", options: "options" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDirective, decorators: [{
45
+ type: Directive,
46
+ args: [{
47
+ selector: '[treeDrag]',
48
+ standalone: true,
49
+ }]
50
+ }], propDecorators: { node: [{
51
+ type: Input,
52
+ args: [{ required: true, alias: 'treeDrag' }]
53
+ }], treeModel: [{
54
+ type: Input,
55
+ args: [{ required: true }]
56
+ }], options: [{
57
+ type: Input,
58
+ args: [{ required: true }]
59
+ }], draggable: [{
60
+ type: HostBinding,
61
+ args: ['attr.draggable']
62
+ }], onDragStart: [{
63
+ type: HostListener,
64
+ args: ['dragstart', ['$event']]
65
+ }], onDragEnd: [{
66
+ type: HostListener,
67
+ args: ['dragend', ['$event']]
68
+ }] } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by10cmVlL2RpcmVjdGl2ZXMvdHJlZS1kcmFnLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLFdBQVcsRUFDWCxVQUFVLEVBQ1YsTUFBTSxFQUFFLGFBQWE7RUFDdEIsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7O0FBTTlFLE1BQU0sT0FBTyxpQkFBaUI7SUFDa0IsSUFBSSxDQUFZO0lBQ25DLFNBQVMsQ0FBYTtJQUN0QixPQUFPLENBQWU7SUFFakQseURBQXlEO0lBQ3hDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRS9ELElBQ0ksU0FBUztRQUNYLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDekMsQ0FBQztJQUdELFdBQVcsQ0FBQyxLQUFnQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDMUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFbEUsb0JBQW9CO1lBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWdCLENBQUM7WUFDL0UsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFakQsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUdELFNBQVMsQ0FBQyxLQUFnQjtRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7d0dBOUNVLGlCQUFpQjs0RkFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBRStDLElBQUk7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7Z0JBQ2pCLFNBQVM7c0JBQW5DLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLE9BQU87c0JBQWpDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU9yQixTQUFTO3NCQURaLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQVM3QixXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTBCckMsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGxpYi9kaXJlY3RpdmVzL3RyZWUtZHJhZy5kaXJlY3RpdmUudHNcclxuaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgSW5wdXQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgaW5qZWN0LCAvLyBBZGQgaW5qZWN0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi4vY29yZS9tb2RlbHMvdHJlZS1ub2RlLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU1vZGVsIH0gZnJvbSAnLi4vY29yZS9tb2RlbHMvdHJlZS5tb2RlbCc7XHJcbmltcG9ydCB7IFRyZWVPcHRpb25zIH0gZnJvbSAnLi4vY29yZS9tb2RlbHMvdHJlZS1vcHRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZURyYWdEcm9wU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvdHJlZS1kcmFnLWRyb3Auc2VydmljZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t0cmVlRHJhZ10nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlRHJhZ0RpcmVjdGl2ZSB7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUsIGFsaWFzOiAndHJlZURyYWcnIH0pIG5vZGUhOiBUcmVlTm9kZTtcclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB0cmVlTW9kZWwhOiBUcmVlTW9kZWw7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgb3B0aW9ucyE6IFRyZWVPcHRpb25zO1xyXG4gIFxyXG4gIC8vIFVzZSBpbmplY3QoKSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9yIGluamVjdGlvblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdEcm9wU2VydmljZSA9IGluamVjdChUcmVlRHJhZ0Ryb3BTZXJ2aWNlKTtcclxuICBcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJylcclxuICBnZXQgZHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnKHRoaXMubm9kZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZyB8fCBmYWxzZTtcclxuICB9XHJcbiAgXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcclxuICBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZHJhZ2dhYmxlKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5kcmFnRHJvcFNlcnZpY2Uuc2V0RHJhZ2dlZE5vZGUodGhpcy5ub2RlKTtcclxuICAgIFxyXG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xyXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCB0aGlzLm5vZGUuaWQudG9TdHJpbmcoKSk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgZHJhZyBpbWFnZVxyXG4gICAgICBjb25zdCBkcmFnSW1hZ2UgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGRyYWdJbWFnZS5zdHlsZS5vcGFjaXR5ID0gJzAuNyc7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHJhZ0ltYWdlKTtcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShkcmFnSW1hZ2UsIDAsIDApO1xyXG4gICAgICBcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRyYWdJbWFnZSksIDApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0cmVlLW5vZGUtZHJhZ2dpbmcnKTtcclxuICB9XHJcbiAgXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2VuZCcsIFsnJGV2ZW50J10pXHJcbiAgb25EcmFnRW5kKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNsZWFyRHJhZ2dlZE5vZGUoKTtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RyZWUtbm9kZS1kcmFnZ2luZycpO1xyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,124 @@
1
+ // lib/directives/tree-drop.directive.ts
2
+ import { Directive, Input, HostListener, HostBinding, ElementRef, signal, inject, // Add inject
3
+ } from '@angular/core';
4
+ import { TreeDragDropService } from '../core/services/tree-drag-drop.service';
5
+ import * as i0 from "@angular/core";
6
+ export class TreeDropDirective {
7
+ node;
8
+ treeModel;
9
+ options;
10
+ dropPosition = 'inside';
11
+ // Use inject() function instead of constructor injection
12
+ elementRef = inject(ElementRef);
13
+ dragDropService = inject(TreeDragDropService);
14
+ isDraggingOver = signal(false);
15
+ canDrop = signal(false);
16
+ get isDropTarget() {
17
+ return this.isDraggingOver() && this.canDrop();
18
+ }
19
+ get isDropDisabled() {
20
+ return this.isDraggingOver() && !this.canDrop();
21
+ }
22
+ onDragEnter(event) {
23
+ event.preventDefault();
24
+ const draggedNode = this.dragDropService.getDraggedNode();
25
+ if (!draggedNode)
26
+ return;
27
+ this.isDraggingOver.set(true);
28
+ const dropTarget = this.getDropTarget();
29
+ const canDrop = this.treeModel.canMoveNode(draggedNode, dropTarget);
30
+ this.canDrop.set(canDrop);
31
+ if (canDrop && event.dataTransfer) {
32
+ event.dataTransfer.dropEffect = 'move';
33
+ }
34
+ }
35
+ onDragOver(event) {
36
+ if (this.canDrop()) {
37
+ event.preventDefault();
38
+ if (event.dataTransfer) {
39
+ event.dataTransfer.dropEffect = 'move';
40
+ }
41
+ }
42
+ }
43
+ onDragLeave(event) {
44
+ // Check if we're really leaving (not just entering a child element)
45
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
46
+ const x = event.clientX;
47
+ const y = event.clientY;
48
+ if (x < rect.left || x >= rect.right || y < rect.top || y >= rect.bottom) {
49
+ this.isDraggingOver.set(false);
50
+ this.canDrop.set(false);
51
+ }
52
+ }
53
+ onDrop(event) {
54
+ event.preventDefault();
55
+ event.stopPropagation();
56
+ const draggedNode = this.dragDropService.getDraggedNode();
57
+ if (!draggedNode || !this.canDrop())
58
+ return;
59
+ const dropTarget = this.getDropTarget();
60
+ this.treeModel.moveNode(draggedNode, dropTarget);
61
+ this.isDraggingOver.set(false);
62
+ this.canDrop.set(false);
63
+ this.dragDropService.clearDraggedNode();
64
+ }
65
+ getDropTarget() {
66
+ switch (this.dropPosition) {
67
+ case 'before':
68
+ return {
69
+ parent: this.node.parent,
70
+ index: this.node.index,
71
+ };
72
+ case 'after':
73
+ return {
74
+ parent: this.node.parent,
75
+ index: this.node.index + 1,
76
+ };
77
+ case 'inside':
78
+ default:
79
+ return {
80
+ parent: this.node,
81
+ index: this.node.children.length,
82
+ };
83
+ }
84
+ }
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDropDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
86
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TreeDropDirective, isStandalone: true, selector: "[treeDrop]", inputs: { node: ["treeDrop", "node"], treeModel: "treeModel", options: "options", dropPosition: "dropPosition" }, host: { listeners: { "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, properties: { "class.tree-drop-target": "this.isDropTarget", "class.tree-drop-disabled": "this.isDropDisabled" } }, ngImport: i0 });
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDropDirective, decorators: [{
89
+ type: Directive,
90
+ args: [{
91
+ selector: '[treeDrop]',
92
+ standalone: true,
93
+ }]
94
+ }], propDecorators: { node: [{
95
+ type: Input,
96
+ args: [{ required: true, alias: 'treeDrop' }]
97
+ }], treeModel: [{
98
+ type: Input,
99
+ args: [{ required: true }]
100
+ }], options: [{
101
+ type: Input,
102
+ args: [{ required: true }]
103
+ }], dropPosition: [{
104
+ type: Input
105
+ }], isDropTarget: [{
106
+ type: HostBinding,
107
+ args: ['class.tree-drop-target']
108
+ }], isDropDisabled: [{
109
+ type: HostBinding,
110
+ args: ['class.tree-drop-disabled']
111
+ }], onDragEnter: [{
112
+ type: HostListener,
113
+ args: ['dragenter', ['$event']]
114
+ }], onDragOver: [{
115
+ type: HostListener,
116
+ args: ['dragover', ['$event']]
117
+ }], onDragLeave: [{
118
+ type: HostListener,
119
+ args: ['dragleave', ['$event']]
120
+ }], onDrop: [{
121
+ type: HostListener,
122
+ args: ['drop', ['$event']]
123
+ }] } });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by10cmVlL2RpcmVjdGl2ZXMvdHJlZS1kcm9wLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLFdBQVcsRUFDWCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFBRSxhQUFhO0VBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQVE5RSxNQUFNLE9BQU8saUJBQWlCO0lBQ2tCLElBQUksQ0FBWTtJQUNuQyxTQUFTLENBQWE7SUFDdEIsT0FBTyxDQUFlO0lBQ3hDLFlBQVksR0FBaUIsUUFBUSxDQUFDO0lBRS9DLHlEQUF5RDtJQUN4QyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLGVBQWUsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV0RCxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakMsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUNJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUdELFdBQVcsQ0FBQyxLQUFnQjtRQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkIsTUFBTSxXQUFXLEdB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LENBQUM7aUJBQzNCLENBQUM7WUFDSixLQUFLLFFBQVEsQ0FBQztZQUNkO2dCQUNFLE9BQU87b0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtpQkFDakMsQ0FBQztRQUNOLENBQUM7SUFDSCxDQUFDO3dHQW5HVSxpQkFBaUI7NEZBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFKN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUUrQyxJQUFJO3NCQUFqRCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUNqQixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxPQUFPO3NCQUFqQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsWUFBWTtzQkFBcEIsS0FBSztnQkFVRixZQUFZO3NCQURmLFdBQVc7dUJBQUMsd0JBQXdCO2dCQU1qQyxjQUFjO3NCQURqQixXQUFXO3VCQUFDLDBCQUEwQjtnQkFNdkMsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQnJDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV3BDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBY3JDLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBsaWIvZGlyZWN0aXZlcy90cmVlLWRyb3AuZGlyZWN0aXZlLnRzXHJcbmltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIElucHV0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBIb3N0QmluZGluZyxcclxuICBFbGVtZW50UmVmLFxyXG4gIHNpZ25hbCxcclxuICBpbmplY3QsIC8vIEFkZCBpbmplY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuLi9jb3JlL21vZGVscy90cmVlLW5vZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmVlTW9kZWwgfSBmcm9tICcuLi9jb3JlL21vZGVscy90cmVlLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmVlRHJhZ0Ryb3BTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZXJ2aWNlcy90cmVlLWRyYWctZHJvcC5zZXJ2aWNlJztcclxuXHJcbnR5cGUgRHJvcFBvc2l0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2luc2lkZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t0cmVlRHJvcF0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlRHJvcERpcmVjdGl2ZSB7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUsIGFsaWFzOiAndHJlZURyb3AnIH0pIG5vZGUhOiBUcmVlTm9kZTtcclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB0cmVlTW9kZWwhOiBUcmVlTW9kZWw7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgb3B0aW9ucyE6IFRyZWVPcHRpb25zO1xyXG4gIEBJbnB1dCgpIGRyb3BQb3NpdGlvbjogRHJvcFBvc2l0aW9uID0gJ2luc2lkZSc7XHJcbiAgXHJcbiAgLy8gVXNlIGluamVjdCgpIGZ1bmN0aW9uIGluc3RlYWQgb2YgY29uc3RydWN0b3IgaW5qZWN0aW9uXHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0Ryb3BTZXJ2aWNlID0gaW5qZWN0KFRyZWVEcmFnRHJvcFNlcnZpY2UpO1xyXG4gIFxyXG4gIHJlYWRvbmx5IGlzRHJhZ2dpbmdPdmVyID0gc2lnbmFsKGZhbHNlKTtcclxuICByZWFkb25seSBjYW5Ecm9wID0gc2lnbmFsKGZhbHNlKTtcclxuICBcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRyZWUtZHJvcC10YXJnZXQnKVxyXG4gIGdldCBpc0Ryb3BUYXJnZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0RyYWdnaW5nT3ZlcigpICYmIHRoaXMuY2FuRHJvcCgpO1xyXG4gIH1cclxuICBcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRyZWUtZHJvcC1kaXNhYmxlZCcpXHJcbiAgZ2V0IGlzRHJvcERpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ092ZXIoKSAmJiAhdGhpcy5jYW5Ecm9wKCk7XHJcbiAgfVxyXG4gIFxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdlbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIFxyXG4gICAgY29uc3QgZHJhZ2dlZE5vZGUgPSB0aGlzLmRyYWdEcm9wU2VydmljZS5nZXREcmFnZ2VkTm9kZSgpO1xyXG4gICAgaWYgKCFkcmFnZ2VkTm9kZSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICB0aGlzLmlzRHJhZ2dpbmdPdmVyLnNldCh0cnVlKTtcclxuICAgIFxyXG4gICAgY29uc3QgZHJvcFRhcmdldCA9IHRoaXMuZ2V0RHJvcFRhcmdldCgpO1xyXG4gICAgY29uc3QgY2FuRHJvcCA9IHRoaXMudHJlZU1vZGVsLmNhbk1vdmVOb2RlKGRyYWdnZWROb2RlLCBkcm9wVGFyZ2V0KTtcclxuICAgIHRoaXMuY2FuRHJvcC5zZXQoY2FuRHJvcCk7XHJcbiAgICBcclxuICAgIGlmIChjYW5Ecm9wICYmIGV2ZW50LmRhdGFUcmFuc2Zlcikge1xyXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxyXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuRHJvcCgpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcclxuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIENoZWNrIGlmIHdlJ3JlIHJlYWxseSBsZWF2aW5nIChub3QganVzdCBlbnRlcmluZyBhIGNoaWxkIGVsZW1lbnQpXHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcclxuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgXHJcbiAgICBpZiAoeCA8IHJlY3QubGVmdCB8fCB4ID49IHJlY3QucmlnaHQgfHwgeSA8IHJlY3QudG9wIHx8IHkgPj0gcmVjdC5ib3R0b20pIHtcclxuICAgICAgdGhpcy5pc0RyYWdnaW5nT3Zlci5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmNhbkRyb3Auc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIFxyXG4gICAgY29uc3QgZHJhZ2dlZE5vZGUgPSB0aGlzLmRyYWdEcm9wU2VydmljZS5nZXREcmFnZ2VkTm9kZSgpO1xyXG4gICAgaWYgKCFkcmFnZ2VkTm9kZSB8fCAhdGhpcy5jYW5Ecm9wKCkpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgZHJvcFRhcmdldCA9IHRoaXMuZ2V0RHJvcFRhcmdldCgpO1xyXG4gICAgdGhpcy50cmVlTW9kZWwubW92ZU5vZGUoZHJhZ2dlZE5vZGUsIGRyb3BUYXJnZXQpO1xyXG4gICAgXHJcbiAgICB0aGlzLmlzRHJhZ2dpbmdPdmVyLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmNhbkRyb3Auc2V0KGZhbHNlKTtcclxuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNsZWFyRHJhZ2dlZE5vZGUoKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0KCk6IHsgcGFyZW50OiBUcmVlTm9kZTsgaW5kZXg6IG51bWJlciB9IHtcclxuICAgIHN3aXRjaCAodGhpcy5kcm9wUG9zaXRpb24pIHtcclxuICAgICAgY2FzZSAnYmVmb3JlJzpcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcGFyZW50OiB0aGlzLm5vZGUucGFyZW50ISxcclxuICAgICAgICAgIGluZGV4OiB0aGlzLm5vZGUuaW5kZXgsXHJcbiAgICAgICAgfTtcclxuICAgICAgY2FzZSAnYWZ0ZXInOlxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMubm9kZS5wYXJlbnQhLFxyXG4gICAgICAgICAgaW5kZXg6IHRoaXMubm9kZS5pbmRleCArIDEsXHJcbiAgICAgICAgfTtcclxuICAgICAgY2FzZSAnaW5zaWRlJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcGFyZW50OiB0aGlzLm5vZGUsXHJcbiAgICAgICAgICBpbmRleDogdGhpcy5ub2RlLmNoaWxkcmVuLmxlbmd0aCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,19 @@
1
+ // lib/directives/tree-node-template.directive.ts
2
+ import { Directive } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class TreeNodeTemplateDirective {
5
+ template;
6
+ constructor(template) {
7
+ this.template = template;
8
+ }
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
10
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TreeNodeTemplateDirective, isStandalone: true, selector: "[treeNodeTemplate]", ngImport: i0 });
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeTemplateDirective, decorators: [{
13
+ type: Directive,
14
+ args: [{
15
+ selector: '[treeNodeTemplate]',
16
+ standalone: true,
17
+ }]
18
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLXRlbXBsYXRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by10cmVlL2RpcmVjdGl2ZXMvdHJlZS1ub2RlLXRlbXBsYXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBZSxNQUFNLGVBQWUsQ0FBQzs7QUFNdkQsTUFBTSxPQUFPLHlCQUF5QjtJQUNqQjtJQUFuQixZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFHLENBQUM7d0dBRHRDLHlCQUF5Qjs0RkFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQUpyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGxpYi9kaXJlY3RpdmVzL3RyZWUtbm9kZS10ZW1wbGF0ZS5kaXJlY3RpdmUudHNcclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbdHJlZU5vZGVUZW1wbGF0ZV0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlTm9kZVRlbXBsYXRlRGlyZWN0aXZlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XHJcbn0iXX0=