devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
234 lines (232 loc) • 9.15 kB
JavaScript
/**
* DevExtreme (cjs/__internal/ui/selection/m_selection.strategy.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _query = _interopRequireDefault(require("../../../common/data/query"));
var _common = require("../../../core/utils/common");
var _deferred = require("../../../core/utils/deferred");
var _type = require("../../../core/utils/type");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
class SelectionStrategy {
constructor(options) {
this._lastSelectAllPageDeferred = (0, _deferred.Deferred)().reject();
this.options = options;
this._setOption("disabledItemKeys", []);
this._clearItemKeys()
}
_clearItemKeys() {
this._setOption("addedItemKeys", []);
this._setOption("removedItemKeys", []);
this._setOption("removedItems", []);
this._setOption("addedItems", [])
}
validate() {}
_setOption(name, value) {
this.options[name] = value
}
onSelectionChanging() {
const {
selectedItems: selectedItems,
selectedItemKeys: selectedItemKeys,
addedItemKeys: addedItemKeys,
removedItemKeys: removedItemKeys,
addedItems: addedItems,
removedItems: removedItems,
onSelectionChanging: onSelectionChanging = _common.noop
} = this.options;
const selectionChangingArgs = {
selectedItems: selectedItems,
selectedItemKeys: selectedItemKeys,
addedItemKeys: addedItemKeys,
removedItemKeys: removedItemKeys,
addedItems: addedItems,
removedItems: removedItems,
cancel: false
};
onSelectionChanging(selectionChangingArgs);
return selectionChangingArgs.cancel
}
_callCallbackIfNotCanceled(callback, cancelCallback) {
const cancelResult = this.onSelectionChanging();
if ((0, _type.isPromise)(cancelResult)) {
cancelResult.then((cancel => {
if (!cancel) {
callback()
} else {
cancelCallback()
}
})).catch((() => {
callback()
}))
} else if (!cancelResult) {
callback()
} else {
cancelCallback()
}
}
onSelectionChanged() {
const {
selectedItems: selectedItems,
selectedItemKeys: selectedItemKeys,
addedItemKeys: addedItemKeys,
removedItemKeys: removedItemKeys,
addedItems: addedItems,
removedItems: removedItems,
onSelectionChanged: onSelectionChanged = _common.noop
} = this.options;
this._clearItemKeys();
onSelectionChanged({
selectedItems: selectedItems,
selectedItemKeys: selectedItemKeys,
addedItemKeys: addedItemKeys,
removedItemKeys: removedItemKeys,
addedItems: addedItems,
removedItems: removedItems
})
}
equalKeys(key1, key2) {
if (this.options.equalByReference) {
if ((0, _type.isObject)(key1) && (0, _type.isObject)(key2)) {
return key1 === key2
}
}
return (0, _common.equalByValue)(key1, key2)
}
getSelectableItems(items) {
return items.filter((item => !(null !== item && void 0 !== item && item.disabled)))
}
_clearSelection(keys, preserve, isDeselect, isSelectAll) {
keys = keys || [];
keys = Array.isArray(keys) ? keys : [keys];
this.validate();
return this.selectedItemKeys(keys, preserve, isDeselect, isSelectAll)
}
_removeTemplateProperty(remoteFilter) {
if (Array.isArray(remoteFilter)) {
return remoteFilter.map((f => this._removeTemplateProperty(f)))
}
if ((0, _type.isObject)(remoteFilter)) {
delete remoteFilter.template
}
return remoteFilter
}
_loadFilteredData(remoteFilter, localFilter, select, isSelectAll) {
const filterLength = encodeURI(JSON.stringify(this._removeTemplateProperty(remoteFilter))).length;
const needLoadAllData = this.options.maxFilterLengthInRequest && filterLength > this.options.maxFilterLengthInRequest;
const deferred = (0, _deferred.Deferred)();
const loadOptions = {
filter: needLoadAllData ? void 0 : remoteFilter,
select: needLoadAllData ? this.options.dataFields() : select || this.options.dataFields()
};
if (remoteFilter && 0 === remoteFilter.length) {
deferred.resolve([])
} else {
this.options.load(loadOptions).done((items => {
let filteredItems = (0, _type.isPlainObject)(items) ? items.data : items;
if (localFilter && !isSelectAll) {
filteredItems = filteredItems.filter(localFilter)
} else if (needLoadAllData) {
filteredItems = (0, _query.default)(filteredItems).filter(remoteFilter).toArray()
}
deferred.resolve(filteredItems)
})).fail(deferred.reject.bind(deferred))
}
return deferred
}
updateSelectedItemKeyHash(keys) {
for (let i = 0; i < keys.length; i++) {
const keyHash = (0, _common.getKeyHash)(keys[i]);
if (!(0, _type.isObject)(keyHash)) {
this.options.keyHashIndices[keyHash] = this.options.keyHashIndices[keyHash] || [];
const keyIndices = this.options.keyHashIndices[keyHash];
keyIndices.push(i)
}
}
}
_isAnyItemSelected(items) {
for (let i = 0; i < items.length; i++) {
if (this.options.isItemSelected(items[i])) {
return
}
}
return false
}
_getFullSelectAllState() {
const items = this.options.plainItems();
const dataFilter = this.options.filter();
let selectedItems = this.options.ignoreDisabledItems ? this.options.selectedItems : this.options.selectedItems.filter((item => !(null !== item && void 0 !== item && item.disabled)));
if (dataFilter) {
selectedItems = (0, _query.default)(selectedItems).filter(dataFilter).toArray()
}
const selectedItemsLength = selectedItems.length;
const disabledItemsLength = items.length - this.getSelectableItems(items).length;
if (!selectedItemsLength) {
return this._isAnyItemSelected(items)
}
if (selectedItemsLength >= this.options.totalCount() - disabledItemsLength) {
return true
}
return
}
_getVisibleSelectAllState() {
const items = this.getSelectableItems(this.options.plainItems());
let hasSelectedItems = false;
let hasUnselectedItems = false;
for (let i = 0; i < items.length; i++) {
const item = items[i];
const itemData = this.options.getItemData(item);
const key = this.options.keyOf(itemData);
if (this.options.isSelectableItem(item)) {
if (this.isItemKeySelected(key)) {
hasSelectedItems = true
} else {
hasUnselectedItems = true
}
}
}
if (hasSelectedItems) {
return !hasUnselectedItems ? true : void 0
}
return false
}
isItemKeySelected(itemKey) {
throw new Error("isItemKeySelected method should be overriden")
}
addSelectedItem(itemKey, itemData) {
throw new Error("addSelectedItem method should be overriden")
}
removeSelectedItem(itemKey) {
throw new Error("removeSelectedItem method should be overriden")
}
_selectAllPlainItems(isDeselect) {
const items = this.getSelectableItems(this.options.plainItems());
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (this.options.isSelectableItem(item)) {
const itemData = this.options.getItemData(item);
const itemKey = this.options.keyOf(itemData);
const isSelected = this.isItemKeySelected(itemKey);
if (!isSelected && !isDeselect) {
this.addSelectedItem(itemKey, itemData)
}
if (isSelected && isDeselect) {
this.removeSelectedItem(itemKey)
}
}
}
}
}
exports.default = SelectionStrategy;