devexpress-reporting
Version:
DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.
143 lines (142 loc) • 8.27 kB
JavaScript
/**
* DevExpress HTML/JS Reporting (designer\tools\generator\reportDesignerContext.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 { FieldListProvider } from '@devexpress/analytics-core/analytics-internal';
import { Disposable } from '@devexpress/analytics-core/analytics-utils';
import * as ko from 'knockout';
import { ChartFieldListExtender } from '../../controls/utils/_chartFieldListExtender';
import { ReportSurface, ReportViewModel } from '../../controls/xrReport';
import { DataSourceHelper } from '../../helpers/_dataSourceHelper';
import { DesignControlsHelper } from '../../helpers/_designControlsHelper';
import { StylesHelper } from '../../helpers/_styleHelper';
import { DesignerErrorProvider } from '../../internal/errorPanel/_designerErrorProvider';
import { RuntimeErrorProvider } from '../../internal/errorPanel/_runtimeErrorProvider';
import { CalculatedFieldsSource } from '../../internal/fieldlist/_calculatedFieldsSource';
import { DataSourceItemsExtender } from '../../internal/fieldlist/_dataSourceItemsExtender';
import { FieldListDataSourcesHelper } from '../../internal/fieldlist/_fieldListDataSourcesHelper';
import { ParametersViewModel } from '../../internal/fieldlist/_parametersViewModel';
import { ReportItemsProvider } from '../../internal/reportExplorer/_reportItemsProvider';
import { DisplayNameProvider } from '../../internal/_displayNameProvider';
import { WatermarksViewModel } from '../../internal/fieldlist/_watermarksViewModel';
export class ReportDesignerContext extends Disposable {
_getChartAvailableSources(dsHelper, dataSource, parameters) {
return [
dataSource && dsHelper.findDataSourceInfo(dataSource),
{ ref: 'Parameters', name: 'Parameters', specifics: 'parameters', data: parameters },
{ ref: 'none', name: 'none', specifics: 'none', data: null }
].filter(x => x);
}
getInfo() {
return [{ propertyName: 'report', modelName: '@Report' }];
}
isModelReady() {
return this.report && this.report.isModelReady();
}
dispose() {
super.dispose();
this.report = null;
this.url = null;
this.surface = null;
this.watermarks = null;
this.parameters = null;
this.dataSourceHelper = null;
this.fieldListDataSourceHelper = null;
this.calcFieldsSource = null;
this.fieldListItemsExtenders = [];
this.controlsHelper = null;
this.fieldListProvider = null;
this.reportItemsProvider = null;
this.dataBindingsProvider = null;
this.chartValueBindingProvider = null;
this.displayNameProvider = null;
this.expressionDisplayNameProvider = null;
this.stylesHelper = null;
this.dataBindingsProvider = null;
}
constructor(options) {
super();
this.report = options.report || new ReportViewModel(options.data);
this.url = ko.isObservable(options.url) ? options.url : ko.observable(options.url);
if (options.dataSourceRefs)
this.report.dataSourceRefs = options.dataSourceRefs;
const knownEnums = !!options.knownEnums?.length ? options.knownEnums : options.report.knownEnums;
const selection = options.selection;
const data = options.initializeOptions;
const designerCallbacks = options.designerCallbacks;
const parameterEditingSettings = data.parameterEditingSettings;
this.report.parameterHelper.initialize(knownEnums, options.designerCallbacks, parameterEditingSettings);
this.surface = new ReportSurface(this.report);
this.watermarks = new WatermarksViewModel(this.report.watermarks);
this.parameters = new ParametersViewModel(this.report);
this.dataSourceHelper = new DataSourceHelper(this.report.objectStorage, this.report.dataSourceRefs, data.availableDataSources);
this.report.dataSourceHelper(this.dataSourceHelper);
this.fieldListDataSourceHelper = new FieldListDataSourcesHelper();
this.fieldListDataSourceHelper.updateDataSources(this.dataSourceHelper, this.report, this.parameters.parameters);
this.calcFieldsSource = new CalculatedFieldsSource(this.report.calculatedFields, this.report.dataSource, this.dataSourceHelper);
const chartValueBindingAvailableSources = ko.observableArray(this._getChartAvailableSources(this.dataSourceHelper, this.report.dataSource(), this.parameters));
const subscription = this.report.dataSource.subscribe((newVal) => {
chartValueBindingAvailableSources(this._getChartAvailableSources(this.dataSourceHelper, newVal, this.parameters));
});
this._disposables.push({
dispose: () => {
chartValueBindingAvailableSources([]);
subscription.dispose();
}
});
const dataSourceItemsExtender = new DataSourceItemsExtender(this.dataSourceHelper.usedDataSources, (nameCandidate, dataSourceInfo) => {
const component = this.report.components().filter(x => x.data === dataSourceInfo.data)[0];
component.name(nameCandidate);
});
const chartFieldListExtender = new ChartFieldListExtender();
this.state = () => {
const extensions = this.report && this.report.extensions.peek() || [];
if (extensions.length > 0) {
return {
reportExtensions: this.report.extensions().map((item) => {
return {
'Key': item.key(),
'Value': item.value()
};
})
};
}
return data.state;
};
this.fieldListItemsExtenders = [
this.parameters,
dataSourceItemsExtender,
this.calcFieldsSource,
chartFieldListExtender
];
this.controlsHelper = new DesignControlsHelper(this.report, selection);
this.stylesHelper = new StylesHelper(this.report, this.controlsHelper);
this.report.stylesHelper(this.stylesHelper);
const wrappedCallback = this.fieldListDataSourceHelper.wrapFieldsCallback(designerCallbacks.fieldLists, this.state);
this.fieldListProvider = new FieldListProvider(wrappedCallback, this.fieldListDataSourceHelper.fieldListDataSources, this.fieldListItemsExtenders);
this.reportItemsProvider = new ReportItemsProvider(this.controlsHelper, this.fieldListProvider);
this.dataBindingsProvider = new FieldListProvider(wrappedCallback, this.fieldListDataSourceHelper.fieldListDataSources, [this.parameters, this.calcFieldsSource, chartFieldListExtender]);
this.report.dataBindingsProvider(this.dataBindingsProvider);
this.chartValueBindingProvider = new FieldListProvider(wrappedCallback, chartValueBindingAvailableSources, [this.parameters, this.calcFieldsSource]);
this.displayNameProvider = new DisplayNameProvider(this.fieldListProvider, this.fieldListDataSourceHelper.dataSourceHelper(), this.report.dataSource);
this.expressionDisplayNameProvider = new DisplayNameProvider(this.reportItemsProvider, this.fieldListDataSourceHelper.dataSourceHelper(), this.report.dataSource);
this.reportErrorProvider = new DesignerErrorProvider(this.report);
this.runtimeErrorProvider = new RuntimeErrorProvider();
this._disposables.push(this.report);
this._disposables.push(this.surface);
this._disposables.push(this.displayNameProvider);
this._disposables.push(this.expressionDisplayNameProvider);
this._disposables.push(this.dataSourceHelper);
this._disposables.push(this.fieldListDataSourceHelper);
this._disposables.push(this.calcFieldsSource);
this._disposables.push(this.watermarks);
this._disposables.push(this.parameters);
this._disposables.push(this.controlsHelper);
this._disposables.push(this.reportItemsProvider);
this._disposables.push(this.stylesHelper);
this._disposables.push(this.reportErrorProvider);
}
}