@carbon/charts 0.53.2 → 0.54.0

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 (117) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/build/demo/data/CHART_TYPES.d.ts +5 -0
  3. package/build/demo/data/heatmap.d.ts +96 -0
  4. package/build/demo/data/index.d.ts +1 -0
  5. package/build/src/charts/heatmap.d.ts +10 -0
  6. package/build/src/charts/index.d.ts +1 -0
  7. package/build/src/components/axes/axis.d.ts +7 -1
  8. package/build/src/components/axes/hover-axis.d.ts +10 -0
  9. package/build/src/components/axes/toolbar.d.ts +5 -1
  10. package/build/src/components/essentials/color-scale-legend.d.ts +11 -0
  11. package/build/src/components/graphs/heatmap.d.ts +25 -0
  12. package/build/src/components/index.d.ts +2 -0
  13. package/build/src/configuration-non-customizable.d.ts +12 -0
  14. package/build/src/configuration.d.ts +2 -1
  15. package/build/src/interfaces/charts.d.ts +35 -2
  16. package/build/src/interfaces/components.d.ts +19 -0
  17. package/build/src/interfaces/enums.d.ts +24 -1
  18. package/build/src/interfaces/events.d.ts +15 -2
  19. package/build/src/model/cartesian-charts.d.ts +8 -1
  20. package/build/src/model/heatmap.d.ts +57 -0
  21. package/build/src/services/scales-cartesian.d.ts +1 -0
  22. package/bundle.js +1 -1
  23. package/charts/heatmap.d.ts +10 -0
  24. package/charts/heatmap.js +138 -0
  25. package/charts/heatmap.js.map +1 -0
  26. package/charts/index.d.ts +1 -0
  27. package/charts/index.js +1 -0
  28. package/charts/index.js.map +1 -1
  29. package/components/axes/axis.d.ts +7 -1
  30. package/components/axes/axis.js +9 -2
  31. package/components/axes/axis.js.map +1 -1
  32. package/components/axes/hover-axis.d.ts +10 -0
  33. package/components/axes/hover-axis.js +235 -0
  34. package/components/axes/hover-axis.js.map +1 -0
  35. package/components/axes/toolbar.d.ts +5 -1
  36. package/components/axes/toolbar.js +100 -34
  37. package/components/axes/toolbar.js.map +1 -1
  38. package/components/axes/two-dimensional-axes.js +8 -3
  39. package/components/axes/two-dimensional-axes.js.map +1 -1
  40. package/components/essentials/color-scale-legend.d.ts +11 -0
  41. package/components/essentials/color-scale-legend.js +236 -0
  42. package/components/essentials/color-scale-legend.js.map +1 -0
  43. package/components/graphs/heatmap.d.ts +25 -0
  44. package/components/graphs/heatmap.js +369 -0
  45. package/components/graphs/heatmap.js.map +1 -0
  46. package/components/index.d.ts +2 -0
  47. package/components/index.js +2 -0
  48. package/components/index.js.map +1 -1
  49. package/configuration-non-customizable.d.ts +12 -0
  50. package/configuration-non-customizable.js +13 -0
  51. package/configuration-non-customizable.js.map +1 -1
  52. package/configuration.d.ts +2 -1
  53. package/configuration.js +13 -1
  54. package/configuration.js.map +1 -1
  55. package/demo/data/CHART_TYPES.d.ts +5 -0
  56. package/demo/data/CHART_TYPES.js +5 -0
  57. package/demo/data/CHART_TYPES.js.map +1 -1
  58. package/demo/data/bundle.js +1 -1
  59. package/demo/data/heatmap.d.ts +96 -0
  60. package/demo/data/heatmap.js +1135 -0
  61. package/demo/data/heatmap.js.map +1 -0
  62. package/demo/data/index.d.ts +1 -0
  63. package/demo/data/index.js +30 -0
  64. package/demo/data/index.js.map +1 -1
  65. package/demo/data/toolbar.js +12 -0
  66. package/demo/data/toolbar.js.map +1 -1
  67. package/demo/styles.css +16458 -9179
  68. package/demo/styles.css.map +1 -1
  69. package/demo/styles.min.css +1 -1
  70. package/demo/styles.min.css.map +1 -1
  71. package/demo/tsconfig.tsbuildinfo +19 -5
  72. package/interfaces/charts.d.ts +35 -2
  73. package/interfaces/charts.js.map +1 -1
  74. package/interfaces/components.d.ts +19 -0
  75. package/interfaces/components.js.map +1 -1
  76. package/interfaces/enums.d.ts +24 -1
  77. package/interfaces/enums.js +26 -0
  78. package/interfaces/enums.js.map +1 -1
  79. package/interfaces/events.d.ts +15 -2
  80. package/interfaces/events.js +14 -0
  81. package/interfaces/events.js.map +1 -1
  82. package/model/cartesian-charts.d.ts +8 -1
  83. package/model/cartesian-charts.js +4 -2
  84. package/model/cartesian-charts.js.map +1 -1
  85. package/model/heatmap.d.ts +57 -0
  86. package/model/heatmap.js +289 -0
  87. package/model/heatmap.js.map +1 -0
  88. package/package.json +1 -1
  89. package/services/scales-cartesian.d.ts +1 -0
  90. package/services/scales-cartesian.js +16 -0
  91. package/services/scales-cartesian.js.map +1 -1
  92. package/services/zoom.js +5 -0
  93. package/services/zoom.js.map +1 -1
  94. package/styles/color-palatte.scss +96 -0
  95. package/styles/colors.scss +35 -1
  96. package/styles/components/_axis.scss +41 -0
  97. package/styles/components/_color-legend.scss +24 -0
  98. package/styles/components/index.scss +1 -0
  99. package/styles/graphs/_heatmap.scss +70 -0
  100. package/styles/graphs/index.scss +1 -0
  101. package/styles-g10.css +2000 -179
  102. package/styles-g10.css.map +1 -1
  103. package/styles-g10.min.css +1 -1
  104. package/styles-g10.min.css.map +1 -1
  105. package/styles-g100.css +2003 -182
  106. package/styles-g100.css.map +1 -1
  107. package/styles-g100.min.css +1 -1
  108. package/styles-g100.min.css.map +1 -1
  109. package/styles-g90.css +2004 -180
  110. package/styles-g90.css.map +1 -1
  111. package/styles-g90.min.css +1 -1
  112. package/styles-g90.min.css.map +1 -1
  113. package/styles.css +2000 -179
  114. package/styles.css.map +1 -1
  115. package/styles.min.css +1 -1
  116. package/styles.min.css.map +1 -1
  117. package/tsconfig.tsbuildinfo +182 -59
