319 lines
15 KiB
Plaintext
319 lines
15 KiB
Plaintext
import {Selection as $e40ea825a81a3709$export$52baac22726c72bf} from "./Selection.module.js";
|
|
import {compareNodeOrder as $jkhUT$compareNodeOrder, getFirstItem as $jkhUT$getFirstItem, getChildNodes as $jkhUT$getChildNodes} from "@react-stately/collections";
|
|
|
|
/*
|
|
* 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 $d496c0a20b6e58ec$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, $jkhUT$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, $jkhUT$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, $e40ea825a81a3709$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, $e40ea825a81a3709$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, $jkhUT$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, $e40ea825a81a3709$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, $e40ea825a81a3709$export$52baac22726c72bf)([
|
|
mappedKey
|
|
], mappedKey, mappedKey) : new (0, $e40ea825a81a3709$export$52baac22726c72bf)();
|
|
this.state.setSelectedKeys(selection);
|
|
}
|
|
/**
|
|
* Replaces the selection with the given keys.
|
|
*/ setSelectedKeys(keys) {
|
|
if (this.selectionMode === 'none') return;
|
|
let selection = new (0, $e40ea825a81a3709$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() {
|
|
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, $jkhUT$getFirstItem)((0, $jkhUT$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, $e40ea825a81a3709$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) {
|
|
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 $d496c0a20b6e58ec$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;
|
|
}
|
|
}
|
|
|
|
|
|
export {$d496c0a20b6e58ec$export$6c8a5aaad13c9852 as SelectionManager};
|
|
//# sourceMappingURL=SelectionManager.module.js.map
|