stacked_series.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * DevExtreme (viz/series/stacked_series.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _noop = require("../../core/utils/common").noop;
  11. var _extend = require("../../core/utils/extend").extend;
  12. var each = require("../../core/utils/iterator").each;
  13. var areaSeries = require("./area_series").chart;
  14. var chartAreaSeries = areaSeries.area;
  15. var barSeries = require("./bar_series");
  16. var chartBarSeries = barSeries.chart.bar;
  17. var lineSeries = require("./line_series").chart;
  18. var vizUtils = require("../core/utils");
  19. var objectUtils = require("../../core/utils/object");
  20. var baseStackedSeries = {
  21. _calculateErrorBars: _noop,
  22. _updateOptions: function(options) {
  23. this._stackName = "axis_" + (options.axis || "default")
  24. }
  25. };
  26. exports.chart = {};
  27. exports.polar = {};
  28. exports.chart.stackedline = _extend({}, lineSeries.line, baseStackedSeries, {});
  29. exports.chart.stackedspline = _extend({}, lineSeries.spline, baseStackedSeries, {});
  30. exports.chart.fullstackedline = _extend({}, lineSeries.line, baseStackedSeries, {
  31. getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue
  32. });
  33. exports.chart.fullstackedspline = _extend({}, lineSeries.spline, baseStackedSeries, {
  34. getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue
  35. });
  36. var stackedBar = exports.chart.stackedbar = _extend({}, chartBarSeries, baseStackedSeries, {
  37. _updateOptions: function(options) {
  38. baseStackedSeries._updateOptions.call(this, options);
  39. this._stackName = this._stackName + "_stack_" + (options.stack || "default")
  40. }
  41. });
  42. exports.chart.fullstackedbar = _extend({}, chartBarSeries, baseStackedSeries, {
  43. _updateOptions: stackedBar._updateOptions
  44. });
  45. function clonePoint(point, value, minValue, position) {
  46. point = objectUtils.clone(point);
  47. point.value = value;
  48. point.minValue = minValue;
  49. point.translate();
  50. point.argument = point.argument + position;
  51. return point
  52. }
  53. function preparePointsForStackedAreaSegment(points) {
  54. var i = 0;
  55. var p;
  56. var result = [];
  57. var array;
  58. var len = points.length;
  59. while (i < len) {
  60. p = points[i];
  61. array = [p];
  62. if (p.leftHole) {
  63. array = [clonePoint(p, p.leftHole, p.minLeftHole, "left"), p]
  64. }
  65. if (p.rightHole) {
  66. array.push(clonePoint(p, p.rightHole, p.minRightHole, "right"))
  67. }
  68. result.push(array);
  69. i++
  70. }
  71. return [].concat.apply([], result)
  72. }
  73. exports.chart.stackedarea = _extend({}, chartAreaSeries, baseStackedSeries, {
  74. _prepareSegment: function(points, rotated) {
  75. return chartAreaSeries._prepareSegment.call(this, preparePointsForStackedAreaSegment(points), rotated)
  76. },
  77. _appendInGroup: function() {
  78. this._group.append(this._extGroups.seriesGroup).toBackground()
  79. }
  80. });
  81. function getPointsByArgFromPrevSeries(prevSeries, argument) {
  82. var result;
  83. while (!result && prevSeries) {
  84. result = prevSeries._segmentByArg && prevSeries._segmentByArg[argument];
  85. prevSeries = prevSeries._prevSeries
  86. }
  87. return result
  88. }
  89. exports.chart.stackedsplinearea = _extend({}, areaSeries.splinearea, baseStackedSeries, {
  90. _prepareSegment: function(points, rotated) {
  91. var that = this;
  92. var areaSegment;
  93. points = preparePointsForStackedAreaSegment(points);
  94. if (!this._prevSeries || 1 === points.length) {
  95. areaSegment = areaSeries.splinearea._prepareSegment.call(this, points, rotated)
  96. } else {
  97. var forwardPoints = lineSeries.spline._calculateBezierPoints(points, rotated);
  98. var backwardPoints = vizUtils.map(points, function(p) {
  99. var point = p.getCoords(true);
  100. point.argument = p.argument;
  101. return point
  102. });
  103. var prevSeriesForwardPoints = [];
  104. var pointByArg = {};
  105. var i = 0;
  106. var len = that._prevSeries._segments.length;
  107. while (i < len) {
  108. prevSeriesForwardPoints = prevSeriesForwardPoints.concat(that._prevSeries._segments[i].line);
  109. i++
  110. }
  111. each(prevSeriesForwardPoints, function(_, p) {
  112. if (null !== p.argument) {
  113. var argument = p.argument.valueOf();
  114. if (!pointByArg[argument]) {
  115. pointByArg[argument] = [p]
  116. } else {
  117. pointByArg[argument].push(p)
  118. }
  119. }
  120. });
  121. that._prevSeries._segmentByArg = pointByArg;
  122. backwardPoints = lineSeries.spline._calculateBezierPoints(backwardPoints, rotated);
  123. each(backwardPoints, function(i, p) {
  124. var argument = p.argument.valueOf();
  125. var prevSeriesPoints;
  126. if (i % 3 === 0) {
  127. prevSeriesPoints = pointByArg[argument] || getPointsByArgFromPrevSeries(that._prevSeries, argument);
  128. if (prevSeriesPoints) {
  129. backwardPoints[i - 1] && prevSeriesPoints[0] && (backwardPoints[i - 1] = prevSeriesPoints[0]);
  130. backwardPoints[i + 1] && (backwardPoints[i + 1] = prevSeriesPoints[2] || p)
  131. }
  132. }
  133. });
  134. areaSegment = {
  135. line: forwardPoints,
  136. area: forwardPoints.concat(backwardPoints.reverse())
  137. };
  138. that._areaPointsToSplineAreaPoints(areaSegment.area)
  139. }
  140. return areaSegment
  141. },
  142. _appendInGroup: exports.chart.stackedarea._appendInGroup
  143. });
  144. exports.chart.fullstackedarea = _extend({}, chartAreaSeries, baseStackedSeries, {
  145. _prepareSegment: exports.chart.stackedarea._prepareSegment,
  146. _appendInGroup: exports.chart.stackedarea._appendInGroup
  147. });
  148. exports.chart.fullstackedsplinearea = _extend({}, areaSeries.splinearea, baseStackedSeries, {
  149. _prepareSegment: exports.chart.stackedsplinearea._prepareSegment,
  150. _appendInGroup: exports.chart.stackedarea._appendInGroup
  151. });
  152. exports.polar.stackedbar = _extend({}, barSeries.polar.bar, baseStackedSeries, {});