@carbon/charts 0.30.21 → 0.30.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +337 -1035
  2. package/README.md +3 -0
  3. package/axis-chart.js +8 -14
  4. package/axis-chart.js.map +1 -1
  5. package/build/demo/{data/create-codesandbox.d.ts → create-codesandbox.d.ts} +16 -13
  6. package/build/demo/data/bar.d.ts +175 -1
  7. package/build/demo/data/bubble.d.ts +41 -0
  8. package/build/demo/data/donut.d.ts +23 -0
  9. package/build/demo/data/line.d.ts +70 -0
  10. package/build/demo/data/pie.d.ts +13 -0
  11. package/build/demo/data/scatter.d.ts +31 -0
  12. package/build/demo/data/step.d.ts +4 -0
  13. package/build/demo/data/time-series-axis.d.ts +55 -3
  14. package/build/src/components/axes/grid.d.ts +3 -3
  15. package/build/src/components/axes/two-dimensional-axes.d.ts +3 -0
  16. package/build/src/components/essentials/threshold.d.ts +17 -0
  17. package/build/src/components/graphs/bar.d.ts +1 -1
  18. package/build/src/components/graphs/scatter.d.ts +1 -0
  19. package/build/src/components/graphs/skeleton.d.ts +22 -0
  20. package/build/src/components/index.d.ts +2 -0
  21. package/build/src/interfaces/axis-scales.d.ts +22 -11
  22. package/build/src/interfaces/charts.d.ts +5 -0
  23. package/build/src/interfaces/components.d.ts +21 -0
  24. package/build/src/interfaces/enums.d.ts +9 -0
  25. package/build/src/interfaces/events.d.ts +7 -0
  26. package/build/src/model.d.ts +1 -0
  27. package/build/src/services/scales-cartesian.d.ts +9 -1
  28. package/build/stories/tutorials/event-listeners.d.ts +1 -0
  29. package/build/stories/tutorials/index.d.ts +2 -1
  30. package/bundle.js +1 -1
  31. package/chart.js +15 -24
  32. package/chart.js.map +1 -1
  33. package/charts/bar-grouped.js +6 -2
  34. package/charts/bar-grouped.js.map +1 -1
  35. package/charts/bar-simple.js +6 -2
  36. package/charts/bar-simple.js.map +1 -1
  37. package/charts/bar-stacked.js +6 -2
  38. package/charts/bar-stacked.js.map +1 -1
  39. package/charts/bubble.js +6 -2
  40. package/charts/bubble.js.map +1 -1
  41. package/charts/donut.js +6 -2
  42. package/charts/donut.js.map +1 -1
  43. package/charts/line.js +6 -2
  44. package/charts/line.js.map +1 -1
  45. package/charts/pie.js +6 -2
  46. package/charts/pie.js.map +1 -1
  47. package/charts/radar.js +1 -3
  48. package/charts/radar.js.map +1 -1
  49. package/charts/scatter.js +6 -2
  50. package/charts/scatter.js.map +1 -1
  51. package/components/axes/axis.js +93 -43
  52. package/components/axes/axis.js.map +1 -1
  53. package/components/axes/grid.d.ts +3 -3
  54. package/components/axes/grid.js +46 -23
  55. package/components/axes/grid.js.map +1 -1
  56. package/components/axes/ruler.js +7 -5
  57. package/components/axes/ruler.js.map +1 -1
  58. package/components/axes/two-dimensional-axes.d.ts +3 -0
  59. package/components/axes/two-dimensional-axes.js +35 -2
  60. package/components/axes/two-dimensional-axes.js.map +1 -1
  61. package/components/axes/zero-line.js +16 -1
  62. package/components/axes/zero-line.js.map +1 -1
  63. package/components/component.js +2 -4
  64. package/components/component.js.map +1 -1
  65. package/components/essentials/legend.js +46 -23
  66. package/components/essentials/legend.js.map +1 -1
  67. package/components/essentials/threshold.d.ts +17 -0
  68. package/components/essentials/threshold.js +171 -0
  69. package/components/essentials/threshold.js.map +1 -0
  70. package/components/essentials/title.js +6 -4
  71. package/components/essentials/title.js.map +1 -1
  72. package/components/essentials/tooltip-bar.js +39 -20
  73. package/components/essentials/tooltip-bar.js.map +1 -1
  74. package/components/essentials/tooltip-pie.js +4 -3
  75. package/components/essentials/tooltip-pie.js.map +1 -1
  76. package/components/essentials/tooltip-radar.js +6 -3
  77. package/components/essentials/tooltip-radar.js.map +1 -1
  78. package/components/essentials/tooltip-scatter.js +3 -1
  79. package/components/essentials/tooltip-scatter.js.map +1 -1
  80. package/components/essentials/tooltip.js +35 -15
  81. package/components/essentials/tooltip.js.map +1 -1
  82. package/components/graphs/bar-grouped.js +48 -20
  83. package/components/graphs/bar-grouped.js.map +1 -1
  84. package/components/graphs/bar-simple.js +39 -19
  85. package/components/graphs/bar-simple.js.map +1 -1
  86. package/components/graphs/bar-stacked.js +50 -28
  87. package/components/graphs/bar-stacked.js.map +1 -1
  88. package/components/graphs/bar.d.ts +1 -1
  89. package/components/graphs/bar.js +1 -1
  90. package/components/graphs/bar.js.map +1 -1
  91. package/components/graphs/bubble.js +22 -8
  92. package/components/graphs/bubble.js.map +1 -1
  93. package/components/graphs/donut.js +17 -3
  94. package/components/graphs/donut.js.map +1 -1
  95. package/components/graphs/line.js +14 -7
  96. package/components/graphs/line.js.map +1 -1
  97. package/components/graphs/pie.js +80 -44
  98. package/components/graphs/pie.js.map +1 -1
  99. package/components/graphs/radar.js +271 -140
  100. package/components/graphs/radar.js.map +1 -1
  101. package/components/graphs/scatter.d.ts +1 -0
  102. package/components/graphs/scatter.js +80 -19
  103. package/components/graphs/scatter.js.map +1 -1
  104. package/components/graphs/skeleton.d.ts +22 -0
  105. package/components/graphs/skeleton.js +256 -0
  106. package/components/graphs/skeleton.js.map +1 -0
  107. package/components/index.d.ts +2 -0
  108. package/components/index.js +2 -0
  109. package/components/index.js.map +1 -1
  110. package/components/layout/layout.js +38 -26
  111. package/components/layout/layout.js.map +1 -1
  112. package/components/layout/spacer.js +2 -1
  113. package/components/layout/spacer.js.map +1 -1
  114. package/configuration.js +17 -14
  115. package/configuration.js.map +1 -1
  116. package/demo/{data/create-codesandbox.d.ts → create-codesandbox.d.ts} +16 -13
  117. package/demo/{data/create-codesandbox.js → create-codesandbox.js} +24 -21
  118. package/demo/create-codesandbox.js.map +1 -0
  119. package/demo/data/bar.d.ts +175 -1
  120. package/demo/data/bar.js +189 -3
  121. package/demo/data/bar.js.map +1 -1
  122. package/demo/data/bubble.d.ts +41 -0
  123. package/demo/data/bubble.js +48 -3
  124. package/demo/data/bubble.js.map +1 -1
  125. package/demo/data/bundle.js +1 -1
  126. package/demo/data/donut.d.ts +23 -0
  127. package/demo/data/donut.js +25 -0
  128. package/demo/data/donut.js.map +1 -1
  129. package/demo/data/index.js +189 -7
  130. package/demo/data/index.js.map +1 -1
  131. package/demo/data/line.d.ts +70 -0
  132. package/demo/data/line.js +71 -0
  133. package/demo/data/line.js.map +1 -1
  134. package/demo/data/pie.d.ts +13 -0
  135. package/demo/data/pie.js +15 -0
  136. package/demo/data/pie.js.map +1 -1
  137. package/demo/data/radar.js.map +1 -1
  138. package/demo/data/scatter.d.ts +31 -0
  139. package/demo/data/scatter.js +33 -0
  140. package/demo/data/scatter.js.map +1 -1
  141. package/demo/data/step.d.ts +4 -0
  142. package/demo/data/step.js +15 -0
  143. package/demo/data/step.js.map +1 -1
  144. package/demo/data/time-series-axis.d.ts +55 -3
  145. package/demo/data/time-series-axis.js +62 -6
  146. package/demo/data/time-series-axis.js.map +1 -1
  147. package/demo/styles.css +342 -18
  148. package/demo/styles.css.map +1 -1
  149. package/demo/styles.min.css +1 -1
  150. package/demo/styles.min.css.map +1 -1
  151. package/demo/tsconfig.tsbuildinfo +232 -229
  152. package/index.js.map +1 -1
  153. package/interfaces/axis-scales.d.ts +22 -11
  154. package/interfaces/axis-scales.js.map +1 -1
  155. package/interfaces/charts.d.ts +5 -0
  156. package/interfaces/charts.js.map +1 -1
  157. package/interfaces/components.d.ts +21 -0
  158. package/interfaces/components.js.map +1 -1
  159. package/interfaces/enums.d.ts +9 -0
  160. package/interfaces/enums.js +10 -0
  161. package/interfaces/enums.js.map +1 -1
  162. package/interfaces/events.d.ts +7 -0
  163. package/interfaces/events.js +8 -0
  164. package/interfaces/events.js.map +1 -1
  165. package/model.d.ts +1 -0
  166. package/model.js +30 -16
  167. package/model.js.map +1 -1
  168. package/package.json +4 -2
  169. package/polyfills.js +7 -2
  170. package/polyfills.js.map +1 -1
  171. package/services/angle-utils.js +34 -9
  172. package/services/angle-utils.js.map +1 -1
  173. package/services/colors.js.map +1 -1
  174. package/services/curves.js +4 -2
  175. package/services/curves.js.map +1 -1
  176. package/services/essentials/dom-utils.js +4 -3
  177. package/services/essentials/dom-utils.js.map +1 -1
  178. package/services/essentials/transitions.js +3 -4
  179. package/services/essentials/transitions.js.map +1 -1
  180. package/services/scales-cartesian.d.ts +9 -1
  181. package/services/scales-cartesian.js +96 -23
  182. package/services/scales-cartesian.js.map +1 -1
  183. package/services/time-series.js +36 -19
  184. package/services/time-series.js.map +1 -1
  185. package/styles/components/_axis.scss +4 -0
  186. package/styles/components/_layout.scss +0 -1
  187. package/styles/components/_ruler.scss +5 -2
  188. package/styles/components/_skeleton.scss +56 -0
  189. package/styles/components/_threshold.scss +49 -0
  190. package/styles/components/_tooltip.scss +6 -5
  191. package/styles/components/index.scss +2 -0
  192. package/styles/graphs/_bubble.scss +1 -1
  193. package/styles/graphs/_radar.scss +4 -2
  194. package/styles/graphs/_scatter.scss +5 -1
  195. package/styles/mixins.scss +2 -2
  196. package/styles-g10.css +87 -4
  197. package/styles-g10.css.map +1 -1
  198. package/styles-g10.min.css +1 -1
  199. package/styles-g10.min.css.map +1 -1
  200. package/styles-g100.css +87 -4
  201. package/styles-g100.css.map +1 -1
  202. package/styles-g100.min.css +1 -1
  203. package/styles-g100.min.css.map +1 -1
  204. package/styles-g90.css +87 -4
  205. package/styles-g90.css.map +1 -1
  206. package/styles-g90.min.css +1 -1
  207. package/styles-g90.min.css.map +1 -1
  208. package/styles.css +87 -4
  209. package/styles.css.map +1 -1
  210. package/styles.min.css +1 -1
  211. package/styles.min.css.map +1 -1
  212. package/tools.js +25 -7
  213. package/tools.js.map +1 -1
  214. package/tsconfig.tsbuildinfo +169 -106
  215. package/demo/data/create-codesandbox.js.map +0 -1
