@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
1 lines • 71.3 kB
Source Map (JSON)
{"version":3,"file":"cisstech-nge-ui-tree.mjs","sources":["../../../projects/nge/ui/tree/src/tree-node.directive.ts","../../../projects/nge/ui/tree/src/internal.ts","../../../projects/nge/ui/tree/src/tree.model.ts","../../../projects/nge/ui/tree/src/autofocus.directive.ts","../../../projects/nge/ui/tree/src/tree.component.ts","../../../projects/nge/ui/tree/src/tree.component.html","../../../projects/nge/ui/tree/src/tree.module.ts","../../../projects/nge/ui/tree/src/tree.service.ts","../../../projects/nge/ui/tree/cisstech-nge-ui-tree.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core'\nimport { ITreeNodeHolder } from './tree.model'\n\nexport declare type Context<T> = {\n $implicit: ITreeNodeHolder<T>\n}\n\n/** Element that can be used as a template for a `TreeComponent` */\n@Directive({\n // tslint:disable-next-line: directive-selector\n selector: '[treeNode], ui-tree-node',\n})\nexport class TreeNodeDirective<T> {\n // https://medium.com/angular-in-depth/type-checking-templates-in-angular-viewengine-and-ivy-77f8536359f5\n static ngTemplateContextGuard<T>(_: TreeNodeDirective<T>, ctx: any): ctx is Context<T> {\n return true\n }\n constructor(readonly templateRef: TemplateRef<Context<T>>) {}\n}\n","import { ITree } from './tree.model'\n\n/**\n * Stores the actual visible trees of the page.\n *\n * This variable is private to the library and should not be added to the entry file of the api.\n */\nexport const CURRENT_VISIBLE_TREES = new Map<string, ITree<any>>()\n","/**\n * Representation of a node\n * T => data\n * string => id of a node\n * Element => dom element of a node\n * ITreeNodeHolder<T> internal representation\n */\nexport declare type INode<T> = T | string | Element | ITreeNodeHolder<T>\n\nexport interface ITreeState {\n active: string\n filter: ITreeFilter\n expandedNodes: string[]\n}\n\nexport interface ITreeFilter {\n term: string\n}\n\nexport interface ITreeEdition<T> {\n node: T\n text: string\n creation?: boolean\n}\n\n/**\n * Keyboard event handlers\n */\nexport interface ITreeKeyAction<T> {\n /**\n * Original dom event (MouseEvent|KeyboardEvent).\n * If `event.preventDefault()` is not called, the typed character will be added/removed\n * to the current filter of the tree.\n */\n event: KeyboardEvent\n /** The node on which the action is called. (`null` for contextmenu on the tree itself ) */\n node?: T\n}\n\n/** Mouse event handlers */\nexport interface ITreeMouseAction<T> {\n /** original dom event (MouseEvent|KeyboardEvent) */\n event: MouseEvent\n /** The node on which the action is called. (`null` for contextmenu on the tree itself ) */\n node?: T\n}\n\n/** Maps mouse events, and key codes, to callbacks. */\nexport interface ITreeActionMapping<T> {\n keys?: { [k: string]: (e: ITreeKeyAction<T>) => void }\n mouse?: {\n click?: (e: ITreeMouseAction<T>) => void\n rightClick?: (e: ITreeMouseAction<T>) => void\n }\n}\n\n/**\n * Tree api.\n */\nexport interface ITree<T> {\n /**\n * Gets the selected nodes.\n */\n selections(): T[]\n\n /**\n * Gets the current focused node.\n */\n focusedNode(): T | undefined\n\n /**\n * Gets a value indicating whether `node` is selected.\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n isSelected(node: INode<T>): boolean\n\n /**\n * Gets a value indicating whether `node` is the current focused node.\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n isFocused(node: INode<T>): boolean\n\n /**\n * Gets a value indicating whether `node` is expanded.\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n isExpanded(node: INode<T>): boolean\n\n /**\n * Sets `node` as the new focused node.\n *\n * Note:\n * The ancestors the of node will be expanded and the tree will scroll into the node.\n * @param node A reference to a node.\n */\n focus(node: INode<T>): void\n\n /** Unfocus the current focused node */\n unfocus(): void\n\n /**\n * Expands the passed `node` with all its parents.\n *\n * Note:\n * This method will not select/focus the node.\n *\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n expand(node: INode<T>): void\n\n /**\n * Expand the entire tree.\n */\n expandAll(): void\n\n /**\n * Collapses the given `node`.\n *\n * Note:\n * This method will not select/focus the node.\n *\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n collapse(node: INode<T>): void\n\n /**\n * Collapse the entire tree\n */\n collapseAll(): void\n\n /**\n * Toggles the expanded/collapse state of the given node.\n *\n * Note:\n * This method will not select/focus the node.\n *\n * @param node A reference to a node.\n * @throws {ReferenceError} if node is null.\n */\n toggle(node: INode<T>): void\n\n /**\n * Starts editing the given node.\n * @param node A reference to a node.\n * @param creation If true, an input will be displayed after the node to create a new child node.\n * @throws {ReferenceError} if `node` is null.\n */\n startEdition(node: INode<T>, creation?: boolean): void\n\n /**\n * End the editing of the current node in a editing state.\n */\n endEdition(): void\n\n /**\n * Filter the tree using the given filter.\n * @param filter The filter to apply.\n */\n search(filter: ITreeFilter): void\n\n /**\n * Saves the tree as an object to be restored later\n * by calling `tree.restoreState()`.\n */\n saveState(): ITreeState\n\n /**\n * Restores the state of the tree from `state`.\n * @param state the state.\n */\n restoreState(state: ITreeState): void\n}\n\n/**\n * Adapter class to map a generic type T to an ITreeHolder<T>\n * and attach event listeners to the tree instance.\n */\nexport interface ITreeAdapter<T> {\n /**\n * Unique identifier of the tree.\n *\n * This identifier is used to get a reference to the tree anywhere\n * by using `TreeService` class.\n */\n id: string\n\n /** Tree height (default 100%) */\n treeHeight?: string\n\n /** Item height (default 32) */\n itemHeight?: number\n\n /**\n * Function called to get the id of a node.\n */\n idProvider: (node: T) => string\n\n /**\n * Function called to get test whether a node is expandable.\n */\n isExpandable: (node: T) => boolean\n\n /**\n * Function called to get the display name of a node.\n */\n nameProvider: (node: T) => string\n\n /**\n * Function called to get the children of a node.\n */\n childrenProvider: (node: T) => T[]\n\n /**\n * Function called to get the display tooltip of a node.\n */\n tooltipProvider?: (node: T) => string\n\n /**\n * If enabled, this option will filter the tree\n * each time a keyboard key is pressed while the tree is focused.\n *\n * Note:\n *\n * The filter will be updated only if `preventDefault()` is not called\n * on the original KeyboardEvent by any of the event handlers.\n *\n */\n enableKeyboardFiltering?: boolean\n\n /**\n * Event called after a node is expanded in the tree.\n * @param e informations about the event.\n */\n onDidExpand?: (e: T) => void\n\n /**\n * Event called after a node is expanded in the tree.\n * @param e informations about the event.\n */\n onDidCollapse?: (e: T) => void\n\n /**\n * Event called after a node is edited in the tree.\n * @param e informations about the event.\n */\n onDidEditName?: (e: ITreeEdition<T>) => void\n\n /**\n * Maps mouse events, and key codes, to callbacks.\n */\n actions?: ITreeActionMapping<T>\n\n /** Should the tree keep the expands state when the nodes change? (default to `true`)*/\n keepStateOnChangeNodes?: boolean\n}\n\n/** Internal representation of a node */\nexport interface ITreeNodeHolder<T> {\n /** A unique key of this node. */\n id: string\n\n /** Reference to the original data. */\n data: T\n\n /** display name of the node */\n name: string\n\n /** Level in the tree (starts from 0). */\n level: number\n\n /** A value indicating whether the node is expandable */\n expandable: boolean\n\n /** Optional tooltip to show when the node is hovered */\n tooltip?: string\n\n padding: string\n\n // TODO precalculate the following properties instead of calling functions inside template.\n\n /** A value indicating whether the node is focused */\n focused?: boolean\n\n /** A value indicating whether the node is expanded */\n expanded?: boolean\n\n /** A value indicating whether the node is selected */\n selected?: boolean\n\n /** A value indicating whether the node is in creating state. */\n creating?: boolean\n\n /** A value indicating whether the node is in renaming state. */\n renaming?: boolean\n}\n\nexport class TreeFilter implements ITreeFilter {\n constructor(public term = '') {}\n}\n\nexport class TreeState implements ITreeState {\n constructor(\n public active = '',\n public expandedNodes: string[] = [],\n public filter: ITreeFilter = new TreeFilter()\n ) {}\n}\n","import { AfterContentInit, Directive, ElementRef } from '@angular/core'\n\n@Directive({\n // tslint:disable-next-line: directive-selector\n selector: 'input[autofocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n constructor(private readonly el: ElementRef) {}\n ngAfterContentInit() {\n setTimeout(() => {\n this.el.nativeElement.focus()\n }, 500)\n }\n}\n","import { FlatTreeControl } from '@angular/cdk/tree'\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n} from '@angular/core'\nimport { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'\nimport { BehaviorSubject } from 'rxjs'\nimport { CURRENT_VISIBLE_TREES } from './internal'\nimport { TreeNodeDirective } from './tree-node.directive'\nimport {\n INode,\n ITree,\n ITreeAdapter,\n ITreeEdition,\n ITreeFilter,\n ITreeNodeHolder,\n ITreeState,\n TreeFilter,\n} from './tree.model'\n\n@Component({\n selector: 'ui-tree',\n templateUrl: 'tree.component.html',\n styleUrls: ['tree.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TreeComponent<T> implements ITree<T>, OnInit, OnChanges, OnDestroy {\n @Input() nodes: T[] = []\n @Input() adapter!: ITreeAdapter<T>\n\n @ContentChild(TreeNodeDirective, { static: true })\n protected nodeDirective!: TreeNodeDirective<T>\n\n private readonly DATA_TREE_NODE_ID = 'data-tree-node-id'\n\n private readonly flattener: MatTreeFlattener<T, ITreeNodeHolder<T>>\n private readonly dataSource: MatTreeFlatDataSource<T, ITreeNodeHolder<T>>\n\n private readonly nodesIndex = new Map<string, ITreeNodeHolder<T>>()\n private readonly parentsIndex = new Map<string, string>()\n private readonly hiddenNodes = new Map<string, ITreeNodeHolder<T>>()\n private readonly selectedNodes = new Map<string, ITreeNodeHolder<T>>()\n\n private isEmpty = false\n private isShiftKeyPressed = false\n private activeNode?: ITreeNodeHolder<T>\n private stateBeforeSearching: ITreeState | undefined\n\n protected editing: Partial<ITreeEdition<T>> = { text: '', node: undefined }\n protected readonly visibleNodes = new BehaviorSubject<ITreeNodeHolder<T>[]>([])\n\n readonly filter: ITreeFilter = new TreeFilter()\n readonly controler: FlatTreeControl<ITreeNodeHolder<T>>\n\n protected get treeHeight(): string {\n return this.adapter?.itemHeight?.toString() || '100%'\n }\n\n constructor(\n private readonly elementRef: ElementRef<HTMLElement>,\n private readonly changeDetectorRef: ChangeDetectorRef\n ) {\n this.controler = new FlatTreeControl<ITreeNodeHolder<T>>(\n (node) => node.level,\n (node) => node.expandable,\n {\n trackBy: (node) => node,\n }\n )\n\n this.flattener = new MatTreeFlattener<T, ITreeNodeHolder<T>>(\n (node, level) => this.transformer(node, level),\n (node) => node.level,\n (node) => node.expandable,\n (node) => this.children(node)\n )\n\n this.dataSource = new MatTreeFlatDataSource(this.controler, this.flattener)\n }\n\n ngOnInit(): void {\n if (!this.adapter.id?.trim()) {\n throw new Error('@Input() adapter.id is required !')\n }\n CURRENT_VISIBLE_TREES.set(this.adapter.id, this)\n }\n\n ngOnChanges(): void {\n if (!this.adapter) {\n throw new Error('@Input() adapter is required !')\n }\n\n const requires: (keyof ITreeAdapter<T>)[] = ['id', 'idProvider', 'nameProvider', 'isExpandable', 'childrenProvider']\n for (const key of requires) {\n const value = this.adapter[key]\n if (!value || (typeof value === 'string' && value.trim() === '')) {\n throw new Error(`@Input() adapter.${key} is required !`)\n }\n }\n\n this.adapter.itemHeight = this.adapter.itemHeight || 32\n this.adapter.treeHeight = this.adapter.treeHeight || '100%'\n this.adapter.keepStateOnChangeNodes = this.adapter.keepStateOnChangeNodes ?? true\n\n let state: ITreeState | undefined\n if (this.adapter.keepStateOnChangeNodes) {\n state = this.saveState()\n }\n\n this.buildIndexes()\n\n if (state) {\n this.restoreState(state)\n } else {\n this.unselectAll(false)\n this.render()\n }\n }\n\n ngOnDestroy(): void {\n if (this.adapter?.id) {\n CURRENT_VISIBLE_TREES.delete(this.adapter.id)\n }\n }\n\n //#region API\n\n selections(): T[] {\n return Array.from(this.selectedNodes.values()).map((e) => e.data)\n }\n\n focusedNode(): T | undefined {\n return this.activeNode?.data\n }\n\n isFocused(node: INode<T>): boolean {\n if (node == null) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n if (!this.activeNode) {\n return false\n }\n\n return this.findHolder(node)?.id === this.activeNode.id\n }\n\n isExpanded(node: INode<T>): boolean {\n if (node == null) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n const holder = this.findHolder(node)\n if (!holder?.expandable) {\n return false\n }\n\n return this.controler.isExpanded(holder)\n }\n\n isSelected(node: INode<T>): boolean {\n if (node == null) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n const holder = this.findHolder(node)\n if (!holder) {\n return false\n }\n\n return this.selectedNodes.has(holder.id)\n }\n\n focus(node: INode<T>, render = true): void {\n const holder = this.findHolder(node)\n if (holder) {\n if (this.activeNode) {\n this.unselect(this.activeNode, false)\n }\n this.activeNode = holder\n this.select(node, false)\n this.expandAncestors(holder)\n if (render) {\n this.render()\n }\n this.scrollInto(holder)\n }\n }\n\n unfocus(): void {\n this.activeNode = undefined\n this.changeDetectorRef.detectChanges()\n }\n\n expand(node: INode<T>, render = true): void {\n if (!node) {\n return\n }\n\n const holder = this.findHolder(node)\n if (!holder) {\n return\n }\n\n if (holder.expandable && !this.controler.isExpanded(holder)) {\n this.controler.expand(holder)\n this.expandAncestors(holder)\n if (render) {\n this.render()\n }\n }\n }\n\n expandAll(render = true): void {\n this.controler.dataNodes?.forEach((node) => {\n this.controler.expand(node)\n })\n // this.controler.expandAll(); // https://github.com/vmware/clarity/issues/4850\n if (render) {\n this.render()\n }\n }\n\n collapse(node: INode<T>, render = true): void {\n if (!node) {\n return\n }\n\n const holder = this.findHolder(node)\n if (!holder) {\n return\n }\n\n if (holder.expandable && this.controler.isExpanded(holder)) {\n this.controler.collapse(holder)\n if (this.adapter.onDidCollapse) {\n this.adapter.onDidCollapse(holder.data)\n }\n if (render) {\n this.render()\n }\n }\n }\n\n collapseAll(render = true): void {\n this.controler.collapseAll()\n if (render) {\n this.render()\n }\n }\n\n toggle(node: INode<T>, render = true): void {\n if (!node) {\n return\n }\n\n const holder = this.findHolder(node)\n if (holder?.expandable) {\n if (this.controler.isExpanded(holder)) {\n this.collapse(node, render)\n } else {\n this.expand(node, render)\n }\n }\n }\n\n startEdition(node: INode<T>, creation?: boolean): void {\n if (!this.adapter.onDidEditName) return\n\n if (!node) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n const holder = this.findHolder(node)\n if (holder) {\n this.unselectAll(false)\n this.editing.node = holder.data\n this.editing.text = creation ? '' : holder.name\n this.editing.creation = creation\n holder.renaming = !creation\n holder.creating = creation\n if (holder.expandable && !this.isExpanded(holder)) {\n this.expand(node)\n }\n }\n\n this.changeDetectorRef.detectChanges()\n }\n\n endEdition(): void {\n const holder = this.findHolder(this.editing.node!)\n if (holder) {\n holder.renaming = false\n holder.creating = false\n }\n this.editing = { text: '' }\n this.changeDetectorRef.detectChanges()\n }\n\n search(filter: ITreeFilter) {\n if (!this.filter.term) {\n this.stateBeforeSearching = this.saveState()\n }\n\n this.filter.term = (filter.term || '').trim()\n\n if (!this.filter.term) {\n if (this.stateBeforeSearching) {\n this.restoreState(this.stateBeforeSearching)\n this.stateBeforeSearching = undefined\n } else {\n this.hiddenNodes.clear()\n this.render()\n }\n return\n }\n\n const pattern = this.buildSearchPattern()\n if (pattern) {\n this.activeNode = undefined\n this.hiddenNodes.clear()\n this.selectedNodes.clear()\n this.collapseAll(false)\n\n const p = pattern\n const matches = new Set<string>()\n const nodes = this.controler.dataNodes || []\n const n = nodes.length - 1\n for (let i = n; i >= 0; i--) {\n const node = nodes[i]\n if (matches.has(node.id)) continue\n\n if (node.name.toLowerCase().match(p)) {\n matches.add(node.id)\n this.iterateAncestors(node, (e) => {\n this.controler.expand(e)\n matches.add(e.id)\n })\n } else {\n this.hiddenNodes.set(node.id, node)\n }\n }\n this.render()\n } else {\n this.changeDetectorRef.detectChanges()\n }\n }\n\n saveState(): ITreeState {\n const { term } = this.filter\n const dataNodes = this.controler.dataNodes || []\n const state: ITreeState = {\n filter: { term },\n active: this.activeNode ? this.activeNode.id : '',\n expandedNodes: dataNodes\n .filter((e) => {\n return this.controler.isExpanded(e)\n })\n .map((e) => e.id),\n }\n return state\n }\n\n restoreState(state: ITreeState): void {\n state = state || {\n active: '',\n filter: new TreeFilter(),\n expandedNodes: [],\n }\n\n state.active = state.active || ''\n state.filter = state.filter || new TreeFilter()\n state.expandedNodes = state.expandedNodes || []\n\n this.hiddenNodes.clear()\n this.selectedNodes.clear()\n\n this.collapseAll(false)\n\n const { active, filter, expandedNodes } = state\n\n if (filter.term) {\n this.search(filter)\n } else {\n expandedNodes.forEach((node) => this.expand(node, false))\n this.render()\n }\n\n if (active) {\n const activeNode = this.findHolder(active)\n if (activeNode) {\n this.focus(activeNode)\n }\n }\n }\n\n //#endregion\n\n //#region CALLED FROM TEMPLATE\n protected _onEdit(event: Event): void {\n if (this.adapter.onDidEditName) {\n event.stopPropagation()\n\n const { node, text, creation } = this.editing\n if (!node) {\n throw new Error('There is no focused node.')\n }\n\n const isBlur = event instanceof FocusEvent && event.type === 'blur'\n const isEnter = event instanceof KeyboardEvent && event.key === 'Enter'\n const isEscape = event instanceof KeyboardEvent && event.key === 'Escape'\n\n if (isEscape) {\n event.preventDefault()\n this.endEdition()\n } else if (isBlur || isEnter) {\n event.preventDefault()\n const name = text?.trim() || ''\n try {\n if (name) {\n this.adapter.onDidEditName({\n node: node,\n text: name,\n creation,\n })\n }\n } finally {\n this.focus(node)\n this.endEdition()\n }\n }\n }\n }\n\n protected _clearFilter(): void {\n this.search({ term: '' })\n }\n\n protected _isRenaming(node: INode<T>): boolean {\n if (node == null) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n if (!this.editing?.node) {\n return false\n }\n\n return !this.editing.creation && this.findHolder(node)?.id === this.adapter.idProvider(this.editing.node)\n }\n\n protected _isCreating(node: INode<T>): boolean {\n if (node == null) {\n throw new ReferenceError('Argument \"node\" is required.')\n }\n\n if (!this.editing?.node) {\n return false\n }\n\n return !!this.editing.creation && this.findHolder(node)?.id === this.adapter.idProvider(this.editing.node)\n }\n\n protected _trackById(_: number, e: ITreeNodeHolder<T>) {\n return e.id\n }\n //#endregion\n\n //#region EVENTS\n\n @HostListener('document:keyup')\n keyup() {\n this.isShiftKeyPressed = false\n }\n\n @HostListener('document:keydown', ['$event'])\n keydown($event: KeyboardEvent) {\n this.isShiftKeyPressed = $event.shiftKey\n if (this.isTreeContainsEvent($event)) {\n this.onKeyDown($event)\n }\n }\n\n @HostListener('document:click', ['$event'])\n mousedown($event: MouseEvent) {\n this.changeDetectorRef.detach()\n if (this.isTreeContainsEvent($event)) {\n this.changeDetectorRef.reattach()\n this.onMouseDown($event)\n }\n }\n\n @HostListener('document:contextmenu', ['$event'])\n contextmenu($event: MouseEvent) {\n this.changeDetectorRef.detach()\n if (this.isTreeContainsEvent($event)) {\n this.changeDetectorRef.reattach()\n this.onContextMenu($event)\n }\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (!this.activeNode && !this.isEmpty && !this.selectedNodes.size) {\n this.focus(this.controler.dataNodes[0])\n }\n\n const element = this.activeNode ? this.domNode(this.activeNode) : undefined\n\n if (element && this.activeNode) {\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n this.navigate(element, 'up')\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n this.navigate(element, 'down')\n break\n case 'ArrowLeft':\n if (!this.isShiftKeyPressed) {\n event.preventDefault()\n event.stopPropagation()\n this.collapse(this.activeNode, true)\n }\n break\n case 'ArrowRight':\n if (!this.isShiftKeyPressed) {\n event.preventDefault()\n event.stopPropagation()\n this.expand(this.activeNode, true)\n }\n break\n default:\n this.triggerKeyboardEvent(event)\n this.triggerFilterEvent(event)\n break\n }\n } else {\n this.triggerFilterEvent(event)\n }\n\n if (event.key === 'Backspace') {\n // prevent browser to navigate back if Backspace is pressed\n event.preventDefault()\n }\n }\n\n private onMouseDown(event: MouseEvent): void {\n const node = this.findHolderFromEvent(event)\n if (!node) {\n return\n }\n\n if (this.isShiftKeyPressed && this.activeNode) {\n const domStart = this.domNode(this.activeNode)\n if (!domStart) {\n this.select(node)\n return\n }\n\n const domEnd = this.domNode(node)\n if (!domEnd) {\n return\n }\n\n // select all nodes between the focused and the target node.\n\n this.unselectAll(false)\n\n let cursor = domStart\n const y2 = domEnd.getClientRects().item(0)!.top\n const y1 = domStart.getClientRects().item(0)!.top\n if (y1 < y2) {\n // traverse down\n do {\n this.select(cursor, false)\n cursor = cursor.nextElementSibling as HTMLElement\n } while (cursor && !cursor.isEqualNode(domEnd))\n } else if (y1 > y2) {\n // traverse up\n do {\n this.select(cursor, false)\n cursor = cursor.previousElementSibling as HTMLElement\n } while (cursor && !cursor.isEqualNode(domEnd))\n }\n\n this.select(domEnd, false)\n this.focus(node, true)\n } else {\n this.unselectAll(false)\n this.toggle(node, false)\n this.focus(node, true)\n\n const { actions } = this.adapter\n if (actions?.mouse?.click) {\n actions.mouse.click({\n node: node.data,\n event: event,\n })\n }\n }\n }\n\n private onContextMenu(e: MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n\n const node = this.findHolderFromEvent(e)\n if (node) {\n if (!this.isSelected(node)) {\n this.unselectAll(false)\n }\n this.focus(node, true)\n }\n\n const { actions } = this.adapter\n if (actions?.mouse?.rightClick) {\n actions.mouse.rightClick({\n node: node?.data,\n event: e,\n })\n }\n }\n\n private isTreeContainsEvent(event: Event): boolean {\n return this.elementRef.nativeElement.contains(event.target as any)\n }\n\n private triggerFilterEvent(e: KeyboardEvent) {\n if (e.defaultPrevented || !this.adapter.enableKeyboardFiltering) {\n return\n }\n\n // prevent browser to navigate back if Backspace is pressed\n e.preventDefault()\n e.stopPropagation()\n\n const { term } = this.filter\n switch (e.key) {\n case 'Backspace':\n if (term) {\n this.search({ term: term.slice(0, -1) })\n }\n break\n case ' ':\n case 'Tab':\n break\n default:\n if (e.key.length === 1) {\n this.search({ term: term + e.key })\n }\n break\n }\n }\n\n private triggerKeyboardEvent(event: KeyboardEvent): void {\n if (!this.activeNode) {\n return\n }\n\n const { actions } = this.adapter\n if (actions) {\n const { keys } = actions\n if (keys) {\n const action = keys[event.key]\n if (action) {\n action({\n event: event,\n node: this.activeNode.data,\n })\n }\n }\n }\n }\n\n //#endregion\n\n //#region PRIVATE\n private render(): void {\n const nodes: ITreeNodeHolder<T>[] = []\n const dataNodes = this.controler.dataNodes || []\n const expandedNodes = new Set(this.controler.expansionModel.selected.map((node) => node.id))\n\n this.isEmpty = true\n dataNodes.forEach((node) => {\n this.isEmpty = false\n if (this.hiddenNodes.has(node.id)) {\n return\n }\n\n node.focused = this.isFocused(node)\n node.expanded = this.isExpanded(node)\n node.renaming = this._isRenaming(node)\n node.creating = this._isCreating(node)\n node.selected = this.isSelected(node)\n\n // root nodes are always visible\n if (node.level === 0) {\n nodes.push(node)\n return\n }\n\n let parent = this.findParent(node)\n while (parent != null) {\n // hide a node if any of its ancestors is not expanded\n if (!expandedNodes.has(parent.id)) {\n return\n }\n\n if (parent.level === 0) {\n break\n }\n\n parent = this.findParent(parent)\n }\n nodes.push(node)\n })\n\n this.visibleNodes.next(nodes)\n\n this.changeDetectorRef.detectChanges()\n }\n\n private buildIndexes(): void {\n this.nodesIndex.clear()\n this.parentsIndex.clear()\n this.dataSource.data = this.nodes\n this.controler.dataNodes?.forEach((node) => {\n this.nodesIndex.set(node.id, node)\n })\n }\n\n private buildSearchPattern(): RegExp | undefined {\n let pattern: RegExp | undefined\n try {\n if (this.filter.term) {\n const escape = (text: string) => {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n }\n pattern = new RegExp(`(${escape(this.filter.term)})`, 'g')\n }\n } catch (error) {\n console.error(error)\n }\n return pattern\n }\n\n /**\n * Gets the dom element associated to the given node.\n * @param e A node.\n */\n private domNode(e: INode<T>): HTMLElement | null {\n const node = this.findHolder(e)\n if (!node) {\n throw new Error(e + ' is not a registered node')\n }\n return document.querySelector(`[${this.DATA_TREE_NODE_ID}=\"${node.id}\"]`)\n }\n\n /**\n * Adds the given node to the selected nodes.\n * @param node The node to select.\n */\n private select(node: INode<T>, detectChanges: boolean = true): void {\n const holder = this.findHolder(node)\n if (!holder) {\n return\n }\n\n this.selectedNodes.set(holder.id, holder)\n\n if (detectChanges) {\n this.changeDetectorRef.detectChanges()\n }\n }\n\n /**\n * Removes the given node to the selected nodes.\n * @param node The node to unselect.\n */\n private unselect(node: INode<T>, detectChanges: boolean = true): void {\n const holder = this.findHolder(node)\n if (!holder) {\n return\n }\n\n this.selectedNodes.delete(holder.id)\n\n if (holder.id === this.activeNode?.id) {\n this.activeNode = undefined\n }\n\n if (detectChanges) {\n this.changeDetectorRef.detectChanges()\n }\n }\n\n /**\n * Clears the selected nodes.\n */\n private unselectAll(detectChanges: boolean = true): void {\n this.activeNode = undefined\n this.selectedNodes.clear()\n\n if (detectChanges) {\n this.changeDetectorRef.detectChanges()\n }\n }\n\n /**\n * Expands the ancestors of the given node.\n * @param node A node reference.\n */\n private expandAncestors(node: ITreeNodeHolder<T>) {\n this.iterateAncestors(node, (e) => {\n if (e.expandable && !this.controler.isExpanded(e)) {\n this.controler.expand(e)\n if (this.adapter.onDidExpand) {\n this.adapter.onDidExpand(e.data)\n }\n }\n })\n }\n\n /**\n * Call the given `action` for the ancestors of the given node.\n * @param node A node reference.\n * @param action A function to call for each ancestor.\n */\n private iterateAncestors(node: ITreeNodeHolder<T>, action: (e: ITreeNodeHolder<T>) => void) {\n const recursive = (e: ITreeNodeHolder<T>) => {\n action(e)\n const p = this.findParent(e)\n if (p && p.level >= 0) {\n recursive(p)\n }\n }\n\n const parent = this.findParent(node)\n if (parent) {\n recursive(parent)\n }\n }\n\n /**\n * Moves the scrollbar to the given node.\n * @param node The node to show.\n */\n private scrollInto(node: INode<T>) {\n const holder = this.findHolder(node)\n if (holder) {\n const index = this.visibleNodes.value.indexOf(holder)\n if (index == -1) {\n return\n }\n this.domNode(node)?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }\n }\n\n /**\n * Focus the node before of after `currEl` depending on the given `direction`.\n * @param currEl Current element\n * @param direction Navigation direction.\n */\n private navigate(currEl: Element, direction: 'up' | 'down'): void {\n this.unselectAll()\n\n const currNode = this.findHolderFromElement(currEl)\n if (!currNode) {\n return\n }\n\n const prevEl = currEl.previousElementSibling\n const nextEl = currEl.nextElementSibling\n const targEl = direction === 'up' ? prevEl : nextEl\n if (!targEl) {\n return\n }\n\n const targNode = this.findHolderFromElement(targEl)\n if (!targNode) {\n this.focus(currNode)\n return\n }\n\n const prevNode: ITreeNodeHolder<T> | undefined = prevEl ? this.findHolderFromElement(prevEl) : undefined\n\n if (prevNode && this.isSelected(prevNode) && targEl.isEqualNode(prevEl)) {\n this.unselect(currNode)\n }\n\n const nextNode: ITreeNodeHolder<T> | undefined = nextEl ? this.findHolderFromElement(nextEl) : undefined\n\n if (nextNode && this.isSelected(nextNode) && targEl.isEqualNode(nextEl)) {\n this.unselect(currNode)\n }\n\n this.focus(targNode)\n }\n\n private findParent(node: INode<T>): ITreeNodeHolder<T> | undefined {\n const holder = this.findHolder(node)\n if (!holder) {\n return\n }\n const parentId = this.parentsIndex.get(holder.id)\n if (parentId) {\n return this.nodesIndex.get(parentId)\n }\n return undefined\n }\n\n private findHolderFromId(id: string): ITreeNodeHolder<T> | undefined {\n const { dataNodes } = this.controler\n if (!dataNodes) {\n return undefined\n }\n return dataNodes.find((n) => n.id === id)\n }\n\n private findHolderFromData(data: T): ITreeNodeHolder<T> | undefined {\n const { dataNodes } = this.controler\n if (!dataNodes) {\n return undefined\n }\n\n return this.nodesIndex.get(this.adapter.idProvider(data))\n }\n\n private findHolderFromEvent(event: Event): ITreeNodeHolder<T> | undefined {\n const { dataNodes } = this.controler\n if (!dataNodes) {\n return undefined\n }\n\n const dataId = this.DATA_TREE_NODE_ID\n const fn = (target?: HTMLElement | null): ITreeNodeHolder<T> | undefined => {\n if (!target) {\n return undefined\n }\n\n const targetId = target.getAttribute(dataId)\n return targetId ? this.nodesIndex.get(targetId) : fn(target.parentElement)\n }\n\n return fn(event.target as any)\n }\n\n private findHolderFromElement(element: Element): ITreeNodeHolder<T> | undefined {\n const { dataNodes } = this.controler\n if (!dataNodes) {\n return undefined\n }\n\n const id = element.getAttribute(this.DATA_TREE_NODE_ID)\n if (!id) {\n return undefined\n }\n\n return this.nodesIndex.get(id)\n }\n\n private findHolder(node: INode<T>): ITreeNodeHolder<T> | undefined {\n if (!node) {\n return undefined\n }\n\n if (!this.controler.dataNodes) {\n return undefined\n }\n\n if (typeof node === 'string') {\n return this.findHolderFromId(node)\n }\n\n if (node instanceof Element) {\n return this.findHolderFromElement(node)\n }\n\n // instanceof ITreeNodeHolder<T>\n if ('data' in (node as unknown as any)) {\n return node as ITreeNodeHolder<T>\n }\n\n // instance of T\n return this.findHolderFromData(node as T)\n }\n\n private children(node: T): T[] {\n const children = this.adapter.childrenProvider(node) || []\n const parentId = this.adapter.idProvider(node)\n children.forEach((child) => {\n this.parentsIndex.set(this.adapter.idProvider(child), parentId)\n })\n return children\n }\n\n private transformer(node: T, level: number): ITreeNodeHolder<T> {\n const expandable = this.adapter.isExpandable(node)\n return {\n id: this.adapter.idProvider(node),\n data: node,\n name: this.adapter.nameProvider(node),\n level: level,\n padding: level * 12 + 'px',\n tooltip: this.adapter.tooltipProvider?.(node),\n expandable,\n }\n }\n //#endregion\n}\n","<ng-container *ngIf=\"filter.term\">\n <div class=\"tree-filter\" title=\"Filter\">\n <span class=\"tree-filter__label\">{{ filter.term }}</span>\n <div class=\"tree-filter__commands\">\n <span class=\"command-clear\" role=\"button\" title=\"Clear\" (click)=\"_clearFilter()\">×</span>\n </div>\n </div>\n</ng-container>\n\n<div\n tabindex=\"0\"\n class=\"tree-component\"\n [class.editing]=\"editing.node != null\"\n [style.height]=\"treeHeight\">\n <ng-container *ngFor=\"let node of visibleNodes|async; trackBy: _trackById;\">\n <!-- RENAMING -->\n <ng-container *ngIf=\"node.renaming; else: nodeTemplate\">\n <div\n class=\"tree-node opaque focused selected tree-node--level-{{ node.level + 1 }}\"\n [attr.data-tree-node-id]=\"node.id\"\n [style.padding-left]=\"node.padding\"\n [style.height.px]=\"adapter.itemHeight\">\n <div class=\"tree-node__content\" [style.height.px]=\"adapter.itemHeight\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\" />\n </div>\n </div>\n </ng-container>\n\n <!-- NODE -->\n <ng-template #nodeTemplate>\n <div\n class=\"tree-node tree-node--level-{{ node.level }}\"\n [attr.data-tree-node-id]=\"node.id\"\n [style.padding-left]=\"node.padding\"\n [style.height.px]=\"adapter.itemHeight\"\n [ngClass]=\"{\n focused: node.focused,\n selected: node.selected,\n expanded: node.expanded\n }\">\n <div class=\"tree-node__content\" [style.height.px]=\"adapter.itemHeight\">\n <ng-container *ngTemplateOutlet=\"nodeDirective.templateRef; context: { $implicit: node }\" />\n </div>\n </div>\n </ng-template>\n\n <!-- CREATING -->\n <ng-container *ngIf=\"node.creating\">\n <div\n class=\"tree-node opaque focused selected tree-node--level-{{ node.level + 1 }}\"\n [style.padding-left]=\"node.padding\"\n [style.height.px]=\"adapter.itemHeight\">\n <div class=\"tree-node__content\" [style.height.px]=\"adapter.itemHeight\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\" />\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #inputTemplate>\n <span class=\"tree-input\">\n <input\n autofocus\n type=\"text\"\n placeholder=\"Press Enter to create ESC to cancel...\"\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\n [(ngModel)]=\"editing.text\"\n (keydown)=\"_onEdit($event)\"\n (blur)=\"_onEdit($event)\" />\n </span>\n</ng-template>\n","import { NgModule } from '@angular/core'\nimport { FormsModule } from '@angular/forms'\nimport { CommonModule } from '@angular/common'\n\nimport { ScrollingModule } from '@angular/cdk/scrolling'\n\nimport { TreeComponent } from './tree.component'\nimport { TreeNodeDirective } from './tree-node.directive'\n\nimport { AutofocusDirective } from './autofocus.directive'\n\n@NgModule({\n declarations: [TreeComponent, TreeNodeDirective, AutofocusDirective],\n imports: [CommonModule, FormsModule, ScrollingModule],\n exports: [TreeComponent, TreeNodeDirective],\n})\nexport class NgeUiTreeModule {}\n","import { Injectable } from '@angular/core'\nimport { CURRENT_VISIBLE_TREES } from './internal'\nimport { ITree } from './tree.model'\n\n@Injectable({ providedIn: 'root' })\nexport class TreeService {\n /**\n * Gets the tree identified by `id` if the tree is visible.\n * @param id Identifier of a tree.\n */\n get<T>(id: string): ITree<T> | undefined {\n return CURRENT_VISIBLE_TREES.get(id) as ITree<T>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3.AutofocusDirective"],"mappings":"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"}