@react-stately/selection 3.15.0 → 3.16.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.
@@ -23,4 +23,4 @@
23
23
 
24
24
 
25
25
  export {$e40ea825a81a3709$export$52baac22726c72bf as Selection};
26
- //# sourceMappingURL=Selection.mjs.map
26
+ //# sourceMappingURL=Selection.module.js.map
@@ -66,7 +66,7 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
66
66
  /**
67
67
  * The currently selected keys in the collection.
68
68
  */ get selectedKeys() {
69
- return this.state.selectedKeys === "all" ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
69
+ return this.state.selectedKeys === 'all' ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
70
70
  }
71
71
  /**
72
72
  * The raw selection value for the collection.
@@ -77,20 +77,20 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
77
77
  /**
78
78
  * Returns whether a key is selected.
79
79
  */ isSelected(key) {
80
- if (this.state.selectionMode === "none") return false;
80
+ if (this.state.selectionMode === 'none') return false;
81
81
  key = this.getKey(key);
82
- return this.state.selectedKeys === "all" ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
82
+ return this.state.selectedKeys === 'all' ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
83
83
  }
84
84
  /**
85
85
  * Whether the selection is empty.
86
86
  */ get isEmpty() {
87
- return this.state.selectedKeys !== "all" && this.state.selectedKeys.size === 0;
87
+ return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;
88
88
  }
