@carbon/charts 0.41.53 → 0.41.57

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 (74) hide show
  1. package/CHANGELOG.md +21 -3
  2. package/axis-chart.js +4 -3
  3. package/axis-chart.js.map +1 -1
  4. package/build/demo/data/bar.d.ts +18 -0
  5. package/build/demo/data/bubble.d.ts +6 -0
  6. package/build/demo/data/line.d.ts +19 -0
  7. package/build/src/components/essentials/legend.d.ts +4 -1
  8. package/build/src/configuration-non-customizable.d.ts +36 -1
  9. package/build/src/interfaces/charts.d.ts +7 -2
  10. package/build/src/interfaces/components.d.ts +12 -0
  11. package/build/src/interfaces/enums.d.ts +11 -0
  12. package/build/src/tools.d.ts +7 -0
  13. package/bundle.js +1 -1
  14. package/charts/wordcloud.js.map +1 -1
  15. package/components/axes/grid.js.map +1 -1
  16. package/components/axes/zoom-bar.js +3 -2
  17. package/components/axes/zoom-bar.js.map +1 -1
  18. package/components/essentials/legend.d.ts +4 -1
  19. package/components/essentials/legend.js +263 -81
  20. package/components/essentials/legend.js.map +1 -1
  21. package/components/essentials/tooltip-axis.js +17 -9
  22. package/components/essentials/tooltip-axis.js.map +1 -1
  23. package/components/graphs/boxplot.js.map +1 -1
  24. package/components/graphs/scatter.js +8 -1
  25. package/components/graphs/scatter.js.map +1 -1
  26. package/components/graphs/wordcloud.js +4 -4
  27. package/components/graphs/wordcloud.js.map +1 -1
  28. package/components/index.js.map +1 -1
  29. package/components/layout/layout.js +0 -8
  30. package/components/layout/layout.js.map +1 -1
  31. package/configuration-non-customizable.d.ts +36 -1
  32. package/configuration-non-customizable.js +32 -1
  33. package/configuration-non-customizable.js.map +1 -1
  34. package/configuration.js +13 -3
  35. package/configuration.js.map +1 -1
  36. package/demo/data/area.js +1 -1
  37. package/demo/data/area.js.map +1 -1
  38. package/demo/data/bar.d.ts +18 -0
  39. package/demo/data/bar.js +36 -0
  40. package/demo/data/bar.js.map +1 -1
  41. package/demo/data/bubble.d.ts +6 -0
  42. package/demo/data/bubble.js +8 -0
  43. package/demo/data/bubble.js.map +1 -1
  44. package/demo/data/bundle.js +1 -1
  45. package/demo/data/index.js +10 -0
  46. package/demo/data/index.js.map +1 -1
  47. package/demo/data/line.d.ts +19 -0
  48. package/demo/data/line.js +21 -2
  49. package/demo/data/line.js.map +1 -1
  50. package/demo/styles.css +0 -3
  51. package/demo/styles.css.map +1 -1
  52. package/demo/styles.min.css +1 -1
  53. package/demo/styles.min.css.map +1 -1
  54. package/demo/tsconfig.tsbuildinfo +8 -8
  55. package/interfaces/charts.d.ts +7 -2
  56. package/interfaces/charts.js.map +1 -1
  57. package/interfaces/components.d.ts +12 -0
  58. package/interfaces/components.js.map +1 -1
  59. package/interfaces/enums.d.ts +11 -0
  60. package/interfaces/enums.js +12 -0
  61. package/interfaces/enums.js.map +1 -1
  62. package/interfaces/events.js.map +1 -1
  63. package/model-boxplot.js +1 -3
  64. package/model-boxplot.js.map +1 -1
  65. package/model.js +3 -1
  66. package/model.js.map +1 -1
  67. package/package.json +1 -1
  68. package/services/essentials/gradient-utils.js +1 -1
  69. package/services/essentials/gradient-utils.js.map +1 -1
  70. package/styles/_type.scss +2 -2
  71. package/tools.d.ts +7 -0
  72. package/tools.js +25 -2
  73. package/tools.js.map +1 -1
  74. package/tsconfig.tsbuildinfo +27 -27
