{"version":3,"file":"laserfiche-lf-ui-components-lf-repository-browser.mjs","sources":["../../../projects/ui-components/lf-repository-browser/lf-repository-browser.component.ts","../../../projects/ui-components/lf-repository-browser/lf-repository-browser.component.html","../../../projects/ui-components/lf-repository-browser/ILfTreeNodeService.ts","../../../projects/ui-components/lf-repository-browser/lf-repository-browser.module.ts","../../../projects/ui-components/lf-repository-browser/lf-repository-browser-public-api.ts","../../../projects/ui-components/lf-repository-browser/laserfiche-lf-ui-components-lf-repository-browser.ts"],"sourcesContent":["// Copyright (c) Laserfiche.\n// Licensed under the MIT License. See LICENSE in the project root for license information.\n\nimport {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  NgZone,\n  OnDestroy,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ILfSelectable, ItemWithId } from '@laserfiche/lf-ui-components/shared';\nimport { AppLocalizationService } from '@laserfiche/lf-ui-components/internal-shared';\nimport { LfTreeNodeService, LfTreeNode, LfTreeNodePage } from './ILfTreeNodeService';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport {\n  ColumnDef,\n  ColumnOrderBy,\n  LfSelectionListComponent,\n  SelectedItemEvent,\n} from '@laserfiche/lf-ui-components/lf-selection-list';\n\n/** @internal */\nconst NAME_COL_AUTO: ColumnDef = {\n  id: 'name',\n  displayName: 'Name',\n  defaultWidth: 'auto',\n  minWidthPx: 100,\n  resizable: true,\n  sortable: true,\n};\n/** @internal */\nconst NAME_COL_50CH: ColumnDef = {\n  id: 'name',\n  displayName: 'Name',\n  defaultWidth: '50ch',\n  minWidthPx: 100,\n  resizable: true,\n  sortable: true,\n};\n\n@Component({\n  selector: 'lf-repository-browser-component',\n  templateUrl: './lf-repository-browser.component.html',\n  styleUrls: ['./lf-repository-browser.component.css'],\n})\nexport class LfRepositoryBrowserComponent implements OnDestroy, AfterViewInit {\n  /**\n   * read-only property to get current breadcrumbs\n   */\n  @Input() get breadcrumbs(): LfTreeNode[] {\n    return this._breadcrumbs;\n  }\n\n  /**\n   * read-only property to retrieve currently opened LfTreeNode\n   */\n  @Input() get currentFolder(): LfTreeNode | undefined {\n    return this._currentFolder;\n  }\n\n  /**\n   * Property to set height in pixels of each item in lf-repository-browser\n   */\n  @Input() set item_size(value: number | string) {\n    if (typeof value === 'string') {\n      value = parseInt(value, 10);\n    }\n    this._itemSize = value;\n  }\n  get item_size(): number {\n    return this._itemSize;\n  }\n\n  /**\n   * Property to set number of items rendered, should be set to more than the number of visible nodes\n   */\n  @Input() set page_size(value: number | string) {\n    if (typeof value === 'string') {\n      value = parseInt(value, 10);\n    }\n    this._pageSize = value;\n  }\n  get page_size(): number {\n    return this._pageSize;\n  }\n\n  /**\n   * Property to get and set the current column to order by\n   */\n  @Input()\n  get column_order_by(): ColumnOrderBy | undefined {\n    return this.entryList?.columnOrderBy;\n  }\n  set column_order_by(orderBy: ColumnOrderBy | undefined) {\n    if (this.entryList) {\n      this.entryList.columnOrderBy = orderBy;\n    }\n  }\n\n  /**\n   * Property to set whether or not to always show header. By default will only show header if there is more than one column\n   */\n  @Input()\n  set always_show_header(showHeader: boolean | undefined | string) {\n    if (typeof showHeader === 'string') {\n      if (showHeader.toLowerCase() === 'true') {\n        showHeader = true;\n      } else {\n        showHeader = false;\n      }\n    }\n    if (this.entryList) {\n      this.entryList.alwaysShowHeader = showHeader;\n    }\n  }\n\n  /**\n   * Function to set additional columns to display. You can use this to set a specific name column as well, or accept the default.\n   */\n  @Input()\n  setColumnsToDisplay: (cols: ColumnDef[]) => void = (cols: ColumnDef[]) => {\n    if (this.entryList) {\n      const nameColumnDef = cols.find((col) => col.id === 'name');\n      if (!nameColumnDef) {\n        let nameCol: ColumnDef;\n        if (!cols || cols.length === 0) {\n          nameCol = NAME_COL_AUTO;\n        } else {\n          nameCol = NAME_COL_50CH;\n        }\n        cols.unshift(nameCol);\n      }\n      this.entryList.columns = cols;\n    }\n    this.ref.detectChanges();\n  };\n\n  /**\n   * Function to initialize the lf-repository-browser component\n   * @param treeNodeService LfRepositoryService service\n   * @param initialOpenedNode The LfTreeNode that you would like to open, or the identifier of the LfTreeNode. The identifier should match the implementation of service.getTreeNodeByIdentifierAsync(..) (i.e. id, path, etc.)\n   */\n  @Input() initAsync = async (\n    treeNodeService: LfTreeNodeService,\n    initialOpenedNode?: LfTreeNode | string\n  ): Promise<void> => {\n    await this.zone.run(async () => {\n      try {\n        this.hasError = false;\n        this.isLoading = true;\n        this.treeNodeService = treeNodeService;\n        if (typeof initialOpenedNode === 'string') {\n          if (!initialOpenedNode || initialOpenedNode.trim().length === 0) {\n            initialOpenedNode = undefined;\n          } else {\n            if (this.treeNodeService.getTreeNodeByIdentifierAsync) {\n              try {\n                initialOpenedNode = await this.treeNodeService.getTreeNodeByIdentifierAsync(initialOpenedNode);\n              } catch {\n                console.warn('Unable to determine LfTreeNode by id. Will initialize to root.');\n                initialOpenedNode = undefined;\n              }\n            } else {\n              console.warn(\n                'initialOpenedNode is specified by an id, but getTreeNodeByIdentifierAsync is not implemented. Will initialize to root.'\n              );\n              initialOpenedNode = undefined;\n            }\n          }\n        }\n\n        await this.initializeAsync(initialOpenedNode);\n      } catch (error) {\n        console.error(error);\n        this.hasError = true;\n      } finally {\n        this.isLoading = false;\n        this.ref.detectChanges();\n      }\n    });\n  };\n\n  /**\n   * This function will be called for each LfTreeNode to determine if it is selectable, when it is rendered\n   */\n  @Input() isSelectable?: (treeNode: LfTreeNode) => Promise<boolean>;\n\n  /**\n   * Property to get and set whether multiple select is enabled on the component\n   */\n  @Input() set multiple(value: boolean | string) {\n    if (typeof value === 'string') {\n      if (value.toLowerCase() === 'true') {\n        value = true;\n      } else {\n        value = false;\n      }\n    }\n    this._multipleSelectEnabled = value;\n  }\n  get multiple(): boolean {\n    return this._multipleSelectEnabled;\n  }\n\n  /**\n   * Function to set selectedNodes. If current data does not include all the requested node, it will call getFolderChildren until there are no more, or maxFetchIterations is reached.\n   * @param nodesToSelect array of LfTreeNodes to select by id\n   * @param maxFetchIterations Max number of times to get data if the current data doesn't contain all of the requested nodes. Default is 5.\n   * @returns void\n   */\n  @Input()\n  setSelectedNodesAsync: (nodesToSelect: LfTreeNode[], maxFetchIterations?: number) => Promise<void> = async (\n    nodesToSelect: LfTreeNode[],\n    maxFetchIterations: number = 5\n  ) => {\n    const selectableValues = await this.mapTreeNodesToLfSelectableAsync(nodesToSelect);\n    if (!this.entryList && this.isLoading) {\n      setTimeout(() => {\n        this.setSelectedNodesAsync(nodesToSelect, maxFetchIterations);\n      });\n      return;\n    }\n    if (this.entryList) {\n      this.entryList.clearSelectedValues();\n      const selectedNodes: ILfSelectable[] = await this.entryList.setSelectedNodesAsync(\n        selectableValues,\n        this.checkForMoreDataCallback.bind(this),\n        maxFetchIterations\n      );\n      const selectedItems = this.convertSelectedItemsToTreeNode(selectedNodes);\n      if (\n        (selectedItems?.length === 0 && this.selectedItems?.length === 0) ||\n        JSON.stringify(selectedItems) === JSON.stringify(this.selectedItems)\n      ) {\n        // do nothing\n      } else {\n        this.selectedItems = selectedItems;\n        this.entrySelected.emit(this.selectedItems);\n      }\n    }\n  };\n\n  /**\n   * Function to refresh data in folder (get first page)\n   * @param clearSelectedValues Optional parameter to clear all the currently selected values. Default is true.\n   */\n  @Input()\n  refreshAsync: (clearSelectedValues?: boolean) => Promise<void> = async (clearSelectedValues: boolean = true) => {\n    try {\n      this.hasError = false;\n      this.isLoading = true;\n      if (!this._currentFolder) {\n        this._currentFolder = await this.treeNodeService.getRootTreeNodeAsync();\n      }\n      if (!this._currentFolder) {\n        throw new Error('No root was found, repository browser was unable to refresh.');\n      }\n      this.nextPage = undefined;\n      this.lastCalledPage = undefined;\n      this.maximumChildrenReceived = false;\n      this.currentFolderChildren = [];\n      this.ref.detectChanges();\n      await this.updateAllPossibleEntriesAsync(this._currentFolder, clearSelectedValues);\n      await this.initializeBreadcrumbOptionsAsync(this._currentFolder);\n    } catch {\n      this.hasError = true;\n    } finally {\n      this.isLoading = false;\n      this.ref.detectChanges();\n    }\n  };\n\n  /**\n   * Function to open selected node(s). If there is just one container node it will open the container in the UI and emit the entryDblClicked event,\n   * if there is more than one node or it is not a container, it will just emit the entryDblClicked event\n   */\n  @Input()\n  openSelectedNodesAsync: () => Promise<void> = async () => {\n    if (this.selectedItems && this.selectedItems.length > 0) {\n      await this.openSelectedItemsAsync();\n    } else {\n      console.debug('No selected nodes to open');\n    }\n  };\n\n  /**\n   * Function to open focused node. If there is just one container node it will open the container in the UI and emit the entryDblClicked event\n   */\n  @Input()\n  openFocusedNodeAsync: () => Promise<void> = async () => {\n    if (this.focusedEntry) {\n      const nodeToOpen = this.focusedEntry as LfTreeNode;\n      await this.openChildFolderAsync(nodeToOpen);\n      this.entryDblClicked.emit([nodeToOpen]);\n    } else {\n      console.debug('No focused node to open');\n    }\n  };\n\n  /**\n   * Focuses the first item in the repository browser list\n   * TODO: Add an optional parameter to allow for focusing a specific node\n   */\n  @Input() focus = () => {\n    this._focus();\n  };\n\n  /** Event triggered on double click (open) of a node. This can be accompanied by the UI opening a single container */\n  @Output() entryDblClicked = new EventEmitter<LfTreeNode[]>();\n  /** Event triggered on selection (click/space bar) of a node.*/\n  @Output() entrySelected = new EventEmitter<LfTreeNode[] | undefined>();\n  /** Event triggered on focus of a node.*/\n  @Output() entryFocused = new EventEmitter<LfTreeNode | undefined>();\n\n  /** @internal */\n  @ViewChild(LfSelectionListComponent) entryList: LfSelectionListComponent | undefined;\n  /** @internal */\n  private selectedItems: LfTreeNode[] | undefined;\n  /** @internal */\n  private focusedEntry: ItemWithId | undefined;\n  /** @internal */\n  private _multipleSelectEnabled: boolean = false;\n  /** @internal */\n  private _pageSize: number = 50;\n  /** @internal */\n  private _itemSize: number = 42;\n  /** @internal */\n  repoBrowserUniqueId: string = '';\n\n  /** @internal */\n  currentFolderChildren: ILfSelectable[] = [];\n  /** @internal */\n  hasError: boolean = false;\n  /** @internal */\n  isLoading: boolean = true;\n  /**\n   * @internal\n   * TODO: Add a message for when the repository browser is not initialized\n   * When that happens default isLoading to false\n   */\n  initialized: boolean = false;\n  /** @internal */\n  nextPage: string | undefined;\n  /** @internal */\n  lastCalledPage: string | undefined;\n  /** @internal */\n  treeNodeService!: LfTreeNodeService;\n\n  /** @internal */\n  readonly AN_ERROR_OCCURED = this.localizationService.getStringLaserficheObservable('AN_ERROR_OCCURED');\n\n  /** @internal */\n  get shouldShowErrorMessage(): boolean {\n    return this.hasError;\n  }\n  /** @internal */\n  readonly THIS_FOLDER_IS_EMPTY = this.localizationService.getStringLaserficheObservable('THIS_FOLDER_IS_EMPTY');\n  /** @internal */\n  get shouldShowEmptyMessage(): boolean {\n    return this.currentFolderChildren.length === 0 && !this.hasError;\n  }\n\n  /** @internal */\n  protected _currentFolder?: LfTreeNode;\n  /** @internal */\n  protected maximumChildrenReceived: boolean = false;\n\n  /** @internal */\n  private _breadcrumbs: LfTreeNode[] = [];\n  /** @internal */\n  private scrolledIndexChanged = new Subject<void>();\n  /**\n   * @internal\n   * Used to track if data is currently being pulled\n   * */\n  private lastDataCall?: Promise<ILfSelectable[]>;\n\n  /** @internal */\n  constructor(\n    /** @internal */\n    public ref: ChangeDetectorRef,\n    /** @internal */\n    public popupDialog: MatDialog,\n    /** @internal */\n    public zone: NgZone,\n    /** @internal */\n    private localizationService: AppLocalizationService,\n    /** @internal */\n    private el: ElementRef\n  ) {\n    this.scrolledIndexChanged.pipe(debounceTime(200)).subscribe(async () => {\n      if (!this._currentFolder) {\n        return;\n      }\n      if (!this.maximumChildrenReceived) {\n        if (this.nextPage && this.nextPage == this.lastCalledPage) {\n          // do nothing. nextPage already attempted\n          return;\n        }\n        await this.makeDataCall(this._currentFolder);\n        this.ref.detectChanges();\n        this.resetSelectedItemsAsync();\n      }\n    });\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    const path = window.location.pathname;\n    this.repoBrowserUniqueId = `lf-repository-browser_${path}_${this.el.nativeElement.id}`;\n    this.ref.detectChanges();\n  }\n\n  /**\n   * @internal\n   * Handles when a bread crumb is clicked\n   * @param event\n   * @returns\n   */\n  async onBreadcrumbClicked(event: { breadcrumbs: LfTreeNode[]; selected: LfTreeNode }) {\n    if (!event.breadcrumbs || !event.selected) {\n      console.error('onBreadcrumbClicked event is required to have a breadcrumbs as well as a selected entry');\n      return;\n    }\n    this._breadcrumbs = event.breadcrumbs;\n    this._currentFolder = event.selected;\n    await this.updateAllPossibleEntriesAsync(this._currentFolder);\n    this.entryDblClicked.emit([this._currentFolder]);\n    setTimeout(() => this.entryList?.focus());\n  }\n\n  /**\n   * @internal\n   * @param entry\n   * @returns list of strings that represent img src's\n   */\n  getIcons(entry: any): string[] {\n    return typeof entry.icon === 'string' ? [entry.icon] : entry.icon;\n  }\n\n  /**\n   * @internal\n   * Handles when a entry in the repository browser is double clicked\n   * @param entry\n   * @returns\n   */\n  async onDblClickAsync(treeNode: LfTreeNode | undefined) {\n    await this.openChildFolderAsync(treeNode as LfTreeNode);\n    this.entryDblClicked.emit([treeNode as LfTreeNode]);\n  }\n\n  /**\n   * @internal\n   * Handles the scrolling event from the lf-selection-list\n   */\n  onScroll() {\n    this.scrolledIndexChanged.next();\n  }\n\n  /**\n   * @internal\n   * Handles the SelectedItemEvent from the lf-selection-list\n   * @param event\n   */\n  async onItemSelected(event: SelectedItemEvent) {\n    const lastSelectedItem =\n      this.selectedItems && this.selectedItems.length > 0\n        ? this.selectedItems[this.selectedItems.length - 1]\n        : undefined;\n    if (\n      (lastSelectedItem &&\n        lastSelectedItem === event.selected.value &&\n        this.selectedItems?.length === event.selectedItems?.length) ||\n      (event.selectedItems?.length === 0 && this.selectedItems?.length === 0)\n    ) {\n      // do nothing\n      return;\n    }\n    this.selectedItems = event.selectedItems?.map((item: ILfSelectable) => item.value as LfTreeNode);\n    this.entrySelected.emit(this.selectedItems);\n  }\n\n  /** @internal */\n  onEntryFocused(item: ItemWithId | undefined) {\n    this.focusedEntry = item;\n    this.entryFocused.emit(item ? (item as LfTreeNode) : undefined);\n  }\n\n  /**\n   * @internal\n   * Opens the entry passed as the parameter\n   * Example: This will get called when an entry is double clicked\n   * @param entry\n   */\n  async openChildFolderAsync(entry: LfTreeNode) {\n    if (!entry?.isContainer) {\n      return;\n    }\n    this._currentFolder = entry;\n    await this.updateAllPossibleEntriesAsync(entry);\n    this._breadcrumbs = [entry].concat(this.breadcrumbs);\n    this._focus();\n  }\n\n  /**\n   * @internal\n   */\n  async openSelectedItemsAsync() {\n    const selectedNodes = this.selectedItems;\n    if (selectedNodes?.length === 1 && selectedNodes[0].isContainer) {\n      await this.openChildFolderAsync(selectedNodes[0]);\n    }\n    this.entryDblClicked.emit(selectedNodes);\n  }\n\n  /**\n   * @internal\n   * Callback that is passed to the lf-selection-list so it can continue to get more data if needed to select\n   * initial values\n   * @returns\n   */\n  private async checkForMoreDataCallback(): Promise<ILfSelectable[] | undefined> {\n    if (!this._currentFolder) {\n      return;\n    }\n    if (!this.maximumChildrenReceived) {\n      const data = await this.makeDataCall(this._currentFolder);\n      return data;\n    }\n    return;\n  }\n\n  /**\n   * @internal\n   * Maps ILfSelectable list to a TreeNode list\n   * @param selected\n   * @returns\n   */\n  private convertSelectedItemsToTreeNode(selected: ILfSelectable[]): LfTreeNode[] | undefined {\n    return selected.map((value) => value.value) as LfTreeNode[];\n  }\n\n  /**\n   * @internal\n   * Attempts to focus the entryList component\n   * @param node Not used right now but is part of the TODO for focus fuction\n   * @param tries\n   */\n  private _focus(node: LfTreeNode | undefined = undefined, tries: number = 0): void {\n    if (tries >= 10) {\n      return;\n    }\n    if (!this.entryList) {\n      setTimeout(() => this._focus(node, tries + 1));\n      return;\n    }\n    if (this.shouldShowEmptyMessage || this.shouldShowErrorMessage) {\n      setTimeout(() => {\n        (document.querySelector(\".lf-repo-entry-container\") as HTMLElement)?.focus();\n      });\n    } else {\n      this.entryList?.focus();\n    }\n  }\n\n  /**\n   * @internal\n   * Attempts to initialize the repository browser\n   * Will initialize with the root node if not currentIdOrEntry is provided\n   * Otherwise will use the provided entry to build the breadcrumbs and pull the corresponding data\n   * @param currentIdOrEntry\n   * @returns\n   */\n  private async initializeAsync(currentEntry?: LfTreeNode): Promise<void> {\n    if (!this.treeNodeService) {\n      this.hasError = true;\n      throw new Error('Repository Browser cannot be initialized without a data service.');\n    }\n    if (!currentEntry) {\n      currentEntry = await this.treeNodeService.getRootTreeNodeAsync();\n    }\n    // If the entry passed in is not a container we will get the parent of this by default.\n    if (currentEntry && !currentEntry.isContainer) {\n      currentEntry = await this.treeNodeService.getParentTreeNodeAsync(currentEntry);\n    }\n    if (!currentEntry) {\n      throw new Error('currentEntry is undefined');\n    }\n    this.initialized = true;\n    await this.setNodeAsParentAsync(currentEntry);\n    this.setColumnsToDisplay(this.entryList?.columns ?? []);\n  }\n\n  /**\n   * @internal\n   * Uses the entry passed in to build the breadcrumbs\n   * @param selectedEntry\n   * @returns\n   */\n  private async initializeBreadcrumbOptionsAsync(selectedEntry: LfTreeNode) {\n    this._breadcrumbs = [selectedEntry];\n    let currentNode: LfTreeNode | undefined = selectedEntry;\n    while (currentNode) {\n      const nextParent: LfTreeNode | undefined = await this.treeNodeService.getParentTreeNodeAsync(currentNode);\n      if (nextParent) {\n        this.breadcrumbs.push(nextParent);\n      }\n      currentNode = nextParent;\n    }\n  }\n\n  /**\n   * @internal\n   * Maps TreeNode list to ILfSelectable items for use in the entryList\n   * @param nodes\n   * @returns\n   */\n  private async mapTreeNodesToLfSelectableAsync(nodes: LfTreeNode[]) {\n    const selectablePage: ILfSelectable[] = [];\n    for (const value of nodes) {\n      const selectableValue = {\n        value,\n        isSelectable: this.isSelectable ? await this.isSelectable(value) : true,\n        isSelected: false,\n      };\n      selectablePage.push(selectableValue);\n    }\n    return selectablePage;\n  }\n\n  /**\n   * @internal\n   * Resets the errors, selected values, currentFolderChildren and nextPage\n   */\n  private resetFolderProperties(clearCache: boolean) {\n    this.hasError = false;\n    this.entryList?.clearSelectedValues(clearCache);\n    this.currentFolderChildren = [];\n    this.ref.detectChanges();\n\n    //this._focused_node = undefined;\n    this.nextPage = undefined;\n    this.lastCalledPage = undefined;\n    this.maximumChildrenReceived = false;\n  }\n\n  /**\n   * @internal\n   * Makes the parentEntry parameter into the current parent node\n   * Will setup the breadcrumbs to be the listOfAncestorEntries with the parentEntry as the last one if passed in\n   * @param parentEntry\n   * @param listOfAncestorEntries\n   * @returns\n   */\n  private async setNodeAsParentAsync(parentEntry: LfTreeNode): Promise<void> {\n    if (!parentEntry) {\n      console.error('parentEntry must not be null');\n      return;\n    }\n    if (!parentEntry.isContainer) {\n      console.error('parentEntry must be a container');\n      return;\n    }\n    await this.initializeBreadcrumbOptionsAsync(parentEntry);\n    this._currentFolder = parentEntry;\n    await this.updateAllPossibleEntriesAsync(parentEntry);\n  }\n\n  /**\n   * @internal\n   * Resets the list and pulls new data for the parentEntry\n   * @param parentEntry\n   * @param refresh Not Used currently\n   */\n  private async updateAllPossibleEntriesAsync(parentEntry: LfTreeNode, clearSelected: boolean = true) {\n    // If we are already getting data we want to wait for that to finish before resetting and pulling new data.\n    if (this.lastDataCall) {\n      // If we get an error in the last data call just throw it away.\n      await this.lastDataCall.catch((error) => undefined);\n    }\n    if (parentEntry && parentEntry.id) {\n      try {\n        await this.refreshTreeNodeAsync(parentEntry);\n        const lastSelectedItems = this.selectedItems;\n        this.isLoading = true;\n        this.hasError = false;\n        this.resetFolderProperties(clearSelected);\n        await this.makeDataCall(parentEntry);\n        this.isLoading = false;\n        this.ref.detectChanges();\n        if (!clearSelected) {\n          this.selectedItems = await this.resetSelectedItemsAsync();\n        } else {\n          this.selectedItems = [];\n        }\n        if (\n          (lastSelectedItems?.length === 0 && this.selectedItems?.length === 0) ||\n          JSON.stringify(lastSelectedItems) === JSON.stringify(this.selectedItems)\n        ) {\n          // do nothing\n        } else {\n          this.entrySelected.emit(this.selectedItems);\n        }\n      } catch (error) {\n        console.error(error);\n        this.lastDataCall = undefined;\n        this.hasError = true;\n      } finally {\n        this.isLoading = false;\n        this.ref.detectChanges();\n      }\n    } else {\n      console.error('updateAllPossibleEntriesAsync parentEntry undefined or missing id property');\n      this.hasError = true;\n    }\n  }\n\n  /** @internal */\n  private async refreshTreeNodeAsync(entry: LfTreeNode) {\n    try {\n      if (this.treeNodeService.getTreeNodeByIdentifierAsync) {\n        var refreshedTreeNode = await this.treeNodeService.getTreeNodeByIdentifierAsync(entry.id);\n        if (refreshedTreeNode) {\n          Object.assign(entry, refreshedTreeNode);\n        }\n      }\n    } catch (error) {\n      console.error(`refreshTreeNodeNameAsync failed with error: ${error}`);\n    }\n  }\n\n  /** @internal */\n  private async resetSelectedItemsAsync(): Promise<LfTreeNode[] | undefined> {\n    const resetSelectedNodes: ILfSelectable[] = await this.entryList!.resetCachedNodesAsync();\n    const selectedItems = this.convertSelectedItemsToTreeNode(resetSelectedNodes);\n    return selectedItems;\n  }\n\n  /** @internal */\n  private async makeDataCall(parentEntry: LfTreeNode): Promise<ILfSelectable[] | undefined> {\n    try {\n      this.hasError = false;\n      const selectable: ILfSelectable[] = [];\n      while (!this.maximumChildrenReceived && selectable.length < this.page_size) {\n        this.lastDataCall = this.updateFolderChildrenAsync(parentEntry);\n        const additionalData = await this.lastDataCall;\n        selectable.push(...additionalData);\n        this.lastDataCall = undefined;\n      }\n      this.currentFolderChildren = this.currentFolderChildren.concat(...selectable);\n      return selectable;\n    } catch (error) {\n      this.hasError = true;\n      this.isLoading = false;\n      this.ref.detectChanges();\n      return undefined;\n    }\n  }\n\n  /**\n   * @internal\n   * Does the work to call the treeNodeService and map the returned values to ILfSelectable entries\n   * @param parentEntry\n   * @returns\n   */\n  private async updateFolderChildrenAsync(parentEntry: LfTreeNode): Promise<ILfSelectable[]> {\n    this.lastCalledPage = this.nextPage;\n    const sortState: ColumnOrderBy | undefined = this.column_order_by;\n    const dataPage: LfTreeNodePage = await this.treeNodeService.getFolderChildrenAsync(\n      parentEntry,\n      this.nextPage,\n      sortState\n    );\n    this.nextPage = dataPage.nextPage;\n    const pageTreeNodes: LfTreeNode[] = dataPage.page;\n    const selectablePage: ILfSelectable[] = await this.mapTreeNodesToLfSelectableAsync(pageTreeNodes);\n    if (this.nextPage) {\n      this.maximumChildrenReceived = false;\n    } else {\n      this.maximumChildrenReceived = true;\n    }\n\n    return selectablePage;\n  }\n\n  /** @internal */\n  ngOnDestroy() {\n    this.scrolledIndexChanged.unsubscribe();\n  }\n}\n","<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"lf-repository-browser-header\">\r\n  <lf-breadcrumbs-component [breadcrumbs]=\"breadcrumbs\" (breadcrumbClicked)=\"onBreadcrumbClicked($event)\">\r\n  </lf-breadcrumbs-component>\r\n</div>\r\n<div class=\"lf-repo-entry-container\" [attr.tabindex]=\"isLoading || shouldShowErrorMessage || shouldShowEmptyMessage ? 0 : -1\">\r\n  <lf-loader-component *ngIf=\"isLoading\" class=\"lf-text-body lf-no-user-select\"></lf-loader-component>\r\n  <div id=\"message-display\" *ngIf=\"!isLoading && (shouldShowErrorMessage || shouldShowEmptyMessage)\">\r\n    <div *ngIf=\"shouldShowErrorMessage\" class=\"lf-text-body lf-text-error lf-no-user-select\">{{ AN_ERROR_OCCURED | async }}</div>\r\n    <div *ngIf=\"shouldShowEmptyMessage\" class=\"lf-text-body lf-no-user-select\">{{ THIS_FOLDER_IS_EMPTY | async }}</div>\r\n  </div>\r\n\r\n  <lf-selection-list-component\r\n    [hidden]=\"isLoading || shouldShowErrorMessage || shouldShowEmptyMessage\"\r\n    [uniqueIdentifier]=\"repoBrowserUniqueId\"\r\n    [listItems]=\"currentFolderChildren\"\r\n    [multipleSelection]=\"multiple\"\r\n    [itemSize]=\"item_size\"\r\n    [pageSize]=\"page_size\"\r\n    (scrollChanged)=\"onScroll()\"\r\n    [listItemRef]=\"listOption\"\r\n    (itemDoubleClicked)=\"onDblClickAsync($event)\"\r\n    (itemSelected)=\"onItemSelected($event)\"\r\n    (itemFocused)=\"onEntryFocused($event)\"\r\n    (refreshData)=\"refreshAsync(false)\"\r\n  >\r\n    <ng-template #listOption let-item=\"value\">\r\n      <div *ngIf=\"getIcons(item).length > 0\" class=\"fixed-size-icon-container  lf-no-user-select\">\r\n        <img *ngFor=\"let icon of getIcons(item)\" src=\"{{ icon }}\" alt=\"\" class=\"lf-entry-icon\" />\r\n      </div>\r\n      <div title=\"{{ item?.name }}\" class=\"lf-ellipsis-label lf-no-user-select\">{{ item?.name }}</div>\r\n    </ng-template>\r\n  </lf-selection-list-component>\r\n</div>\r\n","// Copyright (c) Laserfiche.\n// Licensed under the MIT License. See LICENSE in the project root for license information.\n\nimport { ColumnOrderBy } from '@laserfiche/lf-ui-components/lf-selection-list';\nimport { PropertyValue } from '@laserfiche/lf-ui-components/shared';\nexport interface LfTreeNode {\n  id: string;\n  icon: string | string[];\n  isContainer: boolean;\n  isLeaf: boolean;\n  name: string;\n  path: string;\n  attributes?: Map<string, PropertyValue>;\n}\n\nexport interface LfTreeNodePage {\n  page: LfTreeNode[];\n  nextPage: string | undefined;\n}\n\n/**\n * A tree data structure provider that can be used as a data source for UI components, such as the lf-repository-browser component, to navigate a tree structure.\n */\nexport interface LfTreeNodeService {\n  /**\n   * Returns a page containing the children or the parent tree node. The implementation may provide expose ordering and filtering functionality.\n   * @param folder: string that represents the ID of the folder to get data from\n   * @param nextPage: string representing the next page requested. If undefined, the first page is returned\n   **/\n  getFolderChildrenAsync(folder: LfTreeNode, nextPage?: string, orderBy?: ColumnOrderBy): Promise<LfTreeNodePage>;\n\n  /**\n   * Returns the root LfTreeNode\n   */\n  getRootTreeNodeAsync(): Promise<LfTreeNode>;\n\n  /**\n   * Gets the parent LfTreeNode of the passed in node\n   * @param treeNode: LfTreeNode object to get the parent of\n   * returns - Promise with the parent of the parameter LfTreeNode or undefined if its the root LfTreeNode and does not have a parent\n   */\n  getParentTreeNodeAsync(treeNode: LfTreeNode): Promise<LfTreeNode | undefined>;\n\n  /**\n   * Gets the LfTreeNode referenced by the identifier. This function must support getting the LfTreeNode by Id, optionally by secondary identifiers, such as the path, etc.\n   * @param identifier Identifier for the LfTreeNode.\n   */\n  getTreeNodeByIdentifierAsync?(identifier: string): Promise<LfTreeNode | undefined>;\n}\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nimport { CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { createCustomElement } from '@angular/elements';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { LfRepositoryBrowserComponent } from './lf-repository-browser.component';\r\nimport { LfBreadcrumbsModule } from '@laserfiche/lf-ui-components/shared';\r\nimport { LfLoaderModule } from '@laserfiche/lf-ui-components/internal-shared';\r\nimport { LfSelectionListModule } from '@laserfiche/lf-ui-components/lf-selection-list';\r\n\r\n@NgModule({\r\n  declarations: [LfRepositoryBrowserComponent],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    LfBreadcrumbsModule,\r\n    LfLoaderModule,\r\n    LfSelectionListModule,\r\n  ],\r\n  bootstrap: [LfRepositoryBrowserComponent],\r\n  exports: [LfRepositoryBrowserComponent],\r\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n})\r\nexport class LfRepositoryBrowserModule {\r\n  /** @internal */\r\n  constructor(/** @internal */ injector: Injector) {\r\n    const repositoryExplorerElementName: string = 'lf-repository-browser';\r\n    if (window.customElements && !customElements.get(repositoryExplorerElementName)) {\r\n      const repoExplorerElement = createCustomElement(LfRepositoryBrowserComponent, { injector });\r\n      customElements.define(repositoryExplorerElementName, repoExplorerElement);\r\n    }\r\n  }\r\n}\r\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nexport * from './lf-repository-browser.component';\r\nexport * from './ILfTreeNodeService';\r\nexport * from './lf-repository-browser.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './lf-repository-browser-public-api';\n"],"names":[],"mappings":"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"}