@react-stately/selection 3.6.0 → 3.9.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 CHANGED
@@ -41,13 +41,28 @@ class $cc81f14158b02e1e259a5a46d24f0c$export$Selection extends Set {
41
41
 
42
42
  }
43
43
 
44
+ function $e792d6adfd95a7ce87c6dd8b719ea117$var$equalSets(setA, setB) {
45
+ if (setA.size !== setB.size) {
46
+ return false;
47
+ }
48
+
49
+ for (let item of setA) {
50
+ if (!setB.has(item)) {
51
+ return false;
52
+ }
53
+ }
54
+
55
+ return true;
56
+ }
57
+
44
58
  /**
45
59
  * Manages state for multiple selection and focus in a collection.
46
60
  */
47
61
  function useMultipleSelectionState(props) {
48
62
  let {
49
63
  selectionMode = 'none',
50
- disallowEmptySelection
64
+ disallowEmptySelection,
65
+ allowDuplicateSelectionEvents
51
66
  } = props; // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
52
67
  // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).
53
68
 
@@ -60,9 +75,18 @@ function useMultipleSelectionState(props) {
60
75
  let defaultSelectedKeys = useMemo(() => $e792d6adfd95a7ce87c6dd8b719ea117$var$convertSelection(props.defaultSelectedKeys, new $cc81f14158b02e1e259a5a46d24f0c$export$Selection()), [props.defaultSelectedKeys]);
61
76
  let [selectedKeys, setSelectedKeys] = useControlledState(selectedKeysProp, defaultSelectedKeys, props.onSelectionChange);
62
77
  let disabledKeysProp = useMemo(() => props.disabledKeys ? new Set(props.disabledKeys) : new Set(), [props.disabledKeys]);
78
+ 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
79
+ // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
80
+
81
+ if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
82
+ setSelectionBehavior('replace');
83
+ }
84
+
63
85
  return {
64
86
  selectionMode,
65
87
  disallowEmptySelection,
88
+ selectionBehavior,
89
+ setSelectionBehavior,
66
90
 
67
91
  get isFocused() {
68
92
  return isFocusedRef.current;
@@ -92,7 +116,13 @@ function useMultipleSelectionState(props) {
92
116
  },
93
117
 
94
118
  selectedKeys,
95
- setSelectedKeys,
119
+
120
+ setSelectedKeys(keys) {
121
+ if (allowDuplicateSelectionEvents || !$e792d6adfd95a7ce87c6dd8b719ea117$var$equalSets(keys, selectedKeys)) {
122
+ setSelectedKeys(keys);
123
+ }
124
+ },
125
+
96
126
  disabledKeys: disabledKeysProp
97
127
  };
98
128
  }
@@ -139,6 +169,22 @@ class SelectionManager {
139
169
  get disallowEmptySelection() {
140
170
  return this.state.disallowEmptySelection;
141
171
  }
172
+ /**
173
+ * The selection behavior for the collection.
174
+ */
175
+
176
+
177
+ get selectionBehavior() {
178
+ return this.state.selectionBehavior;
179
+ }
180
+ /**
181
+ * Sets the selection behavior for the collection.
182
+ */
183
+
184
+
185
+ setSelectionBehavior(selectionBehavior) {
186
+ this.state.setSelectionBehavior(selectionBehavior);
187
+ }
142
188
  /**
143
189
  * Whether the collection is currently focused.
144
190
  */
@@ -205,7 +251,7 @@ class SelectionManager {
205
251
  }
206
252
 
207
253
  key = this.getKey(key);
208
- return this.state.selectedKeys === 'all' || this.state.selectedKeys.has(key);
254
+ return this.state.selectedKeys === 'all' ? !this.state.disabledKeys.has(key) : this.state.selectedKeys.has(key);
209
255
  }
210
256
  /**
211
257
  * Whether the selection is empty.
@@ -276,6 +322,15 @@ class SelectionManager {
276
322
 
277
323
 
278
324
  extendSelection(toKey) {
325
+ if (this.selectionMode === 'none') {
326
+ return;
327
+ }
328
+
329
+ if (this.selectionMode === 'single') {
330
+ this.replaceSelection(toKey);
331
+ return;
332
+ }
333
+
279
334
  toKey = this.getKey(toKey);
280
335
  let selection; // Only select the one key if coming from a select all.
281
336
 
@@ -350,7 +405,7 @@ class SelectionManager {
350
405
  } // Find a parent item to select
351
406
 
352
407
 
353
- while (item.type !== 'item' && item.parentKey) {
408
+ while (item.type !== 'item' && item.parentKey != null) {
354
409
  item = this.collection.getItem(item.parentKey);
355
410
  }
356
411
 
@@ -366,6 +421,15 @@ class SelectionManager {
366
421
 
367
422
 
368
423
  toggleSelection(key) {
424
+ if (this.selectionMode === 'none') {
425
+ return;
426
+ }
427
+
428
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
429
+ this.replaceSelection(key);
430
+ return;
431
+ }
432
+
369
433
  key = this.getKey(key);
370
434
 
371
435
  if (key == null) {
@@ -383,6 +447,10 @@ class SelectionManager {
383
447
  keys.currentKey = key;
384
448
  }
385
449
 
450
+ if (this.disallowEmptySelection && keys.size === 0) {
451
+ return;
452
+ }
453
+
386
454
  this.state.setSelectedKeys(keys);
387
455
  }
388
456
  /**
@@ -391,6 +459,10 @@ class SelectionManager {
391
459
 
392
460
 
393
461
  replaceSelection(key) {
462
+ if (this.selectionMode === 'none') {
463
+ return;
464
+ }
465
+
394
466
  key = this.getKey(key);
395
467
 
396
468
  if (key == null) {
@@ -467,7 +539,7 @@ class SelectionManager {
467
539
 
468
540
 
469
541
  clearSelection() {
470
- if (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0) {
542
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {
471
543
  this.state.setSelectedKeys(new $cc81f14158b02e1e259a5a46d24f0c$export$Selection());
472
544
  }
473
545
  }
@@ -495,10 +567,11 @@ class SelectionManager {
495
567
  } else {
496
568
  this.replaceSelection(key);
497
569
  }
498
- } else if (e && e.shiftKey) {
499
- this.extendSelection(key);
500
- } else {
570
+ } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) {
571
+ // 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
501
572
  this.toggleSelection(key);
573
+ } else {
574
+ this.replaceSelection(key);
502
575
  }
503
576
  }
504
577
  /**
@@ -533,6 +606,20 @@ class SelectionManager {
533
606
  return true;
534
607
  }
535
608
 
609
+ canSelectItem(key) {
610
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {
611
+ return false;
612
+ }
613
+
614
+ let item = this.collection.getItem(key);
615
+
616
+ if (!item || item.type === 'cell' && !this.allowsCellSelection) {
617
+ return false;
618
+ }
619
+
620
+ return true;
621
+ }
622
+
536
623
  }
537
624
 
538
625
  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' || 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 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.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\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection,\n allowDuplicateSelectionEvents\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef(null);\n let childFocusStrategyRef = useRef(null);\n let [, setFocusedKey] = useState(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key>, defaultValue?: Selection): 'all' | Selection {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\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","equalSets","setA","setB","size","item","has","useMultipleSelectionState","props","selectionMode","disallowEmptySelection","allowDuplicateSelectionEvents","isFocusedRef","useRef","setFocused","useState","focusedKeyRef","childFocusStrategyRef","setFocusedKey","selectedKeysProp","useMemo","convertSelection","selectedKeys","defaultSelectedKeys","setSelectedKeys","useControlledState","onSelectionChange","disabledKeysProp","disabledKeys","selectionBehavior","setSelectionBehavior","isFocused","current","f","focusedKey","childFocusStrategy","k","selection","defaultValue","SelectionManager","collection","state","options","allowsCellSelection","_isSelectAll","key","getSelectAllKeys","rawSelection","isSelected","getKey","isEmpty","isSelectAll","allKeys","every","firstSelectedKey","first","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
@@ -34,13 +34,28 @@ class $c91e86e24f2dc9a2182dcc2674c58c$export$Selection extends Set {
34
34
 
35
35
  }
36
36
 
37
+ function $c86d35e876e048ac11515eee40c7$var$equalSets(setA, setB) {
38
+ if (setA.size !== setB.size) {
39
+ return false;
40
+ }
41
+
42
+ for (let item of setA) {
43
+ if (!setB.has(item)) {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ return true;
49
+ }
50
+
37
51
  /**
38
52
  * Manages state for multiple selection and focus in a collection.
39
53
  */
40
54
  export function useMultipleSelectionState(props) {
41
55
  let {
42
56
  selectionMode = 'none',
43
- disallowEmptySelection
57
+ disallowEmptySelection,
58
+ allowDuplicateSelectionEvents
44
59
  } = props; // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
45
60
  // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).
46
61
 
@@ -53,9 +68,18 @@ export function useMultipleSelectionState(props) {
53
68
  let defaultSelectedKeys = useMemo(() => $c86d35e876e048ac11515eee40c7$var$convertSelection(props.defaultSelectedKeys, new $c91e86e24f2dc9a2182dcc2674c58c$export$Selection()), [props.defaultSelectedKeys]);
54
69
  let [selectedKeys, setSelectedKeys] = useControlledState(selectedKeysProp, defaultSelectedKeys, props.onSelectionChange);
55
70
  let disabledKeysProp = useMemo(() => props.disabledKeys ? new Set(props.disabledKeys) : new Set(), [props.disabledKeys]);
71
+ 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
72
+ // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
73
+
74
+ if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
75
+ setSelectionBehavior('replace');
76
+ }
77
+
56
78
  return {
57
79
  selectionMode,
58
80
  disallowEmptySelection,
81
+ selectionBehavior,
82
+ setSelectionBehavior,
59
83
 
60
84
  get isFocused() {
61
85
  return isFocusedRef.current;
@@ -85,7 +109,13 @@ export function useMultipleSelectionState(props) {
85
109
  },
86
110
 
87
111
  selectedKeys,
88
- setSelectedKeys,
112
+
113
+ setSelectedKeys(keys) {
114
+ if (allowDuplicateSelectionEvents || !$c86d35e876e048ac11515eee40c7$var$equalSets(keys, selectedKeys)) {
115
+ setSelectedKeys(keys);
116
+ }
117
+ },
118
+
89
119
  disabledKeys: disabledKeysProp
90
120
  };
91
121
  }
@@ -130,6 +160,22 @@ export class SelectionManager {
130
160
  get disallowEmptySelection() {
131
161
  return this.state.disallowEmptySelection;
132
162
  }
163
+ /**
164
+ * The selection behavior for the collection.
165
+ */
166
+
167
+
168
+ get selectionBehavior() {
169
+ return this.state.selectionBehavior;
170
+ }
171
+ /**
172
+ * Sets the selection behavior for the collection.
173
+ */
174
+
175
+
176
+ setSelectionBehavior(selectionBehavior) {
177
+ this.state.setSelectionBehavior(selectionBehavior);
178
+ }
133
179
  /**
134
180
  * Whether the collection is currently focused.
135
181
  */
@@ -196,7 +242,7 @@ export class SelectionManager {
196
242
  }
197
243
 
198
244
  key = this.getKey(key);
199
- return this.state.selectedKeys === 'all' || this.state.selectedKeys.has(key);
245
+ return this.state.selectedKeys === 'all' ? !this.state.disabledKeys.has(key) : this.state.selectedKeys.has(key);
200
246
  }
201
247
  /**
202
248
  * Whether the selection is empty.
@@ -267,6 +313,15 @@ export class SelectionManager {
267
313
 
268
314
 
269
315
  extendSelection(toKey) {
316
+ if (this.selectionMode === 'none') {
317
+ return;
318
+ }
319
+
320
+ if (this.selectionMode === 'single') {
321
+ this.replaceSelection(toKey);
322
+ return;
323
+ }
324
+
270
325
  toKey = this.getKey(toKey);
271
326
  let selection; // Only select the one key if coming from a select all.
272
327
 
@@ -341,7 +396,7 @@ export class SelectionManager {
341
396
  } // Find a parent item to select
342
397
 
343
398
 
344
- while (item.type !== 'item' && item.parentKey) {
399
+ while (item.type !== 'item' && item.parentKey != null) {
345
400
  item = this.collection.getItem(item.parentKey);
346
401
  }
347
402
 
@@ -357,6 +412,15 @@ export class SelectionManager {
357
412
 
358
413
 
359
414
  toggleSelection(key) {
415
+ if (this.selectionMode === 'none') {
416
+ return;
417
+ }
418
+
419
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
420
+ this.replaceSelection(key);
421
+ return;
422
+ }
423
+
360
424
  key = this.getKey(key);
361
425
 
362
426
  if (key == null) {
@@ -374,6 +438,10 @@ export class SelectionManager {
374
438
  keys.currentKey = key;
375
439
  }
376
440
 
441
+ if (this.disallowEmptySelection && keys.size === 0) {
442
+ return;
443
+ }
444
+
377
445
  this.state.setSelectedKeys(keys);
378
446
  }
379
447
  /**
@@ -382,6 +450,10 @@ export class SelectionManager {
382
450
 
383
451
 
384
452
  replaceSelection(key) {
453
+ if (this.selectionMode === 'none') {
454
+ return;
455
+ }
456
+
385
457
  key = this.getKey(key);
386
458
 
387
459
  if (key == null) {
@@ -458,7 +530,7 @@ export class SelectionManager {
458
530
 
459
531
 
460
532
  clearSelection() {
461
- if (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0) {
533
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {
462
534
  this.state.setSelectedKeys(new $c91e86e24f2dc9a2182dcc2674c58c$export$Selection());
463
535
  }
464
536
  }
@@ -486,10 +558,11 @@ export class SelectionManager {
486
558
  } else {
487
559
  this.replaceSelection(key);
488
560
  }
489
- } else if (e && e.shiftKey) {
490
- this.extendSelection(key);
491
- } else {
561
+ } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) {
562
+ // 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
492
563
  this.toggleSelection(key);
564
+ } else {
565
+ this.replaceSelection(key);
493
566
  }
494
567
  }
495
568
  /**
@@ -524,5 +597,19 @@ export class SelectionManager {
524
597
  return true;
525
598
  }
526
599
 
600
+ canSelectItem(key) {
601
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {
602
+ return false;
603
+ }
604
+
605
+ let item = this.collection.getItem(key);
606
+
607
+ if (!item || item.type === 'cell' && !this.allowsCellSelection) {
608
+ return false;
609
+ }
610
+
611
+ return true;
612
+ }
613
+
527
614
  }
528
615
  //# sourceMappingURL=module.js.map
@@ -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' || 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 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.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\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /** How multiple selection should behave in the collection. */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection,\n allowDuplicateSelectionEvents\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef(null);\n let childFocusStrategyRef = useRef(null);\n let [, setFocusedKey] = useState(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key>, defaultValue?: Selection): 'all' | Selection {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\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","equalSets","setA","setB","size","item","has","useMultipleSelectionState","props","selectionMode","disallowEmptySelection","allowDuplicateSelectionEvents","isFocusedRef","useRef","setFocused","useState","focusedKeyRef","childFocusStrategyRef","setFocusedKey","selectedKeysProp","useMemo","convertSelection","selectedKeys","defaultSelectedKeys","setSelectedKeys","useControlledState","onSelectionChange","disabledKeysProp","disabledKeys","selectionBehavior","setSelectionBehavior","isFocused","current","f","focusedKey","childFocusStrategy","k","selection","defaultValue","SelectionManager","collection","state","options","allowsCellSelection","_isSelectAll","key","getSelectAllKeys","rawSelection","isSelected","getKey","isEmpty","isSelectAll","allKeys","every","firstSelectedKey","first","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,22 @@ export interface MultipleSelectionManager extends FocusState {
69
75
  * Toggles, replaces, or extends selection to the given key depending
70
76
  * on the pointer event and collection's selection mode.
71
77
  */
72
- select(key: Key, e?: PressEvent | PointerEvent): void;
78
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void;
79
+ /** Returns whether the given key can be selected. */
80
+ canSelectItem(key: Key): boolean;
81
+ /** Sets the selection behavior for the collection. */
82
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
83
+ }
84
+ export interface MultipleSelectionStateProps extends MultipleSelection {
85
+ /** How multiple selection should behave in the collection. */
86
+ selectionBehavior?: SelectionBehavior;
87
+ /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */
88
+ allowDuplicateSelectionEvents?: boolean;
73
89
  }
74
90
  /**
75
91
  * Manages state for multiple selection and focus in a collection.
76
92
  */
77
- export function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState;
93
+ export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState;
78
94
  interface SelectionManagerOptions {
79
95
  allowsCellSelection?: boolean;
80
96
  }
@@ -91,6 +107,14 @@ export class SelectionManager implements MultipleSelectionManager {
91
107
  * Whether the collection allows empty selection.
92
108
  */
93
109
  get disallowEmptySelection(): boolean;
110
+ /**
111
+ * The selection behavior for the collection.
112
+ */
113
+ get selectionBehavior(): SelectionBehavior;
114
+ /**
115
+ * Sets the selection behavior for the collection.
116
+ */
117
+ setSelectionBehavior(selectionBehavior: SelectionBehavior): void;
94
118
  /**
95
119
  * Whether the collection is currently focused.
96
120
  */
@@ -160,11 +184,12 @@ export class SelectionManager implements MultipleSelectionManager {
160
184
  * Toggles between select all and an empty selection.
161
185
  */
162
186
  toggleSelectAll(): void;
163
- select(key: Key, e?: PressEvent | PointerEvent): void;
187
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void;
164
188
  /**
165
189
  * Returns whether the current selection is equal to the given selection.
166
190
  */
167
191
  isSelectionEqual(selection: Set<Key>): boolean;
192
+ canSelectItem(key: Key): boolean;
168
193
  }
169
194
 
170
195
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["./packages/@react-stately/selection/src/packages/@react-stately/selection/src/types.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/SelectionManager.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/index.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":"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","sources":["./packages/@react-stately/selection/src/packages/@react-stately/selection/src/types.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/SelectionManager.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/index.ts"],"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.6.0",
3
+ "version": "3.9.0",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -18,9 +18,9 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@babel/runtime": "^7.6.2",
21
- "@react-stately/collections": "^3.3.2",
22
- "@react-stately/utils": "^3.2.1",
23
- "@react-types/shared": "^3.7.0"
21
+ "@react-stately/collections": "^3.3.3",
22
+ "@react-stately/utils": "^3.3.0",
23
+ "@react-types/shared": "^3.10.1"
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": "83b70255d97b3068988f8972e9c9a39a7352926e"
31
+ "gitHead": "45e63a00c00486cf57b457371da6f8749cd9bca4"
32
32
  }
@@ -10,7 +10,16 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {Collection, FocusStrategy, Selection as ISelection, Node, PressEvent, SelectionMode} from '@react-types/shared';
13
+ import {
14
+ Collection,
15
+ FocusStrategy,
16
+ Selection as ISelection,
17
+ LongPressEvent,
18
+ Node,
19
+ PressEvent,
20
+ SelectionBehavior,
21
+ SelectionMode
22
+ } from '@react-types/shared';
14
23
  import {Key} from 'react';
15
24
  import {MultipleSelectionManager, MultipleSelectionState} from './types';
16
25
  import {Selection} from './Selection';
@@ -49,6 +58,20 @@ export class SelectionManager implements MultipleSelectionManager {
49
58
  return this.state.disallowEmptySelection;
50
59
  }
51
60
 
61
+ /**
62
+ * The selection behavior for the collection.
63
+ */
64
+ get selectionBehavior(): SelectionBehavior {
65
+ return this.state.selectionBehavior;
66
+ }
67
+
68
+ /**
69
+ * Sets the selection behavior for the collection.
70
+ */
71
+ setSelectionBehavior(selectionBehavior: SelectionBehavior) {
72
+ this.state.setSelectionBehavior(selectionBehavior);
73
+ }
74
+
52
75
  /**
53
76
  * Whether the collection is currently focused.
54
77
  */
@@ -108,7 +131,9 @@ export class SelectionManager implements MultipleSelectionManager {
108
131
  }
109
132
 
110
133
  key = this.getKey(key);
111
- return this.state.selectedKeys === 'all' || this.state.selectedKeys.has(key);
134
+ return this.state.selectedKeys === 'all'
135
+ ? !this.state.disabledKeys.has(key)
136
+ : this.state.selectedKeys.has(key);
112
137
  }
113
138
 
114
139
  /**
@@ -168,6 +193,15 @@ export class SelectionManager implements MultipleSelectionManager {
168
193
  * Extends the selection to the given key.
169
194
  */
170
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
+
171
205
  toKey = this.getKey(toKey);
172
206
 
173
207
  let selection: Selection;
@@ -239,7 +273,7 @@ export class SelectionManager implements MultipleSelectionManager {
239
273
  }
240
274
 
241
275
  // Find a parent item to select
242
- while (item.type !== 'item' && item.parentKey) {
276
+ while (item.type !== 'item' && item.parentKey != null) {
243
277
  item = this.collection.getItem(item.parentKey);
244
278
  }
245
279
 
@@ -254,6 +288,15 @@ export class SelectionManager implements MultipleSelectionManager {
254
288
  * Toggles whether the given key is selected.
255
289
  */
256
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
+
257
300
  key = this.getKey(key);
258
301
  if (key == null) {
259
302
  return;
@@ -270,6 +313,10 @@ export class SelectionManager implements MultipleSelectionManager {
270
313
  keys.currentKey = key;
271
314
  }
272
315
 
316
+ if (this.disallowEmptySelection && keys.size === 0) {
317
+ return;
318
+ }
319
+
273
320
  this.state.setSelectedKeys(keys);
274
321
  }
275
322
 
@@ -277,6 +324,10 @@ export class SelectionManager implements MultipleSelectionManager {
277
324
  * Replaces the selection with only the given key.
278
325
  */
279
326
  replaceSelection(key: Key) {
327
+ if (this.selectionMode === 'none') {
328
+ return;
329
+ }
330
+
280
331
  key = this.getKey(key);
281
332
  if (key == null) {
282
333
  return;
@@ -344,7 +395,7 @@ export class SelectionManager implements MultipleSelectionManager {
344
395
  * Removes all keys from the selection.
345
396
  */
346
397
  clearSelection() {
347
- if (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0) {
398
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {
348
399
  this.state.setSelectedKeys(new Selection());
349
400
  }
350
401
  }
@@ -360,7 +411,7 @@ export class SelectionManager implements MultipleSelectionManager {
360
411
  }
361
412
  }
362
413
 
363
- select(key: Key, e?: PressEvent | PointerEvent) {
414
+ select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent) {
364
415
  if (this.selectionMode === 'none') {
365
416
  return;
366
417
  }
@@ -371,10 +422,11 @@ export class SelectionManager implements MultipleSelectionManager {
371
422
  } else {
372
423
  this.replaceSelection(key);
373
424
  }
374
- } else if (e && e.shiftKey) {
375
- this.extendSelection(key);
376
- } 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
377
427
  this.toggleSelection(key);
428
+ } else {
429
+ this.replaceSelection(key);
378
430
  }
379
431
  }
380
432
 
@@ -406,4 +458,17 @@ export class SelectionManager implements MultipleSelectionManager {
406
458
 
407
459
  return true;
408
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
+ }
409
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,18 +11,40 @@
11
11
  */
12
12
 
13
13
  import {Key, useMemo, useRef, useState} from 'react';
14
- import {MultipleSelection, SelectionMode} from '@react-types/shared';
14
+ import {MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';
15
15
  import {MultipleSelectionState} from './types';
16
16
  import {Selection} from './Selection';
17
17
  import {useControlledState} from '@react-stately/utils';
18
18
 
19
+ function equalSets(setA, setB) {
20
+ if (setA.size !== setB.size) {
21
+ return false;
22
+ }
23
+
24
+ for (let item of setA) {
25
+ if (!setB.has(item)) {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ return true;
31
+ }
32
+
33
+ export interface MultipleSelectionStateProps extends MultipleSelection {
34
+ /** How multiple selection should behave in the collection. */
35
+ selectionBehavior?: SelectionBehavior,
36
+ /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */
37
+ allowDuplicateSelectionEvents?: boolean
38
+ }
39
+
19
40
  /**
20
41
  * Manages state for multiple selection and focus in a collection.
21
42
  */
22
- export function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState {
43
+ export function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {
23
44
  let {
24
45
  selectionMode = 'none' as SelectionMode,
25
- disallowEmptySelection
46
+ disallowEmptySelection,
47
+ allowDuplicateSelectionEvents
26
48
  } = props;
27
49
 
28
50
  // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
@@ -42,10 +64,19 @@ export function useMultipleSelectionState(props: MultipleSelection): MultipleSel
42
64
  let disabledKeysProp = useMemo(() =>
43
65
  props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()
44
66
  , [props.disabledKeys]);
67
+ let [selectionBehavior, setSelectionBehavior] = useState(props.selectionBehavior || 'toggle');
68
+
69
+ // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
70
+ // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
71
+ if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {
72
+ setSelectionBehavior('replace');
73
+ }
45
74
 
46
75
  return {
47
76
  selectionMode,
48
77
  disallowEmptySelection,
78
+ selectionBehavior,
79
+ setSelectionBehavior,
49
80
  get isFocused() {
50
81
  return isFocusedRef.current;
51
82
  },
@@ -65,7 +96,11 @@ export function useMultipleSelectionState(props: MultipleSelection): MultipleSel
65
96
  setFocusedKey(k);
66
97
  },
67
98
  selectedKeys,
68
- setSelectedKeys,
99
+ setSelectedKeys(keys) {
100
+ if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {
101
+ setSelectedKeys(keys);
102
+ }
103
+ },
69
104
  disabledKeys: disabledKeysProp
70
105
  };
71
106
  }