@@ -0,0 +1,235 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ extendStatics(d, b);
10
+ function __() { this.constructor = d; }
11
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
12
+ };
13
+ })();
14
+ var __assign = (this && this.__assign) || function () {
15
+ __assign = Object.assign || function(t) {
16
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
17
+ s = arguments[i];
18
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
19
+ t[p] = s[p];
20
+ }
21
+ return t;
22
+ };
23
+ return __assign.apply(this, arguments);
24
+ };
25
+ // Internal Imports
26
+ import { Axis } from './axis';
27
+ import { AxisPositions, Events, ScaleTypes } from '../../interfaces';
28
+ import { DOMUtils } from '../../services';
29
+ import { Tools } from '../../tools';
30
+ import * as Configuration from '../../configuration';
31
+ // D3 Imports
32
+ import { select } from 'd3-selection';
33
+ var HoverAxis = /** @class */ (function (_super) {
34
+ __extends(HoverAxis, _super);
35
+ function HoverAxis(model, services, configs) {
36
+ return _super.call(this, model, services, configs) || this;
37
+ }
38
+ HoverAxis.prototype.render = function (animate) {
39
+ if (animate === void 0) { animate = true; }
40
+ _super.prototype.render.call(this, animate);
41
+ // Remove existing event listeners to avoid flashing behavior
42
+ _super.prototype.destroy.call(this);
43
+ var axisPosition = this.configs.position;
44
+ var svg = this.getComponentContainer();
45
+ var container = DOMUtils.appendOrSelect(svg, "g.axis." + axisPosition);
46
+ var self = this;
47
+ container.selectAll('g.tick').each(function (_, index) {
48
+ var g = select(this);
49
+ g.classed('tick-hover', true).attr('tabindex', index === 0 ? 0 : -1);
50
+ var textNode = g.select('text');
51
+ var _a = DOMUtils.getSVGElementSize(textNode, {
52
+ useBBox: true,
53
+ }), width = _a.width, height = _a.height;
54
+ var rectangle = DOMUtils.appendOrSelect(g, 'rect.axis-holder');
55
+ var x = 0, y = 0;
56
+ // Depending on axis position, apply correct translation & rotation to align the rect
57
+ // with the text
58
+ switch (axisPosition) {
59
+ case AxisPositions.LEFT:
60
+ x = -width + Number(textNode.attr('x'));
61
+ y = -(height / 2);
62
+ break;
63
+ case AxisPositions.RIGHT:
64
+ x = Math.abs(Number(textNode.attr('x')));
65
+ y = -(height / 2);
66
+ break;
67
+ case AxisPositions.TOP:
68
+ x = -(width / 2);
69
+ y = -height + Number(textNode.attr('y')) / 2;
70
+ if (self.truncation[axisPosition]) {
71
+ x = 0;
72
+ rectangle.attr('transform', "rotate(-45)");
73
+ }
74
+ break;
75
+ case AxisPositions.BOTTOM:
76
+ x = -(width / 2);
77
+ y = height / 2 - 2;
78
+ if (self.truncation[axisPosition]) {
79
+ x = -width;
80
+ rectangle.attr('transform', "rotate(-45)");
81
+ }
82
+ break;
83
+ }
84
+ // Translates x position -4 left to keep center after padding
85
+ // Adds padding on left & right
86
+ rectangle
87
+ .attr('x', x - Configuration.axis.hover.rectanglePadding)
88
+ .attr('y', y)
89
+ .attr('width', width + Configuration.axis.hover.rectanglePadding * 2)
90
+ .attr('height', height)
91
+ .lower();
92
+ // Add keyboard event listeners to each group element
93
+ g.on('keydown', function (event) {
94
+ // Choose specific arrow key depending on the axis
95
+ if (axisPosition === AxisPositions.LEFT ||
96
+ axisPosition === AxisPositions.RIGHT) {
97
+ if (event.key && event.key === 'ArrowUp') {
98
+ self.goNext(this, event);
99
+ }
100
+ else if (event.key && event.key === 'ArrowDown') {
101
+ self.goPrevious(this, event);
102
+ }
103
+ }
104
+ else {
105
+ if (event.key && event.key === 'ArrowLeft') {
106
+ self.goPrevious(this, event);
107
+ }
108
+ else if (event.key && event.key === 'ArrowRight') {
109
+ self.goNext(this, event);
110
+ }
111
+ }
112
+ });
113
+ });
114
+ // Add event listeners to element group
115
+ this.addEventListeners();
116
+ };
117
+ HoverAxis.prototype.addEventListeners = function () {
118
+ var svg = this.getComponentContainer();
119
+ var axisPosition = this.configs.position;
120
+ var container = DOMUtils.appendOrSelect(svg, "g.axis." + axisPosition);
121
+ var options = this.getOptions();
122
+ var axisOptions = Tools.getProperty(options, 'axes', axisPosition);
123
+ var axisScaleType = Tools.getProperty(axisOptions, 'scaleType');
124
+ var truncationThreshold = Tools.getProperty(axisOptions, 'truncation', 'threshold');
125
+ var self = this;
126
+ container
127
+ .selectAll('g.tick.tick-hover')
128
+ .on('mouseover', function (event) {
129
+ var hoveredElement = select(this).select('text');
130
+ var datum = hoveredElement.datum();
131
+ // Dispatch mouse event
132
+ self.services.events.dispatchEvent(Events.Axis.LABEL_MOUSEOVER, {
133
+ event: event,
134
+ element: hoveredElement,
135
+ datum: datum,
136
+ });
137
+ if (axisScaleType === ScaleTypes.LABELS &&
138
+ datum.length > truncationThreshold) {
139
+ self.services.events.dispatchEvent(Events.Tooltip.SHOW, {
140
+ event: event,
141
+ element: hoveredElement,
142
+ datum: datum,
143
+ });
144
+ }
145
+ })
146
+ .on('mousemove', function (event) {
147
+ var hoveredElement = select(this).select('text');
148
+ var datum = hoveredElement.datum();
149
+ // Dispatch mouse event
150
+ self.services.events.dispatchEvent(Events.Axis.LABEL_MOUSEMOVE, {
151
+ event: event,
152
+ element: hoveredElement,
153
+ datum: datum,
154
+ });
155
+ self.services.events.dispatchEvent(Events.Tooltip.MOVE, {
156
+ event: event,
157
+ });
158
+ })
159
+ .on('click', function (event) {
160
+ // Dispatch mouse event
161
+ self.services.events.dispatchEvent(Events.Axis.LABEL_CLICK, {
162
+ event: event,
163
+ element: select(this).select('text'),
164
+ datum: select(this).select('text').datum(),
165
+ });
166
+ })
167
+ .on('mouseout', function (event) {
168
+ // Dispatch mouse event
169
+ self.services.events.dispatchEvent(Events.Axis.LABEL_MOUSEOUT, {
170
+ event: event,
171
+ element: select(this).select('text'),
172
+ datum: select(this).select('text').datum(),
173
+ });
174
+ if (axisScaleType === ScaleTypes.LABELS) {
175
+ self.services.events.dispatchEvent(Events.Tooltip.HIDE);
176
+ }
177
+ })
178
+ .on('focus', function (event) {
179
+ var coordinates = { clientX: 0, clientY: 0 };
180
+ if (event.target) {
181
+ // Focus element since we are using arrow keys
182
+ event.target.focus();
183
+ var boundingRect = event.target.getBoundingClientRect();
184
+ coordinates.clientX = boundingRect.x;
185
+ coordinates.clientY = boundingRect.y;
186
+ }
187
+ // Dispatch focus event
188
+ self.services.events.dispatchEvent(Events.Axis.LABEL_FOCUS, {
189
+ event: __assign(__assign({}, event), coordinates),
190
+ element: select(this),
191
+ datum: select(this).select('text').datum(),
192
+ });
193
+ })
194
+ .on('blur', function (event) {
195
+ // Dispatch blur event
196
+ self.services.events.dispatchEvent(Events.Axis.LABEL_BLUR, {
197
+ event: event,
198
+ element: select(this),
199
+ datum: select(this).select('text').datum(),
200
+ });
201
+ });
202
+ };
203
+ // Focus on the next HTML element sibling
204
+ HoverAxis.prototype.goNext = function (element, event) {
205
+ if (element.nextElementSibling &&
206
+ element.nextElementSibling.tagName !== 'path') {
207
+ element.nextElementSibling.dispatchEvent(new Event('focus'));
208
+ }
209
+ event.preventDefault();
210
+ };
211
+ // Focus on the previous HTML element sibling
212
+ HoverAxis.prototype.goPrevious = function (element, event) {
213
+ if (element.previousElementSibling &&
214
+ element.previousElementSibling.tagName !== 'path') {
215
+ element.previousElementSibling.dispatchEvent(new Event('focus'));
216
+ }
217
+ event.preventDefault();
218
+ };
219
+ HoverAxis.prototype.destroy = function () {
220
+ var svg = this.getComponentContainer();
221
+ var axisPosition = this.configs.position;
222
+ var container = DOMUtils.appendOrSelect(svg, "g.axis." + axisPosition);
223
+ // Remove event listeners
224
+ container
225
+ .selectAll('g.tick.tick-hover')
226
+ .on('mouseover', null)
227
+ .on('mousemove', null)
228
+ .on('mouseout', null)
229
+ .on('focus', null)
230
+ .on('blur', null);
231
+ };
232
+ return HoverAxis;
233
+ }(Axis));
234
+ export { HoverAxis };
235
+ //# sourceMappingURL=../../../src/components/axes/hover-axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-axis.js","sourceRoot":"","sources":["hover-axis.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Axis } from './axis';\nimport { AxisPositions, Events, ScaleTypes } from '../../interfaces';\nimport { ChartModel } from '../../model/model';\nimport { DOMUtils } from '../../services';\nimport { Tools } from '../../tools';\nimport * as Configuration from '../../configuration';\n\n// D3 Imports\nimport { select } from 'd3-selection';\n\nexport class HoverAxis extends Axis {\n\tconstructor(model: ChartModel, services: any, configs?: any) {\n\t\tsuper(model, services, configs);\n\t}\n\n\trender(animate = true) {\n\t\tsuper.render(animate);\n\n\t\t// Remove existing event listeners to avoid flashing behavior\n\t\tsuper.destroy();\n\n\t\tconst { position: axisPosition } = this.configs;\n\t\tconst svg = this.getComponentContainer();\n\t\tconst container = DOMUtils.appendOrSelect(\n\t\t\tsvg,\n\t\t\t`g.axis.${axisPosition}`\n\t\t);\n\n\t\tconst self = this;\n\t\tcontainer.selectAll('g.tick').each(function (_, index) {\n\t\t\tconst g = select(this);\n\t\t\tg.classed('tick-hover', true).attr(\n\t\t\t\t'tabindex',\n\t\t\t\tindex === 0 ? 0 : -1\n\t\t\t);\n\t\t\tconst textNode = g.select('text');\n\t\t\tconst { width, height } = DOMUtils.getSVGElementSize(textNode, {\n\t\t\t\tuseBBox: true,\n\t\t\t});\n\n\t\t\tconst rectangle = DOMUtils.appendOrSelect(g, 'rect.axis-holder');\n\n\t\t\tlet x = 0,\n\t\t\t\ty = 0;\n\n\t\t\t// Depending on axis position, apply correct translation & rotation to align the rect\n\t\t\t// with the text\n\t\t\tswitch (axisPosition) {\n\t\t\t\tcase AxisPositions.LEFT:\n\t\t\t\t\tx = -width + Number(textNode.attr('x'));\n\t\t\t\t\ty = -(height / 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.RIGHT:\n\t\t\t\t\tx = Math.abs(Number(textNode.attr('x')));\n\t\t\t\t\ty = -(height / 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.TOP:\n\t\t\t\t\tx = -(width / 2);\n\t\t\t\t\ty = -height + Number(textNode.attr('y')) / 2;\n\n\t\t\t\t\tif (self.truncation[axisPosition]) {\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\trectangle.attr('transform', `rotate(-45)`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.BOTTOM:\n\t\t\t\t\tx = -(width / 2);\n\t\t\t\t\ty = height / 2 - 2;\n\n\t\t\t\t\tif (self.truncation[axisPosition]) {\n\t\t\t\t\t\tx = -width;\n\t\t\t\t\t\trectangle.attr('transform', `rotate(-45)`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Translates x position -4 left to keep center after padding\n\t\t\t// Adds padding on left & right\n\t\t\trectangle\n\t\t\t\t.attr('x', x - Configuration.axis.hover.rectanglePadding)\n\t\t\t\t.attr('y', y)\n\t\t\t\t.attr(\n\t\t\t\t\t'width',\n\t\t\t\t\twidth + Configuration.axis.hover.rectanglePadding * 2\n\t\t\t\t)\n\t\t\t\t.attr('height', height)\n\t\t\t\t.lower();\n\n\t\t\t// Add keyboard event listeners to each group element\n\t\t\tg.on('keydown', function (event: KeyboardEvent) {\n\t\t\t\t// Choose specific arrow key depending on the axis\n\t\t\t\tif (\n\t\t\t\t\taxisPosition === AxisPositions.LEFT ||\n\t\t\t\t\taxisPosition === AxisPositions.RIGHT\n\t\t\t\t) {\n\t\t\t\t\tif (event.key && event.key === 'ArrowUp') {\n\t\t\t\t\t\tself.goNext(this as HTMLElement, event);\n\t\t\t\t\t} else if (event.key && event.key === 'ArrowDown') {\n\t\t\t\t\t\tself.goPrevious(this as HTMLElement, event);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (event.key && event.key === 'ArrowLeft') {\n\t\t\t\t\t\tself.goPrevious(this as HTMLElement, event);\n\t\t\t\t\t} else if (event.key && event.key === 'ArrowRight') {\n\t\t\t\t\t\tself.goNext(this as HTMLElement, event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Add event listeners to element group\n\t\tthis.addEventListeners();\n\t}\n\n\taddEventListeners() {\n\t\tconst svg = this.getComponentContainer();\n\t\tconst { position: axisPosition } = this.configs;\n\t\tconst container = DOMUtils.appendOrSelect(\n\t\t\tsvg,\n\t\t\t`g.axis.${axisPosition}`\n\t\t);\n\t\tconst options = this.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, 'axes', axisPosition);\n\t\tconst axisScaleType = Tools.getProperty(axisOptions, 'scaleType');\n\t\tconst truncationThreshold = Tools.getProperty(\n\t\t\taxisOptions,\n\t\t\t'truncation',\n\t\t\t'threshold'\n\t\t);\n\n\t\tconst self = this;\n\t\tcontainer\n\t\t\t.selectAll('g.tick.tick-hover')\n\t\t\t.on('mouseover', function (event) {\n\t\t\t\tconst hoveredElement = select(this).select('text');\n\t\t\t\tconst datum = hoveredElement.datum() as string;\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Axis.LABEL_MOUSEOVER,\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\taxisScaleType === ScaleTypes.LABELS &&\n\t\t\t\t\tdatum.length > truncationThreshold\n\t\t\t\t) {\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mousemove', function (event) {\n\t\t\t\tconst hoveredElement = select(this).select('text');\n\t\t\t\tconst datum = hoveredElement.datum() as string;\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Axis.LABEL_MOUSEMOVE,\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('click', function (event) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Axis.LABEL_CLICK, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: select(this).select('text'),\n\t\t\t\t\tdatum: select(this).select('text').datum(),\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('mouseout', function (event) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Axis.LABEL_MOUSEOUT, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: select(this).select('text'),\n\t\t\t\t\tdatum: select(this).select('text').datum(),\n\t\t\t\t});\n\n\t\t\t\tif (axisScaleType === ScaleTypes.LABELS) {\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('focus', function (event) {\n\t\t\t\tconst coordinates = { clientX: 0, clientY: 0 };\n\n\t\t\t\tif (event.target) {\n\t\t\t\t\t// Focus element since we are using arrow keys\n\t\t\t\t\tevent.target.focus();\n\t\t\t\t\tconst boundingRect = event.target.getBoundingClientRect();\n\t\t\t\t\tcoordinates.clientX = boundingRect.x;\n\t\t\t\t\tcoordinates.clientY = boundingRect.y;\n\t\t\t\t}\n\n\t\t\t\t// Dispatch focus event\n\t\t\t\tself.services.events.dispatchEvent(Events.Axis.LABEL_FOCUS, {\n\t\t\t\t\tevent: { ...event, ...coordinates },\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum: select(this).select('text').datum(),\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('blur', function (event) {\n\t\t\t\t// Dispatch blur event\n\t\t\t\tself.services.events.dispatchEvent(Events.Axis.LABEL_BLUR, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum: select(this).select('text').datum(),\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\t// Focus on the next HTML element sibling\n\tprivate goNext(element: HTMLElement, event: Event) {\n\t\tif (\n\t\t\telement.nextElementSibling &&\n\t\t\telement.nextElementSibling.tagName !== 'path'\n\t\t) {\n\t\t\telement.nextElementSibling.dispatchEvent(new Event('focus'));\n\t\t}\n\n\t\tevent.preventDefault();\n\t}\n\n\t// Focus on the previous HTML element sibling\n\tprivate goPrevious(element: HTMLElement, event: Event) {\n\t\tif (\n\t\t\telement.previousElementSibling &&\n\t\t\telement.previousElementSibling.tagName !== 'path'\n\t\t) {\n\t\t\telement.previousElementSibling.dispatchEvent(new Event('focus'));\n\t\t}\n\n\t\tevent.preventDefault();\n\t}\n\n\tdestroy() {\n\t\tconst svg = this.getComponentContainer();\n\t\tconst { position: axisPosition } = this.configs;\n\t\tconst container = DOMUtils.appendOrSelect(\n\t\t\tsvg,\n\t\t\t`g.axis.${axisPosition}`\n\t\t);\n\n\t\t// Remove event listeners\n\t\tcontainer\n\t\t\t.selectAll('g.tick.tick-hover')\n\t\t\t.on('mouseover', null)\n\t\t\t.on('mousemove', null)\n\t\t\t.on('mouseout', null)\n\t\t\t.on('focus', null)\n\t\t\t.on('blur', null);\n\t}\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { Component } from '../component';
2
2
  import { RenderTypes, ToolbarControlTypes } from '../../interfaces';
