@memberjunction/ng-trees 5.24.0 → 5.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/tree/tree.component.d.ts.map +1 -1
- package/dist/lib/tree/tree.component.js +7 -1
- package/dist/lib/tree/tree.component.js.map +1 -1
- package/dist/lib/tree-dropdown/tree-dropdown.component.d.ts +35 -1
- package/dist/lib/tree-dropdown/tree-dropdown.component.d.ts.map +1 -1
- package/dist/lib/tree-dropdown/tree-dropdown.component.js +200 -26
- package/dist/lib/tree-dropdown/tree-dropdown.component.js.map +1 -1
- package/package.json +4 -4
|
@@ -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 — 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"]}
|
|
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';\nimport { UUIDsEqual } from '@memberjunction/global';\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 // Trigger change detection so the @if (IsOpen) block renders the dropdown panel\n this.cdr.detectChanges();\n\n // Focus search input after rendering\n this.focusSearchInput();\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\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 — provides full keyboard navigation while search input retains focus.\n * The tree's own keyboard handler doesn't fire because the search input has DOM focus,\n * so all navigation is handled here by manipulating the tree's FocusedNode visual state.\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 this.navigateTree('down');\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.navigateTree('up');\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.expandOrDescendFocusedNode();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.collapseOrAscendFocusedNode();\n break;\n case 'Enter':\n event.preventDefault();\n this.selectFocusedNode();\n break;\n case 'Home':\n event.preventDefault();\n this.navigateTree('first');\n break;\n case 'End':\n event.preventDefault();\n this.navigateTree('last');\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 // Keyboard Navigation Helpers\n // ========================================\n\n /**\n * Focus the search input after the dropdown opens.\n * Deferred to the next macrotask so that:\n * 1. Angular has fully resolved @ViewChild queries for the @if block\n * 2. The browser's click event (on the trigger) has completed and won't steal focus back\n * Falls back to direct DOM querySelector if the ViewChild isn't resolved.\n */\n private focusSearchInput(): void {\n if (!this.EnableSearch) return;\n\n const tryFocus = (retriesLeft: number): void => {\n // Try ViewChild first\n if (this.searchInput?.nativeElement) {\n this.searchInput.nativeElement.focus();\n return;\n }\n // Fallback: query DOM directly (ViewChild may not resolve for @if blocks)\n const panel = this.dropdownPanel?.nativeElement;\n if (panel) {\n const input = panel.querySelector('.tree-dropdown-search__input') as HTMLInputElement;\n if (input) {\n input.focus();\n return;\n }\n }\n // Retry on next frame\n if (retriesLeft > 0) {\n requestAnimationFrame(() => tryFocus(retriesLeft - 1));\n }\n };\n\n // Defer to next macrotask so the click event on the trigger completes first\n // and Angular finishes resolving ViewChild queries for the new @if block\n setTimeout(() => tryFocus(5), 0);\n }\n\n /**\n * Navigate tree focus up/down/first/last while search input retains DOM focus\n */\n private navigateTree(direction: 'up' | 'down' | 'first' | 'last'): void {\n if (!this.treeComponent?.Nodes?.length) return;\n\n const visibleNodes = this.getVisibleNodesInOrder(this.treeComponent.Nodes);\n if (visibleNodes.length === 0) return;\n\n const currentIndex = this.treeComponent.FocusedNode\n ? visibleNodes.indexOf(this.treeComponent.FocusedNode)\n : -1;\n\n let targetNode: TreeNode | null = null;\n\n switch (direction) {\n case 'down':\n targetNode = currentIndex === -1\n ? visibleNodes[0]\n : currentIndex < visibleNodes.length - 1\n ? visibleNodes[currentIndex + 1]\n : null;\n break;\n case 'up':\n targetNode = currentIndex === -1\n ? visibleNodes[visibleNodes.length - 1]\n : currentIndex > 0\n ? visibleNodes[currentIndex - 1]\n : null;\n break;\n case 'first':\n targetNode = visibleNodes[0];\n break;\n case 'last':\n targetNode = visibleNodes[visibleNodes.length - 1];\n break;\n }\n\n if (targetNode) {\n this.treeComponent.FocusedNode = targetNode;\n this.cdr.detectChanges();\n this.scrollFocusedNodeIntoView();\n }\n }\n\n /**\n * Select the currently focused tree node (Enter key)\n */\n private selectFocusedNode(): void {\n const focusedNode = this.treeComponent?.FocusedNode;\n if (!focusedNode) return;\n\n // Check if the node type is selectable per config\n const isSelectable = this.SelectableTypes === 'both'\n || (this.SelectableTypes === 'leaf' && focusedNode.Type === 'leaf')\n || (this.SelectableTypes === 'branch' && focusedNode.Type === 'branch');\n\n if (isSelectable) {\n this.treeComponent.SelectNodes([focusedNode.ID], true);\n } else if (focusedNode.Type === 'branch') {\n // Non-selectable branch: toggle expand/collapse\n this.toggleBranchExpansion(focusedNode);\n }\n }\n\n /**\n * ArrowRight: expand focused branch or descend to first child\n */\n private expandOrDescendFocusedNode(): void {\n const node = this.treeComponent?.FocusedNode;\n if (!node || node.Type !== 'branch') return;\n\n if (!node.Expanded && node.Children?.length) {\n this.treeComponent.ExpandToNode(node.Children[0].ID);\n this.cdr.detectChanges();\n } else if (node.Expanded && node.Children?.length) {\n // Already expanded: move focus to first visible child\n const firstVisible = node.Children.find(c => c.Visible);\n if (firstVisible) {\n this.treeComponent.FocusedNode = firstVisible;\n this.cdr.detectChanges();\n this.scrollFocusedNodeIntoView();\n }\n }\n }\n\n /**\n * ArrowLeft: collapse focused branch or ascend to parent\n */\n private collapseOrAscendFocusedNode(): void {\n const node = this.treeComponent?.FocusedNode;\n if (!node) return;\n\n if (node.Type === 'branch' && node.Expanded) {\n // Collapse the branch\n this.toggleBranchExpansion(node);\n } else if (node.ParentID) {\n // Move to parent\n const allNodes = this.getVisibleNodesInOrder(this.treeComponent.Nodes);\n const parent = allNodes.find(n => UUIDsEqual(n.ID, node.ParentID));\n if (parent) {\n this.treeComponent.FocusedNode = parent;\n this.cdr.detectChanges();\n this.scrollFocusedNodeIntoView();\n }\n }\n }\n\n /**\n * Toggle expand/collapse of a branch node\n */\n private toggleBranchExpansion(node: TreeNode): void {\n if (node.Expanded) {\n node.Expanded = false;\n } else {\n this.treeComponent.ExpandToNode(node.ID);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Scroll the currently focused tree node into view within the dropdown panel\n */\n private scrollFocusedNodeIntoView(): void {\n requestAnimationFrame(() => {\n const panel = this.dropdownPanel?.nativeElement;\n if (!panel) return;\n const focused = panel.querySelector('.tree-node-focused, .tree-node--focused, [data-focused=\"true\"]');\n if (focused) {\n focused.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n });\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.
|
|
3
|
+
"version": "5.25.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.
|
|
36
|
-
"@memberjunction/core-entities": "5.
|
|
37
|
-
"@memberjunction/global": "5.
|
|
35
|
+
"@memberjunction/core": "5.25.0",
|
|
36
|
+
"@memberjunction/core-entities": "5.25.0",
|
|
37
|
+
"@memberjunction/global": "5.25.0",
|
|
38
38
|
"tslib": "^2.8.1",
|
|
39
39
|
"rxjs": "^7.8.2"
|
|
40
40
|
},
|