@tailng-ui/components 0.11.0 → 0.13.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/README.md +83 -5
- package/package.json +2 -2
- package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
- package/src/lib/feedback/empty/tng-empty.component.js +5 -0
- package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +1 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +1 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.js +1 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.js +1 -0
- package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.js +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.js +1 -0
- package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
- package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
- package/src/lib/form/chips/tng-chips.component.js +1 -0
- package/src/lib/form/chips/tng-chips.component.js.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.js +1 -0
- package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
- package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
- package/src/lib/form/label/tng-label.component.js +1 -0
- package/src/lib/form/label/tng-label.component.js.map +1 -1
- package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
- package/src/lib/form/radio/tng-radio.component.js +1 -0
- package/src/lib/form/radio/tng-radio.component.js.map +1 -1
- package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
- package/src/lib/form/slider/tng-slider.component.js +1 -0
- package/src/lib/form/slider/tng-slider.component.js.map +1 -1
- package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
- package/src/lib/form/switch/tng-switch.component.js +1 -0
- package/src/lib/form/switch/tng-switch.component.js.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.js +1 -0
- package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.js +1 -0
- package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.js +1 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +1 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
- package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
- package/src/lib/layout/card/tng-card.component.js +10 -0
- package/src/lib/layout/card/tng-card.component.js.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.js +1 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.js +1 -0
- package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.js +1 -0
- package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.js +1 -0
- package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.js +1 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +1 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +1 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.js +1 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.js +1 -0
- package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.js +1 -0
- package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.js +1 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.js +1 -0
- package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.js +1 -0
- package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
- package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
- package/src/lib/utility/button/tng-button.component.js +1 -0
- package/src/lib/utility/button/tng-button.component.js.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.js +1 -0
- package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.js +1 -0
- package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.js +1 -0
- package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.js +1 -0
- package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tree.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, computed, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { ElementRef, OnDestroy } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport {\n createTreeModel,\n createTypeaheadController,\n type TngTreeModel,\n type TngTreeModelState,\n type TngTreeNode,\n type TngTypeaheadController,\n type TngTypeaheadItem,\n} from '@tailng-ui/cdk';\nimport { TngTree as TngTreePrimitive } from '@tailng-ui/primitives';\n\nconst createTreeId = createTngIdFactory('tng-tree');\n\ntype TngTreeBoundary = 'first' | 'last';\n\ntype TngTreeKeyboardEvent = Readonly<{\n altKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n}>;\n\ntype TngTreePointerEvent = Readonly<{\n preventDefault: () => void;\n stopPropagation: () => void;\n}>;\n\ntype TngTreeKeyAction =\n | 'collapse-or-parent'\n | 'expand-or-child'\n | 'move-next'\n | 'move-prev'\n | 'noop'\n | 'select'\n | 'to-end'\n | 'to-start'\n | 'typeahead';\n\ntype TngTreeLookup = Readonly<{\n byId: ReadonlyMap<string, TngTreeItem>;\n childrenByParent: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype TngTreeRow = Readonly<{\n depth: number;\n description: string | null;\n disabled: boolean;\n hasChildren: boolean;\n id: string;\n label: string;\n}>;\n\ntype TngTreeRunnableAction = Exclude<TngTreeKeyAction, 'noop' | 'typeahead'>;\n\nexport type TngTreeItem = Readonly<{\n description?: string | null;\n disabled?: boolean;\n id: string;\n label: string;\n parentId?: string | null;\n}>;\n\nconst actionByKey: Readonly<Record<string, TngTreeKeyAction>> = Object.freeze({\n ArrowDown: 'move-next',\n ArrowLeft: 'collapse-or-parent',\n ArrowRight: 'expand-or-child',\n ArrowUp: 'move-prev',\n End: 'to-end',\n Home: 'to-start',\n});\n\nfunction toReadonlyArray<T>(values: readonly T[]): readonly T[] {\n return Object.freeze([...values]);\n}\n\nfunction toTreeModelNodes(items: readonly TngTreeItem[]): readonly TngTreeNode[] {\n return items.map((item) => ({\n disabled: item.disabled,\n id: item.id,\n parentId: item.parentId,\n }));\n}\n\nfunction createTreeLookup(items: readonly TngTreeItem[]): TngTreeLookup {\n const byId = new Map<string, TngTreeItem>();\n const childrenByParent = new Map<string, string[]>();\n\n for (const item of items) {\n byId.set(item.id, item);\n }\n\n for (const item of items) {\n const parentId = item.parentId ?? null;\n if (parentId === null || !byId.has(parentId)) {\n continue;\n }\n\n const children = childrenByParent.get(parentId) ?? [];\n children.push(item.id);\n childrenByParent.set(parentId, children);\n }\n\n const readonlyChildrenByParent = new Map<string, readonly string[]>();\n for (const [parentId, children] of childrenByParent.entries()) {\n readonlyChildrenByParent.set(parentId, toReadonlyArray(children));\n }\n\n return Object.freeze({\n byId,\n childrenByParent: readonlyChildrenByParent,\n });\n}\n\nfunction resolveDepth(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): number {\n let depth = 0;\n let parentId = byId.get(nodeId)?.parentId ?? null;\n const visited = new Set<string>();\n\n while (parentId !== null && byId.has(parentId) && !visited.has(parentId)) {\n visited.add(parentId);\n depth += 1;\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n\n return depth;\n}\n\nfunction toTypeaheadItems(\n visibleIds: readonly string[],\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): readonly TngTypeaheadItem[] {\n return visibleIds\n .map((id) => byId.get(id))\n .filter((item): item is TngTreeItem => item !== undefined)\n .map((item) => ({\n disabled: item.disabled,\n id: item.id,\n text: item.label,\n }));\n}\n\nfunction toTreeItemDomId(treeId: string, nodeId: string): string {\n return `${treeId}-item-${nodeId}`;\n}\n\nfunction isPrintableTreeKey(key: string): boolean {\n return key.length === 1 && key.trim().length > 0;\n}\n\nfunction resolveSelectableId(\n candidateId: string | null,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n if (candidateId === null) {\n return null;\n }\n\n const candidate = byId.get(candidateId);\n if (candidate === undefined || candidate.disabled === true) {\n return null;\n }\n\n return candidate.id;\n}\n\nfunction resolveFirstSelectableChildId(\n parentId: string,\n childrenByParent: Readonly<ReadonlyMap<string, readonly string[]>>,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n const childIds = childrenByParent.get(parentId) ?? [];\n for (const childId of childIds) {\n if (resolveSelectableId(childId, byId) !== null) {\n return childId;\n }\n }\n\n return null;\n}\n\nfunction resolveSelectableAncestorId(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n let parentId = byId.get(nodeId)?.parentId ?? null;\n\n while (parentId !== null) {\n const candidate = byId.get(parentId);\n if (candidate === undefined) {\n return null;\n }\n\n if (candidate.disabled !== true) {\n return candidate.id;\n }\n\n parentId = candidate.parentId ?? null;\n }\n\n return null;\n}\n\nfunction resolveTreeKeyAction(event: TngTreeKeyboardEvent): TngTreeKeyAction {\n if (event.altKey || event.metaKey) {\n return 'noop';\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n return 'select';\n }\n\n return actionByKey[event.key] ?? 'typeahead';\n}\n\nfunction shouldPreventDefault(action: TngTreeKeyAction): boolean {\n return action !== 'noop' && action !== 'typeahead';\n}\n\n@Component({\n selector: 'tng-tree',\n imports: [TngTreePrimitive],\n templateUrl: './tng-tree.component.html',\n styleUrl: './tng-tree.component.css',\n})\nexport class TngTreeComponent implements OnDestroy {\n public readonly ariaLabel = input<string>('Tree');\n public readonly defaultExpandedIds = input<readonly string[]>([]);\n public readonly defaultSelectedId = input<string | null>(null);\n public readonly nodes = input<readonly TngTreeItem[]>([]);\n\n public readonly selectedIdChange = output<string | null>();\n\n protected readonly activeDescendantId = computed((): string | null => {\n const activeId = this.activeId();\n if (activeId === null) {\n return null;\n }\n\n return this.toItemDomId(activeId);\n });\n protected readonly selectedId = signal<string | null>(null);\n protected readonly treeId = createTreeId();\n protected readonly visibleRows = computed((): readonly TngTreeRow[] => this.resolveVisibleRows());\n\n private readonly activeId = signal<string | null>(null);\n private readonly expandedIds = signal<readonly string[]>(Object.freeze([]));\n private readonly lookup = signal<TngTreeLookup>(createTreeLookup([]));\n private readonly rootRef = viewChild<ElementRef<HTMLElement>>('rootRef');\n private readonly visibleIds = signal<readonly string[]>(Object.freeze([]));\n\n private model: TngTreeModel = createTreeModel({ nodes: [] });\n private readonly typeahead: TngTypeaheadController = createTypeaheadController({ items: [] });\n\n private readonly keyActionHandlers: Readonly<Record<TngTreeRunnableAction, () => void>> =\n Object.freeze({\n 'collapse-or-parent': (): void => this.handleArrowLeft(),\n 'expand-or-child': (): void => this.handleArrowRight(),\n 'move-next': (): void => this.applyState(this.model.moveNext()),\n 'move-prev': (): void => this.applyState(this.model.movePrev()),\n select: (): void => this.selectActiveNode(),\n 'to-end': (): void => this.moveToBoundary('last'),\n 'to-start': (): void => this.moveToBoundary('first'),\n });\n\n private readonly syncInputsEffect = effect((): void => {\n this.rebuildFromInputs(this.nodes(), this.defaultExpandedIds(), this.defaultSelectedId());\n });\n\n public ngOnDestroy(): void {\n this.syncInputsEffect.destroy();\n }\n\n public onToggleClick(nodeId: string, event: TngTreePointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.hasChildren(nodeId)) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.toggle(nodeId));\n this.applyState(this.model.setActiveId(nodeId));\n }\n\n public onTreeFocus(): void {\n if (this.activeId() === null) {\n this.moveToBoundary('first');\n }\n }\n\n public onTreeItemClick(nodeId: string): void {\n const selectableId = resolveSelectableId(nodeId, this.lookup().byId);\n if (selectableId === null) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.setActiveId(selectableId));\n this.selectNode(selectableId);\n }\n\n public onTreeKeydown(event: TngTreeKeyboardEvent): void {\n const action = resolveTreeKeyAction(event);\n if (action === 'noop') {\n return;\n }\n\n if (action === 'typeahead') {\n this.handleTypeahead(event);\n return;\n }\n\n this.runKeyAction(action);\n if (shouldPreventDefault(action)) {\n event.preventDefault();\n }\n }\n\n protected isExpanded(nodeId: string): boolean {\n return this.expandedIds().includes(nodeId);\n }\n\n protected toItemDomId(nodeId: string): string {\n return toTreeItemDomId(this.treeId, nodeId);\n }\n\n private applyState(state: TngTreeModelState): void {\n this.activeId.set(state.activeId);\n this.expandedIds.set(state.expandedIds);\n this.visibleIds.set(state.visibleIds);\n this.typeahead.setItems(toTypeaheadItems(state.visibleIds, this.lookup().byId));\n this.typeahead.setActiveId(state.activeId);\n }\n\n private focusRoot(): void {\n this.rootRef()?.nativeElement.focus();\n }\n\n private handleArrowLeft(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n if (this.hasChildren(activeId) && this.isExpanded(activeId)) {\n this.applyState(this.model.collapse(activeId));\n return;\n }\n\n const ancestorId = resolveSelectableAncestorId(activeId, this.lookup().byId);\n if (ancestorId !== null) {\n this.applyState(this.model.setActiveId(ancestorId));\n }\n }\n\n private handleArrowRight(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n this.moveToBoundary('first');\n return;\n }\n\n if (!this.hasChildren(activeId)) {\n return;\n }\n\n if (!this.isExpanded(activeId)) {\n this.applyState(this.model.expand(activeId));\n return;\n }\n\n const childId = resolveFirstSelectableChildId(\n activeId,\n this.lookup().childrenByParent,\n this.lookup().byId,\n );\n if (childId !== null) {\n this.applyState(this.model.setActiveId(childId));\n }\n }\n\n private handleTypeahead(event: TngTreeKeyboardEvent): void {\n if (!isPrintableTreeKey(event.key)) {\n return;\n }\n\n const state = this.typeahead.handleKey(event.key);\n if (state.activeId === null || state.activeId === this.activeId()) {\n return;\n }\n\n this.applyState(this.model.setActiveId(state.activeId));\n event.preventDefault();\n }\n\n private hasChildren(nodeId: string): boolean {\n return (this.lookup().childrenByParent.get(nodeId)?.length ?? 0) > 0;\n }\n\n private moveToBoundary(boundary: TngTreeBoundary): void {\n const ids = this.visibleIds();\n const byId = this.lookup().byId;\n const orderedIds = boundary === 'first' ? ids : [...ids].reverse();\n\n for (const candidateId of orderedIds) {\n const selectableId = resolveSelectableId(candidateId, byId);\n if (selectableId !== null) {\n this.applyState(this.model.setActiveId(selectableId));\n return;\n }\n }\n }\n\n private rebuildFromInputs(\n nodes: readonly TngTreeItem[],\n expandedIds: readonly string[],\n selectedId: string | null,\n ): void {\n const normalizedNodes = toReadonlyArray(nodes);\n const lookup = createTreeLookup(normalizedNodes);\n this.lookup.set(lookup);\n\n this.model = createTreeModel({\n expandedIds,\n nodes: toTreeModelNodes(normalizedNodes),\n });\n this.applyState(this.model.getState());\n\n const nextSelectedId = resolveSelectableId(selectedId, lookup.byId);\n this.selectedId.set(nextSelectedId);\n if (nextSelectedId !== null) {\n this.applyState(this.model.setActiveId(nextSelectedId));\n }\n }\n\n private resolveVisibleRows(): readonly TngTreeRow[] {\n const byId = this.lookup().byId;\n const childrenByParent = this.lookup().childrenByParent;\n const rows: TngTreeRow[] = [];\n\n for (const nodeId of this.visibleIds()) {\n const node = byId.get(nodeId);\n if (node === undefined) {\n continue;\n }\n\n rows.push(\n Object.freeze({\n depth: resolveDepth(node.id, byId),\n description: node.description ?? null,\n disabled: node.disabled === true,\n hasChildren: (childrenByParent.get(node.id)?.length ?? 0) > 0,\n id: node.id,\n label: node.label,\n }),\n );\n }\n\n return toReadonlyArray(rows);\n }\n\n private runKeyAction(action: TngTreeKeyAction): void {\n if (action === 'noop' || action === 'typeahead') {\n return;\n }\n\n this.keyActionHandlers[action]();\n }\n\n private selectActiveNode(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n const selectableId = resolveSelectableId(activeId, this.lookup().byId);\n if (selectableId !== null) {\n this.selectNode(selectableId);\n }\n }\n\n private selectNode(nodeId: string): void {\n this.selectedId.set(nodeId);\n this.selectedIdChange.emit(nodeId);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-tree.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,eAAe,EACf,yBAAyB,GAM1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAmDpD,MAAM,WAAW,GAA+C,MAAM,CAAC,MAAM,CAAC;IAC5E,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,oBAAoB;IAC/B,UAAU,EAAE,iBAAiB;IAC7B,OAAO,EAAE,WAAW;IACpB,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,UAAU;CACjB,CAAC,CAAC;AAEH,SAAS,eAAe,CAAI,MAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA6B;IACrD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA6B;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACvC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtE,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,wBAAwB,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,gBAAgB,EAAE,wBAAwB;KAC3C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,MAAc,EACd,IAAgD;IAEhD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,OAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,CAAC;QACX,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,UAA6B,EAC7B,IAAgD;IAEhD,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SACzB,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;SACzD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,MAAc;IACrD,OAAO,GAAG,MAAM,SAAS,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAC1B,WAA0B,EAC1B,IAAgD;IAEhD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAS,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,6BAA6B,CACpC,QAAgB,EAChB,gBAAkE,EAClE,IAAgD;IAEhD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAClC,MAAc,EACd,IAAgD;IAEhD,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;IAElD,OAAO,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC,EAAE,CAAC;QACtB,CAAC;QAED,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA2B;IACvD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAC3E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwB;IACpD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,WAAW,CAAC;AACrD,CAAC;AASM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACX,SAAS,GAAG,KAAK,CAAS,MAAM,CAAC,CAAC;IAClC,kBAAkB,GAAG,KAAK,CAAoB,EAAE,CAAC,CAAC;IAClD,iBAAiB,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC/C,KAAK,GAAG,KAAK,CAAyB,EAAE,CAAC,CAAC;IAE1C,gBAAgB,GAAG,MAAM,EAAiB,CAAC;IAExC,kBAAkB,GAAG,QAAQ,CAAC,GAAkB,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACgB,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,YAAY,EAAE,CAAC;IACxB,WAAW,GAAG,QAAQ,CAAC,GAA0B,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjF,QAAQ,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACvC,WAAW,GAAG,MAAM,CAAoB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,MAAM,CAAgB,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,GAAG,SAAS,CAA0B,SAAS,CAAC,CAAC;IACxD,UAAU,GAAG,MAAM,CAAoB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,KAAK,GAAiB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,SAAS,GAA2B,yBAAyB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7E,iBAAiB,GAChC,MAAM,CAAC,MAAM,CAAC;QACZ,oBAAoB,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE;QACxD,iBAAiB,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACtD,WAAW,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/D,WAAW,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/D,MAAM,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAC3C,QAAQ,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QACjD,UAAU,EAAE,GAAS,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;KACrD,CAAC,CAAC;IAEY,gBAAgB,GAAG,MAAM,CAAC,GAAS,EAAE;QACpD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEI,WAAW;QAChB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAEM,aAAa,CAAC,MAAc,EAAE,KAA0B;QAC7D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAEM,WAAW;QAChB,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,eAAe,CAAC,MAAc;QACnC,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAEM,aAAa,CAAC,KAA2B;QAC9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAES,UAAU,CAAC,MAAc;QACjC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAES,WAAW,CAAC,MAAc;QAClC,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEO,UAAU,CAAC,KAAwB;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAEO,eAAe;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,6BAA6B,CAC3C,QAAQ,EACR,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAC9B,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACnB,CAAC;QACF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAA2B;QACjD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IAEO,cAAc,CAAC,QAAyB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAChC,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAEnE,KAAK,MAAM,WAAW,IAAI,UAAU,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB,CACvB,KAA6B,EAC7B,WAA8B,EAC9B,UAAyB;QAEzB,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExB,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;YAC3B,WAAW;YACX,KAAK,EAAE,gBAAgB,CAAC,eAAe,CAAC;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACpC,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC;QACxD,MAAM,IAAI,GAAiB,EAAE,CAAC;QAE9B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CACP,MAAM,CAAC,MAAM,CAAC;gBACZ,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;gBAClC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;gBACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAChC,WAAW,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;gBAC7D,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,YAAY,CAAC,MAAwB;QAC3C,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;IACnC,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,MAAc;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;CACF,CAAA;AArQY,gBAAgB;IAP5B,SAAS,CAAC;QACT,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,0BAA0B;KACrC,CAAC;GACW,gBAAgB,CAqQ5B","sourcesContent":["import { Component, computed, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { ElementRef, OnDestroy } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport {\n createTreeModel,\n createTypeaheadController,\n type TngTreeModel,\n type TngTreeModelState,\n type TngTreeNode,\n type TngTypeaheadController,\n type TngTypeaheadItem,\n} from '@tailng-ui/cdk';\nimport { TngTree as TngTreePrimitive } from '@tailng-ui/primitives';\n\nconst createTreeId = createTngIdFactory('tng-tree');\n\ntype TngTreeBoundary = 'first' | 'last';\n\ntype TngTreeKeyboardEvent = Readonly<{\n altKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n}>;\n\ntype TngTreePointerEvent = Readonly<{\n preventDefault: () => void;\n stopPropagation: () => void;\n}>;\n\ntype TngTreeKeyAction =\n | 'collapse-or-parent'\n | 'expand-or-child'\n | 'move-next'\n | 'move-prev'\n | 'noop'\n | 'select'\n | 'to-end'\n | 'to-start'\n | 'typeahead';\n\ntype TngTreeLookup = Readonly<{\n byId: ReadonlyMap<string, TngTreeItem>;\n childrenByParent: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype TngTreeRow = Readonly<{\n depth: number;\n description: string | null;\n disabled: boolean;\n hasChildren: boolean;\n id: string;\n label: string;\n}>;\n\ntype TngTreeRunnableAction = Exclude<TngTreeKeyAction, 'noop' | 'typeahead'>;\n\nexport type TngTreeItem = Readonly<{\n description?: string | null;\n disabled?: boolean;\n id: string;\n label: string;\n parentId?: string | null;\n}>;\n\nconst actionByKey: Readonly<Record<string, TngTreeKeyAction>> = Object.freeze({\n ArrowDown: 'move-next',\n ArrowLeft: 'collapse-or-parent',\n ArrowRight: 'expand-or-child',\n ArrowUp: 'move-prev',\n End: 'to-end',\n Home: 'to-start',\n});\n\nfunction toReadonlyArray<T>(values: readonly T[]): readonly T[] {\n return Object.freeze([...values]);\n}\n\nfunction toTreeModelNodes(items: readonly TngTreeItem[]): readonly TngTreeNode[] {\n return items.map((item) => ({\n disabled: item.disabled,\n id: item.id,\n parentId: item.parentId,\n }));\n}\n\nfunction createTreeLookup(items: readonly TngTreeItem[]): TngTreeLookup {\n const byId = new Map<string, TngTreeItem>();\n const childrenByParent = new Map<string, string[]>();\n\n for (const item of items) {\n byId.set(item.id, item);\n }\n\n for (const item of items) {\n const parentId = item.parentId ?? null;\n if (parentId === null || !byId.has(parentId)) {\n continue;\n }\n\n const children = childrenByParent.get(parentId) ?? [];\n children.push(item.id);\n childrenByParent.set(parentId, children);\n }\n\n const readonlyChildrenByParent = new Map<string, readonly string[]>();\n for (const [parentId, children] of childrenByParent.entries()) {\n readonlyChildrenByParent.set(parentId, toReadonlyArray(children));\n }\n\n return Object.freeze({\n byId,\n childrenByParent: readonlyChildrenByParent,\n });\n}\n\nfunction resolveDepth(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): number {\n let depth = 0;\n let parentId = byId.get(nodeId)?.parentId ?? null;\n const visited = new Set<string>();\n\n while (parentId !== null && byId.has(parentId) && !visited.has(parentId)) {\n visited.add(parentId);\n depth += 1;\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n\n return depth;\n}\n\nfunction toTypeaheadItems(\n visibleIds: readonly string[],\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): readonly TngTypeaheadItem[] {\n return visibleIds\n .map((id) => byId.get(id))\n .filter((item): item is TngTreeItem => item !== undefined)\n .map((item) => ({\n disabled: item.disabled,\n id: item.id,\n text: item.label,\n }));\n}\n\nfunction toTreeItemDomId(treeId: string, nodeId: string): string {\n return `${treeId}-item-${nodeId}`;\n}\n\nfunction isPrintableTreeKey(key: string): boolean {\n return key.length === 1 && key.trim().length > 0;\n}\n\nfunction resolveSelectableId(\n candidateId: string | null,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n if (candidateId === null) {\n return null;\n }\n\n const candidate = byId.get(candidateId);\n if (candidate === undefined || candidate.disabled === true) {\n return null;\n }\n\n return candidate.id;\n}\n\nfunction resolveFirstSelectableChildId(\n parentId: string,\n childrenByParent: Readonly<ReadonlyMap<string, readonly string[]>>,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n const childIds = childrenByParent.get(parentId) ?? [];\n for (const childId of childIds) {\n if (resolveSelectableId(childId, byId) !== null) {\n return childId;\n }\n }\n\n return null;\n}\n\nfunction resolveSelectableAncestorId(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n let parentId = byId.get(nodeId)?.parentId ?? null;\n\n while (parentId !== null) {\n const candidate = byId.get(parentId);\n if (candidate === undefined) {\n return null;\n }\n\n if (candidate.disabled !== true) {\n return candidate.id;\n }\n\n parentId = candidate.parentId ?? null;\n }\n\n return null;\n}\n\nfunction resolveTreeKeyAction(event: TngTreeKeyboardEvent): TngTreeKeyAction {\n if (event.altKey || event.metaKey) {\n return 'noop';\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n return 'select';\n }\n\n return actionByKey[event.key] ?? 'typeahead';\n}\n\nfunction shouldPreventDefault(action: TngTreeKeyAction): boolean {\n return action !== 'noop' && action !== 'typeahead';\n}\n\n@Component({\n standalone: true,\n selector: 'tng-tree',\n imports: [TngTreePrimitive],\n templateUrl: './tng-tree.component.html',\n styleUrl: './tng-tree.component.css',\n})\nexport class TngTreeComponent implements OnDestroy {\n public readonly ariaLabel = input<string>('Tree');\n public readonly defaultExpandedIds = input<readonly string[]>([]);\n public readonly defaultSelectedId = input<string | null>(null);\n public readonly nodes = input<readonly TngTreeItem[]>([]);\n\n public readonly selectedIdChange = output<string | null>();\n\n protected readonly activeDescendantId = computed((): string | null => {\n const activeId = this.activeId();\n if (activeId === null) {\n return null;\n }\n\n return this.toItemDomId(activeId);\n });\n protected readonly selectedId = signal<string | null>(null);\n protected readonly treeId = createTreeId();\n protected readonly visibleRows = computed((): readonly TngTreeRow[] => this.resolveVisibleRows());\n\n private readonly activeId = signal<string | null>(null);\n private readonly expandedIds = signal<readonly string[]>(Object.freeze([]));\n private readonly lookup = signal<TngTreeLookup>(createTreeLookup([]));\n private readonly rootRef = viewChild<ElementRef<HTMLElement>>('rootRef');\n private readonly visibleIds = signal<readonly string[]>(Object.freeze([]));\n\n private model: TngTreeModel = createTreeModel({ nodes: [] });\n private readonly typeahead: TngTypeaheadController = createTypeaheadController({ items: [] });\n\n private readonly keyActionHandlers: Readonly<Record<TngTreeRunnableAction, () => void>> =\n Object.freeze({\n 'collapse-or-parent': (): void => this.handleArrowLeft(),\n 'expand-or-child': (): void => this.handleArrowRight(),\n 'move-next': (): void => this.applyState(this.model.moveNext()),\n 'move-prev': (): void => this.applyState(this.model.movePrev()),\n select: (): void => this.selectActiveNode(),\n 'to-end': (): void => this.moveToBoundary('last'),\n 'to-start': (): void => this.moveToBoundary('first'),\n });\n\n private readonly syncInputsEffect = effect((): void => {\n this.rebuildFromInputs(this.nodes(), this.defaultExpandedIds(), this.defaultSelectedId());\n });\n\n public ngOnDestroy(): void {\n this.syncInputsEffect.destroy();\n }\n\n public onToggleClick(nodeId: string, event: TngTreePointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.hasChildren(nodeId)) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.toggle(nodeId));\n this.applyState(this.model.setActiveId(nodeId));\n }\n\n public onTreeFocus(): void {\n if (this.activeId() === null) {\n this.moveToBoundary('first');\n }\n }\n\n public onTreeItemClick(nodeId: string): void {\n const selectableId = resolveSelectableId(nodeId, this.lookup().byId);\n if (selectableId === null) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.setActiveId(selectableId));\n this.selectNode(selectableId);\n }\n\n public onTreeKeydown(event: TngTreeKeyboardEvent): void {\n const action = resolveTreeKeyAction(event);\n if (action === 'noop') {\n return;\n }\n\n if (action === 'typeahead') {\n this.handleTypeahead(event);\n return;\n }\n\n this.runKeyAction(action);\n if (shouldPreventDefault(action)) {\n event.preventDefault();\n }\n }\n\n protected isExpanded(nodeId: string): boolean {\n return this.expandedIds().includes(nodeId);\n }\n\n protected toItemDomId(nodeId: string): string {\n return toTreeItemDomId(this.treeId, nodeId);\n }\n\n private applyState(state: TngTreeModelState): void {\n this.activeId.set(state.activeId);\n this.expandedIds.set(state.expandedIds);\n this.visibleIds.set(state.visibleIds);\n this.typeahead.setItems(toTypeaheadItems(state.visibleIds, this.lookup().byId));\n this.typeahead.setActiveId(state.activeId);\n }\n\n private focusRoot(): void {\n this.rootRef()?.nativeElement.focus();\n }\n\n private handleArrowLeft(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n if (this.hasChildren(activeId) && this.isExpanded(activeId)) {\n this.applyState(this.model.collapse(activeId));\n return;\n }\n\n const ancestorId = resolveSelectableAncestorId(activeId, this.lookup().byId);\n if (ancestorId !== null) {\n this.applyState(this.model.setActiveId(ancestorId));\n }\n }\n\n private handleArrowRight(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n this.moveToBoundary('first');\n return;\n }\n\n if (!this.hasChildren(activeId)) {\n return;\n }\n\n if (!this.isExpanded(activeId)) {\n this.applyState(this.model.expand(activeId));\n return;\n }\n\n const childId = resolveFirstSelectableChildId(\n activeId,\n this.lookup().childrenByParent,\n this.lookup().byId,\n );\n if (childId !== null) {\n this.applyState(this.model.setActiveId(childId));\n }\n }\n\n private handleTypeahead(event: TngTreeKeyboardEvent): void {\n if (!isPrintableTreeKey(event.key)) {\n return;\n }\n\n const state = this.typeahead.handleKey(event.key);\n if (state.activeId === null || state.activeId === this.activeId()) {\n return;\n }\n\n this.applyState(this.model.setActiveId(state.activeId));\n event.preventDefault();\n }\n\n private hasChildren(nodeId: string): boolean {\n return (this.lookup().childrenByParent.get(nodeId)?.length ?? 0) > 0;\n }\n\n private moveToBoundary(boundary: TngTreeBoundary): void {\n const ids = this.visibleIds();\n const byId = this.lookup().byId;\n const orderedIds = boundary === 'first' ? ids : [...ids].reverse();\n\n for (const candidateId of orderedIds) {\n const selectableId = resolveSelectableId(candidateId, byId);\n if (selectableId !== null) {\n this.applyState(this.model.setActiveId(selectableId));\n return;\n }\n }\n }\n\n private rebuildFromInputs(\n nodes: readonly TngTreeItem[],\n expandedIds: readonly string[],\n selectedId: string | null,\n ): void {\n const normalizedNodes = toReadonlyArray(nodes);\n const lookup = createTreeLookup(normalizedNodes);\n this.lookup.set(lookup);\n\n this.model = createTreeModel({\n expandedIds,\n nodes: toTreeModelNodes(normalizedNodes),\n });\n this.applyState(this.model.getState());\n\n const nextSelectedId = resolveSelectableId(selectedId, lookup.byId);\n this.selectedId.set(nextSelectedId);\n if (nextSelectedId !== null) {\n this.applyState(this.model.setActiveId(nextSelectedId));\n }\n }\n\n private resolveVisibleRows(): readonly TngTreeRow[] {\n const byId = this.lookup().byId;\n const childrenByParent = this.lookup().childrenByParent;\n const rows: TngTreeRow[] = [];\n\n for (const nodeId of this.visibleIds()) {\n const node = byId.get(nodeId);\n if (node === undefined) {\n continue;\n }\n\n rows.push(\n Object.freeze({\n depth: resolveDepth(node.id, byId),\n description: node.description ?? null,\n disabled: node.disabled === true,\n hasChildren: (childrenByParent.get(node.id)?.length ?? 0) > 0,\n id: node.id,\n label: node.label,\n }),\n );\n }\n\n return toReadonlyArray(rows);\n }\n\n private runKeyAction(action: TngTreeKeyAction): void {\n if (action === 'noop' || action === 'typeahead') {\n return;\n }\n\n this.keyActionHandlers[action]();\n }\n\n private selectActiveNode(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n const selectableId = resolveSelectableId(activeId, this.lookup().byId);\n if (selectableId !== null) {\n this.selectNode(selectableId);\n }\n }\n\n private selectNode(nodeId: string): void {\n this.selectedId.set(nodeId);\n this.selectedIdChange.emit(nodeId);\n }\n}\n"]}
|