devexpress-reporting
Version:
DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.
178 lines (177 loc) • 8.38 kB
JavaScript
/**
* DevExpress HTML/JS Reporting (designer\wizard\pages\fullscreen\configureCrossTabPage.js)
* Version: 26.1.3
* Build date: Jun 16, 2026
* Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
* License: https://www.devexpress.com/Support/EULAs/universal.xml
*/
import { DragDropHandler, DragHelperContent, FieldListProvider, findFirstItemMatchesCondition, getFullPath, HoverInfo } from '@devexpress/analytics-core/analytics-internal';
import { getLocalization } from '@devexpress/analytics-core/analytics-utils';
import { WizardPageBase } from '@devexpress/analytics-core/analytics-wizard';
import { FieldTreeNode, SingleCheckedDataMemberTreeNode, TreeNodeItemsProvider } from '@devexpress/analytics-core/analytics-wizard-internal';
import * as ko from 'knockout';
import { CrossTabWizardDragDropHandler, CrossTabWizardFieldListController } from '../../internal/_crossTabDragUtils';
import { FieldInfo } from '../../internal/_utils';
import { SelectDataMembersPage } from '../selectDataMembersPage';
import { createDeferred } from '@devexpress/analytics-core/analytics-internal-native';
export class SelectCrossTabDataMember extends SelectDataMembersPage {
_findFirstCheckedField(dataMembers) {
let result = null;
for (let i = 0; i < dataMembers.length; i++) {
const element = dataMembers[i];
if (element.checked()) {
result = element;
break;
}
if (element.children && element.children().length) {
result = this._findFirstCheckedField(element.children().filter(x => x.isList));
if (result)
break;
}
}
return result;
}
constructor(_fieldListCallBack, _hideDataMemberSubItems = false) {
super(_fieldListCallBack, _hideDataMemberSubItems);
this._pageRendered = false;
this._createCrossTabLeafTreeNode = (item, isChecked, pathParts) => {
const field = new FieldTreeNode(item.name, item.displayName, item.specifics, isChecked, pathParts);
this._disposables.push(field);
clearTimeout(this._timeout);
this._timeout = setTimeout(() => {
if (!this._pageRendered && this._firstRenderNode.initialized()) {
this._afteCheck(this._firstRenderNode);
this._pageRendered = true;
}
}, 1);
field.disabled(!field.checked());
this._disposables.push(field.checked.subscribe(val => {
field.disabled(!val);
}));
return field;
};
this._createCrossTabTreeNode = (item, isChecked, pathParts) => {
const node = new SingleCheckedDataMemberTreeNode(item.name, item.displayName, item.specifics, isChecked, pathParts, this._afteCheck);
this._disposables.push(node);
if (!this._firstRenderNode) {
this._firstRenderNode = node;
}
return node;
};
this._afteCheck = (node) => {
const rootItems = this._signleFieldMemberFieldListModel.itemsProvider.getRootItems();
rootItems.forEach(item => {
item.setChecked(false);
});
node._checked(true);
node.children().forEach(item => {
item.setChecked(item.isList ? false : true);
});
this._onChange();
};
this._title = getLocalization('Available fields', 'ASPxReportsStringId.ReportDesigner_Wizard_AvailableFields');
this._icon = 'dxrd-svg-wizard-crosstab-fields';
const fieldListProvider = new FieldListProvider(this._wrapFieldListCallback(_fieldListCallBack), ko.observableArray([]));
this._disposables.push(this._itemsProvider = new TreeNodeItemsProvider(fieldListProvider, this._rootItems, this._createCrossTabTreeNode, this._createCrossTabLeafTreeNode));
this._disposables.push(this._controller = new CrossTabWizardFieldListController());
this._dragHelperContent = new DragHelperContent(null);
this._disposables.push(this._controller.dragDropHandler = new CrossTabWizardDragDropHandler({
dragHelperContent: this._dragHelperContent,
parent: '.dx-designer-viewport .dx-fullscreen-wizard',
containment: '.dxrd-report-wizard',
target: '.dxrd-wizard-page',
addHandler: (dropTarget, name) => {
if (dropTarget && dropTarget instanceof ConfigureCrossTabPage)
dropTarget.addInfo(name);
}
}));
this._signleFieldMemberFieldListModel = {
itemsProvider: this._itemsProvider,
selectedPath: ko.observable(null),
treeListController: this._controller,
templateName: 'dxrd-treelist-with-checkbox'
};
}
commit() {
const dataMember = this._findFirstCheckedField(this._itemsProvider.getRootItems());
const result = {};
if (dataMember) {
result.crossTabFields = dataMember.children().filter(x => !x.isList) || [];
if (dataMember.path !== this.dataSourcePath) {
result.dataMemberPath = getFullPath(this.dataSourcePath, dataMember.path);
result.dataMemberInfo = dataMember;
}
}
return createDeferred().resolve(result).promise();
}
}
export class ConfigureCrossTabPage extends WizardPageBase {
constructor(stateName, itemInfo, title, localizationId) {
super();
this.stateName = stateName;
this.itemInfo = itemInfo;
this.changeAlways = true;
this.underCursor = ko.observable(new HoverInfo());
this._crossTabFields = ko.observableArray([]);
this._template = 'dxrd-page-crosstab-setlayout';
this.fieldInfos = ko.observableArray([]);
this._title = getLocalization(title, localizationId);
this._icon = 'dxrd-svg-wizard-crosstab-' + title.toLowerCase();
this._fieldName = getLocalization('Field Name', 'ASPxReportsStringId.ReportDesigner_Wizard_PageCrossTab_FieldName_Caption');
this._valueName = getLocalization(itemInfo.displayName, itemInfo.localizationId);
this._disposables.push(this.isDroppable = ko.computed(() => {
if (DragDropHandler.started())
return this.underCursor().isOver;
else
return false;
}));
}
_removeInfo(item) {
this.fieldInfos.splice(this.fieldInfos.indexOf(item), 1);
this.addInfo();
}
addInfo(fieldName) {
let newField = findFirstItemMatchesCondition(this.fieldInfos(), (item) => item.field() === null);
if (!newField) {
newField = new FieldInfo(this.itemInfo.valuesArray);
this.fieldInfos.push(newField);
this._disposables.push(newField.field.subscribe(newValue => {
if (!newField.functionValue())
this.setFieldDefaultValue(this.itemInfo.defaultVal, newField);
this.addInfo();
this._onChange();
}));
}
if (fieldName) {
const field = findFirstItemMatchesCondition(this._crossTabFields(), (item) => item.name === fieldName);
newField.field(field);
}
}
setFieldDefaultValue(defaultVal, fieldInfo) {
fieldInfo.functionValue(findFirstItemMatchesCondition(fieldInfo.value.dataSource, (item) => item.value === defaultVal));
}
initialize(state, stateChanged = false) {
if (stateChanged) {
state[this.stateName] = [];
this.fieldInfos([]);
}
this._crossTabFields(state.crossTabFields);
this.addInfo();
return createDeferred().resolve().promise();
}
canFinish() {
return true;
}
}
export function _registerConfigureCrossTabPage(factory, pageId, title, localizationId, info) {
const stateName = 'crossTab' + title + 'FieldInfo';
factory.registerMetadata(pageId, {
setState: (data, state) => { },
getState: (state) => state,
resetState: (state, defaultState) => { },
create: () => {
return new ConfigureCrossTabPage(stateName, info, title, localizationId);
},
template: 'dxrd-page-crosstab-setlayout',
});
}