UNPKG

devexpress-reporting

Version:

DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.

229 lines (228 loc) 11.4 kB
/** * DevExpress HTML/JS Reporting (designer\wizard\pages\selectDataMembersPage.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 { DxDeferred, extend, FieldListProvider, isList } from '@devexpress/analytics-core/analytics-internal'; import { getLocalization, PathRequest } from '@devexpress/analytics-core/analytics-utils'; import { WizardPageBase } from '@devexpress/analytics-core/analytics-wizard'; import { DataMemberTreeNode, FieldTreeNode, TreeNodeItemsProvider } from '@devexpress/analytics-core/analytics-wizard-internal'; import * as ko from 'knockout'; import { includeNonListItem } from '../../internal/_dataUtils'; import { AvailableFieldsTreeListController, DataMemberCustomCheckedTreeNode, MasterDetailQueryInfo, MasterDetailTreeListController } from '../internal/_masterDetailWizardUtils'; import { ReportWizardPageId } from '../pageId'; import { ReportType } from '../reportWizardState'; import { _restoreDataSourceFromState } from './chooseAvailableDataSourcePage'; import { createDeferred } from '@devexpress/analytics-core/analytics-internal-native'; export class SelectDataMembersPage extends WizardPageBase { _wrapFieldListCallback(itemsCallback) { return (pathRequest) => { if (this._hideDataMemberSubItems) { return new DxDeferred().resolve([]).promise(); } else { return itemsCallback(new PathRequest(this._showDataSource ? pathRequest.fullPath : this.dataSourcePath + '.' + pathRequest.fullPath), this._dataSource); } }; } get dataSourcePath() { return (this._dataSource.id || this._dataSource.ref); } getDataMemberSelectedPath(state) { if (state.masterDetailInfoCollection.length > 0) return null; return state.dataMember; } _beginInternal(state) { if (state.reportType === ReportType.Vertical) { this._multiSelectMode = false; this._showFirstLevelDataMembers(true); } this._dataSource = _restoreDataSourceFromState(state.newDataSource || state.dataSource); const dataMember = this.getDataMemberSelectedPath(state); this.initialFullDataMember = state.dataMember; if (state.masterDetailInfoCollection.length === 0) { return this._fieldListCallBack(new PathRequest(this.dataSourcePath), this._dataSource) .done((fields) => { this._fieldSelectedPath(null); this._checkedDataMembers([]); this._showDataSource = false; if (includeNonListItem(fields)) { this._dataMemberSelectedPath([this.dataSourcePath, dataMember].join('.')); this._showDataSource = true; this._rootItems([{ name: this.dataSourcePath, displayName: this._dataSource.name, specifics: 'List' }]); } else { this._dataMemberSelectedPath(dataMember); this._rootItems(fields.map((value) => { return { name: value.name, displayName: value.displayName || value.name, specifics: 'List' }; })); } }); } else { return createDeferred().resolve().promise(); } } _processFields(node) { if (!node.unChecked()) { if (this._checkedFields.indexOf(node) === -1) { this._checkedFields.push(node); } } else this._checkedFields.remove(node); this._onChange(); } _processNode(node) { if (isList(node)) { node.children().forEach((item) => { if (isList(item)) { this._processNode(item); } else { this._processFields(item); } }); } else { this._processFields(node); } } canNext() { return this._fieldMemberItemsProvider.hasCheckedItems(); } canFinish() { return true; } constructor(_fieldListCallBack, _hideDataMemberSubItems = false) { super(); this._fieldListCallBack = _fieldListCallBack; this._hideDataMemberSubItems = _hideDataMemberSubItems; this._rootItems = ko.observableArray([]); this._dataMemberSelectedPath = ko.observable(null); this._fieldSelectedPath = ko.observable(null); this._checkedDataMembers = ko.observableArray([]); this._checkedFields = ko.observableArray([]); this._showDataSource = false; this._afterCheckToggled = (node) => { if (!isList(node)) return; if (!node.unChecked()) { if (this._checkedDataMembers.indexOf(node) === -1) { if (!this._multiSelectMode) { this._checkedDataMembers()[0] && this._checkedDataMembers()[0].setChecked(false); this._checkedDataMembers([node]); } else { this._checkedDataMembers.push(node); } this._fieldSelectedPath(node.path); } } else this._checkedDataMembers.remove(node); this._onChange(); }; this._afterCheckToggledFields = (node) => { this._processNode(node); this._onChange(); }; this._createMasterDetailTreeNode = (item, isChecked, pathParts) => { const node = new DataMemberTreeNode(item.name, item.displayName, item.specifics, isChecked, pathParts, this._afterCheckToggledFields); this._disposables.push(node); return node; }; this._createMasterDetailFirstTabTreeNode = (item, isChecked, pathParts) => { const checked = isChecked || (this._showDataSource ? [this.dataSourcePath, this.initialFullDataMember].join('.') : this.initialFullDataMember) === pathParts.join('.'); const node = new DataMemberCustomCheckedTreeNode(item.name, item.displayName, item.specifics, checked, pathParts, this._afterCheckToggled); this._disposables.push(node); return node; }; this._createMasterDetailLeafTreeNode = (item, isChecked, pathParts) => { const node = new FieldTreeNode(item.name, item.displayName, item.specifics, isChecked, pathParts, this._afterCheckToggledFields); this._disposables.push(node); return node; }; this._showFirstLevelDataMembers = ko.observable(false); this._multiSelectMode = true; this._selectDataMembersCaption = getLocalization('Select data members', 'ASPxReportsStringId.ReportDesigner_MasterDetailWizard_ChooseDataMembers_SelectDataMembers'); this._selectDataFieldsCaption = getLocalization('Select data fields', 'ASPxReportsStringId.ReportDesigner_MasterDetailWizard_ChooseDataMembers_SelectDataFields'); const fieldListProvider = new FieldListProvider(this._wrapFieldListCallback(this._fieldListCallBack), ko.observableArray([])); this._disposables.push(this._dataMemberItemsProvider = new TreeNodeItemsProvider(fieldListProvider, this._rootItems, this._createMasterDetailFirstTabTreeNode, this._createMasterDetailLeafTreeNode)); this._disposables.push(this._fieldMemberItemsProvider = new TreeNodeItemsProvider(fieldListProvider, this._rootItems, this._createMasterDetailTreeNode, this._createMasterDetailLeafTreeNode)); this._availableFieldsController = new AvailableFieldsTreeListController(this._checkedDataMembers); this._disposables.push(ko.computed(() => { const item = this._availableFieldsController.selectedItem; item && item.collapsed && item.toggleCollapsed(); })); this._dataMemberFieldListModel = { itemsProvider: this._dataMemberItemsProvider, selectedPath: this._dataMemberSelectedPath, treeListController: new MasterDetailTreeListController(this._showFirstLevelDataMembers), templateName: 'dxrd-treelist-with-checkbox' }; this._fieldMemberFieldListModel = { itemsProvider: this._fieldMemberItemsProvider, selectedPath: this._fieldSelectedPath, treeListController: this._availableFieldsController, templateName: 'dxrd-treelist-with-checkbox' }; } selectDataMember(dataMemberPath) { this._dataMemberItemsProvider.selectItemByPath(dataMemberPath).always(() => this._onChange()); } selectAllDataMembers() { this._dataMemberItemsProvider.selectAllItems(false).always(() => this._onChange()); } selectDataField(dataFieldPath) { const pathParts = dataFieldPath.split('.'); pathParts.pop(); this._dataMemberItemsProvider.selectItemByPath(pathParts.join('.')).always(() => this._fieldMemberItemsProvider.selectItemByPath(dataFieldPath).always(() => this._onChange())); } selectDataFields(dataMemberPath) { this._dataMemberItemsProvider.selectItemByPath(dataMemberPath).always(() => { this._fieldMemberItemsProvider.selectItemsByPath(dataMemberPath).always(() => this._onChange()); }); } selectAllDataFields() { this._dataMemberItemsProvider.selectAllItems(false).always(() => this._fieldMemberItemsProvider.selectAllItems().always(() => this._onChange())); } initialize(state) { return this._beginInternal(state); } _haveCheckedFields() { return this._checkedFields().length !== 0; } commit() { return createDeferred().resolve({ masterDetailInfoCollection: (this._fieldMemberItemsProvider.getRootItems().filter(item => item.isList && !item.isComplex).map(item => { if (this._showDataSource) item = extend({}, item, { name: '' }); return new MasterDetailQueryInfo(item); })) }).promise(); } } export function _registerSelectDataMembersPage(factory, reportWizardOptions, pageId = ReportWizardPageId.SelectDataMembersPage) { factory.registerMetadata(pageId, { create: () => { return new SelectDataMembersPage(reportWizardOptions.callbacks.fieldListsCallback, reportWizardOptions.hideDataMemberSubItems); }, description: getLocalization('Select data members to assign to the report and its detail reports and fields to display in these reports.', 'ASPxReportsStringId.ReportDesigner_MasterDetailWizard_ChooseDataMembers_Description'), template: 'dxrd-page-masterdetail-select-reportdata', getState: (state) => state, setState: (data, state) => state.masterDetailInfoCollection = data.masterDetailInfoCollection, resetState: (state, defaultState) => state.masterDetailInfoCollection = defaultState.masterDetailInfoCollection }); }