{"mappings":"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","sources":["packages/react-stately/src/selection/SelectionManager.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n  Collection, DisabledBehavior,\n  FocusStrategy,\n  Selection as ISelection,\n  Key,\n  LayoutDelegate,\n  LongPressEvent,\n  Node,\n  PressEvent,\n  SelectionBehavior,\n  SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '../collections/getChildNodes';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n  allowsCellSelection?: boolean,\n  layoutDelegate?: LayoutDelegate,\n  fullCollection?: Collection<Node<unknown>>\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n  collection: Collection<Node<unknown>>;\n  private state: MultipleSelectionState;\n  private allowsCellSelection: boolean;\n  private _isSelectAll: boolean | null;\n  private layoutDelegate: LayoutDelegate | null;\n  private fullCollection: Collection<Node<unknown>> | null;\n\n  constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n    this.collection = collection;\n    this.state = state;\n    this.allowsCellSelection = options?.allowsCellSelection ?? false;\n    this._isSelectAll = null;\n    this.layoutDelegate = options?.layoutDelegate || null;\n    this.fullCollection = options?.fullCollection || null;\n  }\n\n  /**\n   * The type of selection that is allowed in the collection.\n   */\n  get selectionMode(): SelectionMode {\n    return this.state.selectionMode;\n  }\n\n  /**\n   * Whether the collection allows empty selection.\n   */\n  get disallowEmptySelection(): boolean {\n    return this.state.disallowEmptySelection;\n  }\n\n  /**\n   * The selection behavior for the collection.\n   */\n  get selectionBehavior(): SelectionBehavior {\n    return this.state.selectionBehavior;\n  }\n\n  /**\n   * Sets the selection behavior for the collection.\n   */\n  setSelectionBehavior(selectionBehavior: SelectionBehavior): void {\n    this.state.setSelectionBehavior(selectionBehavior);\n  }\n\n  /**\n   * Whether the collection is currently focused.\n   */\n  get isFocused(): boolean {\n    return this.state.isFocused;\n  }\n\n  /**\n   * Sets whether the collection is focused.\n   */\n  setFocused(isFocused: boolean): void {\n    this.state.setFocused(isFocused);\n  }\n\n  /**\n   * The current focused key in the collection.\n   */\n  get focusedKey(): Key | null {\n    return this.state.focusedKey;\n  }\n\n  /** Whether the first or last child of the focused key should receive focus. */\n  get childFocusStrategy(): FocusStrategy | null {\n    return this.state.childFocusStrategy;\n  }\n\n  /**\n   * Sets the focused key.\n   */\n  setFocusedKey(key: Key | null, childFocusStrategy?: FocusStrategy): void {\n    if (key == null || this.collection.getItem(key)) {\n      this.state.setFocusedKey(key, childFocusStrategy);\n    }\n  }\n\n  /**\n   * The currently selected keys in the collection.\n   */\n  get selectedKeys(): Set<Key> {\n    return this.state.selectedKeys === 'all'\n      ? new Set(this.getSelectAllKeys())\n      : this.state.selectedKeys;\n  }\n\n  /**\n   * The raw selection value for the collection.\n   * Either 'all' for select all, or a set of keys.\n   */\n  get rawSelection(): ISelection {\n    return this.state.selectedKeys;\n  }\n\n  /**\n   * Returns whether a key is selected.\n   */\n  isSelected(key: Key): boolean {\n    if (this.state.selectionMode === 'none') {\n      return false;\n    }\n\n    let mappedKey = this.getKey(key);\n    if (mappedKey == null) {\n      return false;\n    }\n    return this.state.selectedKeys === 'all'\n      ? this.canSelectItem(mappedKey)\n      : this.state.selectedKeys.has(mappedKey);\n  }\n\n  /**\n   * Whether the selection is empty.\n   */\n  get isEmpty(): boolean {\n    return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n  }\n\n  /**\n   * Whether all items in the collection are selected.\n   */\n  get isSelectAll(): boolean {\n    if (this.isEmpty) {\n      return false;\n    }\n\n    if (this.state.selectedKeys === 'all') {\n      return true;\n    }\n\n    if (this._isSelectAll != null) {\n      return this._isSelectAll;\n    }\n\n    let allKeys = this.getSelectAllKeys();\n    let selectedKeys = this.state.selectedKeys;\n    this._isSelectAll = allKeys.every(k => selectedKeys.has(k));\n    return this._isSelectAll;\n  }\n\n  get firstSelectedKey(): Key | null {\n    let first: Node<unknown> | null = null;\n    for (let key of this.state.selectedKeys) {\n      let item = this.collection.getItem(key);\n      if (!first || (item && compareNodeOrder(this.collection, item, first) < 0)) {\n        first = item;\n      }\n    }\n\n    return first?.key ?? null;\n  }\n\n  get lastSelectedKey(): Key | null {\n    let last: Node<unknown> | null = null;\n    for (let key of this.state.selectedKeys) {\n      let item = this.collection.getItem(key);\n      if (!last || (item && compareNodeOrder(this.collection, item, last) > 0)) {\n        last = item;\n      }\n    }\n\n    return last?.key ?? null;\n  }\n\n  get disabledKeys(): Set<Key> {\n    return this.state.disabledKeys;\n  }\n\n  get disabledBehavior(): DisabledBehavior {\n    return this.state.disabledBehavior;\n  }\n\n  /**\n   * Extends the selection to the given key.\n   */\n  extendSelection(toKey: Key): void {\n    if (this.selectionMode === 'none') {\n      return;\n    }\n\n    if (this.selectionMode === 'single') {\n      this.replaceSelection(toKey);\n      return;\n    }\n\n    let mappedToKey = this.getKey(toKey);\n    if (mappedToKey == null) {\n      return;\n    }\n\n    let selection: Selection;\n\n    // Only select the one key if coming from a select all.\n    if (this.state.selectedKeys === 'all') {\n      selection = new Selection([mappedToKey], mappedToKey, mappedToKey);\n    } else {\n      let selectedKeys = this.state.selectedKeys as Selection;\n      let anchorKey = selectedKeys.anchorKey ?? mappedToKey;\n      selection = new Selection(selectedKeys, anchorKey, mappedToKey);\n      for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey ?? mappedToKey)) {\n        selection.delete(key);\n      }\n\n      for (let key of this.getKeyRange(mappedToKey, anchorKey)) {\n        if (this.canSelectItem(key)) {\n          selection.add(key);\n        }\n      }\n    }\n\n    this.state.setSelectedKeys(selection);\n  }\n\n  private getKeyRange(from: Key, to: Key) {\n    let fromItem = this.collection.getItem(from);\n    let toItem = this.collection.getItem(to);\n    if (fromItem && toItem) {\n      if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n        return this.getKeyRangeInternal(from, to);\n      }\n\n      return this.getKeyRangeInternal(to, from);\n    }\n\n    return [];\n  }\n\n  private getKeyRangeInternal(from: Key, to: Key) {\n    if (this.layoutDelegate?.getKeyRange) {\n      return this.layoutDelegate.getKeyRange(from, to);\n    }\n\n    let keys: Key[] = [];\n    let key: Key | null = from;\n    while (key != null) {\n      let item = this.collection.getItem(key);\n      if (item && (item.type === 'item' || (item.type === 'cell' && this.allowsCellSelection))) {\n        keys.push(key);\n      }\n\n      if (key === to) {\n        return keys;\n      }\n\n      key = this.collection.getKeyAfter(key);\n    }\n\n    return [];\n  }\n\n  private getKey(key: Key) {\n    let item = this.collection.getItem(key);\n    if (!item) {\n      // ¯\\_(ツ)_/¯\n      return key;\n    }\n\n    // If cell selection is allowed, just return the key.\n    if (item.type === 'cell' && this.allowsCellSelection) {\n      return key;\n    }\n\n    // Find a parent item to select\n    while (item && item.type !== 'item' && item.parentKey != null) {\n      item = this.collection.getItem(item.parentKey);\n    }\n\n    if (!item || item.type !== 'item') {\n      return null;\n    }\n\n    return item.key;\n  }\n\n  /**\n   * Toggles whether the given key is selected.\n   */\n  toggleSelection(key: Key): void {\n    if (this.selectionMode === 'none') {\n      return;\n    }\n\n    if (this.selectionMode === 'single' && !this.isSelected(key)) {\n      this.replaceSelection(key);\n      return;\n    }\n\n    let mappedKey = this.getKey(key);\n    if (mappedKey == null) {\n      return;\n    }\n\n    let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n    if (keys.has(mappedKey)) {\n      keys.delete(mappedKey);\n      // TODO: move anchor to last selected key...\n      // Does `current` need to move here too?\n    } else if (this.canSelectItem(mappedKey)) {\n      keys.add(mappedKey);\n      keys.anchorKey = mappedKey;\n      keys.currentKey = mappedKey;\n    }\n\n    if (this.disallowEmptySelection && keys.size === 0) {\n      return;\n    }\n\n    this.state.setSelectedKeys(keys);\n  }\n\n  /**\n   * Replaces the selection with only the given key.\n   */\n  replaceSelection(key: Key): void {\n    if (this.selectionMode === 'none') {\n      return;\n    }\n\n    let mappedKey = this.getKey(key);\n    if (mappedKey == null) {\n      return;\n    }\n\n    let selection = this.canSelectItem(mappedKey)\n      ? new Selection([mappedKey], mappedKey, mappedKey)\n      : new Selection();\n\n    this.state.setSelectedKeys(selection);\n  }\n\n  /**\n   * Replaces the selection with the given keys.\n   */\n  setSelectedKeys(keys: Iterable<Key>): void {\n    if (this.selectionMode === 'none') {\n      return;\n    }\n\n    let selection = new Selection();\n    for (let key of keys) {\n      let mappedKey = this.getKey(key);\n      if (mappedKey != null) {\n        selection.add(mappedKey);\n        if (this.selectionMode === 'single') {\n          break;\n        }\n      }\n    }\n\n    this.state.setSelectedKeys(selection);\n  }\n\n  private getSelectAllKeys() {\n    // Use the full (unfiltered) collection when available so that materializing\n    // the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).\n    let collection = this.fullCollection ?? this.collection;\n    let keys: Key[] = [];\n    let addKeys = (key: Key | null) => {\n      while (key != null) {\n        if (this.canSelectItemIn(key, collection)) {\n          let item = collection.getItem(key);\n          if (item?.type === 'item') {\n            keys.push(key);\n          }\n\n          // Add child keys. If cell selection is allowed, then include item children too.\n          if (item?.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) {\n            addKeys(getFirstItem(getChildNodes(item, collection))?.key ?? null);\n          }\n        }\n\n        key = collection.getKeyAfter(key);\n      }\n    };\n\n    addKeys(collection.getFirstKey());\n    return keys;\n  }\n\n  /**\n   * Selects all items in the collection.\n   */\n  selectAll(): void {\n    if (!this.isSelectAll && this.selectionMode === 'multiple') {\n      this.state.setSelectedKeys('all');\n    }\n  }\n\n  /**\n   * Removes all keys from the selection.\n   */\n  clearSelection(): void {\n    if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {\n      this.state.setSelectedKeys(new Selection());\n    }\n  }\n\n  /**\n   * Toggles between select all and an empty selection.\n   */\n  toggleSelectAll(): void {\n    if (this.isSelectAll) {\n      this.clearSelection();\n    } else {\n      this.selectAll();\n    }\n  }\n\n  select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void {\n    if (this.selectionMode === 'none') {\n      return;\n    }\n\n    if (this.selectionMode === 'single') {\n      if (this.isSelected(key) && !this.disallowEmptySelection) {\n        this.toggleSelection(key);\n      } else {\n        this.replaceSelection(key);\n      }\n    } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {\n      // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n      this.toggleSelection(key);\n    } else {\n      this.replaceSelection(key);\n    }\n  }\n\n  /**\n   * Returns whether the current selection is equal to the given selection.\n   */\n  isSelectionEqual(selection: Set<Key>): boolean {\n    if (selection === this.state.selectedKeys) {\n      return true;\n    }\n\n    // Check if the set of keys match.\n    let selectedKeys = this.selectedKeys;\n    if (selection.size !== selectedKeys.size) {\n      return false;\n    }\n\n    for (let key of selection) {\n      if (!selectedKeys.has(key)) {\n        return false;\n      }\n    }\n\n    for (let key of selectedKeys) {\n      if (!selection.has(key)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  canSelectItem(key: Key): boolean {\n    return this.canSelectItemIn(key, this.collection);\n  }\n\n  private canSelectItemIn(key: Key, collection: Collection<Node<unknown>>): boolean {\n    if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n      return false;\n    }\n\n    let item = collection.getItem(key);\n    if (!item || item?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  isDisabled(key: Key): boolean {\n    return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n  }\n\n  isLink(key: Key): boolean {\n    return !!this.collection.getItem(key)?.props?.href;\n  }\n\n  getItemProps(key: Key): any {\n    return this.collection.getItem(key)?.props;\n  }\n\n  withCollection(collection: Collection<Node<unknown>>): SelectionManager {\n    return new SelectionManager(collection, this.state, {\n      allowsCellSelection: this.allowsCellSelection,\n      layoutDelegate: this.layoutDelegate || undefined,\n      fullCollection: this.fullCollection ?? this.collection\n    });\n  }\n}\n"],"names":[],"version":3,"file":"SelectionManager.cjs.map"}