@@ -27,13 +27,17 @@ var StackedBar = /** @class */ (function (_super) {
27
27
  // Highlight elements that match the hovered legend item
28
28
  _this.handleLegendOnHover = function (event) {
29
29
  var hoveredElement = event.detail.hoveredElement;
30
- _this.parent.selectAll("path.bar")
30
+ _this.parent
31
+ .selectAll("path.bar")
31
32
  .transition(_this.services.transitions.getTransition("legend-hover-bar"))
32
- .attr("opacity", function (d) { return (d.datasetLabel !== hoveredElement.datum()["key"]) ? 0.3 : 1; });
33
+ .attr("opacity", function (d) {
34
+ return d.datasetLabel !== hoveredElement.datum()["key"] ? 0.3 : 1;
35
+ });
33
36
  };
34
37
  // Un-highlight all elements
35
38
  _this.handleLegendMouseOut = function (event) {
36
- _this.parent.selectAll("path.bar")
39
+ _this.parent
40
+ .selectAll("path.bar")
37
41
  .transition(_this.services.transitions.getTransition("legend-mouseout-bar"))
38
42
  .attr("opacity", 1);
39
43
  };
@@ -59,26 +63,28 @@ var StackedBar = /** @class */ (function (_super) {
59
63
  var stackKeys = map(displayData, function (datum) { return datum[domainIdentifier]; }).keys();
60
64
  var stackData = this.model.getStackedData();
61
65
  // Update data on all bar groups
62
- var barGroups = svg.selectAll("g.bars")
63
- .data(stackData, function (d) { return d.key; });
66
+ var barGroups = svg.selectAll("g.bars").data(stackData, function (d) { return d.key; });
64
67
  // Remove elements that need to be exited
65
68
  // We need exit at the top here to make sure that
66
69
  // Data filters are processed before entering new elements
67
70
  // Or updating existing ones
68
- barGroups.exit()
71
+ barGroups
72
+ .exit()
69
73
  .attr("opacity", 0)
70
74
  .remove();
71
75
  // Add bar groups that need to be introduced
72
- barGroups.enter()
76
+ barGroups
77
+ .enter()
73
78
  .append("g")
74
79
  .classed("bars", true)
75
80
  .attr("role", Roles.GROUP);
76
81
  // Update data on all bars
77
- var bars = svg.selectAll("g.bars").selectAll("path.bar")
82
+ var bars = svg
83
+ .selectAll("g.bars")
84
+ .selectAll("path.bar")
78
85
  .data(function (data) { return data; });
79
86
  // Remove bars that need to be removed
80
- bars.exit()
81
- .remove();
87
+ bars.exit().remove();
82
88
  bars.enter()
83
89
  .append("path")
84
90
  .merge(bars)
@@ -88,19 +94,22 @@ var StackedBar = /** @class */ (function (_super) {
88
94
  .attr("d", function (d, i) {
89
95
  var key = stackKeys[i];
90
96
  /*
91
- * Orientation support for horizontal/vertical bar charts
92
- * Determine coordinates needed for a vertical set of paths
93
- * to draw the bars needed, and pass those coordinates down to
94
- * generateSVGPathString() to decide whether it needs to flip them
95
- */
97
+ * Orientation support for horizontal/vertical bar charts
98
+ * Determine coordinates needed for a vertical set of paths
99
+ * to draw the bars needed, and pass those coordinates down to
100
+ * generateSVGPathString() to decide whether it needs to flip them
101
+ */
96
102
  var barWidth = _this.getBarWidth();
97
- var x0 = _this.services.cartesianScales.getDomainValue(key, i) - barWidth / 2;
103
+ var x0 = _this.services.cartesianScales.getDomainValue(key, i) -
104
+ barWidth / 2;
98
105
  var x1 = x0 + barWidth;
99
106
  var y0 = _this.services.cartesianScales.getRangeValue(d[0], i);
100
107
  var y1 = _this.services.cartesianScales.getRangeValue(d[1], i);
101
108
  // Add the divider gap
102
- if (Math.abs(y1 - y0) > 0 && Math.abs(y1 - y0) > options.bars.dividerSize) {
103
- if (_this.services.cartesianScales.getOrientation() === CartesianOrientations.VERTICAL) {
109
+ if (Math.abs(y1 - y0) > 0 &&
110
+ Math.abs(y1 - y0) > options.bars.dividerSize) {
111
+ if (_this.services.cartesianScales.getOrientation() ===
112
+ CartesianOrientations.VERTICAL) {
104
113
  y1 += 1;
105
114
  }
106
115
  else {
@@ -121,11 +130,17 @@ var StackedBar = /** @class */ (function (_super) {
121
130
  var options = this.model.getOptions();
122
131
  var groupMapsTo = options.data.groupMapsTo;
123
132
  var self = this;
124
- this.parent.selectAll("path.bar")
133
+ this.parent
134
+ .selectAll("path.bar")
125
135
  .on("mouseover", function (datum) {
126
136
  var hoveredElement = select(this);
127
- hoveredElement.transition(self.services.transitions.getTransition("graph_element_mouseover_fill_update"))
128
- .attr("fill", color(hoveredElement.attr("fill")).darker(0.7).toString());
137
+ hoveredElement
138
+ .transition(self.services.transitions.getTransition("graph_element_mouseover_fill_update"))
139
+ .attr("fill", function (d) {
140
+ return color(self.model.getFillColor(d[groupMapsTo]))
141
+ .darker(0.7)
142
+ .toString();
143
+ });
129
144
  // Dispatch mouse event
130
145
  self.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {
131
146
  element: hoveredElement,
@@ -140,9 +155,10 @@ var StackedBar = /** @class */ (function (_super) {
140
155
  var rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();
141
156
  var groupMapsTo = self.model.getOptions().data.groupMapsTo;
142
157
  var matchingDataPoint = displayData.find(function (d) {
143
- return d[rangeIdentifier] === datum.data[datum.group] &&
144
- d[domainIdentifier].toString() === datum.data.sharedStackKey &&
145
- d[groupMapsTo] === datum.group;
158
+ return (d[rangeIdentifier] === datum.data[datum.group] &&
159
+ d[domainIdentifier].toString() ===
160
+ datum.data.sharedStackKey &&
161
+ d[groupMapsTo] === datum.group);
146
162
  });
147
163
  if (matchingDataPoint === undefined) {
148
164
  matchingDataPoint = (_a = {},
@@ -168,20 +184,26 @@ var StackedBar = /** @class */ (function (_super) {
168
184
  .on("mouseout", function (datum) {
169
185
  var hoveredElement = select(this);
170
186
  hoveredElement.classed("hovered", false);
171
- hoveredElement.transition(self.services.transitions.getTransition("graph_element_mouseout_fill_update"))
172
- .attr("fill", function (d) { return self.model.getFillColor(d[groupMapsTo]); });
187
+ hoveredElement
188
+ .transition(self.services.transitions.getTransition("graph_element_mouseout_fill_update"))
189
+ .attr("fill", function (d) {
190
+ return self.model.getFillColor(d[groupMapsTo]);
191
+ });
173
192
  // Dispatch mouse event
174
193
  self.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {
175
194
  element: hoveredElement,
176
195
  datum: datum
177
196
  });
178
197
  // Hide tooltip
179
- self.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement: hoveredElement });
198
+ self.services.events.dispatchEvent(Events.Tooltip.HIDE, {
199
+ hoveredElement: hoveredElement
200
+ });
180
201
  });
181
202
  };
182
203
  StackedBar.prototype.destroy = function () {
183
204
  // Remove event listeners
184
- this.parent.selectAll("path.bar")
205
+ this.parent
206
+ .selectAll("path.bar")
185
207
  .on("mouseover", null)
186
208
  .on("mousemove", null)
187
209
  .on("mouseout", null);
@@ -1 +1 @@
1
- {"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from \"../../tools\";\nimport { Bar } from \"./bar\";\nimport {\n\tRoles,\n\tTooltipTypes,\n\tEvents,\n\tCartesianOrientations\n} from \"../../interfaces\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { color } from \"d3-color\";\nimport { map } from \"d3-collection\";\n\nexport class StackedBar extends Bar {\n\ttype = \"stacked-bar\";\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\trender(animate: boolean) {\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\t// Chart options mixed with the internal configurations\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst stackKeys = map(displayData, datum => datum[domainIdentifier]).keys();\n\t\tconst stackData = this.model.getStackedData();\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg.selectAll(\"g.bars\")\n\t\t\t.data(stackData, d => d.key);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups.enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"bars\", true)\n\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\t// Update data on all bars\n\t\tconst bars = svg.selectAll(\"g.bars\").selectAll(\"path.bar\")\n\t\t\t.data(data => data);\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit()\n\t\t\t.remove();\n\n\t\tbars.enter()\n\t\t\t.append(\"path\")\n\t\t\t.merge(bars)\n\t\t\t.classed(\"bar\", true)\n\t\t\t.transition(this.services.transitions.getTransition(\"bar-update-enter\", animate))\n\t\t\t.attr(\"fill\", d => this.model.getFillColor(d[groupMapsTo]))\n\t\t\t.attr(\"d\", (d, i) => {\n\t\t\t\tconst key = stackKeys[i];\n\n\t\t\t\t/*\n\t\t\t\t* Orientation support for horizontal/vertical bar charts\n\t\t\t\t* Determine coordinates needed for a vertical set of paths\n\t\t\t\t* to draw the bars needed, and pass those coordinates down to\n\t\t\t\t* generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t*/\n\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\tconst x0 = this.services.cartesianScales.getDomainValue(key, i) - barWidth / 2;\n\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\tconst y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t// Add the divider gap\n\t\t\t\tif (Math.abs(y1 - y0) > 0 && Math.abs(y1 - y0) > options.bars.dividerSize) {\n\t\t\t\t\tif (this.services.cartesianScales.getOrientation() === CartesianOrientations.VERTICAL) {\n\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\tthis.services.cartesianScales.getOrientation()\n\t\t\t\t);\n\t\t\t})\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"bar\")\n\t\t\t.attr(\"aria-label\", d => d.value);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-bar\"))\n\t\t\t.attr(\"opacity\", d => (d.datasetLabel !== hoveredElement.datum()[\"key\"]) ? 0.3 : 1);\n\t}\n\n\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-bar\"))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n\n\taddEventListeners() {\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst self = this;\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseover_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", color(hoveredElement.attr(\"fill\")).darker(0.7).toString());\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst displayData = self.model.getDisplayData();\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier();\n\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();\n\t\t\t\tconst { groupMapsTo } = self.model.getOptions().data;\n\n\t\t\t\tlet matchingDataPoint = displayData.find(d => {\n\t\t\t\t\treturn d[rangeIdentifier] === datum.data[datum.group] &&\n\t\t\t\t\t\td[domainIdentifier].toString() === datum.data.sharedStackKey &&\n\t\t\t\t\t\td[groupMapsTo] === datum.group;\n\t\t\t\t});\n\n\t\t\t\tif (matchingDataPoint === undefined) {\n\t\t\t\t\tmatchingDataPoint = {\n\t\t\t\t\t\t[domainIdentifier]: datum.data.sharedStackKey,\n\t\t\t\t\t\t[rangeIdentifier]: datum.data[datum.group],\n\t\t\t\t\t\t[groupMapsTo]: datum.group\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tdata: matchingDataPoint,\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseout_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", (d: any) => self.model.getFillColor(d[groupMapsTo]));\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement });\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n}\n"]}
1
+ {"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EACN,KAAK,EACL,YAAY,EACZ,MAAM,EACN,qBAAqB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC;IAAgC,8BAAG;IAAnC;QAAA,qEAoQC;QAnQA,UAAI,GAAG,aAAa,CAAC;QA0HrB,wDAAwD;QACxD,yBAAmB,GAAG,UAAC,KAAkB;YAChC,IAAA,4CAAc,CAAkB;YAExC,KAAI,CAAC,MAAM;iBACT,SAAS,CAAC,UAAU,CAAC;iBACrB,UAAU,CACV,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAC3D;iBACA,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC;gBACjB,OAAA,CAAC,CAAC,YAAY,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAA1D,CAA0D,CAC1D,CAAC;QACJ,CAAC,CAAC;QAEF,4BAA4B;QAC5B,0BAAoB,GAAG,UAAC,KAAkB;YACzC,KAAI,CAAC,MAAM;iBACT,SAAS,CAAC,UAAU,CAAC;iBACrB,UAAU,CACV,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAC9D;iBACA,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC;;IAmHH,CAAC;IAjQA,yBAAI,GAAJ;QACC,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE5C,iDAAiD;QACjD,cAAc,CAAC,gBAAgB,CAC9B,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,IAAI,CAAC,mBAAmB,CACxB,CAAC;QAEF,gDAAgD;QAChD,cAAc,CAAC,gBAAgB,CAC9B,MAAM,CAAC,MAAM,CAAC,aAAa,EAC3B,IAAI,CAAC,oBAAoB,CACzB,CAAC;IACH,CAAC;IAED,2BAAM,GAAN,UAAO,OAAgB;QAAvB,iBAsGC;QArGA,qBAAqB;QACrB,IAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEnC,uDAAuD;QACvD,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,IAAA,sCAAW,CAAkB;QAErC,IAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC;QAE7E,+DAA+D;QAC/D,IAAM,SAAS,GAAG,GAAG,CACpB,WAAW,EACX,UAAA,KAAK,IAAI,OAAA,KAAK,CAAC,gBAAgB,CAAC,EAAvB,CAAuB,CAChC,CAAC,IAAI,EAAE,CAAC;QACT,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAE9C,gCAAgC;QAChC,IAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAC;QAEtE,yCAAyC;QACzC,iDAAiD;QACjD,0DAA0D;QAC1D,4BAA4B;QAC5B,SAAS;aACP,IAAI,EAAE;aACN,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;aAClB,MAAM,EAAE,CAAC;QAEX,4CAA4C;QAC5C,SAAS;aACP,KAAK,EAAE;aACP,MAAM,CAAC,GAAG,CAAC;aACX,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;aACrB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAE5B,0BAA0B;QAC1B,IAAM,IAAI,GAAG,GAAG;aACd,SAAS,CAAC,QAAQ,CAAC;aACnB,SAAS,CAAC,UAAU,CAAC;aACrB,IAAI,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,EAAJ,CAAI,CAAC,CAAC;QAErB,sCAAsC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QAErB,IAAI,CAAC,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC;aACd,KAAK,CAAC,IAAI,CAAC;aACX,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;aACpB,UAAU,CACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CACtC,kBAAkB,EAClB,OAAO,CACP,CACD;aACA,IAAI,CAAC,MAAM,EAAE,UAAA,CAAC,IAAI,OAAA,KAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAvC,CAAuC,CAAC;aAC1D,IAAI,CAAC,GAAG,EAAE,UAAC,CAAC,EAAE,CAAC;YACf,IAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAEzB;;;;;eAKG;YACH,IAAM,QAAQ,GAAG,KAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAM,EAAE,GACP,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpD,QAAQ,GAAG,CAAC,CAAC;YACd,IAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;YACzB,IAAM,EAAE,GAAG,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,EAAE,GAAG,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAE9D,sBAAsB;YACtB,IACC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAC3C;gBACD,IACC,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE;oBAC9C,qBAAqB,CAAC,QAAQ,EAC7B;oBACD,EAAE,IAAI,CAAC,CAAC;iBACR;qBAAM;oBACN,EAAE,IAAI,CAAC,CAAC;iBACR;aACD;YAED,OAAO,KAAK,CAAC,qBAAqB,CACjC,EAAE,EAAE,IAAA,EAAE,EAAE,IAAA,EAAE,EAAE,IAAA,EAAE,EAAE,IAAA,EAAE,EAClB,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,CAC9C,CAAC;QACH,CAAC,CAAC;aACD,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACnB,OAAO;aACN,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;aACnC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;aACnC,IAAI,CAAC,YAAY,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAAC,CAAC;QAEnC,6CAA6C;QAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IA0BD,sCAAiB,GAAjB;QACC,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,IAAA,sCAAW,CAAkB;QAErC,IAAM,IAAI,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM;aACT,SAAS,CAAC,UAAU,CAAC;aACrB,EAAE,CAAC,WAAW,EAAE,UAAS,KAAK;YAC9B,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpC,cAAc;iBACZ,UAAU,CACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CACtC,qCAAqC,CACrC,CACD;iBACA,IAAI,CAAC,MAAM,EAAE,UAAC,CAAM;gBACpB,OAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;qBAC5C,MAAM,CAAC,GAAG,CAAC;qBACX,QAAQ,EAAE;YAFZ,CAEY,CACZ,CAAC;YAEH,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC5D,OAAO,EAAE,cAAc;gBACvB,KAAK,OAAA;aACL,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,WAAW,EAAE,UAAS,KAAK;;YAC9B,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAChD,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC;YAC7E,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;YACnE,IAAA,sDAAW,CAAkC;YAErD,IAAI,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,UAAA,CAAC;gBACzC,OAAO,CACN,CAAC,CAAC,eAAe,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC9C,CAAC,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;wBAC7B,KAAK,CAAC,IAAI,CAAC,cAAc;oBAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC,KAAK,CAC9B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,iBAAiB,KAAK,SAAS,EAAE;gBACpC,iBAAiB;oBAChB,GAAC,gBAAgB,IAAG,KAAK,CAAC,IAAI,CAAC,cAAc;oBAC7C,GAAC,eAAe,IAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC1C,GAAC,WAAW,IAAG,KAAK,CAAC,KAAK;uBAC1B,CAAC;aACF;YAED,eAAe;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;gBACvD,cAAc,gBAAA;gBACd,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,YAAY,CAAC,SAAS;aAC5B,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,UAAS,KAAK;YAC1B,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE;gBACxD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;gBACrB,KAAK,OAAA;aACL,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,UAAU,EAAE,UAAS,KAAK;YAC7B,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEzC,cAAc;iBACZ,UAAU,CACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CACtC,oCAAoC,CACpC,CACD;iBACA,IAAI,CAAC,MAAM,EAAE,UAAC,CAAM;gBACpB,OAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAAvC,CAAuC,CACvC,CAAC;YAEH,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE;gBAC3D,OAAO,EAAE,cAAc;gBACvB,KAAK,OAAA;aACL,CAAC,CAAC;YAEH,eAAe;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;gBACvD,cAAc,gBAAA;aACd,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4BAAO,GAAP;QACC,yBAAyB;QACzB,IAAI,CAAC,MAAM;aACT,SAAS,CAAC,UAAU,CAAC;aACrB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;aACrB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;aACrB,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEvB,0BAA0B;QAC1B,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,cAAc,CAAC,mBAAmB,CACjC,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,IAAI,CAAC,mBAAmB,CACxB,CAAC;QACF,cAAc,CAAC,mBAAmB,CACjC,MAAM,CAAC,MAAM,CAAC,aAAa,EAC3B,IAAI,CAAC,oBAAoB,CACzB,CAAC;IACH,CAAC;IACF,iBAAC;AAAD,CAAC,AApQD,CAAgC,GAAG,GAoQlC","sourcesContent":["// Internal Imports\nimport { Tools } from \"../../tools\";\nimport { Bar } from \"./bar\";\nimport {\n\tRoles,\n\tTooltipTypes,\n\tEvents,\n\tCartesianOrientations\n} from \"../../interfaces\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { color } from \"d3-color\";\nimport { map } from \"d3-collection\";\n\nexport class StackedBar extends Bar {\n\ttype = \"stacked-bar\";\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n\n\trender(animate: boolean) {\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\t// Chart options mixed with the internal configurations\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst stackKeys = map(\n\t\t\tdisplayData,\n\t\t\tdatum => datum[domainIdentifier]\n\t\t).keys();\n\t\tconst stackData = this.model.getStackedData();\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg.selectAll(\"g.bars\").data(stackData, d => d.key);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups\n\t\t\t.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups\n\t\t\t.enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"bars\", true)\n\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\t// Update data on all bars\n\t\tconst bars = svg\n\t\t\t.selectAll(\"g.bars\")\n\t\t\t.selectAll(\"path.bar\")\n\t\t\t.data(data => data);\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit().remove();\n\n\t\tbars.enter()\n\t\t\t.append(\"path\")\n\t\t\t.merge(bars)\n\t\t\t.classed(\"bar\", true)\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\"bar-update-enter\",\n\t\t\t\t\tanimate\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"fill\", d => this.model.getFillColor(d[groupMapsTo]))\n\t\t\t.attr(\"d\", (d, i) => {\n\t\t\t\tconst key = stackKeys[i];\n\n\t\t\t\t/*\n\t\t\t\t * Orientation support for horizontal/vertical bar charts\n\t\t\t\t * Determine coordinates needed for a vertical set of paths\n\t\t\t\t * to draw the bars needed, and pass those coordinates down to\n\t\t\t\t * generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t */\n\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\tconst x0 =\n\t\t\t\t\tthis.services.cartesianScales.getDomainValue(key, i) -\n\t\t\t\t\tbarWidth / 2;\n\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\tconst y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t// Add the divider gap\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(y1 - y0) > 0 &&\n\t\t\t\t\tMath.abs(y1 - y0) > options.bars.dividerSize\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.services.cartesianScales.getOrientation() ===\n\t\t\t\t\t\tCartesianOrientations.VERTICAL\n\t\t\t\t\t) {\n\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\tthis.services.cartesianScales.getOrientation()\n\t\t\t\t);\n\t\t\t})\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"bar\")\n\t\t\t.attr(\"aria-label\", d => d.value);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent\n\t\t\t.selectAll(\"path.bar\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-hover-bar\")\n\t\t\t)\n\t\t\t.attr(\"opacity\", d =>\n\t\t\t\td.datasetLabel !== hoveredElement.datum()[\"key\"] ? 0.3 : 1\n\t\t\t);\n\t};\n\n\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent\n\t\t\t.selectAll(\"path.bar\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-mouseout-bar\")\n\t\t\t)\n\t\t\t.attr(\"opacity\", 1);\n\t};\n\n\taddEventListeners() {\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst self = this;\n\t\tthis.parent\n\t\t\t.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement\n\t\t\t\t\t.transition(\n\t\t\t\t\t\tself.services.transitions.getTransition(\n\t\t\t\t\t\t\t\"graph_element_mouseover_fill_update\"\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\"fill\", (d: any) =>\n\t\t\t\t\t\tcolor(self.model.getFillColor(d[groupMapsTo]))\n\t\t\t\t\t\t\t.darker(0.7)\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst displayData = self.model.getDisplayData();\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier();\n\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();\n\t\t\t\tconst { groupMapsTo } = self.model.getOptions().data;\n\n\t\t\t\tlet matchingDataPoint = displayData.find(d => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\td[rangeIdentifier] === datum.data[datum.group] &&\n\t\t\t\t\t\td[domainIdentifier].toString() ===\n\t\t\t\t\t\t\tdatum.data.sharedStackKey &&\n\t\t\t\t\t\td[groupMapsTo] === datum.group\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (matchingDataPoint === undefined) {\n\t\t\t\t\tmatchingDataPoint = {\n\t\t\t\t\t\t[domainIdentifier]: datum.data.sharedStackKey,\n\t\t\t\t\t\t[rangeIdentifier]: datum.data[datum.group],\n\t\t\t\t\t\t[groupMapsTo]: datum.group\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tdata: matchingDataPoint,\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\thoveredElement\n\t\t\t\t\t.transition(\n\t\t\t\t\t\tself.services.transitions.getTransition(\n\t\t\t\t\t\t\t\"graph_element_mouseout_fill_update\"\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\"fill\", (d: any) =>\n\t\t\t\t\t\tself.model.getFillColor(d[groupMapsTo])\n\t\t\t\t\t);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, {\n\t\t\t\t\thoveredElement\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent\n\t\t\t.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  import { Component } from "../component";
2
2
  export declare class Bar extends Component {
3
- protected getBarWidth(): number;
3
+ protected getBarWidth(allDataLabels?: string[]): number;
4
4
  }
@@ -19,7 +19,7 @@ var Bar = /** @class */ (function (_super) {
19
19
  return _super !== null && _super.apply(this, arguments) || this;
20
20
  }
21
21
  // Gets the correct width for bars based on options & configurations
22
- Bar.prototype.getBarWidth = function () {
22
+ Bar.prototype.getBarWidth = function (allDataLabels) {
23
23
  var options = this.model.getOptions();
24
24
  var mainXScale = this.services.cartesianScales.getMainXScale();
25
25
  if (!mainXScale.step) {
@@ -1 +1 @@
1
- {"version":3,"file":"bar.js","sourceRoot":"","sources":["bar.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;IAAyB,uBAAS;IAAlC;;IAkBA,CAAC;IAjBA,oEAAoE;IAC1D,yBAAW,GAArB;QACC,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,IAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAEjE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,OAAO,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EACrB,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CACvD,CAAC;SACF;QAED,OAAO,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EACrB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CACrB,CAAC;IACH,CAAC;IACF,UAAC;AAAD,CAAC,AAlBD,CAAyB,SAAS,GAkBjC","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\n\nexport class Bar extends Component {\n\t// Gets the correct width for bars based on options & configurations\n\tprotected getBarWidth() {\n\t\tconst options = this.model.getOptions();\n\t\tconst mainXScale = this.services.cartesianScales.getMainXScale();\n\n\t\tif (!mainXScale.step) {\n\t\t\treturn Math.min(\n\t\t\t\toptions.bars.maxWidth,\n\t\t\t\t(5 / mainXScale.ticks().length) * options.bars.maxWidth\n\t\t\t);\n\t\t}\n\n\t\treturn Math.min(\n\t\t\toptions.bars.maxWidth,\n\t\t\tmainXScale.step() / 2\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"bar.js","sourceRoot":"","sources":["bar.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;IAAyB,uBAAS;IAAlC;;IAeA,CAAC;IAdA,oEAAoE;IAC1D,yBAAW,GAArB,UAAsB,aAAwB;QAC7C,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,IAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAEjE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,OAAO,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EACrB,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CACvD,CAAC;SACF;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IACF,UAAC;AAAD,CAAC,AAfD,CAAyB,SAAS,GAejC","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\n\nexport class Bar extends Component {\n\t// Gets the correct width for bars based on options & configurations\n\tprotected getBarWidth(allDataLabels?: string[]) {\n\t\tconst options = this.model.getOptions();\n\t\tconst mainXScale = this.services.cartesianScales.getMainXScale();\n\n\t\tif (!mainXScale.step) {\n\t\t\treturn Math.min(\n\t\t\t\toptions.bars.maxWidth,\n\t\t\t\t(5 / mainXScale.ticks().length) * options.bars.maxWidth\n\t\t\t);\n\t\t}\n\n\t\treturn Math.min(options.bars.maxWidth, mainXScale.step() / 2);\n\t}\n}\n"]}
@@ -29,14 +29,19 @@ var Bubble = /** @class */ (function (_super) {
29
29
  var radiusMapsTo = options.bubble.radiusMapsTo;
30
30
  var data = selection.data();
31
31
  // Filter out any null/undefined values
32
- var allRadii = data.map(function (d) { return d[radiusMapsTo]; }).filter(function (radius) { return radius; });
32
+ var allRadii = data
33
+ .map(function (d) { return d[radiusMapsTo]; })
34
+ .filter(function (radius) { return radius; });
33
35
  var chartSize = DOMUtils.getSVGElementSize(this.services.domUtils.getMainSVG(), { useAttr: true });
34
36
  // We need the ternary operator here in case the user
35
37
  // doesn't provide radius values in data
36
38
  var radiusDataIsValid = allRadii.length > 0;
37
39
  var domain = radiusDataIsValid ? extent(allRadii) : [1, 1];
38
- return scaleLinear().domain(domain)
39
- .range(radiusDataIsValid ? options.bubble.radiusRange(chartSize, data) : [4, 4]);
40
+ return scaleLinear()
41
+ .domain(domain)
42
+ .range(radiusDataIsValid
43
+ ? options.bubble.radiusRange(chartSize, data)
44
+ : [4, 4]);
40
45
  };
41
46
  Bubble.prototype.styleCircles = function (selection, animate) {
42
47
  var _this = this;
@@ -46,17 +51,26 @@ var Bubble = /** @class */ (function (_super) {
46
51
  var radiusScale = this.getRadiusScale(selection);
47
52
  var groupMapsTo = options.data.groupMapsTo;
48
53
  var domainIdentifier = this.services.cartesianScales.getDomainIdentifier();
49
- selection.raise()
54
+ selection
55
+ .raise()
50
56
  .classed("dot", true)
51
57
  .attr("role", Roles.GRAPHICS_SYMBOL)
52
- .attr("cx", function (d, i) { return _this.services.cartesianScales.getDomainValue(d, i); })
58
+ .attr("cx", function (d, i) {
59
+ return _this.services.cartesianScales.getDomainValue(d, i);
60
+ })
53
61
  .transition(this.services.transitions.getTransition("bubble-update-enter", animate))
54
- .attr("cy", function (d, i) { return _this.services.cartesianScales.getRangeValue(d, i); })
62
+ .attr("cy", function (d, i) {
63
+ return _this.services.cartesianScales.getRangeValue(d, i);
64
+ })
55
65
  // We need `|| 1` here in case the user doesn't provide radius values in data
56
66
  .attr("r", function (d) { return radiusScale(d[radiusMapsTo] || 1); })
57
- .attr("fill", function (d) { return _this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d); })
67
+ .attr("fill", function (d) {
68
+ return _this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d);
69
+ })
58
70
  .attr("fill-opacity", options.bubble.fillOpacity)
59
- .attr("stroke", function (d) { return _this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d); })
71
+ .attr("stroke", function (d) {
72
+ return _this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d);
73
+ })
60
74
  .attr("opacity", 1);
61
75
  };
62
76
  return Bubble;
@@ -1 +1 @@
1
- {"version":3,"file":"bubble.js","sourceRoot":"","sources":["bubble.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Scatter } from \"./scatter\";\nimport { DOMUtils } from \"../../services\";\nimport { Roles } from \"../../interfaces\";\n\n// D3 Imports\nimport { Selection } from \"d3-selection\";\nimport { extent } from \"d3-array\";\nimport { scaleLinear } from \"d3-scale\";\n\nexport class Bubble extends Scatter {\n\ttype = \"bubble\";\n\n\tgetRadiusScale(selection: Selection<any, any, any, any>) {\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst data = selection.data();\n\t\t// Filter out any null/undefined values\n\t\tconst allRadii = data.map(d => d[radiusMapsTo]).filter(radius => radius);\n\t\tconst chartSize = DOMUtils.getSVGElementSize(this.services.domUtils.getMainSVG(), { useAttr: true });\n\n\t\t// We need the ternary operator here in case the user\n\t\t// doesn't provide radius values in data\n\t\tconst radiusDataIsValid = allRadii.length > 0;\n\t\tconst domain = radiusDataIsValid ? extent(allRadii) : [1, 1];\n\t\treturn scaleLinear().domain(domain)\n\t\t\t.range(radiusDataIsValid ? options.bubble.radiusRange(chartSize, data) : [4, 4]);\n\t}\n\n\tstyleCircles(selection: Selection<any, any, any, any>, animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst radiusScale = this.getRadiusScale(selection);\n\n\t\tconst { groupMapsTo } = options.data;\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\tselection.raise()\n\t\t\t.classed(\"dot\", true)\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"cx\", (d, i) => this.services.cartesianScales.getDomainValue(d, i))\n\t\t\t.transition(this.services.transitions.getTransition(\"bubble-update-enter\", animate))\n\t\t\t.attr(\"cy\", (d, i) => this.services.cartesianScales.getRangeValue(d, i))\n\t\t\t// We need `|| 1` here in case the user doesn't provide radius values in data\n\t\t\t.attr(\"r\", d => radiusScale(d[radiusMapsTo] || 1))\n\t\t\t.attr(\"fill\", d => this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d))\n\t\t\t.attr(\"fill-opacity\", options.bubble.fillOpacity)\n\t\t\t.attr(\"stroke\", d => this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n}\n"]}
1
+ {"version":3,"file":"bubble.js","sourceRoot":"","sources":["bubble.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Scatter } from \"./scatter\";\nimport { DOMUtils } from \"../../services\";\nimport { Roles } from \"../../interfaces\";\n\n// D3 Imports\nimport { Selection } from \"d3-selection\";\nimport { extent } from \"d3-array\";\nimport { scaleLinear } from \"d3-scale\";\n\nexport class Bubble extends Scatter {\n\ttype = \"bubble\";\n\n\tgetRadiusScale(selection: Selection<any, any, any, any>) {\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst data = selection.data();\n\t\t// Filter out any null/undefined values\n\t\tconst allRadii = data\n\t\t\t.map(d => d[radiusMapsTo])\n\t\t\t.filter(radius => radius);\n\t\tconst chartSize = DOMUtils.getSVGElementSize(\n\t\t\tthis.services.domUtils.getMainSVG(),\n\t\t\t{ useAttr: true }\n\t\t);\n\n\t\t// We need the ternary operator here in case the user\n\t\t// doesn't provide radius values in data\n\t\tconst radiusDataIsValid = allRadii.length > 0;\n\t\tconst domain = radiusDataIsValid ? extent(allRadii) : [1, 1];\n\t\treturn scaleLinear()\n\t\t\t.domain(domain)\n\t\t\t.range(\n\t\t\t\tradiusDataIsValid\n\t\t\t\t\t? options.bubble.radiusRange(chartSize, data)\n\t\t\t\t\t: [4, 4]\n\t\t\t);\n\t}\n\n\tstyleCircles(selection: Selection<any, any, any, any>, animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst radiusScale = this.getRadiusScale(selection);\n\n\t\tconst { groupMapsTo } = options.data;\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\tselection\n\t\t\t.raise()\n\t\t\t.classed(\"dot\", true)\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"cx\", (d, i) =>\n\t\t\t\tthis.services.cartesianScales.getDomainValue(d, i)\n\t\t\t)\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\"bubble-update-enter\",\n\t\t\t\t\tanimate\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"cy\", (d, i) =>\n\t\t\t\tthis.services.cartesianScales.getRangeValue(d, i)\n\t\t\t)\n\t\t\t// We need `|| 1` here in case the user doesn't provide radius values in data\n\t\t\t.attr(\"r\", d => radiusScale(d[radiusMapsTo] || 1))\n\t\t\t.attr(\"fill\", d =>\n\t\t\t\tthis.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d)\n\t\t\t)\n\t\t\t.attr(\"fill-opacity\", options.bubble.fillOpacity)\n\t\t\t.attr(\"stroke\", d =>\n\t\t\t\tthis.model.getStrokeColor(\n\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\td\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"opacity\", 1);\n\t}\n}\n"]}
@@ -30,6 +30,14 @@ var Donut = /** @class */ (function (_super) {
30
30
  // Call render() from Pie
31
31
  _super.prototype.render.call(this, animate);
32
32
  var self = this;
33
+ // if there are no data, remove the center content
34
+ // that is the old one and do nothing
35
+ if (this.model.isDataEmpty()) {
36
+ this.getContainerSVG()
37
+ .select("g.center")
38
+ .remove();
39
+ return;
40
+ }
33
41
  var svg = DOMUtils.appendOrSelect(this.getContainerSVG(), "g.center");
34
42
  var options = this.model.getOptions();
35
43
  // Compute the outer radius needed
@@ -37,7 +45,9 @@ var Donut = /** @class */ (function (_super) {
37
45
  // Add the number shown in the center of the donut
38
46
  DOMUtils.appendOrSelect(svg, "text.donut-figure")
39
47
  .attr("text-anchor", "middle")
40
- .style("font-size", function () { return options.donut.center.numberFontSize(radius); })
48
+ .style("font-size", function () {
49
+ return options.donut.center.numberFontSize(radius);
50
+ })
41
51
  .transition(this.services.transitions.getTransition("donut-figure-enter-update", animate))
42
52
  .tween("text", function () {
43
53
  return self.centerNumberTween(select(this));
@@ -45,7 +55,9 @@ var Donut = /** @class */ (function (_super) {
45
55
  // Add the label below the number in the center of the donut
46
56
  DOMUtils.appendOrSelect(svg, "text.donut-title")
47
57
  .attr("text-anchor", "middle")
48
- .style("font-size", function () { return options.donut.center.titleFontSize(radius); })
58
+ .style("font-size", function () {
59
+ return options.donut.center.titleFontSize(radius);
60
+ })
49
61
  .attr("y", options.donut.center.titleYPosition(radius))
50
62
  .text(Tools.getProperty(options, "donut", "center", "label"));
51
63
  };
@@ -58,7 +70,9 @@ var Donut = /** @class */ (function (_super) {
58
70
  var options = this.model.getOptions();
59
71
  var donutCenterFigure = Tools.getProperty(options, "donut", "center", "number");
60
72
  if (donutCenterFigure === null) {
61
- donutCenterFigure = this.model.getDisplayData().reduce(function (accumulator, d) {
73
+ donutCenterFigure = this.model
74
+ .getDisplayData()
75
+ .reduce(function (accumulator, d) {
62
76
  return accumulator + d.value;
63
77
  }, 0);
64
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"donut.js","sourceRoot":"","sources":["donut.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Pie } from \"./pie\";\nimport { DOMUtils } from \"../../services\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { interpolateNumber, interpolateRound } from \"d3-interpolate\";\n\nexport class Donut extends Pie {\n\ttype = \"donut\";\n\n\trender(animate = true) {\n\t\t// Call render() from Pie\n\t\tsuper.render(animate);\n\n\t\tconst self = this;\n\n\t\tconst svg = DOMUtils.appendOrSelect(this.getContainerSVG(), \"g.center\");\n\t\tconst options = this.model.getOptions();\n\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\t// Add the number shown in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-figure\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () => options.donut.center.numberFontSize(radius))\n\t\t\t.transition(this.services.transitions.getTransition(\"donut-figure-enter-update\", animate))\n\t\t\t.tween(\"text\", function() {\n\t\t\t\treturn self.centerNumberTween(select(this));\n\t\t\t});\n\n\t\t// Add the label below the number in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-title\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () => options.donut.center.titleFontSize(radius))\n\t\t\t.attr(\"y\", options.donut.center.titleYPosition(radius))\n\t\t\t.text(Tools.getProperty(options, \"donut\", \"center\", \"label\"));\n\t}\n\n\tgetInnerRadius() {\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\treturn radius * (3 / 4);\n\t}\n\n\tcenterNumberTween(d3Ref) {\n\t\tconst options = this.model.getOptions();\n\n\t\tlet donutCenterFigure = Tools.getProperty(options, \"donut\", \"center\", \"number\");\n\t\tif (donutCenterFigure === null) {\n\t\t\tdonutCenterFigure = this.model.getDisplayData().reduce((accumulator, d) => {\n\t\t\t\treturn accumulator + d.value;\n\t\t\t}, 0);\n\t\t}\n\n\t\t// Remove commas from the current value string, and convert to an int\n\t\tconst currentValue = parseInt(d3Ref.text().replace(/[, ]+/g, \"\"), 10) || 0;\n\n\t\tlet interpolateFunction;\n\t\tif (currentValue % 1 === 0 && donutCenterFigure % 1 === 0) {\n\t\t\tinterpolateFunction = interpolateRound;\n\t\t} else {\n\t\t\tinterpolateFunction = interpolateNumber;\n\t\t}\n\n\t\tconst i = interpolateFunction(currentValue, donutCenterFigure);\n\n\t\treturn t => {\n\t\t\tconst { numberFormatter } = options.donut.center;\n\t\t\td3Ref.text(numberFormatter(i(t)));\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"donut.js","sourceRoot":"","sources":["donut.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Pie } from \"./pie\";\nimport { DOMUtils } from \"../../services\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { interpolateNumber, interpolateRound } from \"d3-interpolate\";\n\nexport class Donut extends Pie {\n\ttype = \"donut\";\n\n\trender(animate = true) {\n\t\t// Call render() from Pie\n\t\tsuper.render(animate);\n\n\t\tconst self = this;\n\n\t\t// if there are no data, remove the center content\n\t\t// that is the old one and do nothing\n\t\tif (this.model.isDataEmpty()) {\n\t\t\tthis.getContainerSVG()\n\t\t\t\t.select(\"g.center\")\n\t\t\t\t.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tconst svg = DOMUtils.appendOrSelect(this.getContainerSVG(), \"g.center\");\n\t\tconst options = this.model.getOptions();\n\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\t// Add the number shown in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-figure\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () =>\n\t\t\t\toptions.donut.center.numberFontSize(radius)\n\t\t\t)\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\"donut-figure-enter-update\",\n\t\t\t\t\tanimate\n\t\t\t\t)\n\t\t\t)\n\t\t\t.tween(\"text\", function() {\n\t\t\t\treturn self.centerNumberTween(select(this));\n\t\t\t});\n\n\t\t// Add the label below the number in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-title\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () =>\n\t\t\t\toptions.donut.center.titleFontSize(radius)\n\t\t\t)\n\t\t\t.attr(\"y\", options.donut.center.titleYPosition(radius))\n\t\t\t.text(Tools.getProperty(options, \"donut\", \"center\", \"label\"));\n\t}\n\n\tgetInnerRadius() {\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\treturn radius * (3 / 4);\n\t}\n\n\tcenterNumberTween(d3Ref) {\n\t\tconst options = this.model.getOptions();\n\n\t\tlet donutCenterFigure = Tools.getProperty(\n\t\t\toptions,\n\t\t\t\"donut\",\n\t\t\t\"center\",\n\t\t\t\"number\"\n\t\t);\n\t\tif (donutCenterFigure === null) {\n\t\t\tdonutCenterFigure = this.model\n\t\t\t\t.getDisplayData()\n\t\t\t\t.reduce((accumulator, d) => {\n\t\t\t\t\treturn accumulator + d.value;\n\t\t\t\t}, 0);\n\t\t}\n\n\t\t// Remove commas from the current value string, and convert to an int\n\t\tconst currentValue =\n\t\t\tparseInt(d3Ref.text().replace(/[, ]+/g, \"\"), 10) || 0;\n\n\t\tlet interpolateFunction;\n\t\tif (currentValue % 1 === 0 && donutCenterFigure % 1 === 0) {\n\t\t\tinterpolateFunction = interpolateRound;\n\t\t} else {\n\t\t\tinterpolateFunction = interpolateNumber;\n\t\t}\n\n\t\tconst i = interpolateFunction(currentValue, donutCenterFigure);\n\n\t\treturn t => {\n\t\t\tconst { numberFormatter } = options.donut.center;\n\t\t\td3Ref.text(numberFormatter(i(t)));\n\t\t};\n\t}\n}\n"]}
@@ -24,7 +24,8 @@ var Line = /** @class */ (function (_super) {
24
24
  _this.type = "line";
25
25
  _this.handleLegendOnHover = function (event) {
26
26
  var hoveredElement = event.detail.hoveredElement;
27
- _this.parent.selectAll("g.lines")
27
+ _this.parent
28
+ .selectAll("g.lines")
28
29
  .transition(_this.services.transitions.getTransition("legend-hover-line"))
29
30
  .attr("opacity", function (group) {
30
31
  if (group.name !== hoveredElement.datum()["name"]) {
@@ -34,7 +35,8 @@ var Line = /** @class */ (function (_super) {
34
35
  });
35
36
  };
36
37
  _this.handleLegendMouseOut = function (event) {
37
- _this.parent.selectAll("g.lines")
38
+ _this.parent
39
+ .selectAll("g.lines")
38
40
  .transition(_this.services.transitions.getTransition("legend-mouseout-line"))
39
41
  .attr("opacity", Configuration.lines.opacity.selected);
40
42
  };
@@ -70,22 +72,26 @@ var Line = /** @class */ (function (_super) {
70
72
  });
71
73
  var groupedData = this.model.getGroupedData();
72
74
  // Update the bound data on lines
73
- var lines = svg.selectAll("path.line")
75
+ var lines = svg
76
+ .selectAll("path.line")
74
77
  .data(groupedData, function (group) { return group.name; });
75
78
  // Remove elements that need to be exited
76
79
  // We need exit at the top here to make sure that
77
80
  // Data filters are processed before entering new elements
78
81
  // Or updating existing ones
79
- lines.exit()
82
+ lines
83
+ .exit()
80
84
  .attr("opacity", 0)
81
85
  .remove();
82
86
  // Add lines that need to be introduced
83
- var enteringLines = lines.enter()
87
+ var enteringLines = lines
88
+ .enter()
84
89
  .append("path")
85
90
  .classed("line", true)
86
91
  .attr("opacity", 0);
87
92
  // Apply styles and datum
88
- enteringLines.merge(lines)
93
+ enteringLines
94
+ .merge(lines)
89
95
  .attr("stroke", function (group, i) {
90
96
  return _this.model.getStrokeColor(group.name);
91
97
  })
@@ -107,7 +113,8 @@ var Line = /** @class */ (function (_super) {
107
113
  };
108
114
  Line.prototype.destroy = function () {
109
115
  // Remove event listeners
110
- this.parent.selectAll("path")
116
+ this.parent
117
+ .selectAll("path")
111
118
  .on("mousemove", null)
112
119
  .on("mouseout", null);
113
120
  // Remove legend listeners
@@ -1 +1 @@
1
- {"version":3,"file":"line.js","sourceRoot":"","sources":["line.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport * as Configuration from \"../../configuration\";\nimport { Roles, Events } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { line } from \"d3-shape\";\n\nexport class Line extends Component {\n\ttype = \"line\";\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct line legend item hovers\n\t\tevents.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\t// Un-highlight lines on legend item mouseouts\n\t\tevents.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\trender(animate = true) {\n\t\tconst svg = this.getContainerSVG();\n\t\tconst { cartesianScales, curves } = this.services;\n\n\t\tconst getDomainValue = (d, i) => cartesianScales.getDomainValue(d, i);\n\t\tconst getRangeValue = (d, i) => cartesianScales.getRangeValue(d, i);\n\t\tconst [getXValue, getYValue] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tgetDomainValue,\n\t\t\tgetRangeValue,\n\t\t\tcartesianScales.getOrientation()\n\t\t);\n\n\t\t// D3 line generator function\n\t\tconst lineGenerator = line()\n\t\t\t.x(getXValue)\n\t\t\t.y(getYValue)\n\t\t\t.curve(curves.getD3Curve())\n\t\t\t.defined((datum: any, i) => {\n\t\t\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\t\t\t\tconst value = datum[rangeIdentifier];\n\t\t\t\tif (value === null || value === undefined) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tconst groupedData = this.model.getGroupedData();\n\t\t// Update the bound data on lines\n\t\tconst lines = svg.selectAll(\"path.line\")\n\t\t\t.data(groupedData, group => group.name);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tlines.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add lines that need to be introduced\n\t\tconst enteringLines = lines.enter()\n\t\t\t.append(\"path\")\n\t\t\t.classed(\"line\", true)\n\t\t\t.attr(\"opacity\", 0);\n\n\t\t// Apply styles and datum\n\t\tenteringLines.merge(lines)\n\t\t\t.attr(\"stroke\", (group, i) => {\n\t\t\t\treturn this.model.getStrokeColor(group.name)\n\t\t\t})\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"line\")\n\t\t\t.attr(\"aria-label\", group => {\n\t\t\t\tconst { data } = group;\n\t\t\t\tconst rangeIdentifier = this.services.cartesianScales.getRangeIdentifier();\n\t\t\t\treturn data.map(datum => datum[rangeIdentifier]).join(\",\");\n\t\t\t})\n\t\t\t// Transition\n\t\t\t.transition(this.services.transitions.getTransition(\"line-update-enter\", animate))\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t.attr(\"d\", group => {\n\t\t\t\tconst { data } = group;\n\t\t\t\treturn lineGenerator(data);\n\t\t\t});\n\t}\n\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent.selectAll(\"g.lines\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-line\"))\n\t\t\t.attr(\"opacity\", group => {\n\t\t\t\tif (group.name !== hoveredElement.datum()[\"name\"]) {\n\t\t\t\t\treturn Configuration.lines.opacity.unselected;\n\t\t\t\t}\n\n\t\t\t\treturn Configuration.lines.opacity.selected;\n\t\t\t});\n\t}\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent.selectAll(\"g.lines\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-line\"))\n\t\t\t.attr(\"opacity\", Configuration.lines.opacity.selected);\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\"path\")\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n}\n"]}
1
+ {"version":3,"file":"line.js","sourceRoot":"","sources":["line.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIpC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;IAA0B,wBAAS;IAAnC;QAAA,qEA6IC;QA5IA,UAAI,GAAG,MAAM,CAAC;QAgGd,yBAAmB,GAAG,UAAC,KAAkB;YAChC,IAAA,4CAAc,CAAkB;YAExC,KAAI,CAAC,MAAM;iBACT,SAAS,CAAC,SAAS,CAAC;iBACpB,UAAU,CACV,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAC5D;iBACA,IAAI,CAAC,SAAS,EAAE,UAAA,KAAK;gBACrB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;oBAClD,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;iBAC9C;gBAED,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,0BAAoB,GAAG,UAAC,KAAkB;YACzC,KAAI,CAAC,MAAM;iBACT,SAAS,CAAC,SAAS,CAAC;iBACpB,UAAU,CACV,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAC/D;iBACA,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC,CAAC;;IAoBH,CAAC;IA1IA,mBAAI,GAAJ;QACS,IAAA,6BAAM,CAAmB;QACjC,4CAA4C;QAC5C,MAAM,CAAC,gBAAgB,CACtB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,IAAI,CAAC,mBAAmB,CACxB,CAAC;QACF,8CAA8C;QAC9C,MAAM,CAAC,gBAAgB,CACtB,MAAM,CAAC,MAAM,CAAC,aAAa,EAC3B,IAAI,CAAC,oBAAoB,CACzB,CAAC;IACH,CAAC;IAED,qBAAM,GAAN,UAAO,OAAc;QAArB,iBA8EC;QA9EM,wBAAA,EAAA,cAAc;QACpB,IAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAA,kBAA2C,EAAzC,oCAAe,EAAE,kBAAwB,CAAC;QAElD,IAAM,cAAc,GAAG,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,eAAe,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAApC,CAAoC,CAAC;QACtE,IAAM,aAAa,GAAG,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,eAAe,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAnC,CAAmC,CAAC;QAC9D,IAAA,gHAOL,EANA,iBAAS,EACT,iBAKA,CAAC;QAEF,6BAA6B;QAC7B,IAAM,aAAa,GAAG,IAAI,EAAE;aAC1B,CAAC,CAAC,SAAS,CAAC;aACZ,CAAC,CAAC,SAAS,CAAC;aACZ,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;aAC1B,OAAO,CAAC,UAAC,KAAU,EAAE,CAAC;YACtB,IAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC;YAC7D,IAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;gBAC1C,OAAO,KAAK,CAAC;aACb;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEJ,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,iCAAiC;QACjC,IAAM,KAAK,GAAG,GAAG;aACf,SAAS,CAAC,WAAW,CAAC;aACtB,IAAI,CAAC,WAAW,EAAE,UAAA,KAAK,IAAI,OAAA,KAAK,CAAC,IAAI,EAAV,CAAU,CAAC,CAAC;QAEzC,yCAAyC;QACzC,iDAAiD;QACjD,0DAA0D;QAC1D,4BAA4B;QAC5B,KAAK;aACH,IAAI,EAAE;aACN,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;aAClB,MAAM,EAAE,CAAC;QAEX,uCAAuC;QACvC,IAAM,aAAa,GAAG,KAAK;aACzB,KAAK,EAAE;aACP,MAAM,CAAC,MAAM,CAAC;aACd,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;aACrB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAErB,yBAAyB;QACzB,aAAa;aACX,KAAK,CAAC,KAAK,CAAC;aACZ,IAAI,CAAC,QAAQ,EAAE,UAAC,KAAK,EAAE,CAAC;YACxB,OAAO,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC;YACF,OAAO;aACN,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;aACnC,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC;aACpC,IAAI,CAAC,YAAY,EAAE,UAAA,KAAK;YAChB,IAAA,iBAAI,CAAW;YACvB,IAAM,eAAe,GAAG,KAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,CAAC,eAAe,CAAC,EAAtB,CAAsB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC;YACF,aAAa;aACZ,UAAU,CACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CACtC,mBAAmB,EACnB,OAAO,CACP,CACD;aACA,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;aAClB,IAAI,CAAC,GAAG,EAAE,UAAA,KAAK;YACP,IAAA,iBAAI,CAAW;YACvB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IA4BD,sBAAO,GAAP;QACC,yBAAyB;QACzB,IAAI,CAAC,MAAM;aACT,SAAS,CAAC,MAAM,CAAC;aACjB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;aACrB,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEvB,0BAA0B;QAC1B,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,cAAc,CAAC,mBAAmB,CACjC,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,IAAI,CAAC,mBAAmB,CACxB,CAAC;QACF,cAAc,CAAC,mBAAmB,CACjC,MAAM,CAAC,MAAM,CAAC,aAAa,EAC3B,IAAI,CAAC,oBAAoB,CACzB,CAAC;IACH,CAAC;IACF,WAAC;AAAD,CAAC,AA7ID,CAA0B,SAAS,GA6IlC","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport * as Configuration from \"../../configuration\";\nimport { Roles, Events } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { line } from \"d3-shape\";\n\nexport class Line extends Component {\n\ttype = \"line\";\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct line legend item hovers\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\t// Un-highlight lines on legend item mouseouts\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n\n\trender(animate = true) {\n\t\tconst svg = this.getContainerSVG();\n\t\tconst { cartesianScales, curves } = this.services;\n\n\t\tconst getDomainValue = (d, i) => cartesianScales.getDomainValue(d, i);\n\t\tconst getRangeValue = (d, i) => cartesianScales.getRangeValue(d, i);\n\t\tconst [\n\t\t\tgetXValue,\n\t\t\tgetYValue\n\t\t] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tgetDomainValue,\n\t\t\tgetRangeValue,\n\t\t\tcartesianScales.getOrientation()\n\t\t);\n\n\t\t// D3 line generator function\n\t\tconst lineGenerator = line()\n\t\t\t.x(getXValue)\n\t\t\t.y(getYValue)\n\t\t\t.curve(curves.getD3Curve())\n\t\t\t.defined((datum: any, i) => {\n\t\t\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\t\t\t\tconst value = datum[rangeIdentifier];\n\t\t\t\tif (value === null || value === undefined) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tconst groupedData = this.model.getGroupedData();\n\t\t// Update the bound data on lines\n\t\tconst lines = svg\n\t\t\t.selectAll(\"path.line\")\n\t\t\t.data(groupedData, group => group.name);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tlines\n\t\t\t.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add lines that need to be introduced\n\t\tconst enteringLines = lines\n\t\t\t.enter()\n\t\t\t.append(\"path\")\n\t\t\t.classed(\"line\", true)\n\t\t\t.attr(\"opacity\", 0);\n\n\t\t// Apply styles and datum\n\t\tenteringLines\n\t\t\t.merge(lines)\n\t\t\t.attr(\"stroke\", (group, i) => {\n\t\t\t\treturn this.model.getStrokeColor(group.name);\n\t\t\t})\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"line\")\n\t\t\t.attr(\"aria-label\", group => {\n\t\t\t\tconst { data } = group;\n\t\t\t\tconst rangeIdentifier = this.services.cartesianScales.getRangeIdentifier();\n\t\t\t\treturn data.map(datum => datum[rangeIdentifier]).join(\",\");\n\t\t\t})\n\t\t\t// Transition\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\"line-update-enter\",\n\t\t\t\t\tanimate\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t.attr(\"d\", group => {\n\t\t\t\tconst { data } = group;\n\t\t\t\treturn lineGenerator(data);\n\t\t\t});\n\t}\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent\n\t\t\t.selectAll(\"g.lines\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-hover-line\")\n\t\t\t)\n\t\t\t.attr(\"opacity\", group => {\n\t\t\t\tif (group.name !== hoveredElement.datum()[\"name\"]) {\n\t\t\t\t\treturn Configuration.lines.opacity.unselected;\n\t\t\t\t}\n\n\t\t\t\treturn Configuration.lines.opacity.selected;\n\t\t\t});\n\t};\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent\n\t\t\t.selectAll(\"g.lines\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-mouseout-line\")\n\t\t\t)\n\t\t\t.attr(\"opacity\", Configuration.lines.opacity.selected);\n\t};\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent\n\t\t\t.selectAll(\"path\")\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n}\n"]}