@carbon/charts 0.53.4 → 0.54.2
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.
- package/CHANGELOG.md +44 -0
- package/build/demo/data/CHART_TYPES.d.ts +5 -0
- package/build/demo/data/heatmap.d.ts +96 -0
- package/build/demo/data/index.d.ts +1 -0
- package/build/src/charts/heatmap.d.ts +10 -0
- package/build/src/charts/index.d.ts +1 -0
- package/build/src/components/axes/axis.d.ts +7 -1
- package/build/src/components/axes/hover-axis.d.ts +10 -0
- package/build/src/components/essentials/color-scale-legend.d.ts +11 -0
- package/build/src/components/graphs/heatmap.d.ts +25 -0
- package/build/src/components/index.d.ts +2 -0
- package/build/src/configuration-non-customizable.d.ts +12 -0
- package/build/src/configuration.d.ts +2 -1
- package/build/src/interfaces/charts.d.ts +35 -2
- package/build/src/interfaces/enums.d.ts +22 -0
- package/build/src/interfaces/events.d.ts +13 -1
- package/build/src/model/cartesian-charts.d.ts +8 -1
- package/build/src/model/heatmap.d.ts +57 -0
- package/build/src/services/scales-cartesian.d.ts +1 -0
- package/bundle.js +1 -1
- package/charts/heatmap.d.ts +10 -0
- package/charts/heatmap.js +138 -0
- package/charts/heatmap.js.map +1 -0
- package/charts/index.d.ts +1 -0
- package/charts/index.js +1 -0
- package/charts/index.js.map +1 -1
- package/components/axes/axis.d.ts +7 -1
- package/components/axes/axis.js +9 -2
- package/components/axes/axis.js.map +1 -1
- package/components/axes/hover-axis.d.ts +10 -0
- package/components/axes/hover-axis.js +235 -0
- package/components/axes/hover-axis.js.map +1 -0
- package/components/axes/two-dimensional-axes.js +8 -3
- package/components/axes/two-dimensional-axes.js.map +1 -1
- package/components/essentials/color-scale-legend.d.ts +11 -0
- package/components/essentials/color-scale-legend.js +236 -0
- package/components/essentials/color-scale-legend.js.map +1 -0
- package/components/graphs/heatmap.d.ts +25 -0
- package/components/graphs/heatmap.js +369 -0
- package/components/graphs/heatmap.js.map +1 -0
- package/components/index.d.ts +2 -0
- package/components/index.js +2 -0
- package/components/index.js.map +1 -1
- package/configuration-non-customizable.d.ts +12 -0
- package/configuration-non-customizable.js +13 -0
- package/configuration-non-customizable.js.map +1 -1
- package/configuration.d.ts +2 -1
- package/configuration.js +13 -1
- package/configuration.js.map +1 -1
- package/demo/data/CHART_TYPES.d.ts +5 -0
- package/demo/data/CHART_TYPES.js +5 -0
- package/demo/data/CHART_TYPES.js.map +1 -1
- package/demo/data/bundle.js +1 -1
- package/demo/data/heatmap.d.ts +96 -0
- package/demo/data/heatmap.js +1135 -0
- package/demo/data/heatmap.js.map +1 -0
- package/demo/data/index.d.ts +1 -0
- package/demo/data/index.js +30 -0
- package/demo/data/index.js.map +1 -1
- package/demo/styles.css +16458 -9179
- package/demo/styles.css.map +1 -1
- package/demo/styles.min.css +1 -1
- package/demo/styles.min.css.map +1 -1
- package/demo/tsconfig.tsbuildinfo +18 -4
- package/interfaces/charts.d.ts +35 -2
- package/interfaces/charts.js.map +1 -1
- package/interfaces/components.js.map +1 -1
- package/interfaces/enums.d.ts +22 -0
- package/interfaces/enums.js +25 -0
- package/interfaces/enums.js.map +1 -1
- package/interfaces/events.d.ts +13 -1
- package/interfaces/events.js +13 -0
- package/interfaces/events.js.map +1 -1
- package/model/cartesian-charts.d.ts +8 -1
- package/model/cartesian-charts.js +4 -2
- package/model/cartesian-charts.js.map +1 -1
- package/model/heatmap.d.ts +57 -0
- package/model/heatmap.js +289 -0
- package/model/heatmap.js.map +1 -0
- package/package.json +1 -1
- package/services/canvas-zoom.js +1 -1
- package/services/canvas-zoom.js.map +1 -1
- package/services/scales-cartesian.d.ts +1 -0
- package/services/scales-cartesian.js +16 -0
- package/services/scales-cartesian.js.map +1 -1
- package/services/zoom.js +5 -0
- package/services/zoom.js.map +1 -1
- package/styles/_chart-holder.scss +1 -1
- package/styles/color-palatte.scss +96 -0
- package/styles/colors.scss +35 -1
- package/styles/components/_axis.scss +41 -0
- package/styles/components/_color-legend.scss +24 -0
- package/styles/components/index.scss +1 -0
- package/styles/graphs/_heatmap.scss +70 -0
- package/styles/graphs/index.scss +1 -0
- package/styles-g10.css +2002 -181
- package/styles-g10.css.map +1 -1
- package/styles-g10.min.css +1 -1
- package/styles-g10.min.css.map +1 -1
- package/styles-g100.css +2005 -184
- package/styles-g100.css.map +1 -1
- package/styles-g100.min.css +1 -1
- package/styles-g100.min.css.map +1 -1
- package/styles-g90.css +2006 -182
- package/styles-g90.css.map +1 -1
- package/styles-g90.min.css +1 -1
- package/styles-g90.min.css.map +1 -1
- package/styles.css +2002 -181
- package/styles.css.map +1 -1
- package/styles.min.css +1 -1
- package/styles.min.css.map +1 -1
- package/tsconfig.tsbuildinfo +184 -62
|
@@ -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"]}
|
|
@@ -13,11 +13,12 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
13
13
|
})();
|
|
14
14
|
// Internal Imports
|
|
15
15
|
import { Component } from '../component';
|
|
16
|
-
import { AxisPositions, RenderTypes, } from '../../interfaces';
|
|
16
|
+
import { AxisPositions, RenderTypes, AxisFlavor } from '../../interfaces';
|
|
17
17
|
import { Axis } from './axis';
|
|
18
18
|
import { Tools } from '../../tools';
|
|
19
19
|
import { DOMUtils } from '../../services';
|
|
20
20
|
import { Events } from './../../interfaces';
|
|
21
|
+
import { HoverAxis } from './hover-axis';
|
|
21
22
|
var TwoDimensionalAxes = /** @class */ (function (_super) {
|
|
22
23
|
__extends(TwoDimensionalAxes, _super);
|
|
23
24
|
function TwoDimensionalAxes() {
|
|
@@ -52,11 +53,14 @@ var TwoDimensionalAxes = /** @class */ (function (_super) {
|
|
|
52
53
|
var axisPosition = AxisPositions[axisPositionKey];
|
|
53
54
|
if (_this.configs.axes[axisPosition] &&
|
|
54
55
|
!_this.children[axisPosition]) {
|
|
55
|
-
var
|
|
56
|
+
var configs = {
|
|
56
57
|
position: axisPosition,
|
|
57
58
|
axes: _this.configs.axes,
|
|
58
59
|
margins: _this.margins,
|
|
59
|
-
}
|
|
60
|
+
};
|
|
61
|
+
var axisComponent = _this.model.axisFlavor === AxisFlavor.DEFAULT
|
|
62
|
+
? new Axis(_this.model, _this.services, configs)
|
|
63
|
+
: new HoverAxis(_this.model, _this.services, configs);
|
|
60
64
|
// Set model, services & parent for the new axis component
|
|
61
65
|
axisComponent.setModel(_this.model);
|
|
62
66
|
axisComponent.setServices(_this.services);
|
|
@@ -107,6 +111,7 @@ var TwoDimensionalAxes = /** @class */ (function (_super) {
|
|
|
107
111
|
break;
|
|
108
112
|
}
|
|
109
113
|
});
|
|
114
|
+
this.services.events.dispatchEvent(Events.Axis.RENDER_COMPLETE);
|
|
110
115
|
// If the new margins are different than the existing ones
|
|
111
116
|
var isNotEqual = Object.keys(margins).some(function (marginKey) {
|
|
112
117
|
return _this.margins[marginKey] !== margins[marginKey];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-dimensional-axes.js","sourceRoot":"","sources":["two-dimensional-axes.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"two-dimensional-axes.js","sourceRoot":"","sources":["two-dimensional-axes.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from '../component';\nimport { AxisPositions, RenderTypes, AxisFlavor } from '../../interfaces';\nimport { Axis } from './axis';\nimport { Tools } from '../../tools';\nimport { DOMUtils } from '../../services';\nimport { Threshold } from '../essentials/threshold';\nimport { Events } from './../../interfaces';\nimport { HoverAxis } from './hover-axis';\n\nexport class TwoDimensionalAxes extends Component {\n\ttype = '2D-axes';\n\trenderType = RenderTypes.SVG;\n\n\tchildren: any = {};\n\n\tthresholds: Threshold[] = [];\n\n\tmargins = {\n\t\ttop: 0,\n\t\tright: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t};\n\n\trender(animate = false) {\n\t\tconst axes = {};\n\t\tconst axisPositions = Object.keys(AxisPositions);\n\t\tconst axesOptions = Tools.getProperty(this.getOptions(), 'axes');\n\n\t\taxisPositions.forEach((axisPosition) => {\n\t\t\tconst axisOptions = axesOptions[AxisPositions[axisPosition]];\n\t\t\tif (axisOptions) {\n\t\t\t\taxes[AxisPositions[axisPosition]] = true;\n\t\t\t}\n\t\t});\n\n\t\tthis.configs.axes = axes;\n\n\t\t// Check the configs to know which axes need to be rendered\n\t\taxisPositions.forEach((axisPositionKey) => {\n\t\t\tconst axisPosition = AxisPositions[axisPositionKey];\n\t\t\tif (\n\t\t\t\tthis.configs.axes[axisPosition] &&\n\t\t\t\t!this.children[axisPosition]\n\t\t\t) {\n\t\t\t\tconst configs = {\n\t\t\t\t\tposition: axisPosition,\n\t\t\t\t\taxes: this.configs.axes,\n\t\t\t\t\tmargins: this.margins,\n\t\t\t\t};\n\n\t\t\t\tconst axisComponent =\n\t\t\t\t\tthis.model.axisFlavor === AxisFlavor.DEFAULT\n\t\t\t\t\t\t? new Axis(this.model, this.services, configs)\n\t\t\t\t\t\t: new HoverAxis(this.model, this.services, configs);\n\n\t\t\t\t// Set model, services & parent for the new axis component\n\t\t\t\taxisComponent.setModel(this.model);\n\t\t\t\taxisComponent.setServices(this.services);\n\t\t\t\taxisComponent.setParent(this.parent);\n\n\t\t\t\tthis.children[axisPosition] = axisComponent;\n\t\t\t}\n\t\t});\n\n\t\tObject.keys(this.children).forEach((childKey) => {\n\t\t\tconst child = this.children[childKey];\n\t\t\tchild.render(animate);\n\t\t});\n\n\t\tconst margins = {} as any;\n\n\t\tObject.keys(this.children).forEach((childKey) => {\n\t\t\tconst child = this.children[childKey];\n\t\t\tconst axisPosition = child.configs.position;\n\n\t\t\t// Grab the invisibly rendered axis' width & height, and set margins\n\t\t\t// Based off of that\n\t\t\t// We draw the invisible axis because of the async nature of d3 transitions\n\t\t\t// To be able to tell the final width & height of the axis when initiaing the transition\n\t\t\t// The invisible axis is updated instantly and without a transition\n\t\t\tconst invisibleAxisRef = child.getInvisibleAxisRef();\n\t\t\tconst {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t} = DOMUtils.getSVGElementSize(invisibleAxisRef, { useBBox: true });\n\n\t\t\tlet offset;\n\t\t\tif (child.getTitleRef().empty()) {\n\t\t\t\toffset = 0;\n\t\t\t} else {\n\t\t\t\toffset = DOMUtils.getSVGElementSize(child.getTitleRef(), {\n\t\t\t\t\tuseBBox: true,\n\t\t\t\t}).height;\n\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\toffset += 5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (axisPosition) {\n\t\t\t\tcase AxisPositions.TOP:\n\t\t\t\t\tmargins.top = height + offset;\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.BOTTOM:\n\t\t\t\t\tmargins.bottom = height + offset;\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.LEFT:\n\t\t\t\t\tmargins.left = width + offset;\n\t\t\t\t\tbreak;\n\t\t\t\tcase AxisPositions.RIGHT:\n\t\t\t\t\tmargins.right = width + offset;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\tthis.services.events.dispatchEvent(Events.Axis.RENDER_COMPLETE);\n\n\t\t// If the new margins are different than the existing ones\n\t\tconst isNotEqual = Object.keys(margins).some((marginKey) => {\n\t\t\treturn this.margins[marginKey] !== margins[marginKey];\n\t\t});\n\n\t\tif (isNotEqual) {\n\t\t\tthis.margins = Object.assign(this.margins, margins);\n\n\t\t\t// also set new margins to model to allow external components to access\n\t\t\tthis.model.set({ axesMargins: this.margins }, { skipUpdate: true });\n\t\t\tthis.services.events.dispatchEvent(Events.ZoomBar.UPDATE);\n\n\t\t\tObject.keys(this.children).forEach((childKey) => {\n\t\t\t\tconst child = this.children[childKey];\n\t\t\t\tchild.margins = this.margins;\n\t\t\t});\n\n\t\t\tthis.render(true);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RenderTypes } from '../../interfaces';
|
|
2
|
+
import { Legend } from './legend';
|
|
3
|
+
export declare class ColorScaleLegend extends Legend {
|
|
4
|
+
type: string;
|
|
5
|
+
renderType: RenderTypes;
|
|
6
|
+
private gradient_id;
|
|
7
|
+
init(): void;
|
|
8
|
+
handleAxisComplete: (event: CustomEvent<any>) => void;
|
|
9
|
+
render(animate?: boolean): void;
|
|
10
|
+
destroy(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
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
|
+
// Internal Imports
|
|
15
|
+
import { Tools } from '../../tools';
|
|
16
|
+
import { ColorLegendType, Events, RenderTypes } from '../../interfaces';
|
|
17
|
+
import * as Configuration from '../../configuration';
|
|
18
|
+
import { Legend } from './legend';
|
|
19
|
+
import { DOMUtils } from '../../services';
|
|
20
|
+
// D3 imports
|
|
21
|
+
import { axisBottom } from 'd3-axis';
|
|
22
|
+
import { scaleBand, scaleLinear } from 'd3-scale';
|
|
23
|
+
import { interpolateRound, quantize } from 'd3-interpolate';
|
|
24
|
+
var ColorScaleLegend = /** @class */ (function (_super) {
|
|
25
|
+
__extends(ColorScaleLegend, _super);
|
|
26
|
+
function ColorScaleLegend() {
|
|
27
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
28
|
+
_this.type = 'color-legend';
|
|
29
|
+
_this.renderType = RenderTypes.SVG;
|
|
30
|
+
_this.gradient_id = 'gradient-id-' + Math.floor(Math.random() * 99999999999);
|
|
31
|
+
_this.handleAxisComplete = function (event) {
|
|
32
|
+
var svg = _this.getComponentContainer();
|
|
33
|
+
var width = DOMUtils.getSVGElementSize(svg, {
|
|
34
|
+
useAttrs: true,
|
|
35
|
+
}).width;
|
|
36
|
+
var isDataLoading = Tools.getProperty(_this.getOptions(), 'data', 'loading');
|
|
37
|
+
if (width > Configuration.legend.color.barWidth && !isDataLoading) {
|
|
38
|
+
var title = Tools.getProperty(_this.getOptions(), 'heatmap', 'colorLegend', 'title');
|
|
39
|
+
var cartesianScales = _this.services.cartesianScales;
|
|
40
|
+
// Get available chart area
|
|
41
|
+
var mainXScale = cartesianScales.getMainXScale();
|
|
42
|
+
var xDimensions = mainXScale.range();
|
|
43
|
+
// Align legend with the axis
|
|
44
|
+
if (xDimensions[0] > 1) {
|
|
45
|
+
svg.select('g.legend').attr('transform', "translate(" + xDimensions[0] + ", 0)");
|
|
46
|
+
if (title) {
|
|
47
|
+
var textWidth = DOMUtils.getSVGElementSize(svg.select('g.legend-title').select('text'), { useBBox: true }).width;
|
|
48
|
+
// -9 since LEFT y-axis labels are moved towards the left by 9 by d3
|
|
49
|
+
var availableSpace = xDimensions[0] - textWidth - 9;
|
|
50
|
+
// If space is available align the the label with the axis labels
|
|
51
|
+
if (availableSpace > 1) {
|
|
52
|
+
svg.select('g.legend-title').attr('transform', "translate(" + availableSpace + ", 0)");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Move the legend down by 16 pixels to display legend text on top
|
|
56
|
+
svg.select('g.legend').attr('transform', "translate(" + xDimensions[0] + ", 16)");
|
|
57
|
+
// Align legend title with start of axis
|
|
58
|
+
svg.select('g.legend-title').attr('transform', "translate(" + xDimensions[0] + ", 0)");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return _this;
|
|
65
|
+
}
|
|
66
|
+
ColorScaleLegend.prototype.init = function () {
|
|
67
|
+
var eventsFragment = this.services.events;
|
|
68
|
+
// Highlight correct circle on legend item hovers
|
|
69
|
+
eventsFragment.addEventListener(Events.Axis.RENDER_COMPLETE, this.handleAxisComplete);
|
|
70
|
+
};
|
|
71
|
+
ColorScaleLegend.prototype.render = function (animate) {
|
|
72
|
+
if (animate === void 0) { animate = false; }
|
|
73
|
+
var options = this.getOptions();
|
|
74
|
+
var customColors = Tools.getProperty(options, 'color', 'gradient', 'colors');
|
|
75
|
+
var colorScaleType = Tools.getProperty(options, 'heatmap', 'colorLegend', 'type');
|
|
76
|
+
var colorPairingOption = Tools.getProperty(options, 'color', 'pairing', 'option');
|
|
77
|
+
var title = Tools.getProperty(options, 'heatmap', 'colorLegend', 'title');
|
|
78
|
+
var customColorsEnabled = !Tools.isEmpty(customColors);
|
|
79
|
+
var domain = this.model.getValueDomain();
|
|
80
|
+
var svg = this.getComponentContainer();
|
|
81
|
+
// Clear DOM if loading
|
|
82
|
+
var isDataLoading = Tools.getProperty(this.getOptions(), 'data', 'loading');
|
|
83
|
+
if (isDataLoading) {
|
|
84
|
+
svg.html('');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
var legend = DOMUtils.appendOrSelect(svg, 'g.legend');
|
|
88
|
+
var axis = DOMUtils.appendOrSelect(legend, 'g.legend-axis');
|
|
89
|
+
var width = DOMUtils.getSVGElementSize(svg, {
|
|
90
|
+
useAttrs: true,
|
|
91
|
+
}).width;
|
|
92
|
+
var barWidth = Configuration.legend.color.barWidth;
|
|
93
|
+
if (width <= Configuration.legend.color.barWidth) {
|
|
94
|
+
barWidth = width;
|
|
95
|
+
}
|
|
96
|
+
if (title) {
|
|
97
|
+
var legendTitleGroup = DOMUtils.appendOrSelect(svg, 'g.legend-title');
|
|
98
|
+
var legendTitle = DOMUtils.appendOrSelect(legendTitleGroup, 'text');
|
|
99
|
+
legendTitle.text(title).attr('dy', '0.7em');
|
|
100
|
+
// Move the legend down by 16 pixels to display legend text on top
|
|
101
|
+
legend.attr('transform', "translate(0, 16)");
|
|
102
|
+
}
|
|
103
|
+
// If domain consists of negative and positive values, use diverging palettes
|
|
104
|
+
var colorScheme = domain[0] < 0 && domain[1] > 0 ? 'diverge' : 'mono';
|
|
105
|
+
// Use default color pairing options if not in defined range
|
|
106
|
+
if (colorPairingOption < 1 &&
|
|
107
|
+
colorPairingOption > 4 &&
|
|
108
|
+
colorScheme === 'mono') {
|
|
109
|
+
colorPairingOption = 1;
|
|
110
|
+
}
|
|
111
|
+
else if (colorPairingOption < 1 &&
|
|
112
|
+
colorPairingOption > 2 &&
|
|
113
|
+
colorScheme === 'diverge') {
|
|
114
|
+
colorPairingOption = 1;
|
|
115
|
+
}
|
|
116
|
+
var colorPairing = [];
|
|
117
|
+
// Carbon charts has 11 colors for a single monochromatic palette & 17 for a divergent palette
|
|
118
|
+
var colorGroupingLength = colorScheme === 'diverge' ? 17 : 11;
|
|
119
|
+
if (!customColorsEnabled) {
|
|
120
|
+
// Add class names to list and the amount based on the color scheme
|
|
121
|
+
for (var i = 1; i < colorGroupingLength + 1; i++) {
|
|
122
|
+
colorPairing.push(colorScaleType === ColorLegendType.LINEAR
|
|
123
|
+
? "stop-color-" + colorScheme + "-" + colorPairingOption + "-" + i
|
|
124
|
+
: "fill-" + colorScheme + "-" + colorPairingOption + "-" + i);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Use custom colors
|
|
129
|
+
colorPairing = customColors;
|
|
130
|
+
}
|
|
131
|
+
if (colorScaleType === ColorLegendType.LINEAR) {
|
|
132
|
+
var stopLengthPercentage_1 = 100 / (colorPairing.length - 1);
|
|
133
|
+
// Generate the gradient
|
|
134
|
+
var linearGradient = DOMUtils.appendOrSelect(legend, 'linearGradient');
|
|
135
|
+
linearGradient
|
|
136
|
+
.attr('id', this.gradient_id + "-legend")
|
|
137
|
+
.selectAll('stop')
|
|
138
|
+
.data(colorPairing)
|
|
139
|
+
.enter()
|
|
140
|
+
.append('stop')
|
|
141
|
+
.attr('offset', function (_, i) { return i * stopLengthPercentage_1 + "%"; })
|
|
142
|
+
.attr('class', function (_, i) { return colorPairing[i]; })
|
|
143
|
+
.attr('stop-color', function (d) { return d; });
|
|
144
|
+
// Create the legend container
|
|
145
|
+
var rectangle = DOMUtils.appendOrSelect(legend, 'rect');
|
|
146
|
+
rectangle
|
|
147
|
+
.attr('width', barWidth)
|
|
148
|
+
.attr('height', Configuration.legend.color.barHeight)
|
|
149
|
+
.style('fill', "url(#" + this.gradient_id + "-legend)");
|
|
150
|
+
// Create scale & ticks
|
|
151
|
+
var linearScale = scaleLinear()
|
|
152
|
+
.domain(domain)
|
|
153
|
+
.range([0, barWidth]);
|
|
154
|
+
domain.splice(1, 0, (domain[0] + domain[1]) / 2);
|
|
155
|
+
var xAxis = axisBottom(linearScale)
|
|
156
|
+
.tickSize(0)
|
|
157
|
+
.tickValues(domain);
|
|
158
|
+
// Align axes at the bottom of the rectangle and delete the domain line
|
|
159
|
+
axis.attr('transform', "translate(0," + Configuration.legend.color.axisYTranslation + ")").call(xAxis);
|
|
160
|
+
// Remove domain
|
|
161
|
+
axis.select('.domain').remove();
|
|
162
|
+
// Align text to fit in container
|
|
163
|
+
axis.style('text-anchor', 'start');
|
|
164
|
+
}
|
|
165
|
+
else if (colorScaleType === ColorLegendType.QUANTIZE) {
|
|
166
|
+
// Generate equal chunks between range to act as ticks
|
|
167
|
+
var interpolator = interpolateRound(domain[0], domain[1]);
|
|
168
|
+
var quant_1 = quantize(interpolator, colorPairing.length);
|
|
169
|
+
// If divergent && non-custom color, remove 0/white from being displayed
|
|
170
|
+
if (!customColorsEnabled && colorScheme === 'diverge') {
|
|
171
|
+
colorPairing.splice(colorPairing.length / 2, 1);
|
|
172
|
+
}
|
|
173
|
+
var colorScaleBand_1 = scaleBand()
|
|
174
|
+
.domain(colorPairing)
|
|
175
|
+
.range([0, barWidth]);
|
|
176
|
+
// Render the quantized rectangles
|
|
177
|
+
var rectangle = DOMUtils.appendOrSelect(legend, 'g.quantized-rect');
|
|
178
|
+
rectangle
|
|
179
|
+
.selectAll('rect')
|
|
180
|
+
.data(colorScaleBand_1.domain())
|
|
181
|
+
.join('rect')
|
|
182
|
+
.attr('x', function (d) { return colorScaleBand_1(d); })
|
|
183
|
+
.attr('y', 0)
|
|
184
|
+
.attr('width', Math.max(0, colorScaleBand_1.bandwidth()) - 1)
|
|
185
|
+
.attr('height', Configuration.legend.color.barHeight)
|
|
186
|
+
.attr('class', function (d) { return d; })
|
|
187
|
+
.attr('fill', function (d) { return d; });
|
|
188
|
+
var xAxis = axisBottom(colorScaleBand_1)
|
|
189
|
+
.tickSize(0)
|
|
190
|
+
.tickValues(colorPairing)
|
|
191
|
+
.tickFormat(function (_, i) {
|
|
192
|
+
// Display every other tick to create space
|
|
193
|
+
if (!customColorsEnabled &&
|
|
194
|
+
((i + 1) % 2 === 0 || i === colorPairing.length - 1)) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
// Use the quant interpolators as ticks
|
|
198
|
+
return quant_1[i].toString();
|
|
199
|
+
});
|
|
200
|
+
// Align axis to match bandwidth start after initial (white)
|
|
201
|
+
var axisTranslation = colorScaleBand_1.bandwidth() / 2;
|
|
202
|
+
axis.attr('transform', "translate(" + (!customColorsEnabled && colorScheme === 'diverge' ? '-' : '') + axisTranslation + ", " + Configuration.legend.color.axisYTranslation + ")").call(xAxis);
|
|
203
|
+
// Append the last tick
|
|
204
|
+
var firstTick = axis.select('g.tick').clone(true);
|
|
205
|
+
firstTick
|
|
206
|
+
.attr('transform', "translate(" + (barWidth +
|
|
207
|
+
(!customColorsEnabled && colorScheme === 'diverge'
|
|
208
|
+
? axisTranslation
|
|
209
|
+
: -axisTranslation)) + ", 0)")
|
|
210
|
+
.classed('final-tick', true)
|
|
211
|
+
.select('text')
|
|
212
|
+
.text(quant_1[quant_1.length - 1]);
|
|
213
|
+
axis.enter().append(firstTick.node());
|
|
214
|
+
axis.select('.domain').remove();
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
throw Error('Entered color legend type is not supported.');
|
|
218
|
+
}
|
|
219
|
+
// Translate last axis tick if barWidth equals chart width
|
|
220
|
+
if (width <= Configuration.legend.color.barWidth) {
|
|
221
|
+
var lastTick = axis.select('g.tick:last-of-type text');
|
|
222
|
+
var width_1 = DOMUtils.getSVGElementSize(lastTick, {
|
|
223
|
+
useBBox: true,
|
|
224
|
+
}).width;
|
|
225
|
+
lastTick.attr('x', "-" + width_1);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
ColorScaleLegend.prototype.destroy = function () {
|
|
229
|
+
// Remove legend listeners
|
|
230
|
+
var eventsFragment = this.services.events;
|
|
231
|
+
eventsFragment.removeEventListener(Events.Axis.RENDER_COMPLETE, this.handleAxisComplete);
|
|
232
|
+
};
|
|
233
|
+
return ColorScaleLegend;
|
|
234
|
+
}(Legend));
|
|
235
|
+
export { ColorScaleLegend };
|
|
236
|
+
//# sourceMappingURL=../../../src/components/essentials/color-scale-legend.js.map
|