{"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/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  OnDestroy,\n  Output,\n  ViewChild,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ILfSelectable, ItemWithId, LfBreadcrumb } from '@laserfiche/lf-ui-components/shared';\nimport { AppLocalizationService, LfLoaderComponent } 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';\nimport { LfBreadcrumbsComponent } from '@laserfiche/lf-ui-components/shared';\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\ntype BreadcrumbNavigationEvent = {\n  breadcrumbs: LfTreeNode[];\n  selected: LfTreeNode;\n};\n\n@Component({\n  selector: 'lf-repository-browser',\n  templateUrl: './lf-repository-browser.component.html',\n  styleUrls: ['./lf-repository-browser.component.css'],\n  standalone: true,\n  imports: [CommonModule, FormsModule, LfBreadcrumbsComponent, LfLoaderComponent, LfSelectionListComponent],\n})\nexport class LfRepositoryBrowserComponent implements OnDestroy, AfterViewInit {\n  /**@internal */\n  ref = inject(ChangeDetectorRef);\n  /**@internal */\n  popupDialog = inject(MatDialog);\n  /**@internal */\n  private localizationService = inject(AppLocalizationService);\n  /**@internal */\n  private el = inject(ElementRef);\n\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    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   * 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        this.ref.markForCheck();\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  /** @internal */\n  private isFetchingData: boolean = false;\n\n  /** @internal */\n  constructor() {\n    this.scrolledIndexChanged.pipe(debounceTime(200)).subscribe(async () => {\n      if (!this._currentFolder) {\n        return;\n      }\n      if (!this.maximumChildrenReceived && !this.isFetchingData) {\n        if (this.nextPage && this.nextPage == this.lastCalledPage) {\n          // do nothing. nextPage already attempted\n          return;\n        }\n        this.isFetchingData = true;\n        try {\n          await this.makeDataCall(this._currentFolder);\n          this.ref.detectChanges();\n        } finally {\n          this.isFetchingData = false;\n        }\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 onBreadcrumbNavigation(navigationEvent: BreadcrumbNavigationEvent) {\n    if (!navigationEvent.breadcrumbs || !navigationEvent.selected) {\n      console.error('Breadcrumb navigation requires breadcrumbs and a selected entry');\n      return;\n    }\n    this._breadcrumbs = navigationEvent.breadcrumbs;\n    this._currentFolder = navigationEvent.selected;\n    await this.updateAllPossibleEntriesAsync(this._currentFolder);\n    this.entryDblClicked.emit([this._currentFolder]);\n    setTimeout(() => this.entryList?.focus());\n  }\n\n  /** @internal */\n  toBreadcrumbNavigationEvent(event: {\n    breadcrumbs: LfBreadcrumb[];\n    selected: LfBreadcrumb;\n  }): BreadcrumbNavigationEvent {\n    return {\n      breadcrumbs: event.breadcrumbs as LfTreeNode[],\n      selected: event.selected as LfTreeNode,\n    };\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: ItemWithId | undefined) {\n    const entry = treeNode as LfTreeNode | undefined;\n    if (!entry) {\n      return;\n    }\n\n    await this.openChildFolderAsync(entry);\n    this.entryDblClicked.emit([entry]);\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        this.syncEntryListViewportSize();\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      if (selectable.length === 0) {\n        return selectable;\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  /** @internal */\n  private syncEntryListViewportSize() {\n    setTimeout(() => {\n      this.entryList?.viewport?.checkViewportSize();\n      // checkViewportSize calls onDataLengthChanged which resets totalContentSize\n      // to 0 because CDK _dataLength is always 0 (no CdkVirtualForOf). Restore it.\n      if (this.entryList?.viewport) {\n        this.entryList.viewport.setTotalContentSize(this.currentFolderChildren.length * this.entryList.itemSize);\n      }\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.\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\n\n<div class=\"lf-repository-browser-header\">\n  <lf-breadcrumbs\n    [breadcrumbs]=\"breadcrumbs\"\n    (breadcrumbClicked)=\"onBreadcrumbNavigation(toBreadcrumbNavigationEvent($event))\"\n  >\n  </lf-breadcrumbs>\n  <ng-content select=\"[lf-toolbar]\"></ng-content>\n</div>\n<div\n  class=\"lf-repo-entry-container\"\n  [attr.tabindex]=\"isLoading || shouldShowErrorMessage || shouldShowEmptyMessage ? 0 : -1\"\n>\n  @if (isLoading) {\n    <lf-loader-component class=\"lf-text-body lf-no-user-select\"></lf-loader-component>\n  }\n  @if (!isLoading && (shouldShowErrorMessage || shouldShowEmptyMessage)) {\n    <div id=\"message-display\">\n      @if (shouldShowErrorMessage) {\n        <div class=\"lf-text-body lf-text-error lf-no-user-select\">{{ AN_ERROR_OCCURED | async }}</div>\n      }\n      @if (shouldShowEmptyMessage) {\n        <div class=\"lf-text-body lf-no-user-select\">{{ THIS_FOLDER_IS_EMPTY | async }}</div>\n      }\n    </div>\n  }\n  <div [hidden]=\"shouldShowErrorMessage || shouldShowEmptyMessage\" [ngStyle]=\"{ height: '100%' }\">\n    <lf-selection-list-component\n      [hidden]=\"isLoading || shouldShowErrorMessage || shouldShowEmptyMessage\"\n      [uniqueIdentifier]=\"repoBrowserUniqueId\"\n      [listItems]=\"currentFolderChildren\"\n      [multipleSelection]=\"multiple\"\n      [itemSize]=\"item_size\"\n      [pageSize]=\"page_size\"\n      (scrollChanged)=\"onScroll()\"\n      [listItemRef]=\"listOption\"\n      (itemDoubleClicked)=\"onDblClickAsync($event)\"\n      (itemSelected)=\"onItemSelected($event)\"\n      (itemFocused)=\"onEntryFocused($event)\"\n      (refreshData)=\"refreshAsync(false)\"\n    >\n      <ng-template #listOption let-item=\"value\">\n        @if (getIcons(item).length > 0) {\n          <div class=\"fixed-size-icon-container lf-no-user-select\">\n            @for (icon of getIcons(item); track icon) {\n              <img src=\"{{ icon }}\" alt=\"\" class=\"lf-entry-icon\" />\n            }\n          </div>\n        }\n        <div title=\"{{ item?.name }}\" class=\"lf-ellipsis-label lf-no-user-select\">{{ item?.name }}</div>\n      </ng-template>\n    </lf-selection-list-component>\n  </div>\n</div>\n","// Copyright (c) Laserfiche.\n// Licensed under the MIT License. See LICENSE in the project root for license information.\n\nexport { LfRepositoryBrowserComponent } from './lf-repository-browser.component';\nexport { LfTreeNode, LfTreeNodePage, LfTreeNodeService } from './ILfTreeNodeService';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './lf-repository-browser-public-api';\n"],"names":[],"mappings":"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"}