UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

251 lines (192 loc) • 7.51 kB
"use strict"; var $ = require("../../core/renderer"), isNumeric = require("../../core/utils/type").isNumeric, each = require("../../core/utils/iterator").each, queryByOptions = require("../../data/store_helper").queryByOptions, query = require("../../data/query"), EditStrategy = require("../collection/ui.collection_widget.edit.strategy.plain"); var LIST_ITEM_CLASS = "dx-list-item", LIST_GROUP_CLASS = "dx-list-group"; var SELECTION_SHIFT = 20, SELECTION_MASK = 0x8FF; var combineIndex = function combineIndex(indices) { return (indices.group << SELECTION_SHIFT) + indices.item; }; var splitIndex = function splitIndex(combinedIndex) { return { group: combinedIndex >> SELECTION_SHIFT, item: combinedIndex & SELECTION_MASK }; }; var GroupedEditStrategy = EditStrategy.inherit({ _groupElements: function _groupElements() { return this._collectionWidget._itemContainer().find("." + LIST_GROUP_CLASS); }, _groupItemElements: function _groupItemElements($group) { return $group.find("." + LIST_ITEM_CLASS); }, getIndexByItemData: function getIndexByItemData(itemData) { var groups = this._collectionWidget.option("items"), index = false; if (!itemData) return false; if (itemData.items && itemData.items.length) { itemData = itemData.items[0]; } each(groups, function (groupIndex, group) { if (!group.items) return false; each(group.items, function (itemIndex, item) { if (item !== itemData) { return true; } index = { group: groupIndex, item: itemIndex }; return false; }); if (index) { return false; } }); return index; }, getItemDataByIndex: function getItemDataByIndex(index) { var items = this._collectionWidget.option("items"); if (isNumeric(index)) { return this.itemsGetter()[index]; } return index && items[index.group] && items[index.group].items[index.item] || null; }, itemsGetter: function itemsGetter() { var resultItems = [], items = this._collectionWidget.option("items"); for (var i = 0; i < items.length; i++) { if (items[i] && items[i].items) { resultItems = resultItems.concat(items[i].items); } else { resultItems.push(items[i]); } } return resultItems; }, deleteItemAtIndex: function deleteItemAtIndex(index) { var indices = splitIndex(index), itemGroup = this._collectionWidget.option("items")[indices.group].items; itemGroup.splice(indices.item, 1); }, getKeysByItems: function getKeysByItems(items) { var plainItems = []; for (var i = 0; i < items.length; i++) { if (items[i] && items[i].items) { plainItems = plainItems.concat(items[i].items); } else { plainItems.push(items[i]); } } var result = []; for (i = 0; i < plainItems.length; i++) { result.push(this._collectionWidget.keyOf(plainItems[i])); } return result; }, getIndexByKey: function getIndexByKey(key, items) { var groups = items || this._collectionWidget.option("items"), index = -1, that = this; each(groups, function (groupIndex, group) { if (!group.items) return; var keys = that.getKeysByItems(group.items); each(keys, function (keyIndex, itemKey) { if (that._equalKeys(itemKey, key)) { index = { group: groupIndex, item: keyIndex }; return false; } }); if (index !== -1) { return false; } }); return index; }, _getGroups: function _getGroups(items) { var dataSource = this._collectionWidget.getDataSource(), group = dataSource && dataSource.group(); if (group) { return queryByOptions(query(items), { group: group }).toArray(); } return this._collectionWidget.option("items"); }, getItemsByKeys: function getItemsByKeys(keys, items) { var result = []; each(keys, function (_, key) { var getItemMeta = function (groups) { var index = this.getIndexByKey(key, groups); var group = index && groups[index.group]; if (!group) return; return { groupKey: group.key, item: group.items[index.item] }; }.bind(this); var itemMeta = getItemMeta(this._getGroups(items)); if (!itemMeta) return; var groupKey = itemMeta.groupKey; var item = itemMeta.item; var selectedGroup; each(result, function (_, item) { if (item.key === groupKey) { selectedGroup = item; return false; } }); if (!selectedGroup) { selectedGroup = { key: groupKey, items: [] }; result.push(selectedGroup); } selectedGroup.items.push(item); }.bind(this)); return result; }, moveItemAtIndexToIndex: function moveItemAtIndexToIndex(movingIndex, destinationIndex) { var items = this._collectionWidget.option("items"), movingIndices = splitIndex(movingIndex), destinationIndices = splitIndex(destinationIndex), movingItemGroup = items[movingIndices.group].items, destinationItemGroup = items[destinationIndices.group].items, movedItemData = movingItemGroup[movingIndices.item]; movingItemGroup.splice(movingIndices.item, 1); destinationItemGroup.splice(destinationIndices.item, 0, movedItemData); }, _isItemIndex: function _isItemIndex(index) { return index && isNumeric(index.group) && isNumeric(index.item); }, _getNormalizedItemIndex: function _getNormalizedItemIndex(itemElement) { var $item = $(itemElement), $group = $item.closest("." + LIST_GROUP_CLASS); if (!$group.length) { return -1; } return combineIndex({ group: this._groupElements().index($group), item: this._groupItemElements($group).index($item) }); }, _normalizeItemIndex: function _normalizeItemIndex(index) { return combineIndex(index); }, _denormalizeItemIndex: function _denormalizeItemIndex(index) { return splitIndex(index); }, _getItemByNormalizedIndex: function _getItemByNormalizedIndex(index) { var indices = splitIndex(index), $group = this._groupElements().eq(indices.group); return this._groupItemElements($group).eq(indices.item); }, _itemsFromSameParent: function _itemsFromSameParent(firstIndex, secondIndex) { return splitIndex(firstIndex).group === splitIndex(secondIndex).group; } }); module.exports = GroupedEditStrategy;