@react-stately/selection 3.7.0 → 3.8.0
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.
- package/dist/main.js +66 -4
- package/dist/main.js.map +1 -1
- package/dist/module.js +66 -4
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +27 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/SelectionManager.ts +65 -6
- package/src/types.ts +12 -2
- package/src/useMultipleSelectionState.ts +16 -2
package/dist/main.js
CHANGED
|
@@ -60,9 +60,18 @@ function useMultipleSelectionState(props) {
|
|
|
60
60
|
let defaultSelectedKeys = useMemo(() => $e792d6adfd95a7ce87c6dd8b719ea117$var$convertSelection(props.defaultSelectedKeys, new $cc81f14158b02e1e259a5a46d24f0c$export$Selection()), [props.defaultSelectedKeys]);
|
|
61
61
|
let [selectedKeys, setSelectedKeys] = useControlledState(selectedKeysProp, defaultSelectedKeys, props.onSelectionChange);
|
|
62
62
|
let disabledKeysProp = useMemo(() => props.disabledKeys ? new Set(props.disabledKeys) : new Set(), [props.disabledKeys]);
|
|
63
|
+
let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle'); // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
|
|
64
|
+
// to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
|
|
65
|
+
|
|
66
|
+
if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
|
|
67
|
+
setSelectionBehavior('replace');
|
|
68
|
+
}
|
|
69
|
+
|
|
63
70
|
return {
|
|
64
71
|
selectionMode,
|
|
65
72
|
disallowEmptySelection,
|
|
73
|
+
selectionBehavior,
|
|
74
|
+
setSelectionBehavior,
|
|
66
75
|
|
|
67
76
|
get isFocused() {
|
|
68
77
|
return isFocusedRef.current;
|
|
@@ -139,6 +148,22 @@ class SelectionManager {
|
|
|
139
148
|
get disallowEmptySelection() {
|
|
140
149
|
return this.state.disallowEmptySelection;
|
|
141
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* The selection behavior for the collection.
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
get selectionBehavior() {
|
|
157
|
+
return this.state.selectionBehavior;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Sets the selection behavior for the collection.
|
|
161
|
+
*/
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
setSelectionBehavior(selectionBehavior) {
|
|
165
|
+
this.state.setSelectionBehavior(selectionBehavior);
|
|
166
|
+
}
|
|
142
167
|
/**
|
|
143
168
|
* Whether the collection is currently focused.
|
|
144
169
|
*/
|
|
@@ -276,6 +301,15 @@ class SelectionManager {
|
|
|
276
301
|
|
|
277
302
|
|
|
278
303
|
extendSelection(toKey) {
|
|
304
|
+
if (this.selectionMode === 'none') {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (this.selectionMode === 'single') {
|
|
309
|
+
this.replaceSelection(toKey);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
279
313
|
toKey = this.getKey(toKey);
|
|
280
314
|
let selection; // Only select the one key if coming from a select all.
|
|
281
315
|
|
|
@@ -350,7 +384,7 @@ class SelectionManager {
|
|
|
350
384
|
} // Find a parent item to select
|
|
351
385
|
|
|
352
386
|
|
|
353
|
-
while (item.type !== 'item' && item.parentKey) {
|
|
387
|
+
while (item.type !== 'item' && item.parentKey != null) {
|
|
354
388
|
item = this.collection.getItem(item.parentKey);
|
|
355
389
|
}
|
|
356
390
|
|
|
@@ -366,6 +400,15 @@ class SelectionManager {
|
|
|
366
400
|
|
|
367
401
|
|
|
368
402
|
toggleSelection(key) {
|
|
403
|
+
if (this.selectionMode === 'none') {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (this.selectionMode === 'single' && !this.isSelected(key)) {
|
|
408
|
+
this.replaceSelection(key);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
|
|
369
412
|
key = this.getKey(key);
|
|
370
413
|
|
|
371
414
|
if (key == null) {
|
|
@@ -395,6 +438,10 @@ class SelectionManager {
|
|
|
395
438
|
|
|
396
439
|
|
|
397
440
|
replaceSelection(key) {
|
|
441
|
+
if (this.selectionMode === 'none') {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
|
|
398
445
|
key = this.getKey(key);
|
|
399
446
|
|
|
400
447
|
if (key == null) {
|
|
@@ -499,10 +546,11 @@ class SelectionManager {
|
|
|
499
546
|
} else {
|
|
500
547
|
this.replaceSelection(key);
|
|
501
548
|
}
|
|
502
|
-
} else if (e && e.
|
|
503
|
-
|
|
504
|
-
} else {
|
|
549
|
+
} else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) {
|
|
550
|
+
// 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
|
|
505
551
|
this.toggleSelection(key);
|
|
552
|
+
} else {
|
|
553
|
+
this.replaceSelection(key);
|
|
506
554
|
}
|
|
507
555
|
}
|
|
508
556
|
/**
|
|
@@ -537,6 +585,20 @@ class SelectionManager {
|
|
|
537
585
|
return true;
|
|
538
586
|
}
|
|
539
587
|
|
|
588
|
+
canSelectItem(key) {
|
|
589
|
+
if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
let item = this.collection.getItem(key);
|
|
594
|
+
|
|
595
|
+
if (!item || item.type === 'cell' && !this.allowsCellSelection) {
|
|
596
|
+
return false;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
return true;
|
|
600
|
+
}
|
|
601
|
+
|
|
540
602
|
}
|
|
541
603
|
|
|
542
604
|
exports.SelectionManager = SelectionManager;
|
package/dist/main.js.map
CHANGED
|
@@ -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":"main.js.map"}
|
|
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, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '@react-stately/utils';\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: SelectionBehavior\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 } = 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,\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 {\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"],"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","selectionBehavior","setSelectionBehavior","size","isFocused","current","f","focusedKey","childFocusStrategy","k","selection","defaultValue","SelectionManager","collection","state","options","allowsCellSelection","_isSelectAll","key","getSelectAllKeys","rawSelection","isSelected","getKey","has","isEmpty","isSelectAll","allKeys","every","firstSelectedKey","first","item","getItem","index","lastSelectedKey","last","extendSelection","toKey","replaceSelection","getKeyRange","delete","add","from","to","fromItem","toItem","getKeyRangeInternal","type","push","getKeyAfter","parentKey","toggleSelection","addKeys","hasChildNodes","childNodes","getFirstKey","selectAll","clearSelection","toggleSelectAll","select","e","pointerType","isSelectionEqual","canSelectItem"],"version":3,"file":"main.js.map"}
|
package/dist/module.js
CHANGED
|
@@ -53,9 +53,18 @@ export function useMultipleSelectionState(props) {
|
|
|
53
53
|
let defaultSelectedKeys = useMemo(() => $c86d35e876e048ac11515eee40c7$var$convertSelection(props.defaultSelectedKeys, new $c91e86e24f2dc9a2182dcc2674c58c$export$Selection()), [props.defaultSelectedKeys]);
|
|
54
54
|
let [selectedKeys, setSelectedKeys] = useControlledState(selectedKeysProp, defaultSelectedKeys, props.onSelectionChange);
|
|
55
55
|
let disabledKeysProp = useMemo(() => props.disabledKeys ? new Set(props.disabledKeys) : new Set(), [props.disabledKeys]);
|
|
56
|
+
let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle'); // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
|
|
57
|
+
// to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
|
|
58
|
+
|
|
59
|
+
if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
|
|
60
|
+
setSelectionBehavior('replace');
|
|
61
|
+
}
|
|
62
|
+
|
|
56
63
|
return {
|
|
57
64
|
selectionMode,
|
|
58
65
|
disallowEmptySelection,
|
|
66
|
+
selectionBehavior,
|
|
67
|
+
setSelectionBehavior,
|
|
59
68
|
|
|
60
69
|
get isFocused() {
|
|
61
70
|
return isFocusedRef.current;
|
|
@@ -130,6 +139,22 @@ export class SelectionManager {
|
|
|
130
139
|
get disallowEmptySelection() {
|
|
131
140
|
return this.state.disallowEmptySelection;
|
|
132
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* The selection behavior for the collection.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
get selectionBehavior() {
|
|
148
|
+
return this.state.selectionBehavior;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Sets the selection behavior for the collection.
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
setSelectionBehavior(selectionBehavior) {
|
|
156
|
+
this.state.setSelectionBehavior(selectionBehavior);
|
|
157
|
+
}
|
|
133
158
|
/**
|
|
134
159
|
* Whether the collection is currently focused.
|
|
135
160
|
*/
|
|
@@ -267,6 +292,15 @@ export class SelectionManager {
|
|
|
267
292
|
|
|
268
293
|
|
|
269
294
|
extendSelection(toKey) {
|
|
295
|
+
if (this.selectionMode === 'none') {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (this.selectionMode === 'single') {
|
|
300
|
+
this.replaceSelection(toKey);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
270
304
|
toKey = this.getKey(toKey);
|
|
271
305
|
let selection; // Only select the one key if coming from a select all.
|
|
272
306
|
|
|
@@ -341,7 +375,7 @@ export class SelectionManager {
|
|
|
341
375
|
} // Find a parent item to select
|
|
342
376
|
|
|
343
377
|
|
|
344
|
-
while (item.type !== 'item' && item.parentKey) {
|
|
378
|
+
while (item.type !== 'item' && item.parentKey != null) {
|
|
345
379
|
item = this.collection.getItem(item.parentKey);
|
|
346
380
|
}
|
|
347
381
|
|
|
@@ -357,6 +391,15 @@ export class SelectionManager {
|
|
|
357
391
|
|
|
358
392
|
|
|
359
393
|
toggleSelection(key) {
|
|
394
|
+
if (this.selectionMode === 'none') {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
if (this.selectionMode === 'single' && !this.isSelected(key)) {
|
|
399
|
+
this.replaceSelection(key);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
|
|
360
403
|
key = this.getKey(key);
|
|
361
404
|
|
|
362
405
|
if (key == null) {
|
|
@@ -386,6 +429,10 @@ export class SelectionManager {
|
|
|
386
429
|
|
|
387
430
|
|
|
388
431
|
replaceSelection(key) {
|
|
432
|
+
if (this.selectionMode === 'none') {
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
389
436
|
key = this.getKey(key);
|
|
390
437
|
|
|
391
438
|
if (key == null) {
|
|
@@ -490,10 +537,11 @@ export class SelectionManager {
|
|
|
490
537
|
} else {
|
|
491
538
|
this.replaceSelection(key);
|
|
492
539
|
}
|
|
493
|
-
} else if (e && e.
|
|
494
|
-
|
|
495
|
-
} else {
|
|
540
|
+
} else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) {
|
|
541
|
+
// 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
|
|
496
542
|
this.toggleSelection(key);
|
|
543
|
+
} else {
|
|
544
|
+
this.replaceSelection(key);
|
|
497
545
|
}
|
|
498
546
|
}
|
|
499
547
|
/**
|
|
@@ -528,5 +576,19 @@ export class SelectionManager {
|
|
|
528
576
|
return true;
|
|
529
577
|
}
|
|
530
578
|
|
|
579
|
+
canSelectItem(key) {
|
|
580
|
+
if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
let item = this.collection.getItem(key);
|
|
585
|
+
|
|
586
|
+
if (!item || item.type === 'cell' && !this.allowsCellSelection) {
|
|
587
|
+
return false;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
return true;
|
|
591
|
+
}
|
|
592
|
+
|
|
531
593
|
}
|
|
532
594
|
//# sourceMappingURL=module.js.map
|
package/dist/module.js.map
CHANGED
|
@@ -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/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, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '@react-stately/utils';\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: SelectionBehavior\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 } = 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,\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 {\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"],"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","selectionBehavior","setSelectionBehavior","size","isFocused","current","f","focusedKey","childFocusStrategy","k","selection","defaultValue","SelectionManager","collection","state","options","allowsCellSelection","_isSelectAll","key","getSelectAllKeys","rawSelection","isSelected","getKey","has","isEmpty","isSelectAll","allKeys","every","firstSelectedKey","first","item","getItem","index","lastSelectedKey","last","extendSelection","toKey","replaceSelection","getKeyRange","delete","add","from","to","fromItem","toItem","getKeyRangeInternal","type","push","getKeyAfter","parentKey","toggleSelection","addKeys","hasChildNodes","childNodes","getFirstKey","selectAll","clearSelection","toggleSelectAll","select","e","pointerType","isSelectionEqual","canSelectItem"],"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,6 +23,10 @@ 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. */
|
|
@@ -35,6 +39,8 @@ export interface MultipleSelectionState extends FocusState {
|
|
|
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,20 @@ 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;
|
|
73
87
|
}
|
|
74
88
|
/**
|
|
75
89
|
* Manages state for multiple selection and focus in a collection.
|
|
76
90
|
*/
|
|
77
|
-
export function useMultipleSelectionState(props:
|
|
91
|
+
export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState;
|
|
78
92
|
interface SelectionManagerOptions {
|
|
79
93
|
allowsCellSelection?: boolean;
|
|
80
94
|
}
|
|
@@ -91,6 +105,14 @@ export class SelectionManager implements MultipleSelectionManager {
|
|
|
91
105
|
* Whether the collection allows empty selection.
|
|
92
106
|
*/
|
|
93
107
|
get disallowEmptySelection(): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* The selection behavior for the collection.
|
|
110
|
+
*/
|
|
111
|
+
get selectionBehavior(): SelectionBehavior;
|
|
112
|
+
/**
|
|
113
|
+
* Sets the selection behavior for the collection.
|
|
114
|
+
*/
|
|
115
|
+
setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
|
|
94
116
|
/**
|
|
95
117
|
* Whether the collection is currently focused.
|
|
96
118
|
*/
|
|
@@ -160,11 +182,12 @@ export class SelectionManager implements MultipleSelectionManager {
|
|
|
160
182
|
* Toggles between select all and an empty selection.
|
|
161
183
|
*/
|
|
162
184
|
toggleSelectAll(): void;
|
|
163
|
-
select(key: Key, e?: PressEvent | PointerEvent): void;
|
|
185
|
+
select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void;
|
|
164
186
|
/**
|
|
165
187
|
* Returns whether the current selection is equal to the given selection.
|
|
166
188
|
*/
|
|
167
189
|
isSelectionEqual(selection: Set<Key>): boolean;
|
|
190
|
+
canSelectItem(key: Key): boolean;
|
|
168
191
|
}
|
|
169
192
|
|
|
170
193
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"A;A;AAeA;IACE,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC;IAC3C,8GAA8G;IAC9G,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CACrD;AAED,qCAAsC,SAAQ,UAAU;IACtD,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;IAC1B,+CAA+C;IAC/C,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;CAC/B;AAED,uCAAwC,SAAQ,UAAU;IACxD,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,gDAAgD;IAChD,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC;IACvE,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;CAChC;AAED,yCAA0C,SAAQ,UAAU;IAC1D,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAAC;IACtC,+CAA+C;IAC/C,QAAQ,CAAC,eAAe,EAAE,GAAG,GAAG,IAAI,CAAC;IACrC,yCAAyC;IACzC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC/C,8CAA8C;IAC9C,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClC,iDAAiD;IACjD,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChC,sDAAsD;IACtD,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACjC,kDAAkD;IAClD,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAC3C,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAClB,2CAA2C;IAC3C,cAAc,IAAI,IAAI,CAAC;IACvB,yDAAyD;IACzD,eAAe,IAAI,IAAI,CAAC;IACxB;A;A;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAAA;
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-stately/selection",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.8.0",
|
|
4
4
|
"description": "Spectrum UI components in React",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@babel/runtime": "^7.6.2",
|
|
21
21
|
"@react-stately/collections": "^3.3.3",
|
|
22
|
-
"@react-stately/utils": "^3.
|
|
23
|
-
"@react-types/shared": "^3.
|
|
22
|
+
"@react-stately/utils": "^3.3.0",
|
|
23
|
+
"@react-types/shared": "^3.10.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": "
|
|
31
|
+
"gitHead": "896eabe5521a0349a675c4773ed7629addd4b8c4"
|
|
32
32
|
}
|
package/src/SelectionManager.ts
CHANGED
|
@@ -10,7 +10,16 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
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.
|
|
381
|
-
|
|
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,6 +38,10 @@ 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. */
|
|
@@ -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,15 +11,20 @@
|
|
|
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
|
+
export interface MultipleSelectionStateProps extends MultipleSelection {
|
|
20
|
+
/** How multiple selection should behave in the collection. */
|
|
21
|
+
selectionBehavior?: SelectionBehavior
|
|
22
|
+
}
|
|
23
|
+
|
|
19
24
|
/**
|
|
20
25
|
* Manages state for multiple selection and focus in a collection.
|
|
21
26
|
*/
|
|
22
|
-
export function useMultipleSelectionState(props:
|
|
27
|
+
export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {
|
|
23
28
|
let {
|
|
24
29
|
selectionMode = 'none' as SelectionMode,
|
|
25
30
|
disallowEmptySelection
|
|
@@ -42,10 +47,19 @@ export function useMultipleSelectionState(props: MultipleSelection): MultipleSel
|
|
|
42
47
|
let disabledKeysProp = useMemo(() =>
|
|
43
48
|
props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()
|
|
44
49
|
, [props.disabledKeys]);
|
|
50
|
+
let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');
|
|
51
|
+
|
|
52
|
+
// If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
|
|
53
|
+
// to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
|
|
54
|
+
if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
|
|
55
|
+
setSelectionBehavior('replace');
|
|
56
|
+
}
|
|
45
57
|
|
|
46
58
|
return {
|
|
47
59
|
selectionMode,
|
|
48
60
|
disallowEmptySelection,
|
|
61
|
+
selectionBehavior,
|
|
62
|
+
setSelectionBehavior,
|
|
49
63
|
get isFocused() {
|
|
50
64
|
return isFocusedRef.current;
|
|
51
65
|
},
|