devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
227 lines (225 loc) • 8.41 kB
JavaScript
/**
* DevExtreme (cjs/__internal/ui/list/m_list.edit.strategy.grouped.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 _store_helper = _interopRequireDefault(require("../../../common/data/store_helper"));
var _renderer = _interopRequireDefault(require("../../../core/renderer"));
var _iterator = require("../../../core/utils/iterator");
var _type = require("../../../core/utils/type");
var _m_collection_widgetEditStrategy = _interopRequireDefault(require("../../ui/collection/m_collection_widget.edit.strategy.plain"));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const LIST_ITEM_CLASS = "dx-list-item";
const LIST_GROUP_CLASS = "dx-list-group";
const SELECTION_SHIFT = 20;
const SELECTION_MASK = 1048575;
const combineIndex = indices => (indices.group << 20) + indices.item;
const splitIndex = combinedIndex => ({
group: combinedIndex >> 20,
item: 1048575 & combinedIndex
});
class GroupedEditStrategy extends _m_collection_widgetEditStrategy.default {
_groupElements() {
return this._collectionWidget._itemContainer().find(".dx-list-group")
}
_groupItemElements($group) {
return $group.find(".dx-list-item")
}
getIndexByItemData(itemData) {
var _itemData$items;
const groups = this._collectionWidget.option("items");
let index = false;
if (!itemData) {
return false
}
if (null !== (_itemData$items = itemData.items) && void 0 !== _itemData$items && _itemData$items.length) {
itemData = itemData.items[0]
}(0, _iterator.each)(groups, ((groupIndex, group) => {
if (!group.items) {
return false
}(0, _iterator.each)(group.items, ((itemIndex, item) => {
if (item !== itemData) {
return true
}
index = {
group: groupIndex,
item: itemIndex
};
return false
}));
if (index) {
return false
}
}));
return index
}
getItemDataByIndex(index) {
var _items$index$group;
const items = this._collectionWidget.option("items");
if ((0, _type.isNumeric)(index)) {
return this.itemsGetter()[index]
}
return index && (null === (_items$index$group = items[index.group]) || void 0 === _items$index$group ? void 0 : _items$index$group.items[index.item]) || null
}
itemsGetter() {
let resultItems = [];
const {
items: items
} = this._collectionWidget.option();
for (let i = 0; i < items.length; i++) {
var _items$i;
if (null !== (_items$i = items[i]) && void 0 !== _items$i && _items$i.items) {
resultItems = resultItems.concat(items[i].items)
} else {
resultItems.push(items[i])
}
}
return resultItems
}
deleteItemAtIndex(index) {
const indices = splitIndex(index);
const itemGroup = this._collectionWidget.option("items")[indices.group].items;
itemGroup.splice(indices.item, 1)
}
getKeysByItems(items) {
let plainItems = [];
let i;
for (i = 0; i < items.length; i++) {
var _items$i2;
if (null !== (_items$i2 = items[i]) && void 0 !== _items$i2 && _items$i2.items) {
plainItems = plainItems.concat(items[i].items)
} else {
plainItems.push(items[i])
}
}
const result = [];
for (i = 0; i < plainItems.length; i++) {
result.push(this._collectionWidget.keyOf(plainItems[i]))
}
return result
}
getIndexByKey(key, items) {
const groups = items || this._collectionWidget.option("items");
let index = -1;
const that = this;
(0, _iterator.each)(groups, ((groupIndex, group) => {
if (!group.items) {
return
}(0, _iterator.each)(group.items, ((itemIndex, item) => {
const itemKey = that._collectionWidget.keyOf(item);
if (that._equalKeys(itemKey, key)) {
index = {
group: groupIndex,
item: itemIndex
};
return false
}
}));
if (-1 !== index) {
return false
}
}));
return index
}
_getGroups(items) {
const dataController = this._collectionWidget._dataController;
const group = dataController.group();
if (group) {
return _store_helper.default.queryByOptions((0, _query.default)(items), {
group: group
}).toArray()
}
return this._collectionWidget.option("items")
}
getItemsByKeys(keys, items) {
const result = [];
const groups = this._getGroups(items);
const groupItemByKeyMap = {};
const getItemMeta = key => {
const index = this.getIndexByKey(key, groups);
const group = index && groups[index.group];
if (!group) {
return
}
return {
groupKey: group.key,
item: group.items[index.item]
}
};
(0, _iterator.each)(keys, ((_, key) => {
const itemMeta = getItemMeta(key);
if (!itemMeta) {
return
}
const {
groupKey: groupKey
} = itemMeta;
const {
item: item
} = itemMeta;
let selectedGroup = groupItemByKeyMap[groupKey];
if (!selectedGroup) {
selectedGroup = {
key: groupKey,
items: []
};
groupItemByKeyMap[groupKey] = selectedGroup;
result.push(selectedGroup)
}
selectedGroup.items.push(item)
}));
return result
}
moveItemAtIndexToIndex(movingIndex, destinationIndex) {
const items = this._collectionWidget.option("items");
const movingIndices = splitIndex(movingIndex);
const destinationIndices = splitIndex(destinationIndex);
const movingItemGroup = items[movingIndices.group].items;
const destinationItemGroup = items[destinationIndices.group].items;
const movedItemData = movingItemGroup[movingIndices.item];
movingItemGroup.splice(movingIndices.item, 1);
destinationItemGroup.splice(destinationIndices.item, 0, movedItemData)
}
_isItemIndex(index) {
return index && (0, _type.isNumeric)(index.group) && (0, _type.isNumeric)(index.item)
}
_getNormalizedItemIndex(itemElement) {
const $item = (0, _renderer.default)(itemElement);
const $group = $item.closest(".dx-list-group");
if (!$group.length) {
return -1
}
return combineIndex({
group: this._groupElements().index($group),
item: this._groupItemElements($group).index($item)
})
}
_normalizeItemIndex(index) {
return combineIndex(index)
}
_denormalizeItemIndex(index) {
return splitIndex(index)
}
_getItemByNormalizedIndex(index) {
const indices = splitIndex(index);
const $group = this._groupElements().eq(indices.group);
return this._groupItemElements($group).eq(indices.item)
}
_itemsFromSameParent(firstIndex, secondIndex) {
return splitIndex(firstIndex).group === splitIndex(secondIndex).group
}
}
var _default = exports.default = GroupedEditStrategy;