@react-stately/selection 3.6.1 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"mappings":"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","sources":["./packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/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 {Key} from 'react';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key;\n currentKey: Key;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key, currentKey?: Key) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey || keys.anchorKey;\n this.currentKey = currentKey || keys.currentKey;\n } else {\n this.anchorKey = anchorKey;\n this.currentKey = currentKey;\n }\n }\n}\n","/*\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 {Key, useMemo, useRef, useState} from 'react';\nimport {MultipleSelection, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '@react-stately/utils';\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef(null);\n let childFocusStrategyRef = useRef(null);\n let [, setFocusedKey] = useState(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys,\n disabledKeys: disabledKeysProp\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key>, defaultValue?: Selection): 'all' | Selection {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\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 {Collection, FocusStrategy, Selection as ISelection, Node, PressEvent, SelectionMode} from '@react-types/shared';\nimport {Key} from 'react';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n private collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean;\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 }\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 * 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) {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key {\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 {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key, childFocusStrategy?: FocusStrategy) {\n this.state.setFocusedKey(key, childFocusStrategy);\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) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? !this.state.disabledKeys.has(key)\n : this.state.selectedKeys.has(key);\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?.index < first.index) {\n first = item;\n }\n }\n\n return first?.key;\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?.index > last.index) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\n toKey = this.getKey(toKey);\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([toKey], toKey, toKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey || toKey;\n selection = new Selection(selectedKeys, anchorKey, toKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey || toKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(toKey, anchorKey)) {\n if (!this.state.disabledKeys.has(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 (fromItem.index <= toItem.index) {\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 let keys: Key[] = [];\n let key = from;\n while (key) {\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.type !== 'item' && item.parentKey) {\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) {\n key = this.getKey(key);\n if (key == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(key)) {\n keys.delete(key);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else {\n keys.add(key);\n keys.anchorKey = key;\n keys.currentKey = key;\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) {\n key = this.getKey(key);\n if (key == null) {\n return;\n }\n\n this.state.setSelectedKeys(new Selection([key], key, key));\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n key = this.getKey(key);\n if (key != null) {\n selection.add(key);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n let keys: Key[] = [];\n let addKeys = (key: Key) => {\n while (key) {\n if (!this.state.disabledKeys.has(key)) {\n let item = this.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([...item.childNodes][0].key);\n }\n }\n\n key = this.collection.getKeyAfter(key);\n }\n };\n\n addKeys(this.collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll() {\n if (this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection() {\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() {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | PointerEvent) {\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 (e && e.shiftKey) {\n this.extendSelection(key);\n } else {\n this.toggleSelection(key);\n }\n }\n\n /**\n * Returns whether the current selection is equal to the given selection.\n */\n isSelectionEqual(selection: Set<Key>) {\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"],"names":["Selection","Set","constructor","keys","anchorKey","currentKey","useMultipleSelectionState","props","selectionMode","disallowEmptySelection","isFocusedRef","useRef","setFocused","useState","focusedKeyRef","childFocusStrategyRef","setFocusedKey","selectedKeysProp","useMemo","convertSelection","selectedKeys","defaultSelectedKeys","setSelectedKeys","useControlledState","onSelectionChange","disabledKeysProp","disabledKeys","isFocused","current","f","focusedKey","childFocusStrategy","k","selection","defaultValue","SelectionManager","collection","state","options","allowsCellSelection","_isSelectAll","key","getSelectAllKeys","rawSelection","isSelected","getKey","has","isEmpty","size","isSelectAll","allKeys","every","firstSelectedKey","first","item","getItem","index","lastSelectedKey","last","extendSelection","toKey","getKeyRange","delete","add","from","to","fromItem","toItem","getKeyRangeInternal","type","push","getKeyAfter","parentKey","toggleSelection","replaceSelection","addKeys","hasChildNodes","childNodes","getFirstKey","selectAll","clearSelection","toggleSelectAll","select","e","shiftKey","isSelectionEqual"],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/selection/src/index.ts","packages/@react-stately/selection/src/useMultipleSelectionState.ts","packages/@react-stately/selection/src/Selection.ts","packages/@react-stately/selection/src/SelectionManager.ts","packages/@react-stately/selection/src/types.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\nexport * from './useMultipleSelectionState';\nexport * from './SelectionManager';\nexport * from './types';\n","/*\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 {Key, useMemo, useRef, useState} from 'react';\nimport {MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '@react-stately/utils';\n\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection,\n allowDuplicateSelectionEvents\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef(null);\n let childFocusStrategyRef = useRef(null);\n let [, setFocusedKey] = useState(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key>, defaultValue?: Selection): 'all' | Selection {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\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 {Key} from 'react';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key;\n currentKey: Key;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key, currentKey?: Key) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey || keys.anchorKey;\n this.currentKey = currentKey || keys.currentKey;\n } else {\n this.anchorKey = anchorKey;\n this.currentKey = currentKey;\n }\n }\n}\n","/*\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,\n FocusStrategy,\n Selection as ISelection,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {Key} from 'react';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n private collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean;\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 }\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) {\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) {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key {\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 {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key, childFocusStrategy?: FocusStrategy) {\n this.state.setFocusedKey(key, childFocusStrategy);\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) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? !this.state.disabledKeys.has(key)\n : this.state.selectedKeys.has(key);\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?.index < first.index) {\n first = item;\n }\n }\n\n return first?.key;\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?.index > last.index) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.replaceSelection(toKey);\n return;\n }\n\n toKey = this.getKey(toKey);\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([toKey], toKey, toKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey || toKey;\n selection = new Selection(selectedKeys, anchorKey, toKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey || toKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(toKey, anchorKey)) {\n if (!this.state.disabledKeys.has(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 (fromItem.index <= toItem.index) {\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 let keys: Key[] = [];\n let key = from;\n while (key) {\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.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) {\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 key = this.getKey(key);\n if (key == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(key)) {\n keys.delete(key);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else {\n keys.add(key);\n keys.anchorKey = key;\n keys.currentKey = key;\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) {\n if (this.selectionMode === 'none') {\n return;\n }\n\n key = this.getKey(key);\n if (key == null) {\n return;\n }\n\n this.state.setSelectedKeys(new Selection([key], key, key));\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n key = this.getKey(key);\n if (key != null) {\n selection.add(key);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n let keys: Key[] = [];\n let addKeys = (key: Key) => {\n while (key) {\n if (!this.state.disabledKeys.has(key)) {\n let item = this.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([...item.childNodes][0].key);\n }\n }\n\n key = this.collection.getKeyAfter(key);\n }\n };\n\n addKeys(this.collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll() {\n if (this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection() {\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() {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent) {\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>) {\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) {\n if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n return false;\n }\n\n let item = this.collection.getItem(key);\n if (!item || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n}\n","/*\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 {FocusStrategy, LongPressEvent, PressEvent, Selection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {Key} from 'react';\n\nexport interface FocusState {\n /** Whether the collection is currently focused. */\n readonly isFocused: boolean,\n /** Sets whether the collection is focused. */\n setFocused(isFocused: boolean): void,\n /** The current focused key in the collection. */\n readonly focusedKey: Key,\n /** Whether the first or last child of the focused key should receive focus. */\n readonly childFocusStrategy: FocusStrategy,\n /** Sets the focused key, and optionally, whether the first or last child of that key should receive focus. */\n setFocusedKey(key: Key, child?: FocusStrategy): void\n}\n\nexport interface SingleSelectionState extends FocusState {\n /** Whether the collection allows empty selection. */\n readonly disallowEmptySelection?: boolean,\n /** The currently selected key in the collection. */\n readonly selectedKey: Key,\n /** Sets the selected key in the collection. */\n setSelectedKey(key: Key): void\n}\n\nexport interface MultipleSelectionState extends FocusState {\n /** The type of selection that is allowed in the collection. */\n readonly selectionMode: SelectionMode,\n /** The selection behavior for the collection. */\n readonly selectionBehavior: SelectionBehavior,\n /** Sets the selection behavior for the collection. */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void,\n /** Whether the collection allows empty selection. */\n readonly disallowEmptySelection: boolean,\n /** The currently selected keys in the collection. */\n readonly selectedKeys: Selection,\n /** Sets the selected keys in the collection. */\n setSelectedKeys(keys: Selection): void,\n /** The currently disabled keys in the collection. */\n readonly disabledKeys: Set<Key>\n}\n\nexport interface MultipleSelectionManager extends FocusState {\n /** The type of selection that is allowed in the collection. */\n readonly selectionMode: SelectionMode,\n /** The selection behavior for the collection. */\n readonly selectionBehavior: SelectionBehavior,\n /** Whether the collection allows empty selection. */\n readonly disallowEmptySelection?: boolean,\n /** The currently selected keys in the collection. */\n readonly selectedKeys: Set<Key>,\n /** Whether the selection is empty. */\n readonly isEmpty: boolean,\n /** Whether all items in the collection are selected. */\n readonly isSelectAll: boolean,\n /** The first selected key in the collection. */\n readonly firstSelectedKey: Key | null,\n /** The last selected key in the collection. */\n readonly lastSelectedKey: Key | null,\n /** Returns whether a key is selected. */\n isSelected(key: Key): boolean,\n /** Returns whether the current selection is equal to the given selection. */\n isSelectionEqual(selection: Set<Key>): boolean,\n /** Extends the selection to the given key. */\n extendSelection(toKey: Key): void,\n /** Toggles whether the given key is selected. */\n toggleSelection(key: Key): void,\n /** Replaces the selection with only the given key. */\n replaceSelection(key: Key): void,\n /** Replaces the selection with the given keys. */\n setSelectedKeys(keys: Iterable<Key>): void,\n /** Selects all items in the collection. */\n selectAll(): void,\n /** Removes all keys from the selection. */\n clearSelection(): void,\n /** Toggles between select all and an empty selection. */\n toggleSelectAll(): void,\n /**\n * Toggles, replaces, or extends selection to the given key depending\n * on the pointer event and collection's selection mode.\n */\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void,\n /** Returns whether the given key can be selected. */\n canSelectItem(key: Key): boolean,\n /** Sets the selection behavior for the collection. */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void\n}\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FocusStrategy, PressEvent, Selection, SelectionMode, MultipleSelection, Collection, Node } from "@react-types/shared";
1
+ import { FocusStrategy, LongPressEvent, PressEvent, Selection, SelectionBehavior, SelectionMode, MultipleSelection, Collection, Node } from "@react-types/shared";
2
2
  import { Key } from "react";
