@memberjunction/ng-trees 5.23.0 → 5.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"tree-dropdown.component.d.ts","sourceRoot":"","sources":["../../../src/lib/tree-dropdown/tree-dropdown.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree-dropdown.component.d.ts","sourceRoot":"","sources":["../../../src/lib/tree-dropdown/tree-dropdown.component.ts"],"names":[],"mappings":"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"}
@@ -298,12 +298,21 @@ export class TreeDropdownComponent {
298
298
  this.IsOpen = true;
299
299
  this.calculatePosition();
300
300
  this.attachEventListeners();
301
- // Focus search input after opening
302
- setTimeout(() => {
301
+ // Focus search input after opening — use microtask + fallback to ensure it works
302
+ // even when Angular change detection hasn't yet rendered the @if block
303
+ Promise.resolve().then(() => {
303
304
  if (this.EnableSearch && this.searchInput) {
304
305
  this.searchInput.nativeElement.focus();
305
306
  }
306
- }, 50);
307
+ else {
308
+ // Fallback: the @if block may not have rendered yet, retry after a frame
309
+ setTimeout(() => {
310
+ if (this.EnableSearch && this.searchInput) {
311
+ this.searchInput.nativeElement.focus();
312
+ }
313
+ }, 100);
314
+ }
315
+ });
307
316
  // Fire after event
308
317
  const afterEvent = new AfterDropdownOpenEventArgs(this, this.Position?.renderAbove ? 'above' : 'below');
309
318
  this.AfterDropdownOpen.emit(afterEvent);
@@ -420,8 +429,8 @@ export class TreeDropdownComponent {
420
429
  break;
421
430
  case 'ArrowDown':
422
431
  event.preventDefault();
423
- // Focus first tree node
424
- if (this.treeComponent) {
432
+ // Focus first tree node — guard against null/empty state
433
+ if (this.treeComponent?.Nodes?.length) {
425
434
  const visibleNodes = this.getVisibleNodesInOrder(this.treeComponent.Nodes);
426
435
  if (visibleNodes.length > 0) {
427
436
  this.treeComponent.FocusedNode = visibleNodes[0];
@@ -692,7 +701,8 @@ export class TreeDropdownComponent {
692
701
  return;
693
702
  }
694
703
  const searchText = beforeEvent.ModifiedSearchText ?? text;
695
- if (!this.treeComponent) {
704
+ // Guard: tree component may not be ready or may have no nodes loaded
705
+ if (!this.treeComponent || !this.IsLoaded) {
696
706
  return;
697
707
  }
698
708
  const matchedNodes = this.treeComponent.FilterNodes(searchText, {
@@ -701,14 +711,14 @@ export class TreeDropdownComponent {
701
711
  searchLeaves: this.SearchConfig.SearchLeaves ?? true,
702
712
  searchDescription: this.SearchConfig.SearchDescription
703
713
  });
704
- // Auto-expand to show matches
705
- if (this.SearchConfig.AutoExpandMatches !== false && searchText.trim()) {
714
+ // Auto-expand to show matches — guard against empty results
715
+ if (matchedNodes.length > 0 && this.SearchConfig.AutoExpandMatches !== false && searchText.trim()) {
706
716
  for (const node of matchedNodes) {
707
717
  this.treeComponent.ExpandToNode(node.ID);
708
718
  }
709
719
  }
710
720
  // Fire after event
711
- const afterEvent = new AfterSearchEventArgs(this, searchText, matchedNodes);
721
+ const afterEvent = new AfterSearchEventArgs(this, searchText, matchedNodes ?? []);
712
722
  this.AfterSearch.emit(afterEvent);
713
723
  this.cdr.detectChanges();
714
724
  }
@@ -716,7 +726,7 @@ export class TreeDropdownComponent {
716
726
  * Clear search filter
717
727
  */
718
728
  clearSearch() {
719
- if (this.treeComponent) {
729
+ if (this.treeComponent?.Nodes?.length) {
720
730
  this.treeComponent.FilterNodes('', {});
721
731
  this.cdr.detectChanges();
722
732
  }
@@ -725,15 +735,19 @@ export class TreeDropdownComponent {
725
735
  * Get all visible nodes in tree order (for keyboard navigation)
726
736
  */
727
737
  getVisibleNodesInOrder(nodes) {
738
+ if (!nodes || nodes.length === 0)
739
+ return [];
728
740
  const result = [];
729
741
  this.collectVisibleNodesRecursive(nodes, result);
730
742
  return result;
731
743
  }
732
744
  collectVisibleNodesRecursive(nodes, result) {
745
+ if (!nodes)
746
+ return;
733
747
  for (const node of nodes) {
734
748
  if (node.Visible) {
735
749
  result.push(node);
736
- if (node.Expanded && node.Type === 'branch') {
750
+ if (node.Expanded && node.Type === 'branch' && node.Children?.length) {
737
751
  this.collectVisibleNodesRecursive(node.Children, result);
738
752
  }
739
753
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tree-dropdown.component.js","sourceRoot":"","sources":["../../../src/lib/tree-dropdown/tree-dropdown.component.ts","../../../src/lib/tree-dropdown/tree-dropdown.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tree Dropdown Component for @memberjunction/ng-trees\n *\n * A searchable dropdown with tree selection. Features:\n * - Smart positioning (auto-flips above/below based on available space)\n * - Portal rendering to avoid clipping\n * - Type-ahead search with highlighting\n * - Keyboard navigation\n * - Single and multi-select modes\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n ViewChild,\n ElementRef, // Still needed for ViewChild type references\n Renderer2,\n AfterViewInit\n} from '@angular/core';\nimport {\n TreeNode,\n TreeBranchConfig,\n TreeLeafConfig,\n TreeSelectionMode,\n TreeSelectableTypes,\n TreeStyleConfig,\n TreeSearchConfig,\n TreeDropdownConfig\n} from '../models/tree-types';\nimport {\n BeforeNodeSelectEventArgs,\n AfterNodeSelectEventArgs,\n BeforeSearchEventArgs,\n AfterSearchEventArgs,\n BeforeDropdownOpenEventArgs,\n AfterDropdownOpenEventArgs,\n BeforeDropdownCloseEventArgs,\n AfterDropdownCloseEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs\n} from '../events/tree-events';\nimport { TreeComponent } from '../tree/tree.component';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\n\n/**\n * Dropdown position calculation result\n */\ninterface DropdownPosition {\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n renderAbove: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-tree-dropdown',\n templateUrl: './tree-dropdown.component.html',\n styleUrls: ['./tree-dropdown.component.css']\n})\nexport class TreeDropdownComponent implements OnInit, OnDestroy, AfterViewInit {\n // ========================================\n // Tree Configuration (passed to inner tree)\n // ========================================\n\n /** Branch (category) entity configuration - REQUIRED */\n @Input() BranchConfig!: TreeBranchConfig;\n\n /** Optional leaf entity configuration */\n @Input() LeafConfig?: TreeLeafConfig;\n\n /** Selection mode: 'single' or 'multiple' */\n @Input() SelectionMode: TreeSelectionMode = 'single';\n\n /** What types can be selected: 'branch', 'leaf', or 'both' */\n @Input() SelectableTypes: TreeSelectableTypes = 'both';\n\n // ========================================\n // Value Inputs\n // ========================================\n\n /** Current selected value (CompositeKey for single, CompositeKeys for multiple) */\n private _value: CompositeKey | CompositeKey[] | null = null;\n\n /**\n * The selected value as a CompositeKey (single select) or array of CompositeKeys (multi-select).\n * CompositeKey supports both simple single-field primary keys and composite primary keys.\n *\n * @example Single select with simple ID:\n * ```typescript\n * dropdown.Value = CompositeKey.FromID('some-guid');\n * ```\n *\n * @example Single select with composite key:\n * ```typescript\n * dropdown.Value = new CompositeKey([\n * { FieldName: 'Field1', Value: 'value1' },\n * { FieldName: 'Field2', Value: 'value2' }\n * ]);\n * ```\n *\n * @example Multi-select:\n * ```typescript\n * dropdown.Value = [\n * CompositeKey.FromID('guid1'),\n * CompositeKey.FromID('guid2')\n * ];\n * ```\n */\n @Input()\n set Value(val: CompositeKey | CompositeKey[] | null) {\n if (!CompositeKey.EqualsEx(val, this._value)) {\n this._value = val;\n // If tree is loaded, sync selection immediately\n if (this.IsLoaded && this.treeComponent) {\n this.syncValueToSelection();\n } else {\n // Tree not loaded yet - fetch display text directly via Metadata\n this.fetchDisplayTextForValue(val);\n }\n }\n }\n get Value(): CompositeKey | CompositeKey[] | null {\n return this._value;\n }\n \n /** Cached display text for showing in trigger before tree loads */\n private _pendingDisplayText: string | null = null;\n\n // ========================================\n // Dropdown-specific Inputs\n // ========================================\n\n /** Placeholder text when nothing selected */\n @Input() Placeholder: string = 'Select...';\n\n /** Enable search filtering */\n @Input() EnableSearch: boolean = true;\n\n /** Search configuration */\n @Input() SearchConfig: TreeSearchConfig = {};\n\n /** Dropdown configuration */\n @Input() DropdownConfig: TreeDropdownConfig = {};\n\n /** Style configuration */\n @Input() StyleConfig: TreeStyleConfig = {};\n\n /** Show clear button */\n @Input() Clearable: boolean = true;\n\n /** Disabled state */\n @Input() Disabled: boolean = false;\n\n /** Show node icons in display */\n @Input() ShowIconInDisplay: boolean = true;\n\n /** Auto-load data on init */\n @Input() AutoLoad: boolean = true;\n\n /** Show loading in trigger */\n @Input() ShowLoadingInTrigger: boolean = true;\n\n // ========================================\n // Event Outputs\n // ========================================\n\n /** Emitted when value changes */\n @Output() ValueChange = new EventEmitter<CompositeKey | CompositeKey[] | null>();\n\n /** Emitted with full node(s) when selection changes */\n @Output() SelectionChange = new EventEmitter<TreeNode | TreeNode[] | null>();\n\n // Bubble up tree events\n @Output() BeforeNodeSelect = new EventEmitter<BeforeNodeSelectEventArgs>();\n @Output() AfterNodeSelect = new EventEmitter<AfterNodeSelectEventArgs>();\n @Output() BeforeSearch = new EventEmitter<BeforeSearchEventArgs>();\n @Output() AfterSearch = new EventEmitter<AfterSearchEventArgs>();\n @Output() BeforeDropdownOpen = new EventEmitter<BeforeDropdownOpenEventArgs>();\n @Output() AfterDropdownOpen = new EventEmitter<AfterDropdownOpenEventArgs>();\n @Output() BeforeDropdownClose = new EventEmitter<BeforeDropdownCloseEventArgs>();\n @Output() AfterDropdownClose = new EventEmitter<AfterDropdownCloseEventArgs>();\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n\n // ========================================\n // ViewChild References\n // ========================================\n\n @ViewChild('triggerElement') triggerElement!: ElementRef<HTMLElement>;\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\n @ViewChild('dropdownPanel') dropdownPanel!: ElementRef<HTMLElement>;\n @ViewChild('treeComponent') treeComponent!: TreeComponent;\n\n // ========================================\n // State\n // ========================================\n\n /** Is dropdown open */\n public IsOpen: boolean = false;\n\n /** Dropdown position */\n public Position: DropdownPosition | null = null;\n\n /** Search text */\n public SearchText: string = '';\n\n /** Selected nodes (for display) */\n public SelectedNodes: TreeNode[] = [];\n\n /** Is tree loading */\n public IsLoading: boolean = false;\n\n /** Has data loaded */\n public IsLoaded: boolean = false;\n\n /** Dropdown portal element */\n private dropdownPortal: HTMLElement | null = null;\n\n /** Search debounce subject */\n private searchSubject = new Subject<string>();\n\n /** Destroy subject */\n private destroy$ = new Subject<void>();\n\n /** Click outside listener */\n private clickOutsideListener: (() => void) | null = null;\n\n /** Scroll listener */\n private scrollListener: (() => void) | null = null;\n\n /** Resize listener */\n private resizeListener: (() => void) | null = null;\n\n /** Pending load promise resolvers */\n private _loadResolvers: Array<() => void> = [];\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly renderer: Renderer2\n ) {}\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n // Setup search debounce\n const debounceMs = this.SearchConfig.DebounceMs ?? 200;\n this.searchSubject.pipe(\n debounceTime(debounceMs),\n takeUntil(this.destroy$)\n ).subscribe(text => {\n this.performSearch(text);\n });\n }\n\n ngAfterViewInit(): void {\n // Create portal element\n this.createDropdownPortal();\n }\n\n // Note: Value changes are handled by the getter/setter pattern\n // No ngOnChanges needed for that property\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeDropdownPortal();\n this.removeEventListeners();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Returns a promise that resolves when the tree data has finished loading.\n * If data is already loaded, the promise resolves immediately.\n *\n * Use this method when you need to perform operations that depend on the tree\n * being fully loaded, such as programmatically selecting nodes or accessing\n * the tree structure.\n *\n * Note: For setting initial values, you typically don't need this method -\n * just set the `Value` input and the component will automatically display\n * the correct text by looking up the record name via Metadata.\n *\n * @returns A promise that resolves when the tree data is loaded\n * @example\n * ```typescript\n * // Wait for tree to load before accessing tree structure\n * await treeDropdown.WaitForDataLoad();\n * const nodes = treeDropdown.treeComponent.Nodes;\n * ```\n */\n public WaitForDataLoad(): Promise<void> {\n if (this.IsLoaded) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this._loadResolvers.push(resolve);\n });\n }\n\n /**\n * Open the dropdown\n */\n public Open(): void {\n if (this.Disabled || this.IsOpen) {\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDropdownOpenEventArgs(this);\n this.BeforeDropdownOpen.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.IsOpen = true;\n this.calculatePosition();\n this.attachEventListeners();\n\n // Focus search input after opening\n setTimeout(() => {\n if (this.EnableSearch && this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }, 50);\n\n // Fire after event\n const afterEvent = new AfterDropdownOpenEventArgs(\n this,\n this.Position?.renderAbove ? 'above' : 'below'\n );\n this.AfterDropdownOpen.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Close the dropdown\n */\n public Close(reason: 'selection' | 'escape' | 'outsideClick' | 'programmatic' = 'programmatic'): void {\n if (!this.IsOpen) {\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDropdownCloseEventArgs(this, reason);\n this.BeforeDropdownClose.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.IsOpen = false;\n this.SearchText = '';\n this.clearSearch();\n this.removeEventListeners();\n\n // Fire after event\n const afterEvent = new AfterDropdownCloseEventArgs(this, reason);\n this.AfterDropdownClose.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle dropdown\n */\n public Toggle(): void {\n if (this.IsOpen) {\n this.Close('programmatic');\n } else {\n this.Open();\n }\n }\n\n /**\n * Clear selection\n */\n public Clear(event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n }\n\n this.SelectedNodes = [];\n this._value = null;\n this._pendingDisplayText = null;\n\n if (this.treeComponent) {\n this.treeComponent.ClearSelection();\n }\n\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(null);\n this.cdr.detectChanges();\n }\n\n /**\n * Refresh tree data\n */\n public async Refresh(): Promise<void> {\n if (this.treeComponent) {\n await this.treeComponent.Refresh();\n }\n }\n\n // ========================================\n // Template Event Handlers\n // ========================================\n\n /**\n * Handle trigger click\n */\n public onTriggerClick(): void {\n \n if (!this.Disabled) {\n this.Toggle();\n }\n }\n\n /**\n * Handle trigger keydown\n */\n public onTriggerKeyDown(event: KeyboardEvent): void {\n if (this.Disabled) {\n return;\n }\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n this.Open();\n break;\n case 'Escape':\n if (this.IsOpen) {\n event.preventDefault();\n this.Close('escape');\n }\n break;\n }\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.SearchText = value;\n this.searchSubject.next(value);\n }\n\n /**\n * Handle search keydown\n */\n public onSearchKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.Close('escape');\n break;\n case 'ArrowDown':\n event.preventDefault();\n // Focus first tree node\n if (this.treeComponent) {\n const visibleNodes = this.getVisibleNodesInOrder(this.treeComponent.Nodes);\n if (visibleNodes.length > 0) {\n this.treeComponent.FocusedNode = visibleNodes[0];\n this.cdr.detectChanges();\n }\n }\n break;\n }\n }\n\n /**\n * Handle clear search\n */\n public onClearSearch(): void {\n this.SearchText = '';\n this.clearSearch();\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n\n /**\n * Handle tree selection change\n */\n public onTreeSelectionChange(nodes: TreeNode[]): void {\n \n this.SelectedNodes = nodes;\n\n // Clear pending display text since we now have real nodes\n this._pendingDisplayText = null;\n\n // Update value - convert node IDs to CompositeKeys\n if (this.SelectionMode === 'single') {\n this._value = nodes.length > 0 ? CompositeKey.FromID(nodes[0].ID) : null;\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(nodes.length > 0 ? nodes[0] : null);\n\n // Close on selection in single mode (unless disabled)\n // Only close if user actually selected something (not on empty selection from sync)\n \n if (this.DropdownConfig.CloseOnSelect !== false && nodes.length > 0) {\n \n this.Close('selection');\n }\n } else {\n this._value = nodes.map(n => CompositeKey.FromID(n.ID));\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(nodes.length > 0 ? nodes : null);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Handle tree data load events\n */\n public onTreeBeforeDataLoad(event: BeforeDataLoadEventArgs): void {\n \n this.IsLoading = true;\n this.BeforeDataLoad.emit(event);\n this.cdr.detectChanges();\n }\n\n public onTreeAfterDataLoad(event: AfterDataLoadEventArgs): void {\n \n \n this.IsLoading = false;\n this.IsLoaded = true;\n\n // Resolve all pending WaitForDataLoad() promises\n const resolvers = this._loadResolvers;\n this._loadResolvers = [];\n for (const resolve of resolvers) {\n resolve();\n }\n\n // Sync selection after load - defer to next microtask to ensure ViewChild is resolved\n Promise.resolve().then(() => {\n \n if (this.treeComponent) {\n \n \n }\n this.syncValueToSelection();\n this.cdr.detectChanges();\n });\n\n this.AfterDataLoad.emit(event);\n this.cdr.detectChanges();\n }\n\n /**\n * Bubble tree events\n */\n public onTreeBeforeNodeSelect(event: BeforeNodeSelectEventArgs): void {\n this.BeforeNodeSelect.emit(event);\n }\n\n public onTreeAfterNodeSelect(event: AfterNodeSelectEventArgs): void {\n this.AfterNodeSelect.emit(event);\n }\n\n // ========================================\n // Private Methods\n // ========================================\n\n /**\n * Create dropdown portal element (attached to body)\n */\n private createDropdownPortal(): void {\n this.dropdownPortal = this.renderer.createElement('div');\n this.renderer.addClass(this.dropdownPortal, 'mj-tree-dropdown-portal');\n this.renderer.setStyle(this.dropdownPortal, 'position', 'fixed');\n this.renderer.setStyle(this.dropdownPortal, 'z-index', '10000');\n this.renderer.setStyle(this.dropdownPortal, 'display', 'none');\n this.renderer.appendChild(document.body, this.dropdownPortal);\n }\n\n /**\n * Remove dropdown portal\n */\n private removeDropdownPortal(): void {\n if (this.dropdownPortal && this.dropdownPortal.parentNode) {\n this.dropdownPortal.parentNode.removeChild(this.dropdownPortal);\n this.dropdownPortal = null;\n }\n }\n\n /**\n * Calculate dropdown position\n */\n private calculatePosition(): void {\n if (!this.triggerElement) {\n return;\n }\n\n const triggerRect = this.triggerElement.nativeElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n // Parse max height from config\n const maxHeightConfig = this.DropdownConfig.MaxHeight || '300px';\n const maxHeightPx = parseInt(maxHeightConfig, 10) || 300;\n\n // Calculate available space\n const spaceBelow = viewportHeight - triggerRect.bottom - 8; // 8px margin\n const spaceAbove = triggerRect.top - 8;\n\n // Determine if we should render above or below\n let renderAbove = false;\n let maxHeight = maxHeightPx;\n\n if (this.DropdownConfig.Position === 'above') {\n renderAbove = true;\n maxHeight = Math.min(maxHeightPx, spaceAbove);\n } else if (this.DropdownConfig.Position === 'below') {\n renderAbove = false;\n maxHeight = Math.min(maxHeightPx, spaceBelow);\n } else {\n // Auto position\n if (spaceBelow < maxHeightPx && spaceAbove > spaceBelow) {\n renderAbove = true;\n maxHeight = Math.min(maxHeightPx, spaceAbove);\n } else {\n renderAbove = false;\n maxHeight = Math.min(maxHeightPx, spaceBelow);\n }\n }\n\n // Calculate width\n const minWidth = this.DropdownConfig.MinWidth\n ? parseInt(this.DropdownConfig.MinWidth, 10)\n : triggerRect.width;\n const width = Math.max(minWidth, triggerRect.width);\n\n // Ensure dropdown doesn't go off screen horizontally\n let left = triggerRect.left;\n if (left + width > viewportWidth - 8) {\n left = viewportWidth - width - 8;\n }\n if (left < 8) {\n left = 8;\n }\n\n // Calculate top position\n let top: number;\n if (renderAbove) {\n top = triggerRect.top - maxHeight - 4;\n } else {\n top = triggerRect.bottom + 4;\n }\n\n this.Position = {\n top,\n left,\n width,\n maxHeight,\n renderAbove\n };\n }\n\n /**\n * Attach event listeners for click outside, scroll, resize\n */\n private attachEventListeners(): void {\n \n // Click outside - defer with a small timeout to:\n // 1. Allow the opening click event to complete\n // 2. Ensure the dropdown panel DOM element is fully rendered\n // 3. Allow Angular change detection to complete\n if (this.DropdownConfig.CloseOnOutsideClick !== false) {\n \n setTimeout(() => {\n \n // Only attach if still open (could have been closed in the meantime)\n if (!this.IsOpen) {\n \n return;\n }\n \n this.clickOutsideListener = this.renderer.listen('document', 'click', (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n \n \n // Double check we're still open\n if (!this.IsOpen) {\n \n return;\n }\n const isInsideTrigger = this.triggerElement?.nativeElement?.contains(target);\n // Check if click is inside the dropdown panel (rendered inline, not in portal)\n const isInsideDropdown = this.dropdownPanel?.nativeElement?.contains(target);\n \n \n\n if (!isInsideTrigger && !isInsideDropdown) {\n \n this.Close('outsideClick');\n } else {\n \n }\n });\n }, 100); // 100ms delay to ensure DOM is stable\n } else {\n \n }\n\n // Escape key\n if (this.DropdownConfig.CloseOnEscape !== false) {\n document.addEventListener('keydown', this.handleEscapeKey);\n }\n\n // Scroll - reposition dropdown\n this.scrollListener = this.renderer.listen('window', 'scroll', () => {\n if (this.IsOpen) {\n this.calculatePosition();\n this.updateDropdownPortalPosition();\n }\n });\n\n // Resize - reposition dropdown\n this.resizeListener = this.renderer.listen('window', 'resize', () => {\n if (this.IsOpen) {\n this.calculatePosition();\n this.updateDropdownPortalPosition();\n }\n });\n }\n\n /**\n * Remove event listeners\n */\n private removeEventListeners(): void {\n if (this.clickOutsideListener) {\n this.clickOutsideListener();\n this.clickOutsideListener = null;\n }\n\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n if (this.scrollListener) {\n this.scrollListener();\n this.scrollListener = null;\n }\n\n if (this.resizeListener) {\n this.resizeListener();\n this.resizeListener = null;\n }\n }\n\n /**\n * Handle escape key\n */\n private handleEscapeKey = (event: KeyboardEvent): void => {\n \n if (event.key === 'Escape' && this.IsOpen) {\n this.Close('escape');\n }\n };\n\n /**\n * Update dropdown portal position\n */\n private updateDropdownPortalPosition(): void {\n if (!this.dropdownPortal || !this.Position) {\n return;\n }\n\n this.renderer.setStyle(this.dropdownPortal, 'top', `${this.Position.top}px`);\n this.renderer.setStyle(this.dropdownPortal, 'left', `${this.Position.left}px`);\n this.renderer.setStyle(this.dropdownPortal, 'width', `${this.Position.width}px`);\n }\n\n /**\n * Perform search on tree\n */\n private performSearch(text: string): void {\n // Fire before event\n const beforeEvent = new BeforeSearchEventArgs(this, text);\n this.BeforeSearch.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n const searchText = beforeEvent.ModifiedSearchText ?? text;\n\n if (!this.treeComponent) {\n return;\n }\n\n const matchedNodes = this.treeComponent.FilterNodes(\n searchText,\n {\n caseSensitive: this.SearchConfig.CaseSensitive,\n searchBranches: this.SearchConfig.SearchBranches ?? true,\n searchLeaves: this.SearchConfig.SearchLeaves ?? true,\n searchDescription: this.SearchConfig.SearchDescription\n }\n );\n\n // Auto-expand to show matches\n if (this.SearchConfig.AutoExpandMatches !== false && searchText.trim()) {\n for (const node of matchedNodes) {\n this.treeComponent.ExpandToNode(node.ID);\n }\n }\n\n // Fire after event\n const afterEvent = new AfterSearchEventArgs(this, searchText, matchedNodes);\n this.AfterSearch.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Clear search filter\n */\n private clearSearch(): void {\n if (this.treeComponent) {\n this.treeComponent.FilterNodes('', {});\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get all visible nodes in tree order (for keyboard navigation)\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 * Sync value to tree selection\n */\n private syncValueToSelection(): void {\n if (!this.treeComponent || !this.IsLoaded) {\n return;\n }\n\n // Convert CompositeKey(s) to string IDs for tree selection\n const ids = this.getSelectedIDsArray();\n\n // Pass emitChange=false to avoid emitting SelectionChange during sync\n // This prevents unnecessary events and parent component confusion\n this.treeComponent.SelectNodes(ids, false);\n\n // Use try-catch as defensive measure since tree component may not be fully ready\n try {\n this.SelectedNodes = this.treeComponent.GetSelectedNodes() || [];\n } catch {\n this.SelectedNodes = [];\n }\n\n // Clear pending display text since we now have real nodes\n this._pendingDisplayText = null;\n\n this.cdr.detectChanges();\n }\n\n /**\n * Fetch display text for value before tree loads using Metadata.GetEntityRecordName\n */\n private async fetchDisplayTextForValue(val: CompositeKey | CompositeKey[] | null): Promise<void> {\n if (!val || !this.LeafConfig) {\n this._pendingDisplayText = null;\n this.cdr.detectChanges();\n return;\n }\n\n try {\n const md = new Metadata();\n const entityName = this.LeafConfig.EntityName;\n\n if (Array.isArray(val)) {\n // Multiple selection\n if (val.length === 0) {\n this._pendingDisplayText = null;\n } else if (val.length === 1) {\n this._pendingDisplayText = await md.GetEntityRecordName(entityName, val[0]);\n } else {\n this._pendingDisplayText = `${val.length} items selected`;\n }\n } else {\n // Single selection\n this._pendingDisplayText = await md.GetEntityRecordName(entityName, val);\n }\n } catch (error) {\n console.warn('[TreeDropdown] Failed to fetch display text:', error);\n this._pendingDisplayText = null;\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Template Helpers\n // ========================================\n\n /**\n * Get display text for selected value(s)\n */\n public getDisplayText(): string {\n // If we have selected nodes from the tree, use those\n if (this.SelectedNodes.length > 0) {\n if (this.SelectionMode === 'single') {\n return this.SelectedNodes[0].Label;\n }\n\n // Multiple selection\n if (this.SelectedNodes.length === 1) {\n return this.SelectedNodes[0].Label;\n }\n\n return `${this.SelectedNodes.length} items selected`;\n }\n\n // If tree not loaded but we have pending display text from Metadata lookup\n if (this._pendingDisplayText) {\n return this._pendingDisplayText;\n }\n\n return '';\n }\n\n /**\n * Get display icon for single selection\n */\n public getDisplayIcon(): string | null {\n if (!this.ShowIconInDisplay || this.SelectedNodes.length !== 1) {\n return null;\n }\n return this.SelectedNodes[0].Icon;\n }\n\n /**\n * Get display color for single selection\n */\n public getDisplayColor(): string | null {\n if (this.SelectedNodes.length !== 1) {\n return null;\n }\n return this.SelectedNodes[0].Color || null;\n }\n\n /**\n * Check if has selection\n */\n public hasSelection(): boolean {\n return this.SelectedNodes.length > 0 || this._pendingDisplayText != null;\n }\n\n /**\n * Get dropdown panel styles\n */\n public getDropdownStyles(): Record<string, string> {\n if (!this.Position) {\n return {};\n }\n\n return {\n top: `${this.Position.top}px`,\n left: `${this.Position.left}px`,\n width: `${this.Position.width}px`,\n maxHeight: `${this.Position.maxHeight}px`\n };\n }\n\n /**\n * Get trigger classes\n */\n public getTriggerClasses(): Record<string, boolean> {\n return {\n 'tree-dropdown-trigger': true,\n 'tree-dropdown-trigger--open': this.IsOpen,\n 'tree-dropdown-trigger--disabled': this.Disabled,\n 'tree-dropdown-trigger--has-value': this.hasSelection(),\n 'tree-dropdown-trigger--loading': this.IsLoading && this.ShowLoadingInTrigger\n };\n }\n\n /**\n * Get selected IDs as a string array for passing to tree component.\n * Extracts the first key value from each CompositeKey (typically the ID field).\n */\n public getSelectedIDsArray(): string[] {\n if (!this._value) {\n return [];\n }\n\n const keys = Array.isArray(this._value) ? this._value : [this._value];\n return keys.map(key => {\n // Get the first value from the composite key (usually the ID)\n const firstValue = key.GetValueByIndex(0);\n return firstValue != null ? String(firstValue) : '';\n }).filter(id => id !== '');\n }\n}\n","<!-- Tree Dropdown Component Template -->\n<div class=\"tree-dropdown\" [class.tree-dropdown--disabled]=\"Disabled\">\n\n <!-- Trigger Button -->\n <div\n #triggerElement\n [ngClass]=\"getTriggerClasses()\"\n [class]=\"StyleConfig.SearchInputClass || ''\"\n tabindex=\"0\"\n role=\"combobox\"\n [attr.aria-expanded]=\"IsOpen\"\n [attr.aria-haspopup]=\"'tree'\"\n [attr.aria-disabled]=\"Disabled\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeyDown($event)\">\n\n <!-- Selected Value Display -->\n <div class=\"tree-dropdown-trigger__content\">\n <!-- Icon -->\n @if (getDisplayIcon()) {\n <span\n class=\"tree-dropdown-trigger__icon\"\n [style.color]=\"getDisplayColor()\">\n <i [class]=\"getDisplayIcon()\"></i>\n </span>\n }\n\n <!-- Text -->\n <span\n class=\"tree-dropdown-trigger__text\"\n [class.tree-dropdown-trigger__text--placeholder]=\"!hasSelection()\">\n {{ hasSelection() ? getDisplayText() : Placeholder }}\n </span>\n\n <!-- Loading Spinner -->\n @if (IsLoading && ShowLoadingInTrigger) {\n <span class=\"tree-dropdown-trigger__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </span>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"tree-dropdown-trigger__actions\">\n <!-- Clear Button -->\n @if (Clearable && hasSelection() && !Disabled) {\n <button\n type=\"button\"\n class=\"tree-dropdown-trigger__clear\"\n (click)=\"Clear($event)\"\n title=\"Clear selection\"\n tabindex=\"-1\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n\n <!-- Chevron -->\n <span class=\"tree-dropdown-trigger__chevron\">\n <i\n class=\"fa-solid\"\n [ngClass]=\"IsOpen ? 'fa-chevron-up' : 'fa-chevron-down'\">\n </i>\n </span>\n </div>\n </div>\n\n <!-- Dropdown Panel (rendered in place, will be moved to portal when open) -->\n @if (IsOpen) {\n <div\n #dropdownPanel\n class=\"tree-dropdown-panel\"\n [class.tree-dropdown-panel--open]=\"IsOpen\"\n [class.tree-dropdown-panel--above]=\"Position?.renderAbove\"\n [class.tree-dropdown-panel--below]=\"!Position?.renderAbove\"\n [class]=\"StyleConfig.DropdownClass || ''\"\n [ngStyle]=\"IsOpen ? getDropdownStyles() : {}\"\n role=\"tree\">\n <!-- Search Input -->\n @if (EnableSearch) {\n <div class=\"tree-dropdown-search\">\n <div class=\"tree-dropdown-search__input-wrapper\">\n <i class=\"fa-solid fa-search tree-dropdown-search__icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"tree-dropdown-search__input\"\n [placeholder]=\"SearchConfig.Placeholder || 'Type to search...'\"\n [value]=\"SearchText\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeyDown($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\">\n @if (SearchText) {\n <button\n type=\"button\"\n class=\"tree-dropdown-search__clear\"\n (click)=\"onClearSearch()\"\n tabindex=\"-1\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Tree -->\n <div class=\"tree-dropdown-tree\">\n <mj-tree\n #treeComponent\n [BranchConfig]=\"BranchConfig\"\n [LeafConfig]=\"LeafConfig\"\n [SelectionMode]=\"SelectionMode\"\n [SelectableTypes]=\"SelectableTypes\"\n [SelectedIDs]=\"getSelectedIDsArray()\"\n [AutoLoad]=\"AutoLoad\"\n [ShowIcons]=\"true\"\n [ShowExpandCollapseAll]=\"false\"\n [AnimateExpandCollapse]=\"true\"\n [EmptyMessage]=\"SearchText ? 'No matches found' : 'No items available'\"\n [EmptyIcon]=\"SearchText ? 'fa-solid fa-search' : 'fa-solid fa-folder-open'\"\n (SelectionChange)=\"onTreeSelectionChange($event)\"\n (BeforeNodeSelect)=\"onTreeBeforeNodeSelect($event)\"\n (AfterNodeSelect)=\"onTreeAfterNodeSelect($event)\"\n (BeforeDataLoad)=\"onTreeBeforeDataLoad($event)\"\n (AfterDataLoad)=\"onTreeAfterDataLoad($event)\">\n </mj-tree>\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"tree-dropdown.component.js","sourceRoot":"","sources":["../../../src/lib/tree-dropdown/tree-dropdown.component.ts","../../../src/lib/tree-dropdown/tree-dropdown.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tree Dropdown Component for @memberjunction/ng-trees\n *\n * A searchable dropdown with tree selection. Features:\n * - Smart positioning (auto-flips above/below based on available space)\n * - Portal rendering to avoid clipping\n * - Type-ahead search with highlighting\n * - Keyboard navigation\n * - Single and multi-select modes\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n ViewChild,\n ElementRef, // Still needed for ViewChild type references\n Renderer2,\n AfterViewInit\n} from '@angular/core';\nimport {\n TreeNode,\n TreeBranchConfig,\n TreeLeafConfig,\n TreeSelectionMode,\n TreeSelectableTypes,\n TreeStyleConfig,\n TreeSearchConfig,\n TreeDropdownConfig\n} from '../models/tree-types';\nimport {\n BeforeNodeSelectEventArgs,\n AfterNodeSelectEventArgs,\n BeforeSearchEventArgs,\n AfterSearchEventArgs,\n BeforeDropdownOpenEventArgs,\n AfterDropdownOpenEventArgs,\n BeforeDropdownCloseEventArgs,\n AfterDropdownCloseEventArgs,\n BeforeDataLoadEventArgs,\n AfterDataLoadEventArgs\n} from '../events/tree-events';\nimport { TreeComponent } from '../tree/tree.component';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\n\n/**\n * Dropdown position calculation result\n */\ninterface DropdownPosition {\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n renderAbove: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-tree-dropdown',\n templateUrl: './tree-dropdown.component.html',\n styleUrls: ['./tree-dropdown.component.css']\n})\nexport class TreeDropdownComponent implements OnInit, OnDestroy, AfterViewInit {\n // ========================================\n // Tree Configuration (passed to inner tree)\n // ========================================\n\n /** Branch (category) entity configuration - REQUIRED */\n @Input() BranchConfig!: TreeBranchConfig;\n\n /** Optional leaf entity configuration */\n @Input() LeafConfig?: TreeLeafConfig;\n\n /** Selection mode: 'single' or 'multiple' */\n @Input() SelectionMode: TreeSelectionMode = 'single';\n\n /** What types can be selected: 'branch', 'leaf', or 'both' */\n @Input() SelectableTypes: TreeSelectableTypes = 'both';\n\n // ========================================\n // Value Inputs\n // ========================================\n\n /** Current selected value (CompositeKey for single, CompositeKeys for multiple) */\n private _value: CompositeKey | CompositeKey[] | null = null;\n\n /**\n * The selected value as a CompositeKey (single select) or array of CompositeKeys (multi-select).\n * CompositeKey supports both simple single-field primary keys and composite primary keys.\n *\n * @example Single select with simple ID:\n * ```typescript\n * dropdown.Value = CompositeKey.FromID('some-guid');\n * ```\n *\n * @example Single select with composite key:\n * ```typescript\n * dropdown.Value = new CompositeKey([\n * { FieldName: 'Field1', Value: 'value1' },\n * { FieldName: 'Field2', Value: 'value2' }\n * ]);\n * ```\n *\n * @example Multi-select:\n * ```typescript\n * dropdown.Value = [\n * CompositeKey.FromID('guid1'),\n * CompositeKey.FromID('guid2')\n * ];\n * ```\n */\n @Input()\n set Value(val: CompositeKey | CompositeKey[] | null) {\n if (!CompositeKey.EqualsEx(val, this._value)) {\n this._value = val;\n // If tree is loaded, sync selection immediately\n if (this.IsLoaded && this.treeComponent) {\n this.syncValueToSelection();\n } else {\n // Tree not loaded yet - fetch display text directly via Metadata\n this.fetchDisplayTextForValue(val);\n }\n }\n }\n get Value(): CompositeKey | CompositeKey[] | null {\n return this._value;\n }\n \n /** Cached display text for showing in trigger before tree loads */\n private _pendingDisplayText: string | null = null;\n\n // ========================================\n // Dropdown-specific Inputs\n // ========================================\n\n /** Placeholder text when nothing selected */\n @Input() Placeholder: string = 'Select...';\n\n /** Enable search filtering */\n @Input() EnableSearch: boolean = true;\n\n /** Search configuration */\n @Input() SearchConfig: TreeSearchConfig = {};\n\n /** Dropdown configuration */\n @Input() DropdownConfig: TreeDropdownConfig = {};\n\n /** Style configuration */\n @Input() StyleConfig: TreeStyleConfig = {};\n\n /** Show clear button */\n @Input() Clearable: boolean = true;\n\n /** Disabled state */\n @Input() Disabled: boolean = false;\n\n /** Show node icons in display */\n @Input() ShowIconInDisplay: boolean = true;\n\n /** Auto-load data on init */\n @Input() AutoLoad: boolean = true;\n\n /** Show loading in trigger */\n @Input() ShowLoadingInTrigger: boolean = true;\n\n // ========================================\n // Event Outputs\n // ========================================\n\n /** Emitted when value changes */\n @Output() ValueChange = new EventEmitter<CompositeKey | CompositeKey[] | null>();\n\n /** Emitted with full node(s) when selection changes */\n @Output() SelectionChange = new EventEmitter<TreeNode | TreeNode[] | null>();\n\n // Bubble up tree events\n @Output() BeforeNodeSelect = new EventEmitter<BeforeNodeSelectEventArgs>();\n @Output() AfterNodeSelect = new EventEmitter<AfterNodeSelectEventArgs>();\n @Output() BeforeSearch = new EventEmitter<BeforeSearchEventArgs>();\n @Output() AfterSearch = new EventEmitter<AfterSearchEventArgs>();\n @Output() BeforeDropdownOpen = new EventEmitter<BeforeDropdownOpenEventArgs>();\n @Output() AfterDropdownOpen = new EventEmitter<AfterDropdownOpenEventArgs>();\n @Output() BeforeDropdownClose = new EventEmitter<BeforeDropdownCloseEventArgs>();\n @Output() AfterDropdownClose = new EventEmitter<AfterDropdownCloseEventArgs>();\n @Output() BeforeDataLoad = new EventEmitter<BeforeDataLoadEventArgs>();\n @Output() AfterDataLoad = new EventEmitter<AfterDataLoadEventArgs>();\n\n // ========================================\n // ViewChild References\n // ========================================\n\n @ViewChild('triggerElement') triggerElement!: ElementRef<HTMLElement>;\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\n @ViewChild('dropdownPanel') dropdownPanel!: ElementRef<HTMLElement>;\n @ViewChild('treeComponent') treeComponent!: TreeComponent;\n\n // ========================================\n // State\n // ========================================\n\n /** Is dropdown open */\n public IsOpen: boolean = false;\n\n /** Dropdown position */\n public Position: DropdownPosition | null = null;\n\n /** Search text */\n public SearchText: string = '';\n\n /** Selected nodes (for display) */\n public SelectedNodes: TreeNode[] = [];\n\n /** Is tree loading */\n public IsLoading: boolean = false;\n\n /** Has data loaded */\n public IsLoaded: boolean = false;\n\n /** Dropdown portal element */\n private dropdownPortal: HTMLElement | null = null;\n\n /** Search debounce subject */\n private searchSubject = new Subject<string>();\n\n /** Destroy subject */\n private destroy$ = new Subject<void>();\n\n /** Click outside listener */\n private clickOutsideListener: (() => void) | null = null;\n\n /** Scroll listener */\n private scrollListener: (() => void) | null = null;\n\n /** Resize listener */\n private resizeListener: (() => void) | null = null;\n\n /** Pending load promise resolvers */\n private _loadResolvers: Array<() => void> = [];\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly renderer: Renderer2\n ) {}\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n // Setup search debounce\n const debounceMs = this.SearchConfig.DebounceMs ?? 200;\n this.searchSubject.pipe(\n debounceTime(debounceMs),\n takeUntil(this.destroy$)\n ).subscribe(text => {\n this.performSearch(text);\n });\n }\n\n ngAfterViewInit(): void {\n // Create portal element\n this.createDropdownPortal();\n }\n\n // Note: Value changes are handled by the getter/setter pattern\n // No ngOnChanges needed for that property\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeDropdownPortal();\n this.removeEventListeners();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Returns a promise that resolves when the tree data has finished loading.\n * If data is already loaded, the promise resolves immediately.\n *\n * Use this method when you need to perform operations that depend on the tree\n * being fully loaded, such as programmatically selecting nodes or accessing\n * the tree structure.\n *\n * Note: For setting initial values, you typically don't need this method -\n * just set the `Value` input and the component will automatically display\n * the correct text by looking up the record name via Metadata.\n *\n * @returns A promise that resolves when the tree data is loaded\n * @example\n * ```typescript\n * // Wait for tree to load before accessing tree structure\n * await treeDropdown.WaitForDataLoad();\n * const nodes = treeDropdown.treeComponent.Nodes;\n * ```\n */\n public WaitForDataLoad(): Promise<void> {\n if (this.IsLoaded) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this._loadResolvers.push(resolve);\n });\n }\n\n /**\n * Open the dropdown\n */\n public Open(): void {\n if (this.Disabled || this.IsOpen) {\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDropdownOpenEventArgs(this);\n this.BeforeDropdownOpen.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.IsOpen = true;\n this.calculatePosition();\n this.attachEventListeners();\n\n // Focus search input after opening — use microtask + fallback to ensure it works\n // even when Angular change detection hasn't yet rendered the @if block\n Promise.resolve().then(() => {\n if (this.EnableSearch && this.searchInput) {\n this.searchInput.nativeElement.focus();\n } else {\n // Fallback: the @if block may not have rendered yet, retry after a frame\n setTimeout(() => {\n if (this.EnableSearch && this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }, 100);\n }\n });\n\n // Fire after event\n const afterEvent = new AfterDropdownOpenEventArgs(\n this,\n this.Position?.renderAbove ? 'above' : 'below'\n );\n this.AfterDropdownOpen.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Close the dropdown\n */\n public Close(reason: 'selection' | 'escape' | 'outsideClick' | 'programmatic' = 'programmatic'): void {\n if (!this.IsOpen) {\n return;\n }\n\n // Fire before event\n const beforeEvent = new BeforeDropdownCloseEventArgs(this, reason);\n this.BeforeDropdownClose.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n this.IsOpen = false;\n this.SearchText = '';\n this.clearSearch();\n this.removeEventListeners();\n\n // Fire after event\n const afterEvent = new AfterDropdownCloseEventArgs(this, reason);\n this.AfterDropdownClose.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle dropdown\n */\n public Toggle(): void {\n if (this.IsOpen) {\n this.Close('programmatic');\n } else {\n this.Open();\n }\n }\n\n /**\n * Clear selection\n */\n public Clear(event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n }\n\n this.SelectedNodes = [];\n this._value = null;\n this._pendingDisplayText = null;\n\n if (this.treeComponent) {\n this.treeComponent.ClearSelection();\n }\n\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(null);\n this.cdr.detectChanges();\n }\n\n /**\n * Refresh tree data\n */\n public async Refresh(): Promise<void> {\n if (this.treeComponent) {\n await this.treeComponent.Refresh();\n }\n }\n\n // ========================================\n // Template Event Handlers\n // ========================================\n\n /**\n * Handle trigger click\n */\n public onTriggerClick(): void {\n \n if (!this.Disabled) {\n this.Toggle();\n }\n }\n\n /**\n * Handle trigger keydown\n */\n public onTriggerKeyDown(event: KeyboardEvent): void {\n if (this.Disabled) {\n return;\n }\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n this.Open();\n break;\n case 'Escape':\n if (this.IsOpen) {\n event.preventDefault();\n this.Close('escape');\n }\n break;\n }\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.SearchText = value;\n this.searchSubject.next(value);\n }\n\n /**\n * Handle search keydown\n */\n public onSearchKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.Close('escape');\n break;\n case 'ArrowDown':\n event.preventDefault();\n // Focus first tree node — guard against null/empty state\n if (this.treeComponent?.Nodes?.length) {\n const visibleNodes = this.getVisibleNodesInOrder(this.treeComponent.Nodes);\n if (visibleNodes.length > 0) {\n this.treeComponent.FocusedNode = visibleNodes[0];\n this.cdr.detectChanges();\n }\n }\n break;\n }\n }\n\n /**\n * Handle clear search\n */\n public onClearSearch(): void {\n this.SearchText = '';\n this.clearSearch();\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n\n /**\n * Handle tree selection change\n */\n public onTreeSelectionChange(nodes: TreeNode[]): void {\n \n this.SelectedNodes = nodes;\n\n // Clear pending display text since we now have real nodes\n this._pendingDisplayText = null;\n\n // Update value - convert node IDs to CompositeKeys\n if (this.SelectionMode === 'single') {\n this._value = nodes.length > 0 ? CompositeKey.FromID(nodes[0].ID) : null;\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(nodes.length > 0 ? nodes[0] : null);\n\n // Close on selection in single mode (unless disabled)\n // Only close if user actually selected something (not on empty selection from sync)\n \n if (this.DropdownConfig.CloseOnSelect !== false && nodes.length > 0) {\n \n this.Close('selection');\n }\n } else {\n this._value = nodes.map(n => CompositeKey.FromID(n.ID));\n this.ValueChange.emit(this._value);\n this.SelectionChange.emit(nodes.length > 0 ? nodes : null);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Handle tree data load events\n */\n public onTreeBeforeDataLoad(event: BeforeDataLoadEventArgs): void {\n \n this.IsLoading = true;\n this.BeforeDataLoad.emit(event);\n this.cdr.detectChanges();\n }\n\n public onTreeAfterDataLoad(event: AfterDataLoadEventArgs): void {\n \n \n this.IsLoading = false;\n this.IsLoaded = true;\n\n // Resolve all pending WaitForDataLoad() promises\n const resolvers = this._loadResolvers;\n this._loadResolvers = [];\n for (const resolve of resolvers) {\n resolve();\n }\n\n // Sync selection after load - defer to next microtask to ensure ViewChild is resolved\n Promise.resolve().then(() => {\n \n if (this.treeComponent) {\n \n \n }\n this.syncValueToSelection();\n this.cdr.detectChanges();\n });\n\n this.AfterDataLoad.emit(event);\n this.cdr.detectChanges();\n }\n\n /**\n * Bubble tree events\n */\n public onTreeBeforeNodeSelect(event: BeforeNodeSelectEventArgs): void {\n this.BeforeNodeSelect.emit(event);\n }\n\n public onTreeAfterNodeSelect(event: AfterNodeSelectEventArgs): void {\n this.AfterNodeSelect.emit(event);\n }\n\n // ========================================\n // Private Methods\n // ========================================\n\n /**\n * Create dropdown portal element (attached to body)\n */\n private createDropdownPortal(): void {\n this.dropdownPortal = this.renderer.createElement('div');\n this.renderer.addClass(this.dropdownPortal, 'mj-tree-dropdown-portal');\n this.renderer.setStyle(this.dropdownPortal, 'position', 'fixed');\n this.renderer.setStyle(this.dropdownPortal, 'z-index', '10000');\n this.renderer.setStyle(this.dropdownPortal, 'display', 'none');\n this.renderer.appendChild(document.body, this.dropdownPortal);\n }\n\n /**\n * Remove dropdown portal\n */\n private removeDropdownPortal(): void {\n if (this.dropdownPortal && this.dropdownPortal.parentNode) {\n this.dropdownPortal.parentNode.removeChild(this.dropdownPortal);\n this.dropdownPortal = null;\n }\n }\n\n /**\n * Calculate dropdown position\n */\n private calculatePosition(): void {\n if (!this.triggerElement) {\n return;\n }\n\n const triggerRect = this.triggerElement.nativeElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n // Parse max height from config\n const maxHeightConfig = this.DropdownConfig.MaxHeight || '300px';\n const maxHeightPx = parseInt(maxHeightConfig, 10) || 300;\n\n // Calculate available space\n const spaceBelow = viewportHeight - triggerRect.bottom - 8; // 8px margin\n const spaceAbove = triggerRect.top - 8;\n\n // Determine if we should render above or below\n let renderAbove = false;\n let maxHeight = maxHeightPx;\n\n if (this.DropdownConfig.Position === 'above') {\n renderAbove = true;\n maxHeight = Math.min(maxHeightPx, spaceAbove);\n } else if (this.DropdownConfig.Position === 'below') {\n renderAbove = false;\n maxHeight = Math.min(maxHeightPx, spaceBelow);\n } else {\n // Auto position\n if (spaceBelow < maxHeightPx && spaceAbove > spaceBelow) {\n renderAbove = true;\n maxHeight = Math.min(maxHeightPx, spaceAbove);\n } else {\n renderAbove = false;\n maxHeight = Math.min(maxHeightPx, spaceBelow);\n }\n }\n\n // Calculate width\n const minWidth = this.DropdownConfig.MinWidth\n ? parseInt(this.DropdownConfig.MinWidth, 10)\n : triggerRect.width;\n const width = Math.max(minWidth, triggerRect.width);\n\n // Ensure dropdown doesn't go off screen horizontally\n let left = triggerRect.left;\n if (left + width > viewportWidth - 8) {\n left = viewportWidth - width - 8;\n }\n if (left < 8) {\n left = 8;\n }\n\n // Calculate top position\n let top: number;\n if (renderAbove) {\n top = triggerRect.top - maxHeight - 4;\n } else {\n top = triggerRect.bottom + 4;\n }\n\n this.Position = {\n top,\n left,\n width,\n maxHeight,\n renderAbove\n };\n }\n\n /**\n * Attach event listeners for click outside, scroll, resize\n */\n private attachEventListeners(): void {\n \n // Click outside - defer with a small timeout to:\n // 1. Allow the opening click event to complete\n // 2. Ensure the dropdown panel DOM element is fully rendered\n // 3. Allow Angular change detection to complete\n if (this.DropdownConfig.CloseOnOutsideClick !== false) {\n \n setTimeout(() => {\n \n // Only attach if still open (could have been closed in the meantime)\n if (!this.IsOpen) {\n \n return;\n }\n \n this.clickOutsideListener = this.renderer.listen('document', 'click', (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n \n \n // Double check we're still open\n if (!this.IsOpen) {\n \n return;\n }\n const isInsideTrigger = this.triggerElement?.nativeElement?.contains(target);\n // Check if click is inside the dropdown panel (rendered inline, not in portal)\n const isInsideDropdown = this.dropdownPanel?.nativeElement?.contains(target);\n \n \n\n if (!isInsideTrigger && !isInsideDropdown) {\n \n this.Close('outsideClick');\n } else {\n \n }\n });\n }, 100); // 100ms delay to ensure DOM is stable\n } else {\n \n }\n\n // Escape key\n if (this.DropdownConfig.CloseOnEscape !== false) {\n document.addEventListener('keydown', this.handleEscapeKey);\n }\n\n // Scroll - reposition dropdown\n this.scrollListener = this.renderer.listen('window', 'scroll', () => {\n if (this.IsOpen) {\n this.calculatePosition();\n this.updateDropdownPortalPosition();\n }\n });\n\n // Resize - reposition dropdown\n this.resizeListener = this.renderer.listen('window', 'resize', () => {\n if (this.IsOpen) {\n this.calculatePosition();\n this.updateDropdownPortalPosition();\n }\n });\n }\n\n /**\n * Remove event listeners\n */\n private removeEventListeners(): void {\n if (this.clickOutsideListener) {\n this.clickOutsideListener();\n this.clickOutsideListener = null;\n }\n\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n if (this.scrollListener) {\n this.scrollListener();\n this.scrollListener = null;\n }\n\n if (this.resizeListener) {\n this.resizeListener();\n this.resizeListener = null;\n }\n }\n\n /**\n * Handle escape key\n */\n private handleEscapeKey = (event: KeyboardEvent): void => {\n \n if (event.key === 'Escape' && this.IsOpen) {\n this.Close('escape');\n }\n };\n\n /**\n * Update dropdown portal position\n */\n private updateDropdownPortalPosition(): void {\n if (!this.dropdownPortal || !this.Position) {\n return;\n }\n\n this.renderer.setStyle(this.dropdownPortal, 'top', `${this.Position.top}px`);\n this.renderer.setStyle(this.dropdownPortal, 'left', `${this.Position.left}px`);\n this.renderer.setStyle(this.dropdownPortal, 'width', `${this.Position.width}px`);\n }\n\n /**\n * Perform search on tree\n */\n private performSearch(text: string): void {\n // Fire before event\n const beforeEvent = new BeforeSearchEventArgs(this, text);\n this.BeforeSearch.emit(beforeEvent);\n\n if (beforeEvent.Cancel) {\n return;\n }\n\n const searchText = beforeEvent.ModifiedSearchText ?? text;\n\n // Guard: tree component may not be ready or may have no nodes loaded\n if (!this.treeComponent || !this.IsLoaded) {\n return;\n }\n\n const matchedNodes = this.treeComponent.FilterNodes(\n searchText,\n {\n caseSensitive: this.SearchConfig.CaseSensitive,\n searchBranches: this.SearchConfig.SearchBranches ?? true,\n searchLeaves: this.SearchConfig.SearchLeaves ?? true,\n searchDescription: this.SearchConfig.SearchDescription\n }\n );\n\n // Auto-expand to show matches — guard against empty results\n if (matchedNodes.length > 0 && this.SearchConfig.AutoExpandMatches !== false && searchText.trim()) {\n for (const node of matchedNodes) {\n this.treeComponent.ExpandToNode(node.ID);\n }\n }\n\n // Fire after event\n const afterEvent = new AfterSearchEventArgs(this, searchText, matchedNodes ?? []);\n this.AfterSearch.emit(afterEvent);\n\n this.cdr.detectChanges();\n }\n\n /**\n * Clear search filter\n */\n private clearSearch(): void {\n if (this.treeComponent?.Nodes?.length) {\n this.treeComponent.FilterNodes('', {});\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get all visible nodes in tree order (for keyboard navigation)\n */\n private getVisibleNodesInOrder(nodes: TreeNode[]): TreeNode[] {\n if (!nodes || nodes.length === 0) return [];\n const result: TreeNode[] = [];\n this.collectVisibleNodesRecursive(nodes, result);\n return result;\n }\n\n private collectVisibleNodesRecursive(nodes: TreeNode[], result: TreeNode[]): void {\n if (!nodes) return;\n for (const node of nodes) {\n if (node.Visible) {\n result.push(node);\n if (node.Expanded && node.Type === 'branch' && node.Children?.length) {\n this.collectVisibleNodesRecursive(node.Children, result);\n }\n }\n }\n }\n\n /**\n * Sync value to tree selection\n */\n private syncValueToSelection(): void {\n if (!this.treeComponent || !this.IsLoaded) {\n return;\n }\n\n // Convert CompositeKey(s) to string IDs for tree selection\n const ids = this.getSelectedIDsArray();\n\n // Pass emitChange=false to avoid emitting SelectionChange during sync\n // This prevents unnecessary events and parent component confusion\n this.treeComponent.SelectNodes(ids, false);\n\n // Use try-catch as defensive measure since tree component may not be fully ready\n try {\n this.SelectedNodes = this.treeComponent.GetSelectedNodes() || [];\n } catch {\n this.SelectedNodes = [];\n }\n\n // Clear pending display text since we now have real nodes\n this._pendingDisplayText = null;\n\n this.cdr.detectChanges();\n }\n\n /**\n * Fetch display text for value before tree loads using Metadata.GetEntityRecordName\n */\n private async fetchDisplayTextForValue(val: CompositeKey | CompositeKey[] | null): Promise<void> {\n if (!val || !this.LeafConfig) {\n this._pendingDisplayText = null;\n this.cdr.detectChanges();\n return;\n }\n\n try {\n const md = new Metadata();\n const entityName = this.LeafConfig.EntityName;\n\n if (Array.isArray(val)) {\n // Multiple selection\n if (val.length === 0) {\n this._pendingDisplayText = null;\n } else if (val.length === 1) {\n this._pendingDisplayText = await md.GetEntityRecordName(entityName, val[0]);\n } else {\n this._pendingDisplayText = `${val.length} items selected`;\n }\n } else {\n // Single selection\n this._pendingDisplayText = await md.GetEntityRecordName(entityName, val);\n }\n } catch (error) {\n console.warn('[TreeDropdown] Failed to fetch display text:', error);\n this._pendingDisplayText = null;\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Template Helpers\n // ========================================\n\n /**\n * Get display text for selected value(s)\n */\n public getDisplayText(): string {\n // If we have selected nodes from the tree, use those\n if (this.SelectedNodes.length > 0) {\n if (this.SelectionMode === 'single') {\n return this.SelectedNodes[0].Label;\n }\n\n // Multiple selection\n if (this.SelectedNodes.length === 1) {\n return this.SelectedNodes[0].Label;\n }\n\n return `${this.SelectedNodes.length} items selected`;\n }\n\n // If tree not loaded but we have pending display text from Metadata lookup\n if (this._pendingDisplayText) {\n return this._pendingDisplayText;\n }\n\n return '';\n }\n\n /**\n * Get display icon for single selection\n */\n public getDisplayIcon(): string | null {\n if (!this.ShowIconInDisplay || this.SelectedNodes.length !== 1) {\n return null;\n }\n return this.SelectedNodes[0].Icon;\n }\n\n /**\n * Get display color for single selection\n */\n public getDisplayColor(): string | null {\n if (this.SelectedNodes.length !== 1) {\n return null;\n }\n return this.SelectedNodes[0].Color || null;\n }\n\n /**\n * Check if has selection\n */\n public hasSelection(): boolean {\n return this.SelectedNodes.length > 0 || this._pendingDisplayText != null;\n }\n\n /**\n * Get dropdown panel styles\n */\n public getDropdownStyles(): Record<string, string> {\n if (!this.Position) {\n return {};\n }\n\n return {\n top: `${this.Position.top}px`,\n left: `${this.Position.left}px`,\n width: `${this.Position.width}px`,\n maxHeight: `${this.Position.maxHeight}px`\n };\n }\n\n /**\n * Get trigger classes\n */\n public getTriggerClasses(): Record<string, boolean> {\n return {\n 'tree-dropdown-trigger': true,\n 'tree-dropdown-trigger--open': this.IsOpen,\n 'tree-dropdown-trigger--disabled': this.Disabled,\n 'tree-dropdown-trigger--has-value': this.hasSelection(),\n 'tree-dropdown-trigger--loading': this.IsLoading && this.ShowLoadingInTrigger\n };\n }\n\n /**\n * Get selected IDs as a string array for passing to tree component.\n * Extracts the first key value from each CompositeKey (typically the ID field).\n */\n public getSelectedIDsArray(): string[] {\n if (!this._value) {\n return [];\n }\n\n const keys = Array.isArray(this._value) ? this._value : [this._value];\n return keys.map(key => {\n // Get the first value from the composite key (usually the ID)\n const firstValue = key.GetValueByIndex(0);\n return firstValue != null ? String(firstValue) : '';\n }).filter(id => id !== '');\n }\n}\n","<!-- Tree Dropdown Component Template -->\n<div class=\"tree-dropdown\" [class.tree-dropdown--disabled]=\"Disabled\">\n\n <!-- Trigger Button -->\n <div\n #triggerElement\n [ngClass]=\"getTriggerClasses()\"\n [class]=\"StyleConfig.SearchInputClass || ''\"\n tabindex=\"0\"\n role=\"combobox\"\n [attr.aria-expanded]=\"IsOpen\"\n [attr.aria-haspopup]=\"'tree'\"\n [attr.aria-disabled]=\"Disabled\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeyDown($event)\">\n\n <!-- Selected Value Display -->\n <div class=\"tree-dropdown-trigger__content\">\n <!-- Icon -->\n @if (getDisplayIcon()) {\n <span\n class=\"tree-dropdown-trigger__icon\"\n [style.color]=\"getDisplayColor()\">\n <i [class]=\"getDisplayIcon()\"></i>\n </span>\n }\n\n <!-- Text -->\n <span\n class=\"tree-dropdown-trigger__text\"\n [class.tree-dropdown-trigger__text--placeholder]=\"!hasSelection()\">\n {{ hasSelection() ? getDisplayText() : Placeholder }}\n </span>\n\n <!-- Loading Spinner -->\n @if (IsLoading && ShowLoadingInTrigger) {\n <span class=\"tree-dropdown-trigger__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </span>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"tree-dropdown-trigger__actions\">\n <!-- Clear Button -->\n @if (Clearable && hasSelection() && !Disabled) {\n <button\n type=\"button\"\n class=\"tree-dropdown-trigger__clear\"\n (click)=\"Clear($event)\"\n title=\"Clear selection\"\n tabindex=\"-1\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n\n <!-- Chevron -->\n <span class=\"tree-dropdown-trigger__chevron\">\n <i\n class=\"fa-solid\"\n [ngClass]=\"IsOpen ? 'fa-chevron-up' : 'fa-chevron-down'\">\n </i>\n </span>\n </div>\n </div>\n\n <!-- Dropdown Panel (rendered in place, will be moved to portal when open) -->\n @if (IsOpen) {\n <div\n #dropdownPanel\n class=\"tree-dropdown-panel\"\n [class.tree-dropdown-panel--open]=\"IsOpen\"\n [class.tree-dropdown-panel--above]=\"Position?.renderAbove\"\n [class.tree-dropdown-panel--below]=\"!Position?.renderAbove\"\n [class]=\"StyleConfig.DropdownClass || ''\"\n [ngStyle]=\"IsOpen ? getDropdownStyles() : {}\"\n role=\"tree\">\n <!-- Search Input -->\n @if (EnableSearch) {\n <div class=\"tree-dropdown-search\">\n <div class=\"tree-dropdown-search__input-wrapper\">\n <i class=\"fa-solid fa-search tree-dropdown-search__icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"tree-dropdown-search__input\"\n [placeholder]=\"SearchConfig.Placeholder || 'Type to search...'\"\n [value]=\"SearchText\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeyDown($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\">\n @if (SearchText) {\n <button\n type=\"button\"\n class=\"tree-dropdown-search__clear\"\n (click)=\"onClearSearch()\"\n tabindex=\"-1\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Tree -->\n <div class=\"tree-dropdown-tree\">\n <mj-tree\n #treeComponent\n [BranchConfig]=\"BranchConfig\"\n [LeafConfig]=\"LeafConfig\"\n [SelectionMode]=\"SelectionMode\"\n [SelectableTypes]=\"SelectableTypes\"\n [SelectedIDs]=\"getSelectedIDsArray()\"\n [AutoLoad]=\"AutoLoad\"\n [ShowIcons]=\"true\"\n [ShowExpandCollapseAll]=\"false\"\n [AnimateExpandCollapse]=\"true\"\n [EmptyMessage]=\"SearchText ? 'No matches found' : 'No items available'\"\n [EmptyIcon]=\"SearchText ? 'fa-solid fa-search' : 'fa-solid fa-folder-open'\"\n (SelectionChange)=\"onTreeSelectionChange($event)\"\n (BeforeNodeSelect)=\"onTreeBeforeNodeSelect($event)\"\n (AfterNodeSelect)=\"onTreeAfterNodeSelect($event)\"\n (BeforeDataLoad)=\"onTreeBeforeDataLoad($event)\"\n (AfterDataLoad)=\"onTreeAfterDataLoad($event)\">\n </mj-tree>\n </div>\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-trees",
3
- "version": "5.23.0",
3
+ "version": "5.24.0",
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.23.0",
36
- "@memberjunction/core-entities": "5.23.0",
37
- "@memberjunction/global": "5.23.0",
35
+ "@memberjunction/core": "5.24.0",
36
+ "@memberjunction/core-entities": "5.24.0",
37
+ "@memberjunction/global": "5.24.0",
38
38
  "tslib": "^2.8.1",
39
39
  "rxjs": "^7.8.2"
40
40
  },