UNPKG

devexpress-reporting

Version:

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

346 lines (345 loc) 18.3 kB
/** * DevExpress HTML/JS Reporting (designer\internal\_reportConverter.js) * Version: 20.2.13 * Build date: Apr 10, 2023 * Copyright (c) 2012 - 2023 Developer Express Inc. ALL RIGHTS RESERVED * License: https://www.devexpress.com/Support/EULAs/universal.xml */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _dataBindingMode_1 = require("./_dataBindingMode"); var _utils_1 = require("./_utils"); var _expressionWrapper_1 = require("../dataObjects/expressions/_expressionWrapper"); var analytics_utils_1 = require("@devexpress/analytics-core/analytics-utils"); var ko = require("knockout"); var $ = require("jquery"); var analytics_elements_1 = require("@devexpress/analytics-core/analytics-elements"); var analytics_internal_1 = require("@devexpress/analytics-core/analytics-internal"); var analytics_widgets_internal_1 = require("@devexpress/analytics-core/analytics-widgets-internal"); var analytics_criteria_1 = require("@devexpress/analytics-core/analytics-criteria"); var analytics_criteria_utils_1 = require("@devexpress/analytics-core/analytics-criteria-utils"); var ReportConverter = (function () { function ReportConverter(_controlsHelper, _undoEngine, _dataBindingMode) { if (_dataBindingMode === void 0) { _dataBindingMode = _dataBindingMode_1.DataBindingMode.Expressions; } var _this = this; this._controlsHelper = _controlsHelper; this._undoEngine = _undoEngine; this._dataBindingMode = _dataBindingMode; this.convertChoiceEnum = { 'Convert': 'Convert', 'Cancel': 'Cancel' }; this._formattingMapper = { '@BackColor': '@BackColor', '@Sides': '@Borders', '@BorderColor': '@BorderColor', '@BorderDashStyle': '@BorderDashStyle', '@BorderWidthSerializable': '@BorderWidth', '@ForeColor': '@ForeColor', '@Font': '@Font', '@Padding': '@Padding', '@TextAlignment': '@TextAlignment', '@Visible': '@Visible' }; this._expressionsToControlMap = {}; this._model = null; this._lastChoice = null; this._defaultFormatting = {}; this._notShowAgain = ko.observable(false); this._detailLink = 'https://devexpress.github.io/dotnet-eud/interface-elements-for-web/articles/report-designer/bind-to-data/data-binding-modes.html'; this.popupOptions = { visible: ko.observable(false), title: analytics_utils_1.getLocalization('Convert', 'ReportStringId.UD_Msg_ConvertBindingsCaption'), confirmMessage: analytics_internal_1.formatUnicorn(analytics_utils_1.getLocalization('The {0} contains bindings. Do you want to convert them to expressions?', 'ReportStringId.UD_Msg_ConvertBindings'), analytics_utils_1.getLocalization('Report', 'DevExpress.XtraReports.UI.XtraReport')), linkText: analytics_utils_1.getLocalization('Learn more about the expressions...', 'ReportStringId.UD_Msg_ConvertBindings_LinkText'), linkUrl: this._detailLink, container: function (element) { return analytics_internal_1.getParentContainer(element); }, buttons: [ { toolbar: 'bottom', location: 'after', widget: 'dxButton', options: { text: analytics_utils_1.getLocalization('Yes', 'AnalyticsCoreStringId.ParametersPanel_True'), onClick: function () { _this._applyChanges(); } } }, { toolbar: 'bottom', location: 'after', widget: 'dxButton', options: { text: analytics_utils_1.getLocalization('No', 'ASPxReportsStringId.ParametersPanel_No'), onClick: function () { _this._cancel(); } } }, { toolbar: 'bottom', location: 'before', widget: 'dxCheckBox', options: { value: this._notShowAgain, text: analytics_utils_1.getLocalization("Remember my choice and don't ask me again.", 'ReportStringId.UD_Msg_ConvertBindings_RememberMyChoice') } } ] }; this._mapFontObj(this._defaultFormatting, new analytics_widgets_internal_1.FontModel(ko.observable(''))); this._mapPaddingObj(this._defaultFormatting, analytics_elements_1.PaddingModel.from('0,0,0,0')); } ReportConverter.prototype._mapRulesProperties = function (formatting) { var _this = this; var newFormatting = {}; Object.keys(formatting).forEach(function (name) { if (_this._formattingMapper[name]) { newFormatting[_this._formattingMapper[name]] = formatting[name]; } }); return newFormatting; }; ReportConverter.prototype._hasBindings = function () { var allcontrols = this._controlsHelper.allControls(); return allcontrols.map(function (x) { return ko.unwrap(x['dataBindings']); }).filter(function (x) { return !!x; }).some(function (x) { return x.some(function (db) { return !!db.dataMember() || !!db.parameter(); }); }); }; ReportConverter.prototype._hasFormattingRules = function () { return this._model.formattingRuleSheet().length > 0; }; ReportConverter.prototype.convert = function (model, convertBindingsToExpressions) { if (convertBindingsToExpressions === void 0) { convertBindingsToExpressions = _utils_1.PromptBoolean.Prompt; } if (!model.dataBindingMode) { this._model = model; model._dataBindingMode(this._dataBindingMode); if (this._dataBindingMode !== _dataBindingMode_1.DataBindingMode.Bindings && this._controlsHelper) { var needConvert = this._hasBindings() || this._hasFormattingRules(); if (convertBindingsToExpressions === _utils_1.PromptBoolean.False) return this._cancel(needConvert ? _dataBindingMode_1.DataBindingMode.Bindings : this._dataBindingMode); var canConvert = needConvert ? this._canConvertReport() : true; if (!canConvert) return this._cancel(); if (convertBindingsToExpressions === _utils_1.PromptBoolean.True || this._notShowAgain()) { if (needConvert && this._lastChoice !== this.convertChoiceEnum.Cancel) this._applyChanges(); } else { if (!needConvert) { this._model = null; this._expressionsToControlMap = {}; } this.popupOptions.visible(needConvert); } } } }; ReportConverter.prototype._generateStyleName = function (ruleName) { return ruleName; }; ReportConverter.prototype._createBindingExpression = function (dataBinding, sumformat, condition) { if (dataBinding.propertyName() === 'Text' && sumformat) { condition = analytics_internal_1.formatUnicorn(sumformat, condition); } if (dataBinding.propertyName() !== 'Text' && dataBinding.formatString()) { condition = analytics_internal_1.formatUnicorn("FormatString('{0}', {1})", dataBinding.formatString(), condition); } return _expressionWrapper_1.ExpressionWrapper.createExpression(dataBinding.propertyName(), 'BeforePrint', condition); }; ReportConverter.prototype._tryToGenerateBindingExpressions = function (control, expressions, controlDataInfo) { var _this = this; var dataBindings = ko.unwrap(control['dataBindings']), canConvertDataBindings = true; var sumformat = null; if (control['Summary'] && ko.unwrap(control['Summary']['Running']) !== 'None') { var summaryFunc = ko.unwrap(control['Summary']['Func']); if (summaryFunc === 'Custom') return false; sumformat = 'sum' + summaryFunc + '({0})'; } if (!!dataBindings) { canConvertDataBindings = dataBindings.every(function (dataBinding) { var condition = ''; if (dataBinding.dataSource() && controlDataInfo.dataSource !== dataBinding.dataSource()) { return false; } else if (dataBinding.parameter()) { condition = '[Parameters.' + dataBinding.parameter().name + ']'; } else if (dataBinding.dataMember()) { var condition = dataBinding.dataMember(); if (controlDataInfo.dataMember) { var prefix = controlDataInfo.dataMember + '.'; if (dataBinding.dataMember().indexOf(prefix) === 0) { condition = dataBinding.dataMember().substring(prefix.length); } } condition = '[' + condition + ']'; } if (condition) { expressions.push(_this._createBindingExpression(dataBinding, sumformat, condition)); } return true; }); } return canConvertDataBindings; }; ReportConverter.prototype._resetDataBindings = function (control) { var dataBindings = ko.unwrap(control['dataBindings']); if (!!dataBindings) { dataBindings.forEach(function (dataBinding) { var formatString = null; if (dataBinding.propertyName() === 'Text') { formatString = control['textFormatString'] && control['textFormatString'](); } dataBinding.resetValue(); formatString && control['textFormatString'](formatString); }); } }; ReportConverter.prototype._mapPaddingObj = function (obj, padding) { obj['@Padding.Left'] = padding.left(); obj['@Padding.Right'] = padding.right(); obj['@Padding.Top'] = padding.top(); obj['@Padding.Bottom'] = padding.bottom(); }; ReportConverter.prototype._mapFontObj = function (obj, font) { obj['@Font.Name'] = font.family(); obj['@Font.Size'] = font.size(); obj['@Font.Italic'] = font.modificators.italic(); obj['@Font.Strikeout'] = font.modificators.strikeout(); obj['@Font.Bold'] = font.modificators.bold(); obj['@Font.Underline'] = font.modificators.underline(); }; ReportConverter.prototype._splitFontPropertyValue = function (formatting) { if (formatting['@Font']) { var font = new analytics_widgets_internal_1.FontModel(ko.observable(formatting['@Font'])); this._mapFontObj(formatting, font); delete formatting['@Font']; } }; ReportConverter.prototype._splitPaddingPropertyValue = function (formatting) { if (formatting['@Padding']) { var padding = analytics_elements_1.PaddingModel.from(formatting['@Padding']); this._mapPaddingObj(formatting, padding); delete formatting['@Padding']; } }; ReportConverter.prototype._patchRuleCondition = function (condition, dataMember, controlDataMember) { if (!condition) return condition; var expression = analytics_criteria_1.CriteriaOperator.parse(condition); var processNames = []; analytics_criteria_utils_1.criteriaForEach(expression, function (operator, path) { if (operator instanceof analytics_criteria_1.OperandProperty && path === dataMember) { processNames.push(function () { var propertyName = [dataMember, operator.propertyName].join('.'); if (propertyName.indexOf(controlDataMember) === 0 && (propertyName.length === controlDataMember.length || propertyName[controlDataMember.length] === '.')) { propertyName = propertyName.substr(controlDataMember.length + 1, propertyName.length); } operator.propertyName = propertyName; }); } }, dataMember); processNames.forEach(function (x) { return x(); }); return new analytics_widgets_internal_1.FilterEditorSerializer().serialize(expression); }; ReportConverter.prototype._tryToGenerateFormattingRulesExpressions = function (control, expressions, rules, controlDataInfo) { var _this = this; if (!control.formattingRuleLinks) return true; var conditions = {}; var currentRules = $.extend(true, [], control.formattingRuleLinks().map(function (x) { return rules[x.value().name()]; })); var changedPropertiesWithDot = []; var canConvertFormattingRules = currentRules.every(function (rule) { if (controlDataInfo.dataSource !== rule.dataSource) { return false; } Object.keys(rule.formatting).forEach(function (name) { if (name.indexOf('.') !== -1 && _this._defaultFormatting[name] !== rule.formatting[name]) { changedPropertiesWithDot.push(name); } }); return true; }); if (!canConvertFormattingRules) { return false; } currentRules.forEach(function (rule) { if (rule.dataMember !== controlDataInfo.dataMember) { rule.condition = _this._patchRuleCondition(rule.condition, rule.dataMember, controlDataInfo.dataMember); } Object.keys(rule.formatting).forEach(function (propertyName) { var hasPoint = propertyName.indexOf('.') !== -1; if (!hasPoint || (hasPoint && changedPropertiesWithDot.indexOf(propertyName) !== -1)) { if (!conditions[propertyName]) { conditions[propertyName] = []; } conditions[propertyName].unshift(rule.condition, "'" + rule.formatting[propertyName] + "'"); } }); return true; }); Object.keys(conditions).forEach(function (propertyName) { expressions.push(_this._createRuleExpression(conditions[propertyName], '?', propertyName.substring(1))); }); return true; }; ReportConverter.prototype._getControlDataSourceDataMember = function (control) { var dataSource = null, dataMember = null; while (!dataSource && control) { dataSource = dataSource || control['dataSource'] && control['dataSource'](); dataMember = dataMember || control['dataMember'] && control['dataMember'](); control = control.parentModel(); } return { dataSource: dataSource, dataMember: dataMember }; }; ReportConverter.prototype._generateFormattingRulesDictionary = function () { var _this = this; var rules = {}; this._model.formattingRuleSheet().forEach(function (rule) { var newRule = { condition: rule.condition(), formatting: _this._mapRulesProperties(new analytics_utils_1.ModelSerializer().serialize(rule['formatting'])), dataSource: rule.dataSource() || _this._model.dataSource(), dataMember: rule.dataMember() || _this._model.dataMember() }; _this._splitFontPropertyValue(newRule.formatting); _this._splitPaddingPropertyValue(newRule.formatting); rules[rule.name()] = newRule; }); return rules; }; ReportConverter.prototype._createRuleExpression = function (collection, defaultVal, propertyName) { collection.push(defaultVal); return _expressionWrapper_1.ExpressionWrapper.createExpression(propertyName, 'BeforePrint', 'iif(' + collection.join(',') + ')'); }; ReportConverter.prototype._canConvertReport = function () { var _this = this; var controls = this._controlsHelper.allControls() .filter(_utils_1.isControl); var rules = this._generateFormattingRulesDictionary(); this._expressionsToControlMap = {}; return controls.every(function (control) { var controlName = ko.unwrap(control.name); _this._expressionsToControlMap[controlName] = []; var controlDataInfo = _this._getControlDataSourceDataMember(control.parentModel && control.parentModel() || control); return _this._tryToGenerateBindingExpressions(control, _this._expressionsToControlMap[controlName], controlDataInfo) && _this._tryToGenerateFormattingRulesExpressions(control, _this._expressionsToControlMap[controlName], rules, controlDataInfo); }); }; ReportConverter.prototype._applyChanges = function () { var _this = this; this._lastChoice = this.convertChoiceEnum.Convert; var controls = this._controlsHelper.allControls() .filter(_utils_1.isControl); this._model.formattingRuleSheet.removeAll(); controls.forEach(function (control) { control.formattingRuleLinks && control.formattingRuleLinks.removeAll(); var controlName = ko.unwrap(control.name); _this._resetDataBindings(control); var expressions = _this._expressionsToControlMap[controlName]; if (expressions.length > 0) { control.expressionBindings(expressions); } }); this.popupOptions.visible(false); this._undoEngine().clearHistory(); this._undoEngine().isDirty(true); this._expressionsToControlMap = null; this._model = null; }; ReportConverter.prototype._cancel = function (mode) { if (mode === void 0) { mode = _dataBindingMode_1.DataBindingMode.Bindings; } this._lastChoice = this.convertChoiceEnum.Cancel; this._model._dataBindingMode(mode); this._model = null; this._expressionsToControlMap = {}; this.popupOptions.visible(false); }; return ReportConverter; }()); exports.ReportConverter = ReportConverter;