devexpress-reporting
Version:
DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.
139 lines (138 loc) • 7.44 kB
JavaScript
/**
* DevExpress HTML/JS Reporting (designer\wizard\pages\chooseSummaryOptionsPage.js)
* Version: 24.2.6
* Build date: Mar 18, 2025
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* License: https://www.devexpress.com/Support/EULAs/universal.xml
*/
import { createDeferred, extend } from '@devexpress/analytics-core/analytics-internal-native';
import { getLocalization } from '@devexpress/analytics-core/analytics-utils';
import { WizardPageBase } from '@devexpress/analytics-core/analytics-wizard';
import * as ko from 'knockout';
import { getSummaryFunctionValues } from '../../controls/metadata/properties/metadata';
import { SummaryInfo } from '../internal/_masterDetailWizardUtils';
import { ReportWizardPageId } from '../pageId';
import { _fillTreeQueries } from './addGroupingLevelPage';
export class ChooseSummaryOptionsPage extends WizardPageBase {
_createSummaryInfo() {
const newItem = new SummaryInfo(getSummaryFunctionValues());
this._disposables.push(newItem.field.subscribe(newValue => {
this._createNewItemIfNeed();
}));
return newItem;
}
_createNewItemIfNeed() {
const _summaryInfos = this._summaryInfos.peek();
if (_summaryInfos.filter(item => !item.field()).length === 0 && _summaryInfos.length < this._availableFields.peek().length)
this._summaryInfos.push(this._createSummaryInfo());
const fieldNames = this._summaryInfos.peek().filter(item => !!item.field()).map(item => item.field().name);
this._displayedFields[this._currentPath()] && this._displayedFields[this._currentPath()]().forEach(item => item.visible(fieldNames.indexOf(item.name) === -1));
this._onChange();
}
_changeQuery(path) {
this._currentPath(path);
this._summaryInfoMapByDataMember[this._currentDataMember] = this._summaryInfos();
this._currentDataMember = path;
this._availableFields(this._masterDetailColumns[path] || []);
this._summaryInfos(this._summaryInfoMapByDataMember[path] || []);
this._createNewItemIfNeed();
}
constructor() {
super();
this._allColumns = {};
this._masterDetailColumns = {};
this._toggleIgnoreNullValues = () => {
this.ignoreNullValues(!this.ignoreNullValues());
this._onChange();
};
this._summaryOptions = ko.observableArray([]);
this.ignoreNullValues = ko.observable(false);
this._template = 'dxrd-page-masterdetail-summary';
this._reportTree = ko.observableArray([]);
this._currentPath = ko.observable('');
this._availableFields = ko.observableArray([]);
this._summaryInfos = ko.observableArray([]);
this._selectFieldToSummaryCaption = getLocalization('Select fields and assign summary functions to them', 'ASPxReportsStringId.ReportDesigner_MasterDetailWizard_SummaryOptions_SelectFieldsAndSummaries');
this._fieldsCaption = getLocalization('Fields', 'DevExpress.XtraReports.UI.XRPivotGrid.Fields');
this._summaryFunctionCaption = getLocalization('Summary Functions', 'ASPxReportsStringId.ReportDesigner_MasterDetailWizard_SummaryOptions_SummaryFunctions');
this._ignoreNullValuesCaption = getLocalization('Ignore null values', 'ASPxReportsStringId.ReportDesigner_Wizard_SummaryOptions_IgnoreNullValues');
this._disposables.push(this._currentPath.subscribe(newPath => {
this._changeQuery(newPath);
}));
}
_removeSummaryInfo(info) {
const index = this._summaryInfos.indexOf(info);
if (index === -1)
return;
this._summaryInfos.splice(index, 1);
this._createNewItemIfNeed();
this._onChange();
}
canFinish() {
return true;
}
initialize(state) {
this._masterDetailColumns = extend(true, {}, state.masterDetailSummaryOptionsColumns);
this.ignoreNullValues(state.ignoreNullValuesForSummary);
this._reportTree(_fillTreeQueries([], state.masterDetailInfoCollection, 0));
this._currentDataMember = this._reportTree()[0].path;
const allColumnsTest = {};
this._reportTree().forEach(query => {
allColumnsTest[query.path] = state.masterDetailSummaryOptionsColumns[query.path] && state.masterDetailSummaryOptionsColumns[query.path].map(field => field.name);
});
let changes = [];
Object.keys(allColumnsTest).forEach((key) => {
changes = changes.concat(ko.utils.compareArrays(this._allColumns[key], allColumnsTest[key]));
});
const isColumnsChanged = changes.some((change, index, array) => { return change.status != 'retained'; });
if (isColumnsChanged) {
this._allColumns = allColumnsTest;
this._summaryInfos([]);
this._summaryInfoMapByDataMember = {};
this._displayedFields = {};
Object.keys(this._masterDetailColumns || {}).forEach((key) => {
this._displayedFields[key] = ko.observableArray([]);
this._displayedFields[key](this._masterDetailColumns[key].map(item => {
return { name: item.name, displayName: item.displayName, visible: ko.observable(true) };
}));
});
}
else {
this._summaryInfos(this._summaryInfoMapByDataMember[this._currentDataMember]);
}
this._changeQuery(this._currentDataMember);
return createDeferred().resolve().promise();
}
commit() {
this._summaryInfoMapByDataMember[this._currentDataMember] = this._summaryInfos();
const masterDetailSummaryOptionsColumns = this._masterDetailColumns;
const masterDetailSummariesInfo = {};
Object.keys(this._summaryInfoMapByDataMember || {}).forEach((key) => {
masterDetailSummariesInfo[key] = this._summaryInfoMapByDataMember[key].filter(item => !!item.field()).map(summaryOption => ({ column: summaryOption.field(), summaryFunctions: summaryOption.value.value().map(item => summaryOption.value.dataSource.map(option => option.value).indexOf(item)) }));
});
const ignoreNullValuesForSummary = this.ignoreNullValues();
return createDeferred().resolve({
masterDetailSummaryOptionsColumns: masterDetailSummaryOptionsColumns,
masterDetailSummariesInfo: masterDetailSummariesInfo,
ignoreNullValuesForSummary: ignoreNullValuesForSummary
}).promise();
}
}
export function _registerChooseSummaryOptionsPage(factory) {
factory.registerMetadata(ReportWizardPageId.ChooseSummaryOptionsPage, {
create: () => {
return new ChooseSummaryOptionsPage();
},
description: getLocalization('Choose summary functions to calculate in reports.', 'ReportBoxDesignerStringId.Wizard_MasterDetailChooseSummaryOptions_Description'),
template: 'dxrd-page-masterdetail-summary',
getState: (state) => state,
setState: (data, state) => {
state.masterDetailSummariesInfo = data.masterDetailSummariesInfo;
state.ignoreNullValuesForSummary = data.ignoreNullValuesForSummary;
},
resetState: (state, defaultState) => {
state.masterDetailSummariesInfo = defaultState.masterDetailSummariesInfo;
state.ignoreNullValuesForSummary = defaultState.ignoreNullValuesForSummary;
}
});
}