StackingAxis.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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, getDeferredAnimation = U.getDeferredAnimation, 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 stackLabelsAnim = axis.options.stackLabels.animation;
  115. var animationConfig = getDeferredAnimation(chart, stackLabelsAnim);
  116. var stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||
  117. renderer
  118. .g('stack-labels')
  119. .attr({
  120. visibility: 'visible',
  121. zIndex: 6,
  122. opacity: 0
  123. })
  124. .add());
  125. // plotLeft/Top will change when y axis gets wider so we need to
  126. // translate the stackTotalGroup at every render call. See bug #506
  127. // and #516
  128. stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
  129. // Render each stack total
  130. objectEach(stacks, function (type) {
  131. objectEach(type, function (stack) {
  132. stack.render(stackTotalGroup);
  133. });
  134. });
  135. stackTotalGroup.animate({
  136. opacity: 1
  137. }, animationConfig);
  138. };
  139. return StackingAxisAdditions;
  140. }());
  141. /**
  142. * Axis with stacking support.
  143. * @private
  144. * @class
  145. */
  146. var StackingAxis = /** @class */ (function () {
  147. function StackingAxis() {
  148. }
  149. /* *
  150. *
  151. * Static Functions
  152. *
  153. * */
  154. /**
  155. * Extends axis with stacking support.
  156. * @private
  157. */
  158. StackingAxis.compose = function (AxisClass) {
  159. var axisProto = AxisClass.prototype;
  160. addEvent(AxisClass, 'init', StackingAxis.onInit);
  161. addEvent(AxisClass, 'destroy', StackingAxis.onDestroy);
  162. };
  163. /**
  164. * @private
  165. */
  166. StackingAxis.onDestroy = function () {
  167. var stacking = this.stacking;
  168. if (!stacking) {
  169. return;
  170. }
  171. var stacks = stacking.stacks;
  172. // Destroy each stack total
  173. objectEach(stacks, function (stack, stackKey) {
  174. destroyObjectProperties(stack);
  175. stacks[stackKey] = null;
  176. });
  177. if (stacking &&
  178. stacking.stackTotalGroup) {
  179. stacking.stackTotalGroup.destroy();
  180. }
  181. };
  182. /**
  183. * @private
  184. */
  185. StackingAxis.onInit = function () {
  186. var axis = this;
  187. if (!axis.stacking) {
  188. axis.stacking = new StackingAxisAdditions(axis);
  189. }
  190. };
  191. return StackingAxis;
  192. }());
  193. export default StackingAxis;