ui.data_grid.grouping.collapsed.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. /**
  2. * DevExtreme (ui/data_grid/ui.data_grid.grouping.collapsed.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 _extend = require("../../core/utils/extend");
  11. var _iterator = require("../../core/utils/iterator");
  12. var _uiData_grid = require("./ui.data_grid.core");
  13. var _uiData_gridGrouping = require("./ui.data_grid.grouping.core");
  14. var _uiData_grid2 = require("./ui.data_grid.utils");
  15. var _ui = require("../widget/ui.errors");
  16. var _ui2 = _interopRequireDefault(_ui);
  17. var _errors = require("../../data/errors");
  18. var _deferred = require("../../core/utils/deferred");
  19. function _interopRequireDefault(obj) {
  20. return obj && obj.__esModule ? obj : {
  21. "default": obj
  22. }
  23. }
  24. exports.GroupingHelper = _uiData_gridGrouping.GroupingHelper.inherit(function() {
  25. var foreachExpandedGroups = function(that, callback, updateGroups) {
  26. return that.foreachGroups(function(groupInfo, parents) {
  27. if (groupInfo.isExpanded) {
  28. return callback(groupInfo, parents)
  29. }
  30. }, true, false, updateGroups, updateGroups)
  31. };
  32. var processGroupItems = function processGroupItems(that, items, groupsCount, expandedInfo, path, isCustomLoading, isLastGroupExpanded) {
  33. var isExpanded;
  34. expandedInfo.items = expandedInfo.items || [];
  35. expandedInfo.paths = expandedInfo.paths || [];
  36. expandedInfo.count = expandedInfo.count || 0;
  37. expandedInfo.lastCount = expandedInfo.lastCount || 0;
  38. if (!groupsCount) {
  39. return
  40. }
  41. for (var i = 0; i < items.length; i++) {
  42. var item = items[i];
  43. if (void 0 !== item.items) {
  44. path.push(item.key);
  45. if (isCustomLoading) {
  46. isExpanded = true
  47. } else {
  48. var groupInfo = that.findGroupInfo(path);
  49. isExpanded = groupInfo && groupInfo.isExpanded
  50. }
  51. if (!isExpanded) {
  52. item.collapsedItems = item.items;
  53. item.items = null
  54. } else {
  55. if (item.items) {
  56. processGroupItems(that, item.items, groupsCount - 1, expandedInfo, path, isCustomLoading, isLastGroupExpanded)
  57. } else {
  58. if (1 === groupsCount && item.count && (!isCustomLoading || isLastGroupExpanded)) {
  59. expandedInfo.items.push(item);
  60. expandedInfo.paths.push(path.slice(0));
  61. expandedInfo.count += expandedInfo.lastCount;
  62. expandedInfo.lastCount = item.count
  63. }
  64. }
  65. }
  66. path.pop()
  67. }
  68. }
  69. };
  70. var updateGroupInfoItem = function(that, item, isLastGroupLevel, path, offset) {
  71. var groupInfo = that.findGroupInfo(path);
  72. var count;
  73. if (!groupInfo) {
  74. if (isLastGroupLevel) {
  75. count = item.count > 0 ? item.count : item.items.length
  76. }
  77. that.addGroupInfo({
  78. isExpanded: that._isGroupExpanded(path.length - 1),
  79. path: path.slice(0),
  80. offset: offset,
  81. count: count || 0
  82. })
  83. } else {
  84. if (isLastGroupLevel) {
  85. groupInfo.count = item.count > 0 ? item.count : item.items && item.items.length || 0
  86. } else {
  87. item.count = groupInfo.count || item.count
  88. }
  89. groupInfo.offset = offset
  90. }
  91. };
  92. var updateGroupInfos = function updateGroupInfos(that, options, items, loadedGroupCount, groupIndex, path, parentIndex) {
  93. var groupCount = options.group ? options.group.length : 0;
  94. var isLastGroupLevel = groupCount === loadedGroupCount;
  95. var remotePaging = options.remoteOperations.paging;
  96. var offset = 0;
  97. var totalCount = 0;
  98. groupIndex = groupIndex || 0;
  99. path = path || [];
  100. if (remotePaging && !parentIndex) {
  101. offset = 0 === groupIndex ? options.skip || 0 : options.skips[groupIndex - 1] || 0
  102. }
  103. if (groupIndex >= loadedGroupCount) {
  104. return items.length
  105. }
  106. for (var i = 0; i < items.length; i++) {
  107. var item = items[i];
  108. if (item) {
  109. path.push(item.key);
  110. if (!item.count && !item.items || void 0 === item.items) {
  111. return -1
  112. }
  113. updateGroupInfoItem(that, item, isLastGroupLevel, path, offset + i);
  114. var count = item.items ? updateGroupInfos(that, options, item.items, loadedGroupCount, groupIndex + 1, path, i) : item.count || -1;
  115. if (count < 0) {
  116. return -1
  117. }
  118. totalCount += count;
  119. path.pop()
  120. }
  121. }
  122. return totalCount
  123. };
  124. var isGroupExpanded = function(groups, groupIndex) {
  125. return groups && groups.length && groups[groupIndex] && !!groups[groupIndex].isExpanded
  126. };
  127. var getTotalOffset = function(groupInfos, pageSize, offset) {
  128. var groupSize;
  129. var totalOffset = offset;
  130. for (var groupIndex = 0; groupIndex < groupInfos.length; groupIndex++) {
  131. groupSize = groupInfos[groupIndex].offset + 1;
  132. if (groupIndex > 0) {
  133. groupSize += groupInfos[groupIndex - 1].childrenTotalCount;
  134. if (pageSize) {
  135. groupSize += getContinuationGroupCount(totalOffset, pageSize, groupSize, groupIndex - 1) * groupIndex
  136. }
  137. }
  138. totalOffset += groupSize
  139. }
  140. return totalOffset
  141. };
  142. var getContinuationGroupCount = function(groupOffset, pageSize, groupSize, groupIndex) {
  143. groupIndex = groupIndex || 0;
  144. if (pageSize > 1 && groupSize > 0) {
  145. var pageOffset = groupOffset - Math.floor(groupOffset / pageSize) * pageSize || pageSize;
  146. pageOffset += groupSize - groupIndex - 2;
  147. if (pageOffset < 0) {
  148. pageOffset += pageSize
  149. }
  150. return Math.floor(pageOffset / (pageSize - groupIndex - 1))
  151. }
  152. return 0
  153. };
  154. function applyContinuationToGroupItem(options, expandedInfo, groupLevel, expandedItemIndex) {
  155. var item = expandedInfo.items[expandedItemIndex];
  156. var skip = options.skips && options.skips[groupLevel];
  157. var take = options.takes && options.takes[groupLevel];
  158. var isLastExpandedItem = expandedItemIndex === expandedInfo.items.length - 1;
  159. var isFirstExpandedItem = 0 === expandedItemIndex;
  160. var lastExpandedItemSkip = isFirstExpandedItem && skip || 0;
  161. var isItemsTruncatedByTake = item.count > take + lastExpandedItemSkip;
  162. if (isFirstExpandedItem && void 0 !== skip) {
  163. item.isContinuation = true
  164. }
  165. if (isLastExpandedItem && void 0 !== take && isItemsTruncatedByTake) {
  166. item.isContinuationOnNextPage = true
  167. }
  168. }
  169. function fillSkipTakeInExpandedInfo(options, expandedInfo, currentGroupCount) {
  170. var currentGroupIndex = currentGroupCount - 1;
  171. var groupCount = options.group ? options.group.length : 0;
  172. expandedInfo.skip = options.skips && options.skips[currentGroupIndex];
  173. if (options.takes && void 0 !== options.takes[currentGroupIndex]) {
  174. if (groupCount === currentGroupCount) {
  175. expandedInfo.take = expandedInfo.count ? expandedInfo.count - (expandedInfo.skip || 0) : 0
  176. } else {
  177. expandedInfo.take = 0
  178. }
  179. expandedInfo.take += options.takes[currentGroupIndex]
  180. }
  181. }
  182. function isDataDeferred(data) {
  183. return !Array.isArray(data)
  184. }
  185. function makeDataDeferred(options) {
  186. if (!isDataDeferred(options.data)) {
  187. options.data = new _deferred.Deferred
  188. }
  189. }
  190. function loadGroupItems(that, options, loadedGroupCount, expandedInfo, groupLevel, data) {
  191. if (!options.isCustomLoading) {
  192. expandedInfo = {};
  193. processGroupItems(that, data, loadedGroupCount, expandedInfo, []);
  194. fillSkipTakeInExpandedInfo(options, expandedInfo, loadedGroupCount)
  195. }
  196. var groupCount = options.group ? options.group.length : 0;
  197. if (expandedInfo.paths.length && groupCount - loadedGroupCount > 0) {
  198. makeDataDeferred(options);
  199. loadExpandedGroups(that, options, expandedInfo, loadedGroupCount, groupLevel, data)
  200. } else {
  201. if (expandedInfo.paths.length && options.storeLoadOptions.group) {
  202. makeDataDeferred(options);
  203. loadLastLevelGroupItems(that, options, expandedInfo, data)
  204. } else {
  205. if (isDataDeferred(options.data)) {
  206. options.data.resolve(data)
  207. }
  208. }
  209. }
  210. }
  211. function loadExpandedGroups(that, options, expandedInfo, loadedGroupCount, groupLevel, data) {
  212. var groups = options.group || [];
  213. var currentGroup = groups[groupLevel + 1];
  214. var deferreds = [];
  215. (0, _iterator.each)(expandedInfo.paths, function(expandedItemIndex) {
  216. var loadOptions = {
  217. requireTotalCount: false,
  218. requireGroupCount: true,
  219. group: [currentGroup],
  220. groupSummary: options.storeLoadOptions.groupSummary,
  221. filter: (0, _uiData_grid2.createGroupFilter)(expandedInfo.paths[expandedItemIndex], {
  222. filter: options.storeLoadOptions.filter,
  223. group: groups
  224. }),
  225. select: options.storeLoadOptions.select
  226. };
  227. if (0 === expandedItemIndex) {
  228. loadOptions.skip = expandedInfo.skip || 0
  229. }
  230. if (expandedItemIndex === expandedInfo.paths.length - 1) {
  231. loadOptions.take = expandedInfo.take
  232. }
  233. var loadResult = 0 === loadOptions.take ? [] : that._dataSource.loadFromStore(loadOptions);
  234. (0, _deferred.when)(loadResult).done(function(data) {
  235. var item = expandedInfo.items[expandedItemIndex];
  236. applyContinuationToGroupItem(options, expandedInfo, groupLevel, expandedItemIndex);
  237. item.items = data
  238. });
  239. deferreds.push(loadResult)
  240. });
  241. _deferred.when.apply(null, deferreds).done(function() {
  242. updateGroupInfos(that, options, data, loadedGroupCount + 1);
  243. loadGroupItems(that, options, loadedGroupCount + 1, expandedInfo, groupLevel + 1, data)
  244. })
  245. }
  246. function loadLastLevelGroupItems(that, options, expandedInfo, data) {
  247. var expandedFilters = [];
  248. var groups = options.group || [];
  249. (0, _iterator.each)(expandedInfo.paths, function(_, expandedPath) {
  250. expandedFilters.push((0, _uiData_grid2.createGroupFilter)(expandedPath, {
  251. group: options.isCustomLoading ? options.storeLoadOptions.group : groups
  252. }))
  253. });
  254. var filter = options.storeLoadOptions.filter;
  255. if (!options.storeLoadOptions.isLoadingAll) {
  256. filter = (0, _uiData_grid.combineFilters)([filter, (0, _uiData_grid.combineFilters)(expandedFilters, "or")])
  257. }
  258. var loadOptions = (0, _extend.extend)({}, options.storeLoadOptions, {
  259. requireTotalCount: false,
  260. requireGroupCount: false,
  261. group: null,
  262. sort: groups.concat((0, _uiData_grid.normalizeSortingInfo)(options.storeLoadOptions.sort || [])),
  263. filter: filter
  264. });
  265. var isPagingLocal = that._dataSource.isLastLevelGroupItemsPagingLocal();
  266. if (!isPagingLocal) {
  267. loadOptions.skip = expandedInfo.skip;
  268. loadOptions.take = expandedInfo.take
  269. }(0, _deferred.when)(0 === expandedInfo.take ? [] : that._dataSource.loadFromStore(loadOptions)).done(function(items, extra) {
  270. if (isPagingLocal) {
  271. items = that._dataSource.sortLastLevelGroupItems(items, groups, expandedInfo.paths);
  272. items = expandedInfo.skip ? items.slice(expandedInfo.skip) : items;
  273. items = expandedInfo.take ? items.slice(0, expandedInfo.take) : items
  274. }(0, _iterator.each)(expandedInfo.items, function(index, item) {
  275. var itemCount = item.count - (0 === index && expandedInfo.skip || 0);
  276. var expandedItems = items.splice(0, itemCount);
  277. applyContinuationToGroupItem(options, expandedInfo, groups.length - 1, index);
  278. item.items = expandedItems
  279. });
  280. options.data.resolve(data)
  281. }).fail(options.data.reject)
  282. }
  283. var loadGroupTotalCount = function(dataSource, options) {
  284. var d = new _deferred.Deferred;
  285. var isGrouping = !!(options.group && options.group.length);
  286. var loadOptions = (0, _extend.extend)({
  287. skip: 0,
  288. take: 1,
  289. requireGroupCount: isGrouping,
  290. requireTotalCount: !isGrouping
  291. }, options, {
  292. group: isGrouping ? options.group : null
  293. });
  294. dataSource.load(loadOptions).done(function(data, extra) {
  295. var count = extra && (isGrouping ? extra.groupCount : extra.totalCount);
  296. if (!isFinite(count)) {
  297. throw _errors.errors.Error(isGrouping ? "E4022" : "E4021")
  298. }
  299. d.resolve(count)
  300. }).fail(d.reject.bind(d));
  301. return d
  302. };
  303. return {
  304. updateTotalItemsCount: function(options) {
  305. var totalItemsCount = 0;
  306. var totalCount = options.extra && options.extra.totalCount || 0;
  307. var groupCount = options.extra && options.extra.groupCount || 0;
  308. var pageSize = this._dataSource.pageSize();
  309. var isVirtualPaging = this._isVirtualPaging();
  310. foreachExpandedGroups(this, function(groupInfo) {
  311. groupInfo.childrenTotalCount = 0
  312. });
  313. foreachExpandedGroups(this, function(groupInfo, parents) {
  314. var totalOffset = getTotalOffset(parents, isVirtualPaging ? 0 : pageSize, totalItemsCount);
  315. var count = groupInfo.count + groupInfo.childrenTotalCount;
  316. if (!isVirtualPaging) {
  317. count += getContinuationGroupCount(totalOffset, pageSize, count, parents.length - 1)
  318. }
  319. if (parents[parents.length - 2]) {
  320. parents[parents.length - 2].childrenTotalCount += count
  321. } else {
  322. totalItemsCount += count
  323. }
  324. });
  325. this.callBase(totalItemsCount - totalCount + groupCount)
  326. },
  327. _isGroupExpanded: function(groupIndex) {
  328. var groups = this._dataSource.group();
  329. return isGroupExpanded(groups, groupIndex)
  330. },
  331. _updatePagingOptions: function(options, callback) {
  332. var that = this;
  333. var isVirtualPaging = that._isVirtualPaging();
  334. var pageSize = that._dataSource.pageSize();
  335. var skips = [];
  336. var takes = [];
  337. var skipChildrenTotalCount = 0;
  338. var childrenTotalCount = 0;
  339. if (options.take) {
  340. foreachExpandedGroups(this, function(groupInfo) {
  341. groupInfo.childrenTotalCount = 0;
  342. groupInfo.skipChildrenTotalCount = 0
  343. });
  344. foreachExpandedGroups(that, function(groupInfo, parents) {
  345. var take;
  346. var takeCorrection = 0;
  347. var parentTakeCorrection = 0;
  348. var totalOffset = getTotalOffset(parents, isVirtualPaging ? 0 : pageSize, childrenTotalCount);
  349. var continuationGroupCount = 0;
  350. var skipContinuationGroupCount = 0;
  351. var groupInfoCount = groupInfo.count + groupInfo.childrenTotalCount;
  352. var childrenGroupInfoCount = groupInfoCount;
  353. callback && callback(groupInfo, totalOffset);
  354. var skip = options.skip - totalOffset;
  355. if (totalOffset <= options.skip + options.take && groupInfoCount) {
  356. take = options.take;
  357. if (!isVirtualPaging) {
  358. continuationGroupCount = getContinuationGroupCount(totalOffset, pageSize, groupInfoCount, parents.length - 1);
  359. groupInfoCount += continuationGroupCount * parents.length;
  360. childrenGroupInfoCount += continuationGroupCount;
  361. if (pageSize && skip >= 0) {
  362. takeCorrection = parents.length;
  363. parentTakeCorrection = parents.length - 1;
  364. skipContinuationGroupCount = Math.floor(skip / pageSize)
  365. }
  366. }
  367. if (skip >= 0) {
  368. if (totalOffset + groupInfoCount > options.skip) {
  369. skips.unshift(skip - skipContinuationGroupCount * takeCorrection - groupInfo.skipChildrenTotalCount)
  370. }
  371. if (totalOffset + groupInfoCount >= options.skip + take) {
  372. takes.unshift(take - takeCorrection - groupInfo.childrenTotalCount + groupInfo.skipChildrenTotalCount)
  373. }
  374. } else {
  375. if (totalOffset + groupInfoCount >= options.skip + take) {
  376. takes.unshift(take + skip - groupInfo.childrenTotalCount)
  377. }
  378. }
  379. }
  380. if (totalOffset <= options.skip) {
  381. if (parents[parents.length - 2]) {
  382. parents[parents.length - 2].skipChildrenTotalCount += Math.min(childrenGroupInfoCount, skip + 1 - skipContinuationGroupCount * parentTakeCorrection)
  383. } else {
  384. skipChildrenTotalCount += Math.min(childrenGroupInfoCount, skip + 1)
  385. }
  386. }
  387. if (totalOffset <= options.skip + take) {
  388. groupInfoCount = Math.min(childrenGroupInfoCount, skip + take - (skipContinuationGroupCount + 1) * parentTakeCorrection);
  389. if (parents[parents.length - 2]) {
  390. parents[parents.length - 2].childrenTotalCount += groupInfoCount
  391. } else {
  392. childrenTotalCount += groupInfoCount
  393. }
  394. }
  395. });
  396. options.skip -= skipChildrenTotalCount;
  397. options.take -= childrenTotalCount - skipChildrenTotalCount
  398. }
  399. options.skips = skips;
  400. options.takes = takes
  401. },
  402. changeRowExpand: function(path) {
  403. var that = this;
  404. var groupInfo = that.findGroupInfo(path);
  405. var dataSource = that._dataSource;
  406. var remoteGroupPaging = dataSource.remoteOperations().groupPaging;
  407. var groups = (0, _uiData_grid.normalizeSortingInfo)(dataSource.group());
  408. if (groupInfo) {
  409. groupInfo.isExpanded = !groupInfo.isExpanded;
  410. if (remoteGroupPaging && groupInfo.isExpanded && path.length < groups.length) {
  411. return loadGroupTotalCount(dataSource, {
  412. filter: (0, _uiData_grid2.createGroupFilter)(path, {
  413. filter: dataSource.filter(),
  414. group: dataSource.group()
  415. }),
  416. group: [groups[path.length]],
  417. select: dataSource.select()
  418. }).done(function(groupCount) {
  419. groupInfo.count = groupCount
  420. })
  421. }
  422. return (new _deferred.Deferred).resolve()
  423. }
  424. return (new _deferred.Deferred).reject()
  425. },
  426. handleDataLoading: function(options) {
  427. var that = this;
  428. var storeLoadOptions = options.storeLoadOptions;
  429. var groups = (0, _uiData_grid.normalizeSortingInfo)(storeLoadOptions.group || options.loadOptions.group);
  430. if (options.isCustomLoading || !groups.length) {
  431. return
  432. }
  433. if (options.remoteOperations.grouping) {
  434. var remotePaging = that._dataSource.remoteOperations().paging;
  435. storeLoadOptions.group = (0, _uiData_grid.normalizeSortingInfo)(storeLoadOptions.group);
  436. storeLoadOptions.group.forEach(function(group, index) {
  437. var isLastGroup = index === storeLoadOptions.group.length - 1;
  438. group.isExpanded = !remotePaging || !isLastGroup
  439. })
  440. }
  441. options.group = options.group || groups;
  442. if (options.remoteOperations.paging) {
  443. options.skip = storeLoadOptions.skip;
  444. options.take = storeLoadOptions.take;
  445. storeLoadOptions.requireGroupCount = true;
  446. storeLoadOptions.group = groups.slice(0, 1);
  447. that._updatePagingOptions(options);
  448. storeLoadOptions.skip = options.skip;
  449. storeLoadOptions.take = options.take
  450. } else {
  451. that.foreachGroups(function(groupInfo) {
  452. groupInfo.count = 0
  453. })
  454. }
  455. },
  456. handleDataLoadedCore: function(options, callBase) {
  457. var that = this;
  458. var loadedGroupCount = (0, _uiData_grid.normalizeSortingInfo)(options.storeLoadOptions.group || options.loadOptions.group).length;
  459. var groupCount = options.group ? options.group.length : 0;
  460. var totalCount;
  461. var expandedInfo = {};
  462. if (options.isCustomLoading) {
  463. callBase(options);
  464. processGroupItems(that, options.data, loadedGroupCount, expandedInfo, [], options.isCustomLoading, options.storeLoadOptions.isLoadingAll)
  465. } else {
  466. totalCount = updateGroupInfos(that, options, options.data, loadedGroupCount);
  467. if (totalCount < 0) {
  468. throw _ui2.default.Error("E1037")
  469. }
  470. if (!options.remoteOperations.paging) {
  471. if (loadedGroupCount && options.extra && options.loadOptions.requireTotalCount) {
  472. options.extra.totalCount = totalCount;
  473. options.extra.groupCount = options.data.length
  474. }
  475. }
  476. if (groupCount && options.storeLoadOptions.requireGroupCount && !isFinite(options.extra.groupCount)) {
  477. throw _errors.errors.Error("E4022")
  478. }
  479. that.updateTotalItemsCount(options);
  480. if (!options.remoteOperations.paging) {
  481. that._updatePagingOptions(options)
  482. }
  483. callBase(options);
  484. if (!options.remoteOperations.paging) {
  485. that._processPaging(options, loadedGroupCount)
  486. }
  487. }
  488. loadGroupItems(that, options, loadedGroupCount, expandedInfo, 0, options.data)
  489. },
  490. _processSkips: function(items, skips, groupCount) {
  491. if (!groupCount) {
  492. return
  493. }
  494. var firstItem = items[0];
  495. var skip = skips[0];
  496. var children = firstItem && firstItem.items;
  497. if (void 0 !== skip) {
  498. firstItem.isContinuation = true;
  499. if (children) {
  500. firstItem.items = children.slice(skip);
  501. this._processSkips(firstItem.items, skips.slice(1), groupCount - 1)
  502. }
  503. }
  504. },
  505. _processTakes: function(items, skips, takes, groupCount, parents) {
  506. if (!groupCount || !items) {
  507. return
  508. }
  509. parents = parents || [];
  510. var lastItem = items[items.length - 1];
  511. var children = lastItem && lastItem.items;
  512. var take = takes[0];
  513. var skip = skips[0];
  514. if (lastItem) {
  515. var maxTakeCount = lastItem.count - (lastItem.isContinuation && skip || 0) || children.length;
  516. if (void 0 !== take && maxTakeCount > take) {
  517. lastItem.isContinuationOnNextPage = true;
  518. parents.forEach(function(parent) {
  519. parent.isContinuationOnNextPage = true
  520. });
  521. if (children) {
  522. children = children.slice(0, take);
  523. lastItem.items = children
  524. }
  525. }
  526. parents.push(lastItem);
  527. this._processTakes(children, skips.slice(1), takes.slice(1), groupCount - 1, parents)
  528. }
  529. },
  530. _processPaging: function(options, groupCount) {
  531. this._processSkips(options.data, options.skips, groupCount);
  532. this._processTakes(options.data, options.skips, options.takes, groupCount)
  533. },
  534. isLastLevelGroupItemsPagingLocal: function() {
  535. return false
  536. },
  537. sortLastLevelGroupItems: function(items) {
  538. return items
  539. },
  540. refresh: function(options, isReload, operationTypes) {
  541. var that = this;
  542. var dataSource = that._dataSource;
  543. var storeLoadOptions = options.storeLoadOptions;
  544. var group = options.group || options.storeLoadOptions.group;
  545. var oldGroups = (0, _uiData_grid.normalizeSortingInfo)(that._group);
  546. var isExpanded;
  547. var groupIndex;
  548. function handleGroup(groupInfo, parents) {
  549. if (parents.length === groupIndex + 1) {
  550. groupInfo.isExpanded = isExpanded
  551. }
  552. }
  553. for (groupIndex = 0; groupIndex < oldGroups.length; groupIndex++) {
  554. isExpanded = isGroupExpanded(group, groupIndex);
  555. if (isGroupExpanded(that._group, groupIndex) !== isExpanded) {
  556. that.foreachGroups(handleGroup)
  557. }
  558. }
  559. that.callBase.apply(this, arguments);
  560. if (group && options.remoteOperations.paging && (isReload || operationTypes.reload)) {
  561. return foreachExpandedGroups(that, function(groupInfo) {
  562. var groupCountQuery = loadGroupTotalCount(dataSource, {
  563. filter: (0, _uiData_grid2.createGroupFilter)(groupInfo.path, {
  564. filter: storeLoadOptions.filter,
  565. group: group
  566. }),
  567. group: group.slice(groupInfo.path.length),
  568. select: storeLoadOptions.select
  569. });
  570. var groupOffsetQuery = loadGroupTotalCount(dataSource, {
  571. filter: (0, _uiData_gridGrouping.createOffsetFilter)(groupInfo.path, {
  572. filter: storeLoadOptions.filter,
  573. group: group
  574. }),
  575. group: group.slice(groupInfo.path.length - 1, 1),
  576. select: storeLoadOptions.select
  577. });
  578. return (0, _deferred.when)(groupOffsetQuery, groupCountQuery).done(function(offset, count) {
  579. offset = parseInt(offset.length ? offset[0] : offset);
  580. count = parseInt(count.length ? count[0] : count);
  581. groupInfo.offset = offset;
  582. if (groupInfo.count !== count) {
  583. groupInfo.count = count;
  584. that.updateTotalItemsCount(options)
  585. }
  586. })
  587. }, true)
  588. }
  589. }
  590. }
  591. }());