ui.data_grid.grouping.expanded.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /**
  2. * DevExtreme (ui/data_grid/ui.data_grid.grouping.expanded.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _data = require("../../core/utils/data");
  11. var _utils = require("../../data/utils");
  12. var _iterator = require("../../core/utils/iterator");
  13. var _extend = require("../../core/utils/extend");
  14. var _store_helper = require("../../data/store_helper");
  15. var _uiData_grid = require("./ui.data_grid.core");
  16. var _uiData_gridGrouping = require("./ui.data_grid.grouping.core");
  17. var _uiData_grid2 = require("./ui.data_grid.utils");
  18. var _query = require("../../data/query");
  19. var _query2 = _interopRequireDefault(_query);
  20. var _deferred = require("../../core/utils/deferred");
  21. function _interopRequireDefault(obj) {
  22. return obj && obj.__esModule ? obj : {
  23. "default": obj
  24. }
  25. }
  26. var loadTotalCount = function(dataSource, options) {
  27. var d = new _deferred.Deferred;
  28. var loadOptions = (0, _extend.extend)({
  29. skip: 0,
  30. take: 1,
  31. requireTotalCount: true
  32. }, options);
  33. dataSource.load(loadOptions).done(function(data, extra) {
  34. d.resolve(extra && extra.totalCount)
  35. }).fail(d.reject.bind(d));
  36. return d
  37. };
  38. exports.GroupingHelper = _uiData_gridGrouping.GroupingHelper.inherit(function() {
  39. var foreachCollapsedGroups = function(that, callback, updateOffsets) {
  40. return that.foreachGroups(function(groupInfo) {
  41. if (!groupInfo.isExpanded) {
  42. return callback(groupInfo)
  43. }
  44. }, false, false, updateOffsets, true)
  45. };
  46. var correctSkipLoadOption = function(that, skip) {
  47. var skipCorrection = 0;
  48. var resultSkip = skip || 0;
  49. if (skip) {
  50. foreachCollapsedGroups(that, function(groupInfo) {
  51. if (groupInfo.offset - skipCorrection >= skip) {
  52. return false
  53. }
  54. skipCorrection += groupInfo.count - 1
  55. });
  56. resultSkip += skipCorrection
  57. }
  58. return resultSkip
  59. };
  60. var processGroupItems = function processGroupItems(that, items, path, offset, skipFirstItem, take) {
  61. var removeLastItemsCount = 0;
  62. var needRemoveFirstItem = false;
  63. for (var i = 0; i < items.length; i++) {
  64. var item = items[i];
  65. if (void 0 !== item.items) {
  66. path.push(item.key);
  67. var groupInfo = that.findGroupInfo(path);
  68. if (groupInfo && !groupInfo.isExpanded) {
  69. item.collapsedItems = item.items;
  70. item.items = null;
  71. offset += groupInfo.count;
  72. take--;
  73. if (take < 0) {
  74. removeLastItemsCount++
  75. }
  76. if (skipFirstItem) {
  77. needRemoveFirstItem = true
  78. }
  79. } else {
  80. if (item.items) {
  81. var offsetInfo = processGroupItems(that, item.items, path, offset, skipFirstItem, take);
  82. if (skipFirstItem) {
  83. if (offsetInfo.offset - offset > 1) {
  84. item.isContinuation = true
  85. } else {
  86. needRemoveFirstItem = true
  87. }
  88. }
  89. offset = offsetInfo.offset;
  90. take = offsetInfo.take;
  91. if (take < 0) {
  92. if (item.items.length) {
  93. item.isContinuationOnNextPage = true
  94. } else {
  95. removeLastItemsCount++
  96. }
  97. }
  98. }
  99. }
  100. path.pop()
  101. } else {
  102. if (skipFirstItem) {
  103. needRemoveFirstItem = true
  104. }
  105. offset++;
  106. take--;
  107. if (take < 0) {
  108. removeLastItemsCount++
  109. }
  110. }
  111. skipFirstItem = false
  112. }
  113. if (needRemoveFirstItem) {
  114. items.splice(0, 1)
  115. }
  116. if (removeLastItemsCount) {
  117. items.splice(-removeLastItemsCount, removeLastItemsCount)
  118. }
  119. return {
  120. offset: offset,
  121. take: take
  122. }
  123. };
  124. var pathEquals = function(path1, path2) {
  125. if (path1.length !== path2.length) {
  126. return false
  127. }
  128. for (var i = 0; i < path1.length; i++) {
  129. if (!(0, _utils.keysEqual)(null, path1[i], path2[i])) {
  130. return false
  131. }
  132. }
  133. return true
  134. };
  135. var updateGroupOffsets = function updateGroupOffsets(that, items, path, offset, additionalGroupInfo) {
  136. if (!items) {
  137. return
  138. }
  139. for (var i = 0; i < items.length; i++) {
  140. var item = items[i];
  141. if ("key" in item && void 0 !== item.items) {
  142. path.push(item.key);
  143. if (additionalGroupInfo && pathEquals(additionalGroupInfo.path, path) && !item.isContinuation) {
  144. additionalGroupInfo.offset = offset
  145. }
  146. var groupInfo = that.findGroupInfo(path);
  147. if (groupInfo && !item.isContinuation) {
  148. groupInfo.offset = offset
  149. }
  150. if (groupInfo && !groupInfo.isExpanded) {
  151. offset += groupInfo.count
  152. } else {
  153. offset = updateGroupOffsets(that, item.items, path, offset, additionalGroupInfo)
  154. }
  155. path.pop()
  156. } else {
  157. offset++
  158. }
  159. }
  160. return offset
  161. };
  162. var removeGroupLoadOption = function(storeLoadOptions, loadOptions) {
  163. if (loadOptions.group) {
  164. var groups = (0, _uiData_grid.normalizeSortingInfo)(loadOptions.group);
  165. var sorts = (0, _uiData_grid.normalizeSortingInfo)(storeLoadOptions.sort);
  166. storeLoadOptions.sort = (0, _store_helper.arrangeSortingInfo)(groups, sorts);
  167. delete loadOptions.group
  168. }
  169. };
  170. var createNotGroupFilter = function(path, storeLoadOptions, group) {
  171. var groups = (0, _uiData_grid.normalizeSortingInfo)(group || storeLoadOptions.group);
  172. var filter = [];
  173. for (var i = 0; i < path.length; i++) {
  174. var filterElement = [];
  175. for (var j = 0; j <= i; j++) {
  176. filterElement.push([groups[j].selector, i === j ? "<>" : "=", path[j]])
  177. }
  178. filter.push((0, _uiData_grid.combineFilters)(filterElement))
  179. }
  180. filter = (0, _uiData_grid.combineFilters)(filter, "or");
  181. return (0, _uiData_grid.combineFilters)([filter, storeLoadOptions.filter])
  182. };
  183. var getGroupCount = function getGroupCount(item, groupCount) {
  184. var count = item.count || item.items.length;
  185. if (!item.count && groupCount > 1) {
  186. count = 0;
  187. for (var i = 0; i < item.items.length; i++) {
  188. count += getGroupCount(item.items[i], groupCount - 1)
  189. }
  190. }
  191. return count
  192. };
  193. return {
  194. handleDataLoading: function(options) {
  195. var that = this;
  196. var storeLoadOptions = options.storeLoadOptions;
  197. var collapsedGroups = [];
  198. var collapsedItemsCount = 0;
  199. var skipFirstItem = false;
  200. var take;
  201. var group = options.loadOptions.group;
  202. var skipCorrection = 0;
  203. removeGroupLoadOption(storeLoadOptions, options.loadOptions);
  204. options.group = options.group || group;
  205. if (options.isCustomLoading) {
  206. return
  207. }
  208. var loadOptions = (0, _extend.extend)({}, storeLoadOptions);
  209. loadOptions.skip = correctSkipLoadOption(that, storeLoadOptions.skip);
  210. if (loadOptions.skip && loadOptions.take && group) {
  211. loadOptions.skip--;
  212. loadOptions.take++;
  213. skipFirstItem = true
  214. }
  215. if (loadOptions.take && group) {
  216. take = loadOptions.take;
  217. loadOptions.take++
  218. }
  219. foreachCollapsedGroups(that, function(groupInfo) {
  220. if (groupInfo.offset >= loadOptions.skip + loadOptions.take + skipCorrection) {
  221. return false
  222. } else {
  223. if (groupInfo.offset >= loadOptions.skip + skipCorrection && groupInfo.count) {
  224. skipCorrection += groupInfo.count - 1;
  225. collapsedGroups.push(groupInfo);
  226. collapsedItemsCount += groupInfo.count
  227. }
  228. }
  229. });
  230. (0, _iterator.each)(collapsedGroups, function() {
  231. loadOptions.filter = createNotGroupFilter(this.path, loadOptions, group)
  232. });
  233. options.storeLoadOptions = loadOptions;
  234. options.collapsedGroups = collapsedGroups;
  235. options.collapsedItemsCount = collapsedItemsCount;
  236. options.skip = loadOptions.skip || 0;
  237. options.skipFirstItem = skipFirstItem;
  238. options.take = take
  239. },
  240. handleDataLoaded: function(options, callBase) {
  241. var that = this;
  242. var data = options.data;
  243. var collapsedGroups = options.collapsedGroups;
  244. var groups = (0, _uiData_grid.normalizeSortingInfo)(options.group);
  245. var groupCount = groups.length;
  246. function appendCollapsedPath(data, path, groups, collapsedGroup, offset) {
  247. if (!data || !path.length || !groups.length) {
  248. return
  249. }
  250. var pathValue = (0, _data.toComparable)(path[0], true);
  251. var keyValue;
  252. var i;
  253. for (i = 0; i < data.length; i++) {
  254. keyValue = (0, _data.toComparable)(data[i].key, true);
  255. if (offset >= collapsedGroup.offset || pathValue === keyValue) {
  256. break
  257. } else {
  258. offset += getGroupCount(data[i], groups.length)
  259. }
  260. }
  261. if (!data.length || pathValue !== keyValue) {
  262. data.splice(i, 0, {
  263. key: path[0],
  264. items: [],
  265. count: 1 === path.length ? collapsedGroup.count : void 0
  266. })
  267. }
  268. appendCollapsedPath(data[i].items, path.slice(1), groups.slice(1), collapsedGroup, offset)
  269. }
  270. if (options.collapsedItemsCount && options.extra && options.extra.totalCount >= 0) {
  271. options.extra.totalCount += options.collapsedItemsCount
  272. }
  273. callBase(options);
  274. if (groupCount) {
  275. var query = (0, _query2.default)(data);
  276. (0, _store_helper.multiLevelGroup)(query, groups).enumerate().done(function(groupedData) {
  277. data = groupedData
  278. });
  279. if (collapsedGroups) {
  280. for (var pathIndex = 0; pathIndex < collapsedGroups.length; pathIndex++) {
  281. appendCollapsedPath(data, collapsedGroups[pathIndex].path, groups, collapsedGroups[pathIndex], options.skip)
  282. }
  283. }
  284. if (!options.isCustomLoading) {
  285. processGroupItems(that, data, [], options.skip, options.skipFirstItem, options.take)
  286. }
  287. options.data = data
  288. }
  289. },
  290. isGroupItemCountable: function(item) {
  291. return null === item.items
  292. },
  293. updateTotalItemsCount: function() {
  294. var itemsCountCorrection = 0;
  295. foreachCollapsedGroups(this, function(groupInfo) {
  296. if (groupInfo.count) {
  297. itemsCountCorrection -= groupInfo.count - 1
  298. }
  299. });
  300. this.callBase(itemsCountCorrection)
  301. },
  302. changeRowExpand: function(path) {
  303. var that = this;
  304. var dataSource = that._dataSource;
  305. var beginPageIndex = dataSource.beginPageIndex ? dataSource.beginPageIndex() : dataSource.pageIndex();
  306. var dataSourceItems = dataSource.items();
  307. var offset = correctSkipLoadOption(that, beginPageIndex * dataSource.pageSize());
  308. var groupInfo = that.findGroupInfo(path);
  309. var groupCountQuery;
  310. if (groupInfo && !groupInfo.isExpanded) {
  311. groupCountQuery = (new _deferred.Deferred).resolve(groupInfo.count)
  312. } else {
  313. groupCountQuery = loadTotalCount(dataSource, {
  314. filter: (0, _uiData_grid2.createGroupFilter)(path, {
  315. filter: dataSource.filter(),
  316. group: dataSource.group()
  317. })
  318. })
  319. }
  320. return (0, _deferred.when)(groupCountQuery).done(function(count) {
  321. count = parseInt(count.length ? count[0] : count);
  322. if (groupInfo) {
  323. updateGroupOffsets(that, dataSourceItems, [], offset);
  324. groupInfo.isExpanded = !groupInfo.isExpanded;
  325. groupInfo.count = count
  326. } else {
  327. groupInfo = {
  328. offset: -1,
  329. count: count,
  330. path: path,
  331. isExpanded: false
  332. };
  333. updateGroupOffsets(that, dataSourceItems, [], offset, groupInfo);
  334. if (groupInfo.offset >= 0) {
  335. that.addGroupInfo(groupInfo)
  336. }
  337. }
  338. that.updateTotalItemsCount()
  339. }).fail(function() {
  340. dataSource.fireEvent("loadError", arguments)
  341. })
  342. },
  343. allowCollapseAll: function() {
  344. return false
  345. },
  346. refresh: function(options, isReload, operationTypes) {
  347. var that = this;
  348. var storeLoadOptions = options.storeLoadOptions;
  349. var dataSource = that._dataSource;
  350. this.callBase.apply(this, arguments);
  351. if (isReload || operationTypes.reload) {
  352. return foreachCollapsedGroups(that, function(groupInfo) {
  353. var groupCountQuery = loadTotalCount(dataSource, {
  354. filter: (0, _uiData_grid2.createGroupFilter)(groupInfo.path, storeLoadOptions)
  355. });
  356. var groupOffsetQuery = loadTotalCount(dataSource, {
  357. filter: (0, _uiData_gridGrouping.createOffsetFilter)(groupInfo.path, storeLoadOptions)
  358. });
  359. return (0, _deferred.when)(groupOffsetQuery, groupCountQuery).done(function(offset, count) {
  360. offset = parseInt(offset.length ? offset[0] : offset);
  361. count = parseInt(count.length ? count[0] : count);
  362. groupInfo.offset = offset;
  363. if (groupInfo.count !== count) {
  364. groupInfo.count = count;
  365. that.updateTotalItemsCount()
  366. }
  367. })
  368. }, true)
  369. }
  370. }
  371. }
  372. }());