{"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()\">&times;</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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"}