| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541 |
- /**
- * DevExtreme (viz/chart_components/advanced_chart.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var extend = require("../../core/utils/extend").extend;
- var inArray = require("../../core/utils/array").inArray;
- var iteratorModule = require("../../core/utils/iterator");
- var rangeModule = require("../translators/range");
- var DEFAULT_AXIS_NAME = "defaultAxisName";
- var axisModule = require("../axes/base_axis");
- var seriesFamilyModule = require("../core/series_family");
- var BaseChart = require("./base_chart").BaseChart;
- var crosshairModule = require("./crosshair");
- var _isArray = Array.isArray;
- var _isDefined = require("../../core/utils/type").isDefined;
- var _each = iteratorModule.each;
- var _reverseEach = iteratorModule.reverseEach;
- var _noop = require("../../core/utils/common").noop;
- var _extend = extend;
- var vizUtils = require("../core/utils");
- var _map = vizUtils.map;
- var mergeMarginOptions = vizUtils.mergeMarginOptions;
- var FONT = "font";
- var COMMON_AXIS_SETTINGS = "commonAxisSettings";
- function prepareAxis(axisOptions) {
- return _isArray(axisOptions) ? 0 === axisOptions.length ? [{}] : axisOptions : [axisOptions]
- }
- function processBubbleMargin(opt, bubbleSize) {
- if (opt.processBubbleSize) {
- opt.size = bubbleSize
- }
- return opt
- }
- function estimateBubbleSize(size, panesCount, maxSize, rotated) {
- var width = rotated ? size.width / panesCount : size.width;
- var height = rotated ? size.height : size.height / panesCount;
- return Math.min(width, height) * maxSize
- }
- var AdvancedChart = BaseChart.inherit({
- _setDeprecatedOptions: function() {
- this.callBase.apply(this, arguments);
- _extend(this._deprecatedOptions, {
- barWidth: {
- since: "18.1",
- message: "Use the 'commonSeriesSettings.barPadding' or 'series.barPadding' option instead"
- },
- equalBarWidth: {
- since: "18.1",
- message: "Use the 'commonSeriesSettings.ignoreEmptyPoints' or 'series.ignoreEmptyPoints' option instead"
- }
- })
- },
- _fontFields: [COMMON_AXIS_SETTINGS + ".label." + FONT, COMMON_AXIS_SETTINGS + ".title." + FONT],
- _dispose: function() {
- var that = this;
- var disposeObjectsInArray = this._disposeObjectsInArray;
- that.callBase();
- that.panes = null;
- if (that._legend) {
- that._legend.dispose();
- that._legend = null
- }
- disposeObjectsInArray.call(that, "panesBackground");
- disposeObjectsInArray.call(that, "seriesFamilies");
- that._disposeAxes()
- },
- _reinitAxes: function() {
- this.panes = this._createPanes();
- this._populateAxes();
- this._axesReinitialized = true
- },
- _getCrosshairMargins: function() {
- var crosshairOptions = this._getCrosshairOptions() || {};
- var crosshairEnabled = crosshairOptions.enabled;
- var margins = crosshairModule.getMargins();
- return {
- x: crosshairEnabled && crosshairOptions.horizontalLine.visible ? margins.x : 0,
- y: crosshairEnabled && crosshairOptions.verticalLine.visible ? margins.y : 0
- }
- },
- _populateAxes: function() {
- var that = this;
- var panes = that.panes;
- var rotated = that._isRotated();
- var argumentAxesOptions = prepareAxis(that.option("argumentAxis") || {})[0];
- var valueAxisOption = that.option("valueAxis");
- var valueAxesOptions = prepareAxis(valueAxisOption || {});
- var argumentAxesPopulatedOptions = [];
- var valueAxesPopulatedOptions = [];
- var axisNames = [];
- var valueAxesCounter = 0;
- var paneWithNonVirtualAxis;
- var crosshairMargins = that._getCrosshairMargins();
- function getNextAxisName() {
- return DEFAULT_AXIS_NAME + valueAxesCounter++
- }
- if (rotated) {
- paneWithNonVirtualAxis = "right" === argumentAxesOptions.position ? panes[panes.length - 1].name : panes[0].name
- } else {
- paneWithNonVirtualAxis = "top" === argumentAxesOptions.position ? panes[0].name : panes[panes.length - 1].name
- }
- argumentAxesPopulatedOptions = _map(panes, function(pane) {
- var virtual = pane.name !== paneWithNonVirtualAxis;
- return that._populateAxesOptions("argumentAxis", argumentAxesOptions, {
- pane: pane.name,
- name: null,
- optionPath: "argumentAxis",
- crosshairMargin: rotated ? crosshairMargins.x : crosshairMargins.y
- }, rotated, virtual)
- });
- _each(valueAxesOptions, function(priority, axisOptions) {
- var axisPanes = [];
- var name = axisOptions.name;
- if (name && inArray(name, axisNames) !== -1) {
- that._incidentOccurred("E2102");
- return
- }
- name && axisNames.push(name);
- if (axisOptions.pane) {
- axisPanes.push(axisOptions.pane)
- }
- if (axisOptions.panes && axisOptions.panes.length) {
- axisPanes = axisPanes.concat(axisOptions.panes.slice(0))
- }
- axisPanes = vizUtils.unique(axisPanes);
- if (!axisPanes.length) {
- axisPanes.push(void 0)
- }
- _each(axisPanes, function(_, pane) {
- var optionPath = _isArray(valueAxisOption) ? "valueAxis[".concat(priority, "]") : "valueAxis";
- valueAxesPopulatedOptions.push(that._populateAxesOptions("valueAxis", axisOptions, {
- name: name || getNextAxisName(),
- pane: pane,
- priority: priority,
- optionPath: optionPath,
- crosshairMargin: rotated ? crosshairMargins.y : crosshairMargins.x
- }, rotated))
- })
- });
- that._redesignAxes(argumentAxesPopulatedOptions, true, paneWithNonVirtualAxis);
- that._redesignAxes(valueAxesPopulatedOptions, false)
- },
- _redesignAxes: function(options, isArgumentAxes, paneWithNonVirtualAxis) {
- var that = this;
- var axesBasis = [];
- var axes = isArgumentAxes ? that._argumentAxes : that._valueAxes;
- _each(options, function(_, opt) {
- var curAxes = axes && axes.filter(function(a) {
- return a.name === opt.name && (!_isDefined(opt.pane) && that.panes.some(function(p) {
- return p.name === a.pane
- }) || a.pane === opt.pane)
- });
- if (curAxes && curAxes.length > 0) {
- _each(curAxes, function(_, axis) {
- axis.updateOptions(opt);
- axis.validate();
- axesBasis.push({
- axis: axis
- })
- })
- } else {
- axesBasis.push({
- options: opt
- })
- }
- });
- if (axes) {
- _reverseEach(axes, function(index, axis) {
- if (!axesBasis.some(function(basis) {
- return basis.axis && basis.axis === axis
- })) {
- that._disposeAxis(index, isArgumentAxes)
- }
- })
- } else {
- if (isArgumentAxes) {
- axes = that._argumentAxes = []
- } else {
- axes = that._valueAxes = []
- }
- }
- _each(axesBasis, function(index, basis) {
- var axis = basis.axis;
- if (basis.axis && isArgumentAxes) {
- basis.axis.isVirtual = basis.axis.pane !== paneWithNonVirtualAxis
- } else {
- if (basis.options) {
- axis = that._createAxis(isArgumentAxes, basis.options, isArgumentAxes ? basis.options.pane !== paneWithNonVirtualAxis : void 0, isArgumentAxes ? index : void 0);
- axes.push(axis)
- }
- }
- axis.applyVisualRangeSetter(that._getVisualRangeSetter())
- })
- },
- _disposeAxis: function(index, isArgumentAxis) {
- var axes = isArgumentAxis ? this._argumentAxes : this._valueAxes;
- var axis = axes[index];
- if (!axis) {
- return
- }
- axis.dispose();
- axes.splice(index, 1)
- },
- _prepareStackPoints: function(singleSeries, stackPoints) {
- var points = singleSeries.getPoints();
- var stackName = singleSeries.getStackName();
- _each(points, function(_, point) {
- var argument = point.argument;
- if (!stackPoints[argument]) {
- stackPoints[argument] = {};
- stackPoints[argument][null] = []
- }
- if (stackName && !_isArray(stackPoints[argument][stackName])) {
- stackPoints[argument][stackName] = [];
- _each(stackPoints[argument][null], function(_, point) {
- if (!point.stackName) {
- stackPoints[argument][stackName].push(point)
- }
- })
- }
- if (stackName) {
- stackPoints[argument][stackName].push(point);
- stackPoints[argument][null].push(point)
- } else {
- _each(stackPoints[argument], function(_, stack) {
- stack.push(point)
- })
- }
- point.stackPoints = stackPoints[argument][stackName];
- point.stackName = stackName
- })
- },
- _resetStackPoints: function(singleSeries) {
- _each(singleSeries.getPoints(), function(_, point) {
- point.stackPoints = null;
- point.stackName = null
- })
- },
- _disposeAxes: function() {
- var that = this;
- var disposeObjectsInArray = that._disposeObjectsInArray;
- disposeObjectsInArray.call(that, "_argumentAxes");
- disposeObjectsInArray.call(that, "_valueAxes")
- },
- _appendAdditionalSeriesGroups: function() {
- this._crosshairCursorGroup.linkAppend();
- this._scrollBar && this._scrollBarGroup.linkAppend()
- },
- _getLegendTargets: function() {
- var _this = this;
- return (this.series || []).map(function(s) {
- var item = _this._getLegendOptions(s);
- item.legendData.series = s;
- if (!s.getOptions().showInLegend) {
- item.legendData.visible = false
- }
- return item
- })
- },
- _legendItemTextField: "name",
- _seriesPopulatedHandlerCore: function() {
- this._processSeriesFamilies();
- this._processValueAxisFormat()
- },
- _renderTrackers: function() {
- var that = this;
- var i;
- for (i = 0; i < that.series.length; ++i) {
- that.series[i].drawTrackers()
- }
- },
- _specialProcessSeries: function() {
- this._processSeriesFamilies()
- },
- _processSeriesFamilies: function() {
- var that = this;
- var types = [];
- var families = [];
- var paneSeries;
- var themeManager = that._themeManager;
- var negativesAsZeroes = themeManager.getOptions("negativesAsZeroes");
- var negativesAsZeros = themeManager.getOptions("negativesAsZeros");
- var familyOptions = {
- equalBarWidth: themeManager.getOptions("equalBarWidth"),
- minBubbleSize: themeManager.getOptions("minBubbleSize"),
- maxBubbleSize: themeManager.getOptions("maxBubbleSize"),
- barWidth: themeManager.getOptions("barWidth"),
- barGroupPadding: themeManager.getOptions("barGroupPadding"),
- barGroupWidth: themeManager.getOptions("barGroupWidth"),
- negativesAsZeroes: _isDefined(negativesAsZeroes) ? negativesAsZeroes : negativesAsZeros
- };
- if (that.seriesFamilies && that.seriesFamilies.length) {
- _each(that.seriesFamilies, function(_, family) {
- family.updateOptions(familyOptions);
- family.adjustSeriesValues()
- });
- return
- }
- _each(that.series, function(_, item) {
- if (inArray(item.type, types) === -1) {
- types.push(item.type)
- }
- });
- _each(that._getLayoutTargets(), function(_, pane) {
- paneSeries = that._getSeriesForPane(pane.name);
- _each(types, function(_, type) {
- var family = new seriesFamilyModule.SeriesFamily({
- type: type,
- pane: pane.name,
- equalBarWidth: familyOptions.equalBarWidth,
- minBubbleSize: familyOptions.minBubbleSize,
- maxBubbleSize: familyOptions.maxBubbleSize,
- barWidth: familyOptions.barWidth,
- barGroupPadding: familyOptions.barGroupPadding,
- barGroupWidth: familyOptions.barGroupWidth,
- negativesAsZeroes: familyOptions.negativesAsZeroes,
- rotated: that._isRotated()
- });
- family.add(paneSeries);
- family.adjustSeriesValues();
- families.push(family)
- })
- });
- that.seriesFamilies = families
- },
- _updateSeriesDimensions: function() {
- var that = this;
- var i;
- var seriesFamilies = that.seriesFamilies || [];
- for (i = 0; i < seriesFamilies.length; i++) {
- var family = seriesFamilies[i];
- family.updateSeriesValues();
- family.adjustSeriesDimensions()
- }
- },
- _getLegendCallBack: function(series) {
- return this._legend && this._legend.getActionCallback(series)
- },
- _appendAxesGroups: function() {
- var that = this;
- that._stripsGroup.linkAppend();
- that._gridGroup.linkAppend();
- that._axesGroup.linkAppend();
- that._constantLinesGroup.linkAppend();
- that._labelAxesGroup.linkAppend();
- that._scaleBreaksGroup.linkAppend()
- },
- _populateMarginOptions: function() {
- var that = this;
- var bubbleSize = estimateBubbleSize(that.getSize(), that.panes.length, that._themeManager.getOptions("maxBubbleSize"), that._isRotated());
- var argumentMarginOptions = {};
- that._valueAxes.forEach(function(valueAxis) {
- var groupSeries = that.series.filter(function(series) {
- return series.getValueAxis() === valueAxis
- });
- var marginOptions = {};
- groupSeries.forEach(function(series) {
- if (series.isVisible()) {
- var seriesMarginOptions = processBubbleMargin(series.getMarginOptions(), bubbleSize);
- marginOptions = mergeMarginOptions(marginOptions, seriesMarginOptions);
- argumentMarginOptions = mergeMarginOptions(argumentMarginOptions, seriesMarginOptions)
- }
- });
- valueAxis.setMarginOptions(marginOptions)
- });
- that._argumentAxes.forEach(function(a) {
- return a.setMarginOptions(argumentMarginOptions)
- })
- },
- _populateBusinessRange: function(updatedAxis, keepRange) {
- var that = this;
- var rotated = that._isRotated();
- var argRange = new rangeModule.Range({
- rotated: !!rotated
- });
- var series = that._getVisibleSeries();
- that._valueAxes.forEach(function(valueAxis) {
- var groupRange = new rangeModule.Range({
- rotated: !!rotated,
- pane: valueAxis.pane,
- axis: valueAxis.name
- });
- var groupSeries = series.filter(function(series) {
- return series.getValueAxis() === valueAxis
- });
- groupSeries.forEach(function(series) {
- var seriesRange = series.getRangeData();
- groupRange.addRange(seriesRange.val);
- argRange.addRange(seriesRange.arg)
- });
- if (!updatedAxis || updatedAxis && groupSeries.length && valueAxis === updatedAxis) {
- valueAxis.setGroupSeries(groupSeries);
- valueAxis.setBusinessRange(groupRange, that._axesReinitialized || keepRange, that._argumentAxes[0]._lastVisualRangeUpdateMode)
- }
- });
- if (!updatedAxis || updatedAxis && series.length) {
- that._argumentAxes.forEach(function(a) {
- return a.setBusinessRange(argRange, that._axesReinitialized, void 0, that._groupsData.categories)
- })
- }
- that._populateMarginOptions()
- },
- getArgumentAxis: function() {
- return (this._argumentAxes || []).filter(function(a) {
- return !a.isVirtual
- })[0]
- },
- getValueAxis: function(name) {
- var _this2 = this;
- return (this._valueAxes || []).filter(_isDefined(name) ? function(a) {
- return a.name === name
- } : function(a) {
- return a.pane === _this2.defaultPane
- })[0]
- },
- _getGroupsData: function() {
- var that = this;
- var groups = [];
- that._valueAxes.forEach(function(axis) {
- groups.push({
- series: that.series.filter(function(series) {
- return series.getValueAxis() === axis
- }),
- valueAxis: axis,
- valueOptions: axis.getOptions()
- })
- });
- return {
- groups: groups,
- argumentAxes: that._argumentAxes,
- argumentOptions: that._argumentAxes[0].getOptions()
- }
- },
- _groupSeries: function() {
- var that = this;
- that._correctValueAxes(false);
- that._groupsData = that._getGroupsData()
- },
- _processValueAxisFormat: function() {
- var axesWithFullStackedFormat = [];
- this.series.forEach(function(series) {
- var axis = series.getValueAxis();
- if (series.isFullStackedSeries()) {
- axis.setPercentLabelFormat();
- axesWithFullStackedFormat.push(axis)
- }
- });
- this._valueAxes.forEach(function(axis) {
- if (axesWithFullStackedFormat.indexOf(axis) === -1) {
- axis.resetAutoLabelFormat()
- }
- })
- },
- _populateAxesOptions: function(typeSelector, userOptions, axisOptions, rotated, virtual) {
- var that = this;
- var preparedUserOptions = that._prepareStripsAndConstantLines(typeSelector, userOptions, rotated);
- var options = _extend(true, {}, preparedUserOptions, axisOptions, that._prepareAxisOptions(typeSelector, preparedUserOptions, rotated));
- if (virtual) {
- options.visible = options.tick.visible = options.minorTick.visible = options.label.visible = false;
- options.title = {}
- }
- return options
- },
- _createAxis: function(isArgumentAxes, options, virtual, index) {
- var that = this;
- var typeSelector = isArgumentAxes ? "argumentAxis" : "valueAxis";
- var renderingSettings = _extend({
- renderer: that._renderer,
- incidentOccurred: that._incidentOccurred,
- eventTrigger: that._eventTrigger,
- axisClass: isArgumentAxes ? "arg" : "val",
- widgetClass: "dxc",
- stripsGroup: that._stripsGroup,
- labelAxesGroup: that._labelAxesGroup,
- constantLinesGroup: that._constantLinesGroup,
- scaleBreaksGroup: that._scaleBreaksGroup,
- axesContainerGroup: that._axesGroup,
- gridGroup: that._gridGroup,
- isArgumentAxis: isArgumentAxes
- }, that._getAxisRenderingOptions(typeSelector));
- var axis = new axisModule.Axis(renderingSettings);
- axis.updateOptions(options);
- axis.isVirtual = virtual;
- return axis
- },
- _getVisualRangeSetter: _noop,
- _getTrackerSettings: function() {
- return _extend(this.callBase(), {
- argumentAxis: this.getArgumentAxis()
- })
- },
- _prepareStripsAndConstantLines: function(typeSelector, userOptions, rotated) {
- userOptions = this._themeManager.getOptions(typeSelector, userOptions, rotated);
- if (userOptions.strips) {
- _each(userOptions.strips, function(i) {
- userOptions.strips[i] = _extend(true, {}, userOptions.stripStyle, userOptions.strips[i])
- })
- }
- if (userOptions.constantLines) {
- _each(userOptions.constantLines, function(i, line) {
- userOptions.constantLines[i] = _extend(true, {}, userOptions.constantLineStyle, line)
- })
- }
- return userOptions
- },
- _legendDataField: "series",
- _adjustSeriesLabels: _noop,
- _correctValueAxes: _noop,
- refresh: function() {
- this._disposeAxes();
- this.callBase()
- },
- _layoutAxes: function(drawAxes) {
- var that = this;
- var cleanPanesCanvases = drawAxes();
- var needSpace = that.checkForMoreSpaceForPanesCanvas();
- if (needSpace) {
- var size = this._layout.backward(this._rect, this._rect, [needSpace.width, needSpace.height]);
- needSpace.width = Math.max(0, size[0]);
- needSpace.height = Math.max(0, size[1]);
- this._canvas = this._createCanvasFromRect(this._rect);
- drawAxes(needSpace, cleanPanesCanvases)
- }
- },
- checkForMoreSpaceForPanesCanvas: function() {
- return this.layoutManager.needMoreSpaceForPanesCanvas(this._getLayoutTargets(), this._isRotated())
- },
- _notify: function() {
- this._axesReinitialized = false
- }
- });
- exports.AdvancedChart = AdvancedChart;
|