| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- /**
- * DevExtreme (ui/data_grid/ui.data_grid.grouping.expanded.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var _data = require("../../core/utils/data");
- var _utils = require("../../data/utils");
- var _iterator = require("../../core/utils/iterator");
- var _extend = require("../../core/utils/extend");
- var _store_helper = require("../../data/store_helper");
- var _uiData_grid = require("./ui.data_grid.core");
- var _uiData_gridGrouping = require("./ui.data_grid.grouping.core");
- var _uiData_grid2 = require("./ui.data_grid.utils");
- var _query = require("../../data/query");
- var _query2 = _interopRequireDefault(_query);
- var _deferred = require("../../core/utils/deferred");
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- "default": obj
- }
- }
- var loadTotalCount = function(dataSource, options) {
- var d = new _deferred.Deferred;
- var loadOptions = (0, _extend.extend)({
- skip: 0,
- take: 1,
- requireTotalCount: true
- }, options);
- dataSource.load(loadOptions).done(function(data, extra) {
- d.resolve(extra && extra.totalCount)
- }).fail(d.reject.bind(d));
- return d
- };
- exports.GroupingHelper = _uiData_gridGrouping.GroupingHelper.inherit(function() {
- var foreachCollapsedGroups = function(that, callback, updateOffsets) {
- return that.foreachGroups(function(groupInfo) {
- if (!groupInfo.isExpanded) {
- return callback(groupInfo)
- }
- }, false, false, updateOffsets, true)
- };
- var correctSkipLoadOption = function(that, skip) {
- var skipCorrection = 0;
- var resultSkip = skip || 0;
- if (skip) {
- foreachCollapsedGroups(that, function(groupInfo) {
- if (groupInfo.offset - skipCorrection >= skip) {
- return false
- }
- skipCorrection += groupInfo.count - 1
- });
- resultSkip += skipCorrection
- }
- return resultSkip
- };
- var processGroupItems = function processGroupItems(that, items, path, offset, skipFirstItem, take) {
- var removeLastItemsCount = 0;
- var needRemoveFirstItem = false;
- for (var i = 0; i < items.length; i++) {
- var item = items[i];
- if (void 0 !== item.items) {
- path.push(item.key);
- var groupInfo = that.findGroupInfo(path);
- if (groupInfo && !groupInfo.isExpanded) {
- item.collapsedItems = item.items;
- item.items = null;
- offset += groupInfo.count;
- take--;
- if (take < 0) {
- removeLastItemsCount++
- }
- if (skipFirstItem) {
- needRemoveFirstItem = true
- }
- } else {
- if (item.items) {
- var offsetInfo = processGroupItems(that, item.items, path, offset, skipFirstItem, take);
- if (skipFirstItem) {
- if (offsetInfo.offset - offset > 1) {
- item.isContinuation = true
- } else {
- needRemoveFirstItem = true
- }
- }
- offset = offsetInfo.offset;
- take = offsetInfo.take;
- if (take < 0) {
- if (item.items.length) {
- item.isContinuationOnNextPage = true
- } else {
- removeLastItemsCount++
- }
- }
- }
- }
- path.pop()
- } else {
- if (skipFirstItem) {
- needRemoveFirstItem = true
- }
- offset++;
- take--;
- if (take < 0) {
- removeLastItemsCount++
- }
- }
- skipFirstItem = false
- }
- if (needRemoveFirstItem) {
- items.splice(0, 1)
- }
- if (removeLastItemsCount) {
- items.splice(-removeLastItemsCount, removeLastItemsCount)
- }
- return {
- offset: offset,
- take: take
- }
- };
- var pathEquals = function(path1, path2) {
- if (path1.length !== path2.length) {
- return false
- }
- for (var i = 0; i < path1.length; i++) {
- if (!(0, _utils.keysEqual)(null, path1[i], path2[i])) {
- return false
- }
- }
- return true
- };
- var updateGroupOffsets = function updateGroupOffsets(that, items, path, offset, additionalGroupInfo) {
- if (!items) {
- return
- }
- for (var i = 0; i < items.length; i++) {
- var item = items[i];
- if ("key" in item && void 0 !== item.items) {
- path.push(item.key);
- if (additionalGroupInfo && pathEquals(additionalGroupInfo.path, path) && !item.isContinuation) {
- additionalGroupInfo.offset = offset
- }
- var groupInfo = that.findGroupInfo(path);
- if (groupInfo && !item.isContinuation) {
- groupInfo.offset = offset
- }
- if (groupInfo && !groupInfo.isExpanded) {
- offset += groupInfo.count
- } else {
- offset = updateGroupOffsets(that, item.items, path, offset, additionalGroupInfo)
- }
- path.pop()
- } else {
- offset++
- }
- }
- return offset
- };
- var removeGroupLoadOption = function(storeLoadOptions, loadOptions) {
- if (loadOptions.group) {
- var groups = (0, _uiData_grid.normalizeSortingInfo)(loadOptions.group);
- var sorts = (0, _uiData_grid.normalizeSortingInfo)(storeLoadOptions.sort);
- storeLoadOptions.sort = (0, _store_helper.arrangeSortingInfo)(groups, sorts);
- delete loadOptions.group
- }
- };
- var createNotGroupFilter = function(path, storeLoadOptions, group) {
- var groups = (0, _uiData_grid.normalizeSortingInfo)(group || storeLoadOptions.group);
- var filter = [];
- for (var i = 0; i < path.length; i++) {
- var filterElement = [];
- for (var j = 0; j <= i; j++) {
- filterElement.push([groups[j].selector, i === j ? "<>" : "=", path[j]])
- }
- filter.push((0, _uiData_grid.combineFilters)(filterElement))
- }
- filter = (0, _uiData_grid.combineFilters)(filter, "or");
- return (0, _uiData_grid.combineFilters)([filter, storeLoadOptions.filter])
- };
- var getGroupCount = function getGroupCount(item, groupCount) {
- var count = item.count || item.items.length;
- if (!item.count && groupCount > 1) {
- count = 0;
- for (var i = 0; i < item.items.length; i++) {
- count += getGroupCount(item.items[i], groupCount - 1)
- }
- }
- return count
- };
- return {
- handleDataLoading: function(options) {
- var that = this;
- var storeLoadOptions = options.storeLoadOptions;
- var collapsedGroups = [];
- var collapsedItemsCount = 0;
- var skipFirstItem = false;
- var take;
- var group = options.loadOptions.group;
- var skipCorrection = 0;
- removeGroupLoadOption(storeLoadOptions, options.loadOptions);
- options.group = options.group || group;
- if (options.isCustomLoading) {
- return
- }
- var loadOptions = (0, _extend.extend)({}, storeLoadOptions);
- loadOptions.skip = correctSkipLoadOption(that, storeLoadOptions.skip);
- if (loadOptions.skip && loadOptions.take && group) {
- loadOptions.skip--;
- loadOptions.take++;
- skipFirstItem = true
- }
- if (loadOptions.take && group) {
- take = loadOptions.take;
- loadOptions.take++
- }
- foreachCollapsedGroups(that, function(groupInfo) {
- if (groupInfo.offset >= loadOptions.skip + loadOptions.take + skipCorrection) {
- return false
- } else {
- if (groupInfo.offset >= loadOptions.skip + skipCorrection && groupInfo.count) {
- skipCorrection += groupInfo.count - 1;
- collapsedGroups.push(groupInfo);
- collapsedItemsCount += groupInfo.count
- }
- }
- });
- (0, _iterator.each)(collapsedGroups, function() {
- loadOptions.filter = createNotGroupFilter(this.path, loadOptions, group)
- });
- options.storeLoadOptions = loadOptions;
- options.collapsedGroups = collapsedGroups;
- options.collapsedItemsCount = collapsedItemsCount;
- options.skip = loadOptions.skip || 0;
- options.skipFirstItem = skipFirstItem;
- options.take = take
- },
- handleDataLoaded: function(options, callBase) {
- var that = this;
- var data = options.data;
- var collapsedGroups = options.collapsedGroups;
- var groups = (0, _uiData_grid.normalizeSortingInfo)(options.group);
- var groupCount = groups.length;
- function appendCollapsedPath(data, path, groups, collapsedGroup, offset) {
- if (!data || !path.length || !groups.length) {
- return
- }
- var pathValue = (0, _data.toComparable)(path[0], true);
- var keyValue;
- var i;
- for (i = 0; i < data.length; i++) {
- keyValue = (0, _data.toComparable)(data[i].key, true);
- if (offset >= collapsedGroup.offset || pathValue === keyValue) {
- break
- } else {
- offset += getGroupCount(data[i], groups.length)
- }
- }
- if (!data.length || pathValue !== keyValue) {
- data.splice(i, 0, {
- key: path[0],
- items: [],
- count: 1 === path.length ? collapsedGroup.count : void 0
- })
- }
- appendCollapsedPath(data[i].items, path.slice(1), groups.slice(1), collapsedGroup, offset)
- }
- if (options.collapsedItemsCount && options.extra && options.extra.totalCount >= 0) {
- options.extra.totalCount += options.collapsedItemsCount
- }
- callBase(options);
- if (groupCount) {
- var query = (0, _query2.default)(data);
- (0, _store_helper.multiLevelGroup)(query, groups).enumerate().done(function(groupedData) {
- data = groupedData
- });
- if (collapsedGroups) {
- for (var pathIndex = 0; pathIndex < collapsedGroups.length; pathIndex++) {
- appendCollapsedPath(data, collapsedGroups[pathIndex].path, groups, collapsedGroups[pathIndex], options.skip)
- }
- }
- if (!options.isCustomLoading) {
- processGroupItems(that, data, [], options.skip, options.skipFirstItem, options.take)
- }
- options.data = data
- }
- },
- isGroupItemCountable: function(item) {
- return null === item.items
- },
- updateTotalItemsCount: function() {
- var itemsCountCorrection = 0;
- foreachCollapsedGroups(this, function(groupInfo) {
- if (groupInfo.count) {
- itemsCountCorrection -= groupInfo.count - 1
- }
- });
- this.callBase(itemsCountCorrection)
- },
- changeRowExpand: function(path) {
- var that = this;
- var dataSource = that._dataSource;
- var beginPageIndex = dataSource.beginPageIndex ? dataSource.beginPageIndex() : dataSource.pageIndex();
- var dataSourceItems = dataSource.items();
- var offset = correctSkipLoadOption(that, beginPageIndex * dataSource.pageSize());
- var groupInfo = that.findGroupInfo(path);
- var groupCountQuery;
- if (groupInfo && !groupInfo.isExpanded) {
- groupCountQuery = (new _deferred.Deferred).resolve(groupInfo.count)
- } else {
- groupCountQuery = loadTotalCount(dataSource, {
- filter: (0, _uiData_grid2.createGroupFilter)(path, {
- filter: dataSource.filter(),
- group: dataSource.group()
- })
- })
- }
- return (0, _deferred.when)(groupCountQuery).done(function(count) {
- count = parseInt(count.length ? count[0] : count);
- if (groupInfo) {
- updateGroupOffsets(that, dataSourceItems, [], offset);
- groupInfo.isExpanded = !groupInfo.isExpanded;
- groupInfo.count = count
- } else {
- groupInfo = {
- offset: -1,
- count: count,
- path: path,
- isExpanded: false
- };
- updateGroupOffsets(that, dataSourceItems, [], offset, groupInfo);
- if (groupInfo.offset >= 0) {
- that.addGroupInfo(groupInfo)
- }
- }
- that.updateTotalItemsCount()
- }).fail(function() {
- dataSource.fireEvent("loadError", arguments)
- })
- },
- allowCollapseAll: function() {
- return false
- },
- refresh: function(options, isReload, operationTypes) {
- var that = this;
- var storeLoadOptions = options.storeLoadOptions;
- var dataSource = that._dataSource;
- this.callBase.apply(this, arguments);
- if (isReload || operationTypes.reload) {
- return foreachCollapsedGroups(that, function(groupInfo) {
- var groupCountQuery = loadTotalCount(dataSource, {
- filter: (0, _uiData_grid2.createGroupFilter)(groupInfo.path, storeLoadOptions)
- });
- var groupOffsetQuery = loadTotalCount(dataSource, {
- filter: (0, _uiData_gridGrouping.createOffsetFilter)(groupInfo.path, storeLoadOptions)
- });
- return (0, _deferred.when)(groupOffsetQuery, groupCountQuery).done(function(offset, count) {
- offset = parseInt(offset.length ? offset[0] : offset);
- count = parseInt(count.length ? count[0] : count);
- groupInfo.offset = offset;
- if (groupInfo.count !== count) {
- groupInfo.count = count;
- that.updateTotalItemsCount()
- }
- })
- }, true)
- }
- }
- }
- }());
|