@carbon/charts 0.30.4 → 0.30.8
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 +35 -0
- package/build/demo/data/bar.d.ts +56 -94
- package/build/demo/data/bubble.d.ts +58 -13
- package/build/demo/data/donut.d.ts +3 -6
- package/build/demo/data/line.d.ts +35 -35
- package/build/demo/data/pie.d.ts +3 -6
- package/build/demo/data/scatter.d.ts +33 -20
- package/build/demo/data/step.d.ts +15 -16
- package/build/demo/data/time-series-axis.d.ts +12 -48
- package/build/src/charts/bar-grouped.d.ts +2 -2
- package/build/src/charts/bar-simple.d.ts +2 -4
- package/build/src/components/essentials/legend.d.ts +0 -4
- package/build/src/components/essentials/tooltip-bar.d.ts +1 -1
- package/build/src/components/essentials/tooltip-pie.d.ts +5 -0
- package/build/src/components/essentials/tooltip-scatter.d.ts +1 -1
- package/build/src/components/graphs/bar-grouped.d.ts +6 -4
- package/build/src/components/graphs/bar-simple.d.ts +0 -1
- package/build/src/components/graphs/bar-stacked.d.ts +0 -1
- package/build/src/components/graphs/bubble.d.ts +0 -1
- package/build/src/components/graphs/line.d.ts +3 -1
- package/build/src/components/graphs/pie.d.ts +0 -1
- package/build/src/components/graphs/scatter.d.ts +0 -1
- package/build/src/components/index.d.ts +1 -0
- package/build/src/interfaces/axis-scales.d.ts +4 -16
- package/build/src/interfaces/charts.d.ts +23 -1
- package/build/src/interfaces/enums.d.ts +0 -4
- package/build/src/interfaces/events.d.ts +29 -0
- package/build/src/model-pie.d.ts +1 -7
- package/build/src/model.d.ts +31 -13
- package/build/src/services/scales-cartesian.d.ts +11 -3
- package/build/src/tools.d.ts +2 -2
- package/build/stories/tutorials.stories.d.ts +1 -0
- package/bundle.js +1 -1
- package/chart.js +2 -2
- package/chart.js.map +1 -1
- package/charts/bar-grouped.d.ts +2 -2
- package/charts/bar-grouped.js.map +1 -1
- package/charts/bar-simple.d.ts +2 -4
- package/charts/bar-simple.js +0 -2
- package/charts/bar-simple.js.map +1 -1
- package/charts/donut.js +2 -2
- package/charts/donut.js.map +1 -1
- package/charts/pie.js +2 -2
- package/charts/pie.js.map +1 -1
- package/components/axes/grid.js +12 -19
- package/components/axes/grid.js.map +1 -1
- package/components/component.js +1 -1
- package/components/component.js.map +1 -1
- package/components/essentials/legend.d.ts +0 -4
- package/components/essentials/legend.js +12 -26
- package/components/essentials/legend.js.map +1 -1
- package/components/essentials/title.js +4 -4
- package/components/essentials/title.js.map +1 -1
- package/components/essentials/tooltip-bar.d.ts +1 -1
- package/components/essentials/tooltip-bar.js +13 -5
- package/components/essentials/tooltip-bar.js.map +1 -1
- package/components/essentials/tooltip-pie.d.ts +5 -0
- package/components/essentials/tooltip-pie.js +40 -0
- package/components/essentials/tooltip-pie.js.map +1 -0
- package/components/essentials/tooltip-scatter.d.ts +1 -1
- package/components/essentials/tooltip-scatter.js +8 -6
- package/components/essentials/tooltip-scatter.js.map +1 -1
- package/components/essentials/tooltip.js +14 -17
- package/components/essentials/tooltip.js.map +1 -1
- package/components/graphs/bar-grouped.d.ts +6 -4
- package/components/graphs/bar-grouped.js +64 -36
- package/components/graphs/bar-grouped.js.map +1 -1
- package/components/graphs/bar-simple.d.ts +0 -1
- package/components/graphs/bar-simple.js +16 -34
- package/components/graphs/bar-simple.js.map +1 -1
- package/components/graphs/bar-stacked.d.ts +0 -1
- package/components/graphs/bar-stacked.js +31 -112
- package/components/graphs/bar-stacked.js.map +1 -1
- package/components/graphs/bar.js.map +1 -1
- package/components/graphs/bubble.d.ts +0 -1
- package/components/graphs/bubble.js +16 -20
- package/components/graphs/bubble.js.map +1 -1
- package/components/graphs/donut.js +1 -1
- package/components/graphs/donut.js.map +1 -1
- package/components/graphs/line.d.ts +3 -1
- package/components/graphs/line.js +42 -31
- package/components/graphs/line.js.map +1 -1
- package/components/graphs/pie.d.ts +0 -1
- package/components/graphs/pie.js +15 -22
- package/components/graphs/pie.js.map +1 -1
- package/components/graphs/scatter.d.ts +0 -1
- package/components/graphs/scatter.js +26 -41
- package/components/graphs/scatter.js.map +1 -1
- package/components/index.d.ts +1 -0
- package/components/index.js +1 -0
- package/components/index.js.map +1 -1
- package/configuration.js +7 -0
- package/configuration.js.map +1 -1
- package/demo/data/bar.d.ts +56 -94
- package/demo/data/bar.js +106 -271
- package/demo/data/bar.js.map +1 -1
- package/demo/data/bubble.d.ts +58 -13
- package/demo/data/bubble.js +74 -174
- package/demo/data/bubble.js.map +1 -1
- package/demo/data/bundle.js +1 -1
- package/demo/data/donut.d.ts +3 -6
- package/demo/data/index.js +22 -4
- package/demo/data/index.js.map +1 -1
- package/demo/data/line.d.ts +35 -35
- package/demo/data/line.js +70 -196
- package/demo/data/line.js.map +1 -1
- package/demo/data/pie.d.ts +3 -6
- package/demo/data/pie.js +8 -10
- package/demo/data/pie.js.map +1 -1
- package/demo/data/scatter.d.ts +33 -20
- package/demo/data/scatter.js +50 -68
- package/demo/data/scatter.js.map +1 -1
- package/demo/data/step.d.ts +15 -16
- package/demo/data/time-series-axis.d.ts +12 -48
- package/demo/data/time-series-axis.js +34 -46
- package/demo/data/time-series-axis.js.map +1 -1
- package/demo/styles.css +28 -0
- 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 +38 -37
- package/interfaces/axis-scales.d.ts +4 -16
- package/interfaces/axis-scales.js.map +1 -1
- package/interfaces/charts.d.ts +23 -1
- package/interfaces/charts.js.map +1 -1
- package/interfaces/enums.d.ts +0 -4
- package/interfaces/enums.js +0 -5
- package/interfaces/enums.js.map +1 -1
- package/interfaces/events.d.ts +29 -0
- package/interfaces/events.js +33 -0
- package/interfaces/events.js.map +1 -1
- package/model-pie.d.ts +1 -7
- package/model-pie.js +2 -107
- package/model-pie.js.map +1 -1
- package/model.d.ts +31 -13
- package/model.js +204 -75
- package/model.js.map +1 -1
- package/package.json +3 -1
- package/services/essentials/dom-utils.js +3 -2
- package/services/essentials/dom-utils.js.map +1 -1
- package/services/scales-cartesian.d.ts +11 -3
- package/services/scales-cartesian.js +104 -122
- package/services/scales-cartesian.js.map +1 -1
- package/tools.d.ts +2 -2
- package/tools.js +23 -2
- package/tools.js.map +1 -1
- package/tsconfig.tsbuildinfo +93 -93
- package/build/src/model-simple-bar.d.ts +0 -11
- package/model-simple-bar.d.ts +0 -11
- package/model-simple-bar.js +0 -88
- package/model-simple-bar.js.map +0 -1
|
@@ -14,23 +14,11 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
// Internal Imports
|
|
15
15
|
import { Tools } from "../../tools";
|
|
16
16
|
import { Bar } from "./bar";
|
|
17
|
-
import { Roles,
|
|
17
|
+
import { Roles, TooltipTypes, Events, CartesianOrientations } from "../../interfaces";
|
|
18
18
|
// D3 Imports
|
|
19
19
|
import { select } from "d3-selection";
|
|
20
|
-
import { stack } from "d3-shape";
|
|
21
20
|
import { color } from "d3-color";
|
|
22
|
-
|
|
23
|
-
// To be used to get the fill color
|
|
24
|
-
var addLabelsAndValueToData = function (d) {
|
|
25
|
-
Object.keys(d).map(function (key) {
|
|
26
|
-
if (typeof d[key] === "object") {
|
|
27
|
-
d[key]["datasetLabel"] = d.key;
|
|
28
|
-
d[key]["label"] = d[key].data["label"];
|
|
29
|
-
d[key]["value"] = d[key].data[d.key];
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
return d;
|
|
33
|
-
};
|
|
21
|
+
import { map } from "d3-collection";
|
|
34
22
|
var StackedBar = /** @class */ (function (_super) {
|
|
35
23
|
__extends(StackedBar, _super);
|
|
36
24
|
function StackedBar() {
|
|
@@ -54,69 +42,25 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
54
42
|
StackedBar.prototype.init = function () {
|
|
55
43
|
var eventsFragment = this.services.events;
|
|
56
44
|
// Highlight correct circle on legend item hovers
|
|
57
|
-
eventsFragment.addEventListener(
|
|
45
|
+
eventsFragment.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);
|
|
58
46
|
// Un-highlight circles on legend item mouseouts
|
|
59
|
-
eventsFragment.addEventListener(
|
|
60
|
-
};
|
|
61
|
-
StackedBar.prototype.getStackData = function () {
|
|
62
|
-
var stackDataArray;
|
|
63
|
-
var displayData = this.model.getDisplayData();
|
|
64
|
-
// the domain axis for stack data depends on the orientation of the bar chart
|
|
65
|
-
var domainAxisPosition = this.services.cartesianScales.getDomainAxisPosition();
|
|
66
|
-
var domainScaleType = this.services.cartesianScales.getScaleTypeByPosition(domainAxisPosition);
|
|
67
|
-
// get scale type for the main axis
|
|
68
|
-
var timeSeries = domainScaleType === ScaleTypes.TIME;
|
|
69
|
-
if (timeSeries) {
|
|
70
|
-
// Get all date values provided in data
|
|
71
|
-
// TODO - Could be re-used through the model
|
|
72
|
-
var allDates_1 = [];
|
|
73
|
-
displayData.datasets.forEach(function (dataset) {
|
|
74
|
-
allDates_1 = allDates_1.concat(dataset.data.map(function (datum) { return Number(datum.date); }));
|
|
75
|
-
});
|
|
76
|
-
allDates_1 = Tools.removeArrayDuplicates(allDates_1).sort();
|
|
77
|
-
// Go through all date values
|
|
78
|
-
// And get corresponding data from each dataset
|
|
79
|
-
stackDataArray = allDates_1.map(function (date, i) {
|
|
80
|
-
var correspondingData = {};
|
|
81
|
-
displayData.datasets.forEach(function (dataset) {
|
|
82
|
-
var correspondingDatum = dataset.data.find(function (datum) { return Number(datum.date) === Number(date); });
|
|
83
|
-
if (correspondingDatum) {
|
|
84
|
-
correspondingData[dataset.label] = correspondingDatum.value;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
correspondingData[dataset.label] = 0;
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
correspondingData["label"] = date;
|
|
91
|
-
return correspondingData;
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
// Create the stack datalist
|
|
96
|
-
stackDataArray = displayData.labels.map(function (label, i) {
|
|
97
|
-
var correspondingData = {};
|
|
98
|
-
displayData.datasets.forEach(function (dataset) {
|
|
99
|
-
correspondingData[dataset.label] = !isNaN(dataset.data[i]) ? dataset.data[i] : dataset.data[i].value;
|
|
100
|
-
});
|
|
101
|
-
correspondingData["label"] = label;
|
|
102
|
-
return correspondingData;
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return stackDataArray;
|
|
47
|
+
eventsFragment.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);
|
|
106
48
|
};
|
|
107
49
|
StackedBar.prototype.render = function (animate) {
|
|
108
50
|
var _this = this;
|
|
109
|
-
// Chart options mixed with the internal configurations
|
|
110
|
-
var options = this.model.getOptions();
|
|
111
51
|
// Grab container SVG
|
|
112
52
|
var svg = this.getContainerSVG();
|
|
113
|
-
//
|
|
53
|
+
// Chart options mixed with the internal configurations
|
|
114
54
|
var displayData = this.model.getDisplayData();
|
|
115
|
-
var
|
|
116
|
-
var
|
|
55
|
+
var options = this.model.getOptions();
|
|
56
|
+
var groupMapsTo = options.data.groupMapsTo;
|
|
57
|
+
var domainIdentifier = this.services.cartesianScales.getDomainIdentifier();
|
|
58
|
+
// Create the data and keys that'll be used by the stack layout
|
|
59
|
+
var stackKeys = map(displayData, function (datum) { return datum[domainIdentifier]; }).keys();
|
|
60
|
+
var stackData = this.model.getStackedData();
|
|
117
61
|
// Update data on all bar groups
|
|
118
62
|
var barGroups = svg.selectAll("g.bars")
|
|
119
|
-
.data(
|
|
63
|
+
.data(stackData, function (d) { return d.key; });
|
|
120
64
|
// Remove elements that need to be exited
|
|
121
65
|
// We need exit at the top here to make sure that
|
|
122
66
|
// Data filters are processed before entering new elements
|
|
@@ -131,35 +75,19 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
131
75
|
.attr("role", Roles.GROUP);
|
|
132
76
|
// Update data on all bars
|
|
133
77
|
var bars = svg.selectAll("g.bars").selectAll("path.bar")
|
|
134
|
-
|
|
78
|
+
// Remove bars with a start and end value of 0
|
|
79
|
+
.data(function (data) { return data.filter(function (d) { return !(d[0] === 0 && d[1] === 0); }); });
|
|
135
80
|
// Remove bars that need to be removed
|
|
136
81
|
bars.exit()
|
|
137
82
|
.remove();
|
|
138
|
-
var yScale = this.services.cartesianScales.getRangeScale();
|
|
139
83
|
bars.enter()
|
|
140
84
|
.append("path")
|
|
141
85
|
.merge(bars)
|
|
142
86
|
.classed("bar", true)
|
|
143
87
|
.transition(this.services.transitions.getTransition("bar-update-enter", animate))
|
|
144
|
-
.attr("fill", function (d) { return _this.model.
|
|
145
|
-
.attr("height", function (d, i) {
|
|
146
|
-
var datasetLabel = d.datasetLabel;
|
|
147
|
-
var datasetLabelIndex = stackKeys.indexOf(datasetLabel);
|
|
148
|
-
var height;
|
|
149
|
-
// determine height based on the y axis
|
|
150
|
-
if (yScale.scaleType === ScaleTypes.LABELS) {
|
|
151
|
-
height = Math.abs(yScale.scale.range()[0] - _this.services.cartesianScales.getRangeValue(d.label, i));
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
height = _this.services.cartesianScales.getRangeValue(d[0]) - _this.services.cartesianScales.getRangeValue(d[1]);
|
|
155
|
-
}
|
|
156
|
-
// create dividers between bars
|
|
157
|
-
if (datasetLabelIndex > 0 && height >= options.bars.dividerSize) {
|
|
158
|
-
return height - options.bars.dividerSize;
|
|
159
|
-
}
|
|
160
|
-
return height;
|
|
161
|
-
})
|
|
88
|
+
.attr("fill", function (d) { return _this.model.getFillColor(d[groupMapsTo]); })
|
|
162
89
|
.attr("d", function (d, i) {
|
|
90
|
+
var key = stackKeys[i];
|
|
163
91
|
/*
|
|
164
92
|
* Orientation support for horizontal/vertical bar charts
|
|
165
93
|
* Determine coordinates needed for a vertical set of paths
|
|
@@ -167,7 +95,7 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
167
95
|
* generateSVGPathString() to decide whether it needs to flip them
|
|
168
96
|
*/
|
|
169
97
|
var barWidth = _this.getBarWidth();
|
|
170
|
-
var x0 = _this.services.cartesianScales.getDomainValue(
|
|
98
|
+
var x0 = _this.services.cartesianScales.getDomainValue(key, i) - barWidth / 2;
|
|
171
99
|
var x1 = x0 + barWidth;
|
|
172
100
|
var y0 = _this.services.cartesianScales.getRangeValue(d[0], i);
|
|
173
101
|
var y1 = _this.services.cartesianScales.getRangeValue(d[1], i);
|
|
@@ -191,6 +119,8 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
191
119
|
this.addEventListeners();
|
|
192
120
|
};
|
|
193
121
|
StackedBar.prototype.addEventListeners = function () {
|
|
122
|
+
var options = this.model.getOptions();
|
|
123
|
+
var groupMapsTo = options.data.groupMapsTo;
|
|
194
124
|
var self = this;
|
|
195
125
|
this.parent.selectAll("path.bar")
|
|
196
126
|
.on("mouseover", function (datum) {
|
|
@@ -204,29 +134,18 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
204
134
|
});
|
|
205
135
|
})
|
|
206
136
|
.on("mousemove", function (datum) {
|
|
137
|
+
var _a;
|
|
207
138
|
var hoveredElement = select(this);
|
|
208
|
-
var itemData =
|
|
209
|
-
|
|
210
|
-
var
|
|
211
|
-
var sharedLabel = stackedData["label"];
|
|
212
|
-
// Remove the label field
|
|
213
|
-
delete stackedData["label"];
|
|
214
|
-
// filter out the label from the datasets' and associated values
|
|
215
|
-
var activePoints = Object.keys(stackedData)
|
|
216
|
-
.map(function (key) { return ({
|
|
217
|
-
datasetLabel: key,
|
|
218
|
-
value: stackedData[key],
|
|
219
|
-
label: sharedLabel
|
|
220
|
-
}); });
|
|
221
|
-
// Dispatch mouse event
|
|
222
|
-
self.services.events.dispatchEvent(Events.Bar.BAR_MOUSEMOVE, {
|
|
223
|
-
element: hoveredElement,
|
|
224
|
-
datum: datum
|
|
225
|
-
});
|
|
139
|
+
var itemData = datum.data[datum.group];
|
|
140
|
+
var rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();
|
|
141
|
+
var groupMapsTo = self.model.getOptions().data.groupMapsTo;
|
|
226
142
|
// Show tooltip
|
|
227
143
|
self.services.events.dispatchEvent("show-tooltip", {
|
|
228
|
-
multidata: activePoints,
|
|
229
144
|
hoveredElement: hoveredElement,
|
|
145
|
+
data: (_a = {},
|
|
146
|
+
_a[rangeIdentifier] = itemData,
|
|
147
|
+
_a[groupMapsTo] = datum.group,
|
|
148
|
+
_a),
|
|
230
149
|
type: TooltipTypes.DATAPOINT
|
|
231
150
|
});
|
|
232
151
|
})
|
|
@@ -241,14 +160,14 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
241
160
|
var hoveredElement = select(this);
|
|
242
161
|
hoveredElement.classed("hovered", false);
|
|
243
162
|
hoveredElement.transition(self.services.transitions.getTransition("graph_element_mouseout_fill_update"))
|
|
244
|
-
.attr("fill", function (d) { return self.model.
|
|
163
|
+
.attr("fill", function (d) { return self.model.getFillColor(d[groupMapsTo]); });
|
|
245
164
|
// Dispatch mouse event
|
|
246
165
|
self.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {
|
|
247
166
|
element: hoveredElement,
|
|
248
167
|
datum: datum
|
|
249
168
|
});
|
|
250
169
|
// Hide tooltip
|
|
251
|
-
self.services.events.dispatchEvent(
|
|
170
|
+
self.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement: hoveredElement });
|
|
252
171
|
});
|
|
253
172
|
};
|
|
254
173
|
StackedBar.prototype.destroy = function () {
|
|
@@ -259,8 +178,8 @@ var StackedBar = /** @class */ (function (_super) {
|
|
|
259
178
|
.on("mouseout", null);
|
|
260
179
|
// Remove legend listeners
|
|
261
180
|
var eventsFragment = this.services.events;
|
|
262
|
-
eventsFragment.removeEventListener(
|
|
263
|
-
eventsFragment.removeEventListener(
|
|
181
|
+
eventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);
|
|
182
|
+
eventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);
|
|
264
183
|
};
|
|
265
184
|
return StackedBar;
|
|
266
185
|
}(Bar));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from \"../../tools\";\nimport { Bar } from \"./bar\";\nimport {\n\tRoles,\n\tScaleTypes,\n\tTooltipTypes,\n\tEvents,\n\tCartesianOrientations\n} from \"../../interfaces\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { stack } from \"d3-shape\";\nimport { color } from \"d3-color\";\n\n// Add datasetLabel to each piece of data\n// To be used to get the fill color\nconst addLabelsAndValueToData = d => {\n\tObject.keys(d).map(key => {\n\t\tif (typeof d[key] === \"object\") {\n\t\t\td[key][\"datasetLabel\"] = d.key;\n\t\t\td[key][\"label\"] = d[key].data[\"label\"];\n\t\t\td[key][\"value\"] = d[key].data[d.key];\n\t\t}\n\t});\n\n\treturn d;\n};\n\nexport class StackedBar extends Bar {\n\ttype = \"stacked-bar\";\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(\"legend-item-onhover\", this.handleLegendOnHover);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.addEventListener(\"legend-item-onmouseout\", this.handleLegendMouseOut);\n\t}\n\n\tgetStackData() {\n\t\tlet stackDataArray;\n\t\tconst displayData = this.model.getDisplayData();\n\n\t\t// the domain axis for stack data depends on the orientation of the bar chart\n\t\tconst domainAxisPosition = this.services.cartesianScales.getDomainAxisPosition();\n\t\tconst domainScaleType = this.services.cartesianScales.getScaleTypeByPosition(domainAxisPosition);\n\t\t// get scale type for the main axis\n\t\tconst timeSeries = domainScaleType === ScaleTypes.TIME;\n\n\t\tif (timeSeries) {\n\t\t\t// Get all date values provided in data\n\t\t\t// TODO - Could be re-used through the model\n\t\t\tlet allDates = [];\n\t\t\tdisplayData.datasets.forEach(dataset => {\n\t\t\t\tallDates = allDates.concat(dataset.data.map(datum => Number(datum.date)));\n\t\t\t});\n\t\t\tallDates = Tools.removeArrayDuplicates(allDates).sort();\n\n\t\t\t// Go through all date values\n\t\t\t// And get corresponding data from each dataset\n\t\t\tstackDataArray = allDates.map((date, i) => {\n\t\t\t\tconst correspondingData = {};\n\n\t\t\t\tdisplayData.datasets.forEach(dataset => {\n\t\t\t\t\tconst correspondingDatum = dataset.data.find(datum => Number(datum.date) === Number(date));\n\t\t\t\t\tif (correspondingDatum) {\n\t\t\t\t\t\tcorrespondingData[dataset.label] = correspondingDatum.value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcorrespondingData[dataset.label] = 0;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcorrespondingData[\"label\"] = date;\n\n\t\t\t\treturn correspondingData;\n\t\t\t});\n\t\t} else {\n\t\t\t// Create the stack datalist\n\t\t\tstackDataArray = displayData.labels.map((label, i) => {\n\t\t\t\tconst correspondingData = {};\n\n\t\t\t\tdisplayData.datasets.forEach(dataset => {\n\t\t\t\t\tcorrespondingData[dataset.label] = !isNaN(dataset.data[i]) ? dataset.data[i] : dataset.data[i].value;\n\t\t\t\t});\n\t\t\t\tcorrespondingData[\"label\"] = label;\n\n\t\t\t\treturn correspondingData;\n\t\t\t});\n\t\t}\n\n\t\treturn stackDataArray;\n\t}\n\n\trender(animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst stackDataArray = this.getStackData();\n\t\tconst stackKeys = displayData.datasets.map(dataset => dataset.label);\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg.selectAll(\"g.bars\")\n\t\t\t.data(stack().keys(stackKeys)(stackDataArray), d => d.key);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups.enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"bars\", true)\n\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\t// Update data on all bars\n\t\tconst bars = svg.selectAll(\"g.bars\").selectAll(\"path.bar\")\n\t\t\t.data(d => addLabelsAndValueToData(d), d => d.label);\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit()\n\t\t\t.remove();\n\n\t\tconst yScale = this.services.cartesianScales.getRangeScale();\n\t\tbars.enter()\n\t\t\t.append(\"path\")\n\t\t\t.merge(bars)\n\t\t\t\t.classed(\"bar\", true)\n\t\t\t\t.transition(this.services.transitions.getTransition(\"bar-update-enter\", animate))\n\t\t\t\t.attr(\"fill\", d => this.model.getFillScale()[d.datasetLabel](d.label))\n\t\t\t\t.attr(\"height\", (d, i) => {\n\t\t\t\t\tconst { datasetLabel } = d;\n\t\t\t\t\tconst datasetLabelIndex = stackKeys.indexOf(datasetLabel);\n\t\t\t\t\tlet height;\n\t\t\t\t\t// determine height based on the y axis\n\t\t\t\t\tif (yScale.scaleType === ScaleTypes.LABELS) {\n\t\t\t\t\t\theight = Math.abs(yScale.scale.range()[0] - this.services.cartesianScales.getRangeValue(d.label, i));\n\t\t\t\t\t} else {\n\t\t\t\t\t\theight = this.services.cartesianScales.getRangeValue(d[0]) - this.services.cartesianScales.getRangeValue(d[1]);\n\t\t\t\t\t}\n\t\t\t\t\t// create dividers between bars\n\t\t\t\t\tif (datasetLabelIndex > 0 && height >= options.bars.dividerSize) {\n\t\t\t\t\t\treturn height - options.bars.dividerSize;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn height;\n\t\t\t\t})\n\t\t\t\t.attr(\"d\", (d, i) => {\n\t\t\t\t\t/*\n\t\t\t\t\t* Orientation support for horizontal/vertical bar charts\n\t\t\t\t\t* Determine coordinates needed for a vertical set of paths\n\t\t\t\t\t* to draw the bars needed, and pass those coordinates down to\n\t\t\t\t\t* generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t\t*/\n\t\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\t\tconst x0 = this.services.cartesianScales.getDomainValue(d, i) - barWidth / 2;\n\t\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\t\tconst y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t\t// Add the divider gap\n\t\t\t\t\tif (Math.abs(y1 - y0) > 0 && Math.abs(y1 - y0) > options.bars.dividerSize) {\n\t\t\t\t\t\tif (this.services.cartesianScales.getOrientation() === CartesianOrientations.VERTICAL) {\n\t\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\t\tthis.services.cartesianScales.getOrientation()\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t// a11y\n\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t.attr(\"aria-roledescription\", \"bar\")\n\t\t\t\t.attr(\"aria-label\", d => d.value);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-bar\"))\n\t\t\t.attr(\"opacity\", d => (d.datasetLabel !== hoveredElement.datum()[\"key\"]) ? 0.3 : 1);\n\t}\n\n\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-bar\"))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseover_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", color(hoveredElement.attr(\"fill\")).darker(0.7).toString());\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst itemData = select(this).datum();\n\t\t\t\thoveredElement.classed(\"hovered\", true);\n\n\t\t\t\tconst stackedData = itemData[\"data\"];\n\t\t\t\tconst sharedLabel = stackedData[\"label\"];\n\n\t\t\t\t// Remove the label field\n\t\t\t\tdelete stackedData[\"label\"];\n\n\t\t\t\t// filter out the label from the datasets' and associated values\n\t\t\t\tconst activePoints = Object.keys(stackedData)\n\t\t\t\t\t.map(key => ({\n\t\t\t\t\t\tdatasetLabel: key,\n\t\t\t\t\t\tvalue: stackedData[key],\n\t\t\t\t\t\tlabel: sharedLabel\n\t\t\t\t\t}));\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEMOVE, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(\"show-tooltip\", {\n\t\t\t\t\tmultidata: activePoints,\n\t\t\t\t\thoveredElement,\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseout_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", (d: any) => self.model.getFillScale()[d.datasetLabel](d.label));\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(\"hide-tooltip\", { hoveredElement });\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(\"legend-item-onhover\", this.handleLegendOnHover);\n\t\teventsFragment.removeEventListener(\"legend-item-onmouseout\", this.handleLegendMouseOut);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from \"../../tools\";\nimport { Bar } from \"./bar\";\nimport {\n\tRoles,\n\tTooltipTypes,\n\tEvents,\n\tCartesianOrientations\n} from \"../../interfaces\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { color } from \"d3-color\";\nimport { map } from \"d3-collection\";\n\nexport class StackedBar extends Bar {\n\ttype = \"stacked-bar\";\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\trender(animate: boolean) {\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\t// Chart options mixed with the internal configurations\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst stackKeys = map(displayData, datum => datum[domainIdentifier]).keys();\n\t\tconst stackData = this.model.getStackedData();\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg.selectAll(\"g.bars\")\n\t\t\t.data(stackData, d => d.key);\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups.enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"bars\", true)\n\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\t// Update data on all bars\n\t\tconst bars = svg.selectAll(\"g.bars\").selectAll(\"path.bar\")\n\t\t\t// Remove bars with a start and end value of 0\n\t\t\t.data(data => data.filter(d => !(d[0] === 0 && d[1] === 0)));\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit()\n\t\t\t.remove();\n\n\t\tbars.enter()\n\t\t\t.append(\"path\")\n\t\t\t.merge(bars)\n\t\t\t.classed(\"bar\", true)\n\t\t\t.transition(this.services.transitions.getTransition(\"bar-update-enter\", animate))\n\t\t\t.attr(\"fill\", d => this.model.getFillColor(d[groupMapsTo]))\n\t\t\t.attr(\"d\", (d, i) => {\n\t\t\t\tconst key = stackKeys[i];\n\n\t\t\t\t/*\n\t\t\t\t* Orientation support for horizontal/vertical bar charts\n\t\t\t\t* Determine coordinates needed for a vertical set of paths\n\t\t\t\t* to draw the bars needed, and pass those coordinates down to\n\t\t\t\t* generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t*/\n\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\tconst x0 = this.services.cartesianScales.getDomainValue(key, i) - barWidth / 2;\n\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\tconst y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t// Add the divider gap\n\t\t\t\tif (Math.abs(y1 - y0) > 0 && Math.abs(y1 - y0) > options.bars.dividerSize) {\n\t\t\t\t\tif (this.services.cartesianScales.getOrientation() === CartesianOrientations.VERTICAL) {\n\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\tthis.services.cartesianScales.getOrientation()\n\t\t\t\t);\n\t\t\t})\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"bar\")\n\t\t\t.attr(\"aria-label\", d => d.value);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-bar\"))\n\t\t\t.attr(\"opacity\", d => (d.datasetLabel !== hoveredElement.datum()[\"key\"]) ? 0.3 : 1);\n\t}\n\n\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-bar\"))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n\n\taddEventListeners() {\n\t\tconst options = this.model.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst self = this;\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseover_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", color(hoveredElement.attr(\"fill\")).darker(0.7).toString());\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst itemData = datum.data[datum.group];\n\n\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();\n\t\t\t\tconst { groupMapsTo } = self.model.getOptions().data;\n\t\t\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(\"show-tooltip\", {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t[rangeIdentifier]: itemData,\n\t\t\t\t\t\t[groupMapsTo]: datum.group\n\t\t\t\t\t},\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\thoveredElement.transition(self.services.transitions.getTransition(\"graph_element_mouseout_fill_update\"))\n\t\t\t\t\t.attr(\"fill\", (d: any) => self.model.getFillColor(d[groupMapsTo]));\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement });\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\"path.bar\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar.js","sourceRoot":"","sources":["bar.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"bar.js","sourceRoot":"","sources":["bar.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;IAAyB,uBAAS;IAAlC;;IAkBA,CAAC;IAjBA,oEAAoE;IAC1D,yBAAW,GAArB;QACC,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,IAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAEjE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,OAAO,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EACrB,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CACvD,CAAC;SACF;QAED,OAAO,IAAI,CAAC,GAAG,CACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EACrB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CACrB,CAAC;IACH,CAAC;IACF,UAAC;AAAD,CAAC,AAlBD,CAAyB,SAAS,GAkBjC","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\n\nexport class Bar extends Component {\n\t// Gets the correct width for bars based on options & configurations\n\tprotected getBarWidth() {\n\t\tconst options = this.model.getOptions();\n\t\tconst mainXScale = this.services.cartesianScales.getMainXScale();\n\n\t\tif (!mainXScale.step) {\n\t\t\treturn Math.min(\n\t\t\t\toptions.bars.maxWidth,\n\t\t\t\t(5 / mainXScale.ticks().length) * options.bars.maxWidth\n\t\t\t);\n\t\t}\n\n\t\treturn Math.min(\n\t\t\toptions.bars.maxWidth,\n\t\t\tmainXScale.step() / 2\n\t\t);\n\t}\n}\n"]}
|
|
@@ -4,5 +4,4 @@ export declare class Bubble extends Scatter {
|
|
|
4
4
|
type: string;
|
|
5
5
|
getRadiusScale(selection: Selection<any, any, any, any>): import("d3-scale").ScaleLinear<number, number>;
|
|
6
6
|
styleCircles(selection: Selection<any, any, any, any>, animate: boolean): void;
|
|
7
|
-
addLabelsToDataPoints(d: any, index: any): any;
|
|
8
7
|
}
|
|
@@ -24,43 +24,39 @@ var Bubble = /** @class */ (function (_super) {
|
|
|
24
24
|
return _this;
|
|
25
25
|
}
|
|
26
26
|
Bubble.prototype.getRadiusScale = function (selection) {
|
|
27
|
+
var options = this.model.getOptions();
|
|
28
|
+
var radiusMapsTo = options.bubble.radiusMapsTo;
|
|
27
29
|
var data = selection.data();
|
|
28
30
|
// Filter out any null/undefined values
|
|
29
|
-
var allRadii = data.map(function (d) { return d
|
|
30
|
-
var options = this.model.getOptions();
|
|
31
|
+
var allRadii = data.map(function (d) { return d[radiusMapsTo]; }).filter(function (radius) { return radius; });
|
|
31
32
|
var chartSize = DOMUtils.getSVGElementSize(this.services.domUtils.getMainSVG(), { useAttr: true });
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
// We need the ternary operator here in case the user
|
|
34
|
+
// doesn't provide radius values in data
|
|
35
|
+
var radiusDataIsValid = allRadii.length > 0;
|
|
36
|
+
var domain = radiusDataIsValid ? extent(allRadii) : [1, 1];
|
|
37
|
+
return scaleLinear().domain(domain)
|
|
38
|
+
.range(radiusDataIsValid ? options.bubble.radiusRange(chartSize, data) : [4, 4]);
|
|
34
39
|
};
|
|
35
40
|
Bubble.prototype.styleCircles = function (selection, animate) {
|
|
36
41
|
var _this = this;
|
|
37
42
|
// Chart options mixed with the internal configurations
|
|
38
43
|
var options = this.model.getOptions();
|
|
44
|
+
var radiusMapsTo = options.bubble.radiusMapsTo;
|
|
39
45
|
var radiusScale = this.getRadiusScale(selection);
|
|
46
|
+
var groupMapsTo = options.data.groupMapsTo;
|
|
47
|
+
var domainIdentifier = this.services.cartesianScales.getDomainIdentifier();
|
|
40
48
|
selection.raise()
|
|
41
49
|
.classed("dot", true)
|
|
42
50
|
.attr("cx", function (d, i) { return _this.services.cartesianScales.getDomainValue(d, i); })
|
|
43
51
|
.transition(this.services.transitions.getTransition("bubble-update-enter", animate))
|
|
44
52
|
.attr("cy", function (d, i) { return _this.services.cartesianScales.getRangeValue(d, i); })
|
|
45
|
-
|
|
46
|
-
.attr("
|
|
53
|
+
// We need `|| 1` here in case the user doesn't provide radius values in data
|
|
54
|
+
.attr("r", function (d) { return radiusScale(d[radiusMapsTo] || 1); })
|
|
55
|
+
.attr("fill", function (d) { return _this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d); })
|
|
47
56
|
.attr("fill-opacity", options.bubble.fillOpacity)
|
|
48
|
-
.attr("stroke", function (d) { return _this.model.getStrokeColor(d
|
|
57
|
+
.attr("stroke", function (d) { return _this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d); })
|
|
49
58
|
.attr("opacity", 1);
|
|
50
59
|
};
|
|
51
|
-
// TODO - This method could be re-used in more graphs
|
|
52
|
-
Bubble.prototype.addLabelsToDataPoints = function (d, index) {
|
|
53
|
-
// Chart options mixed with the internal configurations
|
|
54
|
-
var options = this.model.getOptions();
|
|
55
|
-
var labels = this.model.getDisplayData().labels;
|
|
56
|
-
return d.data.map(function (datum, i) { return ({
|
|
57
|
-
date: datum.date,
|
|
58
|
-
label: labels[i],
|
|
59
|
-
datasetLabel: d.label,
|
|
60
|
-
value: isNaN(datum) ? datum.value : datum,
|
|
61
|
-
radius: datum.radius || options.points.radius
|
|
62
|
-
}); });
|
|
63
|
-
};
|
|
64
60
|
return Bubble;
|
|
65
61
|
}(Scatter));
|
|
66
62
|
export { Bubble };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bubble.js","sourceRoot":"","sources":["bubble.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;IAA4B,0BAAO;IAAnC;QAAA,
|
|
1
|
+
{"version":3,"file":"bubble.js","sourceRoot":"","sources":["bubble.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Scatter } from \"./scatter\";\nimport { DOMUtils } from \"../../services\";\n\n// D3 Imports\nimport { Selection } from \"d3-selection\";\nimport { extent } from \"d3-array\";\nimport { scaleLinear } from \"d3-scale\";\n\nexport class Bubble extends Scatter {\n\ttype = \"bubble\";\n\n\tgetRadiusScale(selection: Selection<any, any, any, any>) {\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst data = selection.data();\n\t\t// Filter out any null/undefined values\n\t\tconst allRadii = data.map(d => d[radiusMapsTo]).filter(radius => radius);\n\t\tconst chartSize = DOMUtils.getSVGElementSize(this.services.domUtils.getMainSVG(), { useAttr: true });\n\n\t\t// We need the ternary operator here in case the user\n\t\t// doesn't provide radius values in data\n\t\tconst radiusDataIsValid = allRadii.length > 0;\n\t\tconst domain = radiusDataIsValid ? extent(allRadii) : [1, 1];\n\t\treturn scaleLinear().domain(domain)\n\t\t\t.range(radiusDataIsValid ? options.bubble.radiusRange(chartSize, data) : [4, 4]);\n\t}\n\n\tstyleCircles(selection: Selection<any, any, any, any>, animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\t\tconst { radiusMapsTo } = options.bubble;\n\n\t\tconst radiusScale = this.getRadiusScale(selection);\n\n\t\tconst { groupMapsTo } = options.data;\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\tselection.raise()\n\t\t\t.classed(\"dot\", true)\n\t\t\t.attr(\"cx\", (d, i) => this.services.cartesianScales.getDomainValue(d, i))\n\t\t\t.transition(this.services.transitions.getTransition(\"bubble-update-enter\", animate))\n\t\t\t.attr(\"cy\", (d, i) => this.services.cartesianScales.getRangeValue(d, i))\n\t\t\t// We need `|| 1` here in case the user doesn't provide radius values in data\n\t\t\t.attr(\"r\", d => radiusScale(d[radiusMapsTo] || 1))\n\t\t\t.attr(\"fill\", d => this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d))\n\t\t\t.attr(\"fill-opacity\", options.bubble.fillOpacity)\n\t\t\t.attr(\"stroke\", d => this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n}\n"]}
|
|
@@ -58,7 +58,7 @@ var Donut = /** @class */ (function (_super) {
|
|
|
58
58
|
var options = this.model.getOptions();
|
|
59
59
|
var donutCenterFigure = Tools.getProperty(options, "donut", "center", "number");
|
|
60
60
|
if (!donutCenterFigure) {
|
|
61
|
-
donutCenterFigure = this.
|
|
61
|
+
donutCenterFigure = this.model.getDisplayData().reduce(function (accumulator, d) {
|
|
62
62
|
return accumulator + d.value;
|
|
63
63
|
}, 0);
|
|
64
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"donut.js","sourceRoot":"","sources":["donut.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mBAAmB;AACnB,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD;IAA2B,yBAAG;IAA9B;QAAA,qEA0DC;QAzDA,UAAI,GAAG,OAAO,CAAC;;IAyDhB,CAAC;IAvDA,sBAAM,GAAN,UAAO,OAAc;QAAd,wBAAA,EAAA,cAAc;QACpB,yBAAyB;QACzB,iBAAM,MAAM,YAAC,OAAO,CAAC,CAAC;QAEtB,IAAM,IAAI,GAAG,IAAI,CAAC;QAElB,IAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;QACxE,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAExC,kCAAkC;QAClC,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEpC,kDAAkD;QAClD,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,mBAAmB,CAAC;aAC/C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;aAC7B,KAAK,CAAC,WAAW,EAAE,cAAM,OAAA,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAA3C,CAA2C,CAAC;aACrE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;aACzF,KAAK,CAAC,MAAM,EAAE;YACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEJ,4DAA4D;QAC5D,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC;aAC9C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;aAC7B,KAAK,CAAC,WAAW,EAAE,cAAM,OAAA,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAA1C,CAA0C,CAAC;aACpE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;aACtD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,8BAAc,GAAd;QACC,kCAAkC;QAClC,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEpC,OAAO,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,iCAAiB,GAAjB,UAAkB,KAAK;QACtB,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAExC,IAAI,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,iBAAiB,EAAE;YACvB,iBAAiB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"donut.js","sourceRoot":"","sources":["donut.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Pie } from \"./pie\";\nimport { DOMUtils } from \"../../services\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { interpolateNumber } from \"d3-interpolate\";\n\nexport class Donut extends Pie {\n\ttype = \"donut\";\n\n\trender(animate = true) {\n\t\t// Call render() from Pie\n\t\tsuper.render(animate);\n\n\t\tconst self = this;\n\n\t\tconst svg = DOMUtils.appendOrSelect(this.getContainerSVG(), \"g.center\");\n\t\tconst options = this.model.getOptions();\n\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\t// Add the number shown in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-figure\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () => options.donut.center.numberFontSize(radius))\n\t\t\t.transition(this.services.transitions.getTransition(\"donut-figure-enter-update\", animate))\n\t\t\t.tween(\"text\", function() {\n\t\t\t\treturn self.centerNumberTween(select(this));\n\t\t\t});\n\n\t\t// Add the label below the number in the center of the donut\n\t\tDOMUtils.appendOrSelect(svg, \"text.donut-title\")\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.style(\"font-size\", () => options.donut.center.titleFontSize(radius))\n\t\t\t.attr(\"y\", options.donut.center.titleYPosition(radius))\n\t\t\t.text(Tools.getProperty(options, \"donut\", \"center\", \"label\"));\n\t}\n\n\tgetInnerRadius() {\n\t\t// Compute the outer radius needed\n\t\tconst radius = this.computeRadius();\n\n\t\treturn radius * (3 / 4);\n\t}\n\n\tcenterNumberTween(d3Ref) {\n\t\tconst options = this.model.getOptions();\n\n\t\tlet donutCenterFigure = Tools.getProperty(options, \"donut\", \"center\", \"number\");\n\t\tif (!donutCenterFigure) {\n\t\t\tdonutCenterFigure = this.model.getDisplayData().reduce((accumulator, d) => {\n\t\t\t\treturn accumulator + d.value;\n\t\t\t}, 0);\n\t\t}\n\n\t\t// Remove commas from the current value string, and convert to an int\n\t\tconst currentValue = parseInt(d3Ref.text().replace(/[, ]+/g, \"\"), 10) || 0;\n\t\tconst i = interpolateNumber(currentValue, donutCenterFigure);\n\n\t\treturn t => {\n\t\t\tconst { numberFormatter } = options.donut.center;\n\t\t\td3Ref.text(numberFormatter(i(t)));\n\t\t};\n\t}\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Component } from "../component";
|
|
2
2
|
export declare class Line extends Component {
|
|
3
3
|
type: string;
|
|
4
|
-
lineGenerator: any;
|
|
5
4
|
init(): void;
|
|
6
5
|
render(animate?: boolean): void;
|
|
6
|
+
handleLegendOnHover: (event: CustomEvent<any>) => void;
|
|
7
|
+
handleLegendMouseOut: (event: CustomEvent<any>) => void;
|
|
8
|
+
destroy(): void;
|
|
7
9
|
}
|
|
@@ -14,58 +14,59 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
// Internal Imports
|
|
15
15
|
import { Component } from "../component";
|
|
16
16
|
import * as Configuration from "../../configuration";
|
|
17
|
-
import { Roles } from "../../interfaces";
|
|
18
|
-
// D3 Imports
|
|
19
|
-
import { select } from "d3-selection";
|
|
17
|
+
import { Roles, Events } from "../../interfaces";
|
|
20
18
|
import { line } from "d3-shape";
|
|
21
19
|
var Line = /** @class */ (function (_super) {
|
|
22
20
|
__extends(Line, _super);
|
|
23
21
|
function Line() {
|
|
24
22
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
25
23
|
_this.type = "line";
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// TODORF - Remove these listeners in destroy()
|
|
29
|
-
Line.prototype.init = function () {
|
|
30
|
-
var _this = this;
|
|
31
|
-
// Highlight correct scatter on legend item hovers
|
|
32
|
-
this.services.events.addEventListener("legend-item-onhover", function (e) {
|
|
33
|
-
var hoveredElement = e.detail.hoveredElement;
|
|
24
|
+
_this.handleLegendOnHover = function (event) {
|
|
25
|
+
var hoveredElement = event.detail.hoveredElement;
|
|
34
26
|
_this.parent.selectAll("g.lines")
|
|
35
27
|
.transition(_this.services.transitions.getTransition("legend-hover-line"))
|
|
36
|
-
.attr("opacity", function (
|
|
37
|
-
if (
|
|
28
|
+
.attr("opacity", function (group) {
|
|
29
|
+
if (group.name !== hoveredElement.datum()["name"]) {
|
|
38
30
|
return Configuration.lines.opacity.unselected;
|
|
39
31
|
}
|
|
40
32
|
return Configuration.lines.opacity.selected;
|
|
41
33
|
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
this.services.events.addEventListener("legend-item-onmouseout", function (e) {
|
|
34
|
+
};
|
|
35
|
+
_this.handleLegendMouseOut = function (event) {
|
|
45
36
|
_this.parent.selectAll("g.lines")
|
|
46
37
|
.transition(_this.services.transitions.getTransition("legend-mouseout-line"))
|
|
47
38
|
.attr("opacity", Configuration.lines.opacity.selected);
|
|
48
|
-
}
|
|
39
|
+
};
|
|
40
|
+
return _this;
|
|
41
|
+
}
|
|
42
|
+
Line.prototype.init = function () {
|
|
43
|
+
var events = this.services.events;
|
|
44
|
+
// Highlight correct line legend item hovers
|
|
45
|
+
events.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);
|
|
46
|
+
// Un-highlight lines on legend item mouseouts
|
|
47
|
+
events.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);
|
|
49
48
|
};
|
|
50
49
|
Line.prototype.render = function (animate) {
|
|
51
50
|
var _this = this;
|
|
52
51
|
if (animate === void 0) { animate = true; }
|
|
53
52
|
var svg = this.getContainerSVG();
|
|
54
53
|
// D3 line generator function
|
|
55
|
-
|
|
54
|
+
var lineGenerator = line()
|
|
56
55
|
.x(function (d, i) { return _this.services.cartesianScales.getDomainValue(d, i); })
|
|
57
56
|
.y(function (d, i) { return _this.services.cartesianScales.getRangeValue(d, i); })
|
|
58
57
|
.curve(this.services.curves.getD3Curve())
|
|
59
58
|
.defined(function (datum, i) {
|
|
60
|
-
var
|
|
59
|
+
var rangeIdentifier = _this.services.cartesianScales.getRangeIdentifier();
|
|
60
|
+
var value = datum[rangeIdentifier];
|
|
61
61
|
if (value === null || value === undefined) {
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
64
|
return true;
|
|
65
65
|
});
|
|
66
|
+
var groupedData = this.model.getGroupedData();
|
|
66
67
|
// Update the bound data on line groups
|
|
67
68
|
var lineGroups = svg.selectAll("g.lines")
|
|
68
|
-
.data(
|
|
69
|
+
.data(groupedData, function (group) { return group.name; });
|
|
69
70
|
// Remove elements that need to be exited
|
|
70
71
|
// We need exit at the top here to make sure that
|
|
71
72
|
// Data filters are processed before entering new elements
|
|
@@ -77,30 +78,40 @@ var Line = /** @class */ (function (_super) {
|
|
|
77
78
|
var enteringLineGroups = lineGroups.enter()
|
|
78
79
|
.append("g")
|
|
79
80
|
.classed("lines", true);
|
|
80
|
-
var self = this;
|
|
81
81
|
// Enter paths that need to be introduced
|
|
82
82
|
var enteringPaths = enteringLineGroups.append("path")
|
|
83
83
|
.attr("opacity", 0);
|
|
84
84
|
// Apply styles and datum
|
|
85
85
|
enteringPaths.merge(svg.selectAll("g.lines path"))
|
|
86
|
-
.attr("stroke", function (
|
|
87
|
-
|
|
88
|
-
return self.model.getStrokeColor(parentDatum.label);
|
|
89
|
-
})
|
|
90
|
-
.datum(function (d) {
|
|
91
|
-
var parentDatum = select(this.parentNode).datum();
|
|
92
|
-
this._datasetLabel = parentDatum.label;
|
|
93
|
-
return parentDatum.data;
|
|
86
|
+
.attr("stroke", function (group, i) {
|
|
87
|
+
return _this.model.getStrokeColor(group.name);
|
|
94
88
|
})
|
|
95
89
|
// a11y
|
|
96
90
|
.attr("role", Roles.GRAPHICS_SYMBOL)
|
|
97
91
|
.attr("aria-roledescription", "line")
|
|
98
|
-
.attr("aria-label", function (
|
|
92
|
+
.attr("aria-label", function (group) {
|
|
93
|
+
var data = group.data;
|
|
94
|
+
var rangeIdentifier = _this.services.cartesianScales.getRangeIdentifier();
|
|
95
|
+
return data.map(function (datum) { return datum[rangeIdentifier]; }).join(",");
|
|
96
|
+
})
|
|
99
97
|
// Transition
|
|
100
98
|
.transition(this.services.transitions.getTransition("line-update-enter", animate))
|
|
101
99
|
.attr("opacity", 1)
|
|
102
100
|
.attr("class", "line")
|
|
103
|
-
.attr("d",
|
|
101
|
+
.attr("d", function (group) {
|
|
102
|
+
var data = group.data;
|
|
103
|
+
return lineGenerator(data);
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
Line.prototype.destroy = function () {
|
|
107
|
+
// Remove event listeners
|
|
108
|
+
this.parent.selectAll("path")
|
|
109
|
+
.on("mousemove", null)
|
|
110
|
+
.on("mouseout", null);
|
|
111
|
+
// Remove legend listeners
|
|
112
|
+
var eventsFragment = this.services.events;
|
|
113
|
+
eventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);
|
|
114
|
+
eventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);
|
|
104
115
|
};
|
|
105
116
|
return Line;
|
|
106
117
|
}(Component));
|