| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161 |
- /**
- * DevExtreme (ui/pivot_grid/data_source.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_source = require("../../data/data_source/data_source");
- var _abstract_store = require("../../data/abstract_store");
- var _abstract_store2 = _interopRequireDefault(_abstract_store);
- var _common = require("../../core/utils/common");
- var _type = require("../../core/utils/type");
- var _extend = require("../../core/utils/extend");
- var _array = require("../../core/utils/array");
- var _iterator = require("../../core/utils/iterator");
- var _deferred = require("../../core/utils/deferred");
- var _class = require("../../core/class");
- var _class2 = _interopRequireDefault(_class);
- var _events_mixin = require("../../core/events_mixin");
- var _events_mixin2 = _interopRequireDefault(_events_mixin);
- var _inflector = require("../../core/utils/inflector");
- var _local_store = require("./local_store");
- var _remote_store = require("./remote_store");
- var _remote_store2 = _interopRequireDefault(_remote_store);
- var _xmla_store = require("./xmla_store/xmla_store");
- var _uiPivot_grid = require("./ui.pivot_grid.summary_display_modes");
- var _uiPivot_grid2 = require("./ui.pivot_grid.utils");
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- "default": obj
- }
- }
- var DESCRIPTION_NAME_BY_AREA = {
- row: "rows",
- column: "columns",
- data: "values",
- filter: "filters"
- };
- var STATE_PROPERTIES = ["area", "areaIndex", "sortOrder", "filterType", "filterValues", "sortBy", "sortBySummaryField", "sortBySummaryPath", "expanded", "summaryType", "summaryDisplayMode"];
- var CALCULATED_PROPERTIES = ["format", "selector", "customizeText", "caption"];
- var ALL_CALCULATED_PROPERTIES = CALCULATED_PROPERTIES.concat(["allowSorting", "allowSortingBySummary", "allowFiltering", "allowExpandAll"]);
- function createCaption(field) {
- var caption = field.dataField || field.groupName || "";
- var summaryType = (field.summaryType || "").toLowerCase();
- if ((0, _type.isString)(field.groupInterval)) {
- caption += "_" + field.groupInterval
- }
- if (summaryType && "custom" !== summaryType) {
- summaryType = summaryType.replace(/^./, summaryType[0].toUpperCase());
- if (caption.length) {
- summaryType = " (" + summaryType + ")"
- }
- } else {
- summaryType = ""
- }
- return (0, _inflector.titleize)(caption) + summaryType
- }
- function resetFieldState(field, properties) {
- var initialProperties = field._initProperties || {};
- (0, _iterator.each)(properties, function(_, prop) {
- if (Object.prototype.hasOwnProperty.call(initialProperties, prop)) {
- field[prop] = initialProperties[prop]
- }
- })
- }
- function updateCalculatedFieldProperties(field, calculatedProperties) {
- resetFieldState(field, calculatedProperties);
- if (!(0, _type.isDefined)(field.caption)) {
- (0, _uiPivot_grid2.setFieldProperty)(field, "caption", createCaption(field))
- }
- }
- function areExpressionsUsed(dataFields) {
- return dataFields.some(function(field) {
- return field.summaryDisplayMode || field.calculateSummaryValue
- })
- }
- function isRunningTotalUsed(dataFields) {
- return dataFields.some(function(field) {
- return !!field.runningTotal
- })
- }
- function isDataExists(data) {
- return data.rows.length || data.columns.length || data.values.length
- }
- module.exports = _class2.default.inherit(function() {
- var findHeaderItem = function(headerItems, path) {
- if (headerItems._cacheByPath) {
- return headerItems._cacheByPath[path.join(".")] || null
- }
- };
- var getHeaderItemsLastIndex = function getHeaderItemsLastIndex(headerItems, grandTotalIndex) {
- var lastIndex = -1;
- if (headerItems) {
- for (var i = 0; i < headerItems.length; i++) {
- var headerItem = headerItems[i];
- if (void 0 !== headerItem.index) {
- lastIndex = Math.max(lastIndex, headerItem.index)
- }
- if (headerItem.children) {
- lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.children))
- } else {
- if (headerItem.collapsedChildren) {
- lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.collapsedChildren))
- }
- }
- }
- }
- if ((0, _type.isDefined)(grandTotalIndex)) {
- lastIndex = Math.max(lastIndex, grandTotalIndex)
- }
- return lastIndex
- };
- var updateHeaderItemChildren = function(headerItems, headerItem, children, grandTotalIndex) {
- var applyingHeaderItemsCount = getHeaderItemsLastIndex(children) + 1;
- var emptyIndex = getHeaderItemsLastIndex(headerItems, grandTotalIndex) + 1;
- var index;
- var applyingItemIndexesToCurrent = [];
- var needIndexUpdate = false;
- var d = new _deferred.Deferred;
- if (headerItem.children && headerItem.children.length === children.length) {
- for (var i = 0; i < children.length; i++) {
- var child = children[i];
- if (void 0 !== child.index) {
- if (void 0 === headerItem.children[i].index) {
- child.index = applyingItemIndexesToCurrent[child.index] = emptyIndex++;
- headerItem.children[i] = child
- } else {
- applyingItemIndexesToCurrent[child.index] = headerItem.children[i].index
- }
- }
- }
- } else {
- needIndexUpdate = true;
- for (index = 0; index < applyingHeaderItemsCount; index++) {
- applyingItemIndexesToCurrent[index] = emptyIndex++
- }
- headerItem.children = children
- }(0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItem.children, function(items) {
- if (needIndexUpdate) {
- items[0].index = applyingItemIndexesToCurrent[items[0].index]
- }
- })).done(function() {
- d.resolve(applyingItemIndexesToCurrent)
- });
- return d
- };
- var updateHeaderItems = function(headerItems, newHeaderItems, grandTotalIndex) {
- var d = new _deferred.Deferred;
- var emptyIndex = grandTotalIndex >= 0 && getHeaderItemsLastIndex(headerItems, grandTotalIndex) + 1;
- var applyingItemIndexesToCurrent = [];
- (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItems, function(items) {
- delete items[0].collapsedChildren
- })).done(function() {
- (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(newHeaderItems, function(newItems, index) {
- var newItem = newItems[0];
- if (newItem.index >= 0) {
- var headerItem = findHeaderItem(headerItems, (0, _uiPivot_grid2.createPath)(newItems));
- if (headerItem && headerItem.index >= 0) {
- applyingItemIndexesToCurrent[newItem.index] = headerItem.index
- } else {
- if (emptyIndex) {
- var path = (0, _uiPivot_grid2.createPath)(newItems.slice(1));
- headerItem = findHeaderItem(headerItems, path);
- var parentItems = path.length ? headerItem && headerItem.children : headerItems;
- if (parentItems) {
- parentItems[index] = newItem;
- newItem.index = applyingItemIndexesToCurrent[newItem.index] = emptyIndex++
- }
- }
- }
- }
- })).done(function() {
- d.resolve(applyingItemIndexesToCurrent)
- })
- });
- return d
- };
- var updateDataSourceCells = function(dataSource, newDataSourceCells, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
- var rowIndex;
- var columnIndex;
- var dataSourceCells = dataSource.values;
- if (newDataSourceCells) {
- for (var newRowIndex = 0; newRowIndex <= newDataSourceCells.length; newRowIndex++) {
- var newRowCells = newDataSourceCells[newRowIndex];
- rowIndex = newRowItemIndexesToCurrent[newRowIndex];
- if (!(0, _type.isDefined)(rowIndex)) {
- rowIndex = dataSource.grandTotalRowIndex
- }
- if (newRowCells && (0, _type.isDefined)(rowIndex)) {
- if (!dataSourceCells[rowIndex]) {
- dataSourceCells[rowIndex] = []
- }
- for (var newColumnIndex = 0; newColumnIndex <= newRowCells.length; newColumnIndex++) {
- var newCell = newRowCells[newColumnIndex];
- columnIndex = newColumnItemIndexesToCurrent[newColumnIndex];
- if (!(0, _type.isDefined)(columnIndex)) {
- columnIndex = dataSource.grandTotalColumnIndex
- }
- if ((0, _type.isDefined)(newCell) && (0, _type.isDefined)(columnIndex)) {
- dataSourceCells[rowIndex][columnIndex] = newCell
- }
- }
- }
- }
- }
- };
- function createLocalOrRemoteStore(dataSourceOptions, notifyProgress) {
- var StoreConstructor = dataSourceOptions.remoteOperations || dataSourceOptions.paginate ? _remote_store2.default : _local_store.LocalStore;
- return new StoreConstructor((0, _extend.extend)((0, _data_source.normalizeDataSourceOptions)(dataSourceOptions), {
- onChanged: null,
- onLoadingChanged: null,
- onProgressChanged: notifyProgress
- }))
- }
- function createStore(dataSourceOptions, notifyProgress) {
- var store;
- if ((0, _type.isPlainObject)(dataSourceOptions) && dataSourceOptions.load) {
- store = createLocalOrRemoteStore(dataSourceOptions, notifyProgress)
- } else {
- if (dataSourceOptions && !dataSourceOptions.store) {
- dataSourceOptions = {
- store: dataSourceOptions
- }
- }
- var storeOptions = dataSourceOptions.store;
- if ("xmla" === storeOptions.type) {
- store = new _xmla_store.XmlaStore(storeOptions)
- } else {
- if ((0, _type.isPlainObject)(storeOptions) && storeOptions.type || storeOptions instanceof _abstract_store2.default || Array.isArray(storeOptions)) {
- store = createLocalOrRemoteStore(dataSourceOptions, notifyProgress)
- } else {
- if (storeOptions instanceof _class2.default) {
- store = storeOptions
- }
- }
- }
- }
- return store
- }
- function equalFields(fields, prevFields, count) {
- for (var i = 0; i < count; i++) {
- if (!fields[i] || !prevFields[i] || fields[i].index !== prevFields[i].index) {
- return false
- }
- }
- return true
- }
- function getExpandedPaths(dataSource, loadOptions, dimensionName, prevLoadOptions) {
- var result = [];
- var fields = loadOptions && loadOptions[dimensionName] || [];
- var prevFields = prevLoadOptions && prevLoadOptions[dimensionName] || [];
- (0, _uiPivot_grid2.foreachTree)(dataSource[dimensionName], function(items) {
- var item = items[0];
- var path = (0, _uiPivot_grid2.createPath)(items);
- if (item.children && fields[path.length - 1] && !fields[path.length - 1].expanded) {
- if (path.length < fields.length && (!prevLoadOptions || equalFields(fields, prevFields, path.length))) {
- result.push(path.slice())
- }
- }
- }, true);
- return result
- }
- function setFieldProperties(field, srcField, skipInitPropertySave, properties) {
- if (srcField) {
- (0, _iterator.each)(properties, function(_, name) {
- if (skipInitPropertySave) {
- field[name] = srcField[name]
- } else {
- if (("summaryType" === name || "summaryDisplayMode" === name) && void 0 === srcField[name]) {
- return
- }(0, _uiPivot_grid2.setFieldProperty)(field, name, srcField[name])
- }
- })
- } else {
- resetFieldState(field, properties)
- }
- return field
- }
- function getFieldsState(fields, properties) {
- var result = [];
- (0, _iterator.each)(fields, function(_, field) {
- result.push(setFieldProperties({
- dataField: field.dataField,
- name: field.name
- }, field, true, properties))
- });
- return result
- }
- function getFieldStateId(field) {
- if (field.name) {
- return field.name
- }
- return field.dataField + ""
- }
- function getFieldsById(fields, id) {
- var result = [];
- (0, _iterator.each)(fields || [], function(_, field) {
- if (getFieldStateId(field) === id) {
- result.push(field)
- }
- });
- return result
- }
- function setFieldsStateCore(stateFields, fields) {
- stateFields = stateFields || [];
- (0, _iterator.each)(fields, function(index, field) {
- setFieldProperties(field, stateFields[index], false, STATE_PROPERTIES);
- updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES)
- });
- return fields
- }
- function setFieldsState(stateFields, fields) {
- stateFields = stateFields || [];
- var fieldsById = {};
- var id;
- (0, _iterator.each)(fields, function(_, field) {
- id = getFieldStateId(field);
- if (!fieldsById[id]) {
- fieldsById[id] = getFieldsById(fields, getFieldStateId(field))
- }
- });
- (0, _iterator.each)(fieldsById, function(id, fields) {
- setFieldsStateCore(getFieldsById(stateFields, id), fields)
- });
- return fields
- }
- function getFieldsByGroup(fields, groupingField) {
- return fields.filter(function(field) {
- return field.groupName === groupingField.groupName && (0, _type.isNumeric)(field.groupIndex) && false !== field.visible
- }).map(function(field) {
- return (0, _extend.extend)(field, {
- areaIndex: groupingField.areaIndex,
- area: groupingField.area,
- expanded: (0, _type.isDefined)(field.expanded) ? field.expanded : groupingField.expanded,
- dataField: field.dataField || groupingField.dataField,
- dataType: field.dataType || groupingField.dataType,
- sortBy: field.sortBy || groupingField.sortBy,
- sortOrder: field.sortOrder || groupingField.sortOrder,
- sortBySummaryField: field.sortBySummaryField || groupingField.sortBySummaryField,
- sortBySummaryPath: field.sortBySummaryPath || groupingField.sortBySummaryPath,
- visible: field.visible || groupingField.visible,
- showTotals: (0, _type.isDefined)(field.showTotals) ? field.showTotals : groupingField.showTotals,
- showGrandTotals: (0, _type.isDefined)(field.showGrandTotals) ? field.showGrandTotals : groupingField.showGrandTotals
- })
- }).sort(function(a, b) {
- return a.groupIndex - b.groupIndex
- })
- }
- function sortFieldsByAreaIndex(fields) {
- fields.sort(function(field1, field2) {
- return field1.areaIndex - field2.areaIndex || field1.groupIndex - field2.groupIndex
- })
- }
- function isAreaField(field, area) {
- var canAddFieldInArea = "data" === area || false !== field.visible;
- return field.area === area && !(0, _type.isDefined)(field.groupIndex) && canAddFieldInArea
- }
- function getFieldId(field, retrieveFieldsOptionValue) {
- var groupName = field.groupName || "";
- return (field.dataField || groupName) + (field.groupInterval ? groupName + field.groupInterval : "NOGROUP") + (retrieveFieldsOptionValue ? "" : groupName)
- }
- function mergeFields(fields, storeFields, retrieveFieldsOptionValue) {
- var result = [];
- var fieldsDictionary = {};
- var removedFields = {};
- var mergedGroups = [];
- var dataTypes = (0, _uiPivot_grid2.getFieldsDataType)(fields);
- if (storeFields) {
- (0, _iterator.each)(storeFields, function(_, field) {
- fieldsDictionary[getFieldId(field, retrieveFieldsOptionValue)] = field
- });
- (0, _iterator.each)(fields, function(_, field) {
- var fieldKey = getFieldId(field, retrieveFieldsOptionValue);
- var storeField = fieldsDictionary[fieldKey] || removedFields[fieldKey];
- var mergedField;
- if (storeField) {
- if (storeField._initProperties) {
- resetFieldState(storeField, ALL_CALCULATED_PROPERTIES)
- }
- mergedField = (0, _extend.extend)({}, storeField, field, {
- _initProperties: null
- })
- } else {
- fieldsDictionary[fieldKey] = mergedField = field
- }(0, _extend.extend)(mergedField, {
- dataType: dataTypes[field.dataField]
- });
- delete fieldsDictionary[fieldKey];
- removedFields[fieldKey] = storeField;
- result.push(mergedField)
- });
- if (retrieveFieldsOptionValue) {
- (0, _iterator.each)(fieldsDictionary, function(_, field) {
- result.push(field)
- })
- }
- } else {
- result = fields
- }
- result.push.apply(result, mergedGroups);
- return result
- }
- function getFields(that) {
- var result = new _deferred.Deferred;
- var store = that._store;
- var storeFields = store && store.getFields(that._fields);
- (0, _deferred.when)(storeFields).done(function(storeFields) {
- that._storeFields = storeFields;
- var mergedFields = mergeFields(that._fields, storeFields, that._retrieveFields);
- result.resolve(mergedFields)
- }).fail(result.reject);
- return result
- }
- function getSliceIndex(items, path) {
- var index = null;
- var pathValue = (path || []).join(".");
- if (pathValue.length) {
- (0, _uiPivot_grid2.foreachTree)(items, function(items) {
- var item = items[0];
- var itemPath = (0, _uiPivot_grid2.createPath)(items).join(".");
- var textPath = (0, _iterator.map)(items, function(item) {
- return item.text
- }).reverse().join(".");
- if (pathValue === itemPath || item.key && textPath === pathValue) {
- index = items[0].index;
- return false
- }
- })
- }
- return index
- }
- function getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName) {
- var values = dataSource.values;
- var sortBySummaryFieldIndex = (0, _uiPivot_grid2.findField)(loadOptions.values, field.sortBySummaryField);
- var areRows = "rows" === dimensionName;
- var sortByDimension = areRows ? dataSource.columns : dataSource.rows;
- var grandTotalIndex = areRows ? dataSource.grandTotalRowIndex : dataSource.grandTotalColumnIndex;
- var sortBySummaryPath = field.sortBySummaryPath || [];
- var sliceIndex = sortBySummaryPath.length ? getSliceIndex(sortByDimension, sortBySummaryPath) : grandTotalIndex;
- if (values && values.length && sortBySummaryFieldIndex >= 0 && (0, _type.isDefined)(sliceIndex)) {
- return function(field) {
- var rowIndex = areRows ? field.index : sliceIndex;
- var columnIndex = areRows ? sliceIndex : field.index;
- var value = ((values[rowIndex] || [
- []
- ])[columnIndex] || [])[sortBySummaryFieldIndex];
- return (0, _type.isDefined)(value) ? value : null
- }
- }
- }
- function getMemberForSortBy(sortBy, getAscOrder) {
- var member = "text";
- if ("none" === sortBy) {
- member = "index"
- } else {
- if (getAscOrder || "displayText" !== sortBy) {
- member = "value"
- }
- }
- return member
- }
- function getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder) {
- var sortOrder = getAscOrder ? "asc" : field.sortOrder;
- var sortBy = getMemberForSortBy(field.sortBy, getAscOrder);
- var defaultCompare = field.sortingMethod ? function(a, b) {
- return field.sortingMethod(a, b)
- } : (0, _uiPivot_grid2.getCompareFunction)(function(item) {
- return item[sortBy]
- });
- var summaryValueSelector = !getAscOrder && getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName);
- var summaryCompare = summaryValueSelector && (0, _uiPivot_grid2.getCompareFunction)(summaryValueSelector);
- var sortingMethod = function(a, b) {
- var result = summaryCompare && summaryCompare(a, b) || defaultCompare(a, b);
- return "desc" === sortOrder ? -result : result
- };
- return sortingMethod
- }
- function sortDimension(dataSource, loadOptions, dimensionName, getAscOrder) {
- var fields = loadOptions[dimensionName] || [];
- var baseIndex = loadOptions.headerName === dimensionName ? loadOptions.path.length : 0;
- var sortingMethodByLevel = [];
- (0, _uiPivot_grid2.foreachDataLevel)(dataSource[dimensionName], function(item, index) {
- var field = fields[index] || {};
- var sortingMethod = sortingMethodByLevel[index] = sortingMethodByLevel[index] || getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder);
- item.sort(sortingMethod)
- }, baseIndex)
- }
- function sort(loadOptions, dataSource, getAscOrder) {
- sortDimension(dataSource, loadOptions, "rows", getAscOrder);
- sortDimension(dataSource, loadOptions, "columns", getAscOrder)
- }
- function formatHeaderItems(data, loadOptions, headerName) {
- return (0, _uiPivot_grid2.foreachTreeAsync)(data[headerName], function(items) {
- var item = items[0];
- item.text = item.text || (0, _uiPivot_grid2.formatValue)(item.value, loadOptions[headerName][(0, _uiPivot_grid2.createPath)(items).length - 1])
- })
- }
- function formatHeaders(loadOptions, data) {
- return (0, _deferred.when)(formatHeaderItems(data, loadOptions, "columns"), formatHeaderItems(data, loadOptions, "rows"))
- }
- function updateCache(headerItems) {
- var d = new _deferred.Deferred;
- var cacheByPath = {};
- (0, _deferred.when)((0, _uiPivot_grid2.foreachTreeAsync)(headerItems, function(items) {
- var path = (0, _uiPivot_grid2.createPath)(items).join(".");
- cacheByPath[path] = items[0]
- })).done(d.resolve);
- headerItems._cacheByPath = cacheByPath;
- return d
- }
- function _getAreaFields(fields, area) {
- var areaFields = [];
- (0, _iterator.each)(fields, function() {
- if (isAreaField(this, area)) {
- areaFields.push(this)
- }
- });
- return areaFields
- }
- return {
- ctor: function(options) {
- options = options || {};
- var that = this;
- var store = createStore(options, function(progress) {
- that.fireEvent("progressChanged", [progress])
- });
- that._store = store;
- that._paginate = !!options.paginate;
- that._pageSize = options.pageSize || 40;
- that._data = {
- rows: [],
- columns: [],
- values: []
- };
- that._loadingCount = 0;
- that._isFieldsModified = false;
- (0, _iterator.each)(["changed", "loadError", "loadingChanged", "progressChanged", "fieldsPrepared", "expandValueChanging"], function(_, eventName) {
- var optionName = "on" + eventName[0].toUpperCase() + eventName.slice(1);
- if (Object.prototype.hasOwnProperty.call(options, optionName)) {
- this.on(eventName, options[optionName])
- }
- }.bind(this));
- that._retrieveFields = (0, _type.isDefined)(options.retrieveFields) ? options.retrieveFields : true;
- that._fields = options.fields || [];
- that._descriptions = options.descriptions ? (0, _extend.extend)(that._createDescriptions(), options.descriptions) : void 0;
- if (!store) {
- (0, _extend.extend)(true, that._data, options.store || options)
- }
- },
- getData: function() {
- return this._data
- },
- getAreaFields: function(area, collectGroups) {
- var areaFields = [];
- if (collectGroups || "data" === area) {
- areaFields = _getAreaFields(this._fields, area);
- sortFieldsByAreaIndex(areaFields)
- } else {
- var descriptions = this._descriptions || {};
- areaFields = descriptions[DESCRIPTION_NAME_BY_AREA[area]] || []
- }
- return areaFields
- },
- fields: function(_fields) {
- var that = this;
- if (_fields) {
- that._fields = mergeFields(_fields, that._storeFields, that._retrieveFields);
- that._fieldsPrepared(that._fields)
- }
- return that._fields
- },
- field: function field(id, options) {
- var that = this;
- var fields = that._fields;
- var field = fields && fields[(0, _type.isNumeric)(id) ? id : (0, _uiPivot_grid2.findField)(fields, id)];
- if (field && options) {
- (0, _iterator.each)(options, function(optionName, optionValue) {
- var isInitialization = (0, _array.inArray)(optionName, STATE_PROPERTIES) < 0;
- (0, _uiPivot_grid2.setFieldProperty)(field, optionName, optionValue, isInitialization);
- if ("sortOrder" === optionName) {
- var levels = field.levels || [];
- for (var i = 0; i < levels.length; i++) {
- levels[i][optionName] = optionValue
- }
- }
- });
- updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES);
- that._descriptions = that._createDescriptions(field);
- that._isFieldsModified = true;
- that.fireEvent("fieldChanged", [field])
- }
- return field
- },
- getFieldValues: function(index, applyFilters, options) {
- var that = this;
- var field = this._fields && this._fields[index];
- var store = this.store();
- var loadFields = [];
- var loadOptions = {
- columns: loadFields,
- rows: [],
- values: this.getAreaFields("data"),
- filters: applyFilters ? this._fields.filter(function(f) {
- return f !== field && f.area && f.filterValues && f.filterValues.length
- }) : [],
- skipValues: true
- };
- var searchValue;
- var d = new _deferred.Deferred;
- if (options) {
- searchValue = options.searchValue;
- loadOptions.columnSkip = options.skip;
- loadOptions.columnTake = options.take
- }
- if (field && store) {
- (0, _iterator.each)(field.levels || [field], function() {
- loadFields.push((0, _extend.extend)({}, this, {
- expanded: true,
- filterValues: null,
- sortOrder: "asc",
- sortBySummaryField: null,
- searchValue: searchValue
- }))
- });
- store.load(loadOptions).done(function(data) {
- if (loadOptions.columnSkip) {
- data.columns = data.columns.slice(loadOptions.columnSkip)
- }
- if (loadOptions.columnTake) {
- data.columns = data.columns.slice(0, loadOptions.columnTake)
- }
- formatHeaders(loadOptions, data);
- if (!loadOptions.columnTake) {
- that._sort(loadOptions, data)
- }
- d.resolve(data.columns)
- }).fail(d)
- } else {
- d.reject()
- }
- return d
- },
- reload: function() {
- return this.load({
- reload: true
- })
- },
- filter: function() {
- var store = this._store;
- return store.filter.apply(store, arguments)
- },
- load: function(options) {
- var that = this;
- var d = new _deferred.Deferred;
- options = options || {};
- that.beginLoading();
- d.fail(function(e) {
- that.fireEvent("loadError", [e])
- }).always(function() {
- that.endLoading()
- });
- function loadTask() {
- that._delayedLoadTask = void 0;
- if (!that._descriptions) {
- (0, _deferred.when)(getFields(that)).done(function(fields) {
- that._fieldsPrepared(fields);
- that._loadCore(options, d)
- }).fail(d.reject).fail(that._loadErrorHandler)
- } else {
- that._loadCore(options, d)
- }
- }
- if (that.store()) {
- that._delayedLoadTask = (0, _common.executeAsync)(loadTask)
- } else {
- loadTask()
- }
- return d
- },
- createDrillDownDataSource: function(params) {
- return this._store.createDrillDownDataSource(this._descriptions, params)
- },
- _createDescriptions: function(currentField) {
- var that = this;
- var fields = that.fields();
- var descriptions = {
- rows: [],
- columns: [],
- values: [],
- filters: []
- };
- (0, _iterator.each)(["row", "column", "data", "filter"], function(_, areaName) {
- (0, _array.normalizeIndexes)(_getAreaFields(fields, areaName), "areaIndex", currentField)
- });
- (0, _iterator.each)(fields || [], function(_, field) {
- var descriptionName = DESCRIPTION_NAME_BY_AREA[field.area];
- var dimension = descriptions[descriptionName];
- var groupName = field.groupName;
- if (groupName && !(0, _type.isNumeric)(field.groupIndex)) {
- field.levels = getFieldsByGroup(fields, field)
- }
- if (!dimension || groupName && (0, _type.isNumeric)(field.groupIndex) || false === field.visible && "data" !== field.area && "filter" !== field.area) {
- return
- }
- if (field.levels && dimension !== descriptions.filters && dimension !== descriptions.values) {
- dimension.push.apply(dimension, field.levels);
- if (field.filterValues && field.filterValues.length) {
- descriptions.filters.push(field)
- }
- } else {
- dimension.push(field)
- }
- });
- (0, _iterator.each)(descriptions, function(_, fields) {
- sortFieldsByAreaIndex(fields)
- });
- var indices = {};
- (0, _iterator.each)(descriptions.values, function(_, field) {
- var expression = field.calculateSummaryValue;
- if ((0, _type.isFunction)(expression)) {
- var summaryCell = (0, _uiPivot_grid.createMockSummaryCell)(descriptions, fields, indices);
- expression(summaryCell)
- }
- });
- return descriptions
- },
- _fieldsPrepared: function(fields) {
- var that = this;
- that._fields = fields;
- (0, _iterator.each)(fields, function(index, field) {
- field.index = index;
- updateCalculatedFieldProperties(field, ALL_CALCULATED_PROPERTIES)
- });
- var currentFieldState = getFieldsState(fields, ["caption"]);
- that.fireEvent("fieldsPrepared", [fields]);
- for (var i = 0; i < fields.length; i++) {
- if (fields[i].caption !== currentFieldState[i].caption) {
- (0, _uiPivot_grid2.setFieldProperty)(fields[i], "caption", fields[i].caption, true)
- }
- }
- that._descriptions = that._createDescriptions()
- },
- isLoading: function() {
- return this._loadingCount > 0
- },
- state: function(_state, skipLoading) {
- var that = this;
- if (arguments.length) {
- _state = (0, _extend.extend)({
- rowExpandedPaths: [],
- columnExpandedPaths: []
- }, _state);
- if (!that._descriptions) {
- that.beginLoading();
- (0, _deferred.when)(getFields(that)).done(function(fields) {
- that._fields = setFieldsState(_state.fields, fields);
- that._fieldsPrepared(fields);
- !skipLoading && that.load(_state)
- }).always(function() {
- that.endLoading()
- })
- } else {
- that._fields = setFieldsState(_state.fields, that._fields);
- that._descriptions = that._createDescriptions();
- !skipLoading && that.load(_state)
- }
- } else {
- return {
- fields: getFieldsState(that._fields, STATE_PROPERTIES),
- columnExpandedPaths: getExpandedPaths(that._data, that._descriptions, "columns"),
- rowExpandedPaths: getExpandedPaths(that._data, that._descriptions, "rows")
- }
- }
- },
- beginLoading: function() {
- this._changeLoadingCount(1)
- },
- endLoading: function() {
- this._changeLoadingCount(-1)
- },
- _changeLoadingCount: function(increment) {
- var oldLoading = this.isLoading();
- this._loadingCount += increment;
- var newLoading = this.isLoading();
- if (oldLoading ^ newLoading) {
- this.fireEvent("loadingChanged", [newLoading])
- }
- },
- _hasPagingValues: function(options, area, oppositeIndex) {
- var takeField = area + "Take";
- var skipField = area + "Skip";
- var values = this._data.values;
- var items = this._data[area + "s"];
- var oppositeArea = "row" === area ? "column" : "row";
- var indices = [];
- if (options.path && options.area === area) {
- var headerItem = findHeaderItem(items, options.path);
- items = headerItem && headerItem.children;
- if (!items) {
- return false
- }
- }
- if (options.oppositePath && options.area === oppositeArea) {
- var _headerItem = findHeaderItem(items, options.oppositePath);
- items = _headerItem && _headerItem.children;
- if (!items) {
- return false
- }
- }
- for (var i = options[skipField]; i < options[skipField] + options[takeField]; i++) {
- if (items[i]) {
- indices.push(items[i].index)
- }
- }
- return indices.every(function(index) {
- if (void 0 !== index) {
- if ("row" === area) {
- return (values[index] || [])[oppositeIndex]
- } else {
- return (values[oppositeIndex] || [])[index]
- }
- }
- })
- },
- _processPagingCacheByArea: function(options, pageSize, area) {
- var takeField = area + "Take";
- var skipField = area + "Skip";
- var items = this._data[area + "s"];
- var oppositeArea = "row" === area ? "column" : "row";
- var item;
- if (options[takeField]) {
- if (options.path && options.area === area) {
- var headerItem = findHeaderItem(items, options.path);
- items = headerItem && headerItem.children || []
- }
- if (options.oppositePath && options.area === oppositeArea) {
- var _headerItem2 = findHeaderItem(items, options.oppositePath);
- items = _headerItem2 && _headerItem2.children || []
- }
- do {
- item = items[options[skipField]];
- if (item && void 0 !== item.index) {
- if (this._hasPagingValues(options, oppositeArea, item.index)) {
- options[skipField]++;
- options[takeField]--
- } else {
- break
- }
- }
- } while (item && void 0 !== item.index && options[takeField]);
- if (options[takeField]) {
- var start = Math.floor(options[skipField] / pageSize) * pageSize;
- var end = Math.ceil((options[skipField] + options[takeField]) / pageSize) * pageSize;
- options[skipField] = start;
- options[takeField] = end - start
- }
- }
- },
- _processPagingCache: function(storeLoadOptions) {
- var pageSize = this._pageSize;
- if (pageSize < 0) {
- return
- }
- for (var i = 0; i < storeLoadOptions.length; i++) {
- this._processPagingCacheByArea(storeLoadOptions[i], pageSize, "row");
- this._processPagingCacheByArea(storeLoadOptions[i], pageSize, "column")
- }
- },
- _loadCore: function(options, deferred) {
- var that = this;
- var store = this._store;
- var descriptions = this._descriptions;
- var reload = options.reload || this.paginate() && that._isFieldsModified;
- var paginate = this.paginate();
- var headerName = DESCRIPTION_NAME_BY_AREA[options.area];
- options = options || {};
- if (store) {
- (0, _extend.extend)(options, descriptions);
- options.columnExpandedPaths = options.columnExpandedPaths || getExpandedPaths(this._data, options, "columns", that._lastLoadOptions);
- options.rowExpandedPaths = options.rowExpandedPaths || getExpandedPaths(this._data, options, "rows", that._lastLoadOptions);
- if (paginate) {
- options.pageSize = this._pageSize
- }
- if (headerName) {
- options.headerName = headerName
- }
- that.beginLoading();
- deferred.always(function() {
- that.endLoading()
- });
- var storeLoadOptions = [options];
- that.fireEvent("customizeStoreLoadOptions", [storeLoadOptions, reload]);
- if (!reload) {
- that._processPagingCache(storeLoadOptions)
- }
- storeLoadOptions = storeLoadOptions.filter(function(options) {
- return !(options.rows.length && 0 === options.rowTake) && !(options.columns.length && 0 === options.columnTake)
- });
- if (!storeLoadOptions.length) {
- that._update(deferred);
- return
- }
- var results = storeLoadOptions.map(function(options) {
- return store.load(options)
- });
- _deferred.when.apply(null, results).done(function() {
- var results = arguments;
- for (var i = 0; i < results.length; i++) {
- var _options = storeLoadOptions[i];
- var data = results[i];
- var isLast = i === results.length - 1;
- if (_options.path) {
- that.applyPartialDataSource(_options.area, _options.path, data, isLast ? deferred : false, _options.oppositePath)
- } else {
- if (paginate && !reload && isDataExists(that._data)) {
- that.mergePartialDataSource(data, isLast ? deferred : false)
- } else {
- (0, _extend.extend)(that._data, data);
- that._lastLoadOptions = _options;
- that._update(isLast ? deferred : false)
- }
- }
- }
- }).fail(deferred.reject)
- } else {
- that._update(deferred)
- }
- },
- _sort: function(descriptions, data, getAscOrder) {
- var store = this._store;
- if (store && !this._paginate) {
- sort(descriptions, data, getAscOrder)
- }
- },
- paginate: function() {
- return this._paginate && this._store && this._store.supportPaging()
- },
- isEmpty: function() {
- var dataFields = this.getAreaFields("data");
- var data = this.getData();
- return !dataFields.length || !data.values.length
- },
- _update: function(deferred) {
- var that = this;
- var descriptions = that._descriptions;
- var loadedData = that._data;
- var dataFields = descriptions.values;
- var expressionsUsed = areExpressionsUsed(dataFields);
- (0, _deferred.when)(formatHeaders(descriptions, loadedData), updateCache(loadedData.rows), updateCache(loadedData.columns)).done(function() {
- if (expressionsUsed) {
- that._sort(descriptions, loadedData, expressionsUsed);
- !that.isEmpty() && (0, _uiPivot_grid.applyDisplaySummaryMode)(descriptions, loadedData)
- }
- that._sort(descriptions, loadedData);
- !that.isEmpty() && isRunningTotalUsed(dataFields) && (0, _uiPivot_grid.applyRunningTotal)(descriptions, loadedData);
- that._data = loadedData;
- false !== deferred && (0, _deferred.when)(deferred).done(function() {
- that._isFieldsModified = false;
- that.fireEvent("changed");
- if ((0, _type.isDefined)(that._data.grandTotalRowIndex)) {
- loadedData.grandTotalRowIndex = that._data.grandTotalRowIndex
- }
- if ((0, _type.isDefined)(that._data.grandTotalColumnIndex)) {
- loadedData.grandTotalColumnIndex = that._data.grandTotalColumnIndex
- }
- });
- deferred && deferred.resolve(that._data)
- });
- return deferred
- },
- store: function() {
- return this._store
- },
- collapseHeaderItem: function(area, path) {
- var that = this;
- var headerItems = "column" === area ? that._data.columns : that._data.rows;
- var headerItem = findHeaderItem(headerItems, path);
- var field = that.getAreaFields(area)[path.length - 1];
- if (headerItem && headerItem.children) {
- that.fireEvent("expandValueChanging", [{
- area: area,
- path: path,
- expanded: false
- }]);
- if (field) {
- field.expanded = false
- }
- headerItem.collapsedChildren = headerItem.children;
- delete headerItem.children;
- that._update();
- if (that.paginate()) {
- that.load()
- }
- return true
- }
- return false
- },
- collapseAll: function(id) {
- var _this = this;
- var dataChanged = false;
- var field = this.field(id) || {};
- var areaOffsets = [(0, _array.inArray)(field, this.getAreaFields(field.area))];
- field.expanded = false;
- if (field && field.levels) {
- areaOffsets = [];
- field.levels.forEach(function(f) {
- areaOffsets.push((0, _array.inArray)(f, _this.getAreaFields(field.area)));
- f.expanded = false
- })
- }(0, _uiPivot_grid2.foreachTree)(this._data[field.area + "s"], function(items) {
- var item = items[0];
- var path = (0, _uiPivot_grid2.createPath)(items);
- if (item && item.children && areaOffsets.indexOf(path.length - 1) !== -1) {
- item.collapsedChildren = item.children;
- delete item.children;
- dataChanged = true
- }
- }, true);
- dataChanged && this._update()
- },
- expandAll: function(id) {
- var field = this.field(id);
- if (field && field.area) {
- field.expanded = true;
- if (field && field.levels) {
- field.levels.forEach(function(f) {
- f.expanded = true
- })
- }
- this.load()
- }
- },
- expandHeaderItem: function(area, path) {
- var that = this;
- var headerItems = "column" === area ? that._data.columns : that._data.rows;
- var headerItem = findHeaderItem(headerItems, path);
- if (headerItem && !headerItem.children) {
- var hasCache = !!headerItem.collapsedChildren;
- var options = {
- area: area,
- path: path,
- expanded: true,
- needExpandData: !hasCache
- };
- that.fireEvent("expandValueChanging", [options]);
- if (hasCache) {
- headerItem.children = headerItem.collapsedChildren;
- delete headerItem.collapsedChildren;
- that._update()
- } else {
- if (this.store()) {
- that.load(options)
- }
- }
- return hasCache
- }
- return false
- },
- mergePartialDataSource: function(dataSource, deferred) {
- var that = this;
- var loadedData = that._data;
- if (dataSource && dataSource.values) {
- dataSource.rows = dataSource.rows || [];
- dataSource.columns = dataSource.columns || [];
- var newRowItemIndexesToCurrent = updateHeaderItems(loadedData.rows, dataSource.rows, loadedData.grandTotalColumnIndex);
- var newColumnItemIndexesToCurrent = updateHeaderItems(loadedData.columns, dataSource.columns, loadedData.grandTotalColumnIndex);
- (0, _deferred.when)(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent).done(function(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
- if (newRowItemIndexesToCurrent.length || newColumnItemIndexesToCurrent.length) {
- updateDataSourceCells(loadedData, dataSource.values, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent);
- }
- that._update(deferred)
- })
- }
- },
- applyPartialDataSource: function(area, path, dataSource, deferred, oppositePath) {
- var that = this;
- var loadedData = that._data;
- var headerItems = "column" === area ? loadedData.columns : loadedData.rows;
- var oppositeHeaderItems = "column" === area ? loadedData.rows : loadedData.columns;
- var newRowItemIndexesToCurrent;
- var newColumnItemIndexesToCurrent;
- if (dataSource && dataSource.values) {
- dataSource.rows = dataSource.rows || [];
- dataSource.columns = dataSource.columns || [];
- var headerItem = findHeaderItem(headerItems, path);
- var oppositeHeaderItem = oppositePath && findHeaderItem(oppositeHeaderItems, oppositePath);
- if (headerItem) {
- if ("column" === area) {
- newColumnItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.columns, loadedData.grandTotalColumnIndex);
- if (oppositeHeaderItem) {
- newRowItemIndexesToCurrent = updateHeaderItemChildren(oppositeHeaderItems, oppositeHeaderItem, dataSource.rows, loadedData.grandTotalRowIndex)
- } else {
- newRowItemIndexesToCurrent = updateHeaderItems(loadedData.rows, dataSource.rows, loadedData.grandTotalRowIndex)
- }
- } else {
- newRowItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.rows, loadedData.grandTotalRowIndex);
- if (oppositeHeaderItem) {
- newColumnItemIndexesToCurrent = updateHeaderItemChildren(oppositeHeaderItems, oppositeHeaderItem, dataSource.columns, loadedData.grandTotalColumnIndex)
- } else {
- newColumnItemIndexesToCurrent = updateHeaderItems(loadedData.columns, dataSource.columns, loadedData.grandTotalColumnIndex)
- }
- }(0, _deferred.when)(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent).done(function(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) {
- if ("row" === area && newRowItemIndexesToCurrent.length || "column" === area && newColumnItemIndexesToCurrent.length) {
- updateDataSourceCells(loadedData, dataSource.values, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent)
- }
- that._update(deferred)
- })
- }
- }
- },
- dispose: function() {
- var that = this;
- var delayedLoadTask = that._delayedLoadTask;
- this._disposeEvents();
- if (delayedLoadTask) {
- delayedLoadTask.abort()
- }
- this._isDisposed = true
- },
- isDisposed: function() {
- return !!this._isDisposed
- }
- }
- }()).include(_events_mixin2.default);
- module.exports.default = module.exports;
|