js • Lines: 329import {compareNodeOrder as $684db7aaf37fc901$export$8c434b3a7a4dad6, getChildNodes as $684db7aaf37fc901$export$1005530eda016c13, getFirstItem as $684db7aaf37fc901$export$fbdeaa6a76694f71} from "../collections/getChildNodes.js";
import {Selection as $bfbc740b3949ed3f$export$52baac22726c72bf} from "./Selection.js";
/*
* 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 $60fcbaf037242b1f$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, $684db7aaf37fc901$export$8c434b3a7a4dad6)(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, $684db7aaf37fc901$export$8c434b3a7a4dad6)(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, $bfbc740b3949ed3f$export$52baac22726c72bf)([
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, $bfbc740b3949ed3f$export$52baac22726c72bf)(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, $684db7aaf37fc901$export$8c434b3a7a4dad6)(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, $bfbc740b3949ed3f$export$52baac22726c72bf)(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, $bfbc740b3949ed3f$export$52baac22726c72bf)([
mappedKey
], mappedKey, mappedKey) : new (0, $bfbc740b3949ed3f$export$52baac22726c72bf)();
this.state.setSelectedKeys(selection);
}
/**
* Replaces the selection with the given keys.
*/ setSelectedKeys(keys) {
if (this.selectionMode === 'none') return;
let selection = new (0, $bfbc740b3949ed3f$export$52baac22726c72bf)();
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() {
var _this_fullCollection;
// Use the full (unfiltered) collection when available so that materializing
// the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).
let collection = (_this_fullCollection = this.fullCollection) !== null && _this_fullCollection !== void 0 ? _this_fullCollection : this.collection;
let keys = [];
let addKeys = (key)=>{
while(key != null){
if (this.canSelectItemIn(key, collection)) {
var _getFirstItem;
let item = 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, $684db7aaf37fc901$export$fbdeaa6a76694f71)((0, $684db7aaf37fc901$export$1005530eda016c13)(item, collection))) === null || _getFirstItem === void 0 ? void 0 : _getFirstItem.key) !== null && _getFirstItem_key !== void 0 ? _getFirstItem_key : null);
}
key = collection.getKeyAfter(key);
}
};
addKeys(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, $bfbc740b3949ed3f$export$52baac22726c72bf)());
}
/**
* 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) {
return this.canSelectItemIn(key, this.collection);
}
canSelectItemIn(key, collection) {
var _item_props;
if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false;
let item = 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 _item_props, _item_props1;
let item = this.collection.getItem(key);
return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!(item === null || item === void 0 ? void 0 : (_item_props = item.props) === null || _item_props === void 0 ? void 0 : _item_props.isDisabled)) && (item === null || item === void 0 ? void 0 : (_item_props1 = item.props) === null || _item_props1 === void 0 ? void 0 : _item_props1.disabledBehavior) !== 'selection';
}
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) {
var _this_fullCollection;
return new $60fcbaf037242b1f$export$6c8a5aaad13c9852(collection, this.state, {
allowsCellSelection: this.allowsCellSelection,
layoutDelegate: this.layoutDelegate || undefined,
fullCollection: (_this_fullCollection = this.fullCollection) !== null && _this_fullCollection !== void 0 ? _this_fullCollection : this.collection
});
}
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;
this.fullCollection = (options === null || options === void 0 ? void 0 : options.fullCollection) || null;
}
}
export {$60fcbaf037242b1f$export$6c8a5aaad13c9852 as SelectionManager};
//# sourceMappingURL=SelectionManager.js.map