@memberjunction/ng-trees 5.9.0 → 5.10.1
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.
|
@@ -869,7 +869,7 @@ export class TreeComponent {
|
|
|
869
869
|
ResultType: 'simple',
|
|
870
870
|
CacheLocal: config.CacheLocal ?? true
|
|
871
871
|
});
|
|
872
|
-
console.
|
|
872
|
+
console.debug('[TreeComponent] Branches query result:', {
|
|
873
873
|
entityName: config.EntityName,
|
|
874
874
|
filter: config.ExtraFilter || '(none)',
|
|
875
875
|
cacheLocal: config.CacheLocal ?? true,
|
|
@@ -894,7 +894,7 @@ export class TreeComponent {
|
|
|
894
894
|
ResultType: 'simple',
|
|
895
895
|
CacheLocal: config.CacheLocal ?? true
|
|
896
896
|
});
|
|
897
|
-
console.
|
|
897
|
+
console.debug('[TreeComponent] Leaves query result:', {
|
|
898
898
|
entityName: config.EntityName,
|
|
899
899
|
filter: config.ExtraFilter || '(none)',
|
|
900
900
|
cacheLocal: config.CacheLocal ?? true,
|
|
@@ -921,7 +921,7 @@ export class TreeComponent {
|
|
|
921
921
|
ResultType: 'simple',
|
|
922
922
|
CacheLocal: junctionConfig.CacheLocal ?? true
|
|
923
923
|
});
|
|
924
|
-
console.
|
|
924
|
+
console.debug('[TreeComponent] Junction query result:', {
|
|
925
925
|
entityName: junctionConfig.EntityName,
|
|
926
926
|
filter: junctionConfig.ExtraFilter || '(none)',
|
|
927
927
|
cacheLocal: junctionConfig.CacheLocal ?? true,
|
|
@@ -944,7 +944,7 @@ export class TreeComponent {
|
|
|
944
944
|
ResultType: 'simple',
|
|
945
945
|
CacheLocal: indirect.CacheLocal ?? true
|
|
946
946
|
});
|
|
947
|
-
console.
|
|
947
|
+
console.debug('[TreeComponent] Intermediate entity query result:', {
|
|
948
948
|
entityName: indirect.IntermediateEntity,
|
|
949
949
|
filter: indirect.ExtraFilter || '(none)',
|
|
950
950
|
cacheLocal: indirect.CacheLocal ?? true,
|
|
@@ -965,7 +965,7 @@ export class TreeComponent {
|
|
|
965
965
|
intermediateToLeaf.set(intermediateId, leafId);
|
|
966
966
|
}
|
|
967
967
|
}
|
|
968
|
-
console.
|
|
968
|
+
console.debug('[TreeComponent] Intermediate to leaf mapping:', {
|
|
969
969
|
mapSize: intermediateToLeaf.size,
|
|
970
970
|
entries: Array.from(intermediateToLeaf.entries())
|
|
971
971
|
});
|
|
@@ -1003,7 +1003,7 @@ export class TreeComponent {
|
|
|
1003
1003
|
}
|
|
1004
1004
|
}
|
|
1005
1005
|
}
|
|
1006
|
-
console.
|
|
1006
|
+
console.debug('[TreeComponent] Final junction mappings (leafId -> branchIds):', {
|
|
1007
1007
|
mapSize: mappings.size,
|
|
1008
1008
|
entries: Array.from(mappings.entries())
|
|
1009
1009
|
});
|
|
@@ -1071,7 +1071,7 @@ export class TreeComponent {
|
|
|
1071
1071
|
const parentField = config.ParentField;
|
|
1072
1072
|
const displayField = config.DisplayField || 'Name';
|
|
1073
1073
|
const useJunction = !!junctionMappings && junctionMappings.size > 0;
|
|
1074
|
-
console.
|
|
1074
|
+
console.debug('[TreeComponent] attachLeavesToBranches input:', {
|
|
1075
1075
|
leafDataCount: leafData.length,
|
|
1076
1076
|
leafIds: leafData.map((d) => ({ id: d[idField], name: d[displayField] })),
|
|
1077
1077
|
branchMapKeys: Array.from(branchMap.keys()),
|
|
@@ -1085,7 +1085,7 @@ export class TreeComponent {
|
|
|
1085
1085
|
const id = String(data[idField] || '');
|
|
1086
1086
|
// If using junction mappings, only include leaves that have junction entries
|
|
1087
1087
|
if (useJunction && !junctionMappings.has(id)) {
|
|
1088
|
-
console.
|
|
1088
|
+
console.debug(`[TreeComponent] Skipping leaf ${id} (${data[displayField]}) - not in junction mappings`);
|
|
1089
1089
|
continue; // Skip leaves not in any branch via junction
|
|
1090
1090
|
}
|
|
1091
1091
|
const leaf = createDefaultTreeNode({
|
|
@@ -1100,16 +1100,16 @@ export class TreeComponent {
|
|
|
1100
1100
|
EntityName: config.EntityName
|
|
1101
1101
|
});
|
|
1102
1102
|
allLeaves.push(leaf);
|
|
1103
|
-
console.
|
|
1103
|
+
console.debug(`[TreeComponent] Processing leaf ${id} (${leaf.Label})`);
|
|
1104
1104
|
if (useJunction) {
|
|
1105
1105
|
// M2M relationship: attach to all mapped branches
|
|
1106
1106
|
const branchIds = junctionMappings.get(id) || [];
|
|
1107
1107
|
let attached = false;
|
|
1108
|
-
console.
|
|
1108
|
+
console.debug(`[TreeComponent] Leaf ${id} junction branchIds:`, branchIds);
|
|
1109
1109
|
for (const branchId of branchIds) {
|
|
1110
1110
|
if (branchMap.has(branchId)) {
|
|
1111
1111
|
const parent = branchMap.get(branchId);
|
|
1112
|
-
console.
|
|
1112
|
+
console.debug(`[TreeComponent] Attaching leaf ${id} to branch ${branchId} (${parent.Label})`);
|
|
1113
1113
|
if (!attached) {
|
|
1114
1114
|
// First attachment: use the original leaf
|
|
1115
1115
|
leaf.ParentID = branchId;
|
|
@@ -1131,12 +1131,12 @@ export class TreeComponent {
|
|
|
1131
1131
|
}
|
|
1132
1132
|
}
|
|
1133
1133
|
else {
|
|
1134
|
-
console.
|
|
1134
|
+
console.debug(`[TreeComponent] Branch ${branchId} NOT FOUND in branchMap for leaf ${id}`);
|
|
1135
1135
|
}
|
|
1136
1136
|
}
|
|
1137
1137
|
// If no valid branch found, add to root
|
|
1138
1138
|
if (!attached) {
|
|
1139
|
-
console.
|
|
1139
|
+
console.debug(`[TreeComponent] Leaf ${id} not attached to any branch, adding to root`);
|
|
1140
1140
|
rootNodes.push(leaf);
|
|
1141
1141
|
leaf.Level = 0;
|
|
1142
1142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.component.js","sourceRoot":"","sources":["../../../src/lib/tree/tree.component.ts","../../../src/lib/tree/tree.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tree Component for @memberjunction/ng-trees\n *\n * A generic, reusable tree component for displaying hierarchical entity data.\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport {\n TreeNode,\n TreeBranchConfig,\n TreeLeafConfig,\n TreeJunctionConfig,\n TreeSelectionMode,\n TreeSelectableTypes,\n TreeStyleConfig,\n TreeKeyboardConfig,\n createDefaultTreeNode\n} from '../models/tree-types';\nimport {\n BeforeNodeSelectEventArgs,\n AfterNodeSelectEventArgs,\n BeforeNodeDeselectEventArgs,\n AfterNodeDeselectEventArgs,\n BeforeNodeExpandEventArgs,\n AfterNodeExpandEventArgs,\n BeforeNodeCollapseEventArgs,\n AfterNodeCollapseEventArgs,\n BeforeNodeClickEventArgs,\n AfterNodeClickEventArgs,\n BeforeNodeDoubleClickEventArgs,\n AfterNodeDoubleClickEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs,\n BeforeKeyboardNavigateEventArgs,\n AfterKeyboardNavigateEventArgs\n} from '../events/tree-events';\n\n@Component({\n standalone: false,\n selector: 'mj-tree',\n templateUrl: './tree.component.html',\n styleUrls: ['./tree.component.css']\n})\nexport class TreeComponent implements OnInit, OnDestroy {\n // ========================================\n // Configuration Inputs with Getter/Setter\n // ========================================\n\n /** Branch (category) entity configuration - REQUIRED */\n private _branchConfig: TreeBranchConfig | null = null;\n @Input()\n set BranchConfig(value: TreeBranchConfig) {\n const previousValue = this._branchConfig;\n this._branchConfig = value;\n // Only reload if config actually changed and we have a valid config\n if (value && previousValue !== value && this.isInitialized) {\n this.clearCache();\n if (this._autoLoad) {\n this.loadData(false);\n }\n }\n }\n get BranchConfig(): TreeBranchConfig {\n return this._branchConfig!;\n }\n\n /** Optional leaf entity configuration */\n private _leafConfig?: TreeLeafConfig;\n @Input()\n set LeafConfig(value: TreeLeafConfig | undefined) {\n const previousValue = this._leafConfig;\n this._leafConfig = value;\n // Only reload if config actually changed\n if (previousValue !== value && this._branchConfig && this.isInitialized) {\n this.clearCache();\n if (this._autoLoad) {\n this.loadData(false);\n }\n }\n }\n get LeafConfig(): TreeLeafConfig | undefined {\n return this._leafConfig;\n }\n\n /** Selection mode: 'single', 'multiple', or 'none' */\n private _selectionMode: TreeSelectionMode = 'single';\n @Input()\n set SelectionMode(value: TreeSelectionMode) {\n this._selectionMode = value;\n }\n get SelectionMode(): TreeSelectionMode {\n return this._selectionMode;\n }\n\n /** What types can be selected: 'branch', 'leaf', or 'both' */\n private _selectableTypes: TreeSelectableTypes = 'both';\n @Input()\n set SelectableTypes(value: TreeSelectableTypes) {\n this._selectableTypes = value;\n }\n get SelectableTypes(): TreeSelectableTypes {\n return this._selectableTypes;\n }\n\n /** Initially selected node IDs */\n private _selectedIDs: string[] = [];\n @Input()\n set SelectedIDs(value: string[]) {\n const previousValue = this._selectedIDs;\n this._selectedIDs = value || [];\n // Only sync selection if the IDs actually changed\n if (this.isInitialized && this.IsLoaded && JSON.stringify(previousValue) !== JSON.stringify(value)) {\n this.syncSelectionFromIDs();\n }\n }\n get SelectedIDs(): string[] {\n return this._selectedIDs;\n }\n\n /** Initially expanded node IDs (null = auto-expand first level) */\n private _expandedIDs: string[] | null = null;\n @Input()\n set ExpandedIDs(value: string[] | null) {\n this._expandedIDs = value;\n }\n get ExpandedIDs(): string[] | null {\n return this._expandedIDs;\n }\n\n /** Show expand/collapse all buttons */\n private _showExpandCollapseAll: boolean = false;\n @Input()\n set ShowExpandCollapseAll(value: boolean) {\n this._showExpandCollapseAll = value;\n }\n get ShowExpandCollapseAll(): boolean {\n return this._showExpandCollapseAll;\n }\n\n /** Enable keyboard navigation */\n private _enableKeyboardNavigation: boolean = true;\n @Input()\n set EnableKeyboardNavigation(value: boolean) {\n this._enableKeyboardNavigation = value;\n }\n get EnableKeyboardNavigation(): boolean {\n return this._enableKeyboardNavigation;\n }\n\n /** Keyboard configuration */\n private _keyboardConfig: TreeKeyboardConfig = {};\n @Input()\n set KeyboardConfig(value: TreeKeyboardConfig) {\n this._keyboardConfig = value || {};\n }\n get KeyboardConfig(): TreeKeyboardConfig {\n return this._keyboardConfig;\n }\n\n /** CSS style overrides */\n private _styleConfig: TreeStyleConfig = {};\n @Input()\n set StyleConfig(value: TreeStyleConfig) {\n this._styleConfig = value || {};\n }\n get StyleConfig(): TreeStyleConfig {\n return this._styleConfig;\n }\n\n /** Indent per level in pixels */\n private _indentSize: number = 20;\n @Input()\n set IndentSize(value: number) {\n this._indentSize = value;\n }\n get IndentSize(): number {\n return this._indentSize;\n }\n\n /** Show loading indicator */\n private _showLoading: boolean = true;\n @Input()\n set ShowLoading(value: boolean) {\n this._showLoading = value;\n }\n get ShowLoading(): boolean {\n return this._showLoading;\n }\n\n /** Empty state message */\n private _emptyMessage: string = 'No items found';\n @Input()\n set EmptyMessage(value: string) {\n this._emptyMessage = value;\n }\n get EmptyMessage(): string {\n return this._emptyMessage;\n }\n\n /** Empty state icon */\n private _emptyIcon: string = 'fa-solid fa-folder-open';\n @Input()\n set EmptyIcon(value: string) {\n this._emptyIcon = value;\n }\n get EmptyIcon(): string {\n return this._emptyIcon;\n }\n\n /** Auto-load data on init */\n private _autoLoad: boolean = true;\n @Input()\n set AutoLoad(value: boolean) {\n this._autoLoad = value;\n }\n get AutoLoad(): boolean {\n return this._autoLoad;\n }\n\n /** Show node icons */\n private _showIcons: boolean = true;\n @Input()\n set ShowIcons(value: boolean) {\n this._showIcons = value;\n }\n get ShowIcons(): boolean {\n return this._showIcons;\n }\n\n /** Show node descriptions */\n private _showDescriptions: boolean = false;\n @Input()\n set ShowDescriptions(value: boolean) {\n this._showDescriptions = value;\n }\n get ShowDescriptions(): boolean {\n return this._showDescriptions;\n }\n\n /** Show node badges */\n private _showBadges: boolean = true;\n @Input()\n set ShowBadges(value: boolean) {\n this._showBadges = value;\n }\n get ShowBadges(): boolean {\n return this._showBadges;\n }\n\n /** Animate expand/collapse */\n private _animateExpandCollapse: boolean = true;\n @Input()\n set AnimateExpandCollapse(value: boolean) {\n this._animateExpandCollapse = value;\n }\n get AnimateExpandCollapse(): boolean {\n return this._animateExpandCollapse;\n }\n\n // ========================================\n // Event Outputs\n // ========================================\n\n @Output() BeforeNodeSelect = new EventEmitter<BeforeNodeSelectEventArgs>();\n @Output() AfterNodeSelect = new EventEmitter<AfterNodeSelectEventArgs>();\n @Output() BeforeNodeDeselect = new EventEmitter<BeforeNodeDeselectEventArgs>();\n @Output() AfterNodeDeselect = new EventEmitter<AfterNodeDeselectEventArgs>();\n @Output() BeforeNodeExpand = new EventEmitter<BeforeNodeExpandEventArgs>();\n @Output() AfterNodeExpand = new EventEmitter<AfterNodeExpandEventArgs>();\n @Output() BeforeNodeCollapse = new EventEmitter<BeforeNodeCollapseEventArgs>();\n @Output() AfterNodeCollapse = new EventEmitter<AfterNodeCollapseEventArgs>();\n @Output() BeforeNodeClick = new EventEmitter<BeforeNodeClickEventArgs>();\n @Output() AfterNodeClick = new EventEmitter<AfterNodeClickEventArgs>();\n @Output() BeforeNodeDoubleClick = new EventEmitter<BeforeNodeDoubleClickEventArgs>();\n @Output() AfterNodeDoubleClick = new EventEmitter<AfterNodeDoubleClickEventArgs>();\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n @Output() BeforeKeyboardNavigate = new EventEmitter<BeforeKeyboardNavigateEventArgs>();\n @Output() AfterKeyboardNavigate = new EventEmitter<AfterKeyboardNavigateEventArgs>();\n\n /** Emitted when selection changes (convenience event with just the selected nodes) */\n @Output() SelectionChange = new EventEmitter<TreeNode[]>();\n\n // ========================================\n // State\n // ========================================\n\n /** Root nodes of the tree */\n public Nodes: TreeNode[] = [];\n\n /** All branch nodes (flat) */\n public AllBranches: TreeNode[] = [];\n\n /** All leaf nodes (flat) */\n public AllLeaves: TreeNode[] = [];\n\n /** Currently selected nodes */\n public SelectedNodes: TreeNode[] = [];\n\n /** Currently focused node (for keyboard navigation) */\n public FocusedNode: TreeNode | null = null;\n\n /** Loading state */\n public IsLoading: boolean = false;\n\n /** Error message if load failed */\n public ErrorMessage: string | null = null;\n\n /** Has data been loaded */\n public IsLoaded: boolean = false;\n\n /** Current search text (for highlighting) */\n public CurrentSearchText: string = '';\n\n // ========================================\n // Private State\n // ========================================\n\n private nodeMap: Map<string, TreeNode> = new Map();\n private isInitialized: boolean = false;\n private isCurrentlyLoading: boolean = false;\n\n /** Instance-level cache for loaded data */\n private cachedNodes: TreeNode[] | null = null;\n private cachedBranches: TreeNode[] | null = null;\n private cachedLeaves: TreeNode[] | null = null;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly elementRef: ElementRef\n ) {}\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.isInitialized = true;\n if (this._autoLoad && this._branchConfig) {\n this.loadData(false);\n }\n }\n\n ngOnDestroy(): void {\n this.clearCache();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Reload tree data (forces fresh load from database)\n */\n public async Refresh(): Promise<void> {\n this.clearCache();\n await this.loadData(true);\n }\n\n /**\n * Get currently selected nodes\n */\n public GetSelectedNodes(): TreeNode[] {\n return [...this.SelectedNodes];\n }\n\n /**\n * Get selected IDs\n */\n public GetSelectedIDs(): string[] {\n return this.SelectedNodes.map(n => n.ID);\n }\n\n /**\n * Programmatically select node(s)\n * @param emitChange Whether to emit SelectionChange event (default: true).\n * Set to false during sync operations to avoid unnecessary events.\n */\n public SelectNodes(ids: string[], emitChange: boolean = true): void {\n const previousSelection = [...this.SelectedNodes];\n const previousIds = previousSelection.map(n => n.ID).sort().join(',');\n\n if (this._selectionMode === 'single' && ids.length > 0) {\n ids = [ids[0]];\n }\n\n this.SelectedNodes = [];\n for (const id of ids) {\n const node = this.nodeMap.get(id);\n if (node && this.isNodeSelectable(node)) {\n node.Selected = true;\n this.SelectedNodes.push(node);\n }\n }\n\n // Deselect previously selected nodes not in new selection\n for (const prev of previousSelection) {\n if (!this.SelectedNodes.includes(prev)) {\n prev.Selected = false;\n }\n }\n\n // Only emit if selection actually changed\n const newIds = this.SelectedNodes.map(n => n.ID).sort().join(',');\n if (emitChange && previousIds !== newIds) {\n this.SelectionChange.emit([...this.SelectedNodes]);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clear selection\n */\n public ClearSelection(): void {\n for (const node of this.SelectedNodes) {\n node.Selected = false;\n }\n this.SelectedNodes = [];\n this.SelectionChange.emit([]);\n this.cdr.detectChanges();\n }\n\n /**\n * Expand all nodes\n */\n public ExpandAll(): void {\n this.expandAllRecursive(this.Nodes);\n this.cdr.detectChanges();\n }\n\n /**\n * Collapse all nodes\n */\n public CollapseAll(): void {\n this.collapseAllRecursive(this.Nodes);\n this.cdr.detectChanges();\n }\n\n /**\n * Expand to specific node (expands all ancestors)\n */\n public ExpandToNode(id: string): TreeNode | null {\n const target = this.nodeMap.get(id);\n if (!target) {\n return null;\n }\n\n // Walk up the tree and expand each ancestor\n let current = target;\n while (current.ParentID && this.nodeMap.has(current.ParentID)) {\n const parent = this.nodeMap.get(current.ParentID)!;\n parent.Expanded = true;\n current = parent;\n }\n\n this.cdr.detectChanges();\n return target;\n }\n\n /**\n * Find node by ID\n */\n public FindNode(id: string): TreeNode | null {\n return this.nodeMap.get(id) || null;\n }\n\n /**\n * Get all nodes matching a predicate\n */\n public FindNodes(predicate: (node: TreeNode) => boolean): TreeNode[] {\n const results: TreeNode[] = [];\n for (const node of this.nodeMap.values()) {\n if (predicate(node)) {\n results.push(node);\n }\n }\n return results;\n }\n\n /**\n * Filter nodes by search text\n */\n public FilterNodes(\n searchText: string,\n options: {\n caseSensitive?: boolean;\n searchBranches?: boolean;\n searchLeaves?: boolean;\n searchDescription?: boolean;\n } = {}\n ): TreeNode[] {\n const {\n caseSensitive = false,\n searchBranches = true,\n searchLeaves = true,\n searchDescription = false\n } = options;\n\n // Store search text for highlighting\n this.CurrentSearchText = searchText.trim();\n\n if (!searchText.trim()) {\n // Reset all nodes to visible\n this.setVisibilityRecursive(this.Nodes, true, false);\n this.cdr.detectChanges();\n return [];\n }\n\n const searchLower = caseSensitive ? searchText : searchText.toLowerCase();\n const matchedNodes: TreeNode[] = [];\n\n // First pass: mark matching nodes\n this.markMatchingNodesRecursive(\n this.Nodes,\n searchLower,\n caseSensitive,\n searchBranches,\n searchLeaves,\n searchDescription,\n matchedNodes\n );\n\n // Second pass: make ancestors of matches visible\n this.makeAncestorsVisibleRecursive(this.Nodes);\n\n this.cdr.detectChanges();\n return matchedNodes;\n }\n\n /**\n * Clear cache (call before Refresh if you want fresh data)\n */\n public ClearCache(): void {\n this.clearCache();\n }\n\n // ========================================\n // Template Event Handlers\n // ========================================\n\n /**\n * Handle node click\n */\n public onNodeClick(node: TreeNode, event: MouseEvent): void {\n // Fire before click event\n const beforeClickEvent = new BeforeNodeClickEventArgs(this, node, event);\n this.BeforeNodeClick.emit(beforeClickEvent);\n\n if (beforeClickEvent.Cancel) {\n return;\n }\n\n // Set focus\n this.FocusedNode = node;\n\n // Handle toggle for branches\n if (node.Type === 'branch' && node.Children.length > 0) {\n // Click on the chevron area toggles expansion\n const target = event.target as HTMLElement;\n if (target.closest('.tree-node-toggle')) {\n this.toggleNodeExpansion(node);\n return;\n }\n }\n\n // Handle selection\n if (this._selectionMode !== 'none' && this.isNodeSelectable(node)) {\n this.handleNodeSelection(node, event);\n }\n\n // Fire after click event\n const afterClickEvent = new AfterNodeClickEventArgs(this, node, event);\n this.AfterNodeClick.emit(afterClickEvent);\n }\n\n /**\n * Handle node double-click\n */\n public onNodeDoubleClick(node: TreeNode, event: MouseEvent): void {\n // Fire before event\n const beforeEvent = new BeforeNodeDoubleClickEventArgs(this, node, event);\n this.BeforeNodeDoubleClick.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n // Toggle expansion for branches\n if (node.Type === 'branch') {\n this.toggleNodeExpansion(node);\n }\n\n // Fire after event\n const afterEvent = new AfterNodeDoubleClickEventArgs(this, node, event);\n this.AfterNodeDoubleClick.emit(afterEvent);\n }\n\n /**\n * Handle toggle click\n */\n public onToggleClick(node: TreeNode, event: MouseEvent): void {\n event.stopPropagation();\n this.toggleNodeExpansion(node);\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('keydown', ['$event'])\n public onKeyDown(event: KeyboardEvent): void {\n if (!this._enableKeyboardNavigation) {\n return;\n }\n\n const visibleNodes = this.getVisibleNodesInOrder(this.Nodes);\n if (visibleNodes.length === 0) {\n return;\n }\n\n const currentIndex = this.FocusedNode\n ? visibleNodes.indexOf(this.FocusedNode)\n : -1;\n\n let targetNode: TreeNode | null = null;\n let handled = false;\n\n switch (event.key) {\n case 'ArrowDown':\n if (currentIndex < visibleNodes.length - 1) {\n targetNode = visibleNodes[currentIndex + 1];\n }\n handled = true;\n break;\n\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetNode = visibleNodes[currentIndex - 1];\n } else if (currentIndex === -1 && visibleNodes.length > 0) {\n targetNode = visibleNodes[visibleNodes.length - 1];\n }\n handled = true;\n break;\n\n case 'ArrowRight':\n if (this.FocusedNode?.Type === 'branch') {\n if (!this.FocusedNode.Expanded && this.FocusedNode.Children.length > 0) {\n this.expandNode(this.FocusedNode);\n } else if (this.FocusedNode.Expanded && this.FocusedNode.Children.length > 0) {\n // Move to first child\n const firstVisible = this.FocusedNode.Children.find(c => c.Visible);\n if (firstVisible) {\n targetNode = firstVisible;\n }\n }\n }\n handled = true;\n break;\n\n case 'ArrowLeft':\n if (this.FocusedNode?.Type === 'branch' && this.FocusedNode.Expanded) {\n this.collapseNode(this.FocusedNode);\n } else if (this.FocusedNode?.ParentID) {\n // Move to parent\n targetNode = this.nodeMap.get(this.FocusedNode.ParentID) || null;\n }\n handled = true;\n break;\n\n case 'Enter':\n case ' ':\n if (this.FocusedNode && this._selectionMode !== 'none' && this.isNodeSelectable(this.FocusedNode)) {\n this.handleNodeSelection(this.FocusedNode, event as unknown as MouseEvent);\n }\n handled = true;\n break;\n\n case 'Home':\n if (visibleNodes.length > 0) {\n targetNode = visibleNodes[0];\n }\n handled = true;\n break;\n\n case 'End':\n if (visibleNodes.length > 0) {\n targetNode = visibleNodes[visibleNodes.length - 1];\n }\n handled = true;\n break;\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (targetNode && targetNode !== this.FocusedNode) {\n // Fire before navigate event\n const beforeEvent = new BeforeKeyboardNavigateEventArgs(\n this,\n event,\n this.FocusedNode,\n targetNode\n );\n this.BeforeKeyboardNavigate.emit(beforeEvent);\n\n if (!beforeEvent.Cancel) {\n const previousNode = this.FocusedNode;\n this.FocusedNode = targetNode;\n\n // Fire after navigate event\n const afterEvent = new AfterKeyboardNavigateEventArgs(\n this,\n event.key,\n previousNode,\n this.FocusedNode\n );\n this.AfterKeyboardNavigate.emit(afterEvent);\n\n this.scrollNodeIntoView(targetNode);\n this.cdr.detectChanges();\n }\n }\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n /**\n * Load tree data\n */\n private async loadData(forceRefresh: boolean): Promise<void> {\n if (!this._branchConfig) {\n console.warn('[TreeComponent] loadData() - BranchConfig is required');\n return;\n }\n\n // Prevent concurrent loads\n if (this.isCurrentlyLoading) {\n return;\n }\n\n // Check instance cache first (unless force refresh)\n if (!forceRefresh && this.cachedNodes) {\n this.Nodes = this.cloneNodes(this.cachedNodes);\n this.AllBranches = this.cloneNodes(this.cachedBranches || []);\n this.AllLeaves = this.cloneNodes(this.cachedLeaves || []);\n this.nodeMap = this.buildNodeMap(this.Nodes);\n this.applyInitialExpansion();\n this.syncSelectionFromIDs();\n this.IsLoaded = true;\n this.cdr.detectChanges();\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDataLoadEventArgs(this, this._branchConfig, this._leafConfig);\n this.BeforeDataLoad.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.isCurrentlyLoading = true;\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n const startTime = performance.now();\n\n // Apply any modified filters from event\n const branchConfig = { ...this._branchConfig };\n if (beforeEvent.ModifiedBranchFilter !== undefined) {\n branchConfig.ExtraFilter = beforeEvent.ModifiedBranchFilter;\n }\n\n const leafConfig = this._leafConfig ? { ...this._leafConfig } : undefined;\n if (leafConfig && beforeEvent.ModifiedLeafFilter !== undefined) {\n leafConfig.ExtraFilter = beforeEvent.ModifiedLeafFilter;\n }\n\n try {\n // Load branches and leaves in parallel\n const [branchData, leafData] = await Promise.all([\n this.loadBranches(branchConfig),\n leafConfig ? this.loadLeaves(leafConfig) : Promise.resolve([])\n ]);\n\n // Build tree structure\n const { rootNodes, allBranches, branchMap } = this.buildBranchHierarchy(branchData, branchConfig);\n\n // Load junction mappings if configured (for M2M relationships)\n let junctionMappings: Map<string, string[]> | null = null;\n if (leafConfig?.JunctionConfig) {\n junctionMappings = await this.loadJunctionMappings(leafConfig.JunctionConfig, leafConfig.IDField || 'ID');\n }\n\n // Attach leaves to branches (or root if orphans)\n const allLeaves = this.attachLeavesToBranches(rootNodes, branchMap, leafData, leafConfig, junctionMappings);\n\n const loadTimeMs = performance.now() - startTime;\n\n // Store in instance cache\n this.cachedNodes = this.cloneNodes(rootNodes);\n this.cachedBranches = this.cloneNodes(allBranches);\n this.cachedLeaves = this.cloneNodes(allLeaves);\n\n // Set state\n this.Nodes = rootNodes;\n this.AllBranches = allBranches;\n this.AllLeaves = allLeaves;\n this.nodeMap = this.buildNodeMap(this.Nodes);\n this.IsLoading = false;\n this.IsLoaded = true;\n this.isCurrentlyLoading = false;\n\n // Apply initial expansion\n this.applyInitialExpansion();\n\n // Apply initial selection\n this.syncSelectionFromIDs();\n\n // Fire after event\n const afterEvent = new AfterDataLoadEventArgs(\n this,\n true,\n allBranches.length,\n allLeaves.length,\n loadTimeMs,\n undefined\n );\n this.AfterDataLoad.emit(afterEvent);\n\n } catch (error) {\n const loadTimeMs = performance.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error('[TreeComponent] loadData() error:', errorMessage, error);\n\n this.IsLoading = false;\n this.IsLoaded = true;\n this.isCurrentlyLoading = false;\n this.ErrorMessage = errorMessage;\n this.Nodes = [];\n this.AllBranches = [];\n this.AllLeaves = [];\n\n // Fire after event with error\n const afterEvent = new AfterDataLoadEventArgs(\n this,\n false,\n 0,\n 0,\n loadTimeMs,\n errorMessage\n );\n this.AfterDataLoad.emit(afterEvent);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load branch entities from database\n */\n private async loadBranches(config: TreeBranchConfig): Promise<Record<string, unknown>[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: config.EntityName,\n ExtraFilter: config.ExtraFilter || '',\n OrderBy: config.OrderBy || 'Name ASC',\n ResultType: 'simple',\n CacheLocal: config.CacheLocal ?? true\n });\n\n console.log('[TreeComponent] Branches query result:', {\n entityName: config.EntityName,\n filter: config.ExtraFilter || '(none)',\n cacheLocal: config.CacheLocal ?? true,\n success: result.Success,\n recordCount: result.Results?.length || 0,\n records: result.Results?.map((r: Record<string, unknown>) => ({ ID: r['ID'], Name: r['Name'] }))\n });\n\n if (!result.Success) {\n throw new Error(`Failed to load branches: ${result.ErrorMessage}`);\n }\n\n return result.Results as Record<string, unknown>[];\n }\n\n /**\n * Load leaf entities from database\n */\n private async loadLeaves(config: TreeLeafConfig): Promise<Record<string, unknown>[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: config.EntityName,\n ExtraFilter: config.ExtraFilter || '',\n OrderBy: config.OrderBy || 'Name ASC',\n ResultType: 'simple',\n CacheLocal: config.CacheLocal ?? true\n });\n\n console.log('[TreeComponent] Leaves query result:', {\n entityName: config.EntityName,\n filter: config.ExtraFilter || '(none)',\n cacheLocal: config.CacheLocal ?? true,\n success: result.Success,\n recordCount: result.Results?.length || 0,\n records: result.Results?.map((r: Record<string, unknown>) => ({ ID: r['ID'], Name: r['Name'] }))\n });\n\n if (!result.Success) {\n throw new Error(`Failed to load leaves: ${result.ErrorMessage}`);\n }\n\n return result.Results as Record<string, unknown>[];\n }\n\n /**\n * Load junction mappings for M2M relationships.\n * Returns a map of leafId -> branchIds[]\n */\n private async loadJunctionMappings(\n junctionConfig: TreeJunctionConfig,\n leafIdField: string\n ): Promise<Map<string, string[]>> {\n const rv = new RunView();\n const mappings = new Map<string, string[]>();\n\n // Load junction records\n const junctionResult = await rv.RunView({\n EntityName: junctionConfig.EntityName,\n ExtraFilter: junctionConfig.ExtraFilter || '',\n ResultType: 'simple',\n CacheLocal: junctionConfig.CacheLocal ?? true\n });\n\n console.log('[TreeComponent] Junction query result:', {\n entityName: junctionConfig.EntityName,\n filter: junctionConfig.ExtraFilter || '(none)',\n cacheLocal: junctionConfig.CacheLocal ?? true,\n success: junctionResult.Success,\n recordCount: junctionResult.Results?.length || 0,\n records: junctionResult.Results\n });\n\n if (!junctionResult.Success) {\n console.warn(`Failed to load junction data: ${junctionResult.ErrorMessage}`);\n return mappings;\n }\n\n const junctionRecords = junctionResult.Results as Record<string, unknown>[];\n\n // If there's an indirect mapping, we need to resolve it\n if (junctionConfig.IndirectLeafMapping) {\n const indirect = junctionConfig.IndirectLeafMapping;\n\n // Load the intermediate entity records to build the mapping\n const intermediateResult = await rv.RunView({\n EntityName: indirect.IntermediateEntity,\n ExtraFilter: indirect.ExtraFilter || '',\n ResultType: 'simple',\n CacheLocal: indirect.CacheLocal ?? true\n });\n\n console.log('[TreeComponent] Intermediate entity query result:', {\n entityName: indirect.IntermediateEntity,\n filter: indirect.ExtraFilter || '(none)',\n cacheLocal: indirect.CacheLocal ?? true,\n success: intermediateResult.Success,\n recordCount: intermediateResult.Results?.length || 0,\n records: intermediateResult.Results\n });\n\n if (!intermediateResult.Success) {\n console.warn(`Failed to load intermediate data: ${intermediateResult.ErrorMessage}`);\n return mappings;\n }\n\n // Build intermediate ID -> leaf ID map\n const intermediateToLeaf = new Map<string, string>();\n for (const record of intermediateResult.Results as Record<string, unknown>[]) {\n const intermediateId = String(record[indirect.IntermediateIDField] || '');\n const leafId = String(record[indirect.LeafIDField] || '');\n if (intermediateId && leafId) {\n intermediateToLeaf.set(intermediateId, leafId);\n }\n }\n\n console.log('[TreeComponent] Intermediate to leaf mapping:', {\n mapSize: intermediateToLeaf.size,\n entries: Array.from(intermediateToLeaf.entries())\n });\n\n // Now process junction records using the intermediate mapping\n for (const junction of junctionRecords) {\n const intermediateId = String(junction[junctionConfig.LeafForeignKey] || '');\n const branchId = String(junction[junctionConfig.BranchForeignKey] || '');\n\n if (intermediateId && branchId) {\n const leafId = intermediateToLeaf.get(intermediateId);\n if (leafId) {\n if (!mappings.has(leafId)) {\n mappings.set(leafId, []);\n }\n const branchIds = mappings.get(leafId)!;\n if (!branchIds.includes(branchId)) {\n branchIds.push(branchId);\n }\n }\n }\n }\n } else {\n // Direct mapping - junction directly references the leaf\n for (const junction of junctionRecords) {\n const leafId = String(junction[junctionConfig.LeafForeignKey] || '');\n const branchId = String(junction[junctionConfig.BranchForeignKey] || '');\n\n if (leafId && branchId) {\n if (!mappings.has(leafId)) {\n mappings.set(leafId, []);\n }\n const branchIds = mappings.get(leafId)!;\n if (!branchIds.includes(branchId)) {\n branchIds.push(branchId);\n }\n }\n }\n }\n\n console.log('[TreeComponent] Final junction mappings (leafId -> branchIds):', {\n mapSize: mappings.size,\n entries: Array.from(mappings.entries())\n });\n\n return mappings;\n }\n\n /**\n * Build branch hierarchy from flat data\n */\n private buildBranchHierarchy(\n branchData: Record<string, unknown>[],\n config: TreeBranchConfig\n ): { rootNodes: TreeNode[]; allBranches: TreeNode[]; branchMap: Map<string, TreeNode> } {\n const idField = config.IDField || 'ID';\n const parentIdField = config.ParentIDField || 'ParentID';\n const displayField = config.DisplayField || 'Name';\n\n const nodeMap = new Map<string, TreeNode>();\n const allBranches: TreeNode[] = [];\n\n for (const data of branchData) {\n const id = String(data[idField] || '');\n const parentId = data[parentIdField] ? String(data[parentIdField]) : null;\n\n const node = createDefaultTreeNode({\n ID: id,\n Label: String(data[displayField] || ''),\n Type: 'branch',\n ParentID: parentId,\n Icon: this.getNodeIcon(data, config.IconField, config.DefaultIcon || 'fa-solid fa-folder'),\n Color: this.getNodeColor(data, config.ColorField, config.DefaultColor),\n Data: { ...data },\n Description: config.DescriptionField ? String(data[config.DescriptionField] || '') : undefined,\n Badge: config.BadgeField ? String(data[config.BadgeField] || '') : undefined,\n EntityName: config.EntityName\n });\n\n nodeMap.set(id, node);\n allBranches.push(node);\n }\n\n // Build parent-child relationships\n const rootNodes: TreeNode[] = [];\n\n for (const node of allBranches) {\n if (node.ParentID && nodeMap.has(node.ParentID)) {\n const parent = nodeMap.get(node.ParentID)!;\n parent.Children.push(node);\n node.Level = this.calculateLevel(node, nodeMap);\n } else {\n rootNodes.push(node);\n node.Level = 0;\n }\n }\n\n // Sort children at each level\n this.sortChildrenRecursive(rootNodes);\n\n return { rootNodes, allBranches, branchMap: nodeMap };\n }\n\n /**\n * Attach leaf nodes to their parent branches or root level.\n * Supports both direct parent field relationships and M2M junction mappings.\n *\n * @param rootNodes Root nodes to attach orphan leaves to\n * @param branchMap Map of branch IDs to branch nodes\n * @param leafData Raw leaf data from database\n * @param config Leaf configuration\n * @param junctionMappings Optional M2M mappings (leafId -> branchIds[])\n */\n private attachLeavesToBranches(\n rootNodes: TreeNode[],\n branchMap: Map<string, TreeNode>,\n leafData: Record<string, unknown>[],\n config?: TreeLeafConfig,\n junctionMappings?: Map<string, string[]> | null\n ): TreeNode[] {\n if (!config || leafData.length === 0) {\n return [];\n }\n\n const idField = config.IDField || 'ID';\n const parentField = config.ParentField;\n const displayField = config.DisplayField || 'Name';\n const useJunction = !!junctionMappings && junctionMappings.size > 0;\n\n console.log('[TreeComponent] attachLeavesToBranches input:', {\n leafDataCount: leafData.length,\n leafIds: leafData.map((d: Record<string, unknown>) => ({ id: d[idField], name: d[displayField] })),\n branchMapKeys: Array.from(branchMap.keys()),\n branchMapEntries: Array.from(branchMap.entries()).map(([k, v]) => ({ id: k, name: v.Label })),\n useJunction,\n junctionMappingKeys: junctionMappings ? Array.from(junctionMappings.keys()) : []\n });\n\n const allLeaves: TreeNode[] = [];\n const addedLeafIds = new Set<string>(); // Track leaves already added to avoid duplicates\n\n for (const data of leafData) {\n const id = String(data[idField] || '');\n\n // If using junction mappings, only include leaves that have junction entries\n if (useJunction && !junctionMappings!.has(id)) {\n console.log(`[TreeComponent] Skipping leaf ${id} (${data[displayField]}) - not in junction mappings`);\n continue; // Skip leaves not in any branch via junction\n }\n\n const leaf = createDefaultTreeNode({\n ID: id,\n Label: String(data[displayField] || ''),\n Type: 'leaf',\n ParentID: null, // Will be set based on attachment\n Icon: this.getNodeIcon(data, config.IconField, config.DefaultIcon || 'fa-solid fa-file'),\n Data: { ...data },\n Description: config.DescriptionField ? String(data[config.DescriptionField] || '') : undefined,\n Badge: config.BadgeField ? String(data[config.BadgeField] || '') : undefined,\n EntityName: config.EntityName\n });\n\n allLeaves.push(leaf);\n console.log(`[TreeComponent] Processing leaf ${id} (${leaf.Label})`);\n\n if (useJunction) {\n // M2M relationship: attach to all mapped branches\n const branchIds = junctionMappings!.get(id) || [];\n let attached = false;\n\n console.log(`[TreeComponent] Leaf ${id} junction branchIds:`, branchIds);\n\n for (const branchId of branchIds) {\n if (branchMap.has(branchId)) {\n const parent = branchMap.get(branchId)!;\n console.log(`[TreeComponent] Attaching leaf ${id} to branch ${branchId} (${parent.Label})`);\n\n if (!attached) {\n // First attachment: use the original leaf\n leaf.ParentID = branchId;\n leaf.Level = parent.Level + 1;\n parent.Children.push(leaf);\n attached = true;\n } else {\n // Additional attachments: create a clone of the leaf\n // This allows the same artifact to appear under multiple collections\n const leafClone = createDefaultTreeNode({\n ...leaf,\n ParentID: branchId,\n Level: parent.Level + 1,\n Children: [],\n Data: { ...leaf.Data }\n });\n parent.Children.push(leafClone);\n }\n } else {\n console.log(`[TreeComponent] Branch ${branchId} NOT FOUND in branchMap for leaf ${id}`);\n }\n }\n\n // If no valid branch found, add to root\n if (!attached) {\n console.log(`[TreeComponent] Leaf ${id} not attached to any branch, adding to root`);\n rootNodes.push(leaf);\n leaf.Level = 0;\n }\n } else {\n // Direct parent field relationship\n const parentFieldValue = parentField ? data[parentField] : null;\n const parentId = parentFieldValue ? String(parentFieldValue) : null;\n leaf.ParentID = parentId;\n\n if (parentId && branchMap.has(parentId)) {\n const parent = branchMap.get(parentId)!;\n parent.Children.push(leaf);\n leaf.Level = parent.Level + 1;\n } else {\n // Orphan leaf (no parent or parent not found) - add to root level\n rootNodes.push(leaf);\n leaf.Level = 0;\n }\n }\n }\n\n // Re-sort children to interleave branches and leaves properly\n this.sortChildrenByTypeAndName(rootNodes);\n for (const branch of branchMap.values()) {\n this.sortChildrenByTypeAndName(branch.Children);\n }\n\n return allLeaves;\n }\n\n /**\n * Calculate node level in hierarchy\n */\n private calculateLevel(node: TreeNode, nodeMap: Map<string, TreeNode>): number {\n let level = 0;\n let current = node;\n\n while (current.ParentID && nodeMap.has(current.ParentID)) {\n level++;\n current = nodeMap.get(current.ParentID)!;\n if (level > 100) break; // Safety for circular refs\n }\n\n return level;\n }\n\n /**\n * Sort children recursively (alphabetically)\n */\n private sortChildrenRecursive(nodes: TreeNode[]): void {\n nodes.sort((a, b) => a.Label.localeCompare(b.Label));\n\n for (const node of nodes) {\n if (node.Children.length > 0) {\n this.sortChildrenRecursive(node.Children);\n }\n }\n }\n\n /**\n * Sort children: branches first (alphabetically), then leaves (alphabetically)\n */\n private sortChildrenByTypeAndName(nodes: TreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.Type !== b.Type) {\n return a.Type === 'branch' ? -1 : 1;\n }\n return a.Label.localeCompare(b.Label);\n });\n }\n\n /**\n * Get icon for a node from field or default\n */\n private getNodeIcon(\n data: Record<string, unknown>,\n iconField?: string,\n defaultIcon: string = 'fa-solid fa-folder'\n ): string {\n if (iconField && data[iconField]) {\n return String(data[iconField]);\n }\n return defaultIcon;\n }\n\n /**\n * Get color for a node from field or default\n */\n private getNodeColor(\n data: Record<string, unknown>,\n colorField?: string,\n defaultColor?: string\n ): string | undefined {\n if (colorField && data[colorField]) {\n return String(data[colorField]);\n }\n return defaultColor;\n }\n\n /**\n * Clear instance cache\n */\n private clearCache(): void {\n this.cachedNodes = null;\n this.cachedBranches = null;\n this.cachedLeaves = null;\n }\n\n /**\n * Deep clone tree nodes\n */\n private cloneNodes(nodes: TreeNode[]): TreeNode[] {\n return nodes.map(node => this.cloneNode(node));\n }\n\n private cloneNode(node: TreeNode): TreeNode {\n return {\n ...node,\n Data: { ...node.Data },\n Children: this.cloneNodes(node.Children)\n };\n }\n\n /**\n * Build a flat map of all nodes by ID\n */\n private buildNodeMap(nodes: TreeNode[]): Map<string, TreeNode> {\n const map = new Map<string, TreeNode>();\n this.addNodesToMapRecursive(nodes, map);\n return map;\n }\n\n private addNodesToMapRecursive(nodes: TreeNode[], map: Map<string, TreeNode>): void {\n for (const node of nodes) {\n map.set(node.ID, node);\n this.addNodesToMapRecursive(node.Children, map);\n }\n }\n\n // ========================================\n // Private Methods - Tree Operations\n // ========================================\n\n /**\n * Apply initial expansion state\n */\n private applyInitialExpansion(): void {\n if (this._expandedIDs === null) {\n // Auto-expand first level\n for (const node of this.Nodes) {\n if (node.Type === 'branch') {\n node.Expanded = true;\n }\n }\n } else {\n // Expand specified nodes\n for (const id of this._expandedIDs) {\n const node = this.nodeMap.get(id);\n if (node && node.Type === 'branch') {\n node.Expanded = true;\n }\n }\n }\n }\n\n /**\n * Sync selection state from SelectedIDs input\n */\n private syncSelectionFromIDs(): void {\n // Clear current selection\n for (const node of this.SelectedNodes) {\n node.Selected = false;\n }\n this.SelectedNodes = [];\n\n // Apply new selection\n for (const id of this._selectedIDs) {\n const node = this.nodeMap.get(id);\n if (node && this.isNodeSelectable(node)) {\n node.Selected = true;\n this.SelectedNodes.push(node);\n }\n }\n }\n\n /**\n * Check if a node can be selected based on SelectableTypes\n */\n private isNodeSelectable(node: TreeNode): boolean {\n if (this._selectableTypes === 'both') return true;\n return node.Type === this._selectableTypes;\n }\n\n /**\n * Handle node selection logic\n */\n private handleNodeSelection(node: TreeNode, event: MouseEvent | KeyboardEvent): void {\n const isCtrlClick = event.ctrlKey || event.metaKey;\n const isSelected = node.Selected;\n const previousSelection = [...this.SelectedNodes];\n\n if (isSelected) {\n // Deselect\n const beforeEvent = new BeforeNodeDeselectEventArgs(this, node, previousSelection);\n this.BeforeNodeDeselect.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Selected = false;\n this.SelectedNodes = this.SelectedNodes.filter(n => n !== node);\n\n const afterEvent = new AfterNodeDeselectEventArgs(\n this,\n node,\n [...this.SelectedNodes],\n previousSelection\n );\n this.AfterNodeDeselect.emit(afterEvent);\n } else {\n // Select\n const isAdditive = this._selectionMode === 'multiple' && isCtrlClick;\n\n const beforeEvent = new BeforeNodeSelectEventArgs(\n this,\n node,\n isAdditive,\n previousSelection\n );\n this.BeforeNodeSelect.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n if (this._selectionMode === 'single' || !isAdditive) {\n // Clear previous selection\n for (const prev of this.SelectedNodes) {\n prev.Selected = false;\n }\n this.SelectedNodes = [];\n }\n\n node.Selected = true;\n this.SelectedNodes.push(node);\n\n const afterEvent = new AfterNodeSelectEventArgs(\n this,\n node,\n isAdditive,\n [...this.SelectedNodes],\n previousSelection\n );\n this.AfterNodeSelect.emit(afterEvent);\n }\n\n this.SelectionChange.emit([...this.SelectedNodes]);\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle node expansion\n */\n private toggleNodeExpansion(node: TreeNode): void {\n if (node.Expanded) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n /**\n * Expand a node\n */\n private expandNode(node: TreeNode): void {\n if (node.Type !== 'branch' || node.Children.length === 0) {\n return;\n }\n\n const beforeEvent = new BeforeNodeExpandEventArgs(this, node);\n this.BeforeNodeExpand.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Expanded = true;\n\n const afterEvent = new AfterNodeExpandEventArgs(\n this,\n node,\n node.Children.filter(c => c.Visible).length\n );\n this.AfterNodeExpand.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Collapse a node\n */\n private collapseNode(node: TreeNode): void {\n if (node.Type !== 'branch') {\n return;\n }\n\n const beforeEvent = new BeforeNodeCollapseEventArgs(this, node);\n this.BeforeNodeCollapse.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Expanded = false;\n\n const afterEvent = new AfterNodeCollapseEventArgs(this, node);\n this.AfterNodeCollapse.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Expand all nodes recursively\n */\n private expandAllRecursive(nodes: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Type === 'branch') {\n node.Expanded = true;\n this.expandAllRecursive(node.Children);\n }\n }\n }\n\n /**\n * Collapse all nodes recursively\n */\n private collapseAllRecursive(nodes: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Type === 'branch') {\n node.Expanded = false;\n this.collapseAllRecursive(node.Children);\n }\n }\n }\n\n /**\n * Get all visible nodes in tree order\n */\n private getVisibleNodesInOrder(nodes: TreeNode[]): TreeNode[] {\n const result: TreeNode[] = [];\n this.collectVisibleNodesRecursive(nodes, result);\n return result;\n }\n\n private collectVisibleNodesRecursive(nodes: TreeNode[], result: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Visible) {\n result.push(node);\n if (node.Expanded && node.Type === 'branch') {\n this.collectVisibleNodesRecursive(node.Children, result);\n }\n }\n }\n }\n\n /**\n * Scroll a node into view\n */\n private scrollNodeIntoView(node: TreeNode): void {\n const element = this.elementRef.nativeElement.querySelector(\n `[data-node-id=\"${node.ID}\"]`\n );\n if (element) {\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n\n // ========================================\n // Private Methods - Search/Filter\n // ========================================\n\n /**\n * Set visibility recursively\n */\n private setVisibilityRecursive(nodes: TreeNode[], visible: boolean, matchesSearch: boolean): void {\n for (const node of nodes) {\n node.Visible = visible;\n node.MatchesSearch = matchesSearch;\n this.setVisibilityRecursive(node.Children, visible, matchesSearch);\n }\n }\n\n /**\n * Recursively mark nodes that match the search\n */\n private markMatchingNodesRecursive(\n nodes: TreeNode[],\n searchText: string,\n caseSensitive: boolean,\n searchBranches: boolean,\n searchLeaves: boolean,\n searchDescription: boolean,\n matchedNodes: TreeNode[]\n ): boolean {\n let hasVisibleChild = false;\n\n for (const node of nodes) {\n const shouldSearch =\n (node.Type === 'branch' && searchBranches) ||\n (node.Type === 'leaf' && searchLeaves);\n\n let matches = false;\n if (shouldSearch) {\n const label = caseSensitive ? node.Label : node.Label.toLowerCase();\n matches = label.includes(searchText);\n\n if (!matches && searchDescription && node.Description) {\n const desc = caseSensitive ? node.Description : node.Description.toLowerCase();\n matches = desc.includes(searchText);\n }\n }\n\n node.MatchesSearch = matches;\n\n const childHasMatch = this.markMatchingNodesRecursive(\n node.Children,\n searchText,\n caseSensitive,\n searchBranches,\n searchLeaves,\n searchDescription,\n matchedNodes\n );\n\n node.Visible = matches || childHasMatch;\n\n if (matches) {\n matchedNodes.push(node);\n }\n\n if (node.Visible) {\n hasVisibleChild = true;\n }\n }\n\n return hasVisibleChild;\n }\n\n /**\n * Make ancestors of visible nodes also visible\n */\n private makeAncestorsVisibleRecursive(nodes: TreeNode[]): boolean {\n let hasVisibleChild = false;\n\n for (const node of nodes) {\n const childVisible = this.makeAncestorsVisibleRecursive(node.Children);\n\n if (childVisible && !node.Visible) {\n node.Visible = true;\n }\n\n if (node.Visible) {\n hasVisibleChild = true;\n }\n }\n\n return hasVisibleChild;\n }\n\n // ========================================\n // Template Helpers\n // ========================================\n\n /**\n * Get the padding for a node based on its level\n */\n public getNodePadding(node: TreeNode): string {\n const basePadding = node.Level * this._indentSize;\n // Root-level leaves need a small indent since they have no toggle button\n // to align them with nested items\n if (node.Type === 'leaf' && node.Level === 0) {\n return `${basePadding + 8}px`;\n }\n return `${basePadding}px`;\n }\n\n /**\n * Get CSS classes for a node\n */\n public getNodeClasses(node: TreeNode): Record<string, boolean> {\n return {\n 'tree-node': true,\n 'tree-node--branch': node.Type === 'branch',\n 'tree-node--leaf': node.Type === 'leaf',\n 'tree-node--root-level': node.Level === 0,\n 'tree-node--selected': node.Selected,\n 'tree-node--focused': node === this.FocusedNode,\n 'tree-node--expanded': node.Expanded,\n 'tree-node--has-children': node.Children.length > 0,\n 'tree-node--match': node.MatchesSearch,\n [this._styleConfig.NodeClass || '']: !!this._styleConfig.NodeClass,\n [this._styleConfig.SelectedClass || '']: node.Selected && !!this._styleConfig.SelectedClass,\n [this._styleConfig.BranchClass || '']: node.Type === 'branch' && !!this._styleConfig.BranchClass,\n [this._styleConfig.LeafClass || '']: node.Type === 'leaf' && !!this._styleConfig.LeafClass,\n [this._styleConfig.ExpandedClass || '']: node.Expanded && !!this._styleConfig.ExpandedClass\n };\n }\n\n /**\n * Get container classes\n */\n public getContainerClasses(): Record<string, boolean> {\n return {\n 'tree-container': true,\n 'tree-container--loading': this.IsLoading,\n 'tree-container--empty': this.IsLoaded && this.Nodes.length === 0,\n [this._styleConfig.ContainerClass || '']: !!this._styleConfig.ContainerClass\n };\n }\n\n /**\n * Track nodes for ngFor\n */\n public trackNode(index: number, node: TreeNode): string {\n return node.ID;\n }\n\n /**\n * Get label HTML with search text highlighted\n */\n public getHighlightedLabel(node: TreeNode): string {\n const label = node.Label;\n\n // No search text or node doesn't match - return plain label (escaped)\n if (!this.CurrentSearchText || !node.MatchesSearch) {\n return this.escapeHtml(label);\n }\n\n // Find and highlight the matching portion (case-insensitive)\n const searchLower = this.CurrentSearchText.toLowerCase();\n const labelLower = label.toLowerCase();\n const matchIndex = labelLower.indexOf(searchLower);\n\n if (matchIndex === -1) {\n return this.escapeHtml(label);\n }\n\n // Split into before, match, and after parts\n const before = label.substring(0, matchIndex);\n const match = label.substring(matchIndex, matchIndex + this.CurrentSearchText.length);\n const after = label.substring(matchIndex + this.CurrentSearchText.length);\n\n return `${this.escapeHtml(before)}<mark class=\"tree-search-highlight\">${this.escapeHtml(match)}</mark>${this.escapeHtml(after)}`;\n }\n\n /**\n * Escape HTML special characters to prevent XSS\n */\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","<!-- Tree Component Template -->\n<div [ngClass]=\"getContainerClasses()\" tabindex=\"0\">\n\n <!-- Loading State -->\n @if (IsLoading && ShowLoading) {\n <div class=\"tree-loading\">\n <div class=\"tree-loading__spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <span class=\"tree-loading__text\">Loading...</span>\n </div>\n }\n\n <!-- Error State -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"tree-error\">\n <i class=\"fa-solid fa-exclamation-triangle tree-error__icon\"></i>\n <span class=\"tree-error__message\">{{ ErrorMessage }}</span>\n <button class=\"tree-error__retry\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Toolbar -->\n @if (ShowExpandCollapseAll && Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-toolbar\">\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"ExpandAll()\"\n title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"CollapseAll()\"\n title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n }\n\n <!-- Empty State -->\n @if (IsLoaded && Nodes.length === 0 && !ErrorMessage && !IsLoading) {\n <div class=\"tree-empty\">\n <i [class]=\"EmptyIcon + ' tree-empty__icon'\"></i>\n <span class=\"tree-empty__message\">{{ EmptyMessage }}</span>\n </div>\n }\n\n <!-- Tree Content -->\n @if (Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-content\">\n @for (node of Nodes; track trackNode($index, node)) {\n @if (node.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: node }\"></ng-container>\n }\n }\n </div>\n }\n</div>\n\n<!-- Recursive Node Template -->\n<ng-template #nodeTemplate let-node=\"node\">\n <div\n [ngClass]=\"getNodeClasses(node)\"\n [style.padding-left]=\"getNodePadding(node)\"\n [attr.data-node-id]=\"node.ID\"\n [attr.data-node-type]=\"node.Type\"\n [attr.aria-expanded]=\"node.Type === 'branch' ? node.Expanded : null\"\n [attr.aria-selected]=\"node.Selected\"\n role=\"treeitem\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\">\n\n <!-- Toggle Button (for branches with children) -->\n @if (node.Type === 'branch') {\n <span\n class=\"tree-node-toggle\"\n (click)=\"onToggleClick(node, $event)\">\n @if (node.Children.length > 0) {\n <i\n class=\"fa-solid tree-node-toggle__icon\"\n [ngClass]=\"{\n 'fa-chevron-right': !node.Expanded,\n 'fa-chevron-down': node.Expanded\n }\">\n </i>\n }\n @if (node.Children.length === 0) {\n <span\n class=\"tree-node-toggle__spacer\">\n </span>\n }\n </span>\n }\n\n <!-- Leaf Spacer (to align with branches, only when not at root level) -->\n @if (node.Type === 'leaf' && node.Level > 0) {\n <span\n class=\"tree-node-leaf-spacer\"\n >\n </span>\n }\n\n <!-- Icon -->\n @if (ShowIcons) {\n <span\n class=\"tree-node-icon\"\n [style.color]=\"node.Color || null\">\n <i [class]=\"node.Icon\"></i>\n </span>\n }\n\n <!-- Content -->\n <span class=\"tree-node-content\">\n <!-- Label with search highlight -->\n <span class=\"tree-node-label\" [innerHTML]=\"getHighlightedLabel(node)\"></span>\n\n <!-- Description -->\n @if (ShowDescriptions && node.Description) {\n <span\n class=\"tree-node-description\"\n >\n {{ node.Description }}\n </span>\n }\n </span>\n\n <!-- Badge -->\n @if (ShowBadges && node.Badge) {\n <span\n class=\"tree-node-badge\"\n >\n {{ node.Badge }}\n </span>\n }\n\n <!-- Selection Indicator -->\n @if (node.Selected) {\n <span class=\"tree-node-selected-indicator\">\n <i class=\"fa-solid fa-check\"></i>\n </span>\n }\n </div>\n\n <!-- Children (if expanded) -->\n @if (node.Type === 'branch' && node.Expanded && node.Children.length > 0) {\n <div\n class=\"tree-node-children\"\n [class.tree-node-children--animated]=\"AnimateExpandCollapse\"\n role=\"group\">\n @for (child of node.Children; track trackNode($index, child)) {\n @if (child.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n"]}
|
|
1
|
+
{"version":3,"file":"tree.component.js","sourceRoot":"","sources":["../../../src/lib/tree/tree.component.ts","../../../src/lib/tree/tree.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tree Component for @memberjunction/ng-trees\n *\n * A generic, reusable tree component for displaying hierarchical entity data.\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport {\n TreeNode,\n TreeBranchConfig,\n TreeLeafConfig,\n TreeJunctionConfig,\n TreeSelectionMode,\n TreeSelectableTypes,\n TreeStyleConfig,\n TreeKeyboardConfig,\n createDefaultTreeNode\n} from '../models/tree-types';\nimport {\n BeforeNodeSelectEventArgs,\n AfterNodeSelectEventArgs,\n BeforeNodeDeselectEventArgs,\n AfterNodeDeselectEventArgs,\n BeforeNodeExpandEventArgs,\n AfterNodeExpandEventArgs,\n BeforeNodeCollapseEventArgs,\n AfterNodeCollapseEventArgs,\n BeforeNodeClickEventArgs,\n AfterNodeClickEventArgs,\n BeforeNodeDoubleClickEventArgs,\n AfterNodeDoubleClickEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs,\n BeforeKeyboardNavigateEventArgs,\n AfterKeyboardNavigateEventArgs\n} from '../events/tree-events';\n\n@Component({\n standalone: false,\n selector: 'mj-tree',\n templateUrl: './tree.component.html',\n styleUrls: ['./tree.component.css']\n})\nexport class TreeComponent implements OnInit, OnDestroy {\n // ========================================\n // Configuration Inputs with Getter/Setter\n // ========================================\n\n /** Branch (category) entity configuration - REQUIRED */\n private _branchConfig: TreeBranchConfig | null = null;\n @Input()\n set BranchConfig(value: TreeBranchConfig) {\n const previousValue = this._branchConfig;\n this._branchConfig = value;\n // Only reload if config actually changed and we have a valid config\n if (value && previousValue !== value && this.isInitialized) {\n this.clearCache();\n if (this._autoLoad) {\n this.loadData(false);\n }\n }\n }\n get BranchConfig(): TreeBranchConfig {\n return this._branchConfig!;\n }\n\n /** Optional leaf entity configuration */\n private _leafConfig?: TreeLeafConfig;\n @Input()\n set LeafConfig(value: TreeLeafConfig | undefined) {\n const previousValue = this._leafConfig;\n this._leafConfig = value;\n // Only reload if config actually changed\n if (previousValue !== value && this._branchConfig && this.isInitialized) {\n this.clearCache();\n if (this._autoLoad) {\n this.loadData(false);\n }\n }\n }\n get LeafConfig(): TreeLeafConfig | undefined {\n return this._leafConfig;\n }\n\n /** Selection mode: 'single', 'multiple', or 'none' */\n private _selectionMode: TreeSelectionMode = 'single';\n @Input()\n set SelectionMode(value: TreeSelectionMode) {\n this._selectionMode = value;\n }\n get SelectionMode(): TreeSelectionMode {\n return this._selectionMode;\n }\n\n /** What types can be selected: 'branch', 'leaf', or 'both' */\n private _selectableTypes: TreeSelectableTypes = 'both';\n @Input()\n set SelectableTypes(value: TreeSelectableTypes) {\n this._selectableTypes = value;\n }\n get SelectableTypes(): TreeSelectableTypes {\n return this._selectableTypes;\n }\n\n /** Initially selected node IDs */\n private _selectedIDs: string[] = [];\n @Input()\n set SelectedIDs(value: string[]) {\n const previousValue = this._selectedIDs;\n this._selectedIDs = value || [];\n // Only sync selection if the IDs actually changed\n if (this.isInitialized && this.IsLoaded && JSON.stringify(previousValue) !== JSON.stringify(value)) {\n this.syncSelectionFromIDs();\n }\n }\n get SelectedIDs(): string[] {\n return this._selectedIDs;\n }\n\n /** Initially expanded node IDs (null = auto-expand first level) */\n private _expandedIDs: string[] | null = null;\n @Input()\n set ExpandedIDs(value: string[] | null) {\n this._expandedIDs = value;\n }\n get ExpandedIDs(): string[] | null {\n return this._expandedIDs;\n }\n\n /** Show expand/collapse all buttons */\n private _showExpandCollapseAll: boolean = false;\n @Input()\n set ShowExpandCollapseAll(value: boolean) {\n this._showExpandCollapseAll = value;\n }\n get ShowExpandCollapseAll(): boolean {\n return this._showExpandCollapseAll;\n }\n\n /** Enable keyboard navigation */\n private _enableKeyboardNavigation: boolean = true;\n @Input()\n set EnableKeyboardNavigation(value: boolean) {\n this._enableKeyboardNavigation = value;\n }\n get EnableKeyboardNavigation(): boolean {\n return this._enableKeyboardNavigation;\n }\n\n /** Keyboard configuration */\n private _keyboardConfig: TreeKeyboardConfig = {};\n @Input()\n set KeyboardConfig(value: TreeKeyboardConfig) {\n this._keyboardConfig = value || {};\n }\n get KeyboardConfig(): TreeKeyboardConfig {\n return this._keyboardConfig;\n }\n\n /** CSS style overrides */\n private _styleConfig: TreeStyleConfig = {};\n @Input()\n set StyleConfig(value: TreeStyleConfig) {\n this._styleConfig = value || {};\n }\n get StyleConfig(): TreeStyleConfig {\n return this._styleConfig;\n }\n\n /** Indent per level in pixels */\n private _indentSize: number = 20;\n @Input()\n set IndentSize(value: number) {\n this._indentSize = value;\n }\n get IndentSize(): number {\n return this._indentSize;\n }\n\n /** Show loading indicator */\n private _showLoading: boolean = true;\n @Input()\n set ShowLoading(value: boolean) {\n this._showLoading = value;\n }\n get ShowLoading(): boolean {\n return this._showLoading;\n }\n\n /** Empty state message */\n private _emptyMessage: string = 'No items found';\n @Input()\n set EmptyMessage(value: string) {\n this._emptyMessage = value;\n }\n get EmptyMessage(): string {\n return this._emptyMessage;\n }\n\n /** Empty state icon */\n private _emptyIcon: string = 'fa-solid fa-folder-open';\n @Input()\n set EmptyIcon(value: string) {\n this._emptyIcon = value;\n }\n get EmptyIcon(): string {\n return this._emptyIcon;\n }\n\n /** Auto-load data on init */\n private _autoLoad: boolean = true;\n @Input()\n set AutoLoad(value: boolean) {\n this._autoLoad = value;\n }\n get AutoLoad(): boolean {\n return this._autoLoad;\n }\n\n /** Show node icons */\n private _showIcons: boolean = true;\n @Input()\n set ShowIcons(value: boolean) {\n this._showIcons = value;\n }\n get ShowIcons(): boolean {\n return this._showIcons;\n }\n\n /** Show node descriptions */\n private _showDescriptions: boolean = false;\n @Input()\n set ShowDescriptions(value: boolean) {\n this._showDescriptions = value;\n }\n get ShowDescriptions(): boolean {\n return this._showDescriptions;\n }\n\n /** Show node badges */\n private _showBadges: boolean = true;\n @Input()\n set ShowBadges(value: boolean) {\n this._showBadges = value;\n }\n get ShowBadges(): boolean {\n return this._showBadges;\n }\n\n /** Animate expand/collapse */\n private _animateExpandCollapse: boolean = true;\n @Input()\n set AnimateExpandCollapse(value: boolean) {\n this._animateExpandCollapse = value;\n }\n get AnimateExpandCollapse(): boolean {\n return this._animateExpandCollapse;\n }\n\n // ========================================\n // Event Outputs\n // ========================================\n\n @Output() BeforeNodeSelect = new EventEmitter<BeforeNodeSelectEventArgs>();\n @Output() AfterNodeSelect = new EventEmitter<AfterNodeSelectEventArgs>();\n @Output() BeforeNodeDeselect = new EventEmitter<BeforeNodeDeselectEventArgs>();\n @Output() AfterNodeDeselect = new EventEmitter<AfterNodeDeselectEventArgs>();\n @Output() BeforeNodeExpand = new EventEmitter<BeforeNodeExpandEventArgs>();\n @Output() AfterNodeExpand = new EventEmitter<AfterNodeExpandEventArgs>();\n @Output() BeforeNodeCollapse = new EventEmitter<BeforeNodeCollapseEventArgs>();\n @Output() AfterNodeCollapse = new EventEmitter<AfterNodeCollapseEventArgs>();\n @Output() BeforeNodeClick = new EventEmitter<BeforeNodeClickEventArgs>();\n @Output() AfterNodeClick = new EventEmitter<AfterNodeClickEventArgs>();\n @Output() BeforeNodeDoubleClick = new EventEmitter<BeforeNodeDoubleClickEventArgs>();\n @Output() AfterNodeDoubleClick = new EventEmitter<AfterNodeDoubleClickEventArgs>();\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n @Output() BeforeKeyboardNavigate = new EventEmitter<BeforeKeyboardNavigateEventArgs>();\n @Output() AfterKeyboardNavigate = new EventEmitter<AfterKeyboardNavigateEventArgs>();\n\n /** Emitted when selection changes (convenience event with just the selected nodes) */\n @Output() SelectionChange = new EventEmitter<TreeNode[]>();\n\n // ========================================\n // State\n // ========================================\n\n /** Root nodes of the tree */\n public Nodes: TreeNode[] = [];\n\n /** All branch nodes (flat) */\n public AllBranches: TreeNode[] = [];\n\n /** All leaf nodes (flat) */\n public AllLeaves: TreeNode[] = [];\n\n /** Currently selected nodes */\n public SelectedNodes: TreeNode[] = [];\n\n /** Currently focused node (for keyboard navigation) */\n public FocusedNode: TreeNode | null = null;\n\n /** Loading state */\n public IsLoading: boolean = false;\n\n /** Error message if load failed */\n public ErrorMessage: string | null = null;\n\n /** Has data been loaded */\n public IsLoaded: boolean = false;\n\n /** Current search text (for highlighting) */\n public CurrentSearchText: string = '';\n\n // ========================================\n // Private State\n // ========================================\n\n private nodeMap: Map<string, TreeNode> = new Map();\n private isInitialized: boolean = false;\n private isCurrentlyLoading: boolean = false;\n\n /** Instance-level cache for loaded data */\n private cachedNodes: TreeNode[] | null = null;\n private cachedBranches: TreeNode[] | null = null;\n private cachedLeaves: TreeNode[] | null = null;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly elementRef: ElementRef\n ) {}\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.isInitialized = true;\n if (this._autoLoad && this._branchConfig) {\n this.loadData(false);\n }\n }\n\n ngOnDestroy(): void {\n this.clearCache();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Reload tree data (forces fresh load from database)\n */\n public async Refresh(): Promise<void> {\n this.clearCache();\n await this.loadData(true);\n }\n\n /**\n * Get currently selected nodes\n */\n public GetSelectedNodes(): TreeNode[] {\n return [...this.SelectedNodes];\n }\n\n /**\n * Get selected IDs\n */\n public GetSelectedIDs(): string[] {\n return this.SelectedNodes.map(n => n.ID);\n }\n\n /**\n * Programmatically select node(s)\n * @param emitChange Whether to emit SelectionChange event (default: true).\n * Set to false during sync operations to avoid unnecessary events.\n */\n public SelectNodes(ids: string[], emitChange: boolean = true): void {\n const previousSelection = [...this.SelectedNodes];\n const previousIds = previousSelection.map(n => n.ID).sort().join(',');\n\n if (this._selectionMode === 'single' && ids.length > 0) {\n ids = [ids[0]];\n }\n\n this.SelectedNodes = [];\n for (const id of ids) {\n const node = this.nodeMap.get(id);\n if (node && this.isNodeSelectable(node)) {\n node.Selected = true;\n this.SelectedNodes.push(node);\n }\n }\n\n // Deselect previously selected nodes not in new selection\n for (const prev of previousSelection) {\n if (!this.SelectedNodes.includes(prev)) {\n prev.Selected = false;\n }\n }\n\n // Only emit if selection actually changed\n const newIds = this.SelectedNodes.map(n => n.ID).sort().join(',');\n if (emitChange && previousIds !== newIds) {\n this.SelectionChange.emit([...this.SelectedNodes]);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clear selection\n */\n public ClearSelection(): void {\n for (const node of this.SelectedNodes) {\n node.Selected = false;\n }\n this.SelectedNodes = [];\n this.SelectionChange.emit([]);\n this.cdr.detectChanges();\n }\n\n /**\n * Expand all nodes\n */\n public ExpandAll(): void {\n this.expandAllRecursive(this.Nodes);\n this.cdr.detectChanges();\n }\n\n /**\n * Collapse all nodes\n */\n public CollapseAll(): void {\n this.collapseAllRecursive(this.Nodes);\n this.cdr.detectChanges();\n }\n\n /**\n * Expand to specific node (expands all ancestors)\n */\n public ExpandToNode(id: string): TreeNode | null {\n const target = this.nodeMap.get(id);\n if (!target) {\n return null;\n }\n\n // Walk up the tree and expand each ancestor\n let current = target;\n while (current.ParentID && this.nodeMap.has(current.ParentID)) {\n const parent = this.nodeMap.get(current.ParentID)!;\n parent.Expanded = true;\n current = parent;\n }\n\n this.cdr.detectChanges();\n return target;\n }\n\n /**\n * Find node by ID\n */\n public FindNode(id: string): TreeNode | null {\n return this.nodeMap.get(id) || null;\n }\n\n /**\n * Get all nodes matching a predicate\n */\n public FindNodes(predicate: (node: TreeNode) => boolean): TreeNode[] {\n const results: TreeNode[] = [];\n for (const node of this.nodeMap.values()) {\n if (predicate(node)) {\n results.push(node);\n }\n }\n return results;\n }\n\n /**\n * Filter nodes by search text\n */\n public FilterNodes(\n searchText: string,\n options: {\n caseSensitive?: boolean;\n searchBranches?: boolean;\n searchLeaves?: boolean;\n searchDescription?: boolean;\n } = {}\n ): TreeNode[] {\n const {\n caseSensitive = false,\n searchBranches = true,\n searchLeaves = true,\n searchDescription = false\n } = options;\n\n // Store search text for highlighting\n this.CurrentSearchText = searchText.trim();\n\n if (!searchText.trim()) {\n // Reset all nodes to visible\n this.setVisibilityRecursive(this.Nodes, true, false);\n this.cdr.detectChanges();\n return [];\n }\n\n const searchLower = caseSensitive ? searchText : searchText.toLowerCase();\n const matchedNodes: TreeNode[] = [];\n\n // First pass: mark matching nodes\n this.markMatchingNodesRecursive(\n this.Nodes,\n searchLower,\n caseSensitive,\n searchBranches,\n searchLeaves,\n searchDescription,\n matchedNodes\n );\n\n // Second pass: make ancestors of matches visible\n this.makeAncestorsVisibleRecursive(this.Nodes);\n\n this.cdr.detectChanges();\n return matchedNodes;\n }\n\n /**\n * Clear cache (call before Refresh if you want fresh data)\n */\n public ClearCache(): void {\n this.clearCache();\n }\n\n // ========================================\n // Template Event Handlers\n // ========================================\n\n /**\n * Handle node click\n */\n public onNodeClick(node: TreeNode, event: MouseEvent): void {\n // Fire before click event\n const beforeClickEvent = new BeforeNodeClickEventArgs(this, node, event);\n this.BeforeNodeClick.emit(beforeClickEvent);\n\n if (beforeClickEvent.Cancel) {\n return;\n }\n\n // Set focus\n this.FocusedNode = node;\n\n // Handle toggle for branches\n if (node.Type === 'branch' && node.Children.length > 0) {\n // Click on the chevron area toggles expansion\n const target = event.target as HTMLElement;\n if (target.closest('.tree-node-toggle')) {\n this.toggleNodeExpansion(node);\n return;\n }\n }\n\n // Handle selection\n if (this._selectionMode !== 'none' && this.isNodeSelectable(node)) {\n this.handleNodeSelection(node, event);\n }\n\n // Fire after click event\n const afterClickEvent = new AfterNodeClickEventArgs(this, node, event);\n this.AfterNodeClick.emit(afterClickEvent);\n }\n\n /**\n * Handle node double-click\n */\n public onNodeDoubleClick(node: TreeNode, event: MouseEvent): void {\n // Fire before event\n const beforeEvent = new BeforeNodeDoubleClickEventArgs(this, node, event);\n this.BeforeNodeDoubleClick.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n // Toggle expansion for branches\n if (node.Type === 'branch') {\n this.toggleNodeExpansion(node);\n }\n\n // Fire after event\n const afterEvent = new AfterNodeDoubleClickEventArgs(this, node, event);\n this.AfterNodeDoubleClick.emit(afterEvent);\n }\n\n /**\n * Handle toggle click\n */\n public onToggleClick(node: TreeNode, event: MouseEvent): void {\n event.stopPropagation();\n this.toggleNodeExpansion(node);\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('keydown', ['$event'])\n public onKeyDown(event: KeyboardEvent): void {\n if (!this._enableKeyboardNavigation) {\n return;\n }\n\n const visibleNodes = this.getVisibleNodesInOrder(this.Nodes);\n if (visibleNodes.length === 0) {\n return;\n }\n\n const currentIndex = this.FocusedNode\n ? visibleNodes.indexOf(this.FocusedNode)\n : -1;\n\n let targetNode: TreeNode | null = null;\n let handled = false;\n\n switch (event.key) {\n case 'ArrowDown':\n if (currentIndex < visibleNodes.length - 1) {\n targetNode = visibleNodes[currentIndex + 1];\n }\n handled = true;\n break;\n\n case 'ArrowUp':\n if (currentIndex > 0) {\n targetNode = visibleNodes[currentIndex - 1];\n } else if (currentIndex === -1 && visibleNodes.length > 0) {\n targetNode = visibleNodes[visibleNodes.length - 1];\n }\n handled = true;\n break;\n\n case 'ArrowRight':\n if (this.FocusedNode?.Type === 'branch') {\n if (!this.FocusedNode.Expanded && this.FocusedNode.Children.length > 0) {\n this.expandNode(this.FocusedNode);\n } else if (this.FocusedNode.Expanded && this.FocusedNode.Children.length > 0) {\n // Move to first child\n const firstVisible = this.FocusedNode.Children.find(c => c.Visible);\n if (firstVisible) {\n targetNode = firstVisible;\n }\n }\n }\n handled = true;\n break;\n\n case 'ArrowLeft':\n if (this.FocusedNode?.Type === 'branch' && this.FocusedNode.Expanded) {\n this.collapseNode(this.FocusedNode);\n } else if (this.FocusedNode?.ParentID) {\n // Move to parent\n targetNode = this.nodeMap.get(this.FocusedNode.ParentID) || null;\n }\n handled = true;\n break;\n\n case 'Enter':\n case ' ':\n if (this.FocusedNode && this._selectionMode !== 'none' && this.isNodeSelectable(this.FocusedNode)) {\n this.handleNodeSelection(this.FocusedNode, event as unknown as MouseEvent);\n }\n handled = true;\n break;\n\n case 'Home':\n if (visibleNodes.length > 0) {\n targetNode = visibleNodes[0];\n }\n handled = true;\n break;\n\n case 'End':\n if (visibleNodes.length > 0) {\n targetNode = visibleNodes[visibleNodes.length - 1];\n }\n handled = true;\n break;\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (targetNode && targetNode !== this.FocusedNode) {\n // Fire before navigate event\n const beforeEvent = new BeforeKeyboardNavigateEventArgs(\n this,\n event,\n this.FocusedNode,\n targetNode\n );\n this.BeforeKeyboardNavigate.emit(beforeEvent);\n\n if (!beforeEvent.Cancel) {\n const previousNode = this.FocusedNode;\n this.FocusedNode = targetNode;\n\n // Fire after navigate event\n const afterEvent = new AfterKeyboardNavigateEventArgs(\n this,\n event.key,\n previousNode,\n this.FocusedNode\n );\n this.AfterKeyboardNavigate.emit(afterEvent);\n\n this.scrollNodeIntoView(targetNode);\n this.cdr.detectChanges();\n }\n }\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n /**\n * Load tree data\n */\n private async loadData(forceRefresh: boolean): Promise<void> {\n if (!this._branchConfig) {\n console.warn('[TreeComponent] loadData() - BranchConfig is required');\n return;\n }\n\n // Prevent concurrent loads\n if (this.isCurrentlyLoading) {\n return;\n }\n\n // Check instance cache first (unless force refresh)\n if (!forceRefresh && this.cachedNodes) {\n this.Nodes = this.cloneNodes(this.cachedNodes);\n this.AllBranches = this.cloneNodes(this.cachedBranches || []);\n this.AllLeaves = this.cloneNodes(this.cachedLeaves || []);\n this.nodeMap = this.buildNodeMap(this.Nodes);\n this.applyInitialExpansion();\n this.syncSelectionFromIDs();\n this.IsLoaded = true;\n this.cdr.detectChanges();\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDataLoadEventArgs(this, this._branchConfig, this._leafConfig);\n this.BeforeDataLoad.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.isCurrentlyLoading = true;\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n const startTime = performance.now();\n\n // Apply any modified filters from event\n const branchConfig = { ...this._branchConfig };\n if (beforeEvent.ModifiedBranchFilter !== undefined) {\n branchConfig.ExtraFilter = beforeEvent.ModifiedBranchFilter;\n }\n\n const leafConfig = this._leafConfig ? { ...this._leafConfig } : undefined;\n if (leafConfig && beforeEvent.ModifiedLeafFilter !== undefined) {\n leafConfig.ExtraFilter = beforeEvent.ModifiedLeafFilter;\n }\n\n try {\n // Load branches and leaves in parallel\n const [branchData, leafData] = await Promise.all([\n this.loadBranches(branchConfig),\n leafConfig ? this.loadLeaves(leafConfig) : Promise.resolve([])\n ]);\n\n // Build tree structure\n const { rootNodes, allBranches, branchMap } = this.buildBranchHierarchy(branchData, branchConfig);\n\n // Load junction mappings if configured (for M2M relationships)\n let junctionMappings: Map<string, string[]> | null = null;\n if (leafConfig?.JunctionConfig) {\n junctionMappings = await this.loadJunctionMappings(leafConfig.JunctionConfig, leafConfig.IDField || 'ID');\n }\n\n // Attach leaves to branches (or root if orphans)\n const allLeaves = this.attachLeavesToBranches(rootNodes, branchMap, leafData, leafConfig, junctionMappings);\n\n const loadTimeMs = performance.now() - startTime;\n\n // Store in instance cache\n this.cachedNodes = this.cloneNodes(rootNodes);\n this.cachedBranches = this.cloneNodes(allBranches);\n this.cachedLeaves = this.cloneNodes(allLeaves);\n\n // Set state\n this.Nodes = rootNodes;\n this.AllBranches = allBranches;\n this.AllLeaves = allLeaves;\n this.nodeMap = this.buildNodeMap(this.Nodes);\n this.IsLoading = false;\n this.IsLoaded = true;\n this.isCurrentlyLoading = false;\n\n // Apply initial expansion\n this.applyInitialExpansion();\n\n // Apply initial selection\n this.syncSelectionFromIDs();\n\n // Fire after event\n const afterEvent = new AfterDataLoadEventArgs(\n this,\n true,\n allBranches.length,\n allLeaves.length,\n loadTimeMs,\n undefined\n );\n this.AfterDataLoad.emit(afterEvent);\n\n } catch (error) {\n const loadTimeMs = performance.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error('[TreeComponent] loadData() error:', errorMessage, error);\n\n this.IsLoading = false;\n this.IsLoaded = true;\n this.isCurrentlyLoading = false;\n this.ErrorMessage = errorMessage;\n this.Nodes = [];\n this.AllBranches = [];\n this.AllLeaves = [];\n\n // Fire after event with error\n const afterEvent = new AfterDataLoadEventArgs(\n this,\n false,\n 0,\n 0,\n loadTimeMs,\n errorMessage\n );\n this.AfterDataLoad.emit(afterEvent);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load branch entities from database\n */\n private async loadBranches(config: TreeBranchConfig): Promise<Record<string, unknown>[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: config.EntityName,\n ExtraFilter: config.ExtraFilter || '',\n OrderBy: config.OrderBy || 'Name ASC',\n ResultType: 'simple',\n CacheLocal: config.CacheLocal ?? true\n });\n\n console.debug('[TreeComponent] Branches query result:', {\n entityName: config.EntityName,\n filter: config.ExtraFilter || '(none)',\n cacheLocal: config.CacheLocal ?? true,\n success: result.Success,\n recordCount: result.Results?.length || 0,\n records: result.Results?.map((r: Record<string, unknown>) => ({ ID: r['ID'], Name: r['Name'] }))\n });\n\n if (!result.Success) {\n throw new Error(`Failed to load branches: ${result.ErrorMessage}`);\n }\n\n return result.Results as Record<string, unknown>[];\n }\n\n /**\n * Load leaf entities from database\n */\n private async loadLeaves(config: TreeLeafConfig): Promise<Record<string, unknown>[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: config.EntityName,\n ExtraFilter: config.ExtraFilter || '',\n OrderBy: config.OrderBy || 'Name ASC',\n ResultType: 'simple',\n CacheLocal: config.CacheLocal ?? true\n });\n\n console.debug('[TreeComponent] Leaves query result:', {\n entityName: config.EntityName,\n filter: config.ExtraFilter || '(none)',\n cacheLocal: config.CacheLocal ?? true,\n success: result.Success,\n recordCount: result.Results?.length || 0,\n records: result.Results?.map((r: Record<string, unknown>) => ({ ID: r['ID'], Name: r['Name'] }))\n });\n\n if (!result.Success) {\n throw new Error(`Failed to load leaves: ${result.ErrorMessage}`);\n }\n\n return result.Results as Record<string, unknown>[];\n }\n\n /**\n * Load junction mappings for M2M relationships.\n * Returns a map of leafId -> branchIds[]\n */\n private async loadJunctionMappings(\n junctionConfig: TreeJunctionConfig,\n leafIdField: string\n ): Promise<Map<string, string[]>> {\n const rv = new RunView();\n const mappings = new Map<string, string[]>();\n\n // Load junction records\n const junctionResult = await rv.RunView({\n EntityName: junctionConfig.EntityName,\n ExtraFilter: junctionConfig.ExtraFilter || '',\n ResultType: 'simple',\n CacheLocal: junctionConfig.CacheLocal ?? true\n });\n\n console.debug('[TreeComponent] Junction query result:', {\n entityName: junctionConfig.EntityName,\n filter: junctionConfig.ExtraFilter || '(none)',\n cacheLocal: junctionConfig.CacheLocal ?? true,\n success: junctionResult.Success,\n recordCount: junctionResult.Results?.length || 0,\n records: junctionResult.Results\n });\n\n if (!junctionResult.Success) {\n console.warn(`Failed to load junction data: ${junctionResult.ErrorMessage}`);\n return mappings;\n }\n\n const junctionRecords = junctionResult.Results as Record<string, unknown>[];\n\n // If there's an indirect mapping, we need to resolve it\n if (junctionConfig.IndirectLeafMapping) {\n const indirect = junctionConfig.IndirectLeafMapping;\n\n // Load the intermediate entity records to build the mapping\n const intermediateResult = await rv.RunView({\n EntityName: indirect.IntermediateEntity,\n ExtraFilter: indirect.ExtraFilter || '',\n ResultType: 'simple',\n CacheLocal: indirect.CacheLocal ?? true\n });\n\n console.debug('[TreeComponent] Intermediate entity query result:', {\n entityName: indirect.IntermediateEntity,\n filter: indirect.ExtraFilter || '(none)',\n cacheLocal: indirect.CacheLocal ?? true,\n success: intermediateResult.Success,\n recordCount: intermediateResult.Results?.length || 0,\n records: intermediateResult.Results\n });\n\n if (!intermediateResult.Success) {\n console.warn(`Failed to load intermediate data: ${intermediateResult.ErrorMessage}`);\n return mappings;\n }\n\n // Build intermediate ID -> leaf ID map\n const intermediateToLeaf = new Map<string, string>();\n for (const record of intermediateResult.Results as Record<string, unknown>[]) {\n const intermediateId = String(record[indirect.IntermediateIDField] || '');\n const leafId = String(record[indirect.LeafIDField] || '');\n if (intermediateId && leafId) {\n intermediateToLeaf.set(intermediateId, leafId);\n }\n }\n\n console.debug('[TreeComponent] Intermediate to leaf mapping:', {\n mapSize: intermediateToLeaf.size,\n entries: Array.from(intermediateToLeaf.entries())\n });\n\n // Now process junction records using the intermediate mapping\n for (const junction of junctionRecords) {\n const intermediateId = String(junction[junctionConfig.LeafForeignKey] || '');\n const branchId = String(junction[junctionConfig.BranchForeignKey] || '');\n\n if (intermediateId && branchId) {\n const leafId = intermediateToLeaf.get(intermediateId);\n if (leafId) {\n if (!mappings.has(leafId)) {\n mappings.set(leafId, []);\n }\n const branchIds = mappings.get(leafId)!;\n if (!branchIds.includes(branchId)) {\n branchIds.push(branchId);\n }\n }\n }\n }\n } else {\n // Direct mapping - junction directly references the leaf\n for (const junction of junctionRecords) {\n const leafId = String(junction[junctionConfig.LeafForeignKey] || '');\n const branchId = String(junction[junctionConfig.BranchForeignKey] || '');\n\n if (leafId && branchId) {\n if (!mappings.has(leafId)) {\n mappings.set(leafId, []);\n }\n const branchIds = mappings.get(leafId)!;\n if (!branchIds.includes(branchId)) {\n branchIds.push(branchId);\n }\n }\n }\n }\n\n console.debug('[TreeComponent] Final junction mappings (leafId -> branchIds):', {\n mapSize: mappings.size,\n entries: Array.from(mappings.entries())\n });\n\n return mappings;\n }\n\n /**\n * Build branch hierarchy from flat data\n */\n private buildBranchHierarchy(\n branchData: Record<string, unknown>[],\n config: TreeBranchConfig\n ): { rootNodes: TreeNode[]; allBranches: TreeNode[]; branchMap: Map<string, TreeNode> } {\n const idField = config.IDField || 'ID';\n const parentIdField = config.ParentIDField || 'ParentID';\n const displayField = config.DisplayField || 'Name';\n\n const nodeMap = new Map<string, TreeNode>();\n const allBranches: TreeNode[] = [];\n\n for (const data of branchData) {\n const id = String(data[idField] || '');\n const parentId = data[parentIdField] ? String(data[parentIdField]) : null;\n\n const node = createDefaultTreeNode({\n ID: id,\n Label: String(data[displayField] || ''),\n Type: 'branch',\n ParentID: parentId,\n Icon: this.getNodeIcon(data, config.IconField, config.DefaultIcon || 'fa-solid fa-folder'),\n Color: this.getNodeColor(data, config.ColorField, config.DefaultColor),\n Data: { ...data },\n Description: config.DescriptionField ? String(data[config.DescriptionField] || '') : undefined,\n Badge: config.BadgeField ? String(data[config.BadgeField] || '') : undefined,\n EntityName: config.EntityName\n });\n\n nodeMap.set(id, node);\n allBranches.push(node);\n }\n\n // Build parent-child relationships\n const rootNodes: TreeNode[] = [];\n\n for (const node of allBranches) {\n if (node.ParentID && nodeMap.has(node.ParentID)) {\n const parent = nodeMap.get(node.ParentID)!;\n parent.Children.push(node);\n node.Level = this.calculateLevel(node, nodeMap);\n } else {\n rootNodes.push(node);\n node.Level = 0;\n }\n }\n\n // Sort children at each level\n this.sortChildrenRecursive(rootNodes);\n\n return { rootNodes, allBranches, branchMap: nodeMap };\n }\n\n /**\n * Attach leaf nodes to their parent branches or root level.\n * Supports both direct parent field relationships and M2M junction mappings.\n *\n * @param rootNodes Root nodes to attach orphan leaves to\n * @param branchMap Map of branch IDs to branch nodes\n * @param leafData Raw leaf data from database\n * @param config Leaf configuration\n * @param junctionMappings Optional M2M mappings (leafId -> branchIds[])\n */\n private attachLeavesToBranches(\n rootNodes: TreeNode[],\n branchMap: Map<string, TreeNode>,\n leafData: Record<string, unknown>[],\n config?: TreeLeafConfig,\n junctionMappings?: Map<string, string[]> | null\n ): TreeNode[] {\n if (!config || leafData.length === 0) {\n return [];\n }\n\n const idField = config.IDField || 'ID';\n const parentField = config.ParentField;\n const displayField = config.DisplayField || 'Name';\n const useJunction = !!junctionMappings && junctionMappings.size > 0;\n\n console.debug('[TreeComponent] attachLeavesToBranches input:', {\n leafDataCount: leafData.length,\n leafIds: leafData.map((d: Record<string, unknown>) => ({ id: d[idField], name: d[displayField] })),\n branchMapKeys: Array.from(branchMap.keys()),\n branchMapEntries: Array.from(branchMap.entries()).map(([k, v]) => ({ id: k, name: v.Label })),\n useJunction,\n junctionMappingKeys: junctionMappings ? Array.from(junctionMappings.keys()) : []\n });\n\n const allLeaves: TreeNode[] = [];\n const addedLeafIds = new Set<string>(); // Track leaves already added to avoid duplicates\n\n for (const data of leafData) {\n const id = String(data[idField] || '');\n\n // If using junction mappings, only include leaves that have junction entries\n if (useJunction && !junctionMappings!.has(id)) {\n console.debug(`[TreeComponent] Skipping leaf ${id} (${data[displayField]}) - not in junction mappings`);\n continue; // Skip leaves not in any branch via junction\n }\n\n const leaf = createDefaultTreeNode({\n ID: id,\n Label: String(data[displayField] || ''),\n Type: 'leaf',\n ParentID: null, // Will be set based on attachment\n Icon: this.getNodeIcon(data, config.IconField, config.DefaultIcon || 'fa-solid fa-file'),\n Data: { ...data },\n Description: config.DescriptionField ? String(data[config.DescriptionField] || '') : undefined,\n Badge: config.BadgeField ? String(data[config.BadgeField] || '') : undefined,\n EntityName: config.EntityName\n });\n\n allLeaves.push(leaf);\n console.debug(`[TreeComponent] Processing leaf ${id} (${leaf.Label})`);\n\n if (useJunction) {\n // M2M relationship: attach to all mapped branches\n const branchIds = junctionMappings!.get(id) || [];\n let attached = false;\n\n console.debug(`[TreeComponent] Leaf ${id} junction branchIds:`, branchIds);\n\n for (const branchId of branchIds) {\n if (branchMap.has(branchId)) {\n const parent = branchMap.get(branchId)!;\n console.debug(`[TreeComponent] Attaching leaf ${id} to branch ${branchId} (${parent.Label})`);\n\n if (!attached) {\n // First attachment: use the original leaf\n leaf.ParentID = branchId;\n leaf.Level = parent.Level + 1;\n parent.Children.push(leaf);\n attached = true;\n } else {\n // Additional attachments: create a clone of the leaf\n // This allows the same artifact to appear under multiple collections\n const leafClone = createDefaultTreeNode({\n ...leaf,\n ParentID: branchId,\n Level: parent.Level + 1,\n Children: [],\n Data: { ...leaf.Data }\n });\n parent.Children.push(leafClone);\n }\n } else {\n console.debug(`[TreeComponent] Branch ${branchId} NOT FOUND in branchMap for leaf ${id}`);\n }\n }\n\n // If no valid branch found, add to root\n if (!attached) {\n console.debug(`[TreeComponent] Leaf ${id} not attached to any branch, adding to root`);\n rootNodes.push(leaf);\n leaf.Level = 0;\n }\n } else {\n // Direct parent field relationship\n const parentFieldValue = parentField ? data[parentField] : null;\n const parentId = parentFieldValue ? String(parentFieldValue) : null;\n leaf.ParentID = parentId;\n\n if (parentId && branchMap.has(parentId)) {\n const parent = branchMap.get(parentId)!;\n parent.Children.push(leaf);\n leaf.Level = parent.Level + 1;\n } else {\n // Orphan leaf (no parent or parent not found) - add to root level\n rootNodes.push(leaf);\n leaf.Level = 0;\n }\n }\n }\n\n // Re-sort children to interleave branches and leaves properly\n this.sortChildrenByTypeAndName(rootNodes);\n for (const branch of branchMap.values()) {\n this.sortChildrenByTypeAndName(branch.Children);\n }\n\n return allLeaves;\n }\n\n /**\n * Calculate node level in hierarchy\n */\n private calculateLevel(node: TreeNode, nodeMap: Map<string, TreeNode>): number {\n let level = 0;\n let current = node;\n\n while (current.ParentID && nodeMap.has(current.ParentID)) {\n level++;\n current = nodeMap.get(current.ParentID)!;\n if (level > 100) break; // Safety for circular refs\n }\n\n return level;\n }\n\n /**\n * Sort children recursively (alphabetically)\n */\n private sortChildrenRecursive(nodes: TreeNode[]): void {\n nodes.sort((a, b) => a.Label.localeCompare(b.Label));\n\n for (const node of nodes) {\n if (node.Children.length > 0) {\n this.sortChildrenRecursive(node.Children);\n }\n }\n }\n\n /**\n * Sort children: branches first (alphabetically), then leaves (alphabetically)\n */\n private sortChildrenByTypeAndName(nodes: TreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.Type !== b.Type) {\n return a.Type === 'branch' ? -1 : 1;\n }\n return a.Label.localeCompare(b.Label);\n });\n }\n\n /**\n * Get icon for a node from field or default\n */\n private getNodeIcon(\n data: Record<string, unknown>,\n iconField?: string,\n defaultIcon: string = 'fa-solid fa-folder'\n ): string {\n if (iconField && data[iconField]) {\n return String(data[iconField]);\n }\n return defaultIcon;\n }\n\n /**\n * Get color for a node from field or default\n */\n private getNodeColor(\n data: Record<string, unknown>,\n colorField?: string,\n defaultColor?: string\n ): string | undefined {\n if (colorField && data[colorField]) {\n return String(data[colorField]);\n }\n return defaultColor;\n }\n\n /**\n * Clear instance cache\n */\n private clearCache(): void {\n this.cachedNodes = null;\n this.cachedBranches = null;\n this.cachedLeaves = null;\n }\n\n /**\n * Deep clone tree nodes\n */\n private cloneNodes(nodes: TreeNode[]): TreeNode[] {\n return nodes.map(node => this.cloneNode(node));\n }\n\n private cloneNode(node: TreeNode): TreeNode {\n return {\n ...node,\n Data: { ...node.Data },\n Children: this.cloneNodes(node.Children)\n };\n }\n\n /**\n * Build a flat map of all nodes by ID\n */\n private buildNodeMap(nodes: TreeNode[]): Map<string, TreeNode> {\n const map = new Map<string, TreeNode>();\n this.addNodesToMapRecursive(nodes, map);\n return map;\n }\n\n private addNodesToMapRecursive(nodes: TreeNode[], map: Map<string, TreeNode>): void {\n for (const node of nodes) {\n map.set(node.ID, node);\n this.addNodesToMapRecursive(node.Children, map);\n }\n }\n\n // ========================================\n // Private Methods - Tree Operations\n // ========================================\n\n /**\n * Apply initial expansion state\n */\n private applyInitialExpansion(): void {\n if (this._expandedIDs === null) {\n // Auto-expand first level\n for (const node of this.Nodes) {\n if (node.Type === 'branch') {\n node.Expanded = true;\n }\n }\n } else {\n // Expand specified nodes\n for (const id of this._expandedIDs) {\n const node = this.nodeMap.get(id);\n if (node && node.Type === 'branch') {\n node.Expanded = true;\n }\n }\n }\n }\n\n /**\n * Sync selection state from SelectedIDs input\n */\n private syncSelectionFromIDs(): void {\n // Clear current selection\n for (const node of this.SelectedNodes) {\n node.Selected = false;\n }\n this.SelectedNodes = [];\n\n // Apply new selection\n for (const id of this._selectedIDs) {\n const node = this.nodeMap.get(id);\n if (node && this.isNodeSelectable(node)) {\n node.Selected = true;\n this.SelectedNodes.push(node);\n }\n }\n }\n\n /**\n * Check if a node can be selected based on SelectableTypes\n */\n private isNodeSelectable(node: TreeNode): boolean {\n if (this._selectableTypes === 'both') return true;\n return node.Type === this._selectableTypes;\n }\n\n /**\n * Handle node selection logic\n */\n private handleNodeSelection(node: TreeNode, event: MouseEvent | KeyboardEvent): void {\n const isCtrlClick = event.ctrlKey || event.metaKey;\n const isSelected = node.Selected;\n const previousSelection = [...this.SelectedNodes];\n\n if (isSelected) {\n // Deselect\n const beforeEvent = new BeforeNodeDeselectEventArgs(this, node, previousSelection);\n this.BeforeNodeDeselect.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Selected = false;\n this.SelectedNodes = this.SelectedNodes.filter(n => n !== node);\n\n const afterEvent = new AfterNodeDeselectEventArgs(\n this,\n node,\n [...this.SelectedNodes],\n previousSelection\n );\n this.AfterNodeDeselect.emit(afterEvent);\n } else {\n // Select\n const isAdditive = this._selectionMode === 'multiple' && isCtrlClick;\n\n const beforeEvent = new BeforeNodeSelectEventArgs(\n this,\n node,\n isAdditive,\n previousSelection\n );\n this.BeforeNodeSelect.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n if (this._selectionMode === 'single' || !isAdditive) {\n // Clear previous selection\n for (const prev of this.SelectedNodes) {\n prev.Selected = false;\n }\n this.SelectedNodes = [];\n }\n\n node.Selected = true;\n this.SelectedNodes.push(node);\n\n const afterEvent = new AfterNodeSelectEventArgs(\n this,\n node,\n isAdditive,\n [...this.SelectedNodes],\n previousSelection\n );\n this.AfterNodeSelect.emit(afterEvent);\n }\n\n this.SelectionChange.emit([...this.SelectedNodes]);\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle node expansion\n */\n private toggleNodeExpansion(node: TreeNode): void {\n if (node.Expanded) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n /**\n * Expand a node\n */\n private expandNode(node: TreeNode): void {\n if (node.Type !== 'branch' || node.Children.length === 0) {\n return;\n }\n\n const beforeEvent = new BeforeNodeExpandEventArgs(this, node);\n this.BeforeNodeExpand.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Expanded = true;\n\n const afterEvent = new AfterNodeExpandEventArgs(\n this,\n node,\n node.Children.filter(c => c.Visible).length\n );\n this.AfterNodeExpand.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Collapse a node\n */\n private collapseNode(node: TreeNode): void {\n if (node.Type !== 'branch') {\n return;\n }\n\n const beforeEvent = new BeforeNodeCollapseEventArgs(this, node);\n this.BeforeNodeCollapse.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n node.Expanded = false;\n\n const afterEvent = new AfterNodeCollapseEventArgs(this, node);\n this.AfterNodeCollapse.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Expand all nodes recursively\n */\n private expandAllRecursive(nodes: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Type === 'branch') {\n node.Expanded = true;\n this.expandAllRecursive(node.Children);\n }\n }\n }\n\n /**\n * Collapse all nodes recursively\n */\n private collapseAllRecursive(nodes: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Type === 'branch') {\n node.Expanded = false;\n this.collapseAllRecursive(node.Children);\n }\n }\n }\n\n /**\n * Get all visible nodes in tree order\n */\n private getVisibleNodesInOrder(nodes: TreeNode[]): TreeNode[] {\n const result: TreeNode[] = [];\n this.collectVisibleNodesRecursive(nodes, result);\n return result;\n }\n\n private collectVisibleNodesRecursive(nodes: TreeNode[], result: TreeNode[]): void {\n for (const node of nodes) {\n if (node.Visible) {\n result.push(node);\n if (node.Expanded && node.Type === 'branch') {\n this.collectVisibleNodesRecursive(node.Children, result);\n }\n }\n }\n }\n\n /**\n * Scroll a node into view\n */\n private scrollNodeIntoView(node: TreeNode): void {\n const element = this.elementRef.nativeElement.querySelector(\n `[data-node-id=\"${node.ID}\"]`\n );\n if (element) {\n element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n\n // ========================================\n // Private Methods - Search/Filter\n // ========================================\n\n /**\n * Set visibility recursively\n */\n private setVisibilityRecursive(nodes: TreeNode[], visible: boolean, matchesSearch: boolean): void {\n for (const node of nodes) {\n node.Visible = visible;\n node.MatchesSearch = matchesSearch;\n this.setVisibilityRecursive(node.Children, visible, matchesSearch);\n }\n }\n\n /**\n * Recursively mark nodes that match the search\n */\n private markMatchingNodesRecursive(\n nodes: TreeNode[],\n searchText: string,\n caseSensitive: boolean,\n searchBranches: boolean,\n searchLeaves: boolean,\n searchDescription: boolean,\n matchedNodes: TreeNode[]\n ): boolean {\n let hasVisibleChild = false;\n\n for (const node of nodes) {\n const shouldSearch =\n (node.Type === 'branch' && searchBranches) ||\n (node.Type === 'leaf' && searchLeaves);\n\n let matches = false;\n if (shouldSearch) {\n const label = caseSensitive ? node.Label : node.Label.toLowerCase();\n matches = label.includes(searchText);\n\n if (!matches && searchDescription && node.Description) {\n const desc = caseSensitive ? node.Description : node.Description.toLowerCase();\n matches = desc.includes(searchText);\n }\n }\n\n node.MatchesSearch = matches;\n\n const childHasMatch = this.markMatchingNodesRecursive(\n node.Children,\n searchText,\n caseSensitive,\n searchBranches,\n searchLeaves,\n searchDescription,\n matchedNodes\n );\n\n node.Visible = matches || childHasMatch;\n\n if (matches) {\n matchedNodes.push(node);\n }\n\n if (node.Visible) {\n hasVisibleChild = true;\n }\n }\n\n return hasVisibleChild;\n }\n\n /**\n * Make ancestors of visible nodes also visible\n */\n private makeAncestorsVisibleRecursive(nodes: TreeNode[]): boolean {\n let hasVisibleChild = false;\n\n for (const node of nodes) {\n const childVisible = this.makeAncestorsVisibleRecursive(node.Children);\n\n if (childVisible && !node.Visible) {\n node.Visible = true;\n }\n\n if (node.Visible) {\n hasVisibleChild = true;\n }\n }\n\n return hasVisibleChild;\n }\n\n // ========================================\n // Template Helpers\n // ========================================\n\n /**\n * Get the padding for a node based on its level\n */\n public getNodePadding(node: TreeNode): string {\n const basePadding = node.Level * this._indentSize;\n // Root-level leaves need a small indent since they have no toggle button\n // to align them with nested items\n if (node.Type === 'leaf' && node.Level === 0) {\n return `${basePadding + 8}px`;\n }\n return `${basePadding}px`;\n }\n\n /**\n * Get CSS classes for a node\n */\n public getNodeClasses(node: TreeNode): Record<string, boolean> {\n return {\n 'tree-node': true,\n 'tree-node--branch': node.Type === 'branch',\n 'tree-node--leaf': node.Type === 'leaf',\n 'tree-node--root-level': node.Level === 0,\n 'tree-node--selected': node.Selected,\n 'tree-node--focused': node === this.FocusedNode,\n 'tree-node--expanded': node.Expanded,\n 'tree-node--has-children': node.Children.length > 0,\n 'tree-node--match': node.MatchesSearch,\n [this._styleConfig.NodeClass || '']: !!this._styleConfig.NodeClass,\n [this._styleConfig.SelectedClass || '']: node.Selected && !!this._styleConfig.SelectedClass,\n [this._styleConfig.BranchClass || '']: node.Type === 'branch' && !!this._styleConfig.BranchClass,\n [this._styleConfig.LeafClass || '']: node.Type === 'leaf' && !!this._styleConfig.LeafClass,\n [this._styleConfig.ExpandedClass || '']: node.Expanded && !!this._styleConfig.ExpandedClass\n };\n }\n\n /**\n * Get container classes\n */\n public getContainerClasses(): Record<string, boolean> {\n return {\n 'tree-container': true,\n 'tree-container--loading': this.IsLoading,\n 'tree-container--empty': this.IsLoaded && this.Nodes.length === 0,\n [this._styleConfig.ContainerClass || '']: !!this._styleConfig.ContainerClass\n };\n }\n\n /**\n * Track nodes for ngFor\n */\n public trackNode(index: number, node: TreeNode): string {\n return node.ID;\n }\n\n /**\n * Get label HTML with search text highlighted\n */\n public getHighlightedLabel(node: TreeNode): string {\n const label = node.Label;\n\n // No search text or node doesn't match - return plain label (escaped)\n if (!this.CurrentSearchText || !node.MatchesSearch) {\n return this.escapeHtml(label);\n }\n\n // Find and highlight the matching portion (case-insensitive)\n const searchLower = this.CurrentSearchText.toLowerCase();\n const labelLower = label.toLowerCase();\n const matchIndex = labelLower.indexOf(searchLower);\n\n if (matchIndex === -1) {\n return this.escapeHtml(label);\n }\n\n // Split into before, match, and after parts\n const before = label.substring(0, matchIndex);\n const match = label.substring(matchIndex, matchIndex + this.CurrentSearchText.length);\n const after = label.substring(matchIndex + this.CurrentSearchText.length);\n\n return `${this.escapeHtml(before)}<mark class=\"tree-search-highlight\">${this.escapeHtml(match)}</mark>${this.escapeHtml(after)}`;\n }\n\n /**\n * Escape HTML special characters to prevent XSS\n */\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","<!-- Tree Component Template -->\n<div [ngClass]=\"getContainerClasses()\" tabindex=\"0\">\n\n <!-- Loading State -->\n @if (IsLoading && ShowLoading) {\n <div class=\"tree-loading\">\n <div class=\"tree-loading__spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <span class=\"tree-loading__text\">Loading...</span>\n </div>\n }\n\n <!-- Error State -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"tree-error\">\n <i class=\"fa-solid fa-exclamation-triangle tree-error__icon\"></i>\n <span class=\"tree-error__message\">{{ ErrorMessage }}</span>\n <button class=\"tree-error__retry\" (click)=\"Refresh()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Toolbar -->\n @if (ShowExpandCollapseAll && Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-toolbar\">\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"ExpandAll()\"\n title=\"Expand All\">\n <i class=\"fa-solid fa-plus-square\"></i>\n </button>\n <button\n class=\"tree-toolbar__btn\"\n (click)=\"CollapseAll()\"\n title=\"Collapse All\">\n <i class=\"fa-solid fa-minus-square\"></i>\n </button>\n </div>\n }\n\n <!-- Empty State -->\n @if (IsLoaded && Nodes.length === 0 && !ErrorMessage && !IsLoading) {\n <div class=\"tree-empty\">\n <i [class]=\"EmptyIcon + ' tree-empty__icon'\"></i>\n <span class=\"tree-empty__message\">{{ EmptyMessage }}</span>\n </div>\n }\n\n <!-- Tree Content -->\n @if (Nodes.length > 0 && !IsLoading) {\n <div class=\"tree-content\">\n @for (node of Nodes; track trackNode($index, node)) {\n @if (node.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: node }\"></ng-container>\n }\n }\n </div>\n }\n</div>\n\n<!-- Recursive Node Template -->\n<ng-template #nodeTemplate let-node=\"node\">\n <div\n [ngClass]=\"getNodeClasses(node)\"\n [style.padding-left]=\"getNodePadding(node)\"\n [attr.data-node-id]=\"node.ID\"\n [attr.data-node-type]=\"node.Type\"\n [attr.aria-expanded]=\"node.Type === 'branch' ? node.Expanded : null\"\n [attr.aria-selected]=\"node.Selected\"\n role=\"treeitem\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\">\n\n <!-- Toggle Button (for branches with children) -->\n @if (node.Type === 'branch') {\n <span\n class=\"tree-node-toggle\"\n (click)=\"onToggleClick(node, $event)\">\n @if (node.Children.length > 0) {\n <i\n class=\"fa-solid tree-node-toggle__icon\"\n [ngClass]=\"{\n 'fa-chevron-right': !node.Expanded,\n 'fa-chevron-down': node.Expanded\n }\">\n </i>\n }\n @if (node.Children.length === 0) {\n <span\n class=\"tree-node-toggle__spacer\">\n </span>\n }\n </span>\n }\n\n <!-- Leaf Spacer (to align with branches, only when not at root level) -->\n @if (node.Type === 'leaf' && node.Level > 0) {\n <span\n class=\"tree-node-leaf-spacer\"\n >\n </span>\n }\n\n <!-- Icon -->\n @if (ShowIcons) {\n <span\n class=\"tree-node-icon\"\n [style.color]=\"node.Color || null\">\n <i [class]=\"node.Icon\"></i>\n </span>\n }\n\n <!-- Content -->\n <span class=\"tree-node-content\">\n <!-- Label with search highlight -->\n <span class=\"tree-node-label\" [innerHTML]=\"getHighlightedLabel(node)\"></span>\n\n <!-- Description -->\n @if (ShowDescriptions && node.Description) {\n <span\n class=\"tree-node-description\"\n >\n {{ node.Description }}\n </span>\n }\n </span>\n\n <!-- Badge -->\n @if (ShowBadges && node.Badge) {\n <span\n class=\"tree-node-badge\"\n >\n {{ node.Badge }}\n </span>\n }\n\n <!-- Selection Indicator -->\n @if (node.Selected) {\n <span class=\"tree-node-selected-indicator\">\n <i class=\"fa-solid fa-check\"></i>\n </span>\n }\n </div>\n\n <!-- Children (if expanded) -->\n @if (node.Type === 'branch' && node.Expanded && node.Children.length > 0) {\n <div\n class=\"tree-node-children\"\n [class.tree-node-children--animated]=\"AnimateExpandCollapse\"\n role=\"group\">\n @for (child of node.Children; track trackNode($index, child)) {\n @if (child.Visible) {\n <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-trees",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.10.1",
|
|
4
4
|
"description": "MemberJunction: Angular tree and tree dropdown components for hierarchical entity selection",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
"@angular/forms": "21.1.3"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@memberjunction/core": "5.
|
|
36
|
-
"@memberjunction/core-entities": "5.
|
|
37
|
-
"@memberjunction/global": "5.
|
|
35
|
+
"@memberjunction/core": "5.10.1",
|
|
36
|
+
"@memberjunction/core-entities": "5.10.1",
|
|
37
|
+
"@memberjunction/global": "5.10.1",
|
|
38
38
|
"tslib": "^2.8.1",
|
|
39
39
|
"rxjs": "^7.8.2"
|
|
40
40
|
},
|