3
3
  export interface FocusState {
4
4
  /** Whether the collection is currently focused. */
@@ -23,18 +23,24 @@ export interface SingleSelectionState extends FocusState {
23
23
  export interface MultipleSelectionState extends FocusState {
24
24
  /** The type of selection that is allowed in the collection. */
25
25
  readonly selectionMode: SelectionMode;
26
+ /** The selection behavior for the collection. */
27
+ readonly selectionBehavior: SelectionBehavior;
28
+ /** Sets the selection behavior for the collection. */
29
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
26
30
  /** Whether the collection allows empty selection. */
27
31
  readonly disallowEmptySelection: boolean;
28
32
  /** The currently selected keys in the collection. */
29
33
  readonly selectedKeys: Selection;
30
34
  /** Sets the selected keys in the collection. */
31
- setSelectedKeys(keys: Selection | ((v: Selection) => Selection)): void;
35
+ setSelectedKeys(keys: Selection): void;
32
36
  /** The currently disabled keys in the collection. */
33
37
  readonly disabledKeys: Set<Key>;
34
38
  }
35
39
  export interface MultipleSelectionManager extends FocusState {
36
40
  /** The type of selection that is allowed in the collection. */
37
41
  readonly selectionMode: SelectionMode;
42
+ /** The selection behavior for the collection. */
43
+ readonly selectionBehavior: SelectionBehavior;
38
44
  /** Whether the collection allows empty selection. */
39
45
  readonly disallowEmptySelection?: boolean;
40
46
  /** The currently selected keys in the collection. */
@@ -69,12 +75,22 @@ export interface MultipleSelectionManager extends FocusState {
69
75
  * Toggles, replaces, or extends selection to the given key depending
70
76
  * on the pointer event and collection's selection mode.
71
77
  */
72
- select(key: Key, e?: PressEvent | PointerEvent): void;
78
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void;
79
+ /** Returns whether the given key can be selected. */
80
+ canSelectItem(key: Key): boolean;
81
+ /** Sets the selection behavior for the collection. */
82
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
83
+ }
84
+ export interface MultipleSelectionStateProps extends MultipleSelection {
85
+ /** How multiple selection should behave in the collection. */
86
+ selectionBehavior?: SelectionBehavior;
87
+ /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */
88
+ allowDuplicateSelectionEvents?: boolean;
73
89
  }
74
90
  /**
75
91
  * Manages state for multiple selection and focus in a collection.
76
92
  */
77
- export function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState;
93
+ export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState;
78
94
  interface SelectionManagerOptions {
79
95
  allowsCellSelection?: boolean;
80
96
  }
@@ -91,6 +107,14 @@ export class SelectionManager implements MultipleSelectionManager {
91
107
  * Whether the collection allows empty selection.
92
108
  */
93
109
  get disallowEmptySelection(): boolean;
110
+ /**
111
+ * The selection behavior for the collection.
112
+ */
113
+ get selectionBehavior(): SelectionBehavior;
114
+ /**
115
+ * Sets the selection behavior for the collection.
116
+ */
117
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
94
118
  /**
95
119
  * Whether the collection is currently focused.
96
120
  */
@@ -160,11 +184,12 @@ export class SelectionManager implements MultipleSelectionManager {
160
184
  * Toggles between select all and an empty selection.
161
185
  */
162
186
  toggleSelectAll(): void;
163
- select(key: Key, e?: PressEvent | PointerEvent): void;
187
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void;
164
188
  /**
165
189
  * Returns whether the current selection is equal to the given selection.
166
190
  */
167
191
  isSelectionEqual(selection: Set<Key>): boolean;
192
+ canSelectItem(key: Key): boolean;
168
193
  }
169
194
 
170
195
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["./packages/@react-stately/selection/src/packages/@react-stately/selection/src/types.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/SelectionManager.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/index.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/selection/src/packages/@react-stately/selection/src/types.ts","packages/@react-stately/selection/src/packages/@react-stately/selection/src/Selection.ts","packages/@react-stately/selection/src/packages/@react-stately/selection/src/useMultipleSelectionState.ts","packages/@react-stately/selection/src/packages/@react-stately/selection/src/SelectionManager.ts","packages/@react-stately/selection/src/packages/@react-stately/selection/src/index.ts","packages/@react-stately/selection/src/index.ts"],"sourcesContent":[null,null,null,null,null,"/*\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\nexport * from './useMultipleSelectionState';\nexport * from './SelectionManager';\nexport * from './types';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-stately/selection",
3
- "version": "3.6.1",
3
+ "version": "3.9.1",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -18,9 +18,9 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@babel/runtime": "^7.6.2",
21
- "@react-stately/collections": "^3.3.2",
22
- "@react-stately/utils": "^3.2.1",
23
- "@react-types/shared": "^3.7.0"
21
+ "@react-stately/collections": "^3.3.5",
22
+ "@react-stately/utils": "^3.4.0",
23
+ "@react-types/shared": "^3.11.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "react": "^16.8.0 || ^17.0.0-rc.1"
@@ -28,5 +28,5 @@
28
28
  "publishConfig": {
29
29
  "access": "public"
30
30
  },
31
- "gitHead": "2c7164335bcbadf2382d1f984859cc620dc00cc7"
31
+ "gitHead": "54c2366c4f31bd4bf619126131cd583c12972acc"
32
32
  }
@@ -10,7 +10,16 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {Collection, FocusStrategy, Selection as ISelection, Node, PressEvent, SelectionMode} from '@react-types/shared';
13
+ import {
14
+ Collection,
15
+ FocusStrategy,
16
+ Selection as ISelection,
17
+ LongPressEvent,
18
+ Node,
19
+ PressEvent,
20
+ SelectionBehavior,
21
+ SelectionMode
22
+ } from '@react-types/shared';
14
23
  import {Key} from 'react';
15
24
  import {MultipleSelectionManager, MultipleSelectionState} from './types';
16
25
  import {Selection} from './Selection';
@@ -49,6 +58,20 @@ export class SelectionManager implements MultipleSelectionManager {
49
58
  return this.state.disallowEmptySelection;
50
59
  }
51
60
 
61
+ /**
62
+ * The selection behavior for the collection.
63
+ */
64
+ get selectionBehavior(): SelectionBehavior {
65
+ return this.state.selectionBehavior;
66
+ }
67
+
68
+ /**
69
+ * Sets the selection behavior for the collection.
70
+ */
71
+ setSelectionBehavior(selectionBehavior: SelectionBehavior) {
72
+ this.state.setSelectionBehavior(selectionBehavior);
73
+ }
74
+
52
75
  /**
53
76
  * Whether the collection is currently focused.
54
77
  */
@@ -170,6 +193,15 @@ export class SelectionManager implements MultipleSelectionManager {
170
193
  * Extends the selection to the given key.
171
194
  */
172
195
  extendSelection(toKey: Key) {
196
+ if (this.selectionMode === 'none') {
197
+ return;
198
+ }
199
+
200
+ if (this.selectionMode === 'single') {
201
+ this.replaceSelection(toKey);
202
+ return;
203
+ }
204
+
173
205
  toKey = this.getKey(toKey);
174
206
 
175
207
  let selection: Selection;
@@ -241,7 +273,7 @@ export class SelectionManager implements MultipleSelectionManager {
241
273
  }
242
274
 
243
275
  // Find a parent item to select
244
- while (item.type !== 'item' && item.parentKey) {
276
+ while (item.type !== 'item' && item.parentKey != null) {
245
277
  item = this.collection.getItem(item.parentKey);
246
278
  }
247
279
 
@@ -256,6 +288,15 @@ export class SelectionManager implements MultipleSelectionManager {
256
288
  * Toggles whether the given key is selected.
257
289
  */
258
290
  toggleSelection(key: Key) {
291
+ if (this.selectionMode === 'none') {
292
+ return;
293
+ }
294
+
295
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
296
+ this.replaceSelection(key);
297
+ return;
298
+ }
299
+
259
300
  key = this.getKey(key);
260
301
  if (key == null) {
261
302
  return;
@@ -283,6 +324,10 @@ export class SelectionManager implements MultipleSelectionManager {
283
324
  * Replaces the selection with only the given key.
284
325
  */
285
326
  replaceSelection(key: Key) {
327
+ if (this.selectionMode === 'none') {
328
+ return;
329
+ }
330
+
286
331
  key = this.getKey(key);
287
332
  if (key == null) {
288
333
  return;
@@ -366,7 +411,7 @@ export class SelectionManager implements MultipleSelectionManager {
366
411
  }
367
412
  }
368
413
 
369
- select(key: Key, e?: PressEvent | PointerEvent) {
414
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent) {
370
415
  if (this.selectionMode === 'none') {
371
416
  return;
372
417
  }
@@ -377,10 +422,11 @@ export class SelectionManager implements MultipleSelectionManager {
377
422
  } else {
378
423
  this.replaceSelection(key);
379
424
  }
380
- } else if (e && e.shiftKey) {
381
- this.extendSelection(key);
382
- } else {
425
+ } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {
426
+ // 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
383
427
  this.toggleSelection(key);
428
+ } else {
429
+ this.replaceSelection(key);
384
430
  }
385
431
  }
386
432
 
@@ -412,4 +458,17 @@ export class SelectionManager implements MultipleSelectionManager {
412
458
 
413
459
  return true;
414
460
  }
461
+
462
+ canSelectItem(key: Key) {
463
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {
464
+ return false;
465
+ }
466
+
467
+ let item = this.collection.getItem(key);
468
+ if (!item || (item.type === 'cell' && !this.allowsCellSelection)) {
469
+ return false;
470
+ }
471
+
472
+ return true;
473
+ }
415
474
  }
package/src/types.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {FocusStrategy, PressEvent, Selection, SelectionMode} from '@react-types/shared';
13
+ import {FocusStrategy, LongPressEvent, PressEvent, Selection, SelectionBehavior, SelectionMode} from '@react-types/shared';
14
14
  import {Key} from 'react';
15
15
 
16
16
  export interface FocusState {
@@ -38,12 +38,16 @@ export interface SingleSelectionState extends FocusState {
38
38
  export interface MultipleSelectionState extends FocusState {
39
39
  /** The type of selection that is allowed in the collection. */
40
40
  readonly selectionMode: SelectionMode,
41
+ /** The selection behavior for the collection. */
42
+ readonly selectionBehavior: SelectionBehavior,
43
+ /** Sets the selection behavior for the collection. */
44
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void,
41
45
  /** Whether the collection allows empty selection. */
42
46
  readonly disallowEmptySelection: boolean,
43
47
  /** The currently selected keys in the collection. */
44
48
  readonly selectedKeys: Selection,
45
49
  /** Sets the selected keys in the collection. */
46
- setSelectedKeys(keys: Selection | ((v: Selection) => Selection)): void,
50
+ setSelectedKeys(keys: Selection): void,
47
51
  /** The currently disabled keys in the collection. */
48
52
  readonly disabledKeys: Set<Key>
49
53
  }
@@ -51,6 +55,8 @@ export interface MultipleSelectionState extends FocusState {
51
55
  export interface MultipleSelectionManager extends FocusState {
52
56
  /** The type of selection that is allowed in the collection. */
53
57
  readonly selectionMode: SelectionMode,
58
+ /** The selection behavior for the collection. */
59
+ readonly selectionBehavior: SelectionBehavior,
54
60
  /** Whether the collection allows empty selection. */
55
61
  readonly disallowEmptySelection?: boolean,
56
62
  /** The currently selected keys in the collection. */
@@ -85,5 +91,9 @@ export interface MultipleSelectionManager extends FocusState {
85
91
  * Toggles, replaces, or extends selection to the given key depending
86
92
  * on the pointer event and collection's selection mode.
87
93
  */
88
- select(key: Key, e?: PressEvent | PointerEvent): void
94
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void,
95
+ /** Returns whether the given key can be selected. */
96
+ canSelectItem(key: Key): boolean,
97
+ /** Sets the selection behavior for the collection. */
98
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void
89
99
  }
@@ -11,18 +11,40 @@
11
11
  */
12
12
 
13
13
  import {Key, useMemo, useRef, useState} from 'react';
14
- import {MultipleSelection, SelectionMode} from '@react-types/shared';
14
+ import {MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';
15
15
  import {MultipleSelectionState} from './types';
16
16
  import {Selection} from './Selection';
17
17
  import {useControlledState} from '@react-stately/utils';
18
18
 
19
+ function equalSets(setA, setB) {
20
+ if (setA.size !== setB.size) {
21
+ return false;
22
+ }
23
+
24
+ for (let item of setA) {
25
+ if (!setB.has(item)) {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ return true;
31
+ }
32
+
33
+ export interface MultipleSelectionStateProps extends MultipleSelection {
34
+ /** How multiple selection should behave in the collection. */
35
+ selectionBehavior?: SelectionBehavior,
36
+ /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */
37
+ allowDuplicateSelectionEvents?: boolean
38
+ }
39
+
19
40
  /**
20
41
  * Manages state for multiple selection and focus in a collection.
21
42
  */
22
- export function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState {
43
+ export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {
23
44
  let {
24
45
  selectionMode = 'none' as SelectionMode,
25
- disallowEmptySelection
46
+ disallowEmptySelection,
47
+ allowDuplicateSelectionEvents
26
48
  } = props;
27
49
 
28
50
  // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
@@ -42,10 +64,19 @@ export function useMultipleSelectionState(props: MultipleSelection): MultipleSel
42
64
  let disabledKeysProp = useMemo(() =>
43
65
  props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()
44
66
  , [props.disabledKeys]);
67
+ let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');
68
+
69
+ // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
70
+ // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
71
+ if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
72
+ setSelectionBehavior('replace');
73
+ }
45
74
 
46
75
  return {
47
76
  selectionMode,
48
77
  disallowEmptySelection,
78
+ selectionBehavior,
79
+ setSelectionBehavior,
49
80
  get isFocused() {
50
81
  return isFocusedRef.current;
51
82
  },
@@ -65,7 +96,11 @@ export function useMultipleSelectionState(props: MultipleSelection): MultipleSel
65
96
  setFocusedKey(k);
66
97
  },
67
98
  selectedKeys,
68
- setSelectedKeys,
99
+ setSelectedKeys(keys) {
100
+ if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {
101
+ setSelectedKeys(keys);
102
+ }
103
+ },
69
104
  disabledKeys: disabledKeysProp
70
105
  };
71
106
  }