var $21c847070f1f9569$exports = require("./Selection.main.js"); var $ia6MY$reactstatelycollections = require("@react-stately/collections"); function $parcel$export(e, n, v, s) { Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true}); } $parcel$export(module.exports, "SelectionManager", () => $8112da6fa5bbc322$export$6c8a5aaad13c9852); /* * Copyright 2020 Adobe. All rights reserved. * This file is licensed to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ class $8112da6fa5bbc322$export$6c8a5aaad13c9852 { /** * The type of selection that is allowed in the collection. */ get selectionMode() { return this.state.selectionMode; } /** * Whether the collection allows empty selection. */ get disallowEmptySelection() { return this.state.disallowEmptySelection; } /** * The selection behavior for the collection. */ get selectionBehavior() { return this.state.selectionBehavior; } /** * Sets the selection behavior for the collection. */ setSelectionBehavior(selectionBehavior) { this.state.setSelectionBehavior(selectionBehavior); } /** * Whether the collection is currently focused. */ get isFocused() { return this.state.isFocused; } /** * Sets whether the collection is focused. */ setFocused(isFocused) { this.state.setFocused(isFocused); } /** * The current focused key in the collection. */ get focusedKey() { return this.state.focusedKey; } /** Whether the first or last child of the focused key should receive focus. */ get childFocusStrategy() { return this.state.childFocusStrategy; } /** * Sets the focused key. */ setFocusedKey(key, childFocusStrategy) { if (key == null || this.collection.getItem(key)) this.state.setFocusedKey(key, childFocusStrategy); } /** * The currently selected keys in the collection. */ get selectedKeys() { return this.state.selectedKeys === 'all' ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys; } /** * The raw selection value for the collection. * Either 'all' for select all, or a set of keys. */ get rawSelection() { return this.state.selectedKeys; } /** * Returns whether a key is selected. */ isSelected(key) { if (this.state.selectionMode === 'none') return false; let mappedKey = this.getKey(key); if (mappedKey == null) return false; return this.state.selectedKeys === 'all' ? this.canSelectItem(mappedKey) : this.state.selectedKeys.has(mappedKey); } /** * Whether the selection is empty. */ get isEmpty() { return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0; } /** * Whether all items in the collection are selected. */ get isSelectAll() { if (this.isEmpty) return false; if (this.state.selectedKeys === 'all') return true; if (this._isSelectAll != null) return this._isSelectAll; let allKeys = this.getSelectAllKeys(); let selectedKeys = this.state.selectedKeys; this._isSelectAll = allKeys.every((k)=>selectedKeys.has(k)); return this._isSelectAll; } get firstSelectedKey() { let first = null; for (let key of this.state.selectedKeys){ let item = this.collection.getItem(key); if (!first || item && (0, $ia6MY$reactstatelycollections.compareNodeOrder)(this.collection, item, first) < 0) first = item; } var _first_key; return (_first_key = first === null || first === void 0 ? void 0 : first.key) !== null && _first_key !== void 0 ? _first_key : null; } get lastSelectedKey() { let last = null; for (let key of this.state.selectedKeys){ let item = this.collection.getItem(key); if (!last || item && (0, $ia6MY$reactstatelycollections.compareNodeOrder)(this.collection, item, last) > 0) last = item; } var _last_key; return (_last_key = last === null || last === void 0 ? void 0 : last.key) !== null && _last_key !== void 0 ? _last_key : null; } get disabledKeys() { return this.state.disabledKeys; } get disabledBehavior() { return this.state.disabledBehavior; } /** * Extends the selection to the given key. */ extendSelection(toKey) { if (this.selectionMode === 'none') return; if (this.selectionMode === 'single') { this.replaceSelection(toKey); return; } let mappedToKey = this.getKey(toKey); if (mappedToKey == null) return; let selection; // Only select the one key if coming from a select all. if (this.state.selectedKeys === 'all') selection = new (0, $21c847070f1f9569$exports.Selection)([ mappedToKey ], mappedToKey, mappedToKey); else { let selectedKeys = this.state.selectedKeys; var _selectedKeys_anchorKey; let anchorKey = (_selectedKeys_anchorKey = selectedKeys.anchorKey) !== null && _selectedKeys_anchorKey !== void 0 ? _selectedKeys_anchorKey : mappedToKey; selection = new (0, $21c847070f1f9569$exports.Selection)(selectedKeys, anchorKey, mappedToKey); var _selectedKeys_currentKey; for (let key of this.getKeyRange(anchorKey, (_selectedKeys_currentKey = selectedKeys.currentKey) !== null && _selectedKeys_currentKey !== void 0 ? _selectedKeys_currentKey : mappedToKey))selection.delete(key); for (let key of this.getKeyRange(mappedToKey, anchorKey))if (this.canSelectItem(key)) selection.add(key); } this.state.setSelectedKeys(selection); } getKeyRange(from, to) { let fromItem = this.collection.getItem(from); let toItem = this.collection.getItem(to); if (fromItem && toItem) { if ((0, $ia6MY$reactstatelycollections.compareNodeOrder)(this.collection, fromItem, toItem) <= 0) return this.getKeyRangeInternal(from, to); return this.getKeyRangeInternal(to, from); } return []; } getKeyRangeInternal(from, to) { var _this_layoutDelegate; if ((_this_layoutDelegate = this.layoutDelegate) === null || _this_layoutDelegate === void 0 ? void 0 : _this_layoutDelegate.getKeyRange) return this.layoutDelegate.getKeyRange(from, to); let keys = []; let key = from; while(key != null){ let item = this.collection.getItem(key); if (item && (item.type === 'item' || item.type === 'cell' && this.allowsCellSelection)) keys.push(key); if (key === to) return keys; key = this.collection.getKeyAfter(key); } return []; } getKey(key) { let item = this.collection.getItem(key); if (!item) // ¯\_(ツ)_/¯ return key; // If cell selection is allowed, just return the key. if (item.type === 'cell' && this.allowsCellSelection) return key; // Find a parent item to select while(item && item.type !== 'item' && item.parentKey != null)item = this.collection.getItem(item.parentKey); if (!item || item.type !== 'item') return null; return item.key; } /** * Toggles whether the given key is selected. */ toggleSelection(key) { if (this.selectionMode === 'none') return; if (this.selectionMode === 'single' && !this.isSelected(key)) { this.replaceSelection(key); return; } let mappedKey = this.getKey(key); if (mappedKey == null) return; let keys = new (0, $21c847070f1f9569$exports.Selection)(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys); if (keys.has(mappedKey)) keys.delete(mappedKey); else if (this.canSelectItem(mappedKey)) { keys.add(mappedKey); keys.anchorKey = mappedKey; keys.currentKey = mappedKey; } if (this.disallowEmptySelection && keys.size === 0) return; this.state.setSelectedKeys(keys); } /** * Replaces the selection with only the given key. */ replaceSelection(key) { if (this.selectionMode === 'none') return; let mappedKey = this.getKey(key); if (mappedKey == null) return; let selection = this.canSelectItem(mappedKey) ? new (0, $21c847070f1f9569$exports.Selection)([ mappedKey ], mappedKey, mappedKey) : new (0, $21c847070f1f9569$exports.Selection)(); this.state.setSelectedKeys(selection); } /** * Replaces the selection with the given keys. */ setSelectedKeys(keys) { if (this.selectionMode === 'none') return; let selection = new (0, $21c847070f1f9569$exports.Selection)(); for (let key of keys){ let mappedKey = this.getKey(key); if (mappedKey != null) { selection.add(mappedKey); if (this.selectionMode === 'single') break; } } this.state.setSelectedKeys(selection); } getSelectAllKeys() { let keys = []; let addKeys = (key)=>{ while(key != null){ if (this.canSelectItem(key)) { var _getFirstItem; let item = this.collection.getItem(key); if ((item === null || item === void 0 ? void 0 : item.type) === 'item') keys.push(key); var _getFirstItem_key; // Add child keys. If cell selection is allowed, then include item children too. if ((item === null || item === void 0 ? void 0 : item.hasChildNodes) && (this.allowsCellSelection || item.type !== 'item')) addKeys((_getFirstItem_key = (_getFirstItem = (0, $ia6MY$reactstatelycollections.getFirstItem)((0, $ia6MY$reactstatelycollections.getChildNodes)(item, this.collection))) === null || _getFirstItem === void 0 ? void 0 : _getFirstItem.key) !== null && _getFirstItem_key !== void 0 ? _getFirstItem_key : null); } key = this.collection.getKeyAfter(key); } }; addKeys(this.collection.getFirstKey()); return keys; } /** * Selects all items in the collection. */ selectAll() { if (!this.isSelectAll && this.selectionMode === 'multiple') this.state.setSelectedKeys('all'); } /** * Removes all keys from the selection. */ clearSelection() { if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new (0, $21c847070f1f9569$exports.Selection)()); } /** * Toggles between select all and an empty selection. */ toggleSelectAll() { if (this.isSelectAll) this.clearSelection(); else this.selectAll(); } select(key, e) { if (this.selectionMode === 'none') return; if (this.selectionMode === 'single') { if (this.isSelected(key) && !this.disallowEmptySelection) this.toggleSelection(key); else this.replaceSelection(key); } 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 this.toggleSelection(key); else this.replaceSelection(key); } /** * Returns whether the current selection is equal to the given selection. */ isSelectionEqual(selection) { if (selection === this.state.selectedKeys) return true; // Check if the set of keys match. let selectedKeys = this.selectedKeys; if (selection.size !== selectedKeys.size) return false; for (let key of selection){ if (!selectedKeys.has(key)) return false; } for (let key of selectedKeys){ if (!selection.has(key)) return false; } return true; } canSelectItem(key) { var _item_props; if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false; let item = this.collection.getItem(key); 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; return true; } isDisabled(key) { var _this_collection_getItem_props, _this_collection_getItem; 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)); } isLink(key) { var _this_collection_getItem_props, _this_collection_getItem; return !!((_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.href); } getItemProps(key) { var _this_collection_getItem; return (_this_collection_getItem = this.collection.getItem(key)) === null || _this_collection_getItem === void 0 ? void 0 : _this_collection_getItem.props; } withCollection(collection) { return new $8112da6fa5bbc322$export$6c8a5aaad13c9852(collection, this.state, { allowsCellSelection: this.allowsCellSelection, layoutDelegate: this.layoutDelegate || undefined }); } constructor(collection, state, options){ this.collection = collection; this.state = state; var _options_allowsCellSelection; this.allowsCellSelection = (_options_allowsCellSelection = options === null || options === void 0 ? void 0 : options.allowsCellSelection) !== null && _options_allowsCellSelection !== void 0 ? _options_allowsCellSelection : false; this._isSelectAll = null; this.layoutDelegate = (options === null || options === void 0 ? void 0 : options.layoutDelegate) || null; } } //# sourceMappingURL=SelectionManager.main.js.map