UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

1,029 lines (914 loc) • 46.9 kB
"use strict"; var $ = require("../../core/renderer"), noop = require("../../core/utils/common").noop, typeUtils = require("../../core/utils/type"), iteratorUtils = require("../../core/utils/iterator"), extend = require("../../core/utils/extend").extend, compileGetter = require("../../core/utils/data").compileGetter, errors = require("../widget/ui.errors"), gridCore = require("./ui.data_grid.core"), messageLocalization = require("../../localization/message"), dataSourceAdapter = require("./ui.data_grid.data_source_adapter"), columnsView = require("../grid_core/ui.grid_core.columns_view"), AggregateCalculator = require("./aggregate_calculator"), dataQuery = require("../../data/query"), storeHelper = require("../../data/store_helper"), dataUtils = require("../../data/utils"); var DATAGRID_TOTAL_FOOTER_CLASS = "dx-datagrid-total-footer", DATAGRID_SUMMARY_ITEM_CLASS = "dx-datagrid-summary-item", DATAGRID_TEXT_CONTENT_CLASS = "dx-datagrid-text-content", DATAGRID_GROUP_FOOTER_CLASS = "dx-datagrid-group-footer", DATAGRID_GROUP_TEXT_CONTENT_CLASS = "dx-datagrid-group-text-content", DATAGRID_NOWRAP_CLASS = "dx-datagrid-nowrap", DATAGRID_GROUP_FOOTER_ROW_TYPE = "groupFooter"; var renderSummaryCell = function renderSummaryCell(cell, options) { var i, $cell = $(cell), column = options.column, summaryItems = options.summaryItems, summaryItem, $summaryItems = []; if (!column.command && summaryItems) { for (i = 0; i < summaryItems.length; i++) { summaryItem = summaryItems[i]; $summaryItems.push($("<div>").css("textAlign", summaryItem.alignment || column.alignment).addClass(DATAGRID_SUMMARY_ITEM_CLASS).addClass(DATAGRID_TEXT_CONTENT_CLASS).addClass(summaryItem.cssClass).toggleClass(DATAGRID_GROUP_TEXT_CONTENT_CLASS, options.rowType === "group").text(gridCore.getSummaryText(summaryItem, options.summaryTexts))); } $cell.append($summaryItems); } }, getSummaryCellOptions = function getSummaryCellOptions(that, options) { var summaryTexts = that.option("summary.texts") || {}; return { totalItem: options.row, summaryItems: options.row.summaryCells[options.columnIndex], summaryTexts: summaryTexts }; }; var getGroupAggregates = function getGroupAggregates(data) { return data.summary || data.aggregates || []; }; exports.FooterView = columnsView.ColumnsView.inherit(function () { return { _getRows: function _getRows() { return this._dataController.footerItems(); }, _getCellOptions: function _getCellOptions(options) { return extend(this.callBase(options), getSummaryCellOptions(this, options)); }, _renderCellContent: function _renderCellContent($cell, options) { renderSummaryCell($cell, options); this.callBase($cell, options); }, _renderCore: function _renderCore() { var totalItem = this._dataController.footerItems()[0]; this.element().empty().addClass(DATAGRID_TOTAL_FOOTER_CLASS).toggleClass(DATAGRID_NOWRAP_CLASS, !this.option("wordWrapEnabled")); if (totalItem && totalItem.summaryCells && totalItem.summaryCells.length) { this._updateContent(this._renderTable()); } }, _rowClick: function _rowClick(e) { var item = this._dataController.footerItems()[e.rowIndex] || {}; this.executeAction("onRowClick", extend({}, e, item)); }, _columnOptionChanged: function _columnOptionChanged(e) { var optionNames = e.optionNames; if (e.changeTypes.grouping) return; if (optionNames.width || optionNames.visibleWidth) { this.callBase(e); } }, _handleDataChanged: function _handleDataChanged(e) { var changeType = e.changeType; if (changeType === "refresh" || changeType === "append" || changeType === "prepend") { this.render(); } }, getHeight: function getHeight() { return this.getElementHeight(); }, isVisible: function isVisible() { return !!this._dataController.footerItems().length; } }; }()); var SummaryDataSourceAdapterExtender = function () { function forEachGroup(groups, groupCount, callback, path) { path = path || []; for (var i = 0; i < groups.length; i++) { path.push(groups[i].key); if (groupCount === 1) { callback(path, groups[i].items); } else { forEachGroup(groups[i].items, groupCount - 1, callback, path); } path.pop(); } } return { init: function init() { this.callBase.apply(this, arguments); this._totalAggregates = []; this._summaryGetter = noop; }, summaryGetter: function summaryGetter(_summaryGetter) { if (!arguments.length) { return this._summaryGetter; } if (typeUtils.isFunction(_summaryGetter)) { this._summaryGetter = _summaryGetter; } }, summary: function summary(_summary) { if (!arguments.length) { return this._summaryGetter(); } this._summaryGetter = function () { return _summary; }; }, totalAggregates: function totalAggregates() { return this._totalAggregates; }, isLastLevelGroupItemsPagingLocal: function isLastLevelGroupItemsPagingLocal() { var summary = this.summary(), sortByGroupsInfo = summary && summary.sortByGroups(); return sortByGroupsInfo && sortByGroupsInfo.length; }, sortLastLevelGroupItems: function sortLastLevelGroupItems(items, groups, paths) { var groupedItems = storeHelper.multiLevelGroup(dataQuery(items), groups).toArray(), result = []; paths.forEach(function (path) { forEachGroup(groupedItems, groups.length, function (itemsPath, items) { if (path.toString() === itemsPath.toString()) { result = result.concat(items); } }); }); return result; } }; }(); var SummaryDataSourceAdapterClientExtender = function () { var calculateAggregates = function calculateAggregates(that, summary, data, groupLevel) { var calculator; if (summary) { calculator = new AggregateCalculator({ totalAggregates: summary.totalAggregates, groupAggregates: summary.groupAggregates, data: data, groupLevel: groupLevel }); calculator.calculate(); } return calculator ? calculator.totalAggregates() : []; }; var sortGroupsBySummaryCore = function sortGroupsBySummaryCore(items, groups, sortByGroups) { if (!items || !groups.length) return items; var group = groups[0], sorts = sortByGroups[0], query; if (group && sorts && sorts.length) { query = dataQuery(items); iteratorUtils.each(sorts, function (index) { if (index === 0) { query = query.sortBy(this.selector, this.desc); } else { query = query.thenBy(this.selector, this.desc); } }); query.enumerate().done(function (sortedItems) { items = sortedItems; }); } groups = groups.slice(1); sortByGroups = sortByGroups.slice(1); if (groups.length && sortByGroups.length) { iteratorUtils.each(items, function () { this.items = sortGroupsBySummaryCore(this.items, groups, sortByGroups); }); } return items; }; var sortGroupsBySummary = function sortGroupsBySummary(data, group, summary) { var sortByGroups = summary && summary.sortByGroups && summary.sortByGroups(); if (sortByGroups && sortByGroups.length) { return sortGroupsBySummaryCore(data, group, sortByGroups); } return data; }; return { _customizeRemoteOperations: function _customizeRemoteOperations(options) { var summary = this.summary(); if (summary) { if (options.remoteOperations.summary) { if (!options.isCustomLoading || options.storeLoadOptions.isLoadingAll) { if (options.storeLoadOptions.group) { if (options.remoteOperations.grouping) { options.storeLoadOptions.groupSummary = summary.groupAggregates; } else if (summary.groupAggregates.length) { options.remoteOperations.paging = false; } } options.storeLoadOptions.totalSummary = summary.totalAggregates; } } else if (summary.totalAggregates.length || summary.groupAggregates.length && options.storeLoadOptions.group) { options.remoteOperations.paging = false; } } this.callBase.apply(this, arguments); var cachedExtra = options.cachedPagesData.extra; if (cachedExtra && cachedExtra.summary && !options.isCustomLoading) { options.storeLoadOptions.totalSummary = undefined; } }, _handleDataLoadedCore: function _handleDataLoadedCore(options) { var that = this, groups = dataUtils.normalizeSortingInfo(options.storeLoadOptions.group || options.loadOptions.group || []), remoteOperations = options.remoteOperations || {}, summary = that.summaryGetter()(remoteOperations), totalAggregates; if (remoteOperations.summary) { if (!remoteOperations.paging && groups.length && summary) { if (!remoteOperations.grouping) { calculateAggregates(that, { groupAggregates: summary.groupAggregates }, options.data, groups.length); } options.data = sortGroupsBySummary(options.data, groups, summary); } } else if (!remoteOperations.paging) { totalAggregates = calculateAggregates(that, summary, options.data, groups.length); options.data = sortGroupsBySummary(options.data, groups, summary); options.extra = typeUtils.isPlainObject(options.extra) ? options.extra : {}; options.extra.summary = totalAggregates; } if (!options.isCustomLoading) { that._totalAggregates = options.extra && options.extra.summary || that._totalAggregates; } that.callBase(options); } }; }(); dataSourceAdapter.extend(SummaryDataSourceAdapterExtender); dataSourceAdapter.extend(SummaryDataSourceAdapterClientExtender); exports.renderSummaryCell = renderSummaryCell; gridCore.registerModule("summary", { defaultOptions: function defaultOptions() { return { /** * @name dxDataGridOptions.summary * @publicName summary * @type object */ summary: { /** * @name dxDataGridOptions.summary.groupItems * @publicName groupItems * @type Array<Object> * @default undefined */ groupItems: undefined, /** * @name dxDataGridOptions.summary.groupItems.name * @publicName name * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.column * @publicName column * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.summaryType * @publicName summaryType * @type Enums.SummaryType * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.valueFormat * @publicName valueFormat * @type format * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.precision * @publicName precision * @type number * @default undefined * @deprecated */ /** * @name dxDataGridOptions.summary.groupItems.displayFormat * @publicName displayFormat * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.customizeText * @publicName customizeText * @type function(itemInfo) * @type_function_param1 itemInfo:object * @type_function_param1_field1 value:string|number|date * @type_function_param1_field2 valueText:string * @type_function_return string */ /** * @name dxDataGridOptions.summary.groupItems.showInGroupFooter * @publicName showInGroupFooter * @type boolean * @default false */ /** * @name dxDataGridOptions.summary.groupItems.alignByColumn * @publicName alignByColumn * @type boolean * @default false */ /** * @name dxDataGridOptions.summary.groupItems.showInColumn * @publicName showInColumn * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.groupItems.skipEmptyValues * @publicName skipEmptyValues * @type boolean */ /** * @name dxDataGridOptions.summary.totalItems * @publicName totalItems * @type Array<Object> * @default undefined */ totalItems: undefined, /** * @name dxDataGridOptions.summary.totalItems.name * @publicName name * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.column * @publicName column * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.showInColumn * @publicName showInColumn * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.summaryType * @publicName summaryType * @type Enums.SummaryType * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.valueFormat * @publicName valueFormat * @type format * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.precision * @publicName precision * @type number * @default undefined * @deprecated */ /** * @name dxDataGridOptions.summary.totalItems.displayFormat * @publicName displayFormat * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.customizeText * @publicName customizeText * @type function(itemInfo) * @type_function_param1 itemInfo:object * @type_function_param1_field1 value:string|number|date * @type_function_param1_field2 valueText:string * @type_function_return string */ /** * @name dxDataGridOptions.summary.totalItems.alignment * @publicName alignment * @type Enums.HorizontalAlignment * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.cssClass * @publicName cssClass * @type string * @default undefined */ /** * @name dxDataGridOptions.summary.totalItems.skipEmptyValues * @publicName skipEmptyValues * @type boolean */ /** * @name dxDataGridOptions.summary.calculateCustomSummary * @publicName calculateCustomSummary * @type function(options) * @type_function_param1 options:object * @type_function_param1_field1 component:dxDataGrid * @type_function_param1_field2 name:string * @type_function_param1_field3 summaryProcess:string * @type_function_param1_field4 value:any * @type_function_param1_field5 totalValue:any */ calculateCustomSummary: undefined, /** * @name dxDataGridOptions.summary.skipEmptyValues * @publicName skipEmptyValues * @type boolean * @default true */ skipEmptyValues: true, /** * @name dxDataGridOptions.summary.texts * @publicName texts * @type object */ texts: { /** * @name dxDataGridOptions.summary.texts.sum * @publicName sum * @type string * @default "Sum={0}" */ sum: messageLocalization.getFormatter("dxDataGrid-summarySum"), /** * @name dxDataGridOptions.summary.texts.sumOtherColumn * @publicName sumOtherColumn * @type string * @default "Sum of {1} is {0}" */ sumOtherColumn: messageLocalization.getFormatter("dxDataGrid-summarySumOtherColumn"), /** * @name dxDataGridOptions.summary.texts.min * @publicName min * @type string * @default "Min={0}" */ min: messageLocalization.getFormatter("dxDataGrid-summaryMin"), /** * @name dxDataGridOptions.summary.texts.minOtherColumn * @publicName minOtherColumn * @type string * @default "Min of {1} is {0}" */ minOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryMinOtherColumn"), /** * @name dxDataGridOptions.summary.texts.max * @publicName max * @type string * @default "Max={0}" */ max: messageLocalization.getFormatter("dxDataGrid-summaryMax"), /** * @name dxDataGridOptions.summary.texts.maxOtherColumn * @publicName maxOtherColumn * @type string * @default "Max of {1} is {0}" */ maxOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryMaxOtherColumn"), /** * @name dxDataGridOptions.summary.texts.avg * @publicName avg * @type string * @default "Avg={0}" */ avg: messageLocalization.getFormatter("dxDataGrid-summaryAvg"), /** * @name dxDataGridOptions.summary.texts.avgOtherColumn * @publicName avgOtherColumn * @type string * @default "Avg of {1} is {0}" */ avgOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryAvgOtherColumn"), /** * @name dxDataGridOptions.summary.texts.count * @publicName count * @type string * @default "Count={0}" */ count: messageLocalization.getFormatter("dxDataGrid-summaryCount") } }, /** * @name dxDataGridOptions.sortByGroupSummaryInfo * @publicName sortByGroupSummaryInfo * @type Array<Object> * @default undefined */ sortByGroupSummaryInfo: undefined /** * @name dxDataGridOptions.sortByGroupSummaryInfo.summaryItem * @publicName summaryItem * @type string|number * @default undefined */ /** * @name dxDataGridOptions.sortByGroupSummaryInfo.groupColumn * @publicName groupColumn * @type string * @default undefined */ /** * @name dxDataGridOptions.sortByGroupSummaryInfo.sortOrder * @publicName sortOrder * @type Enums.SortOrder * @default undefined * @acceptValues undefined */ }; }, views: { footerView: exports.FooterView }, extenders: { controllers: { data: function () { return { _isDataColumn: function _isDataColumn(column) { return column && (!typeUtils.isDefined(column.groupIndex) || column.showWhenGrouped); }, _isGroupFooterVisible: function _isGroupFooterVisible() { var groupItems = this.option("summary.groupItems") || [], groupItem, column, i; for (i = 0; i < groupItems.length; i++) { groupItem = groupItems[i]; column = this._columnsController.columnOption(groupItem.showInColumn || groupItem.column); if (groupItem.showInGroupFooter && this._isDataColumn(column)) { return true; } } return false; }, _processGroupItems: function _processGroupItems(items, groupCount, options) { var data = options && options.data, result = this.callBase.apply(this, arguments); if (options) { if (options.isGroupFooterVisible === undefined) { options.isGroupFooterVisible = this._isGroupFooterVisible(); } if (data && data.items && options.isGroupFooterVisible && (options.collectContinuationItems || !data.isContinuationOnNextPage)) { result.push({ rowType: DATAGRID_GROUP_FOOTER_ROW_TYPE, data: data, groupIndex: options.path.length - 1, values: [] }); } } return result; }, _processGroupItem: function _processGroupItem(groupItem, options) { var that = this; if (!options.summaryGroupItems) { options.summaryGroupItems = that.option("summary.groupItems") || []; } if (groupItem.rowType === "group") { var groupColumnIndex = -1, afterGroupColumnIndex = -1; iteratorUtils.each(options.visibleColumns, function (visibleIndex) { var prevColumn = options.visibleColumns[visibleIndex - 1]; if (groupItem.groupIndex === this.groupIndex) { groupColumnIndex = this.index; } if (visibleIndex > 0 && prevColumn.command === "expand" && this.command !== "expand") { afterGroupColumnIndex = this.index; } }); groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, function (summaryItem, column) { if (summaryItem.showInGroupFooter) { return -1; } if (summaryItem.alignByColumn && column && !typeUtils.isDefined(column.groupIndex) && column.index !== afterGroupColumnIndex) { return column.index; } else { return groupColumnIndex; } }); } if (groupItem.rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE) { groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, function (summaryItem, column) { return summaryItem.showInGroupFooter && that._isDataColumn(column) ? column.index : -1; }); } return groupItem; }, _calculateSummaryCells: function _calculateSummaryCells(summaryItems, aggregates, visibleColumns, calculateTargetColumnIndex) { var that = this, summaryCells = [], summaryCellsByColumns = {}; iteratorUtils.each(summaryItems, function (summaryIndex, summaryItem) { var column = that._columnsController.columnOption(summaryItem.column), showInColumn = summaryItem.showInColumn && that._columnsController.columnOption(summaryItem.showInColumn) || column, columnIndex = calculateTargetColumnIndex(summaryItem, showInColumn), aggregate; if (columnIndex >= 0) { if (!summaryCellsByColumns[columnIndex]) { summaryCellsByColumns[columnIndex] = []; } aggregate = aggregates[summaryIndex]; if (aggregate === aggregate) { summaryCellsByColumns[columnIndex].push(extend({}, summaryItem, { value: typeUtils.isString(aggregate) && column && column.deserializeValue ? column.deserializeValue(aggregate) : aggregate, valueFormat: !typeUtils.isDefined(summaryItem.valueFormat) ? gridCore.getFormatByDataType(column && column.dataType) : summaryItem.valueFormat, columnCaption: column && column.index !== columnIndex ? column.caption : undefined })); } } }); if (!typeUtils.isEmptyObject(summaryCellsByColumns)) { iteratorUtils.each(visibleColumns, function () { summaryCells.push(summaryCellsByColumns[this.index] || []); }); } return summaryCells; }, _getSummaryCells: function _getSummaryCells(summaryTotalItems, totalAggregates) { var that = this, columnsController = that._columnsController; return that._calculateSummaryCells(summaryTotalItems, totalAggregates, columnsController.getVisibleColumns(), function (summaryItem, column) { return that._isDataColumn(column) ? column.index : -1; }); }, _updateItemsCore: function _updateItemsCore(change) { var that = this, summaryCells, totalAggregates, dataSource = that._dataSource, summaryTotalItems = that.option("summary.totalItems"); that._footerItems = []; if (dataSource && summaryTotalItems && summaryTotalItems.length) { totalAggregates = dataSource.totalAggregates(); summaryCells = that._getSummaryCells(summaryTotalItems, totalAggregates); if (summaryCells.length) { that._footerItems.push({ rowType: "totalFooter", summaryCells: summaryCells }); } } that.callBase(change); }, _getAggregates: function _getAggregates(summaryItems, remoteOperations) { var that = this, columnsController = that.getController("columns"), calculateCustomSummary = that.option("summary.calculateCustomSummary"), commonSkipEmptyValues = that.option("summary.skipEmptyValues"); return iteratorUtils.map(summaryItems || [], function (summaryItem) { var column = columnsController.columnOption(summaryItem.column), calculateCellValue = column && column.calculateCellValue ? column.calculateCellValue.bind(column) : compileGetter(column ? column.dataField : summaryItem.column), aggregator = summaryItem.summaryType || "count", selector = summaryItem.column, skipEmptyValues = typeUtils.isDefined(summaryItem.skipEmptyValues) ? summaryItem.skipEmptyValues : commonSkipEmptyValues, options; if (remoteOperations) { return { selector: summaryItem.column, summaryType: aggregator }; } else { if (aggregator === "avg" || aggregator === "sum") { selector = function selector(data) { var value = calculateCellValue(data); return typeUtils.isDefined(value) ? Number(value) : value; }; } else { selector = calculateCellValue; } if (aggregator === "custom") { if (!calculateCustomSummary) { errors.log("E1026"); calculateCustomSummary = function calculateCustomSummary() {}; } options = { component: that.component, name: summaryItem.name }; calculateCustomSummary(options); options.summaryProcess = "calculate"; aggregator = { seed: function seed() { options.summaryProcess = "start"; options.totalValue = undefined; delete options.value; calculateCustomSummary(options); return options.totalValue; }, step: function step(totalValue, value) { options.summaryProcess = "calculate"; options.totalValue = totalValue; options.value = value; calculateCustomSummary(options); return options.totalValue; }, finalize: function finalize(totalValue) { options.summaryProcess = "finalize"; options.totalValue = totalValue; delete options.value; calculateCustomSummary(options); return options.totalValue; } }; } return { selector: selector, aggregator: aggregator, skipEmptyValues: skipEmptyValues }; } }); }, _addSortInfo: function _addSortInfo(sortByGroups, groupColumn, selector, sortOrder) { var groupIndex; if (groupColumn) { groupIndex = groupColumn.groupIndex; sortOrder = sortOrder || groupColumn.sortOrder; if (typeUtils.isDefined(groupIndex)) { sortByGroups[groupIndex] = sortByGroups[groupIndex] || []; sortByGroups[groupIndex].push({ selector: selector, desc: sortOrder === "desc" }); } } }, _findSummaryItem: function _findSummaryItem(summaryItems, name) { var summaryItemIndex = -1; var getFullName = function getFullName(summaryItem) { var summaryType = summaryItem.summaryType, column = summaryItem.column; return summaryType && column && summaryType + "_" + column; }; if (typeUtils.isDefined(name)) { iteratorUtils.each(summaryItems || [], function (index) { if (this.name === name || index === name || this.summaryType === name || this.column === name || getFullName(this) === name) { summaryItemIndex = index; return false; } }); } return summaryItemIndex; }, _getSummarySortByGroups: function _getSummarySortByGroups(sortByGroupSummaryInfo, groupSummaryItems) { var that = this, columnsController = that._columnsController, groupColumns = columnsController.getGroupColumns(), sortByGroups = []; if (!groupSummaryItems || !groupSummaryItems.length) return; iteratorUtils.each(sortByGroupSummaryInfo || [], function () { var sortOrder = this.sortOrder, groupColumn = this.groupColumn, summaryItemIndex = that._findSummaryItem(groupSummaryItems, this.summaryItem); if (summaryItemIndex < 0) return; var selector = function selector(data) { return getGroupAggregates(data)[summaryItemIndex]; }; if (typeUtils.isDefined(groupColumn)) { groupColumn = columnsController.columnOption(groupColumn); that._addSortInfo(sortByGroups, groupColumn, selector, sortOrder); } else { iteratorUtils.each(groupColumns, function (groupIndex, groupColumn) { that._addSortInfo(sortByGroups, groupColumn, selector, sortOrder); }); } }); return sortByGroups; }, _createDataSourceAdapterCore: function _createDataSourceAdapterCore(dataSource, remoteOperations) { var that = this, dataSourceAdapter = this.callBase(dataSource, remoteOperations); dataSourceAdapter.summaryGetter(function (currentRemoteOperations) { return that._getSummaryOptions(currentRemoteOperations || remoteOperations); }); return dataSourceAdapter; }, _getSummaryOptions: function _getSummaryOptions(remoteOperations) { var that = this, groupSummaryItems = that.option("summary.groupItems"), totalSummaryItems = that.option("summary.totalItems"), sortByGroupSummaryInfo = that.option("sortByGroupSummaryInfo"), groupAggregates = that._getAggregates(groupSummaryItems, remoteOperations && remoteOperations.grouping && remoteOperations.summary), totalAggregates = that._getAggregates(totalSummaryItems, remoteOperations && remoteOperations.summary), sortByGroups = function sortByGroups() { return that._getSummarySortByGroups(sortByGroupSummaryInfo, groupSummaryItems); }; if (groupAggregates.length || totalAggregates.length) { return { groupAggregates: groupAggregates, totalAggregates: totalAggregates, sortByGroups: sortByGroups }; } }, publicMethods: function publicMethods() { var methods = this.callBase(); methods.push("getTotalSummaryValue"); return methods; }, /** * @name dxDataGridMethods.getTotalSummaryValue * @publicName getTotalSummaryValue(summaryItemName) * @param1 summaryItemName:String * @return any */ getTotalSummaryValue: function getTotalSummaryValue(summaryItemName) { var summaryItemIndex = this._findSummaryItem(this.option("summary.totalItems"), summaryItemName), aggregates = this._dataSource.totalAggregates(); if (aggregates.length && summaryItemIndex > -1) { return aggregates[summaryItemIndex]; } }, optionChanged: function optionChanged(args) { if (args.name === "summary" || args.name === "sortByGroupSummaryInfo") { args.name = "dataSource"; } this.callBase(args); }, init: function init() { this._footerItems = []; this.callBase(); }, footerItems: function footerItems() { return this._footerItems; } }; }() }, views: { rowsView: function () { return { _createRow: function _createRow(row) { var $row = this.callBase(row); row && $row.addClass(row.rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE ? DATAGRID_GROUP_FOOTER_CLASS : ""); return $row; }, _renderCells: function _renderCells($row, options) { this.callBase.apply(this, arguments); if (options.row.rowType === "group" && options.row.summaryCells && options.row.summaryCells.length) { this._renderGroupSummaryCells($row, options); } }, _hasAlignByColumnSummaryItems: function _hasAlignByColumnSummaryItems(columnIndex, options) { return !typeUtils.isDefined(options.columns[columnIndex].groupIndex) && options.row.summaryCells[columnIndex].length; }, _getAlignByColumnCellCount: function _getAlignByColumnCellCount(groupCellColSpan, options) { var alignByColumnCellCount = 0, columnIndex; for (var i = 1; i < groupCellColSpan; i++) { columnIndex = options.row.summaryCells.length - i; alignByColumnCellCount = this._hasAlignByColumnSummaryItems(columnIndex, options) ? i : alignByColumnCellCount; } return alignByColumnCellCount; }, _renderGroupSummaryCells: function _renderGroupSummaryCells($row, options) { var $groupCell = $row.children().last(), groupCellColSpan = Number($groupCell.attr("colSpan")) || 1, alignByColumnCellCount = this._getAlignByColumnCellCount(groupCellColSpan, options); this._renderGroupSummaryCellsCore($groupCell, options, groupCellColSpan, alignByColumnCellCount); }, _renderGroupSummaryCellsCore: function _renderGroupSummaryCellsCore($groupCell, options, groupCellColSpan, alignByColumnCellCount) { if (alignByColumnCellCount > 0) { $groupCell.attr("colSpan", groupCellColSpan - alignByColumnCellCount); for (var i = 0; i < alignByColumnCellCount; i++) { var columnIndex = options.columns.length - alignByColumnCellCount + i; this._renderCell($groupCell.parent(), extend({ column: options.columns[columnIndex], columnIndex: this._getSummaryCellIndex(columnIndex, options.columns) }, options)); } } }, _getSummaryCellIndex: function _getSummaryCellIndex(columnIndex) { return columnIndex; }, _getCellTemplate: function _getCellTemplate(options) { if (!options.column.command && !typeUtils.isDefined(options.column.groupIndex) && options.summaryItems && options.summaryItems.length) { return renderSummaryCell; } else { return this.callBase(options); } }, _getCellOptions: function _getCellOptions(options) { var that = this, parameters = that.callBase(options); if (options.row.summaryCells) { return extend(parameters, getSummaryCellOptions(that, options)); } else { return parameters; } } }; }() } } });