StackingAxis.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /* *
  2. *
  3. * (c) 2010-2020 Torstein Honsi
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * */
  10. import U from './Utilities.js';
  11. var addEvent = U.addEvent, destroyObjectProperties = U.destroyObjectProperties, fireEvent = U.fireEvent, objectEach = U.objectEach, pick = U.pick;
  12. /* eslint-disable valid-jsdoc */
  13. /**
  14. * Adds stacking support to axes.
  15. * @private
  16. * @class
  17. */
  18. var StackingAxisAdditions = /** @class */ (function () {
  19. /* *
  20. *
  21. * Constructors
  22. *
  23. * */
  24. function StackingAxisAdditions(axis) {
  25. this.oldStacks = {};
  26. this.stacks = {};
  27. this.stacksTouched = 0;
  28. this.axis = axis;
  29. }
  30. /* *
  31. *
  32. * Functions
  33. *
  34. * */
  35. /**
  36. * Build the stacks from top down
  37. * @private
  38. */
  39. StackingAxisAdditions.prototype.buildStacks = function () {
  40. var stacking = this;
  41. var axis = stacking.axis;
  42. var axisSeries = axis.series;
  43. var reversedStacks = pick(axis.options.reversedStacks, true);
  44. var len = axisSeries.length;
  45. var actualSeries, i;
  46. if (!axis.isXAxis) {
  47. stacking.usePercentage = false;
  48. i = len;
  49. while (i--) {
  50. actualSeries = axisSeries[reversedStacks ? i : len - i - 1];
  51. actualSeries.setStackedPoints();
  52. actualSeries.setGroupedPoints();
  53. }
  54. // Loop up again to compute percent and stream stack
  55. for (i = 0; i < len; i++) {
  56. axisSeries[i].modifyStacks();
  57. }
  58. fireEvent(axis, 'afterBuildStacks');
  59. }
  60. };
  61. /**
  62. * @private
  63. */
  64. StackingAxisAdditions.prototype.cleanStacks = function () {
  65. var stacking = this;
  66. var axis = stacking.axis;
  67. var stacks;
  68. if (!axis.isXAxis) {
  69. if (stacking.oldStacks) {
  70. stacks = stacking.stacks = stacking.oldStacks;
  71. }
  72. // reset stacks
  73. objectEach(stacks, function (type) {
  74. objectEach(type, function (stack) {
  75. stack.cumulative = stack.total;
  76. });
  77. });
  78. }
  79. };
  80. /**
  81. * Set all the stacks to initial states and destroy unused ones.
  82. * @private
  83. */
  84. StackingAxisAdditions.prototype.resetStacks = function () {
  85. var stacking = this;
  86. var axis = stacking.axis;
  87. var stacks = stacking.stacks;
  88. if (!axis.isXAxis) {
  89. objectEach(stacks, function (type) {
  90. objectEach(type, function (stack, key) {
  91. // Clean up memory after point deletion (#1044, #4320)
  92. if (stack.touched < stacking.stacksTouched) {
  93. stack.destroy();
  94. delete type[key];
  95. // Reset stacks
  96. }
  97. else {
  98. stack.total = null;
  99. stack.cumulative = null;
  100. }
  101. });
  102. });
  103. }
  104. };
  105. /**
  106. * @private
  107. */
  108. StackingAxisAdditions.prototype.renderStackTotals = function () {
  109. var stacking = this;
  110. var axis = stacking.axis;
  111. var chart = axis.chart;
  112. var renderer = chart.renderer;
  113. var stacks = stacking.stacks;
  114. var stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||
  115. renderer
  116. .g('stack-labels')
  117. .attr({
  118. visibility: 'visible',
  119. zIndex: 6
  120. })
  121. .add());
  122. // plotLeft/Top will change when y axis gets wider so we need to
  123. // translate the stackTotalGroup at every render call. See bug #506
  124. // and #516
  125. stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
  126. // Render each stack total
  127. objectEach(stacks, function (type) {
  128. objectEach(type, function (stack) {
  129. stack.render(stackTotalGroup);
  130. });
  131. });
  132. };
  133. return StackingAxisAdditions;
  134. }());
  135. /**
  136. * Axis with stacking support.
  137. * @private
  138. * @class
  139. */
  140. var StackingAxis = /** @class */ (function () {
  141. function StackingAxis() {
  142. }
  143. /* *
  144. *
  145. * Static Functions
  146. *
  147. * */
  148. /**
  149. * Extends axis with stacking support.
  150. * @private
  151. */
  152. StackingAxis.compose = function (AxisClass) {
  153. var axisProto = AxisClass.prototype;
  154. addEvent(AxisClass, 'init', StackingAxis.onInit);
  155. addEvent(AxisClass, 'destroy', StackingAxis.onDestroy);
  156. };
  157. /**
  158. * @private
  159. */
  160. StackingAxis.onDestroy = function () {
  161. var stacking = this.stacking;
  162. if (!stacking) {
  163. return;
  164. }
  165. var stacks = stacking.stacks;
  166. // Destroy each stack total
  167. objectEach(stacks, function (stack, stackKey) {
  168. destroyObjectProperties(stack);
  169. stacks[stackKey] = null;
  170. });
  171. if (stacking &&
  172. stacking.stackTotalGroup) {
  173. stacking.stackTotalGroup.destroy();
  174. }
  175. };
  176. /**
  177. * @private
  178. */
  179. StackingAxis.onInit = function () {
  180. var axis = this;
  181. if (!axis.stacking) {
  182. axis.stacking = new StackingAxisAdditions(axis);
  183. }
  184. };
  185. return StackingAxis;
  186. }());
  187. export default StackingAxis;