data_source.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. /**
  2. * DevExtreme (ui/pivot_grid/data_source.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_source = require("../../data/data_source/data_source");
  11. var _abstract_store = require("../../data/abstract_store");
  12. var _abstract_store2 = _interopRequireDefault(_abstract_store);
  13. var _common = require("../../core/utils/common");
  14. var _type = require("../../core/utils/type");
  15. var _extend = require("../../core/utils/extend");
  16. var _array = require("../../core/utils/array");
  17. var _iterator = require("../../core/utils/iterator");
  18. var _deferred = require("../../core/utils/deferred");
  19. var _class = require("../../core/class");
  20. var _class2 = _interopRequireDefault(_class);
  21. var _events_mixin = require("../../core/events_mixin");
  22. var _events_mixin2 = _interopRequireDefault(_events_mixin);
  23. var _inflector = require("../../core/utils/inflector");
  24. var _local_store = require("./local_store");
  25. var _remote_store = require("./remote_store");
  26. var _remote_store2 = _interopRequireDefault(_remote_store);
  27. var _xmla_store = require("./xmla_store/xmla_store");
  28. var _uiPivot_grid = require("./ui.pivot_grid.summary_display_modes");
  29. var _uiPivot_grid2 = require("./ui.pivot_grid.utils");
  30. function _interopRequireDefault(obj) {
  31. return obj && obj.__esModule ? obj : {
  32. "default": obj
  33. }
  34. }
  35. var DESCRIPTION_NAME_BY_AREA = {
  36. row: "rows",
  37. column: "columns",
  38. data: "values",
  39. filter: "filters"
  40. };
  41. var STATE_PROPERTIES = ["area", "areaIndex", "sortOrder", "filterType", "filterValues", "sortBy", "sortBySummaryField", "sortBySummaryPath", "expanded", "summaryType", "summaryDisplayMode"];
  42. var CALCULATED_PROPERTIES = ["format", "selector", "customizeText", "caption"];
  43. var ALL_CALCULATED_PROPERTIES = CALCULATED_PROPERTIES.concat(["allowSorting", "allowSortingBySummary", "allowFiltering", "allowExpandAll"]);
  44. function createCaption(field) {
  45. var caption = field.dataField || field.groupName || "";
  46. var summaryType = (field.summaryType || "").toLowerCase();
  47. if ((0, _type.isString)(field.groupInterval)) {
  48. caption += "_" + field.groupInterval
  49. }
  50. if (summaryType && "custom" !== summaryType) {
  51. summaryType = summaryType.replace(/^./, summaryType[0].toUpperCase());
  52. if (caption.length) {
  53. summaryType = " (" + summaryType + ")"
  54. }
  55. } else {
  56. summaryType = ""
  57. }
  58. return (0, _inflector.titleize)(caption) + summaryType
  59. }
  60. function resetFieldState(field, properties) {
  61. var initialProperties = field._initProperties || {};
  62. (0, _iterator.each)(properties, function(_, prop) {
  63. if (Object.prototype.hasOwnProperty.call(initialProperties, prop)) {
  64. field[prop] = initialProperties[prop]
  65. }
  66. })
  67. }
  68. function updateCalculatedFieldProperties(field, calculatedProperties) {
  69. resetFieldState(field, calculatedProperties);
  70. if (!(0, _type.isDefined)(field.caption)) {
  71. (0, _uiPivot_grid2.setFieldProperty)(field, "caption", createCaption(field))
  72. }
  73. }
  74. function areExpressionsUsed(dataFields) {
  75. return dataFields.some(function(field) {
  76. return field.summaryDisplayMode || field.calculateSummaryValue
  77. })
  78. }
  79. function isRunningTotalUsed(dataFields) {
  80. return dataFields.some(function(field) {
  81. return !!field.runningTotal
  82. })
  83. }
  84. function isDataExists(data) {
  85. return data.rows.length || data.columns.length || data.values.length
  86. }
  87. module.exports = _class2.default.inherit(function() {
  88. var findHeaderItem = function(headerItems, path) {
  89. if (headerItems._cacheByPath) {
  90. return headerItems._cacheByPath[path.join(".")] || null
  91. }
  92. };
  93. var getHeaderItemsLastIndex = function getHeaderItemsLastIndex(headerItems, grandTotalIndex) {
  94. var lastIndex = -1;
  95. if (headerItems) {
  96. for (var i = 0; i < headerItems.length; i++) {
  97. var headerItem = headerItems[i];
  98. if (void 0 !== headerItem.index) {
  99. lastIndex = Math.max(lastIndex, headerItem.index)
  100. }
  101. if (headerItem.children) {
  102. lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.children))
  103. } else {
  104. if (headerItem.collapsedChildren) {
  105. lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.collapsedChildren))
  106. }
  107. }
  108. }
  109. }
  110. if ((0, _type.isDefined)(grandTotalIndex)) {
  111. lastIndex = Math.max(lastIndex, grandTotalIndex)
  112. }
  113. return lastIndex
  114. };
  115. var updateHeaderItemChildren = function(headerItems, headerItem, children, grandTotalIndex) {
  116. var applyingHeaderItemsCount = getHeaderItemsLastIndex(children) + 1;
  117. var emptyIndex = getHeaderItemsLastIndex(headerItems, grandTotalIndex) + 1;
  118. var index;
  119. var applyingItemIndexesToCurrent = [];
  120. var needIndexUpdate = false;
  121. var d = new _deferred.Deferred;
  122. if (headerItem.children && headerItem.children.length === children.length) {
  123. for (var i = 0; i < children.length; i++) {
  124. var child = children[i];
  125. if (void 0 !== child.index) {
  126. if (void 0 === headerItem.children[i].index) {
  127. child.index = applyingItemIndexesToCurrent[child.index] = emptyIndex++;
  128. headerItem.children[i] = child
  129. } else {
  130. applyingItemIndexesToCurrent[child.index] = headerItem.children[i].index
  131. }
  132. }
  133. }
  134. } else {
  135. needIndexUpdate = true;
  136. for (index = 0; index < applyingHeaderItemsCount; index++) {
  137. applyingItemIndexesToCurrent[index] = emptyIndex++
  138. }
  139. headerItem.children = children
  140. }(0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItem.children, function(items) {
  141. if (needIndexUpdate) {
  142. items[0].index = applyingItemIndexesToCurrent[items[0].index]
  143. }
  144. })).done(function() {
  145. d.resolve(applyingItemIndexesToCurrent)
  146. });
  147. return d
  148. };
  149. var updateHeaderItems = function(headerItems, newHeaderItems, grandTotalIndex) {
  150. var d = new _deferred.Deferred;
  151. var emptyIndex = grandTotalIndex >= 0 && getHeaderItemsLastIndex(headerItems, grandTotalIndex) + 1;
  152. var applyingItemIndexesToCurrent = [];
  153. (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItems, function(items) {
  154. delete items[0].collapsedChildren
  155. })).done(function() {
  156. (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(newHeaderItems, function(newItems, index) {
  157. var newItem = newItems[0];
  158. if (newItem.index >= 0) {
  159. var headerItem = findHeaderItem(headerItems, (0, _uiPivot_grid2.createPath)(newItems));
  160. if (headerItem && headerItem.index >= 0) {
  161. applyingItemIndexesToCurrent[newItem.index] = headerItem.index
  162. } else {
  163. if (emptyIndex) {
  164. var path = (0, _uiPivot_grid2.createPath)(newItems.slice(1));
  165. headerItem = findHeaderItem(headerItems, path);
  166. var parentItems = path.length ? headerItem && headerItem.children : headerItems;
  167. if (parentItems) {
  168. parentItems[index] = newItem;
  169. newItem.index = applyingItemIndexesToCurrent[newItem.index] = emptyIndex++
  170. }
  171. }
  172. }
  173. }
  174. })).done(function() {
  175. d.resolve(applyingItemIndexesToCurrent)
  176. })
  177. });
  178. return d
  179. };
  180. var updateDataSourceCells = function(dataSource, newDataSourceCells, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
  181. var rowIndex;
  182. var columnIndex;
  183. var dataSourceCells = dataSource.values;
  184. if (newDataSourceCells) {
  185. for (var newRowIndex = 0; newRowIndex <= newDataSourceCells.length; newRowIndex++) {
  186. var newRowCells = newDataSourceCells[newRowIndex];
  187. rowIndex = newRowItemIndexesToCurrent[newRowIndex];
  188. if (!(0, _type.isDefined)(rowIndex)) {
  189. rowIndex = dataSource.grandTotalRowIndex
  190. }
  191. if (newRowCells && (0, _type.isDefined)(rowIndex)) {
  192. if (!dataSourceCells[rowIndex]) {
  193. dataSourceCells[rowIndex] = []
  194. }
  195. for (var newColumnIndex = 0; newColumnIndex <= newRowCells.length; newColumnIndex++) {
  196. var newCell = newRowCells[newColumnIndex];
  197. columnIndex = newColumnItemIndexesToCurrent[newColumnIndex];
  198. if (!(0, _type.isDefined)(columnIndex)) {
  199. columnIndex = dataSource.grandTotalColumnIndex
  200. }
  201. if ((0, _type.isDefined)(newCell) && (0, _type.isDefined)(columnIndex)) {
  202. dataSourceCells[rowIndex][columnIndex] = newCell
  203. }
  204. }
  205. }
  206. }
  207. }
  208. };
  209. function createLocalOrRemoteStore(dataSourceOptions, notifyProgress) {
  210. var StoreConstructor = dataSourceOptions.remoteOperations || dataSourceOptions.paginate ? _remote_store2.default : _local_store.LocalStore;
  211. return new StoreConstructor((0, _extend.extend)((0, _data_source.normalizeDataSourceOptions)(dataSourceOptions), {
  212. onChanged: null,
  213. onLoadingChanged: null,
  214. onProgressChanged: notifyProgress
  215. }))
  216. }
  217. function createStore(dataSourceOptions, notifyProgress) {
  218. var store;
  219. if ((0, _type.isPlainObject)(dataSourceOptions) && dataSourceOptions.load) {
  220. store = createLocalOrRemoteStore(dataSourceOptions, notifyProgress)
  221. } else {
  222. if (dataSourceOptions && !dataSourceOptions.store) {
  223. dataSourceOptions = {
  224. store: dataSourceOptions
  225. }
  226. }
  227. var storeOptions = dataSourceOptions.store;
  228. if ("xmla" === storeOptions.type) {
  229. store = new _xmla_store.XmlaStore(storeOptions)
  230. } else {
  231. if ((0, _type.isPlainObject)(storeOptions) && storeOptions.type || storeOptions instanceof _abstract_store2.default || Array.isArray(storeOptions)) {
  232. store = createLocalOrRemoteStore(dataSourceOptions, notifyProgress)
  233. } else {
  234. if (storeOptions instanceof _class2.default) {
  235. store = storeOptions
  236. }
  237. }
  238. }
  239. }
  240. return store
  241. }
  242. function equalFields(fields, prevFields, count) {
  243. for (var i = 0; i < count; i++) {
  244. if (!fields[i] || !prevFields[i] || fields[i].index !== prevFields[i].index) {
  245. return false
  246. }
  247. }
  248. return true
  249. }
  250. function getExpandedPaths(dataSource, loadOptions, dimensionName, prevLoadOptions) {
  251. var result = [];
  252. var fields = loadOptions && loadOptions[dimensionName] || [];
  253. var prevFields = prevLoadOptions && prevLoadOptions[dimensionName] || [];
  254. (0, _uiPivot_grid2.foreachTree)(dataSource[dimensionName], function(items) {
  255. var item = items[0];
  256. var path = (0, _uiPivot_grid2.createPath)(items);
  257. if (item.children && fields[path.length - 1] && !fields[path.length - 1].expanded) {
  258. if (path.length < fields.length && (!prevLoadOptions || equalFields(fields, prevFields, path.length))) {
  259. result.push(path.slice())
  260. }
  261. }
  262. }, true);
  263. return result
  264. }
  265. function setFieldProperties(field, srcField, skipInitPropertySave, properties) {
  266. if (srcField) {
  267. (0, _iterator.each)(properties, function(_, name) {
  268. if (skipInitPropertySave) {
  269. field[name] = srcField[name]
  270. } else {
  271. if (("summaryType" === name || "summaryDisplayMode" === name) && void 0 === srcField[name]) {
  272. return
  273. }(0, _uiPivot_grid2.setFieldProperty)(field, name, srcField[name])
  274. }
  275. })
  276. } else {
  277. resetFieldState(field, properties)
  278. }
  279. return field
  280. }
  281. function getFieldsState(fields, properties) {
  282. var result = [];
  283. (0, _iterator.each)(fields, function(_, field) {
  284. result.push(setFieldProperties({
  285. dataField: field.dataField,
  286. name: field.name
  287. }, field, true, properties))
  288. });
  289. return result
  290. }
  291. function getFieldStateId(field) {
  292. if (field.name) {
  293. return field.name
  294. }
  295. return field.dataField + ""
  296. }
  297. function getFieldsById(fields, id) {
  298. var result = [];
  299. (0, _iterator.each)(fields || [], function(_, field) {
  300. if (getFieldStateId(field) === id) {
  301. result.push(field)
  302. }
  303. });
  304. return result
  305. }
  306. function setFieldsStateCore(stateFields, fields) {
  307. stateFields = stateFields || [];
  308. (0, _iterator.each)(fields, function(index, field) {
  309. setFieldProperties(field, stateFields[index], false, STATE_PROPERTIES);
  310. updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES)
  311. });
  312. return fields
  313. }
  314. function setFieldsState(stateFields, fields) {
  315. stateFields = stateFields || [];
  316. var fieldsById = {};
  317. var id;
  318. (0, _iterator.each)(fields, function(_, field) {
  319. id = getFieldStateId(field);
  320. if (!fieldsById[id]) {
  321. fieldsById[id] = getFieldsById(fields, getFieldStateId(field))
  322. }
  323. });
  324. (0, _iterator.each)(fieldsById, function(id, fields) {
  325. setFieldsStateCore(getFieldsById(stateFields, id), fields)
  326. });
  327. return fields
  328. }
  329. function getFieldsByGroup(fields, groupingField) {
  330. return fields.filter(function(field) {
  331. return field.groupName === groupingField.groupName && (0, _type.isNumeric)(field.groupIndex) && false !== field.visible
  332. }).map(function(field) {
  333. return (0, _extend.extend)(field, {
  334. areaIndex: groupingField.areaIndex,
  335. area: groupingField.area,
  336. expanded: (0, _type.isDefined)(field.expanded) ? field.expanded : groupingField.expanded,
  337. dataField: field.dataField || groupingField.dataField,
  338. dataType: field.dataType || groupingField.dataType,
  339. sortBy: field.sortBy || groupingField.sortBy,
  340. sortOrder: field.sortOrder || groupingField.sortOrder,
  341. sortBySummaryField: field.sortBySummaryField || groupingField.sortBySummaryField,
  342. sortBySummaryPath: field.sortBySummaryPath || groupingField.sortBySummaryPath,
  343. visible: field.visible || groupingField.visible,
  344. showTotals: (0, _type.isDefined)(field.showTotals) ? field.showTotals : groupingField.showTotals,
  345. showGrandTotals: (0, _type.isDefined)(field.showGrandTotals) ? field.showGrandTotals : groupingField.showGrandTotals
  346. })
  347. }).sort(function(a, b) {
  348. return a.groupIndex - b.groupIndex
  349. })
  350. }
  351. function sortFieldsByAreaIndex(fields) {
  352. fields.sort(function(field1, field2) {
  353. return field1.areaIndex - field2.areaIndex || field1.groupIndex - field2.groupIndex
  354. })
  355. }
  356. function isAreaField(field, area) {
  357. var canAddFieldInArea = "data" === area || false !== field.visible;
  358. return field.area === area && !(0, _type.isDefined)(field.groupIndex) && canAddFieldInArea
  359. }
  360. function getFieldId(field, retrieveFieldsOptionValue) {
  361. var groupName = field.groupName || "";
  362. return (field.dataField || groupName) + (field.groupInterval ? groupName + field.groupInterval : "NOGROUP") + (retrieveFieldsOptionValue ? "" : groupName)
  363. }
  364. function mergeFields(fields, storeFields, retrieveFieldsOptionValue) {
  365. var result = [];
  366. var fieldsDictionary = {};
  367. var removedFields = {};
  368. var mergedGroups = [];
  369. var dataTypes = (0, _uiPivot_grid2.getFieldsDataType)(fields);
  370. if (storeFields) {
  371. (0, _iterator.each)(storeFields, function(_, field) {
  372. fieldsDictionary[getFieldId(field, retrieveFieldsOptionValue)] = field
  373. });
  374. (0, _iterator.each)(fields, function(_, field) {
  375. var fieldKey = getFieldId(field, retrieveFieldsOptionValue);
  376. var storeField = fieldsDictionary[fieldKey] || removedFields[fieldKey];
  377. var mergedField;
  378. if (storeField) {
  379. if (storeField._initProperties) {
  380. resetFieldState(storeField, ALL_CALCULATED_PROPERTIES)
  381. }
  382. mergedField = (0, _extend.extend)({}, storeField, field, {
  383. _initProperties: null
  384. })
  385. } else {
  386. fieldsDictionary[fieldKey] = mergedField = field
  387. }(0, _extend.extend)(mergedField, {
  388. dataType: dataTypes[field.dataField]
  389. });
  390. delete fieldsDictionary[fieldKey];
  391. removedFields[fieldKey] = storeField;
  392. result.push(mergedField)
  393. });
  394. if (retrieveFieldsOptionValue) {
  395. (0, _iterator.each)(fieldsDictionary, function(_, field) {
  396. result.push(field)
  397. })
  398. }
  399. } else {
  400. result = fields
  401. }
  402. result.push.apply(result, mergedGroups);
  403. return result
  404. }
  405. function getFields(that) {
  406. var result = new _deferred.Deferred;
  407. var store = that._store;
  408. var storeFields = store && store.getFields(that._fields);
  409. (0, _deferred.when)(storeFields).done(function(storeFields) {
  410. that._storeFields = storeFields;
  411. var mergedFields = mergeFields(that._fields, storeFields, that._retrieveFields);
  412. result.resolve(mergedFields)
  413. }).fail(result.reject);
  414. return result
  415. }
  416. function getSliceIndex(items, path) {
  417. var index = null;
  418. var pathValue = (path || []).join(".");
  419. if (pathValue.length) {
  420. (0, _uiPivot_grid2.foreachTree)(items, function(items) {
  421. var item = items[0];
  422. var itemPath = (0, _uiPivot_grid2.createPath)(items).join(".");
  423. var textPath = (0, _iterator.map)(items, function(item) {
  424. return item.text
  425. }).reverse().join(".");
  426. if (pathValue === itemPath || item.key && textPath === pathValue) {
  427. index = items[0].index;
  428. return false
  429. }
  430. })
  431. }
  432. return index
  433. }
  434. function getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName) {
  435. var values = dataSource.values;
  436. var sortBySummaryFieldIndex = (0, _uiPivot_grid2.findField)(loadOptions.values, field.sortBySummaryField);
  437. var areRows = "rows" === dimensionName;
  438. var sortByDimension = areRows ? dataSource.columns : dataSource.rows;
  439. var grandTotalIndex = areRows ? dataSource.grandTotalRowIndex : dataSource.grandTotalColumnIndex;
  440. var sortBySummaryPath = field.sortBySummaryPath || [];
  441. var sliceIndex = sortBySummaryPath.length ? getSliceIndex(sortByDimension, sortBySummaryPath) : grandTotalIndex;
  442. if (values && values.length && sortBySummaryFieldIndex >= 0 && (0, _type.isDefined)(sliceIndex)) {
  443. return function(field) {
  444. var rowIndex = areRows ? field.index : sliceIndex;
  445. var columnIndex = areRows ? sliceIndex : field.index;
  446. var value = ((values[rowIndex] || [
  447. []
  448. ])[columnIndex] || [])[sortBySummaryFieldIndex];
  449. return (0, _type.isDefined)(value) ? value : null
  450. }
  451. }
  452. }
  453. function getMemberForSortBy(sortBy, getAscOrder) {
  454. var member = "text";
  455. if ("none" === sortBy) {
  456. member = "index"
  457. } else {
  458. if (getAscOrder || "displayText" !== sortBy) {
  459. member = "value"
  460. }
  461. }
  462. return member
  463. }
  464. function getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder) {
  465. var sortOrder = getAscOrder ? "asc" : field.sortOrder;
  466. var sortBy = getMemberForSortBy(field.sortBy, getAscOrder);
  467. var defaultCompare = field.sortingMethod ? function(a, b) {
  468. return field.sortingMethod(a, b)
  469. } : (0, _uiPivot_grid2.getCompareFunction)(function(item) {
  470. return item[sortBy]
  471. });
  472. var summaryValueSelector = !getAscOrder && getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName);
  473. var summaryCompare = summaryValueSelector && (0, _uiPivot_grid2.getCompareFunction)(summaryValueSelector);
  474. var sortingMethod = function(a, b) {
  475. var result = summaryCompare && summaryCompare(a, b) || defaultCompare(a, b);
  476. return "desc" === sortOrder ? -result : result
  477. };
  478. return sortingMethod
  479. }
  480. function sortDimension(dataSource, loadOptions, dimensionName, getAscOrder) {
  481. var fields = loadOptions[dimensionName] || [];
  482. var baseIndex = loadOptions.headerName === dimensionName ? loadOptions.path.length : 0;
  483. var sortingMethodByLevel = [];
  484. (0, _uiPivot_grid2.foreachDataLevel)(dataSource[dimensionName], function(item, index) {
  485. var field = fields[index] || {};
  486. var sortingMethod = sortingMethodByLevel[index] = sortingMethodByLevel[index] || getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder);
  487. item.sort(sortingMethod)
  488. }, baseIndex)
  489. }
  490. function sort(loadOptions, dataSource, getAscOrder) {
  491. sortDimension(dataSource, loadOptions, "rows", getAscOrder);
  492. sortDimension(dataSource, loadOptions, "columns", getAscOrder)
  493. }
  494. function formatHeaderItems(data, loadOptions, headerName) {
  495. return (0, _uiPivot_grid2.foreachTreeAsync)(data[headerName], function(items) {
  496. var item = items[0];
  497. item.text = item.text || (0, _uiPivot_grid2.formatValue)(item.value, loadOptions[headerName][(0, _uiPivot_grid2.createPath)(items).length - 1])
  498. })
  499. }
  500. function formatHeaders(loadOptions, data) {
  501. return (0, _deferred.when)(formatHeaderItems(data, loadOptions, "columns"), formatHeaderItems(data, loadOptions, "rows"))
  502. }
  503. function updateCache(headerItems) {
  504. var d = new _deferred.Deferred;
  505. var cacheByPath = {};
  506. (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItems, function(items) {
  507. var path = (0, _uiPivot_grid2.createPath)(items).join(".");
  508. cacheByPath[path] = items[0]
  509. })).done(d.resolve);
  510. headerItems._cacheByPath = cacheByPath;
  511. return d
  512. }
  513. function _getAreaFields(fields, area) {
  514. var areaFields = [];
  515. (0, _iterator.each)(fields, function() {
  516. if (isAreaField(this, area)) {
  517. areaFields.push(this)
  518. }
  519. });
  520. return areaFields
  521. }
  522. return {
  523. ctor: function(options) {
  524. options = options || {};
  525. var that = this;
  526. var store = createStore(options, function(progress) {
  527. that.fireEvent("progressChanged", [progress])
  528. });
  529. that._store = store;
  530. that._paginate = !!options.paginate;
  531. that._pageSize = options.pageSize || 40;
  532. that._data = {
  533. rows: [],
  534. columns: [],
  535. values: []
  536. };
  537. that._loadingCount = 0;
  538. that._isFieldsModified = false;
  539. (0, _iterator.each)(["changed", "loadError", "loadingChanged", "progressChanged", "fieldsPrepared", "expandValueChanging"], function(_, eventName) {
  540. var optionName = "on" + eventName[0].toUpperCase() + eventName.slice(1);
  541. if (Object.prototype.hasOwnProperty.call(options, optionName)) {
  542. this.on(eventName, options[optionName])
  543. }
  544. }.bind(this));
  545. that._retrieveFields = (0, _type.isDefined)(options.retrieveFields) ? options.retrieveFields : true;
  546. that._fields = options.fields || [];
  547. that._descriptions = options.descriptions ? (0, _extend.extend)(that._createDescriptions(), options.descriptions) : void 0;
  548. if (!store) {
  549. (0, _extend.extend)(true, that._data, options.store || options)
  550. }
  551. },
  552. getData: function() {
  553. return this._data
  554. },
  555. getAreaFields: function(area, collectGroups) {
  556. var areaFields = [];
  557. if (collectGroups || "data" === area) {
  558. areaFields = _getAreaFields(this._fields, area);
  559. sortFieldsByAreaIndex(areaFields)
  560. } else {
  561. var descriptions = this._descriptions || {};
  562. areaFields = descriptions[DESCRIPTION_NAME_BY_AREA[area]] || []
  563. }
  564. return areaFields
  565. },
  566. fields: function(_fields) {
  567. var that = this;
  568. if (_fields) {
  569. that._fields = mergeFields(_fields, that._storeFields, that._retrieveFields);
  570. that._fieldsPrepared(that._fields)
  571. }
  572. return that._fields
  573. },
  574. field: function field(id, options) {
  575. var that = this;
  576. var fields = that._fields;
  577. var field = fields && fields[(0, _type.isNumeric)(id) ? id : (0, _uiPivot_grid2.findField)(fields, id)];
  578. if (field && options) {
  579. (0, _iterator.each)(options, function(optionName, optionValue) {
  580. var isInitialization = (0, _array.inArray)(optionName, STATE_PROPERTIES) < 0;
  581. (0, _uiPivot_grid2.setFieldProperty)(field, optionName, optionValue, isInitialization);
  582. if ("sortOrder" === optionName) {
  583. var levels = field.levels || [];
  584. for (var i = 0; i < levels.length; i++) {
  585. levels[i][optionName] = optionValue
  586. }
  587. }
  588. });
  589. updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES);
  590. that._descriptions = that._createDescriptions(field);
  591. that._isFieldsModified = true;
  592. that.fireEvent("fieldChanged", [field])
  593. }
  594. return field
  595. },
  596. getFieldValues: function(index, applyFilters, options) {
  597. var that = this;
  598. var field = this._fields && this._fields[index];
  599. var store = this.store();
  600. var loadFields = [];
  601. var loadOptions = {
  602. columns: loadFields,
  603. rows: [],
  604. values: this.getAreaFields("data"),
  605. filters: applyFilters ? this._fields.filter(function(f) {
  606. return f !== field && f.area && f.filterValues && f.filterValues.length
  607. }) : [],
  608. skipValues: true
  609. };
  610. var searchValue;
  611. var d = new _deferred.Deferred;
  612. if (options) {
  613. searchValue = options.searchValue;
  614. loadOptions.columnSkip = options.skip;
  615. loadOptions.columnTake = options.take
  616. }
  617. if (field && store) {
  618. (0, _iterator.each)(field.levels || [field], function() {
  619. loadFields.push((0, _extend.extend)({}, this, {
  620. expanded: true,
  621. filterValues: null,
  622. sortOrder: "asc",
  623. sortBySummaryField: null,
  624. searchValue: searchValue
  625. }))
  626. });
  627. store.load(loadOptions).done(function(data) {
  628. if (loadOptions.columnSkip) {
  629. data.columns = data.columns.slice(loadOptions.columnSkip)
  630. }
  631. if (loadOptions.columnTake) {
  632. data.columns = data.columns.slice(0, loadOptions.columnTake)
  633. }
  634. formatHeaders(loadOptions, data);
  635. if (!loadOptions.columnTake) {
  636. that._sort(loadOptions, data)
  637. }
  638. d.resolve(data.columns)
  639. }).fail(d)
  640. } else {
  641. d.reject()
  642. }
  643. return d
  644. },
  645. reload: function() {
  646. return this.load({
  647. reload: true
  648. })
  649. },
  650. filter: function() {
  651. var store = this._store;
  652. return store.filter.apply(store, arguments)
  653. },
  654. load: function(options) {
  655. var that = this;
  656. var d = new _deferred.Deferred;
  657. options = options || {};
  658. that.beginLoading();
  659. d.fail(function(e) {
  660. that.fireEvent("loadError", [e])
  661. }).always(function() {
  662. that.endLoading()
  663. });
  664. function loadTask() {
  665. that._delayedLoadTask = void 0;
  666. if (!that._descriptions) {
  667. (0, _deferred.when)(getFields(that)).done(function(fields) {
  668. that._fieldsPrepared(fields);
  669. that._loadCore(options, d)
  670. }).fail(d.reject).fail(that._loadErrorHandler)
  671. } else {
  672. that._loadCore(options, d)
  673. }
  674. }
  675. if (that.store()) {
  676. that._delayedLoadTask = (0, _common.executeAsync)(loadTask)
  677. } else {
  678. loadTask()
  679. }
  680. return d
  681. },
  682. createDrillDownDataSource: function(params) {
  683. return this._store.createDrillDownDataSource(this._descriptions, params)
  684. },
  685. _createDescriptions: function(currentField) {
  686. var that = this;
  687. var fields = that.fields();
  688. var descriptions = {
  689. rows: [],
  690. columns: [],
  691. values: [],
  692. filters: []
  693. };
  694. (0, _iterator.each)(["row", "column", "data", "filter"], function(_, areaName) {
  695. (0, _array.normalizeIndexes)(_getAreaFields(fields, areaName), "areaIndex", currentField)
  696. });
  697. (0, _iterator.each)(fields || [], function(_, field) {
  698. var descriptionName = DESCRIPTION_NAME_BY_AREA[field.area];
  699. var dimension = descriptions[descriptionName];
  700. var groupName = field.groupName;
  701. if (groupName && !(0, _type.isNumeric)(field.groupIndex)) {
  702. field.levels = getFieldsByGroup(fields, field)
  703. }
  704. if (!dimension || groupName && (0, _type.isNumeric)(field.groupIndex) || false === field.visible && "data" !== field.area && "filter" !== field.area) {
  705. return
  706. }
  707. if (field.levels && dimension !== descriptions.filters && dimension !== descriptions.values) {
  708. dimension.push.apply(dimension, field.levels);
  709. if (field.filterValues && field.filterValues.length) {
  710. descriptions.filters.push(field)
  711. }
  712. } else {
  713. dimension.push(field)
  714. }
  715. });
  716. (0, _iterator.each)(descriptions, function(_, fields) {
  717. sortFieldsByAreaIndex(fields)
  718. });
  719. var indices = {};
  720. (0, _iterator.each)(descriptions.values, function(_, field) {
  721. var expression = field.calculateSummaryValue;
  722. if ((0, _type.isFunction)(expression)) {
  723. var summaryCell = (0, _uiPivot_grid.createMockSummaryCell)(descriptions, fields, indices);
  724. expression(summaryCell)
  725. }
  726. });
  727. return descriptions
  728. },
  729. _fieldsPrepared: function(fields) {
  730. var that = this;
  731. that._fields = fields;
  732. (0, _iterator.each)(fields, function(index, field) {
  733. field.index = index;
  734. updateCalculatedFieldProperties(field, ALL_CALCULATED_PROPERTIES)
  735. });
  736. var currentFieldState = getFieldsState(fields, ["caption"]);
  737. that.fireEvent("fieldsPrepared", [fields]);
  738. for (var i = 0; i < fields.length; i++) {
  739. if (fields[i].caption !== currentFieldState[i].caption) {
  740. (0, _uiPivot_grid2.setFieldProperty)(fields[i], "caption", fields[i].caption, true)
  741. }
  742. }
  743. that._descriptions = that._createDescriptions()
  744. },
  745. isLoading: function() {
  746. return this._loadingCount > 0
  747. },
  748. state: function(_state, skipLoading) {
  749. var that = this;
  750. if (arguments.length) {
  751. _state = (0, _extend.extend)({
  752. rowExpandedPaths: [],
  753. columnExpandedPaths: []
  754. }, _state);
  755. if (!that._descriptions) {
  756. that.beginLoading();
  757. (0, _deferred.when)(getFields(that)).done(function(fields) {
  758. that._fields = setFieldsState(_state.fields, fields);
  759. that._fieldsPrepared(fields);
  760. !skipLoading && that.load(_state)
  761. }).always(function() {
  762. that.endLoading()
  763. })
  764. } else {
  765. that._fields = setFieldsState(_state.fields, that._fields);
  766. that._descriptions = that._createDescriptions();
  767. !skipLoading && that.load(_state)
  768. }
  769. } else {
  770. return {
  771. fields: getFieldsState(that._fields, STATE_PROPERTIES),
  772. columnExpandedPaths: getExpandedPaths(that._data, that._descriptions, "columns"),
  773. rowExpandedPaths: getExpandedPaths(that._data, that._descriptions, "rows")
  774. }
  775. }
  776. },
  777. beginLoading: function() {
  778. this._changeLoadingCount(1)
  779. },
  780. endLoading: function() {
  781. this._changeLoadingCount(-1)
  782. },
  783. _changeLoadingCount: function(increment) {
  784. var oldLoading = this.isLoading();
  785. this._loadingCount += increment;
  786. var newLoading = this.isLoading();
  787. if (oldLoading ^ newLoading) {
  788. this.fireEvent("loadingChanged", [newLoading])
  789. }
  790. },
  791. _hasPagingValues: function(options, area, oppositeIndex) {
  792. var takeField = area + "Take";
  793. var skipField = area + "Skip";
  794. var values = this._data.values;
  795. var items = this._data[area + "s"];
  796. var oppositeArea = "row" === area ? "column" : "row";
  797. var indices = [];
  798. if (options.path && options.area === area) {
  799. var headerItem = findHeaderItem(items, options.path);
  800. items = headerItem && headerItem.children;
  801. if (!items) {
  802. return false
  803. }
  804. }
  805. if (options.oppositePath && options.area === oppositeArea) {
  806. var _headerItem = findHeaderItem(items, options.oppositePath);
  807. items = _headerItem && _headerItem.children;
  808. if (!items) {
  809. return false
  810. }
  811. }
  812. for (var i = options[skipField]; i < options[skipField] + options[takeField]; i++) {
  813. if (items[i]) {
  814. indices.push(items[i].index)
  815. }
  816. }
  817. return indices.every(function(index) {
  818. if (void 0 !== index) {
  819. if ("row" === area) {
  820. return (values[index] || [])[oppositeIndex]
  821. } else {
  822. return (values[oppositeIndex] || [])[index]
  823. }
  824. }
  825. })
  826. },
  827. _processPagingCacheByArea: function(options, pageSize, area) {
  828. var takeField = area + "Take";
  829. var skipField = area + "Skip";
  830. var items = this._data[area + "s"];
  831. var oppositeArea = "row" === area ? "column" : "row";
  832. var item;
  833. if (options[takeField]) {
  834. if (options.path && options.area === area) {
  835. var headerItem = findHeaderItem(items, options.path);
  836. items = headerItem && headerItem.children || []
  837. }
  838. if (options.oppositePath && options.area === oppositeArea) {
  839. var _headerItem2 = findHeaderItem(items, options.oppositePath);
  840. items = _headerItem2 && _headerItem2.children || []
  841. }
  842. do {
  843. item = items[options[skipField]];
  844. if (item && void 0 !== item.index) {
  845. if (this._hasPagingValues(options, oppositeArea, item.index)) {
  846. options[skipField]++;
  847. options[takeField]--
  848. } else {
  849. break
  850. }
  851. }
  852. } while (item && void 0 !== item.index && options[takeField]);
  853. if (options[takeField]) {
  854. var start = Math.floor(options[skipField] / pageSize) * pageSize;
  855. var end = Math.ceil((options[skipField] + options[takeField]) / pageSize) * pageSize;
  856. options[skipField] = start;
  857. options[takeField] = end - start
  858. }
  859. }
  860. },
  861. _processPagingCache: function(storeLoadOptions) {
  862. var pageSize = this._pageSize;
  863. if (pageSize < 0) {
  864. return
  865. }
  866. for (var i = 0; i < storeLoadOptions.length; i++) {
  867. this._processPagingCacheByArea(storeLoadOptions[i], pageSize, "row");
  868. this._processPagingCacheByArea(storeLoadOptions[i], pageSize, "column")
  869. }
  870. },
  871. _loadCore: function(options, deferred) {
  872. var that = this;
  873. var store = this._store;
  874. var descriptions = this._descriptions;
  875. var reload = options.reload || this.paginate() && that._isFieldsModified;
  876. var paginate = this.paginate();
  877. var headerName = DESCRIPTION_NAME_BY_AREA[options.area];
  878. options = options || {};
  879. if (store) {
  880. (0, _extend.extend)(options, descriptions);
  881. options.columnExpandedPaths = options.columnExpandedPaths || getExpandedPaths(this._data, options, "columns", that._lastLoadOptions);
  882. options.rowExpandedPaths = options.rowExpandedPaths || getExpandedPaths(this._data, options, "rows", that._lastLoadOptions);
  883. if (paginate) {
  884. options.pageSize = this._pageSize
  885. }
  886. if (headerName) {
  887. options.headerName = headerName
  888. }
  889. that.beginLoading();
  890. deferred.always(function() {
  891. that.endLoading()
  892. });
  893. var storeLoadOptions = [options];
  894. that.fireEvent("customizeStoreLoadOptions", [storeLoadOptions, reload]);
  895. if (!reload) {
  896. that._processPagingCache(storeLoadOptions)
  897. }
  898. storeLoadOptions = storeLoadOptions.filter(function(options) {
  899. return !(options.rows.length && 0 === options.rowTake) && !(options.columns.length && 0 === options.columnTake)
  900. });
  901. if (!storeLoadOptions.length) {
  902. that._update(deferred);
  903. return
  904. }
  905. var results = storeLoadOptions.map(function(options) {
  906. return store.load(options)
  907. });
  908. _deferred.when.apply(null, results).done(function() {
  909. var results = arguments;
  910. for (var i = 0; i < results.length; i++) {
  911. var _options = storeLoadOptions[i];
  912. var data = results[i];
  913. var isLast = i === results.length - 1;
  914. if (_options.path) {
  915. that.applyPartialDataSource(_options.area, _options.path, data, isLast ? deferred : false, _options.oppositePath)
  916. } else {
  917. if (paginate && !reload && isDataExists(that._data)) {
  918. that.mergePartialDataSource(data, isLast ? deferred : false)
  919. } else {
  920. (0, _extend.extend)(that._data, data);
  921. that._lastLoadOptions = _options;
  922. that._update(isLast ? deferred : false)
  923. }
  924. }
  925. }
  926. }).fail(deferred.reject)
  927. } else {
  928. that._update(deferred)
  929. }
  930. },
  931. _sort: function(descriptions, data, getAscOrder) {
  932. var store = this._store;
  933. if (store && !this._paginate) {
  934. sort(descriptions, data, getAscOrder)
  935. }
  936. },
  937. paginate: function() {
  938. return this._paginate && this._store && this._store.supportPaging()
  939. },
  940. isEmpty: function() {
  941. var dataFields = this.getAreaFields("data");
  942. var data = this.getData();
  943. return !dataFields.length || !data.values.length
  944. },
  945. _update: function(deferred) {
  946. var that = this;
  947. var descriptions = that._descriptions;
  948. var loadedData = that._data;
  949. var dataFields = descriptions.values;
  950. var expressionsUsed = areExpressionsUsed(dataFields);
  951. (0, _deferred.when)(formatHeaders(descriptions, loadedData), updateCache(loadedData.rows), updateCache(loadedData.columns)).done(function() {
  952. if (expressionsUsed) {
  953. that._sort(descriptions, loadedData, expressionsUsed);
  954. !that.isEmpty() && (0, _uiPivot_grid.applyDisplaySummaryMode)(descriptions, loadedData)
  955. }
  956. that._sort(descriptions, loadedData);
  957. !that.isEmpty() && isRunningTotalUsed(dataFields) && (0, _uiPivot_grid.applyRunningTotal)(descriptions, loadedData);
  958. that._data = loadedData;
  959. false !== deferred && (0, _deferred.when)(deferred).done(function() {
  960. that._isFieldsModified = false;
  961. that.fireEvent("changed");
  962. if ((0, _type.isDefined)(that._data.grandTotalRowIndex)) {
  963. loadedData.grandTotalRowIndex = that._data.grandTotalRowIndex
  964. }
  965. if ((0, _type.isDefined)(that._data.grandTotalColumnIndex)) {
  966. loadedData.grandTotalColumnIndex = that._data.grandTotalColumnIndex
  967. }
  968. });
  969. deferred && deferred.resolve(that._data)
  970. });
  971. return deferred
  972. },
  973. store: function() {
  974. return this._store
  975. },
  976. collapseHeaderItem: function(area, path) {
  977. var that = this;
  978. var headerItems = "column" === area ? that._data.columns : that._data.rows;
  979. var headerItem = findHeaderItem(headerItems, path);
  980. var field = that.getAreaFields(area)[path.length - 1];
  981. if (headerItem && headerItem.children) {
  982. that.fireEvent("expandValueChanging", [{
  983. area: area,
  984. path: path,
  985. expanded: false
  986. }]);
  987. if (field) {
  988. field.expanded = false
  989. }
  990. headerItem.collapsedChildren = headerItem.children;
  991. delete headerItem.children;
  992. that._update();
  993. if (that.paginate()) {
  994. that.load()
  995. }
  996. return true
  997. }
  998. return false
  999. },
  1000. collapseAll: function(id) {
  1001. var _this = this;
  1002. var dataChanged = false;
  1003. var field = this.field(id) || {};
  1004. var areaOffsets = [(0, _array.inArray)(field, this.getAreaFields(field.area))];
  1005. field.expanded = false;
  1006. if (field && field.levels) {
  1007. areaOffsets = [];
  1008. field.levels.forEach(function(f) {
  1009. areaOffsets.push((0, _array.inArray)(f, _this.getAreaFields(field.area)));
  1010. f.expanded = false
  1011. })
  1012. }(0, _uiPivot_grid2.foreachTree)(this._data[field.area + "s"], function(items) {
  1013. var item = items[0];
  1014. var path = (0, _uiPivot_grid2.createPath)(items);
  1015. if (item && item.children && areaOffsets.indexOf(path.length - 1) !== -1) {
  1016. item.collapsedChildren = item.children;
  1017. delete item.children;
  1018. dataChanged = true
  1019. }
  1020. }, true);
  1021. dataChanged && this._update()
  1022. },
  1023. expandAll: function(id) {
  1024. var field = this.field(id);
  1025. if (field && field.area) {
  1026. field.expanded = true;
  1027. if (field && field.levels) {
  1028. field.levels.forEach(function(f) {
  1029. f.expanded = true
  1030. })
  1031. }
  1032. this.load()
  1033. }
  1034. },
  1035. expandHeaderItem: function(area, path) {
  1036. var that = this;
  1037. var headerItems = "column" === area ? that._data.columns : that._data.rows;
  1038. var headerItem = findHeaderItem(headerItems, path);
  1039. if (headerItem && !headerItem.children) {
  1040. var hasCache = !!headerItem.collapsedChildren;
  1041. var options = {
  1042. area: area,
  1043. path: path,
  1044. expanded: true,
  1045. needExpandData: !hasCache
  1046. };
  1047. that.fireEvent("expandValueChanging", [options]);
  1048. if (hasCache) {
  1049. headerItem.children = headerItem.collapsedChildren;
  1050. delete headerItem.collapsedChildren;
  1051. that._update()
  1052. } else {
  1053. if (this.store()) {
  1054. that.load(options)
  1055. }
  1056. }
  1057. return hasCache
  1058. }
  1059. return false
  1060. },
  1061. mergePartialDataSource: function(dataSource, deferred) {
  1062. var that = this;
  1063. var loadedData = that._data;
  1064. if (dataSource && dataSource.values) {
  1065. dataSource.rows = dataSource.rows || [];
  1066. dataSource.columns = dataSource.columns || [];
  1067. var newRowItemIndexesToCurrent = updateHeaderItems(loadedData.rows, dataSource.rows, loadedData.grandTotalColumnIndex);
  1068. var newColumnItemIndexesToCurrent = updateHeaderItems(loadedData.columns, dataSource.columns, loadedData.grandTotalColumnIndex);
  1069. (0, _deferred.when)(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent).done(function(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
  1070. if (newRowItemIndexesToCurrent.length || newColumnItemIndexesToCurrent.length) {
  1071. updateDataSourceCells(loadedData, dataSource.values, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent);
  1072. }
  1073. that._update(deferred)
  1074. })
  1075. }
  1076. },
  1077. applyPartialDataSource: function(area, path, dataSource, deferred, oppositePath) {
  1078. var that = this;
  1079. var loadedData = that._data;
  1080. var headerItems = "column" === area ? loadedData.columns : loadedData.rows;
  1081. var oppositeHeaderItems = "column" === area ? loadedData.rows : loadedData.columns;
  1082. var newRowItemIndexesToCurrent;
  1083. var newColumnItemIndexesToCurrent;
  1084. if (dataSource && dataSource.values) {
  1085. dataSource.rows = dataSource.rows || [];
  1086. dataSource.columns = dataSource.columns || [];
  1087. var headerItem = findHeaderItem(headerItems, path);
  1088. var oppositeHeaderItem = oppositePath && findHeaderItem(oppositeHeaderItems, oppositePath);
  1089. if (headerItem) {
  1090. if ("column" === area) {
  1091. newColumnItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.columns, loadedData.grandTotalColumnIndex);
  1092. if (oppositeHeaderItem) {
  1093. newRowItemIndexesToCurrent = updateHeaderItemChildren(oppositeHeaderItems, oppositeHeaderItem, dataSource.rows, loadedData.grandTotalRowIndex)
  1094. } else {
  1095. newRowItemIndexesToCurrent = updateHeaderItems(loadedData.rows, dataSource.rows, loadedData.grandTotalRowIndex)
  1096. }
  1097. } else {
  1098. newRowItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.rows, loadedData.grandTotalRowIndex);
  1099. if (oppositeHeaderItem) {
  1100. newColumnItemIndexesToCurrent = updateHeaderItemChildren(oppositeHeaderItems, oppositeHeaderItem, dataSource.columns, loadedData.grandTotalColumnIndex)
  1101. } else {
  1102. newColumnItemIndexesToCurrent = updateHeaderItems(loadedData.columns, dataSource.columns, loadedData.grandTotalColumnIndex)
  1103. }
  1104. }(0, _deferred.when)(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent).done(function(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
  1105. if ("row" === area && newRowItemIndexesToCurrent.length || "column" === area && newColumnItemIndexesToCurrent.length) {
  1106. updateDataSourceCells(loadedData, dataSource.values, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent)
  1107. }
  1108. that._update(deferred)
  1109. })
  1110. }
  1111. }
  1112. },
  1113. dispose: function() {
  1114. var that = this;
  1115. var delayedLoadTask = that._delayedLoadTask;
  1116. this._disposeEvents();
  1117. if (delayedLoadTask) {
  1118. delayedLoadTask.abort()
  1119. }
  1120. this._isDisposed = true
  1121. },
  1122. isDisposed: function() {
  1123. return !!this._isDisposed
  1124. }
  1125. }
  1126. }()).include(_events_mixin2.default);
  1127. module.exports.default = module.exports;