3
3
  export declare class Toolbar extends Component {
4
+ static buttonID: number;
4
5
  type: string;
5
6
  renderType: RenderTypes;
6
7
  overflowButton: any;
@@ -15,6 +16,7 @@ export declare class Toolbar extends Component {
15
16
  focusOnPreviousEnabledMenuItem(currentItemIndex: any): void;
16
17
  focusOnNextEnabledMenuItem(currentItemIndex: any): void;
17
18
  toggleOverflowMenu(event: any): void;
19
+ triggerFunctionAndEvent(control: any, event: any, element?: any): void;
18
20
  getControlConfigs(): {
19
21
  buttonList: any[];
20
22
  overflowMenuItemList?: undefined;
@@ -28,7 +30,9 @@ export declare class Toolbar extends Component {
28
30
  id: string;
29
31
  title: string;
30
32
  shouldBeDisabled: () => boolean;
31
- iconSVGContent: string;
33
+ iconSVG: {
34
+ content: string;
35
+ };
32
36
  clickFunction: (event: any) => void;
33
37
  };
34
38
  getControlConfigByType(controlType: ToolbarControlTypes): any;
@@ -47,6 +47,9 @@ var Toolbar = /** @class */ (function (_super) {
47
47
  var isDataLoading = Tools.getProperty(this.getOptions(), 'data', 'loading');
48
48
  if (isDataLoading) {
49
49
  container.html('');
50
+ // Set overflow menu to null if data is loading
51
+ // This will render in a new overflow menu when data is done loading
52
+ this.overflowMenu = null;
50
53
  }
51
54
  else {
52
55
  if (!this.overflowMenu) {
@@ -75,23 +78,26 @@ var Toolbar = /** @class */ (function (_super) {
75
78
  var self_1 = this;
76
79
  var allToolbarControls = enteringToolbarControls
77
80
  .merge(toolbarControls)
78
- .classed('disabled', function (d) {
79
- return d.shouldBeDisabled ? d.shouldBeDisabled() : false;
80
- })
81
- .attr('aria-disabled', function (d) {
82
- return d.shouldBeDisabled ? d.shouldBeDisabled() : false;
83
- })
81
+ .classed('disabled', function (d) { return d.shouldBeDisabled(); })
82
+ .attr('aria-disabled', function (d) { return d.shouldBeDisabled(); })
84
83
  .attr('aria-label', function (d) { return d.title; })
85
- .html(function (d) { return "\n\t\t\t<button\n\t\t\t\tclass=\"bx--overflow-menu__trigger\"\n\t\t\t\taria-haspopup=\"true\" aria-expanded=\"false\" id=\"" + _this.services.domUtils.generateElementIDString("control-" + d.id) + "\" aria-label=\"" + d.title + "\">\n\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\" style=\"will-change: transform; width: " + (d.iconWidth !== undefined ? d.iconWidth : '20px') + "; height: " + (d.iconWidth !== undefined ? d.iconHeight : '20px') + "\" xmlns=\"http://www.w3.org/2000/svg\" class=\"bx--overflow-menu__icon\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n\t\t\t\t\t" + d.iconSVGContent + "\n\t\t\t\t</svg>\n\t\t\t</button>"; })
84
+ .html(function (d) { return "\n\t\t\t<button\n\t\t\t\tclass=\"bx--overflow-menu__trigger\"\n\t\t\t\taria-haspopup=\"true\" aria-expanded=\"false\" id=\"" + _this.services.domUtils.generateElementIDString("control-" + d.id) + "\" aria-label=\"" + d.title + "\">\n\t\t\t\t<svg focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\" style=\"will-change: transform; width: " + (d.iconSVG.width !== undefined ? d.iconSVG.width : '20px') + "; height: " + (d.iconSVG.height !== undefined
85
+ ? d.iconSVG.height
86
+ : '20px') + "\" xmlns=\"http://www.w3.org/2000/svg\" class=\"bx--overflow-menu__icon\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n\t\t\t\t\t" + d.iconSVG.content + "\n\t\t\t\t</svg>\n\t\t\t</button>"; })
86
87
  .each(function (d, index) {
88
+ var _this = this;
87
89
  select(this)
88
90
  .select('button')
89
- .on('click', !d.shouldBeDisabled() ? d.clickFunction : null)
91
+ .on('click', function (event) {
92
+ if (!d.shouldBeDisabled()) {
93
+ self_1.triggerFunctionAndEvent(d, event, _this);
94
+ }
95
+ })
90
96
  .on('keydown', function (event) {
91
97
  if ((event.key && event.key === 'Enter') ||
92
98
  event.key === ' ') {
93
99
  event.preventDefault();
94
- d.clickFunction();
100
+ self_1.triggerFunctionAndEvent(d, event, _this);
95
101
  }
96
102
  else if (event.key && event.key === 'ArrowLeft') {
97
103
  self_1.focusOnPreviousEnabledToolbarItem(index);
@@ -140,6 +146,9 @@ var Toolbar = /** @class */ (function (_super) {
140
146
  };
141
147
  // show/hide overflow menu
142
148
  Toolbar.prototype.updateOverflowMenu = function (show) {
149
+ if (!this.overflowMenu) {
150
+ return;
151
+ }
143
152
  this.overflowMenu.classed('is-open', show);
144
153
  // update overflow button background
145
154
  if (this.overflowButton) {
@@ -242,15 +251,13 @@ var Toolbar = /** @class */ (function (_super) {
242
251
  var element = select("#" + _this.services.domUtils.generateElementIDString("control-" + menuItem.id));
243
252
  if (element !== null) {
244
253
  element.on('click', function () {
245
- // call the specified function
246
- menuItem.clickFunction();
254
+ self_2.triggerFunctionAndEvent(menuItem, event, element.node());
247
255
  // hide overflow menu
248
256
  self_2.updateOverflowMenu(false);
249
257
  });
250
258
  element.on('keydown', function (keyEvent) {
251
259
  if (keyEvent && keyEvent.key === 'Enter') {
252
- // call the specified function
253
- menuItem.clickFunction();
260
+ self_2.triggerFunctionAndEvent(menuItem, event, element.node());
254
261
  }
255
262
  else if (keyEvent && keyEvent.key === 'ArrowUp') {
256
263
  // focus on previous menu item
@@ -277,35 +284,75 @@ var Toolbar = /** @class */ (function (_super) {
277
284
  event.stopImmediatePropagation();
278
285
  }
279
286
  };
287
+ // Calls passed function && dispatches event
288
+ Toolbar.prototype.triggerFunctionAndEvent = function (control, event, element) {
289
+ // Call custom function only if it exists
290
+ if (typeof control.clickFunction === 'function') {
291
+ control.clickFunction(event);
292
+ }
293
+ // Dispatch selection event
294
+ this.services.events.dispatchEvent(Events.Toolbar.BUTTON_CLICK, {
295
+ control: control,
296
+ event: event,
297
+ element: element,
298
+ });
299
+ };
280
300
  Toolbar.prototype.getControlConfigs = function () {
281
301
  var _this = this;
282
- var numberOfIcons = Tools.getProperty(this.getOptions(), 'toolbar', 'numberOfIcons');
302
+ var numberOfIcons = Tools.getProperty(this.getOptions(), 'toolbar', 'numberOfIcons') -
303
+ 1;
283
304
  var controls = Tools.getProperty(this.getOptions(), 'toolbar', 'controls');
284
- var controlList = [];
285
305
  var overflowSpecificControls = [];
306
+ var buttonList = [];
307
+ var overflowList = [];
286
308
  controls.forEach(function (control) {
287
- var controlConfig = _this.getControlConfigByType(control.type);
309
+ var controlConfig = null;
310
+ // check if button is custom or default control
311
+ if (control.type === ToolbarControlTypes.CUSTOM) {
312
+ // add generic id if missing
313
+ if (Tools.getProperty(control, 'id') === null) {
314
+ // add id directly to the data passed so that id isn't reassigned on rerender
315
+ control.id = "toolbar-button-" + Toolbar.buttonID++;
316
+ }
317
+ // define function if missing
318
+ if (Tools.getProperty(control, 'shouldBeDisabled') === null) {
319
+ control.shouldBeDisabled = function () { return false; };
320
+ }
321
+ controlConfig = control;
322
+ }
323
+ else {
324
+ controlConfig = _this.getControlConfigByType(control.type);
325
+ }
288
326
  // add to list if config is valid
289
327
  if (controlConfig) {
290
328
  controlConfig.text = control.text ? control.text : control.type;
291
329
  if (controlConfig.id.indexOf('toolbar-export') !== -1) {
292
330
  overflowSpecificControls.push(controlConfig);
293
331
  }
332
+ else if (buttonList.length < numberOfIcons) {
333
+ // check if icon exists else assign to the overflow list
334
+ if (Tools.getProperty(controlConfig, 'iconSVG', 'content') === null) {
335
+ overflowList.push(controlConfig);
336
+ }
337
+ else {
338
+ buttonList.push(controlConfig);
339
+ }
340
+ }
294
341
  else {
295
- controlList.push(controlConfig);
342
+ overflowList.push(controlConfig);
296
343
  }
297
344
  }
298
345
  });
299
- if (controlList.length <= numberOfIcons &&
300
- overflowSpecificControls.length === 0) {
346
+ // Ensures the `export` controls are always at the bottom
347
+ overflowList.push.apply(overflowList, overflowSpecificControls);
348
+ if (!overflowList.length) {
301
349
  return {
302
- buttonList: controlList,
350
+ buttonList: buttonList,
303
351
  };
304
352
  }
305
353
  return {
306
- // leave one button for overflow button
307
- buttonList: controlList.splice(0, numberOfIcons - 1),
308
- overflowMenuItemList: controlList.concat(overflowSpecificControls),
354
+ buttonList: buttonList,
355
+ overflowMenuItemList: overflowList,
309
356
  };
310
357
  };
311
358
  Toolbar.prototype.getToolbarButtonItems = function () {
@@ -334,7 +381,9 @@ var Toolbar = /** @class */ (function (_super) {
334
381
  id: 'toolbar-overflow-menu',
335
382
  title: 'More options',
336
383
  shouldBeDisabled: function () { return false; },
337
- iconSVGContent: "<circle cx=\"16\" cy=\"8\" r=\"2\"></circle>\n\t\t\t\t\t\t\t <circle cx=\"16\" cy=\"16\" r=\"2\"></circle>\n\t\t\t\t\t\t\t <circle cx=\"16\" cy=\"24\" r=\"2\"></circle>",
384
+ iconSVG: {
385
+ content: "<circle cx=\"16\" cy=\"8\" r=\"2\"></circle>\n\t\t\t\t<circle cx=\"16\" cy=\"16\" r=\"2\"></circle>\n\t\t\t\t<circle cx=\"16\" cy=\"24\" r=\"2\"></circle>",
386
+ },
338
387
  clickFunction: function (event) { return _this.toggleOverflowMenu(event); },
339
388
  };
340
389
  };
@@ -354,7 +403,9 @@ var Toolbar = /** @class */ (function (_super) {
354
403
  shouldBeDisabled: function () {
355
404
  return _this.services.zoom.isMinZoomDomain();
356
405
  },
357
- iconSVGContent: this.getControlIconByType(controlType),
406
+ iconSVG: {
407
+ content: this.getControlIconByType(controlType),
408
+ },
358
409
  clickFunction: function () { return _this.services.zoom.zoomIn(); },
359
410
  };
360
411
  }
@@ -367,7 +418,9 @@ var Toolbar = /** @class */ (function (_super) {
367
418
  shouldBeDisabled: function () {
368
419
  return _this.services.zoom.isMaxZoomDomain();
369
420
  },
370
- iconSVGContent: this.getControlIconByType(controlType),
421
+ iconSVG: {
422
+ content: this.getControlIconByType(controlType),
423
+ },
371
424
  clickFunction: function () { return _this.services.zoom.zoomOut(); },
372
425
  };
373
426
  }
@@ -380,7 +433,9 @@ var Toolbar = /** @class */ (function (_super) {
380
433
  shouldBeDisabled: function () {
381
434
  return _this.services.zoom.isMaxZoomDomain();
382
435
  },
383
- iconSVGContent: this.getControlIconByType(controlType),
436
+ iconSVG: {
437
+ content: this.getControlIconByType(controlType),
438
+ },
384
439
  clickFunction: function () {
385
440
  return _this.services.zoom.resetZoomDomain();
386
441
  },
@@ -390,10 +445,12 @@ var Toolbar = /** @class */ (function (_super) {
390
445
  case ToolbarControlTypes.MAKE_FULLSCREEN:
391
446
  controlConfig = {
392
447
  id: 'toolbar-makefullscreen',
448
+ iconSVG: {
449
+ content: this.getControlIconByType(controlType),
450
+ width: '15px',
451
+ height: '15px',
452
+ },
393
453
  title: 'Make fullscreen',
394
- iconSVGContent: this.getControlIconByType(controlType),
395
- iconWidth: '15px',
396
- iconHight: '15px',
397
454
  shouldBeDisabled: function () { return false; },
398
455
  clickFunction: function () {
399
456
  _this.services.domUtils.toggleFullscreen();
@@ -403,8 +460,10 @@ var Toolbar = /** @class */ (function (_super) {
403
460
  case ToolbarControlTypes.SHOW_AS_DATATABLE:
404
461
  controlConfig = {
405
462
  id: 'toolbar-showasdatatable',
463
+ iconSVG: {
464
+ content: this.getControlIconByType(controlType),
465
+ },
406
466
  title: 'Show as table',
407
- iconSVGContent: this.getControlIconByType(controlType),
408
467
  shouldBeDisabled: function () { return displayData.length === 0; },
409
468
  clickFunction: function () {
410
469
  return _this.services.events.dispatchEvent(Events.Modal.SHOW);
@@ -416,7 +475,9 @@ var Toolbar = /** @class */ (function (_super) {
416
475
  id: 'toolbar-export-CSV',
417
476
  title: 'Export as CSV',
418
477
  shouldBeDisabled: function () { return false; },
419
- iconSVGContent: this.getControlIconByType(controlType),
478
+ iconSVG: {
479
+ content: this.getControlIconByType(controlType),
480
+ },
420
481
  clickFunction: function () { return _this.model.exportToCSV(); },
421
482
  };
422
483
  break;
@@ -425,7 +486,9 @@ var Toolbar = /** @class */ (function (_super) {
425
486
  id: 'toolbar-export-PNG',
426
487
  title: 'Export as PNG',
427
488
  shouldBeDisabled: function () { return false; },
428
- iconSVGContent: this.getControlIconByType(controlType),
489
+ iconSVG: {
490
+ content: this.getControlIconByType(controlType),
491
+ },
429
492
  clickFunction: function () { return _this.services.domUtils.exportToPNG(); },
430
493
  };
431
494
  break;
@@ -434,7 +497,9 @@ var Toolbar = /** @class */ (function (_super) {
434
497
  id: 'toolbar-export-JPG',
435
498
  title: 'Export as JPG',
436
499
  shouldBeDisabled: function () { return false; },
437
- iconSVGContent: this.getControlIconByType(controlType),
500
+ iconSVG: {
501
+ content: this.getControlIconByType(controlType),
502
+ },
438
503
  clickFunction: function () { return _this.services.domUtils.exportToJPG(); },
439
504
  };
440
505
  break;
@@ -467,6 +532,7 @@ var Toolbar = /** @class */ (function (_super) {
467
532
  throw Error('Not supported toolbar control type: ' + controlType);
468
533
  }
469
534
  };
535
+ Toolbar.buttonID = 0;
470
536
  return Toolbar;
471
537
  }(Component));
472
538
  export { Toolbar };