{"version":3,"file":"usitsdasdesign-dds-ng-core-list-manager.mjs","sources":["../../src/app/dds/core/list-manager/list-manager.ts","../../src/app/dds/core/list-manager/usitsdasdesign-dds-ng-core-list-manager.ts"],"sourcesContent":["import { QueryList } from '@angular/core';\nimport { KeyCodes } from '@usitsdasdesign/dds-ng/shared';\nimport { Subject } from 'rxjs';\n\nexport interface ListItem {\n  disabled?: boolean;\n}\n\nexport class ListManager<T extends ListItem> {\n  // Subject to notify when tabbing out\n  public tabOut: Subject<void> = new Subject<void>();\n  // Subject to notify when the active item changes\n  public change = new Subject<number>();\n  // Previous active item\n  public previousActiveItem: T | null = null;\n  // Index of the previous active item\n  public previousActiveItemIndex: number | null = null;\n\n  // Index of the current active item\n  private _activeItemIndex = -1;\n  // Current active item\n  private _activeItem: T | null = null;\n  // Flag to enable Home and End key functionality\n  private _homeAndEnd = false;\n\n  // Function to determine if an item should be skipped\n  private skipItemFn = (item: T) => item.disabled;\n\n  // Getter for the active item index\n  get activeItemIndex(): number | null {\n    return this._activeItemIndex;\n  }\n\n  // Getter for the active item\n  get activeItem(): T | null {\n    return this._activeItem;\n  }\n\n  // Constructor to initialize the items and subscribe to changes if items is a QueryList\n  constructor(public items: QueryList<T> | T[]) {\n    if (items instanceof QueryList) {\n      items.changes.subscribe((newItems: QueryList<T>) => {\n        if (this._activeItem) {\n          const itemArray = newItems.toArray();\n          const newIndex = itemArray.indexOf(this._activeItem);\n\n          if (newIndex > -1 && newIndex !== this._activeItemIndex) {\n            this._activeItemIndex = newIndex;\n          }\n        }\n      });\n    }\n  }\n\n  // Method to set the function to determine if an item should be skipped\n  public skipItem(item: (item: T) => boolean): this {\n    this.skipItemFn = item;\n    return this;\n  }\n\n  // Method to enable or disable Home and End key functionality\n  public withHomeAndEnd(enabled: boolean = true): this {\n    this._homeAndEnd = enabled;\n    return this;\n  }\n\n  // Method to set the active item\n  public setActiveItem(item: number | T): void {\n    this.previousActiveItem = this._activeItem;\n    this.previousActiveItemIndex = this._activeItemIndex;\n\n    this.updateActiveItem(item);\n\n    if (this._activeItem !== this.previousActiveItem) {\n      this.change.next(this._activeItemIndex);\n    }\n  }\n\n  // Method to handle keydown events\n  public onKeydown(event: KeyboardEvent, preventTab = true): void {\n    const keyCode = event.keyCode;\n\n    switch (keyCode) {\n      case KeyCodes.TAB:\n        if (preventTab) event.preventDefault();\n        this.tabOut.next();\n        return;\n\n      case KeyCodes.ARROW_DOWN:\n      case KeyCodes.ARROW_RIGHT:\n        event.preventDefault();\n        this.setNextItemActive();\n        break;\n\n      case KeyCodes.ARROW_UP:\n      case KeyCodes.ARROW_LEFT:\n        event.preventDefault();\n        this.setPreviousItemActive();\n        break;\n\n      case KeyCodes.HOME:\n        if (this._homeAndEnd) {\n          event.preventDefault();\n          this.setFirstItemActive();\n          break;\n        } else {\n          return;\n        }\n\n      case KeyCodes.END:\n        if (this._homeAndEnd) {\n          event.preventDefault();\n          this.setLastItemActive();\n          break;\n        } else {\n          return;\n        }\n    }\n  }\n\n  // Method to update the active item\n  public updateActiveItem(item: number | T): void {\n    const itemArray = this.getItemsList();\n    const index = typeof item === 'number' ? this.getNextIndex(item, 1) : itemArray.indexOf(item);\n    const activeItem = itemArray[index];\n\n    this._activeItem = activeItem == null ? null : activeItem;\n    this._activeItemIndex = index;\n  }\n\n  // Method to set the first item as active\n  public setFirstItemActive(): void {\n    const firstIndex = this.getNextIndex(0, 1);\n\n    this.setActiveItem(firstIndex);\n  }\n\n  // Method to set the last item as active\n  public setLastItemActive(): void {\n    const lastIndex = this.getNextIndex(this.items.length - 1, -1);\n\n    this.setActiveItem(lastIndex);\n  }\n\n  // Method to set the next item as active\n  public setNextItemActive(): void {\n    const nextIndex = this.getNextIndex(this._activeItemIndex + 1, 1);\n\n    nextIndex > this.getItemsList().length - 1 ? this.setFirstItemActive() : this.setActiveItem(nextIndex);\n  }\n\n  // Method to set the previous item as active\n  public setPreviousItemActive(): void {\n    const nextIndex = this.getNextIndex(this._activeItemIndex - 1, -1);\n\n    nextIndex < 0 ? this.setLastItemActive() : this.setActiveItem(nextIndex);\n  }\n\n  // Method to get the next index, skipping disabled items\n  private getNextIndex(index: number, fallbackDelta: -1 | 1): number {\n    const items = this.getItemsList();\n\n    if (!items[index]) {\n      return index;\n    }\n\n    while (this.skipItemFn(items[index])) {\n      index += fallbackDelta;\n\n      if (!items[index]) {\n        return index;\n      }\n    }\n\n    return index;\n  }\n\n  // Method to get the list of items\n  private getItemsList(): T[] {\n    return this.items instanceof QueryList ? this.items.toArray() : this.items;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}