@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 +95 -8
- package/dist/main.js.map +1 -1
- package/dist/module.js +95 -8
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +29 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/SelectionManager.ts +73 -8
- package/src/types.ts +12 -2
- package/src/useMultipleSelectionState.ts +39 -4
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
|
-
|
|
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'
|
|
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.
|
|
499
|
-
|
|
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":";;;;;;;;;;AAAA;;;;;;;;;;;;AAcA;;;;AAIO,MAAMA,gDAAN,SAAwBC,GAAxB,CAAiC;AAItCC,EAAAA,WAAW,CAACC,IAAD,EAAmCC,SAAnC,EAAoDC,UAApD,EAAsE;AAC/E,UAAMF,IAAN;AAD+E,SAHjFC,SAGiF;AAAA,SAFjFC,UAEiF;;AAE/E,QAAIF,IAAI,YAAYH,gDAApB,EAA+B;AAC7B,WAAKI,SAAL,GAAiBA,SAAS,IAAID,IAAI,CAACC,SAAnC;AACA,WAAKC,UAAL,GAAkBA,UAAU,IAAIF,IAAI,CAACE,UAArC;AACD,KAHD,MAGO;AACL,WAAKD,SAAL,GAAiBA,SAAjB;AACA,WAAKC,UAAL,GAAkBA,UAAlB;AACD;AACF;;AAbqC;;ACAxC,SAASC,+CAAT,CAAmBC,IAAnB,EAAyBC,IAAzB,EAA+B;AAC7B,MAAID,IAAI,CAACE,IAAL,KAAcD,IAAI,CAACC,IAAvB,EAA6B;AAC3B,WAAO,KAAP;AACD;;AAED,OAAK,IAAIC,IAAT,IAAiBH,IAAjB,EAAuB;AACrB,QAAI,CAACC,IAAI,CAACG,GAAL,CAASD,IAAT,CAAL,EAAqB;AACnB,aAAO,KAAP;AACD;AACF;;AAED,SAAO,IAAP;AACD;;AASD;;;AAGO,SAASE,yBAAT,CAAmCC,KAAnC,EAA+F;AACpG,MAAI;AACFC,IAAAA,aAAa,GAAG,MADd;AAEFC,IAAAA,sBAFE;AAGFC,IAAAA;AAHE,MAIAH,KAJJ,CADoG,CAOpG;AACA;;AACA,MAAII,YAAY,GAAGC,MAAM,CAAC,KAAD,CAAzB;AACA,MAAI,GAAGC,UAAH,IAAiBC,QAAQ,CAAC,KAAD,CAA7B;AACA,MAAIC,aAAa,GAAGH,MAAM,CAAC,IAAD,CAA1B;AACA,MAAII,qBAAqB,GAAGJ,MAAM,CAAC,IAAD,CAAlC;AACA,MAAI,GAAGK,aAAH,IAAoBH,QAAQ,CAAC,IAAD,CAAhC;AACA,MAAII,gBAAgB,GAAGC,OAAO,CAAC,MAAMC,sDAAgB,CAACb,KAAK,CAACc,YAAP,CAAvB,EAA6C,CAACd,KAAK,CAACc,YAAP,CAA7C,CAA9B;AACA,MAAIC,mBAAmB,GAAGH,OAAO,CAAC,MAAMC,sDAAgB,CAACb,KAAK,CAACe,mBAAP,EAA4B,sDAA5B,CAAvB,EAAqE,CAACf,KAAK,CAACe,mBAAP,CAArE,CAAjC;AACA,MAAI,CAACD,YAAD,EAAeE,eAAf,IAAkCC,kBAAkB,CACtDN,gBADsD,EAEtDI,mBAFsD,EAGtDf,KAAK,CAACkB,iBAHgD,CAAxD;AAKA,MAAIC,gBAAgB,GAAGP,OAAO,CAAC,MAC7BZ,KAAK,CAACoB,YAAN,GAAqB,IAAIhC,GAAJ,CAAQY,KAAK,CAACoB,YAAd,CAArB,GAAmD,IAAIhC,GAAJ,EADvB,EAE5B,CAACY,KAAK,CAACoB,YAAP,CAF4B,CAA9B;AAGA,MAAI,CAACC,iBAAD,EAAoBC,oBAApB,IAA4Cf,QAAQ,CAACP,KAAK,CAACqB,iBAAN,IAA2B,QAA5B,CAAxD,CAxBoG,CA0BpG;AACA;;AACA,MAAIrB,KAAK,CAACqB,iBAAN,KAA4B,SAA5B,IAAyCA,iBAAiB,KAAK,QAA/D,IAA2E,OAAOP,YAAP,KAAwB,QAAnG,IAA+GA,YAAY,CAAClB,IAAb,KAAsB,CAAzI,EAA4I;AAC1I0B,IAAAA,oBAAoB,CAAC,SAAD,CAApB;AACD;;AAED,SAAO;AACLrB,IAAAA,aADK;AAELC,IAAAA,sBAFK;AAGLmB,IAAAA,iBAHK;AAILC,IAAAA,oBAJK;;AAKL,QAAIC,SAAJ,GAAgB;AACd,aAAOnB,YAAY,CAACoB,OAApB;AACD,KAPI;;AAQLlB,IAAAA,UAAU,CAACmB,CAAD,EAAI;AACZrB,MAAAA,YAAY,CAACoB,OAAb,GAAuBC,CAAvB;AACAnB,MAAAA,UAAU,CAACmB,CAAD,CAAV;AACD,KAXI;;AAYL,QAAIC,UAAJ,GAAiB;AACf,aAAOlB,aAAa,CAACgB,OAArB;AACD,KAdI;;AAeL,QAAIG,kBAAJ,GAAyB;AACvB,aAAOlB,qBAAqB,CAACe,OAA7B;AACD,KAjBI;;AAkBLd,IAAAA,aAAa,CAACkB,CAAD,EAAID,kBAAJ,EAAkC;AAAA,UAA9BA,kBAA8B;AAA9BA,QAAAA,kBAA8B,GAAT,OAAS;AAAA;;AAC7CnB,MAAAA,aAAa,CAACgB,OAAd,GAAwBI,CAAxB;AACAnB,MAAAA,qBAAqB,CAACe,OAAtB,GAAgCG,kBAAhC;AACAjB,MAAAA,aAAa,CAACkB,CAAD,CAAb;AACD,KAtBI;;AAuBLd,IAAAA,YAvBK;;AAwBLE,IAAAA,eAAe,CAAC1B,IAAD,EAAO;AACpB,UAAIa,6BAA6B,IAAI,CAACV,+CAAS,CAACH,IAAD,EAAOwB,YAAP,CAA/C,EAAqE;AACnEE,QAAAA,eAAe,CAAC1B,IAAD,CAAf;AACD;AACF,KA5BI;;AA6BL8B,IAAAA,YAAY,EAAED;AA7BT,GAAP;AA+BD;;;;AAED,SAASN,sDAAT,CAA0BgB,SAA1B,EAA4DC,YAA5D,EAAyG;AACvG,MAAI,CAACD,SAAL,EAAgB;AACd,WAAOC,YAAP;AACD;;AAED,SAAOD,SAAS,KAAK,KAAd,GACH,KADG,GAEH,qDAAcA,SAAd,CAFJ;AAGD;;ACrFD;;;AAGO,MAAME,gBAAN,CAA2D;AAMhE1C,EAAAA,WAAW,CAAC2C,UAAD,EAAwCC,KAAxC,EAAuEC,OAAvE,EAA0G;AAAA;;AAAA,SAL7GF,UAK6G;AAAA,SAJ7GC,KAI6G;AAAA,SAH7GE,mBAG6G;AAAA,SAF7GC,YAE6G;AACnH,SAAKJ,UAAL,GAAkBA,UAAlB;AACA,SAAKC,KAAL,GAAaA,KAAb;AACA,SAAKE,mBAAL,4BAA2BD,OAA3B,oBAA2BA,OAAO,CAAEC,mBAApC,oCAA2D,KAA3D;AACA,SAAKC,YAAL,GAAoB,IAApB;AACD;AAED;;;;;AAGA,MAAInC,aAAJ,GAAmC;AACjC,WAAO,KAAKgC,KAAL,CAAWhC,aAAlB;AACD;AAED;;;;;AAGA,MAAIC,sBAAJ,GAAsC;AACpC,WAAO,KAAK+B,KAAL,CAAW/B,sBAAlB;AACD;AAED;;;;;AAGA,MAAImB,iBAAJ,GAA2C;AACzC,WAAO,KAAKY,KAAL,CAAWZ,iBAAlB;AACD;AAED;;;;;AAGAC,EAAAA,oBAAoB,CAACD,iBAAD,EAAuC;AACzD,SAAKY,KAAL,CAAWX,oBAAX,CAAgCD,iBAAhC;AACD;AAED;;;;;AAGA,MAAIE,SAAJ,GAAyB;AACvB,WAAO,KAAKU,KAAL,CAAWV,SAAlB;AACD;AAED;;;;;AAGAjB,EAAAA,UAAU,CAACiB,SAAD,EAAqB;AAC7B,SAAKU,KAAL,CAAW3B,UAAX,CAAsBiB,SAAtB;AACD;AAED;;;;;AAGA,MAAIG,UAAJ,GAAsB;AACpB,WAAO,KAAKO,KAAL,CAAWP,UAAlB;AACD;AAED;;;AACA,MAAIC,kBAAJ,GAAwC;AACtC,WAAO,KAAKM,KAAL,CAAWN,kBAAlB;AACD;AAED;;;;;AAGAjB,EAAAA,aAAa,CAAC2B,GAAD,EAAWV,kBAAX,EAA+C;AAC1D,SAAKM,KAAL,CAAWvB,aAAX,CAAyB2B,GAAzB,EAA8BV,kBAA9B;AACD;AAED;;;;;AAGA,MAAIb,YAAJ,GAA6B;AAC3B,WAAO,KAAKmB,KAAL,CAAWnB,YAAX,KAA4B,KAA5B,GACH,IAAI1B,GAAJ,CAAQ,KAAKkD,gBAAL,EAAR,CADG,GAEH,KAAKL,KAAL,CAAWnB,YAFf;AAGD;AAED;;;;;;AAIA,MAAIyB,YAAJ,GAA+B;AAC7B,WAAO,KAAKN,KAAL,CAAWnB,YAAlB;AACD;AAED;;;;;AAGA0B,EAAAA,UAAU,CAACH,GAAD,EAAW;AACnB,QAAI,KAAKJ,KAAL,CAAWhC,aAAX,KAA6B,MAAjC,EAAyC;AACvC,aAAO,KAAP;AACD;;AAEDoC,IAAAA,GAAG,GAAG,KAAKI,MAAL,CAAYJ,GAAZ,CAAN;AACA,WAAO,KAAKJ,KAAL,CAAWnB,YAAX,KAA4B,KAA5B,GACH,CAAC,KAAKmB,KAAL,CAAWb,YAAX,CAAwBtB,GAAxB,CAA4BuC,GAA5B,CADE,GAEH,KAAKJ,KAAL,CAAWnB,YAAX,CAAwBhB,GAAxB,CAA4BuC,GAA5B,CAFJ;AAGD;AAED;;;;;AAGA,MAAIK,OAAJ,GAAuB;AACrB,WAAO,KAAKT,KAAL,CAAWnB,YAAX,KAA4B,KAA5B,IAAqC,KAAKmB,KAAL,CAAWnB,YAAX,CAAwBlB,IAAxB,KAAiC,CAA7E;AACD;AAED;;;;;AAGA,MAAI+C,WAAJ,GAA2B;AACzB,QAAI,KAAKD,OAAT,EAAkB;AAChB,aAAO,KAAP;AACD;;AAED,QAAI,KAAKT,KAAL,CAAWnB,YAAX,KAA4B,KAAhC,EAAuC;AACrC,aAAO,IAAP;AACD;;AAED,QAAI,KAAKsB,YAAL,IAAqB,IAAzB,EAA+B;AAC7B,aAAO,KAAKA,YAAZ;AACD;;AAED,QAAIQ,OAAO,GAAG,KAAKN,gBAAL,EAAd;AACA,QAAIxB,YAAY,GAAG,KAAKmB,KAAL,CAAWnB,YAA9B;AACA,SAAKsB,YAAL,GAAoBQ,OAAO,CAACC,KAAR,CAAcjB,CAAC,IAAId,YAAY,CAAChB,GAAb,CAAiB8B,CAAjB,CAAnB,CAApB;AACA,WAAO,KAAKQ,YAAZ;AACD;;AAED,MAAIU,gBAAJ,GAAmC;AAAA;;AACjC,QAAIC,KAA2B,GAAG,IAAlC;;AACA,SAAK,IAAIV,GAAT,IAAgB,KAAKJ,KAAL,CAAWnB,YAA3B,EAAyC;AACvC,UAAIjB,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,UAAI,CAACU,KAAD,IAAU,CAAAlD,IAAI,QAAJ,YAAAA,IAAI,CAAEoD,KAAN,IAAcF,KAAK,CAACE,KAAlC,EAAyC;AACvCF,QAAAA,KAAK,GAAGlD,IAAR;AACD;AACF;;AAED,qBAAOkD,KAAP,qBAAO,OAAOV,GAAd;AACD;;AAED,MAAIa,eAAJ,GAAkC;AAAA;;AAChC,QAAIC,IAA0B,GAAG,IAAjC;;AACA,SAAK,IAAId,GAAT,IAAgB,KAAKJ,KAAL,CAAWnB,YAA3B,EAAyC;AACvC,UAAIjB,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,UAAI,CAACc,IAAD,IAAS,CAAAtD,IAAI,QAAJ,YAAAA,IAAI,CAAEoD,KAAN,IAAcE,IAAI,CAACF,KAAhC,EAAuC;AACrCE,QAAAA,IAAI,GAAGtD,IAAP;AACD;AACF;;AAED,oBAAOsD,IAAP,qBAAO,MAAMd,GAAb;AACD;AAED;;;;;AAGAe,EAAAA,eAAe,CAACC,KAAD,EAAa;AAC1B,QAAI,KAAKpD,aAAL,KAAuB,MAA3B,EAAmC;AACjC;AACD;;AAED,QAAI,KAAKA,aAAL,KAAuB,QAA3B,EAAqC;AACnC,WAAKqD,gBAAL,CAAsBD,KAAtB;AACA;AACD;;AAEDA,IAAAA,KAAK,GAAG,KAAKZ,MAAL,CAAYY,KAAZ,CAAR;AAEA,QAAIxB,SAAJ,CAZ0B,CAc1B;;AACA,QAAI,KAAKI,KAAL,CAAWnB,YAAX,KAA4B,KAAhC,EAAuC;AACrCe,MAAAA,SAAS,GAAG,qDAAc,CAACwB,KAAD,CAAd,EAAuBA,KAAvB,EAA8BA,KAA9B,CAAZ;AACD,KAFD,MAEO;AACL,UAAIvC,YAAY,GAAG,KAAKmB,KAAL,CAAWnB,YAA9B;AACA,UAAIvB,SAAS,GAAGuB,YAAY,CAACvB,SAAb,IAA0B8D,KAA1C;AACAxB,MAAAA,SAAS,GAAG,qDAAcf,YAAd,EAA4BvB,SAA5B,EAAuC8D,KAAvC,CAAZ;;AACA,WAAK,IAAIhB,GAAT,IAAgB,KAAKkB,WAAL,CAAiBhE,SAAjB,EAA4BuB,YAAY,CAACtB,UAAb,IAA2B6D,KAAvD,CAAhB,EAA+E;AAC7ExB,QAAAA,SAAS,CAAC2B,MAAV,CAAiBnB,GAAjB;AACD;;AAED,WAAK,IAAIA,GAAT,IAAgB,KAAKkB,WAAL,CAAiBF,KAAjB,EAAwB9D,SAAxB,CAAhB,EAAoD;AAClD,YAAI,CAAC,KAAK0C,KAAL,CAAWb,YAAX,CAAwBtB,GAAxB,CAA4BuC,GAA5B,CAAL,EAAuC;AACrCR,UAAAA,SAAS,CAAC4B,GAAV,CAAcpB,GAAd;AACD;AACF;AACF;;AAED,SAAKJ,KAAL,CAAWjB,eAAX,CAA2Ba,SAA3B;AACD;;AAEO0B,EAAAA,WAAR,CAAoBG,IAApB,EAA+BC,EAA/B,EAAwC;AACtC,QAAIC,QAAQ,GAAG,KAAK5B,UAAL,CAAgBgB,OAAhB,CAAwBU,IAAxB,CAAf;AACA,QAAIG,MAAM,GAAG,KAAK7B,UAAL,CAAgBgB,OAAhB,CAAwBW,EAAxB,CAAb;;AACA,QAAIC,QAAQ,IAAIC,MAAhB,EAAwB;AACtB,UAAID,QAAQ,CAACX,KAAT,IAAkBY,MAAM,CAACZ,KAA7B,EAAoC;AAClC,eAAO,KAAKa,mBAAL,CAAyBJ,IAAzB,EAA+BC,EAA/B,CAAP;AACD;;AAED,aAAO,KAAKG,mBAAL,CAAyBH,EAAzB,EAA6BD,IAA7B,CAAP;AACD;;AAED,WAAO,EAAP;AACD;;AAEOI,EAAAA,mBAAR,CAA4BJ,IAA5B,EAAuCC,EAAvC,EAAgD;AAC9C,QAAIrE,IAAW,GAAG,EAAlB;AACA,QAAI+C,GAAG,GAAGqB,IAAV;;AACA,WAAOrB,GAAP,EAAY;AACV,UAAIxC,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,UAAIxC,IAAI,IAAIA,IAAI,CAACkE,IAAL,KAAc,MAAtB,IAAiClE,IAAI,CAACkE,IAAL,KAAc,MAAd,IAAwB,KAAK5B,mBAAlE,EAAwF;AACtF7C,QAAAA,IAAI,CAAC0E,IAAL,CAAU3B,GAAV;AACD;;AAED,UAAIA,GAAG,KAAKsB,EAAZ,EAAgB;AACd,eAAOrE,IAAP;AACD;;AAED+C,MAAAA,GAAG,GAAG,KAAKL,UAAL,CAAgBiC,WAAhB,CAA4B5B,GAA5B,CAAN;AACD;;AAED,WAAO,EAAP;AACD;;AAEOI,EAAAA,MAAR,CAAeJ,GAAf,EAAyB;AACvB,QAAIxC,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,QAAI,CAACxC,IAAL,EAAW;AACT;AACA,aAAOwC,GAAP;AACD,KALsB,CAOvB;;;AACA,QAAIxC,IAAI,CAACkE,IAAL,KAAc,MAAd,IAAwB,KAAK5B,mBAAjC,EAAsD;AACpD,aAAOE,GAAP;AACD,KAVsB,CAYvB;;;AACA,WAAOxC,IAAI,CAACkE,IAAL,KAAc,MAAd,IAAwBlE,IAAI,CAACqE,SAAL,IAAkB,IAAjD,EAAuD;AACrDrE,MAAAA,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBnD,IAAI,CAACqE,SAA7B,CAAP;AACD;;AAED,QAAI,CAACrE,IAAD,IAASA,IAAI,CAACkE,IAAL,KAAc,MAA3B,EAAmC;AACjC,aAAO,IAAP;AACD;;AAED,WAAOlE,IAAI,CAACwC,GAAZ;AACD;AAED;;;;;AAGA8B,EAAAA,eAAe,CAAC9B,GAAD,EAAW;AACxB,QAAI,KAAKpC,aAAL,KAAuB,MAA3B,EAAmC;AACjC;AACD;;AAED,QAAI,KAAKA,aAAL,KAAuB,QAAvB,IAAmC,CAAC,KAAKuC,UAAL,CAAgBH,GAAhB,CAAxC,EAA8D;AAC5D,WAAKiB,gBAAL,CAAsBjB,GAAtB;AACA;AACD;;AAEDA,IAAAA,GAAG,GAAG,KAAKI,MAAL,CAAYJ,GAAZ,CAAN;;AACA,QAAIA,GAAG,IAAI,IAAX,EAAiB;AACf;AACD;;AAED,QAAI/C,IAAI,GAAG,qDAAc,KAAK2C,KAAL,CAAWnB,YAAX,KAA4B,KAA5B,GAAoC,KAAKwB,gBAAL,EAApC,GAA8D,KAAKL,KAAL,CAAWnB,YAAvF,CAAX;;AACA,QAAIxB,IAAI,CAACQ,GAAL,CAASuC,GAAT,CAAJ,EAAmB;AACjB/C,MAAAA,IAAI,CAACkE,MAAL,CAAYnB,GAAZ,EADiB,CAEjB;AACA;AACD,KAJD,MAIO;AACL/C,MAAAA,IAAI,CAACmE,GAAL,CAASpB,GAAT;AACA/C,MAAAA,IAAI,CAACC,SAAL,GAAiB8C,GAAjB;AACA/C,MAAAA,IAAI,CAACE,UAAL,GAAkB6C,GAAlB;AACD;;AAED,QAAI,KAAKnC,sBAAL,IAA+BZ,IAAI,CAACM,IAAL,KAAc,CAAjD,EAAoD;AAClD;AACD;;AAED,SAAKqC,KAAL,CAAWjB,eAAX,CAA2B1B,IAA3B;AACD;AAED;;;;;AAGAgE,EAAAA,gBAAgB,CAACjB,GAAD,EAAW;AACzB,QAAI,KAAKpC,aAAL,KAAuB,MAA3B,EAAmC;AACjC;AACD;;AAEDoC,IAAAA,GAAG,GAAG,KAAKI,MAAL,CAAYJ,GAAZ,CAAN;;AACA,QAAIA,GAAG,IAAI,IAAX,EAAiB;AACf;AACD;;AAED,SAAKJ,KAAL,CAAWjB,eAAX,CAA2B,qDAAc,CAACqB,GAAD,CAAd,EAAqBA,GAArB,EAA0BA,GAA1B,CAA3B;AACD;AAED;;;;;AAGArB,EAAAA,eAAe,CAAC1B,IAAD,EAAsB;AACnC,QAAI,KAAKW,aAAL,KAAuB,MAA3B,EAAmC;AACjC;AACD;;AAED,QAAI4B,SAAS,GAAG,sDAAhB;;AACA,SAAK,IAAIQ,GAAT,IAAgB/C,IAAhB,EAAsB;AACpB+C,MAAAA,GAAG,GAAG,KAAKI,MAAL,CAAYJ,GAAZ,CAAN;;AACA,UAAIA,GAAG,IAAI,IAAX,EAAiB;AACfR,QAAAA,SAAS,CAAC4B,GAAV,CAAcpB,GAAd;;AACA,YAAI,KAAKpC,aAAL,KAAuB,QAA3B,EAAqC;AACnC;AACD;AACF;AACF;;AAED,SAAKgC,KAAL,CAAWjB,eAAX,CAA2Ba,SAA3B;AACD;;AAEOS,EAAAA,gBAAR,GAA2B;AACzB,QAAIhD,IAAW,GAAG,EAAlB;;AACA,QAAI8E,OAAO,GAAI/B,GAAD,IAAc;AAC1B,aAAOA,GAAP,EAAY;AACV,YAAI,CAAC,KAAKJ,KAAL,CAAWb,YAAX,CAAwBtB,GAAxB,CAA4BuC,GAA5B,CAAL,EAAuC;AACrC,cAAIxC,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,cAAIxC,IAAI,CAACkE,IAAL,KAAc,MAAlB,EAA0B;AACxBzE,YAAAA,IAAI,CAAC0E,IAAL,CAAU3B,GAAV;AACD,WAJoC,CAMrC;;;AACA,cAAIxC,IAAI,CAACwE,aAAL,KAAuB,KAAKlC,mBAAL,IAA4BtC,IAAI,CAACkE,IAAL,KAAc,MAAjE,CAAJ,EAA8E;AAC5EK,YAAAA,OAAO,CAAC,CAAC,GAAGvE,IAAI,CAACyE,UAAT,EAAqB,CAArB,EAAwBjC,GAAzB,CAAP;AACD;AACF;;AAEDA,QAAAA,GAAG,GAAG,KAAKL,UAAL,CAAgBiC,WAAhB,CAA4B5B,GAA5B,CAAN;AACD;AACF,KAhBD;;AAkBA+B,IAAAA,OAAO,CAAC,KAAKpC,UAAL,CAAgBuC,WAAhB,EAAD,CAAP;AACA,WAAOjF,IAAP;AACD;AAED;;;;;AAGAkF,EAAAA,SAAS,GAAG;AACV,QAAI,KAAKvE,aAAL,KAAuB,UAA3B,EAAuC;AACrC,WAAKgC,KAAL,CAAWjB,eAAX,CAA2B,KAA3B;AACD;AACF;AAED;;;;;AAGAyD,EAAAA,cAAc,GAAG;AACf,QAAI,CAAC,KAAKvE,sBAAN,KAAiC,KAAK+B,KAAL,CAAWnB,YAAX,KAA4B,KAA5B,IAAqC,KAAKmB,KAAL,CAAWnB,YAAX,CAAwBlB,IAAxB,GAA+B,CAArG,CAAJ,EAA6G;AAC3G,WAAKqC,KAAL,CAAWjB,eAAX,CAA2B,sDAA3B;AACD;AACF;AAED;;;;;AAGA0D,EAAAA,eAAe,GAAG;AAChB,QAAI,KAAK/B,WAAT,EAAsB;AACpB,WAAK8B,cAAL;AACD,KAFD,MAEO;AACL,WAAKD,SAAL;AACD;AACF;;AAEDG,EAAAA,MAAM,CAACtC,GAAD,EAAWuC,CAAX,EAA2D;AAC/D,QAAI,KAAK3E,aAAL,KAAuB,MAA3B,EAAmC;AACjC;AACD;;AAED,QAAI,KAAKA,aAAL,KAAuB,QAA3B,EAAqC;AACnC,UAAI,KAAKuC,UAAL,CAAgBH,GAAhB,KAAwB,CAAC,KAAKnC,sBAAlC,EAA0D;AACxD,aAAKiE,eAAL,CAAqB9B,GAArB;AACD,OAFD,MAEO;AACL,aAAKiB,gBAAL,CAAsBjB,GAAtB;AACD;AACF,KAND,MAMO,IAAI,KAAKhB,iBAAL,KAA2B,QAA3B,IAAwCuD,CAAC,KAAKA,CAAC,CAACC,WAAF,KAAkB,OAAlB,IAA6BD,CAAC,CAACC,WAAF,KAAkB,SAApD,CAA7C,EAA8G;AACnH;AACA,WAAKV,eAAL,CAAqB9B,GAArB;AACD,KAHM,MAGA;AACL,WAAKiB,gBAAL,CAAsBjB,GAAtB;AACD;AACF;AAED;;;;;AAGAyC,EAAAA,gBAAgB,CAACjD,SAAD,EAAsB;AACpC,QAAIA,SAAS,KAAK,KAAKI,KAAL,CAAWnB,YAA7B,EAA2C;AACzC,aAAO,IAAP;AACD,KAHmC,CAKpC;;;AACA,QAAIA,YAAY,GAAG,KAAKA,YAAxB;;AACA,QAAIe,SAAS,CAACjC,IAAV,KAAmBkB,YAAY,CAAClB,IAApC,EAA0C;AACxC,aAAO,KAAP;AACD;;AAED,SAAK,IAAIyC,GAAT,IAAgBR,SAAhB,EAA2B;AACzB,UAAI,CAACf,YAAY,CAAChB,GAAb,CAAiBuC,GAAjB,CAAL,EAA4B;AAC1B,eAAO,KAAP;AACD;AACF;;AAED,SAAK,IAAIA,GAAT,IAAgBvB,YAAhB,EAA8B;AAC5B,UAAI,CAACe,SAAS,CAAC/B,GAAV,CAAcuC,GAAd,CAAL,EAAyB;AACvB,eAAO,KAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;;AAED0C,EAAAA,aAAa,CAAC1C,GAAD,EAAW;AACtB,QAAI,KAAKJ,KAAL,CAAWhC,aAAX,KAA6B,MAA7B,IAAuC,KAAKgC,KAAL,CAAWb,YAAX,CAAwBtB,GAAxB,CAA4BuC,GAA5B,CAA3C,EAA6E;AAC3E,aAAO,KAAP;AACD;;AAED,QAAIxC,IAAI,GAAG,KAAKmC,UAAL,CAAgBgB,OAAhB,CAAwBX,GAAxB,CAAX;;AACA,QAAI,CAACxC,IAAD,IAAUA,IAAI,CAACkE,IAAL,KAAc,MAAd,IAAwB,CAAC,KAAK5B,mBAA5C,EAAkE;AAChE,aAAO,KAAP;AACD;;AAED,WAAO,IAAP;AACD;;AAvb+D","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
|
-
|
|
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'
|
|
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.
|
|
490
|
-
|
|
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
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["./packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/SelectionManager.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key} from 'react';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key;\n currentKey: Key;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key, currentKey?: Key) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey || keys.anchorKey;\n this.currentKey = currentKey || keys.currentKey;\n } else {\n this.anchorKey = anchorKey;\n this.currentKey = currentKey;\n }\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key, useMemo, useRef, useState} from 'react';\nimport {MultipleSelection, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '@react-stately/utils';\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelection): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef(null);\n let childFocusStrategyRef = useRef(null);\n let [, setFocusedKey] = useState(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys,\n disabledKeys: disabledKeysProp\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key>, defaultValue?: Selection): 'all' | Selection {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, FocusStrategy, Selection as ISelection, Node, PressEvent, SelectionMode} from '@react-types/shared';\nimport {Key} from 'react';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n private collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean;\n\n constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n this.collection = collection;\n this.state = state;\n this.allowsCellSelection = options?.allowsCellSelection ?? false;\n this._isSelectAll = null;\n }\n\n /**\n * The type of selection that is allowed in the collection.\n */\n get selectionMode(): SelectionMode {\n return this.state.selectionMode;\n }\n\n /**\n * Whether the collection allows empty selection.\n */\n get disallowEmptySelection(): boolean {\n return this.state.disallowEmptySelection;\n }\n\n /**\n * Whether the collection is currently focused.\n */\n get isFocused(): boolean {\n return this.state.isFocused;\n }\n\n /**\n * Sets whether the collection is focused.\n */\n setFocused(isFocused: boolean) {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key {\n return this.state.focusedKey;\n }\n\n /** Whether the first or last child of the focused key should receive focus. */\n get childFocusStrategy(): FocusStrategy {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key, childFocusStrategy?: FocusStrategy) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all' || 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:
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"A;A;AAeA;IACE,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC;IAC3C,8GAA8G;IAC9G,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CACrD;AAED,qCAAsC,SAAQ,UAAU;IACtD,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;IAC1B,+CAA+C;IAC/C,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;CAC/B;AAED,uCAAwC,SAAQ,UAAU;IACxD,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,gDAAgD;IAChD,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC;IACvE,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;CAChC;AAED,yCAA0C,SAAQ,UAAU;IAC1D,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,qDAAqD;IACrD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAAC;IACtC,+CAA+C;IAC/C,QAAQ,CAAC,eAAe,EAAE,GAAG,GAAG,IAAI,CAAC;IACrC,yCAAyC;IACzC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC/C,8CAA8C;IAC9C,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClC,iDAAiD;IACjD,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChC,sDAAsD;IACtD,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACjC,kDAAkD;IAClD,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAC3C,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAClB,2CAA2C;IAC3C,cAAc,IAAI,IAAI,CAAC;IACvB,yDAAyD;IACzD,eAAe,IAAI,IAAI,CAAC;IACxB;A;A;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAAA;
|
|
1
|
+
{"mappings":"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","sources":["./packages/@react-stately/selection/src/packages/@react-stately/selection/src/types.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/Selection.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/useMultipleSelectionState.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/SelectionManager.ts","./packages/@react-stately/selection/src/packages/@react-stately/selection/src/index.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-stately/selection",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.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.
|
|
22
|
-
"@react-stately/utils": "^3.
|
|
23
|
-
"@react-types/shared": "^3.
|
|
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": "
|
|
31
|
+
"gitHead": "45e63a00c00486cf57b457371da6f8749cd9bca4"
|
|
32
32
|
}
|
package/src/SelectionManager.ts
CHANGED
|
@@ -10,7 +10,16 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
Collection,
|
|
15
|
+
FocusStrategy,
|
|
16
|
+
Selection as ISelection,
|
|
17
|
+
LongPressEvent,
|
|
18
|
+
Node,
|
|
19
|
+
PressEvent,
|
|
20
|
+
SelectionBehavior,
|
|
21
|
+
SelectionMode
|
|
22
|
+
} from '@react-types/shared';
|
|
14
23
|
import {Key} from 'react';
|
|
15
24
|
import {MultipleSelectionManager, MultipleSelectionState} from './types';
|
|
16
25
|
import {Selection} from './Selection';
|
|
@@ -49,6 +58,20 @@ export class SelectionManager implements MultipleSelectionManager {
|
|
|
49
58
|
return this.state.disallowEmptySelection;
|
|
50
59
|
}
|
|
51
60
|
|
|
61
|
+
/**
|
|
62
|
+
* The selection behavior for the collection.
|
|
63
|
+
*/
|
|
64
|
+
get selectionBehavior(): SelectionBehavior {
|
|
65
|
+
return this.state.selectionBehavior;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Sets the selection behavior for the collection.
|
|
70
|
+
*/
|
|
71
|
+
setSelectionBehavior(selectionBehavior: SelectionBehavior) {
|
|
72
|
+
this.state.setSelectionBehavior(selectionBehavior);
|
|
73
|
+
}
|
|
74
|
+
|
|
52
75
|
/**
|
|
53
76
|
* Whether the collection is currently focused.
|
|
54
77
|
*/
|
|
@@ -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'
|
|
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.
|
|
375
|
-
|
|
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:
|
|
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
|
}
|