@carbon/charts 0.53.3 → 0.54.1

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 (119) 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 +94 -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/canvas-zoom.js +1 -1
  90. package/services/canvas-zoom.js.map +1 -1
  91. package/services/scales-cartesian.d.ts +1 -0
  92. package/services/scales-cartesian.js +16 -0
  93. package/services/scales-cartesian.js.map +1 -1
  94. package/services/zoom.js +5 -0
  95. package/services/zoom.js.map +1 -1
  96. package/styles/color-palatte.scss +96 -0
  97. package/styles/colors.scss +35 -1
  98. package/styles/components/_axis.scss +41 -0
  99. package/styles/components/_color-legend.scss +24 -0
  100. package/styles/components/index.scss +1 -0
  101. package/styles/graphs/_heatmap.scss +70 -0
  102. package/styles/graphs/index.scss +1 -0
  103. package/styles-g10.css +2000 -179
  104. package/styles-g10.css.map +1 -1
  105. package/styles-g10.min.css +1 -1
  106. package/styles-g10.min.css.map +1 -1
  107. package/styles-g100.css +2003 -182
  108. package/styles-g100.css.map +1 -1
  109. package/styles-g100.min.css +1 -1
  110. package/styles-g100.min.css.map +1 -1
  111. package/styles-g90.css +2004 -180
  112. package/styles-g90.css.map +1 -1
  113. package/styles-g90.min.css +1 -1
  114. package/styles-g90.min.css.map +1 -1
  115. package/styles.css +2000 -179
  116. package/styles.css.map +1 -1
  117. package/styles.min.css +1 -1
  118. package/styles.min.css.map +1 -1
  119. package/tsconfig.tsbuildinfo +187 -65
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AAErD,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;IAA+B,6BAAI;IAClC,mBAAY,KAAiB,EAAE,QAAa,EAAE,OAAa;eAC1D,kBAAM,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;IAChC,CAAC;IAED,0BAAM,GAAN,UAAO,OAAc;QAAd,wBAAA,EAAA,cAAc;QACpB,iBAAM,MAAM,YAAC,OAAO,CAAC,CAAC;QAEtB,6DAA6D;QAC7D,iBAAM,OAAO,WAAE,CAAC;QAER,IAAA,oCAAsB,CAAkB;QAChD,IAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACzC,IAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CACxC,GAAG,EACH,YAAU,YAAc,CACxB,CAAC;QAEF,IAAM,IAAI,GAAG,IAAI,CAAC;QAClB,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK;YACpD,IAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CACjC,UAAU,EACV,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpB,CAAC;YACF,IAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAA;;cAEJ,EAFM,gBAAK,EAAE,kBAEb,CAAC;YAEH,IAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEjE,IAAI,CAAC,GAAG,CAAC,EACR,CAAC,GAAG,CAAC,CAAC;YAEP,qFAAqF;YACrF,gBAAgB;YAChB,QAAQ,YAAY,EAAE;gBACrB,KAAK,aAAa,CAAC,IAAI;oBACtB,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBACxC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAClB,MAAM;gBACP,KAAK,aAAa,CAAC,KAAK;oBACvB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAClB,MAAM;gBACP,KAAK,aAAa,CAAC,GAAG;oBACrB,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACjB,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAE7C,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;wBAClC,CAAC,GAAG,CAAC,CAAC;wBACN,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;qBAC3C;oBACD,MAAM;gBACP,KAAK,aAAa,CAAC,MAAM;oBACxB,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACjB,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBAEnB,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;wBAClC,CAAC,GAAG,CAAC,KAAK,CAAC;wBACX,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;qBAC3C;oBACD,MAAM;aACP;YAED,6DAA6D;YAC7D,+BAA+B;YAC/B,SAAS;iBACP,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;iBACxD,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CACJ,OAAO,EACP,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CACrD;iBACA,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACtB,KAAK,EAAE,CAAC;YAEV,qDAAqD;YACrD,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,KAAoB;gBAC7C,kDAAkD;gBAClD,IACC,YAAY,KAAK,aAAa,CAAC,IAAI;oBACnC,YAAY,KAAK,aAAa,CAAC,KAAK,EACnC;oBACD,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;wBACzC,IAAI,CAAC,MAAM,CAAC,IAAmB,EAAE,KAAK,CAAC,CAAC;qBACxC;yBAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;wBAClD,IAAI,CAAC,UAAU,CAAC,IAAmB,EAAE,KAAK,CAAC,CAAC;qBAC5C;iBACD;qBAAM;oBACN,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;wBAC3C,IAAI,CAAC,UAAU,CAAC,IAAmB,EAAE,KAAK,CAAC,CAAC;qBAC5C;yBAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE;wBACnD,IAAI,CAAC,MAAM,CAAC,IAAmB,EAAE,KAAK,CAAC,CAAC;qBACxC;iBACD;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAED,qCAAiB,GAAjB;QACC,IAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjC,IAAA,oCAAsB,CAAkB;QAChD,IAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CACxC,GAAG,EACH,YAAU,YAAc,CACxB,CAAC;QACF,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACrE,IAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClE,IAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAC5C,WAAW,EACX,YAAY,EACZ,WAAW,CACX,CAAC;QAEF,IAAM,IAAI,GAAG,IAAI,CAAC;QAClB,SAAS;aACP,SAAS,CAAC,mBAAmB,CAAC;aAC9B,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK;YAC/B,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,IAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAY,CAAC;YAE/C,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CACjC,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B;gBACC,KAAK,OAAA;gBACL,OAAO,EAAE,cAAc;gBACvB,KAAK,OAAA;aACL,CACD,CAAC;YAEF,IACC,aAAa,KAAK,UAAU,CAAC,MAAM;gBACnC,KAAK,CAAC,MAAM,GAAG,mBAAmB,EACjC;gBACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;oBACvD,KAAK,OAAA;oBACL,OAAO,EAAE,cAAc;oBACvB,KAAK,OAAA;iBACL,CAAC,CAAC;aACH;QACF,CAAC,CAAC;aACD,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK;YAC/B,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,IAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAY,CAAC;YAC/C,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CACjC,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B;gBACC,KAAK,OAAA;gBACL,OAAO,EAAE,cAAc;gBACvB,KAAK,OAAA;aACL,CACD,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;gBACvD,KAAK,OAAA;aACL,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK;YAC3B,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;gBAC3D,KAAK,OAAA;gBACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACpC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK;YAC9B,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;gBAC9D,KAAK,OAAA;gBACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACpC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;aAC1C,CAAC,CAAC;YAEH,IAAI,aAAa,KAAK,UAAU,CAAC,MAAM,EAAE;gBACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aACxD;QACF,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK;YAC3B,IAAM,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YAE/C,IAAI,KAAK,CAAC,MAAM,EAAE;gBACjB,8CAA8C;gBAC9C,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,IAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;gBAC1D,WAAW,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC;gBACrC,WAAW,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC;aACrC;YAED,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;gBAC3D,KAAK,wBAAO,KAAK,GAAK,WAAW,CAAE;gBACnC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK;YAC1B,sBAAsB;YACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC1D,KAAK,OAAA;gBACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACjC,0BAAM,GAAd,UAAe,OAAoB,EAAE,KAAY;QAChD,IACC,OAAO,CAAC,kBAAkB;YAC1B,OAAO,CAAC,kBAAkB,CAAC,OAAO,KAAK,MAAM,EAC5C;YACD,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SAC7D;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,6CAA6C;IACrC,8BAAU,GAAlB,UAAmB,OAAoB,EAAE,KAAY;QACpD,IACC,OAAO,CAAC,sBAAsB;YAC9B,OAAO,CAAC,sBAAsB,CAAC,OAAO,KAAK,MAAM,EAChD;YACD,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SACjE;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,2BAAO,GAAP;QACC,IAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjC,IAAA,oCAAsB,CAAkB;QAChD,IAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CACxC,GAAG,EACH,YAAU,YAAc,CACxB,CAAC;QAEF,yBAAyB;QACzB,SAAS;aACP,SAAS,CAAC,mBAAmB,CAAC;aAC9B,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;aACrB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;aACrB,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;aACpB,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;aACjB,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpB,CAAC;IACF,gBAAC;AAAD,CAAC,AA9PD,CAA+B,IAAI,GA8PlC","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;
@@ -78,23 +78,26 @@ var Toolbar = /** @class */ (function (_super) {
78
78
  var self_1 = this;
79
79
  var allToolbarControls = enteringToolbarControls
80
80
  .merge(toolbarControls)
81
- .classed('disabled', function (d) {
82
- return d.shouldBeDisabled ? d.shouldBeDisabled() : false;
83
- })
84
- .attr('aria-disabled', function (d) {
85
- return d.shouldBeDisabled ? d.shouldBeDisabled() : false;
86
- })
81
+ .classed('disabled', function (d) { return d.shouldBeDisabled(); })
82
+ .attr('aria-disabled', function (d) { return d.shouldBeDisabled(); })
87
83
  .attr('aria-label', function (d) { return d.title; })
88
- .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>"; })
89
87
  .each(function (d, index) {
88
+ var _this = this;
90
89
  select(this)
91
90
  .select('button')
92
- .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
+ })
93
96
  .on('keydown', function (event) {
94
97
  if ((event.key && event.key === 'Enter') ||
95
98
  event.key === ' ') {
96
99
  event.preventDefault();
97
- d.clickFunction();
100
+ self_1.triggerFunctionAndEvent(d, event, _this);
98
101
  }
99
102
  else if (event.key && event.key === 'ArrowLeft') {
100
103
  self_1.focusOnPreviousEnabledToolbarItem(index);
@@ -248,15 +251,13 @@ var Toolbar = /** @class */ (function (_super) {
248
251
  var element = select("#" + _this.services.domUtils.generateElementIDString("control-" + menuItem.id));
249
252
  if (element !== null) {
250
253
  element.on('click', function () {
251
- // call the specified function
252
- menuItem.clickFunction();
254
+ self_2.triggerFunctionAndEvent(menuItem, event, element.node());
253
255
  // hide overflow menu
254
256
  self_2.updateOverflowMenu(false);
255
257
  });
256
258
  element.on('keydown', function (keyEvent) {
257
259
  if (keyEvent && keyEvent.key === 'Enter') {
258
- // call the specified function
259
- menuItem.clickFunction();
260
+ self_2.triggerFunctionAndEvent(menuItem, event, element.node());
260
261
  }
261
262
  else if (keyEvent && keyEvent.key === 'ArrowUp') {
262
263
  // focus on previous menu item
@@ -283,35 +284,75 @@ var Toolbar = /** @class */ (function (_super) {
283
284
  event.stopImmediatePropagation();
284
285
  }
285
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
+ };
286
300
  Toolbar.prototype.getControlConfigs = function () {
287
301
  var _this = this;
288
- var numberOfIcons = Tools.getProperty(this.getOptions(), 'toolbar', 'numberOfIcons');
302
+ var numberOfIcons = Tools.getProperty(this.getOptions(), 'toolbar', 'numberOfIcons') -
303
+ 1;
289
304
  var controls = Tools.getProperty(this.getOptions(), 'toolbar', 'controls');
290
- var controlList = [];
291
305
  var overflowSpecificControls = [];
306
+ var buttonList = [];
307
+ var overflowList = [];
292
308
  controls.forEach(function (control) {
293
- 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
+ }
294
326
  // add to list if config is valid
295
327
  if (controlConfig) {
296
328
  controlConfig.text = control.text ? control.text : control.type;
297
329
  if (controlConfig.id.indexOf('toolbar-export') !== -1) {
298
330
  overflowSpecificControls.push(controlConfig);
299
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
+ }
300
341
  else {
301
- controlList.push(controlConfig);
342
+ overflowList.push(controlConfig);
302
343
  }
303
344
  }
304
345
  });
305
- if (controlList.length <= numberOfIcons &&
306
- overflowSpecificControls.length === 0) {
346
+ // Ensures the `export` controls are always at the bottom
347
+ overflowList.push.apply(overflowList, overflowSpecificControls);
348
+ if (!overflowList.length) {
307
349
  return {
308
- buttonList: controlList,
350
+ buttonList: buttonList,
309
351
  };
310
352
  }
311
353
  return {
312
- // leave one button for overflow button
313
- buttonList: controlList.splice(0, numberOfIcons - 1),
314
- overflowMenuItemList: controlList.concat(overflowSpecificControls),
354
+ buttonList: buttonList,
355
+ overflowMenuItemList: overflowList,
315
356
  };
316
357
  };
317
358
  Toolbar.prototype.getToolbarButtonItems = function () {
@@ -340,7 +381,9 @@ var Toolbar = /** @class */ (function (_super) {
340
381
  id: 'toolbar-overflow-menu',
341
382
  title: 'More options',
342
383
  shouldBeDisabled: function () { return false; },
343
- 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
+ },
344
387
  clickFunction: function (event) { return _this.toggleOverflowMenu(event); },
345
388
  };
346
389
  };
@@ -360,7 +403,9 @@ var Toolbar = /** @class */ (function (_super) {
360
403
  shouldBeDisabled: function () {
361
404
  return _this.services.zoom.isMinZoomDomain();
362
405
  },
363
- iconSVGContent: this.getControlIconByType(controlType),
406
+ iconSVG: {
407
+ content: this.getControlIconByType(controlType),
408
+ },
364
409
  clickFunction: function () { return _this.services.zoom.zoomIn(); },
365
410
  };
366
411
  }
@@ -373,7 +418,9 @@ var Toolbar = /** @class */ (function (_super) {
373
418
  shouldBeDisabled: function () {
374
419
  return _this.services.zoom.isMaxZoomDomain();
375
420
  },
376
- iconSVGContent: this.getControlIconByType(controlType),
421
+ iconSVG: {
422
+ content: this.getControlIconByType(controlType),
423
+ },
377
424
  clickFunction: function () { return _this.services.zoom.zoomOut(); },
378
425
  };
379
426
  }
@@ -386,7 +433,9 @@ var Toolbar = /** @class */ (function (_super) {
386
433
  shouldBeDisabled: function () {
387
434
  return _this.services.zoom.isMaxZoomDomain();
388
435
  },
389
- iconSVGContent: this.getControlIconByType(controlType),
436
+ iconSVG: {
437
+ content: this.getControlIconByType(controlType),
438
+ },
390
439
  clickFunction: function () {
391
440
  return _this.services.zoom.resetZoomDomain();
392
441
  },
@@ -396,10 +445,12 @@ var Toolbar = /** @class */ (function (_super) {
396
445
  case ToolbarControlTypes.MAKE_FULLSCREEN:
397
446
  controlConfig = {
398
447
  id: 'toolbar-makefullscreen',
448
+ iconSVG: {
449
+ content: this.getControlIconByType(controlType),
450
+ width: '15px',
451
+ height: '15px',
452
+ },
399
453
  title: 'Make fullscreen',
400
- iconSVGContent: this.getControlIconByType(controlType),
401
- iconWidth: '15px',
402
- iconHight: '15px',
403
454
  shouldBeDisabled: function () { return false; },
404
455
  clickFunction: function () {
405
456
  _this.services.domUtils.toggleFullscreen();
@@ -409,8 +460,10 @@ var Toolbar = /** @class */ (function (_super) {
409
460
  case ToolbarControlTypes.SHOW_AS_DATATABLE:
410
461
  controlConfig = {
411
462
  id: 'toolbar-showasdatatable',
463
+ iconSVG: {
464
+ content: this.getControlIconByType(controlType),
465
+ },
412
466
  title: 'Show as table',
413
- iconSVGContent: this.getControlIconByType(controlType),
414
467
  shouldBeDisabled: function () { return displayData.length === 0; },
415
468
  clickFunction: function () {
416
469
  return _this.services.events.dispatchEvent(Events.Modal.SHOW);
@@ -422,7 +475,9 @@ var Toolbar = /** @class */ (function (_super) {
422
475
  id: 'toolbar-export-CSV',
423
476
  title: 'Export as CSV',
424
477
  shouldBeDisabled: function () { return false; },
425
- iconSVGContent: this.getControlIconByType(controlType),
478
+ iconSVG: {
479
+ content: this.getControlIconByType(controlType),
480
+ },
426
481
  clickFunction: function () { return _this.model.exportToCSV(); },
427
482
  };
428
483
  break;
@@ -431,7 +486,9 @@ var Toolbar = /** @class */ (function (_super) {
431
486
  id: 'toolbar-export-PNG',
432
487
  title: 'Export as PNG',
433
488
  shouldBeDisabled: function () { return false; },
434
- iconSVGContent: this.getControlIconByType(controlType),
489
+ iconSVG: {
490
+ content: this.getControlIconByType(controlType),
491
+ },
435
492
  clickFunction: function () { return _this.services.domUtils.exportToPNG(); },
436
493
  };
437
494
  break;
@@ -440,7 +497,9 @@ var Toolbar = /** @class */ (function (_super) {
440
497
  id: 'toolbar-export-JPG',
441
498
  title: 'Export as JPG',
442
499
  shouldBeDisabled: function () { return false; },
443
- iconSVGContent: this.getControlIconByType(controlType),
500
+ iconSVG: {
501
+ content: this.getControlIconByType(controlType),
502
+ },
444
503
  clickFunction: function () { return _this.services.domUtils.exportToJPG(); },
445
504
  };
446
505
  break;
@@ -473,6 +532,7 @@ var Toolbar = /** @class */ (function (_super) {
473
532
  throw Error('Not supported toolbar control type: ' + controlType);
474
533
  }
475
534
  };
535
+ Toolbar.buttonID = 0;
476
536
  return Toolbar;
477
537
  }(Component));
478
538
  export { Toolbar };