@@ -14,7 +14,7 @@ var __extends = (this && this.__extends) || (function () {
14
14
  // Internal Imports
15
15
  import { Component } from '../component';
16
16
  import { Tools } from '../../tools';
17
- import { ColorClassNameTypes } from '../../interfaces/enums';
17
+ import { ColorClassNameTypes, LegendItemType } from '../../interfaces/enums';
18
18
  import { LegendOrientations, Roles, Events, TruncationTypes, } from '../../interfaces';
19
19
  import { DOMUtils } from '../../services';
20
20
  import * as Configuration from '../../configuration';
@@ -42,7 +42,6 @@ var Legend = /** @class */ (function (_super) {
42
42
  var legendItems = svg
43
43
  .selectAll('g.legend-item')
44
44
  .data(dataGroups, function (dataGroup) { return dataGroup.name; });
45
- // this.getLegendItemArray()
46
45
  var addedLegendItems = legendItems
47
46
  .enter()
48
47
  .append('g')
@@ -50,16 +49,9 @@ var Legend = /** @class */ (function (_super) {
50
49
  .classed('active', function (d, i) {
51
50
  return d.status === Configuration.legend.items.status.ACTIVE;
52
51
  });
53
- // Configs
54
- var checkboxRadius = Configuration.legend.checkbox.radius;
55
- // Truncation
56
- // get user provided custom values for truncation
57
- var truncationType = Tools.getProperty(legendOptions, 'truncation', 'type');
58
- var truncationThreshold = Tools.getProperty(legendOptions, 'truncation', 'threshold');
59
- var truncationNumCharacter = Tools.getProperty(legendOptions, 'truncation', 'numCharacter');
60
- var paletteOption = Tools.getProperty(options, 'color', 'pairing', 'option');
61
52
  var legendClickable = Tools.getProperty(this.getOptions(), 'legend', 'clickable');
62
53
  svg.classed('clickable', legendClickable);
54
+ var checkboxRadius = Configuration.legend.checkbox.radius;
63
55
  addedLegendItems
64
56
  .append('rect')
65
57
  .classed('checkbox', true)
@@ -94,21 +86,44 @@ var Legend = /** @class */ (function (_super) {
94
86
  var addedLegendItemsText = addedLegendItems
95
87
  .append('text')
96
88
  .merge(legendItems.select('text'));
97
- // truncate the legend label if it's too long
98
- if (truncationType !== TruncationTypes.NONE) {
99
- addedLegendItemsText.html(function (d) {
100
- if (d.name.length > truncationThreshold) {
101
- return Tools.truncateLabel(d.name, truncationType, truncationNumCharacter);
102
- }
103
- else {
104
- return d.name;
105
- }
89
+ this.truncateLegendText(addedLegendItemsText);
90
+ // Keep track of line numbers and positions
91
+ var itemConfig = {
92
+ startingPoint: 0,
93
+ itemIndexInLine: 0,
94
+ lineNumber: 0,
95
+ lastLegendItemTextWidth: 0,
96
+ };
97
+ this.breakItemsIntoLines(addedLegendItems, 'legend-item', itemConfig);
98
+ var additionalItemsOption = Tools.getProperty(options, 'legend', 'additionalItems');
99
+ // add additional legend items
100
+ if (additionalItemsOption && dataGroups.length) {
101
+ var self_1 = this;
102
+ var additionalItems = svg
103
+ .selectAll('g.additional-item')
104
+ .data(additionalItemsOption);
105
+ additionalItems.exit().remove();
106
+ var addedAdditionalItems = additionalItems
107
+ .enter()
108
+ .append('g')
109
+ .merge(additionalItems)
110
+ .classed('additional-item', true);
111
+ // remove nested child elements that no longer needed
112
+ addedAdditionalItems.selectAll('*').remove();
113
+ // add different type of legend items
114
+ addedAdditionalItems
115
+ .append('g')
116
+ .classed('icon', true)
117
+ .each(function (d, i) {
118
+ var additionalItem = select(this);
119
+ self_1.addAdditionalItem(additionalItem, d);
106
120
  });
121
+ var addedAdditionalItemsText = addedAdditionalItems
122
+ .append('text')
123
+ .merge(addedAdditionalItems.select('text'));
124
+ self_1.truncateLegendText(addedAdditionalItemsText);
125
+ this.breakItemsIntoLines(addedAdditionalItems, 'additional-item', itemConfig);
107
126
  }
108
- else {
109
- addedLegendItemsText.html(function (d) { return d.name; });
110
- }
111
- this.breakItemsIntoLines(addedLegendItems);
112
127
  // Remove old elements as needed.
113
128
  legendItems
114
129
  .exit()
@@ -137,97 +152,254 @@ var Legend = /** @class */ (function (_super) {
137
152
  }
138
153
  return dataGroups;
139
154
  };
140
- Legend.prototype.breakItemsIntoLines = function (addedLegendItems) {
155
+ Legend.prototype.addAdditionalItem = function (additionalItem, itemConfig) {
156
+ var _a = Configuration.legend.area, width = _a.width, height = _a.height;
157
+ if (itemConfig.type === LegendItemType.RADIUS) {
158
+ var _b = Configuration.legend.radius, iconData = _b.iconData, color = _b.color;
159
+ var circleEnter = additionalItem
160
+ .attr('fill', 'none')
161
+ .selectAll('circle')
162
+ .data(iconData)
163
+ .enter();
164
+ circleEnter
165
+ .append('circle')
166
+ .classed('radius', true)
167
+ .attr('role', Roles.IMG)
168
+ .attr('aria-label', 'radius')
169
+ .attr('cx', function (d) { return d.cx; })
170
+ .attr('cy', function (d) { return d.cy; })
171
+ .attr('r', function (d) { return d.r; })
172
+ .attr('stroke', itemConfig.color ? itemConfig.color : color);
173
+ }
174
+ else if (itemConfig.type === LegendItemType.LINE) {
175
+ var lineConfig = Configuration.legend.line;
176
+ if (additionalItem.select('line.line').empty()) {
177
+ additionalItem
178
+ .append('line')
179
+ .classed('line', true)
180
+ .attr('role', Roles.IMG)
181
+ .attr('aria-label', 'line')
182
+ .attr('x1', 0)
183
+ .attr('y1', lineConfig.yPosition)
184
+ .attr('x2', width)
185
+ .attr('y2', lineConfig.yPosition)
186
+ .attr('stroke', itemConfig.color ? itemConfig.color : lineConfig.color)
187
+ .attr('stroke-width', lineConfig.strokeWidth);
188
+ }
189
+ }
190
+ else if (itemConfig.type === LegendItemType.AREA) {
191
+ var color = itemConfig.color
192
+ ? itemConfig.color
193
+ : Configuration.legend.area.color;
194
+ if (additionalItem.select('rect.area').empty()) {
195
+ additionalItem
196
+ .append('rect')
197
+ .classed('area', true)
198
+ .attr('role', Roles.IMG)
199
+ .attr('aria-label', 'area')
200
+ .attr('width', width)
201
+ .attr('height', height)
202
+ .attr('fill', color);
203
+ }
204
+ }
205
+ else if (itemConfig.type === LegendItemType.SIZE) {
206
+ var _c = Configuration.legend.size, iconData = _c.iconData, color = _c.color;
207
+ var sizeEnter = additionalItem
208
+ .attr('fill', 'none')
209
+ .attr('role', Roles.IMG)
210
+ .attr('aria-label', 'size')
211
+ .selectAll('rect')
212
+ .data(iconData)
213
+ .enter();
214
+ sizeEnter
215
+ .append('rect')
216
+ .classed('size', true)
217
+ .attr('width', function (d) { return d.width; })
218
+ .attr('height', function (d) { return d.height; })
219
+ .attr('y', function (d) { return 24 - d.height; })
220
+ .attr('stroke', itemConfig.color ? itemConfig.color : color)
221
+ .attr('stroke-width', 1);
222
+ }
223
+ else if (itemConfig.type === LegendItemType.QUARTILE) {
224
+ var iconData = Configuration.legend.quartile.iconData;
225
+ // Set customized color
226
+ if (itemConfig.color) {
227
+ iconData[0].color = itemConfig.color;
228
+ }
229
+ var quartileEnter = additionalItem
230
+ .selectAll('rect')
231
+ .attr('role', Roles.IMG)
232
+ .attr('aria-label', 'quartile')
233
+ .data(iconData)
234
+ .enter();
235
+ quartileEnter
236
+ .append('rect')
237
+ .classed('quartile', true)
238
+ .attr('x', function (d) { return d.x; })
239
+ .attr('y', function (d) { return d.y; })
240
+ .attr('width', function (d) { return d.width; })
241
+ .attr('height', function (d) { return d.height; })
242
+ .attr('fill', function (d) { return d.color; });
243
+ }
244
+ };
245
+ Legend.prototype.truncateLegendText = function (addedLegendItemsText) {
246
+ var trucationOptions = Tools.getProperty(this.getOptions(), 'legend', 'truncation');
247
+ // Truncation
248
+ // get user provided custom values for truncation
249
+ var truncationType = Tools.getProperty(trucationOptions, 'type');
250
+ var truncationThreshold = Tools.getProperty(trucationOptions, 'threshold');
251
+ var truncationNumCharacter = Tools.getProperty(trucationOptions, 'numCharacter');
252
+ // truncate the legend label if it's too long
253
+ if (truncationType !== TruncationTypes.NONE) {
254
+ addedLegendItemsText.html(function (d) {
255
+ if (d.name.length > truncationThreshold) {
256
+ return Tools.truncateLabel(d.name, truncationType, truncationNumCharacter);
257
+ }
258
+ else {
259
+ return d.name;
260
+ }
261
+ });
262
+ }
263
+ else {
264
+ addedLegendItemsText.html(function (d) { return d.name; });
265
+ }
266
+ };
267
+ Legend.prototype.breakItemsIntoLines = function (addedLegendItems, className, itemConfig) {
141
268
  var self = this;
142
269
  var svg = this.getContainerSVG();
143
- var options = this.getOptions();
144
- // Configs
145
- var checkboxRadius = Configuration.legend.checkbox.radius;
146
- var legendItemsHorizontalSpacing = Configuration.legend.items.horizontalSpace;
147
- var legendItemsVerticalSpacing = Configuration.legend.items.verticalSpace;
148
- var legendTextYOffset = Configuration.legend.items.textYOffset;
149
- var spaceNeededForCheckbox = checkboxRadius * 2 + Configuration.legend.checkbox.spaceAfter;
150
270
  // Check if there are disabled legend items
151
271
  var DISABLED = Configuration.legend.items.status.DISABLED;
152
272
  var dataGroups = this.model.getDataGroups();
153
273
  var hasDeactivatedItems = dataGroups.some(function (dataGroup) { return dataGroup.status === DISABLED; });
154
- var legendOrientation = Tools.getProperty(options, 'legend', 'orientation');
155
- // Keep track of line numbers and positions
156
- var startingPoint = 0;
157
- var lineNumber = 0;
158
- var itemIndexInLine = 0;
159
- var lastYPosition;
160
274
  addedLegendItems
161
- .merge(svg.selectAll('g.legend-item'))
162
- .each(function (d, i) {
275
+ .merge(svg.selectAll("g." + className))
276
+ .each(function (d) {
163
277
  var legendItem = select(this);
164
- var previousLegendItem = select(svg.selectAll('g.legend-item').nodes()[i - 1]);
165
- if (itemIndexInLine === 0 ||
166
- previousLegendItem.empty() ||
167
- legendOrientation === LegendOrientations.VERTICAL) {
168
- if (legendOrientation === LegendOrientations.VERTICAL &&
169
- i !== 0) {
170
- lineNumber++;
171
- }
278
+ var svgDimensions = DOMUtils.getSVGElementSize(self.parent, {
279
+ useAttr: true,
280
+ });
281
+ // Set item position based on item type
282
+ if (!d.type) {
283
+ itemConfig.hasDeactivatedItems = hasDeactivatedItems;
284
+ self.setLegendItemPosition(legendItem, svgDimensions, itemConfig, LegendItemType.CHECKBOX);
172
285
  }
173
286
  else {
174
- var svgDimensions = DOMUtils.getSVGElementSize(self.parent, { useAttr: true });
175
- var legendItemTextDimensions = DOMUtils.getSVGElementSize(select(this).select('text'), { useBBox: true });
176
- var lastLegendItemTextDimensions = DOMUtils.getSVGElementSize(previousLegendItem.select('text'), { useBBox: true });
177
- startingPoint =
178
- startingPoint +
179
- lastLegendItemTextDimensions.width +
180
- spaceNeededForCheckbox +
181
- legendItemsHorizontalSpacing;
182
- if (startingPoint +
183
- spaceNeededForCheckbox +
184
- legendItemTextDimensions.width >
185
- svgDimensions.width) {
186
- lineNumber++;
187
- startingPoint = 0;
188
- itemIndexInLine = 0;
189
- }
287
+ self.setLegendItemPosition(legendItem, svgDimensions, itemConfig, d.type);
190
288
  }
191
- var yOffset = 0;
192
- // Position checkbox
193
- // TODO - Replace with layout component margins
289
+ });
290
+ };
291
+ Legend.prototype.setLegendItemPosition = function (legendItem, parentSVGDimension, itemConfig, itemType) {
292
+ var legendOrientation = Tools.getProperty(this.getOptions(), 'legend', 'orientation');
293
+ // Configs
294
+ var legendItemsHorizontalSpacing = Configuration.legend.items.horizontalSpace;
295
+ var legendItemsVerticalSpacing = Configuration.legend.items.verticalSpace;
296
+ var legendTextYOffset = Configuration.legend.items.textYOffset;
297
+ var iconWidth = itemType === LegendItemType.CHECKBOX ||
298
+ itemType === LegendItemType.RADIUS
299
+ ? Configuration.legend.checkbox.radius * 2
300
+ : Configuration.legend.area.width;
301
+ var spaceAfter = Configuration.legend.items.spaceAfter;
302
+ var legendItemTextDimensions = DOMUtils.getSVGElementSize(legendItem.select('text'), { useBBox: true });
303
+ var translateOffset = Configuration.legend.area.width / 2 - 1;
304
+ // Check and update position
305
+ if (itemConfig.itemIndexInLine === 0 ||
306
+ itemConfig.lastLegendItemTextWidth === 0 ||
307
+ legendOrientation === LegendOrientations.VERTICAL) {
308
+ if (itemConfig.itemIndexInLine > 0) {
309
+ itemConfig.lineNumber++;
310
+ }
311
+ }
312
+ else {
313
+ itemConfig.startingPoint +=
314
+ itemConfig.lastLegendItemTextWidth +
315
+ iconWidth +
316
+ spaceAfter +
317
+ legendItemsHorizontalSpacing;
318
+ // Place legends in a new line if space is not enough
319
+ if (itemConfig.startingPoint +
320
+ iconWidth +
321
+ spaceAfter +
322
+ legendItemTextDimensions.width >
323
+ parentSVGDimension.width) {
324
+ itemConfig.lineNumber++;
325
+ itemConfig.startingPoint =
326
+ iconWidth === 24 ? translateOffset : 0;
327
+ itemConfig.itemIndexInLine = 0;
328
+ }
329
+ }
330
+ itemConfig.lastLegendItemTextWidth = legendItemTextDimensions.width;
331
+ var yPosition = itemConfig.lineNumber * legendItemsVerticalSpacing;
332
+ var yTextPosition = legendTextYOffset + yPosition + 3;
333
+ if (itemType === LegendItemType.CHECKBOX) {
194
334
  legendItem
195
335
  .select('rect.checkbox')
196
- .attr('x', startingPoint)
197
- .attr('y', yOffset + lineNumber * legendItemsVerticalSpacing);
336
+ .attr('x', itemConfig.startingPoint)
337
+ .attr('y', yPosition);
198
338
  // Position text
199
- // TODO - Replace with layout component margins
200
- var yPosition = legendTextYOffset + lineNumber * legendItemsVerticalSpacing;
201
339
  legendItem
202
340
  .select('text')
203
- .attr('x', startingPoint + spaceNeededForCheckbox)
204
- .attr('y', yOffset + yPosition + 3);
205
- lastYPosition = yPosition;
341
+ .attr('x', itemConfig.startingPoint + iconWidth + spaceAfter)
342
+ .attr('y', yTextPosition);
206
343
  // Test if legendItems are placed in the correct direction
207
344
  var testHorizontal = (!legendOrientation ||
208
345
  legendOrientation === LegendOrientations.HORIZONTAL) &&
209
- legendItem.select('rect.checkbox').attr('y') === '0';
346
+ parseInt(legendItem.select('rect.checkbox').attr('y')) % 24 ===
347
+ 0;
210
348
  var testVertical = legendOrientation === LegendOrientations.VERTICAL &&
211
349
  legendItem.select('rect.checkbox').attr('x') === '0';
212
350
  var hasCorrectLegendDirection = testHorizontal || testVertical;
213
351
  // Render checkbox check icon
214
- if (hasDeactivatedItems &&
352
+ if (itemConfig.hasDeactivatedItems &&
215
353
  legendItem.select('g.check').empty() &&
216
354
  hasCorrectLegendDirection) {
217
- legendItem.append('g').classed('check', true).html("\n\t\t\t\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 32 32\" aria-hidden=\"true\"\n\t\t\t\t\t\t\t\tstyle=\"will-change: transform;\">\n\t\t\t\t\t\t\t\t<path d=\"M13 21.2l-7.1-7.1-1.4 1.4 7.1 7.1L13 24 27.1 9.9l-1.4-1.5z\"></path>\n\t\t\t\t\t\t\t\t<title>Checkmark</title>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t");
355
+ legendItem.append('g').classed('check', true).html("\n\t\t\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\"\n\t\t\t\t\t\t\tviewBox=\"0 0 32 32\" aria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle=\"will-change: transform;\">\n\t\t\t\t\t\t\t<path d=\"M13 21.2l-7.1-7.1-1.4 1.4 7.1 7.1L13 24 27.1 9.9l-1.4-1.5z\"></path>\n\t\t\t\t\t\t\t<title>Checkmark</title>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t");
218
356
  legendItem
219
357
  .select('g.check svg')
220
- .attr('width', checkboxRadius * 2 - 1)
221
- .attr('height', checkboxRadius * 2 - 1)
358
+ .attr('width', iconWidth - 1)
359
+ .attr('height', iconWidth - 1)
222
360
  .attr('x', parseFloat(legendItem.select('rect.checkbox').attr('x')) + 0.5)
223
361
  .attr('y', parseFloat(legendItem.select('rect.checkbox').attr('y')) + 0.5);
224
362
  }
225
- else if (!hasDeactivatedItems &&
363
+ else if (!itemConfig.hasDeactivatedItems &&
226
364
  !legendItem.select('g.check').empty()) {
227
365
  legendItem.select('g.check').remove();
228
366
  }
229
- itemIndexInLine++;
230
- });
367
+ }
368
+ else if (itemType === LegendItemType.RADIUS) {
369
+ legendItem
370
+ .selectAll('circle.radius')
371
+ .attr('cx', function (d) { return itemConfig.startingPoint + d.cx; })
372
+ .attr('cy', function (d) { return yPosition + d.cy; });
373
+ legendItem
374
+ .select('text')
375
+ .attr('x', itemConfig.startingPoint + iconWidth + spaceAfter)
376
+ .attr('y', yTextPosition);
377
+ }
378
+ else if (itemType === LegendItemType.SIZE) {
379
+ legendItem
380
+ .selectAll('g.icon')
381
+ .attr('transform', "translate(" + (itemConfig.startingPoint - translateOffset) + ", " + (yPosition - 12) + ")");
382
+ legendItem
383
+ .select('text')
384
+ .attr('x', itemConfig.startingPoint +
385
+ iconWidth +
386
+ spaceAfter -
387
+ translateOffset)
388
+ .attr('y', yTextPosition);
389
+ }
390
+ else {
391
+ legendItem
392
+ .selectAll('g.icon')
393
+ .attr('transform', "translate(" + (itemConfig.startingPoint - translateOffset) + ", " + yPosition + ")");
394
+ legendItem
395
+ .select('text')
396
+ .attr('x', itemConfig.startingPoint +
397
+ iconWidth +
398
+ spaceAfter -
399
+ translateOffset)
400
+ .attr('y', yTextPosition);
401
+ }
402
+ itemConfig.itemIndexInLine++;
231
403
  };
232
404
  Legend.prototype.addEventListeners = function () {
233
405
  var self = this;
@@ -288,6 +460,16 @@ var Legend = /** @class */ (function (_super) {
288
460
  self.model.toggleDataLabel(d.name);
289
461
  }
290
462
  });
463
+ svg.selectAll('g.additional-item').on('mouseover', function () {
464
+ var hoveredItem = select(this);
465
+ var hoveredItemData = hoveredItem.datum();
466
+ if (hoveredItemData.name.length > truncationThreshold) {
467
+ self.services.events.dispatchEvent(Events.Tooltip.SHOW, {
468
+ hoveredElement: hoveredItem,
469
+ content: hoveredItemData.name,
470
+ });
471
+ }
472
+ });
291
473
  };
292
474
  return Legend;
293
475
  }(Component));
@@ -1 +1 @@
1
- {"version":3,"file":"legend.js","sourceRoot":"","sources":["legend.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from '../component';\nimport { Tools } from '../../tools';\nimport { ColorClassNameTypes } from '../../interfaces/enums';\nimport {\n\tLegendOrientations,\n\tRoles,\n\tEvents,\n\tTruncationTypes,\n} from '../../interfaces';\nimport { DOMUtils } from '../../services';\nimport * as Configuration from '../../configuration';\n\n// D3 Imports\nimport { select, event } from 'd3-selection';\n\nexport class Legend extends Component {\n\ttype = 'legend';\n\n\trender() {\n\t\tconst svg = this.getContainerSVG()\n\t\t\t.attr('role', Roles.GROUP)\n\t\t\t.attr('data-name', 'legend-items');\n\t\tconst options = this.getOptions();\n\t\tconst legendOptions = Tools.getProperty(options, 'legend');\n\t\tlet dataGroups = this.model.getDataGroups();\n\t\tconst legendOrder = Tools.getProperty(legendOptions, 'order');\n\n\t\tif (legendOrder) {\n\t\t\tdataGroups = this.sortDataGroups(dataGroups, legendOrder);\n\t\t}\n\n\t\tconst legendItems = svg\n\t\t\t.selectAll('g.legend-item')\n\t\t\t.data(dataGroups, (dataGroup) => dataGroup.name);\n\n\t\t// this.getLegendItemArray()\n\n\t\tconst addedLegendItems = legendItems\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t.classed('legend-item', true)\n\t\t\t.classed('active', function (d, i) {\n\t\t\t\treturn d.status === Configuration.legend.items.status.ACTIVE;\n\t\t\t});\n\n\t\t// Configs\n\t\tconst checkboxRadius = Configuration.legend.checkbox.radius;\n\n\t\t// Truncation\n\t\t// get user provided custom values for truncation\n\t\tconst truncationType = Tools.getProperty(\n\t\t\tlegendOptions,\n\t\t\t'truncation',\n\t\t\t'type'\n\t\t);\n\t\tconst truncationThreshold = Tools.getProperty(\n\t\t\tlegendOptions,\n\t\t\t'truncation',\n\t\t\t'threshold'\n\t\t);\n\t\tconst truncationNumCharacter = Tools.getProperty(\n\t\t\tlegendOptions,\n\t\t\t'truncation',\n\t\t\t'numCharacter'\n\t\t);\n\n\t\tconst paletteOption = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'color',\n\t\t\t'pairing',\n\t\t\t'option'\n\t\t);\n\n\t\tconst legendClickable = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'legend',\n\t\t\t'clickable'\n\t\t);\n\t\tsvg.classed('clickable', legendClickable);\n\n\t\taddedLegendItems\n\t\t\t.append('rect')\n\t\t\t.classed('checkbox', true)\n\t\t\t.merge(legendItems.select('rect.checkbox'))\n\t\t\t.attr('role', Roles.CHECKBOX)\n\t\t\t.attr('tabindex', legendClickable ? 0 : -1)\n\t\t\t.attr('aria-label', (d) => d.name)\n\t\t\t.attr(\n\t\t\t\t'aria-checked',\n\t\t\t\t({ status }) =>\n\t\t\t\t\tstatus === Configuration.legend.items.status.ACTIVE\n\t\t\t)\n\t\t\t.attr('width', checkboxRadius * 2)\n\t\t\t.attr('height', checkboxRadius * 2)\n\t\t\t.attr('rx', 1)\n\t\t\t.attr('ry', 1)\n\t\t\t.attr('class', (d, i) =>\n\t\t\t\tthis.model.getColorClassName({\n\t\t\t\t\tclassNameTypes: [ColorClassNameTypes.FILL],\n\t\t\t\t\tdataGroupName: d.name,\n\t\t\t\t\toriginalClassName: 'checkbox',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.style('fill', (d) =>\n\t\t\t\td.status === Configuration.legend.items.status.ACTIVE\n\t\t\t\t\t? this.model.getFillColor(d.name) ||\n\t\t\t\t\t this.model.getStrokeColor(d.name)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t\t.classed('active', function (d, i) {\n\t\t\t\treturn d.status === Configuration.legend.items.status.ACTIVE;\n\t\t\t});\n\t\tconst addedLegendItemsText = addedLegendItems\n\t\t\t.append('text')\n\t\t\t.merge(legendItems.select('text'));\n\n\t\t// truncate the legend label if it's too long\n\t\tif (truncationType !== TruncationTypes.NONE) {\n\t\t\taddedLegendItemsText.html(function (d) {\n\t\t\t\tif (d.name.length > truncationThreshold) {\n\t\t\t\t\treturn Tools.truncateLabel(\n\t\t\t\t\t\td.name,\n\t\t\t\t\t\ttruncationType,\n\t\t\t\t\t\ttruncationNumCharacter\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn d.name;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\taddedLegendItemsText.html((d) => d.name);\n\t\t}\n\n\t\tthis.breakItemsIntoLines(addedLegendItems);\n\n\t\t// Remove old elements as needed.\n\t\tlegendItems\n\t\t\t.exit()\n\t\t\t.on('mouseover', null)\n\t\t\t.on('click', null)\n\t\t\t.on('mouseout', null)\n\t\t\t.remove();\n\n\t\tif (legendClickable && addedLegendItems.size() > 0) {\n\t\t\tthis.addEventListeners();\n\t\t}\n\n\t\tconst alignment = Tools.getProperty(legendOptions, 'alignment');\n\n\t\tconst alignmentOffset = DOMUtils.getAlignmentOffset(\n\t\t\talignment,\n\t\t\tsvg,\n\t\t\tthis.getParent()\n\t\t);\n\t\tsvg.attr('transform', `translate(${alignmentOffset}, 0)`);\n\t}\n\n\tsortDataGroups(dataGroups, legendOrder) {\n\t\t// Sort data in user defined order\n\t\tdataGroups.sort(\n\t\t\t(dataA, dataB) =>\n\t\t\t\tlegendOrder.indexOf(dataA.name) -\n\t\t\t\tlegendOrder.indexOf(dataB.name)\n\t\t);\n\n\t\t// If user only defined partial ordering, ordered items are placed before unordered ones\n\t\tif (legendOrder.length < dataGroups.length) {\n\t\t\tconst definedOrderIndex = dataGroups.length - legendOrder.length;\n\t\t\tconst definedOrder = dataGroups.slice(definedOrderIndex);\n\n\t\t\treturn definedOrder.concat(dataGroups.slice(0, definedOrderIndex));\n\t\t}\n\t\treturn dataGroups;\n\t}\n\n\tbreakItemsIntoLines(addedLegendItems) {\n\t\tconst self = this;\n\t\tconst svg = this.getContainerSVG();\n\t\tconst options = this.getOptions();\n\n\t\t// Configs\n\t\tconst checkboxRadius = Configuration.legend.checkbox.radius;\n\t\tconst legendItemsHorizontalSpacing =\n\t\t\tConfiguration.legend.items.horizontalSpace;\n\t\tconst legendItemsVerticalSpacing =\n\t\t\tConfiguration.legend.items.verticalSpace;\n\t\tconst legendTextYOffset = Configuration.legend.items.textYOffset;\n\t\tconst spaceNeededForCheckbox =\n\t\t\tcheckboxRadius * 2 + Configuration.legend.checkbox.spaceAfter;\n\n\t\t// Check if there are disabled legend items\n\t\tconst { DISABLED } = Configuration.legend.items.status;\n\t\tconst dataGroups = this.model.getDataGroups();\n\t\tconst hasDeactivatedItems = dataGroups.some(\n\t\t\t(dataGroup) => dataGroup.status === DISABLED\n\t\t);\n\n\t\tconst legendOrientation = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'legend',\n\t\t\t'orientation'\n\t\t);\n\n\t\t// Keep track of line numbers and positions\n\t\tlet startingPoint = 0;\n\t\tlet lineNumber = 0;\n\t\tlet itemIndexInLine = 0;\n\t\tlet lastYPosition;\n\t\taddedLegendItems\n\t\t\t.merge(svg.selectAll('g.legend-item'))\n\t\t\t.each(function (d, i) {\n\t\t\t\tconst legendItem = select(this);\n\t\t\t\tconst previousLegendItem = select(\n\t\t\t\t\tsvg.selectAll('g.legend-item').nodes()[i - 1]\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\titemIndexInLine === 0 ||\n\t\t\t\t\tpreviousLegendItem.empty() ||\n\t\t\t\t\tlegendOrientation === LegendOrientations.VERTICAL\n\t\t\t\t) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlegendOrientation === LegendOrientations.VERTICAL &&\n\t\t\t\t\t\ti !== 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tlineNumber++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst svgDimensions = DOMUtils.getSVGElementSize(\n\t\t\t\t\t\tself.parent,\n\t\t\t\t\t\t{ useAttr: true }\n\t\t\t\t\t);\n\t\t\t\t\tconst legendItemTextDimensions = DOMUtils.getSVGElementSize(\n\t\t\t\t\t\tselect(this).select('text'),\n\t\t\t\t\t\t{ useBBox: true }\n\t\t\t\t\t);\n\t\t\t\t\tconst lastLegendItemTextDimensions = DOMUtils.getSVGElementSize(\n\t\t\t\t\t\tpreviousLegendItem.select('text'),\n\t\t\t\t\t\t{ useBBox: true }\n\t\t\t\t\t);\n\t\t\t\t\tstartingPoint =\n\t\t\t\t\t\tstartingPoint +\n\t\t\t\t\t\tlastLegendItemTextDimensions.width +\n\t\t\t\t\t\tspaceNeededForCheckbox +\n\t\t\t\t\t\tlegendItemsHorizontalSpacing;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstartingPoint +\n\t\t\t\t\t\t\tspaceNeededForCheckbox +\n\t\t\t\t\t\t\tlegendItemTextDimensions.width >\n\t\t\t\t\t\tsvgDimensions.width\n\t\t\t\t\t) {\n\t\t\t\t\t\tlineNumber++;\n\t\t\t\t\t\tstartingPoint = 0;\n\t\t\t\t\t\titemIndexInLine = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst yOffset = 0;\n\n\t\t\t\t// Position checkbox\n\t\t\t\t// TODO - Replace with layout component margins\n\t\t\t\tlegendItem\n\t\t\t\t\t.select('rect.checkbox')\n\t\t\t\t\t.attr('x', startingPoint)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'y',\n\t\t\t\t\t\tyOffset + lineNumber * legendItemsVerticalSpacing\n\t\t\t\t\t);\n\n\t\t\t\t// Position text\n\t\t\t\t// TODO - Replace with layout component margins\n\t\t\t\tconst yPosition =\n\t\t\t\t\tlegendTextYOffset + lineNumber * legendItemsVerticalSpacing;\n\t\t\t\tlegendItem\n\t\t\t\t\t.select('text')\n\t\t\t\t\t.attr('x', startingPoint + spaceNeededForCheckbox)\n\t\t\t\t\t.attr('y', yOffset + yPosition + 3);\n\n\t\t\t\tlastYPosition = yPosition;\n\n\t\t\t\t// Test if legendItems are placed in the correct direction\n\t\t\t\tconst testHorizontal =\n\t\t\t\t\t(!legendOrientation ||\n\t\t\t\t\t\tlegendOrientation === LegendOrientations.HORIZONTAL) &&\n\t\t\t\t\tlegendItem.select('rect.checkbox').attr('y') === '0';\n\n\t\t\t\tconst testVertical =\n\t\t\t\t\tlegendOrientation === LegendOrientations.VERTICAL &&\n\t\t\t\t\tlegendItem.select('rect.checkbox').attr('x') === '0';\n\n\t\t\t\tconst hasCorrectLegendDirection =\n\t\t\t\t\ttestHorizontal || testVertical;\n\n\t\t\t\t// Render checkbox check icon\n\t\t\t\tif (\n\t\t\t\t\thasDeactivatedItems &&\n\t\t\t\t\tlegendItem.select('g.check').empty() &&\n\t\t\t\t\thasCorrectLegendDirection\n\t\t\t\t) {\n\t\t\t\t\tlegendItem.append('g').classed('check', true).html(`\n\t\t\t\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 32 32\" aria-hidden=\"true\"\n\t\t\t\t\t\t\t\tstyle=\"will-change: transform;\">\n\t\t\t\t\t\t\t\t<path d=\"M13 21.2l-7.1-7.1-1.4 1.4 7.1 7.1L13 24 27.1 9.9l-1.4-1.5z\"></path>\n\t\t\t\t\t\t\t\t<title>Checkmark</title>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t`);\n\n\t\t\t\t\tlegendItem\n\t\t\t\t\t\t.select('g.check svg')\n\t\t\t\t\t\t.attr('width', checkboxRadius * 2 - 1)\n\t\t\t\t\t\t.attr('height', checkboxRadius * 2 - 1)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t'x',\n\t\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\t\tlegendItem.select('rect.checkbox').attr('x')\n\t\t\t\t\t\t\t) + 0.5\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t'y',\n\t\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\t\tlegendItem.select('rect.checkbox').attr('y')\n\t\t\t\t\t\t\t) + 0.5\n\t\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\t!hasDeactivatedItems &&\n\t\t\t\t\t!legendItem.select('g.check').empty()\n\t\t\t\t) {\n\t\t\t\t\tlegendItem.select('g.check').remove();\n\t\t\t\t}\n\n\t\t\t\titemIndexInLine++;\n\t\t\t});\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst svg = this.getContainerSVG();\n\t\tconst options = this.getOptions();\n\t\tconst legendOptions = Tools.getProperty(options, 'legend');\n\t\tconst truncationThreshold = Tools.getProperty(\n\t\t\tlegendOptions,\n\t\t\t'truncation',\n\t\t\t'threshold'\n\t\t);\n\n\t\tsvg.selectAll('g.legend-item')\n\t\t\t.on('mouseover', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Legend.ITEM_HOVER, {\n\t\t\t\t\thoveredElement: select(this),\n\t\t\t\t});\n\n\t\t\t\t// Configs\n\t\t\t\tconst checkboxRadius = Configuration.legend.checkbox.radius;\n\t\t\t\tconst hoveredItem = select(this);\n\t\t\t\thoveredItem.select('rect.checkbox').classed('hovered', true);\n\n\t\t\t\thoveredItem\n\t\t\t\t\t.append('rect')\n\t\t\t\t\t.classed('hover-stroke', true)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'x',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\thoveredItem.select('rect.checkbox').attr('x')\n\t\t\t\t\t\t) - 2\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'y',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\thoveredItem.select('rect.checkbox').attr('y')\n\t\t\t\t\t\t) - 2\n\t\t\t\t\t)\n\t\t\t\t\t.attr('width', checkboxRadius * 2 + 4)\n\t\t\t\t\t.attr('height', checkboxRadius * 2 + 4)\n\t\t\t\t\t.attr('rx', 3)\n\t\t\t\t\t.attr('ry', 3)\n\t\t\t\t\t.lower();\n\n\t\t\t\tconst hoveredItemData = hoveredItem.datum() as any;\n\t\t\t\tif (hoveredItemData.name.length > truncationThreshold) {\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\t\thoveredElement: hoveredItem,\n\t\t\t\t\t\tcontent: hoveredItemData.name,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mousemove', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE);\n\t\t\t})\n\t\t\t.on('click', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Legend.ITEM_CLICK, {\n\t\t\t\t\tclickedElement: select(this),\n\t\t\t\t});\n\n\t\t\t\tconst clickedItem = select(this);\n\t\t\t\tconst clickedItemData = clickedItem.datum() as any;\n\n\t\t\t\tself.model.toggleDataLabel(clickedItemData.name);\n\t\t\t})\n\t\t\t.on('mouseout', function () {\n\t\t\t\tconst hoveredItem = select(this);\n\t\t\t\thoveredItem.select('rect.hover-stroke').remove();\n\t\t\t\thoveredItem.select('rect.checkbox').classed('hovered', false);\n\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE);\n\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\t\t\t{\n\t\t\t\t\t\thoveredElement: hoveredItem,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\n\t\tsvg.selectAll('g.legend-item rect.checkbox').on('keyup', function (d) {\n\t\t\tif (event.key && (event.key === 'Enter' || event.key === ' ')) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tself.model.toggleDataLabel(d.name);\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"legend.js","sourceRoot":"","sources":["legend.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from '../component';\nimport { Tools } from '../../tools';\nimport { ColorClassNameTypes, LegendItemType } from '../../interfaces/enums';\nimport {\n\tLegendOrientations,\n\tRoles,\n\tEvents,\n\tTruncationTypes,\n} from '../../interfaces';\nimport { DOMUtils } from '../../services';\nimport * as Configuration from '../../configuration';\n\n// D3 Imports\nimport { select, event } from 'd3-selection';\n\nexport class Legend extends Component {\n\ttype = 'legend';\n\n\trender() {\n\t\tconst svg = this.getContainerSVG()\n\t\t\t.attr('role', Roles.GROUP)\n\t\t\t.attr('data-name', 'legend-items');\n\t\tconst options = this.getOptions();\n\t\tconst legendOptions = Tools.getProperty(options, 'legend');\n\t\tlet dataGroups = this.model.getDataGroups();\n\t\tconst legendOrder = Tools.getProperty(legendOptions, 'order');\n\n\t\tif (legendOrder) {\n\t\t\tdataGroups = this.sortDataGroups(dataGroups, legendOrder);\n\t\t}\n\n\t\tconst legendItems = svg\n\t\t\t.selectAll('g.legend-item')\n\t\t\t.data(dataGroups, (dataGroup) => dataGroup.name);\n\n\t\tconst addedLegendItems = legendItems\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t.classed('legend-item', true)\n\t\t\t.classed('active', function (d, i) {\n\t\t\t\treturn d.status === Configuration.legend.items.status.ACTIVE;\n\t\t\t});\n\n\t\tconst legendClickable = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'legend',\n\t\t\t'clickable'\n\t\t);\n\t\tsvg.classed('clickable', legendClickable);\n\n\t\tconst checkboxRadius = Configuration.legend.checkbox.radius;\n\n\t\taddedLegendItems\n\t\t\t.append('rect')\n\t\t\t.classed('checkbox', true)\n\t\t\t.merge(legendItems.select('rect.checkbox'))\n\t\t\t.attr('role', Roles.CHECKBOX)\n\t\t\t.attr('tabindex', legendClickable ? 0 : -1)\n\t\t\t.attr('aria-label', (d) => d.name)\n\t\t\t.attr(\n\t\t\t\t'aria-checked',\n\t\t\t\t({ status }) =>\n\t\t\t\t\tstatus === Configuration.legend.items.status.ACTIVE\n\t\t\t)\n\t\t\t.attr('width', checkboxRadius * 2)\n\t\t\t.attr('height', checkboxRadius * 2)\n\t\t\t.attr('rx', 1)\n\t\t\t.attr('ry', 1)\n\t\t\t.attr('class', (d, i) =>\n\t\t\t\tthis.model.getColorClassName({\n\t\t\t\t\tclassNameTypes: [ColorClassNameTypes.FILL],\n\t\t\t\t\tdataGroupName: d.name,\n\t\t\t\t\toriginalClassName: 'checkbox',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.style('fill', (d) =>\n\t\t\t\td.status === Configuration.legend.items.status.ACTIVE\n\t\t\t\t\t? this.model.getFillColor(d.name) ||\n\t\t\t\t\tthis.model.getStrokeColor(d.name)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t\t.classed('active', function (d, i) {\n\t\t\t\treturn d.status === Configuration.legend.items.status.ACTIVE;\n\t\t\t});\n\n\t\tconst addedLegendItemsText = addedLegendItems\n\t\t\t.append('text')\n\t\t\t.merge(legendItems.select('text'));\n\n\t\tthis.truncateLegendText(addedLegendItemsText);\n\n\t\t// Keep track of line numbers and positions\n\t\tconst itemConfig = {\n\t\t\tstartingPoint: 0,\n\t\t\titemIndexInLine: 0,\n\t\t\tlineNumber: 0,\n\t\t\tlastLegendItemTextWidth: 0,\n\t\t};\n\n\t\tthis.breakItemsIntoLines(addedLegendItems, 'legend-item', itemConfig);\n\n\t\tconst additionalItemsOption = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'legend',\n\t\t\t'additionalItems'\n\t\t);\n\n\t\t// add additional legend items\n\t\tif (additionalItemsOption && dataGroups.length) {\n\t\t\tconst self = this;\n\n\t\t\tconst additionalItems = svg\n\t\t\t\t.selectAll('g.additional-item')\n\t\t\t\t.data(additionalItemsOption);\n\n\t\t\tadditionalItems.exit().remove();\n\n\t\t\tconst addedAdditionalItems = additionalItems\n\t\t\t\t.enter()\n\t\t\t\t.append('g')\n\t\t\t\t.merge(additionalItems)\n\t\t\t\t.classed('additional-item', true);\n\n\t\t\t// remove nested child elements that no longer needed\n\t\t\taddedAdditionalItems.selectAll('*').remove();\n\n\t\t\t// add different type of legend items\n\t\t\taddedAdditionalItems\n\t\t\t\t.append('g')\n\t\t\t\t.classed('icon', true)\n\t\t\t\t.each(function (d, i) {\n\t\t\t\t\tconst additionalItem = select(this);\n\n\t\t\t\t\tself.addAdditionalItem(additionalItem, d);\n\t\t\t\t});\n\t\t\tconst addedAdditionalItemsText = addedAdditionalItems\n\t\t\t\t.append('text')\n\t\t\t\t.merge(addedAdditionalItems.select('text'));\n\n\t\t\tself.truncateLegendText(addedAdditionalItemsText);\n\t\t\tthis.breakItemsIntoLines(\n\t\t\t\taddedAdditionalItems,\n\t\t\t\t'additional-item',\n\t\t\t\titemConfig\n\t\t\t);\n\t\t}\n\n\t\t// Remove old elements as needed.\n\t\tlegendItems\n\t\t\t.exit()\n\t\t\t.on('mouseover', null)\n\t\t\t.on('click', null)\n\t\t\t.on('mouseout', null)\n\t\t\t.remove();\n\n\t\tif (legendClickable && addedLegendItems.size() > 0) {\n\t\t\tthis.addEventListeners();\n\t\t}\n\n\t\tconst alignment = Tools.getProperty(legendOptions, 'alignment');\n\t\tconst alignmentOffset = DOMUtils.getAlignmentOffset(\n\t\t\talignment,\n\t\t\tsvg,\n\t\t\tthis.getParent()\n\t\t);\n\t\tsvg.attr('transform', `translate(${alignmentOffset}, 0)`);\n\t}\n\n\tsortDataGroups(dataGroups, legendOrder) {\n\t\t// Sort data in user defined order\n\t\tdataGroups.sort(\n\t\t\t(dataA, dataB) =>\n\t\t\t\tlegendOrder.indexOf(dataA.name) -\n\t\t\t\tlegendOrder.indexOf(dataB.name)\n\t\t);\n\n\t\t// If user only defined partial ordering, ordered items are placed before unordered ones\n\t\tif (legendOrder.length < dataGroups.length) {\n\t\t\tconst definedOrderIndex = dataGroups.length - legendOrder.length;\n\t\t\tconst definedOrder = dataGroups.slice(definedOrderIndex);\n\n\t\t\treturn definedOrder.concat(dataGroups.slice(0, definedOrderIndex));\n\t\t}\n\t\treturn dataGroups;\n\t}\n\n\taddAdditionalItem(additionalItem, itemConfig) {\n\t\tconst { width, height } = Configuration.legend.area;\n\n\t\tif (itemConfig.type === LegendItemType.RADIUS) {\n\t\t\tconst { iconData, color } = Configuration.legend.radius;\n\n\t\t\tconst circleEnter = additionalItem\n\t\t\t\t.attr('fill', 'none')\n\t\t\t\t.selectAll('circle')\n\t\t\t\t.data(iconData)\n\t\t\t\t.enter();\n\n\t\t\tcircleEnter\n\t\t\t\t.append('circle')\n\t\t\t\t.classed('radius', true)\n\t\t\t\t.attr('role', Roles.IMG)\n\t\t\t\t.attr('aria-label', 'radius')\n\t\t\t\t.attr('cx', (d) => d.cx)\n\t\t\t\t.attr('cy', (d) => d.cy)\n\t\t\t\t.attr('r', (d) => d.r)\n\t\t\t\t.attr('stroke', itemConfig.color ? itemConfig.color : color);\n\t\t} else if (itemConfig.type === LegendItemType.LINE) {\n\t\t\tconst lineConfig = Configuration.legend.line;\n\n\t\t\tif (additionalItem.select('line.line').empty()) {\n\t\t\t\tadditionalItem\n\t\t\t\t\t.append('line')\n\t\t\t\t\t.classed('line', true)\n\t\t\t\t\t.attr('role', Roles.IMG)\n\t\t\t\t\t.attr('aria-label', 'line')\n\t\t\t\t\t.attr('x1', 0)\n\t\t\t\t\t.attr('y1', lineConfig.yPosition)\n\t\t\t\t\t.attr('x2', width)\n\t\t\t\t\t.attr('y2', lineConfig.yPosition)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'stroke',\n\t\t\t\t\t\titemConfig.color ? itemConfig.color : lineConfig.color\n\t\t\t\t\t)\n\t\t\t\t\t.attr('stroke-width', lineConfig.strokeWidth);\n\t\t\t}\n\t\t} else if (itemConfig.type === LegendItemType.AREA) {\n\t\t\tconst color = itemConfig.color\n\t\t\t\t? itemConfig.color\n\t\t\t\t: Configuration.legend.area.color;\n\n\t\t\tif (additionalItem.select('rect.area').empty()) {\n\t\t\t\tadditionalItem\n\t\t\t\t\t.append('rect')\n\t\t\t\t\t.classed('area', true)\n\t\t\t\t\t.attr('role', Roles.IMG)\n\t\t\t\t\t.attr('aria-label', 'area')\n\t\t\t\t\t.attr('width', width)\n\t\t\t\t\t.attr('height', height)\n\t\t\t\t\t.attr('fill', color);\n\t\t\t}\n\t\t} else if (itemConfig.type === LegendItemType.SIZE) {\n\t\t\tconst { iconData, color } = Configuration.legend.size;\n\n\t\t\tconst sizeEnter = additionalItem\n\t\t\t\t.attr('fill', 'none')\n\t\t\t\t.attr('role', Roles.IMG)\n\t\t\t\t.attr('aria-label', 'size')\n\t\t\t\t.selectAll('rect')\n\t\t\t\t.data(iconData)\n\t\t\t\t.enter();\n\n\t\t\tsizeEnter\n\t\t\t\t.append('rect')\n\t\t\t\t.classed('size', true)\n\t\t\t\t.attr('width', (d) => d.width)\n\t\t\t\t.attr('height', (d) => d.height)\n\t\t\t\t.attr('y', (d) => 24 - d.height)\n\t\t\t\t.attr('stroke', itemConfig.color ? itemConfig.color : color)\n\t\t\t\t.attr('stroke-width', 1);\n\t\t} else if (itemConfig.type === LegendItemType.QUARTILE) {\n\t\t\tconst { iconData } = Configuration.legend.quartile;\n\n\t\t\t// Set customized color\n\t\t\tif (itemConfig.color) {\n\t\t\t\ticonData[0].color = itemConfig.color;\n\t\t\t}\n\n\t\t\tconst quartileEnter = additionalItem\n\t\t\t\t.selectAll('rect')\n\t\t\t\t.attr('role', Roles.IMG)\n\t\t\t\t.attr('aria-label', 'quartile')\n\t\t\t\t.data(iconData)\n\t\t\t\t.enter();\n\n\t\t\tquartileEnter\n\t\t\t\t.append('rect')\n\t\t\t\t.classed('quartile', true)\n\t\t\t\t.attr('x', (d) => d.x)\n\t\t\t\t.attr('y', (d) => d.y)\n\t\t\t\t.attr('width', (d) => d.width)\n\t\t\t\t.attr('height', (d) => d.height)\n\t\t\t\t.attr('fill', (d) => d.color);\n\t\t}\n\t}\n\n\ttruncateLegendText(addedLegendItemsText) {\n\t\tconst trucationOptions = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'legend',\n\t\t\t'truncation'\n\t\t);\n\t\t// Truncation\n\t\t// get user provided custom values for truncation\n\t\tconst truncationType = Tools.getProperty(trucationOptions, 'type');\n\t\tconst truncationThreshold = Tools.getProperty(\n\t\t\ttrucationOptions,\n\t\t\t'threshold'\n\t\t);\n\t\tconst truncationNumCharacter = Tools.getProperty(\n\t\t\ttrucationOptions,\n\t\t\t'numCharacter'\n\t\t);\n\n\t\t// truncate the legend label if it's too long\n\t\tif (truncationType !== TruncationTypes.NONE) {\n\t\t\taddedLegendItemsText.html(function (d) {\n\t\t\t\tif (d.name.length > truncationThreshold) {\n\t\t\t\t\treturn Tools.truncateLabel(\n\t\t\t\t\t\td.name,\n\t\t\t\t\t\ttruncationType,\n\t\t\t\t\t\ttruncationNumCharacter\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn d.name;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\taddedLegendItemsText.html((d) => d.name);\n\t\t}\n\t}\n\n\tbreakItemsIntoLines(addedLegendItems, className, itemConfig) {\n\t\tconst self = this;\n\t\tconst svg = this.getContainerSVG();\n\n\t\t// Check if there are disabled legend items\n\t\tconst { DISABLED } = Configuration.legend.items.status;\n\t\tconst dataGroups = this.model.getDataGroups();\n\t\tconst hasDeactivatedItems = dataGroups.some(\n\t\t\t(dataGroup) => dataGroup.status === DISABLED\n\t\t);\n\n\t\taddedLegendItems\n\t\t\t.merge(svg.selectAll(`g.${className}`))\n\t\t\t.each(function (d) {\n\t\t\t\tconst legendItem = select(this);\n\t\t\t\tconst svgDimensions = DOMUtils.getSVGElementSize(self.parent, {\n\t\t\t\t\tuseAttr: true,\n\t\t\t\t});\n\n\t\t\t\t// Set item position based on item type\n\t\t\t\tif (!d.type) {\n\t\t\t\t\titemConfig.hasDeactivatedItems = hasDeactivatedItems;\n\t\t\t\t\tself.setLegendItemPosition(\n\t\t\t\t\t\tlegendItem,\n\t\t\t\t\t\tsvgDimensions,\n\t\t\t\t\t\titemConfig,\n\t\t\t\t\t\tLegendItemType.CHECKBOX\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tself.setLegendItemPosition(\n\t\t\t\t\t\tlegendItem,\n\t\t\t\t\t\tsvgDimensions,\n\t\t\t\t\t\titemConfig,\n\t\t\t\t\t\td.type\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tsetLegendItemPosition(\n\t\tlegendItem,\n\t\tparentSVGDimension,\n\t\titemConfig,\n\t\titemType\n\t) {\n\t\tconst legendOrientation = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'legend',\n\t\t\t'orientation'\n\t\t);\n\n\t\t// Configs\n\t\tconst legendItemsHorizontalSpacing =\n\t\t\tConfiguration.legend.items.horizontalSpace;\n\t\tconst legendItemsVerticalSpacing =\n\t\t\tConfiguration.legend.items.verticalSpace;\n\n\t\tconst legendTextYOffset = Configuration.legend.items.textYOffset;\n\t\tconst iconWidth =\n\t\t\titemType === LegendItemType.CHECKBOX ||\n\t\t\t\titemType === LegendItemType.RADIUS\n\t\t\t\t? Configuration.legend.checkbox.radius * 2\n\t\t\t\t: Configuration.legend.area.width;\n\t\tconst spaceAfter = Configuration.legend.items.spaceAfter;\n\n\t\tconst legendItemTextDimensions = DOMUtils.getSVGElementSize(\n\t\t\tlegendItem.select('text'),\n\t\t\t{ useBBox: true }\n\t\t);\n\t\tconst translateOffset = Configuration.legend.area.width / 2 - 1;\n\t\t// Check and update position\n\t\tif (\n\t\t\titemConfig.itemIndexInLine === 0 ||\n\t\t\titemConfig.lastLegendItemTextWidth === 0 ||\n\t\t\tlegendOrientation === LegendOrientations.VERTICAL\n\t\t) {\n\t\t\tif (itemConfig.itemIndexInLine > 0) {\n\t\t\t\titemConfig.lineNumber++;\n\t\t\t}\n\t\t} else {\n\t\t\titemConfig.startingPoint +=\n\t\t\t\titemConfig.lastLegendItemTextWidth +\n\t\t\t\ticonWidth +\n\t\t\t\tspaceAfter +\n\t\t\t\tlegendItemsHorizontalSpacing;\n\n\t\t\t// Place legends in a new line if space is not enough\n\t\t\tif (\n\t\t\t\titemConfig.startingPoint +\n\t\t\t\ticonWidth +\n\t\t\t\tspaceAfter +\n\t\t\t\tlegendItemTextDimensions.width >\n\t\t\t\tparentSVGDimension.width\n\t\t\t) {\n\t\t\t\titemConfig.lineNumber++;\n\t\t\t\titemConfig.startingPoint =\n\t\t\t\t\ticonWidth === 24 ? translateOffset : 0;\n\t\t\t\titemConfig.itemIndexInLine = 0;\n\t\t\t}\n\t\t}\n\n\t\titemConfig.lastLegendItemTextWidth = legendItemTextDimensions.width;\n\n\t\tconst yPosition = itemConfig.lineNumber * legendItemsVerticalSpacing;\n\t\tconst yTextPosition = legendTextYOffset + yPosition + 3;\n\n\t\tif (itemType === LegendItemType.CHECKBOX) {\n\t\t\tlegendItem\n\t\t\t\t.select('rect.checkbox')\n\t\t\t\t.attr('x', itemConfig.startingPoint)\n\t\t\t\t.attr('y', yPosition);\n\n\t\t\t// Position text\n\t\t\tlegendItem\n\t\t\t\t.select('text')\n\t\t\t\t.attr('x', itemConfig.startingPoint + iconWidth + spaceAfter)\n\t\t\t\t.attr('y', yTextPosition);\n\n\t\t\t// Test if legendItems are placed in the correct direction\n\t\t\tconst testHorizontal =\n\t\t\t\t(!legendOrientation ||\n\t\t\t\t\tlegendOrientation === LegendOrientations.HORIZONTAL) &&\n\t\t\t\tparseInt(legendItem.select('rect.checkbox').attr('y')) % 24 ===\n\t\t\t\t0;\n\n\t\t\tconst testVertical =\n\t\t\t\tlegendOrientation === LegendOrientations.VERTICAL &&\n\t\t\t\tlegendItem.select('rect.checkbox').attr('x') === '0';\n\n\t\t\tconst hasCorrectLegendDirection = testHorizontal || testVertical;\n\n\t\t\t// Render checkbox check icon\n\t\t\tif (\n\t\t\t\titemConfig.hasDeactivatedItems &&\n\t\t\t\tlegendItem.select('g.check').empty() &&\n\t\t\t\thasCorrectLegendDirection\n\t\t\t) {\n\t\t\t\tlegendItem.append('g').classed('check', true).html(`\n\t\t\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\"\n\t\t\t\t\t\t\tviewBox=\"0 0 32 32\" aria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle=\"will-change: transform;\">\n\t\t\t\t\t\t\t<path d=\"M13 21.2l-7.1-7.1-1.4 1.4 7.1 7.1L13 24 27.1 9.9l-1.4-1.5z\"></path>\n\t\t\t\t\t\t\t<title>Checkmark</title>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`);\n\n\t\t\t\tlegendItem\n\t\t\t\t\t.select('g.check svg')\n\t\t\t\t\t.attr('width', iconWidth - 1)\n\t\t\t\t\t.attr('height', iconWidth - 1)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'x',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\tlegendItem.select('rect.checkbox').attr('x')\n\t\t\t\t\t\t) + 0.5\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'y',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\tlegendItem.select('rect.checkbox').attr('y')\n\t\t\t\t\t\t) + 0.5\n\t\t\t\t\t);\n\t\t\t} else if (\n\t\t\t\t!itemConfig.hasDeactivatedItems &&\n\t\t\t\t!legendItem.select('g.check').empty()\n\t\t\t) {\n\t\t\t\tlegendItem.select('g.check').remove();\n\t\t\t}\n\t\t} else if (itemType === LegendItemType.RADIUS) {\n\t\t\tlegendItem\n\t\t\t\t.selectAll('circle.radius')\n\t\t\t\t.attr('cx', (d) => itemConfig.startingPoint + d.cx)\n\t\t\t\t.attr('cy', (d) => yPosition + d.cy);\n\n\t\t\tlegendItem\n\t\t\t\t.select('text')\n\t\t\t\t.attr('x', itemConfig.startingPoint + iconWidth + spaceAfter)\n\t\t\t\t.attr('y', yTextPosition);\n\t\t} else if (itemType === LegendItemType.SIZE) {\n\t\t\tlegendItem\n\t\t\t\t.selectAll('g.icon')\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${itemConfig.startingPoint - translateOffset}, ${yPosition - 12\n\t\t\t\t\t})`\n\t\t\t\t);\n\n\t\t\tlegendItem\n\t\t\t\t.select('text')\n\t\t\t\t.attr(\n\t\t\t\t\t'x',\n\t\t\t\t\titemConfig.startingPoint +\n\t\t\t\t\ticonWidth +\n\t\t\t\t\tspaceAfter -\n\t\t\t\t\ttranslateOffset\n\t\t\t\t)\n\t\t\t\t.attr('y', yTextPosition);\n\t\t} else {\n\t\t\tlegendItem\n\t\t\t\t.selectAll('g.icon')\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${itemConfig.startingPoint - translateOffset\n\t\t\t\t\t}, ${yPosition})`\n\t\t\t\t);\n\n\t\t\tlegendItem\n\t\t\t\t.select('text')\n\t\t\t\t.attr(\n\t\t\t\t\t'x',\n\t\t\t\t\titemConfig.startingPoint +\n\t\t\t\t\ticonWidth +\n\t\t\t\t\tspaceAfter -\n\t\t\t\t\ttranslateOffset\n\t\t\t\t)\n\t\t\t\t.attr('y', yTextPosition);\n\t\t}\n\n\t\titemConfig.itemIndexInLine++;\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst svg = this.getContainerSVG();\n\t\tconst options = this.getOptions();\n\t\tconst legendOptions = Tools.getProperty(options, 'legend');\n\t\tconst truncationThreshold = Tools.getProperty(\n\t\t\tlegendOptions,\n\t\t\t'truncation',\n\t\t\t'threshold'\n\t\t);\n\n\t\tsvg.selectAll('g.legend-item')\n\t\t\t.on('mouseover', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Legend.ITEM_HOVER, {\n\t\t\t\t\thoveredElement: select(this),\n\t\t\t\t});\n\n\t\t\t\t// Configs\n\t\t\t\tconst checkboxRadius = Configuration.legend.checkbox.radius;\n\t\t\t\tconst hoveredItem = select(this);\n\t\t\t\thoveredItem.select('rect.checkbox').classed('hovered', true);\n\n\t\t\t\thoveredItem\n\t\t\t\t\t.append('rect')\n\t\t\t\t\t.classed('hover-stroke', true)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'x',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\thoveredItem.select('rect.checkbox').attr('x')\n\t\t\t\t\t\t) - 2\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'y',\n\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\thoveredItem.select('rect.checkbox').attr('y')\n\t\t\t\t\t\t) - 2\n\t\t\t\t\t)\n\t\t\t\t\t.attr('width', checkboxRadius * 2 + 4)\n\t\t\t\t\t.attr('height', checkboxRadius * 2 + 4)\n\t\t\t\t\t.attr('rx', 3)\n\t\t\t\t\t.attr('ry', 3)\n\t\t\t\t\t.lower();\n\n\t\t\t\tconst hoveredItemData = hoveredItem.datum() as any;\n\t\t\t\tif (hoveredItemData.name.length > truncationThreshold) {\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\t\thoveredElement: hoveredItem,\n\t\t\t\t\t\tcontent: hoveredItemData.name,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mousemove', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE);\n\t\t\t})\n\t\t\t.on('click', function () {\n\t\t\t\tself.services.events.dispatchEvent(Events.Legend.ITEM_CLICK, {\n\t\t\t\t\tclickedElement: select(this),\n\t\t\t\t});\n\n\t\t\t\tconst clickedItem = select(this);\n\t\t\t\tconst clickedItemData = clickedItem.datum() as any;\n\n\t\t\t\tself.model.toggleDataLabel(clickedItemData.name);\n\t\t\t})\n\t\t\t.on('mouseout', function () {\n\t\t\t\tconst hoveredItem = select(this);\n\t\t\t\thoveredItem.select('rect.hover-stroke').remove();\n\t\t\t\thoveredItem.select('rect.checkbox').classed('hovered', false);\n\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE);\n\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\t\t\t{\n\t\t\t\t\t\thoveredElement: hoveredItem,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\n\t\tsvg.selectAll('g.legend-item rect.checkbox').on('keyup', function (d) {\n\t\t\tif (event.key && (event.key === 'Enter' || event.key === ' ')) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tself.model.toggleDataLabel(d.name);\n\t\t\t}\n\t\t});\n\n\t\tsvg.selectAll('g.additional-item').on('mouseover', function () {\n\t\t\tconst hoveredItem = select(this);\n\n\t\t\tconst hoveredItemData = hoveredItem.datum() as any;\n\t\t\tif (hoveredItemData.name.length > truncationThreshold) {\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement: hoveredItem,\n\t\t\t\t\tcontent: hoveredItemData.name,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
@@ -73,16 +73,24 @@ var AxisChartsTooltip = /** @class */ (function (_super) {
73
73
  label: rangeLabel,
74
74
  value: datum[rangeIdentifier],
75
75
  },
76
- {
77
- label: options.tooltip.groupLabel,
78
- value: datum[groupMapsTo],
79
- color: this.model.getFillColor(datum[groupMapsTo]),
80
- class: this.model.getColorClassName({
81
- classNameTypes: [ColorClassNameTypes.TOOLTIP],
82
- dataGroupName: datum[groupMapsTo],
83
- }),
84
- },
85
76
  ];
77
+ if (e.detail.additionalItems) {
78
+ e.detail.additionalItems.forEach(function (additionalItem) {
79
+ return items.push({
80
+ label: additionalItem.label,
81
+ value: additionalItem.value,
82
+ });
83
+ });
84
+ }
85
+ items.push({
86
+ label: options.tooltip.groupLabel,
87
+ value: datum[groupMapsTo],
88
+ color: this.model.getFillColor(datum[groupMapsTo]),
89
+ class: this.model.getColorClassName({
90
+ classNameTypes: [ColorClassNameTypes.TOOLTIP],
91
+ dataGroupName: datum[groupMapsTo],
92
+ }),
93
+ });
86
94
  }
87
95
  else if (data.length > 1) {
88
96
  items = [