{"version":3,"file":"Selection.js","sourceRoot":"../src/","sources":["selection/Selection.ts"],"names":[],"mappings":"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","sourcesContent":["import { IObjectWithKey, ISelection, SELECTION_CHANGE, SELECTION_ITEMS_CHANGE, SelectionMode } from './Selection.types';\nimport { EventGroup } from '../EventGroup';\n\n/**\n * {@docCategory Selection}\n */\nexport interface ISelectionOptions<TItem = IObjectWithKey> {\n  onSelectionChanged?: () => void;\n  onItemsChanged?: () => void;\n  /** Custom logic to generate item keys. Required if `TItem` does not have a `key` property. */\n  getKey?: (item: TItem, index?: number) => string | number;\n  canSelectItem?: (item: TItem, index?: number) => boolean;\n  selectionMode?: SelectionMode;\n  items?: TItem[];\n}\n\n/**\n * Selection options with required `getKey` property.\n * {@docCategory Selection}\n */\nexport type ISelectionOptionsWithRequiredGetKey<TItem> = ISelectionOptions<TItem> &\n  Required<Pick<ISelectionOptions<TItem>, 'getKey'>>;\n\n/**\n * {@docCategory Selection}\n */\nexport class Selection<TItem = IObjectWithKey> implements ISelection<TItem> {\n  /** Number of items selected. Do not modify. */\n  public count: number;\n  public readonly mode: SelectionMode;\n\n  private _getKey: (item: TItem, index?: number) => string | number;\n  private _canSelectItem: (item: TItem, index?: number) => boolean;\n\n  private _changeEventSuppressionCount: number;\n  private _items: TItem[];\n  private _selectedItems: TItem[] | null;\n  private _selectedIndices: number[] | undefined;\n  private _isAllSelected: boolean;\n  private _exemptedIndices: { [index: string]: boolean };\n  private _exemptedCount: number;\n  private _keyToIndexMap: { [key: string]: number };\n  private _anchoredIndex: number;\n  private _onSelectionChanged: (() => void) | undefined;\n  private _onItemsChanged: (() => void) | undefined;\n  private _hasChanged!: boolean;\n  private _unselectableIndices!: { [index: string]: boolean };\n  private _unselectableCount: number;\n  private _isModal: boolean;\n\n  /**\n   * Create a new Selection. If `TItem` does not have a `key` property, you must provide an options\n   * object with a `getKey` implementation. Providing options is optional otherwise.\n   * (At most one `options` object is accepted.)\n   */\n  constructor(\n    ...options: TItem extends IObjectWithKey // If the item type has a built-in key...\n      ? [] | [ISelectionOptions<TItem>] // Then the arguments can be empty or have the options without `getKey`\n      : [ISelectionOptionsWithRequiredGetKey<TItem>] // Otherwise, arguments require options with `getKey`.\n  ) {\n    const {\n      onSelectionChanged,\n      onItemsChanged,\n      getKey,\n      canSelectItem = () => true,\n      items,\n      selectionMode = SelectionMode.multiple,\n    } = options[0] || ({} as ISelectionOptions<TItem>);\n\n    this.mode = selectionMode;\n\n    this._getKey = getKey || defaultGetKey;\n\n    this._changeEventSuppressionCount = 0;\n    this._exemptedCount = 0;\n    this._anchoredIndex = 0;\n    this._unselectableCount = 0;\n\n    this._onSelectionChanged = onSelectionChanged;\n    this._onItemsChanged = onItemsChanged;\n    this._canSelectItem = canSelectItem;\n    this._keyToIndexMap = {};\n\n    this._isModal = false;\n\n    this.setItems(items || [], true);\n\n    this.count = this.getSelectedCount();\n  }\n\n  public canSelectItem(item: TItem, index?: number): boolean {\n    if (typeof index === 'number' && index < 0) {\n      return false;\n    }\n\n    return this._canSelectItem(item, index);\n  }\n\n  public getKey(item: TItem, index?: number): string {\n    const key = this._getKey(item, index);\n\n    return typeof key === 'number' || key ? `${key}` : '';\n  }\n\n  public setChangeEvents(isEnabled: boolean, suppressChange?: boolean): void {\n    this._changeEventSuppressionCount += isEnabled ? -1 : 1;\n\n    if (this._changeEventSuppressionCount === 0 && this._hasChanged) {\n      this._hasChanged = false;\n\n      if (!suppressChange) {\n        this._change();\n      }\n    }\n  }\n\n  public isModal(): boolean {\n    return this._isModal;\n  }\n\n  public setModal(isModal: boolean): void {\n    if (this._isModal !== isModal) {\n      this.setChangeEvents(false);\n\n      this._isModal = isModal;\n\n      if (!isModal) {\n        this.setAllSelected(false);\n      }\n\n      this._change();\n\n      this.setChangeEvents(true);\n    }\n  }\n\n  /**\n   * Selection needs the items, call this method to set them. If the set\n   * of items is the same, this will re-evaluate selection and index maps.\n   * Otherwise, shouldClear should be set to true, so that selection is\n   * cleared.\n   */\n  public setItems(items: TItem[], shouldClear: boolean = true): void {\n    const newKeyToIndexMap: { [key: string]: number } = {};\n    const newUnselectableIndices: { [key: string]: boolean } = {};\n    let hasSelectionChanged = false;\n\n    this.setChangeEvents(false);\n\n    // Reset the unselectable count.\n    this._unselectableCount = 0;\n\n    let haveItemsChanged = false;\n\n    // Build lookup table for quick selection evaluation.\n    for (let i = 0; i < items.length; i++) {\n      const item = items[i];\n\n      if (item) {\n        const key = this.getKey(item, i);\n\n        if (key) {\n          if (!haveItemsChanged && (!(key in this._keyToIndexMap) || this._keyToIndexMap[key] !== i)) {\n            haveItemsChanged = true;\n          }\n\n          newKeyToIndexMap[key] = i;\n        }\n      }\n\n      newUnselectableIndices[i] = item && !this.canSelectItem(item);\n      if (newUnselectableIndices[i]) {\n        this._unselectableCount++;\n      }\n    }\n\n    if (shouldClear || items.length === 0) {\n      this._setAllSelected(false, true);\n    }\n\n    // Check the exemption list for discrepencies.\n    const newExemptedIndicies: { [key: string]: boolean } = {};\n    let newExemptedCount = 0;\n\n    for (const indexProperty in this._exemptedIndices) {\n      if (this._exemptedIndices.hasOwnProperty(indexProperty)) {\n        const index = Number(indexProperty);\n        const item = this._items[index];\n        const exemptKey = item ? this.getKey(item, Number(index)) : undefined;\n        const newIndex = exemptKey ? newKeyToIndexMap[exemptKey] : index;\n\n        if (newIndex === undefined) {\n          // The item has likely been replaced or removed.\n          hasSelectionChanged = true;\n        } else {\n          // We know the new index of the item. update the existing exemption table.\n          newExemptedIndicies[newIndex] = true;\n          newExemptedCount++;\n          hasSelectionChanged = hasSelectionChanged || newIndex !== index;\n        }\n      }\n    }\n\n    if (this._items && this._exemptedCount === 0 && items.length !== this._items.length && this._isAllSelected) {\n      // If everything was selected but the number of items has changed, selection has changed.\n      hasSelectionChanged = true;\n    }\n\n    if (!haveItemsChanged) {\n      for (const key of Object.keys(this._keyToIndexMap)) {\n        if (!(key in newKeyToIndexMap)) {\n          haveItemsChanged = true;\n          break;\n        }\n      }\n    }\n\n    this._exemptedIndices = newExemptedIndicies;\n    this._exemptedCount = newExemptedCount;\n    this._keyToIndexMap = newKeyToIndexMap;\n    this._unselectableIndices = newUnselectableIndices;\n    this._items = items;\n    this._selectedItems = null;\n\n    if (hasSelectionChanged) {\n      this._updateCount();\n    }\n\n    if (haveItemsChanged) {\n      EventGroup.raise(this, SELECTION_ITEMS_CHANGE);\n\n      if (this._onItemsChanged) {\n        this._onItemsChanged();\n      }\n    }\n\n    if (hasSelectionChanged) {\n      this._change();\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  public getItems(): TItem[] {\n    return this._items;\n  }\n\n  public getSelection(): TItem[] {\n    if (!this._selectedItems) {\n      this._selectedItems = [];\n\n      const items = this._items;\n\n      if (items) {\n        for (let i = 0; i < items.length; i++) {\n          if (this.isIndexSelected(i)) {\n            this._selectedItems.push(items[i]);\n          }\n        }\n      }\n    }\n\n    return this._selectedItems;\n  }\n\n  public getSelectedCount(): number {\n    return this._isAllSelected\n      ? this._items.length - this._exemptedCount - this._unselectableCount\n      : this._exemptedCount;\n  }\n\n  public getSelectedIndices(): number[] {\n    if (!this._selectedIndices) {\n      this._selectedIndices = [];\n\n      const items = this._items;\n\n      if (items) {\n        for (let i = 0; i < items.length; i++) {\n          if (this.isIndexSelected(i)) {\n            this._selectedIndices.push(i);\n          }\n        }\n      }\n    }\n\n    return this._selectedIndices;\n  }\n\n  public getItemIndex(key: string): number {\n    const index = this._keyToIndexMap[key];\n\n    return index ?? -1;\n  }\n\n  public isRangeSelected(fromIndex: number, count: number): boolean {\n    if (count === 0) {\n      return false;\n    }\n\n    const endIndex = fromIndex + count;\n\n    for (let i = fromIndex; i < endIndex; i++) {\n      if (!this.isIndexSelected(i)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  public isAllSelected(): boolean {\n    let selectableCount = this._items.length - this._unselectableCount;\n\n    // In single mode, we can only have a max of 1 item.\n    if (this.mode === SelectionMode.single) {\n      selectableCount = Math.min(selectableCount, 1);\n    }\n\n    return (\n      (this.count > 0 && this._isAllSelected && this._exemptedCount === 0) ||\n      (!this._isAllSelected && this._exemptedCount === selectableCount && selectableCount > 0)\n    );\n  }\n\n  public isKeySelected(key: string): boolean {\n    const index = this._keyToIndexMap[key];\n\n    return this.isIndexSelected(index);\n  }\n\n  public isIndexSelected(index: number): boolean {\n    return !!(\n      (this.count > 0 && this._isAllSelected && !this._exemptedIndices[index] && !this._unselectableIndices[index]) ||\n      (!this._isAllSelected && this._exemptedIndices[index])\n    );\n  }\n\n  public setAllSelected(isAllSelected: boolean): void {\n    if (isAllSelected && this.mode !== SelectionMode.multiple) {\n      return;\n    }\n\n    const selectableCount = this._items ? this._items.length - this._unselectableCount : 0;\n\n    this.setChangeEvents(false);\n\n    if (selectableCount > 0 && (this._exemptedCount > 0 || isAllSelected !== this._isAllSelected)) {\n      this._exemptedIndices = {};\n\n      if (isAllSelected !== this._isAllSelected || this._exemptedCount > 0) {\n        this._exemptedCount = 0;\n        this._isAllSelected = isAllSelected;\n        this._change();\n      }\n\n      this._updateCount();\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  public setKeySelected(key: string, isSelected: boolean, shouldAnchor: boolean): void {\n    const index = this._keyToIndexMap[key];\n\n    if (index >= 0) {\n      this.setIndexSelected(index, isSelected, shouldAnchor);\n    }\n  }\n\n  public setIndexSelected(index: number, isSelected: boolean, shouldAnchor: boolean): void {\n    if (this.mode === SelectionMode.none) {\n      return;\n    }\n\n    // Clamp the index.\n    index = Math.min(Math.max(0, index), this._items.length - 1);\n\n    // No-op on out of bounds selections.\n    if (index < 0 || index >= this._items.length) {\n      return;\n    }\n\n    this.setChangeEvents(false);\n\n    const isExempt = this._exemptedIndices[index];\n    const canSelect = !this._unselectableIndices[index];\n\n    if (canSelect) {\n      if (isSelected && this.mode === SelectionMode.single) {\n        // If this is single-select, the previous selection should be removed.\n        this._setAllSelected(false, true);\n      }\n\n      // Determine if we need to remove the exemption.\n      if (isExempt && ((isSelected && this._isAllSelected) || (!isSelected && !this._isAllSelected))) {\n        delete this._exemptedIndices[index];\n        this._exemptedCount--;\n      }\n\n      // Determine if we need to add the exemption.\n      if (!isExempt && ((isSelected && !this._isAllSelected) || (!isSelected && this._isAllSelected))) {\n        this._exemptedIndices[index] = true;\n        this._exemptedCount++;\n      }\n\n      if (shouldAnchor) {\n        this._anchoredIndex = index;\n      }\n    }\n\n    this._updateCount();\n\n    this.setChangeEvents(true);\n  }\n\n  public setRangeSelected(fromIndex: number, count: number, isSelected: boolean, shouldAnchor: boolean): void {\n    if (this.mode === SelectionMode.none) {\n      return;\n    }\n\n    // Clamp the index.\n    fromIndex = Math.min(Math.max(0, fromIndex), this._items.length - 1);\n\n    // Clamp the range.\n    count = Math.min(Math.max(0, count), this._items.length - fromIndex);\n\n    // No-op on out of bounds selections.\n    if (fromIndex < 0 || fromIndex >= this._items.length || count === 0) {\n      return;\n    }\n\n    this.setChangeEvents(false);\n\n    const anchorIndex = this._anchoredIndex || 0;\n    let startIndex = fromIndex;\n    const endIndex = fromIndex + count - 1;\n\n    const newAnchorIndex = anchorIndex >= endIndex ? startIndex : endIndex;\n\n    for (; startIndex <= endIndex; startIndex++) {\n      this.setIndexSelected(startIndex, isSelected, shouldAnchor ? startIndex === newAnchorIndex : false);\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  public selectToKey(key: string, clearSelection?: boolean): void {\n    this.selectToIndex(this._keyToIndexMap[key], clearSelection);\n  }\n\n  public selectToRange(fromIndex: number, count: number, clearSelection?: boolean): void {\n    if (this.mode === SelectionMode.none) {\n      return;\n    }\n\n    if (this.mode === SelectionMode.single) {\n      if (count === 1) {\n        this.setIndexSelected(fromIndex, true, true);\n      }\n      return;\n    }\n\n    const anchorIndex = this._anchoredIndex || 0;\n    let startIndex = Math.min(fromIndex, anchorIndex);\n    const endIndex = Math.max(fromIndex + count - 1, anchorIndex);\n\n    this.setChangeEvents(false);\n\n    if (clearSelection) {\n      this._setAllSelected(false, true);\n    }\n\n    for (; startIndex <= endIndex; startIndex++) {\n      this.setIndexSelected(startIndex, true, false);\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  public selectToIndex(index: number, clearSelection?: boolean): void {\n    if (this.mode === SelectionMode.none) {\n      return;\n    }\n\n    if (this.mode === SelectionMode.single) {\n      this.setIndexSelected(index, true, true);\n      return;\n    }\n\n    const anchorIndex = this._anchoredIndex || 0;\n    let startIndex = Math.min(index, anchorIndex);\n    const endIndex = Math.max(index, anchorIndex);\n\n    this.setChangeEvents(false);\n\n    if (clearSelection) {\n      this._setAllSelected(false, true);\n    }\n\n    for (; startIndex <= endIndex; startIndex++) {\n      this.setIndexSelected(startIndex, true, false);\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  public toggleAllSelected(): void {\n    this.setAllSelected(!this.isAllSelected());\n  }\n\n  public toggleKeySelected(key: string): void {\n    this.setKeySelected(key, !this.isKeySelected(key), true);\n  }\n\n  public toggleIndexSelected(index: number): void {\n    this.setIndexSelected(index, !this.isIndexSelected(index), true);\n  }\n\n  public toggleRangeSelected(fromIndex: number, count: number): void {\n    if (this.mode === SelectionMode.none) {\n      return;\n    }\n\n    const isRangeSelected = this.isRangeSelected(fromIndex, count);\n    const endIndex = fromIndex + count;\n\n    if (this.mode === SelectionMode.single && count > 1) {\n      return;\n    }\n\n    this.setChangeEvents(false);\n    for (let i = fromIndex; i < endIndex; i++) {\n      this.setIndexSelected(i, !isRangeSelected, false);\n    }\n    this.setChangeEvents(true);\n  }\n\n  private _updateCount(preserveModalState: boolean = false): void {\n    const count = this.getSelectedCount();\n\n    if (count !== this.count) {\n      this.count = count;\n      this._change();\n    }\n\n    if (!this.count && !preserveModalState) {\n      this.setModal(false);\n    }\n  }\n\n  private _setAllSelected(isAllSelected: boolean, preserveModalState: boolean = false): void {\n    if (isAllSelected && this.mode !== SelectionMode.multiple) {\n      return;\n    }\n\n    const selectableCount = this._items ? this._items.length - this._unselectableCount : 0;\n\n    this.setChangeEvents(false);\n\n    if (selectableCount > 0 && (this._exemptedCount > 0 || isAllSelected !== this._isAllSelected)) {\n      this._exemptedIndices = {};\n\n      if (isAllSelected !== this._isAllSelected || this._exemptedCount > 0) {\n        this._exemptedCount = 0;\n        this._isAllSelected = isAllSelected;\n        this._change();\n      }\n\n      this._updateCount(preserveModalState);\n    }\n\n    this.setChangeEvents(true);\n  }\n\n  private _change(): void {\n    if (this._changeEventSuppressionCount === 0) {\n      this._selectedItems = null;\n      this._selectedIndices = undefined;\n\n      EventGroup.raise(this, SELECTION_CHANGE);\n\n      if (this._onSelectionChanged) {\n        this._onSelectionChanged();\n      }\n    } else {\n      this._hasChanged = true;\n    }\n  }\n}\n\nfunction defaultGetKey<TItem = IObjectWithKey>(item: TItem, index?: number): string | number {\n  // 0 may be used as a key\n  const { key = `${index}` } = (item || {}) as IObjectWithKey;\n  return key;\n}\n"]}