89
89
  /**
90
90
  * Whether all items in the collection are selected.
91
91
  */ get isSelectAll() {
92
92
  if (this.isEmpty) return false;
93
- if (this.state.selectedKeys === "all") return true;
93
+ if (this.state.selectedKeys === 'all') return true;
94
94
  if (this._isSelectAll != null) return this._isSelectAll;
95
95
  let allKeys = this.getSelectAllKeys();
96
96
  let selectedKeys = this.state.selectedKeys;
@@ -122,15 +122,15 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
122
122
  /**
123
123
  * Extends the selection to the given key.
124
124
  */ extendSelection(toKey) {
125
- if (this.selectionMode === "none") return;
126
- if (this.selectionMode === "single") {
125
+ if (this.selectionMode === 'none') return;
126
+ if (this.selectionMode === 'single') {
127
127
  this.replaceSelection(toKey);
128
128
  return;
129
129
  }
130
130
  toKey = this.getKey(toKey);
131
131
  let selection;
132
132
  // Only select the one key if coming from a select all.
133
- if (this.state.selectedKeys === "all") selection = new (0, $21c847070f1f9569$exports.Selection)([
133
+ if (this.state.selectedKeys === 'all') selection = new (0, $21c847070f1f9569$exports.Selection)([
134
134
  toKey
135
135
  ], toKey, toKey);
136
136
  else {
@@ -156,7 +156,7 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
156
156
  let key = from;
157
157
  while(key){
158
158
  let item = this.collection.getItem(key);
159
- if (item && item.type === "item" || item.type === "cell" && this.allowsCellSelection) keys.push(key);
159
+ if (item && item.type === 'item' || item.type === 'cell' && this.allowsCellSelection) keys.push(key);
160
160
  if (key === to) return keys;
161
161
  key = this.collection.getKeyAfter(key);
162
162
  }
@@ -167,23 +167,23 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
167
167
  if (!item) // ¯\_(ツ)_/¯
168
168
  return key;
169
169
  // If cell selection is allowed, just return the key.
170
- if (item.type === "cell" && this.allowsCellSelection) return key;
170
+ if (item.type === 'cell' && this.allowsCellSelection) return key;
171
171
  // Find a parent item to select
172
- while(item.type !== "item" && item.parentKey != null)item = this.collection.getItem(item.parentKey);
173
- if (!item || item.type !== "item") return null;
172
+ while(item.type !== 'item' && item.parentKey != null)item = this.collection.getItem(item.parentKey);
173
+ if (!item || item.type !== 'item') return null;
174
174
  return item.key;
175
175
  }
176
176
  /**
177
177
  * Toggles whether the given key is selected.
178
178
  */ toggleSelection(key) {
179
- if (this.selectionMode === "none") return;
180
- if (this.selectionMode === "single" && !this.isSelected(key)) {
179
+ if (this.selectionMode === 'none') return;
180
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
181
181
  this.replaceSelection(key);
182
182
  return;
183
183
  }
184
184
  key = this.getKey(key);
185
185
  if (key == null) return;
186
- let keys = new (0, $21c847070f1f9569$exports.Selection)(this.state.selectedKeys === "all" ? this.getSelectAllKeys() : this.state.selectedKeys);
186
+ let keys = new (0, $21c847070f1f9569$exports.Selection)(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);
187
187
  if (keys.has(key)) keys.delete(key);
188
188
  else if (this.canSelectItem(key)) {
189
189
  keys.add(key);
@@ -196,7 +196,7 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
196
196
  /**
197
197
  * Replaces the selection with only the given key.
198
198
  */ replaceSelection(key) {
199
- if (this.selectionMode === "none") return;
199
+ if (this.selectionMode === 'none') return;
200
200
  key = this.getKey(key);
201
201
  if (key == null) return;
202
202
  let selection = this.canSelectItem(key) ? new (0, $21c847070f1f9569$exports.Selection)([
@@ -207,13 +207,13 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
207
207
  /**
208
208
  * Replaces the selection with the given keys.
209
209
  */ setSelectedKeys(keys) {
210
- if (this.selectionMode === "none") return;
210
+ if (this.selectionMode === 'none') return;
211
211
  let selection = new (0, $21c847070f1f9569$exports.Selection)();
212
212
  for (let key of keys){
213
213
  key = this.getKey(key);
214
214
  if (key != null) {
215
215
  selection.add(key);
216
- if (this.selectionMode === "single") break;
216
+ if (this.selectionMode === 'single') break;
217
217
  }
218
218
  }
219
219
  this.state.setSelectedKeys(selection);
@@ -221,12 +221,12 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
221
221
  getSelectAllKeys() {
222
222
  let keys = [];
223
223
  let addKeys = (key)=>{
224
- while(key){
224
+ while(key != null){
225
225
  if (this.canSelectItem(key)) {
226
226
  let item = this.collection.getItem(key);
227
- if (item.type === "item") keys.push(key);
227
+ if (item.type === 'item') keys.push(key);
228
228
  // Add child keys. If cell selection is allowed, then include item children too.
229
- if (item.hasChildNodes && (this.allowsCellSelection || item.type !== "item")) addKeys((0, $ia6MY$reactstatelycollections.getFirstItem)((0, $ia6MY$reactstatelycollections.getChildNodes)(item, this.collection)).key);
229
+ if (item.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) addKeys((0, $ia6MY$reactstatelycollections.getFirstItem)((0, $ia6MY$reactstatelycollections.getChildNodes)(item, this.collection)).key);
230
230
  }
231
231
  key = this.collection.getKeyAfter(key);
232
232
  }
@@ -237,12 +237,12 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
237
237
  /**
238
238
  * Selects all items in the collection.
239
239
  */ selectAll() {
240
- if (!this.isSelectAll && this.selectionMode === "multiple") this.state.setSelectedKeys("all");
240
+ if (!this.isSelectAll && this.selectionMode === 'multiple') this.state.setSelectedKeys('all');
241
241
  }
242
242
  /**
243
243
  * Removes all keys from the selection.
244
244
  */ clearSelection() {
245
- if (!this.disallowEmptySelection && (this.state.selectedKeys === "all" || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $21c847070f1f9569$exports.Selection)());
245
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $21c847070f1f9569$exports.Selection)());
246
246
  }
247
247
  /**
248
248
  * Toggles between select all and an empty selection.
@@ -251,11 +251,11 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
251
251
  else this.selectAll();
252
252
  }
253
253
  select(key, e) {
254
- if (this.selectionMode === "none") return;
255
- if (this.selectionMode === "single") {
254
+ if (this.selectionMode === 'none') return;
255
+ if (this.selectionMode === 'single') {
256
256
  if (this.isSelected(key) && !this.disallowEmptySelection) this.toggleSelection(key);
257
257
  else this.replaceSelection(key);
258
- } else if (this.selectionBehavior === "toggle" || e && (e.pointerType === "touch" || e.pointerType === "virtual")) // 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
258
+ } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) // 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
259
259
  this.toggleSelection(key);
260
260
  else this.replaceSelection(key);
261
261
  }
@@ -276,14 +276,14 @@ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 {
276
276
  }
277
277
  canSelectItem(key) {
278
278
  var _item_props;
279
- if (this.state.selectionMode === "none" || this.state.disabledKeys.has(key)) return false;
279
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false;
280
280
  let item = this.collection.getItem(key);
281
- if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === "cell" && !this.allowsCellSelection) return false;
281
+ if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === 'cell' && !this.allowsCellSelection) return false;
282
282
  return true;
283
283
  }
284
284
  isDisabled(key) {
285
285
  var _this_collection_getItem_props, _this_collection_getItem;
286
- return this.state.disabledBehavior === "all" && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
286
+ return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
287
287
  }
288
288
  isLink(key) {
289
289
  var _this_collection_getItem_props, _this_collection_getItem;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["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 {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '@react-stately/collections';\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 | null, childFocusStrategy?: FocusStrategy) {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(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 && compareNodeOrder(this.collection, item, first) < 0)) {\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 && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\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.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n 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 if (this.canSelectItem(key)) {\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 let selection = this.canSelectItem(key)\n ? new Selection([key], key, key)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\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.canSelectItem(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(getFirstItem(getChildNodes(item, this.collection)).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.isSelectAll && 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?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key) {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key) {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key) {\n return this.collection.getItem(key)?.props;\n }\n}\n"],"names":[],"version":3,"file":"SelectionManager.main.js.map"}
1
+ {"mappings":"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","sources":["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 {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '@react-stately/collections';\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 | null, childFocusStrategy?: FocusStrategy) {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(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 && compareNodeOrder(this.collection, item, first) < 0)) {\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 && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\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.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n 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 if (this.canSelectItem(key)) {\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 let selection = this.canSelectItem(key)\n ? new Selection([key], key, key)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\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 != null) {\n if (this.canSelectItem(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(getFirstItem(getChildNodes(item, this.collection)).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.isSelectAll && 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?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key) {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key) {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key) {\n return this.collection.getItem(key)?.props;\n }\n}\n"],"names":[],"version":3,"file":"SelectionManager.main.js.map"}
@@ -60,7 +60,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
60
60
  /**
61
61
  * The currently selected keys in the collection.
62
62
  */ get selectedKeys() {
63
- return this.state.selectedKeys === "all" ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
63
+ return this.state.selectedKeys === 'all' ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
64
64
  }
65
65
  /**
66
66
  * The raw selection value for the collection.
@@ -71,20 +71,20 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
71
71
  /**
72
72
  * Returns whether a key is selected.
73
73
  */ isSelected(key) {
74
- if (this.state.selectionMode === "none") return false;
74
+ if (this.state.selectionMode === 'none') return false;
75
75
  key = this.getKey(key);
76
- return this.state.selectedKeys === "all" ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
76
+ return this.state.selectedKeys === 'all' ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
77
77
  }
78
78
  /**
79
79
  * Whether the selection is empty.
80
80
  */ get isEmpty() {
81
- return this.state.selectedKeys !== "all" && this.state.selectedKeys.size === 0;
81
+ return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;
82
82
  }
83
83
  /**
84
84
  * Whether all items in the collection are selected.
85
85
  */ get isSelectAll() {
86
86
  if (this.isEmpty) return false;
87
- if (this.state.selectedKeys === "all") return true;
87
+ if (this.state.selectedKeys === 'all') return true;
88
88
  if (this._isSelectAll != null) return this._isSelectAll;
89
89
  let allKeys = this.getSelectAllKeys();
90
90
  let selectedKeys = this.state.selectedKeys;
@@ -116,15 +116,15 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
116
116
  /**
117
117
  * Extends the selection to the given key.
118
118
  */ extendSelection(toKey) {
119
- if (this.selectionMode === "none") return;
120
- if (this.selectionMode === "single") {
119
+ if (this.selectionMode === 'none') return;
120
+ if (this.selectionMode === 'single') {
121
121
  this.replaceSelection(toKey);
122
122
  return;
123
123
  }
124
124
  toKey = this.getKey(toKey);
125
125
  let selection;
126
126
  // Only select the one key if coming from a select all.
127
- if (this.state.selectedKeys === "all") selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
127
+ if (this.state.selectedKeys === 'all') selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
128
128
  toKey
129
129
  ], toKey, toKey);
130
130
  else {
@@ -150,7 +150,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
150
150
  let key = from;
151
151
  while(key){
152
152
  let item = this.collection.getItem(key);
153
- if (item && item.type === "item" || item.type === "cell" && this.allowsCellSelection) keys.push(key);
153
+ if (item && item.type === 'item' || item.type === 'cell' && this.allowsCellSelection) keys.push(key);
154
154
  if (key === to) return keys;
155
155
  key = this.collection.getKeyAfter(key);
156
156
  }
@@ -161,23 +161,23 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
161
161
  if (!item) // ¯\_(ツ)_/¯
162
162
  return key;
163
163
  // If cell selection is allowed, just return the key.
164
- if (item.type === "cell" && this.allowsCellSelection) return key;
164
+ if (item.type === 'cell' && this.allowsCellSelection) return key;
165
165
  // Find a parent item to select
166
- while(item.type !== "item" && item.parentKey != null)item = this.collection.getItem(item.parentKey);
167
- if (!item || item.type !== "item") return null;
166
+ while(item.type !== 'item' && item.parentKey != null)item = this.collection.getItem(item.parentKey);
167
+ if (!item || item.type !== 'item') return null;
168
168
  return item.key;
169
169
  }
170
170
  /**
171
171
  * Toggles whether the given key is selected.
172
172
  */ toggleSelection(key) {
173
- if (this.selectionMode === "none") return;
174
- if (this.selectionMode === "single" && !this.isSelected(key)) {
173
+ if (this.selectionMode === 'none') return;
174
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
175
175
  this.replaceSelection(key);
176
176
  return;
177
177
  }
178
178
  key = this.getKey(key);
179
179
  if (key == null) return;
180
- let keys = new (0, $e40ea825a81a3709$export$52baac22726c72bf)(this.state.selectedKeys === "all" ? this.getSelectAllKeys() : this.state.selectedKeys);
180
+ let keys = new (0, $e40ea825a81a3709$export$52baac22726c72bf)(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);
181
181
  if (keys.has(key)) keys.delete(key);
182
182
  else if (this.canSelectItem(key)) {
183
183
  keys.add(key);
@@ -190,7 +190,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
190
190
  /**
191
191
  * Replaces the selection with only the given key.
192
192
  */ replaceSelection(key) {
193
- if (this.selectionMode === "none") return;
193
+ if (this.selectionMode === 'none') return;
194
194
  key = this.getKey(key);
195
195
  if (key == null) return;
196
196
  let selection = this.canSelectItem(key) ? new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
@@ -201,13 +201,13 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
201
201
  /**
202
202
  * Replaces the selection with the given keys.
203
203
  */ setSelectedKeys(keys) {
204
- if (this.selectionMode === "none") return;
204
+ if (this.selectionMode === 'none') return;
205
205
  let selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)();
206
206
  for (let key of keys){
207
207
  key = this.getKey(key);
208
208
  if (key != null) {
209
209
  selection.add(key);
210
- if (this.selectionMode === "single") break;
210
+ if (this.selectionMode === 'single') break;
211
211
  }
212
212
  }
213
213
  this.state.setSelectedKeys(selection);
@@ -215,12 +215,12 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
215
215
  getSelectAllKeys() {
216
216
  let keys = [];
217
217
  let addKeys = (key)=>{
218
- while(key){
218
+ while(key != null){
219
219
  if (this.canSelectItem(key)) {
220
220
  let item = this.collection.getItem(key);
221
- if (item.type === "item") keys.push(key);
221
+ if (item.type === 'item') keys.push(key);
222
222
  // Add child keys. If cell selection is allowed, then include item children too.
223
- if (item.hasChildNodes && (this.allowsCellSelection || item.type !== "item")) addKeys((0, $jkhUT$getFirstItem)((0, $jkhUT$getChildNodes)(item, this.collection)).key);
223
+ if (item.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) addKeys((0, $jkhUT$getFirstItem)((0, $jkhUT$getChildNodes)(item, this.collection)).key);
224
224
  }
225
225
  key = this.collection.getKeyAfter(key);
226
226
  }
@@ -231,12 +231,12 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
231
231
  /**
232
232
  * Selects all items in the collection.
233
233
  */ selectAll() {
234
- if (!this.isSelectAll && this.selectionMode === "multiple") this.state.setSelectedKeys("all");
234
+ if (!this.isSelectAll && this.selectionMode === 'multiple') this.state.setSelectedKeys('all');
235
235
  }
236
236
  /**
237
237
  * Removes all keys from the selection.
238
238
  */ clearSelection() {
239
- if (!this.disallowEmptySelection && (this.state.selectedKeys === "all" || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $e40ea825a81a3709$export$52baac22726c72bf)());
239
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $e40ea825a81a3709$export$52baac22726c72bf)());
240
240
  }
241
241
  /**
242
242
  * Toggles between select all and an empty selection.
@@ -245,11 +245,11 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
245
245
  else this.selectAll();
246
246
  }
247
247
  select(key, e) {
248
- if (this.selectionMode === "none") return;
249
- if (this.selectionMode === "single") {
248
+ if (this.selectionMode === 'none') return;
249
+ if (this.selectionMode === 'single') {
250
250
  if (this.isSelected(key) && !this.disallowEmptySelection) this.toggleSelection(key);
251
251
  else this.replaceSelection(key);
252
- } else if (this.selectionBehavior === "toggle" || e && (e.pointerType === "touch" || e.pointerType === "virtual")) // 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
252
+ } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) // 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
253
253
  this.toggleSelection(key);
254
254
  else this.replaceSelection(key);
255
255
  }
@@ -270,14 +270,14 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
270
270
  }
271
271
  canSelectItem(key) {
272
272
  var _item_props;
273
- if (this.state.selectionMode === "none" || this.state.disabledKeys.has(key)) return false;
273
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false;
274
274
  let item = this.collection.getItem(key);
275
- if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === "cell" && !this.allowsCellSelection) return false;
275
+ if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === 'cell' && !this.allowsCellSelection) return false;
276
276
  return true;
277
277
  }
278
278
  isDisabled(key) {
279
279
  var _this_collection_getItem_props, _this_collection_getItem;
280
- return this.state.disabledBehavior === "all" && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
280
+ return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
281
281
  }
282
282
  isLink(key) {
283
283
  var _this_collection_getItem_props, _this_collection_getItem;
@@ -298,4 +298,4 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
298
298
 
299
299
 
300
300
  export {$d496c0a20b6e58ec$export$6c8a5aaad13c9852 as SelectionManager};
301
- //# sourceMappingURL=SelectionManager.mjs.map
301
+ //# sourceMappingURL=SelectionManager.module.js.map
@@ -60,7 +60,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
60
60
  /**
61
61
  * The currently selected keys in the collection.
62
62
  */ get selectedKeys() {
63
- return this.state.selectedKeys === "all" ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
63
+ return this.state.selectedKeys === 'all' ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;
64
64
  }
65
65
  /**
66
66
  * The raw selection value for the collection.
@@ -71,20 +71,20 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
71
71
  /**
72
72
  * Returns whether a key is selected.
73
73
  */ isSelected(key) {
74
- if (this.state.selectionMode === "none") return false;
74
+ if (this.state.selectionMode === 'none') return false;
75
75
  key = this.getKey(key);
76
- return this.state.selectedKeys === "all" ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
76
+ return this.state.selectedKeys === 'all' ? this.canSelectItem(key) : this.state.selectedKeys.has(key);
77
77
  }
78
78
  /**
79
79
  * Whether the selection is empty.
80
80
  */ get isEmpty() {
81
- return this.state.selectedKeys !== "all" && this.state.selectedKeys.size === 0;
81
+ return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;
82
82
  }
83
83
  /**
84
84
  * Whether all items in the collection are selected.
85
85
  */ get isSelectAll() {
86
86
  if (this.isEmpty) return false;
87
- if (this.state.selectedKeys === "all") return true;
87
+ if (this.state.selectedKeys === 'all') return true;
88
88
  if (this._isSelectAll != null) return this._isSelectAll;
89
89
  let allKeys = this.getSelectAllKeys();
90
90
  let selectedKeys = this.state.selectedKeys;
@@ -116,15 +116,15 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
116
116
  /**
117
117
  * Extends the selection to the given key.
118
118
  */ extendSelection(toKey) {
119
- if (this.selectionMode === "none") return;
120
- if (this.selectionMode === "single") {
119
+ if (this.selectionMode === 'none') return;
120
+ if (this.selectionMode === 'single') {
121
121
  this.replaceSelection(toKey);
122
122
  return;
123
123
  }
124
124
  toKey = this.getKey(toKey);
125
125
  let selection;
126
126
  // Only select the one key if coming from a select all.
127
- if (this.state.selectedKeys === "all") selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
127
+ if (this.state.selectedKeys === 'all') selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
128
128
  toKey
129
129
  ], toKey, toKey);
130
130
  else {
@@ -150,7 +150,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
150
150
  let key = from;
151
151
  while(key){
152
152
  let item = this.collection.getItem(key);
153
- if (item && item.type === "item" || item.type === "cell" && this.allowsCellSelection) keys.push(key);
153
+ if (item && item.type === 'item' || item.type === 'cell' && this.allowsCellSelection) keys.push(key);
154
154
  if (key === to) return keys;
155
155
  key = this.collection.getKeyAfter(key);
156
156
  }
@@ -161,23 +161,23 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
161
161
  if (!item) // ¯\_(ツ)_/¯
162
162
  return key;
163
163
  // If cell selection is allowed, just return the key.
164
- if (item.type === "cell" && this.allowsCellSelection) return key;
164
+ if (item.type === 'cell' && this.allowsCellSelection) return key;
165
165
  // Find a parent item to select
166
- while(item.type !== "item" && item.parentKey != null)item = this.collection.getItem(item.parentKey);
167
- if (!item || item.type !== "item") return null;
166
+ while(item.type !== 'item' && item.parentKey != null)item = this.collection.getItem(item.parentKey);
167
+ if (!item || item.type !== 'item') return null;
168
168
  return item.key;
169
169
  }
170
170
  /**
171
171
  * Toggles whether the given key is selected.
172
172
  */ toggleSelection(key) {
173
- if (this.selectionMode === "none") return;
174
- if (this.selectionMode === "single" && !this.isSelected(key)) {
173
+ if (this.selectionMode === 'none') return;
174
+ if (this.selectionMode === 'single' && !this.isSelected(key)) {
175
175
  this.replaceSelection(key);
176
176
  return;
177
177
  }
178
178
  key = this.getKey(key);
179
179
  if (key == null) return;
180
- let keys = new (0, $e40ea825a81a3709$export$52baac22726c72bf)(this.state.selectedKeys === "all" ? this.getSelectAllKeys() : this.state.selectedKeys);
180
+ let keys = new (0, $e40ea825a81a3709$export$52baac22726c72bf)(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);
181
181
  if (keys.has(key)) keys.delete(key);
182
182
  else if (this.canSelectItem(key)) {
183
183
  keys.add(key);
@@ -190,7 +190,7 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
190
190
  /**
191
191
  * Replaces the selection with only the given key.
192
192
  */ replaceSelection(key) {
193
- if (this.selectionMode === "none") return;
193
+ if (this.selectionMode === 'none') return;
194
194
  key = this.getKey(key);
195
195
  if (key == null) return;
196
196
  let selection = this.canSelectItem(key) ? new (0, $e40ea825a81a3709$export$52baac22726c72bf)([
@@ -201,13 +201,13 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
201
201
  /**
202
202
  * Replaces the selection with the given keys.
203
203
  */ setSelectedKeys(keys) {
204
- if (this.selectionMode === "none") return;
204
+ if (this.selectionMode === 'none') return;
205
205
  let selection = new (0, $e40ea825a81a3709$export$52baac22726c72bf)();
206
206
  for (let key of keys){
207
207
  key = this.getKey(key);
208
208
  if (key != null) {
209
209
  selection.add(key);
210
- if (this.selectionMode === "single") break;
210
+ if (this.selectionMode === 'single') break;
211
211
  }
212
212
  }
213
213
  this.state.setSelectedKeys(selection);
@@ -215,12 +215,12 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
215
215
  getSelectAllKeys() {
216
216
  let keys = [];
217
217
  let addKeys = (key)=>{
218
- while(key){
218
+ while(key != null){
219
219
  if (this.canSelectItem(key)) {
220
220
  let item = this.collection.getItem(key);
221
- if (item.type === "item") keys.push(key);
221
+ if (item.type === 'item') keys.push(key);
222
222
  // Add child keys. If cell selection is allowed, then include item children too.
223
- if (item.hasChildNodes && (this.allowsCellSelection || item.type !== "item")) addKeys((0, $jkhUT$getFirstItem)((0, $jkhUT$getChildNodes)(item, this.collection)).key);
223
+ if (item.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) addKeys((0, $jkhUT$getFirstItem)((0, $jkhUT$getChildNodes)(item, this.collection)).key);
224
224
  }
225
225
  key = this.collection.getKeyAfter(key);
226
226
  }
@@ -231,12 +231,12 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
231
231
  /**
232
232
  * Selects all items in the collection.
233
233
  */ selectAll() {
234
- if (!this.isSelectAll && this.selectionMode === "multiple") this.state.setSelectedKeys("all");
234
+ if (!this.isSelectAll && this.selectionMode === 'multiple') this.state.setSelectedKeys('all');
235
235
  }
236
236
  /**
237
237
  * Removes all keys from the selection.
238
238
  */ clearSelection() {
239
- if (!this.disallowEmptySelection && (this.state.selectedKeys === "all" || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $e40ea825a81a3709$export$52baac22726c72bf)());
239
+ if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $e40ea825a81a3709$export$52baac22726c72bf)());
240
240
  }
241
241
  /**
242
242
  * Toggles between select all and an empty selection.
@@ -245,11 +245,11 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
245
245
  else this.selectAll();
246
246
  }
247
247
  select(key, e) {
248
- if (this.selectionMode === "none") return;
249
- if (this.selectionMode === "single") {
248
+ if (this.selectionMode === 'none') return;
249
+ if (this.selectionMode === 'single') {
250
250
  if (this.isSelected(key) && !this.disallowEmptySelection) this.toggleSelection(key);
251
251
  else this.replaceSelection(key);
252
- } else if (this.selectionBehavior === "toggle" || e && (e.pointerType === "touch" || e.pointerType === "virtual")) // 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
252
+ } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) // 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
253
253
  this.toggleSelection(key);
254
254
  else this.replaceSelection(key);
255
255
  }
@@ -270,14 +270,14 @@ class $d496c0a20b6e58ec$export$6c8a5aaad13c9852 {
270
270
  }
271
271
  canSelectItem(key) {
272
272
  var _item_props;
273
- if (this.state.selectionMode === "none" || this.state.disabledKeys.has(key)) return false;
273
+ if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false;
274
274
  let item = this.collection.getItem(key);
275
- if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === "cell" && !this.allowsCellSelection) return false;
275
+ if (!item || (item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled) || item.type === 'cell' && !this.allowsCellSelection) return false;
276
276
  return true;
277
277
  }
278
278
  isDisabled(key) {
279
279
  var _this_collection_getItem_props, _this_collection_getItem;
280
- return this.state.disabledBehavior === "all" && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
280
+ return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!((_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : (_this_collection_getItem_props = _this_collection_getItem.props) === null || _this_collection_getItem_props === void 0 ? void 0 : _this_collection_getItem_props.isDisabled));
281
281
  }
282
282
  isLink(key) {
283
283
  var _this_collection_getItem_props, _this_collection_getItem;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["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 {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '@react-stately/collections';\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 | null, childFocusStrategy?: FocusStrategy) {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(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 && compareNodeOrder(this.collection, item, first) < 0)) {\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 && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\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.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n 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 if (this.canSelectItem(key)) {\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 let selection = this.canSelectItem(key)\n ? new Selection([key], key, key)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\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.canSelectItem(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(getFirstItem(getChildNodes(item, this.collection)).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.isSelectAll && 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?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key) {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key) {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key) {\n return this.collection.getItem(key)?.props;\n }\n}\n"],"names":[],"version":3,"file":"SelectionManager.module.js.map"}
1
+ {"mappings":"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","sources":["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 {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '@react-stately/collections';\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 | null, childFocusStrategy?: FocusStrategy) {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key) {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n key = this.getKey(key);\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(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 && compareNodeOrder(this.collection, item, first) < 0)) {\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 && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key) {\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.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n 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 if (this.canSelectItem(key)) {\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 let selection = this.canSelectItem(key)\n ? new Selection([key], key, key)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>) {\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 != null) {\n if (this.canSelectItem(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(getFirstItem(getChildNodes(item, this.collection)).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.isSelectAll && 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?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key) {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key) {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key) {\n return this.collection.getItem(key)?.props;\n }\n}\n"],"names":[],"version":3,"file":"SelectionManager.module.js.map"}
@@ -29,7 +29,7 @@ function $1adc19da2128bba9$var$equalSets(setA, setB) {
29
29
  return true;
30
30
  }
31
31
  function $1adc19da2128bba9$export$253fe78d46329472(props) {
32
- let { selectionMode: selectionMode = "none", disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = "toggle", disabledBehavior: disabledBehavior = "all" } = props;
32
+ let { selectionMode: selectionMode = 'none', disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = 'toggle', disabledBehavior: disabledBehavior = 'all' } = props;
33
33
  // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
34
34
  // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).
35
35
  let isFocusedRef = (0, $byFPT$react.useRef)(false);
@@ -50,7 +50,7 @@ function $1adc19da2128bba9$export$253fe78d46329472(props) {
50
50
  let [selectionBehavior, setSelectionBehavior] = (0, $byFPT$react.useState)(selectionBehaviorProp);
51
51
  // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
52
52
  // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
53
- if (selectionBehaviorProp === "replace" && selectionBehavior === "toggle" && typeof selectedKeys === "object" && selectedKeys.size === 0) setSelectionBehavior("replace");
53
+ if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) setSelectionBehavior('replace');
54
54
  // If the selectionBehavior prop changes, update the state as well.
55
55
  let lastSelectionBehavior = (0, $byFPT$react.useRef)(selectionBehaviorProp);
56
56
  (0, $byFPT$react.useEffect)(()=>{
@@ -79,7 +79,7 @@ function $1adc19da2128bba9$export$253fe78d46329472(props) {
79
79
  get childFocusStrategy () {
80
80
  return childFocusStrategyRef.current;
81
81
  },
82
- setFocusedKey (k, childFocusStrategy = "first") {
82
+ setFocusedKey (k, childFocusStrategy = 'first') {
83
83
  focusedKeyRef.current = k;
84
84
  childFocusStrategyRef.current = childFocusStrategy;
85
85
  setFocusedKey(k);
@@ -94,7 +94,7 @@ function $1adc19da2128bba9$export$253fe78d46329472(props) {
94
94
  }
95
95
  function $1adc19da2128bba9$var$convertSelection(selection, defaultValue) {
96
96
  if (!selection) return defaultValue;
97
- return selection === "all" ? "all" : new (0, $21c847070f1f9569$exports.Selection)(selection);
97
+ return selection === 'all' ? 'all' : new (0, $21c847070f1f9569$exports.Selection)(selection);
98
98
  }
99
99
 
100
100
 
@@ -23,7 +23,7 @@ function $7af3f5b51489e0b5$var$equalSets(setA, setB) {
23
23
  return true;
24
24
  }
25
25
  function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
26
- let { selectionMode: selectionMode = "none", disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = "toggle", disabledBehavior: disabledBehavior = "all" } = props;
26
+ let { selectionMode: selectionMode = 'none', disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = 'toggle', disabledBehavior: disabledBehavior = 'all' } = props;
27
27
  // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
28
28
  // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).
29
29
  let isFocusedRef = (0, $6tM1y$useRef)(false);
@@ -44,7 +44,7 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
44
44
  let [selectionBehavior, setSelectionBehavior] = (0, $6tM1y$useState)(selectionBehaviorProp);
45
45
  // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
46
46
  // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
47
- if (selectionBehaviorProp === "replace" && selectionBehavior === "toggle" && typeof selectedKeys === "object" && selectedKeys.size === 0) setSelectionBehavior("replace");
47
+ if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) setSelectionBehavior('replace');
48
48
  // If the selectionBehavior prop changes, update the state as well.
49
49
  let lastSelectionBehavior = (0, $6tM1y$useRef)(selectionBehaviorProp);
50
50
  (0, $6tM1y$useEffect)(()=>{
@@ -73,7 +73,7 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
73
73
  get childFocusStrategy () {
74
74
  return childFocusStrategyRef.current;
75
75
  },
76
- setFocusedKey (k, childFocusStrategy = "first") {
76
+ setFocusedKey (k, childFocusStrategy = 'first') {
77
77
  focusedKeyRef.current = k;
78
78
  childFocusStrategyRef.current = childFocusStrategy;
79
79
  setFocusedKey(k);
@@ -88,9 +88,9 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
88
88
  }
89
89
  function $7af3f5b51489e0b5$var$convertSelection(selection, defaultValue) {
90
90
  if (!selection) return defaultValue;
91
- return selection === "all" ? "all" : new (0, $e40ea825a81a3709$export$52baac22726c72bf)(selection);
91
+ return selection === 'all' ? 'all' : new (0, $e40ea825a81a3709$export$52baac22726c72bf)(selection);
92
92
  }
93
93
 
94
94
 
95
95
  export {$7af3f5b51489e0b5$export$253fe78d46329472 as useMultipleSelectionState};
96
- //# sourceMappingURL=useMultipleSelectionState.mjs.map
96
+ //# sourceMappingURL=useMultipleSelectionState.module.js.map
@@ -23,7 +23,7 @@ function $7af3f5b51489e0b5$var$equalSets(setA, setB) {
23
23
  return true;
24
24
  }
25
25
  function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
26
- let { selectionMode: selectionMode = "none", disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = "toggle", disabledBehavior: disabledBehavior = "all" } = props;
26
+ let { selectionMode: selectionMode = 'none', disallowEmptySelection: disallowEmptySelection, allowDuplicateSelectionEvents: allowDuplicateSelectionEvents, selectionBehavior: selectionBehaviorProp = 'toggle', disabledBehavior: disabledBehavior = 'all' } = props;
27
27
  // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.
28
28
  // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).
29
29
  let isFocusedRef = (0, $6tM1y$useRef)(false);
@@ -44,7 +44,7 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
44
44
  let [selectionBehavior, setSelectionBehavior] = (0, $6tM1y$useState)(selectionBehaviorProp);
45
45
  // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press
46
46
  // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.
47
- if (selectionBehaviorProp === "replace" && selectionBehavior === "toggle" && typeof selectedKeys === "object" && selectedKeys.size === 0) setSelectionBehavior("replace");
47
+ if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) setSelectionBehavior('replace');
48
48
  // If the selectionBehavior prop changes, update the state as well.
49
49
  let lastSelectionBehavior = (0, $6tM1y$useRef)(selectionBehaviorProp);
50
50
  (0, $6tM1y$useEffect)(()=>{
@@ -73,7 +73,7 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
73
73
  get childFocusStrategy () {
74
74
  return childFocusStrategyRef.current;
75
75
  },
76
- setFocusedKey (k, childFocusStrategy = "first") {
76
+ setFocusedKey (k, childFocusStrategy = 'first') {
77
77
  focusedKeyRef.current = k;
78
78
  childFocusStrategyRef.current = childFocusStrategy;
79
79
  setFocusedKey(k);
@@ -88,7 +88,7 @@ function $7af3f5b51489e0b5$export$253fe78d46329472(props) {
88
88
  }
89
89
  function $7af3f5b51489e0b5$var$convertSelection(selection, defaultValue) {
90
90
  if (!selection) return defaultValue;
91
- return selection === "all" ? "all" : new (0, $e40ea825a81a3709$export$52baac22726c72bf)(selection);
91
+ return selection === 'all' ? 'all' : new (0, $e40ea825a81a3709$export$52baac22726c72bf)(selection);
92
92
  }
93
93
 
94
94
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-stately/selection",
3
- "version": "3.15.0",
3
+ "version": "3.16.0",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -22,16 +22,16 @@
22
22
  "url": "https://github.com/adobe/react-spectrum"
23
23
  },
24
24
  "dependencies": {
25
- "@react-stately/collections": "^3.10.6",
26
- "@react-stately/utils": "^3.10.0",
27
- "@react-types/shared": "^3.23.0",
25
+ "@react-stately/collections": "^3.10.8",
26
+ "@react-stately/utils": "^3.10.2",
27
+ "@react-types/shared": "^3.24.0",
28
28
  "@swc/helpers": "^0.5.0"
29
29
  },
30
30
  "peerDependencies": {
31
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
31
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public"
35
35
  },
36
- "gitHead": "f645f29edc1322153fd60af4640cbcab1d992dbd"
36
+ "gitHead": "86d80e3216bc32e75108831cf3a5a720bc849206"
37
37
  }
@@ -376,7 +376,7 @@ export class SelectionManager implements MultipleSelectionManager {
376
376
  private getSelectAllKeys() {
377
377
  let keys: Key[] = [];
378
378
  let addKeys = (key: Key) => {
379
- while (key) {
379
+ while (key != null) {
380
380
  if (this.canSelectItem(key)) {
381
381
  let item = this.collection.getItem(key);
382
382
  if (item.type === 'item') {