@carbon/charts 0.30.7 → 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.
Files changed (138) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/demo/data/bar.d.ts +56 -94
  3. package/build/demo/data/bubble.d.ts +58 -13
  4. package/build/demo/data/donut.d.ts +3 -6
  5. package/build/demo/data/line.d.ts +35 -35
  6. package/build/demo/data/pie.d.ts +3 -6
  7. package/build/demo/data/scatter.d.ts +33 -20
  8. package/build/demo/data/step.d.ts +15 -16
  9. package/build/demo/data/time-series-axis.d.ts +12 -48
  10. package/build/src/charts/bar-grouped.d.ts +2 -2
  11. package/build/src/charts/bar-simple.d.ts +2 -4
  12. package/build/src/components/essentials/legend.d.ts +0 -4
  13. package/build/src/components/essentials/tooltip-bar.d.ts +1 -1
  14. package/build/src/components/essentials/tooltip-pie.d.ts +5 -0
  15. package/build/src/components/essentials/tooltip-scatter.d.ts +1 -1
  16. package/build/src/components/graphs/bar-grouped.d.ts +6 -4
  17. package/build/src/components/graphs/bar-simple.d.ts +0 -1
  18. package/build/src/components/graphs/bar-stacked.d.ts +0 -1
  19. package/build/src/components/graphs/bubble.d.ts +0 -1
  20. package/build/src/components/graphs/line.d.ts +3 -1
  21. package/build/src/components/graphs/pie.d.ts +0 -1
  22. package/build/src/components/graphs/scatter.d.ts +0 -1
  23. package/build/src/components/index.d.ts +1 -0
  24. package/build/src/interfaces/axis-scales.d.ts +4 -16
  25. package/build/src/interfaces/charts.d.ts +23 -1
  26. package/build/src/interfaces/enums.d.ts +0 -4
  27. package/build/src/model-pie.d.ts +1 -7
  28. package/build/src/model.d.ts +31 -13
  29. package/build/src/services/scales-cartesian.d.ts +11 -3
  30. package/build/src/tools.d.ts +2 -2
  31. package/build/stories/tutorials.stories.d.ts +1 -0
  32. package/bundle.js +1 -1
  33. package/charts/bar-grouped.d.ts +2 -2
  34. package/charts/bar-grouped.js.map +1 -1
  35. package/charts/bar-simple.d.ts +2 -4
  36. package/charts/bar-simple.js +0 -2
  37. package/charts/bar-simple.js.map +1 -1
  38. package/charts/donut.js +2 -2
  39. package/charts/donut.js.map +1 -1
  40. package/charts/pie.js +2 -2
  41. package/charts/pie.js.map +1 -1
  42. package/components/axes/grid.js +10 -17
  43. package/components/axes/grid.js.map +1 -1
  44. package/components/essentials/legend.d.ts +0 -4
  45. package/components/essentials/legend.js +8 -22
  46. package/components/essentials/legend.js.map +1 -1
  47. package/components/essentials/tooltip-bar.d.ts +1 -1
  48. package/components/essentials/tooltip-bar.js +12 -4
  49. package/components/essentials/tooltip-bar.js.map +1 -1
  50. package/components/essentials/tooltip-pie.d.ts +5 -0
  51. package/components/essentials/tooltip-pie.js +40 -0
  52. package/components/essentials/tooltip-pie.js.map +1 -0
  53. package/components/essentials/tooltip-scatter.d.ts +1 -1
  54. package/components/essentials/tooltip-scatter.js +8 -6
  55. package/components/essentials/tooltip-scatter.js.map +1 -1
  56. package/components/essentials/tooltip.js +13 -16
  57. package/components/essentials/tooltip.js.map +1 -1
  58. package/components/graphs/bar-grouped.d.ts +6 -4
  59. package/components/graphs/bar-grouped.js +58 -30
  60. package/components/graphs/bar-grouped.js.map +1 -1
  61. package/components/graphs/bar-simple.d.ts +0 -1
  62. package/components/graphs/bar-simple.js +10 -28
  63. package/components/graphs/bar-simple.js.map +1 -1
  64. package/components/graphs/bar-stacked.d.ts +0 -1
  65. package/components/graphs/bar-stacked.js +27 -108
  66. package/components/graphs/bar-stacked.js.map +1 -1
  67. package/components/graphs/bubble.d.ts +0 -1
  68. package/components/graphs/bubble.js +16 -20
  69. package/components/graphs/bubble.js.map +1 -1
  70. package/components/graphs/donut.js +1 -1
  71. package/components/graphs/donut.js.map +1 -1
  72. package/components/graphs/line.d.ts +3 -1
  73. package/components/graphs/line.js +41 -30
  74. package/components/graphs/line.js.map +1 -1
  75. package/components/graphs/pie.d.ts +0 -1
  76. package/components/graphs/pie.js +11 -18
  77. package/components/graphs/pie.js.map +1 -1
  78. package/components/graphs/scatter.d.ts +0 -1
  79. package/components/graphs/scatter.js +24 -39
  80. package/components/graphs/scatter.js.map +1 -1
  81. package/components/index.d.ts +1 -0
  82. package/components/index.js +1 -0
  83. package/components/index.js.map +1 -1
  84. package/configuration.js +7 -0
  85. package/configuration.js.map +1 -1
  86. package/demo/data/bar.d.ts +56 -94
  87. package/demo/data/bar.js +106 -271
  88. package/demo/data/bar.js.map +1 -1
  89. package/demo/data/bubble.d.ts +58 -13
  90. package/demo/data/bubble.js +74 -174
  91. package/demo/data/bubble.js.map +1 -1
  92. package/demo/data/bundle.js +1 -1
  93. package/demo/data/donut.d.ts +3 -6
  94. package/demo/data/index.js +22 -4
  95. package/demo/data/index.js.map +1 -1
  96. package/demo/data/line.d.ts +35 -35
  97. package/demo/data/line.js +70 -196
  98. package/demo/data/line.js.map +1 -1
  99. package/demo/data/pie.d.ts +3 -6
  100. package/demo/data/pie.js +8 -10
  101. package/demo/data/pie.js.map +1 -1
  102. package/demo/data/scatter.d.ts +33 -20
  103. package/demo/data/scatter.js +50 -68
  104. package/demo/data/scatter.js.map +1 -1
  105. package/demo/data/step.d.ts +15 -16
  106. package/demo/data/time-series-axis.d.ts +12 -48
  107. package/demo/data/time-series-axis.js +34 -46
  108. package/demo/data/time-series-axis.js.map +1 -1
  109. package/demo/styles.css +28 -0
  110. package/demo/styles.css.map +1 -1
  111. package/demo/styles.min.css +1 -1
  112. package/demo/styles.min.css.map +1 -1
  113. package/demo/tsconfig.tsbuildinfo +36 -35
  114. package/interfaces/axis-scales.d.ts +4 -16
  115. package/interfaces/axis-scales.js.map +1 -1
  116. package/interfaces/charts.d.ts +23 -1
  117. package/interfaces/charts.js.map +1 -1
  118. package/interfaces/enums.d.ts +0 -4
  119. package/interfaces/enums.js +0 -5
  120. package/interfaces/enums.js.map +1 -1
  121. package/model-pie.d.ts +1 -7
  122. package/model-pie.js +2 -107
  123. package/model-pie.js.map +1 -1
  124. package/model.d.ts +31 -13
  125. package/model.js +199 -75
  126. package/model.js.map +1 -1
  127. package/package.json +3 -1
  128. package/services/scales-cartesian.d.ts +11 -3
  129. package/services/scales-cartesian.js +104 -122
  130. package/services/scales-cartesian.js.map +1 -1
  131. package/tools.d.ts +2 -2
  132. package/tools.js +23 -2
  133. package/tools.js.map +1 -1
  134. package/tsconfig.tsbuildinfo +72 -73
  135. package/build/src/model-simple-bar.d.ts +0 -11
  136. package/model-simple-bar.d.ts +0 -11
  137. package/model-simple-bar.js +0 -88
  138. package/model-simple-bar.js.map +0 -1
@@ -18,7 +18,8 @@ import { AxisPositions, CartesianOrientations, ScaleTypes } from "../interfaces"
18
18
  import { Tools } from "../tools";
19
19
  // D3 Imports
20
20
  import { scaleBand, scaleLinear, scaleTime, scaleLog } from "d3-scale";
21
- import { min, extent } from "d3-array";
21
+ import { extent, sum } from "d3-array";
22
+ import { map, values } from "d3-collection";
22
23
  // Misc
23
24
  import { differenceInYears, addYears, subYears, differenceInMonths, addMonths, subMonths, differenceInDays, addDays, subDays, differenceInHours, addHours, subHours, differenceInMinutes, addMinutes, subMinutes, differenceInSeconds, subSeconds, addSeconds } from "date-fns";
24
25
  function addPaddingInDomain(_a, paddingRatio) {
@@ -55,55 +56,68 @@ var CartesianScales = /** @class */ (function (_super) {
55
56
  CartesianScales.prototype.getRangeAxisPosition = function () {
56
57
  return this.rangeAxisPosition;
57
58
  };
58
- CartesianScales.prototype.setDefaultAxes = function () {
59
- var axesOptions = Tools.getProperty(this.model.getOptions(), "axes");
60
- if (!axesOptions) {
61
- this.model.getOptions().axes = {
62
- left: {
63
- primary: true,
64
- includeZero: true,
65
- },
66
- bottom: {
67
- secondary: true,
68
- includeZero: true,
69
- scaleType: this.model.getDisplayData().labels ? ScaleTypes.LABELS : undefined
70
- }
71
- };
72
- }
73
- };
74
59
  CartesianScales.prototype.update = function (animate) {
75
60
  var _this = this;
76
61
  if (animate === void 0) { animate = true; }
77
- this.setDefaultAxes();
62
+ this.findDomainAndRangeAxes();
78
63
  this.determineOrientation();
79
64
  var axisPositions = Object.keys(AxisPositions).map(function (axisPositionKey) { return AxisPositions[axisPositionKey]; });
80
65
  axisPositions.forEach(function (axisPosition) {
81
66
  _this.scales[axisPosition] = _this.createScale(axisPosition);
82
67
  });
83
68
  };
84
- CartesianScales.prototype.determineOrientation = function () {
85
- var _this = this;
69
+ CartesianScales.prototype.findMainVerticalAxisPosition = function () {
86
70
  var options = this.model.getOptions();
87
- // Manually specifying positions here
88
- // In order to enforce a priority
89
- [
90
- AxisPositions.LEFT,
91
- AxisPositions.BOTTOM,
92
- AxisPositions.RIGHT,
93
- AxisPositions.TOP
94
- ].forEach(function (axisPosition) {
95
- var axisOptions = Tools.getProperty(options, "axes", axisPosition);
96
- if (axisOptions) {
97
- var scaleType = axisOptions.scaleType || ScaleTypes.LINEAR;
98
- _this.scaleTypes[axisPosition] = scaleType;
99
- if (scaleType === ScaleTypes.LINEAR) {
100
- _this.rangeAxisPosition = axisPosition;
101
- }
102
- else {
103
- _this.domainAxisPosition = axisPosition;
104
- }
105
- }
106
- });
71
+ var axisOptions = Tools.getProperty(options, "axes");
72
+ // If right axis has been specified as `main`
73
+ if (Tools.getProperty(axisOptions, "axes", AxisPositions.RIGHT, "main") === true) {
74
+ return AxisPositions.RIGHT;
75
+ }
76
+ return AxisPositions.LEFT;
77
+ };
78
+ CartesianScales.prototype.findMainHorizontalAxisPosition = function () {
79
+ var options = this.model.getOptions();
80
+ var axisOptions = Tools.getProperty(options, "axes");
81
+ // If top axis has been specified as `main`
82
+ if (Tools.getProperty(axisOptions, "axes", AxisPositions.TOP, "main") === true) {
83
+ return AxisPositions.TOP;
84
+ }
85
+ return AxisPositions.BOTTOM;
86
+ };
87
+ CartesianScales.prototype.findDomainAndRangeAxesPositions = function (mainVerticalAxisPosition, mainHorizontalAxisPosition) {
88
+ var options = this.model.getOptions();
89
+ var mainVerticalAxisOptions = Tools.getProperty(options, "axes", mainVerticalAxisPosition);
90
+ var mainHorizontalAxisOptions = Tools.getProperty(options, "axes", mainHorizontalAxisPosition);
91
+ var mainVerticalScaleType = mainVerticalAxisOptions.scaleType || ScaleTypes.LINEAR;
92
+ var mainHorizontalScaleType = mainHorizontalAxisOptions.scaleType || ScaleTypes.LINEAR;
93
+ var result = {
94
+ domainAxisPosition: null,
95
+ rangeAxisPosition: null
96
+ };
97
+ if (mainHorizontalScaleType === ScaleTypes.LABELS || mainHorizontalScaleType === ScaleTypes.TIME) {
98
+ result.domainAxisPosition = mainHorizontalAxisPosition;
99
+ result.rangeAxisPosition = mainVerticalAxisPosition;
100
+ }
101
+ else if (mainVerticalScaleType === ScaleTypes.LABELS || mainVerticalScaleType === ScaleTypes.TIME) {
102
+ result.domainAxisPosition = mainVerticalAxisPosition;
103
+ result.rangeAxisPosition = mainHorizontalAxisPosition;
104
+ }
105
+ else {
106
+ result.domainAxisPosition = mainHorizontalAxisPosition;
107
+ result.rangeAxisPosition = mainVerticalAxisPosition;
108
+ }
109
+ return result;
110
+ };
111
+ CartesianScales.prototype.findDomainAndRangeAxes = function () {
112
+ // find main axes between (left & right) && (bottom & top)
113
+ var mainVerticalAxisPosition = this.findMainVerticalAxisPosition();
114
+ var mainHorizontalAxisPosition = this.findMainHorizontalAxisPosition();
115
+ // Now we have horizontal & vertical main axes to choose domain & range axes from
116
+ var domainAndRangeAxesPositions = this.findDomainAndRangeAxesPositions(mainVerticalAxisPosition, mainHorizontalAxisPosition);
117
+ this.domainAxisPosition = domainAndRangeAxesPositions.domainAxisPosition;
118
+ this.rangeAxisPosition = domainAndRangeAxesPositions.rangeAxisPosition;
119
+ };
120
+ CartesianScales.prototype.determineOrientation = function () {
107
121
  if (this.rangeAxisPosition === AxisPositions.LEFT && this.domainAxisPosition === AxisPositions.BOTTOM) {
108
122
  this.orientation = CartesianOrientations.VERTICAL;
109
123
  }
@@ -145,15 +159,17 @@ var CartesianScales = /** @class */ (function (_super) {
145
159
  return this.scales[this.getMainYAxisPosition()];
146
160
  };
147
161
  CartesianScales.prototype.getValueFromScale = function (axisPosition, datum, index) {
148
- var value = isNaN(datum) ? datum.value : datum;
162
+ var options = this.model.getOptions();
163
+ var axisOptions = Tools.getProperty(options, "axes", axisPosition);
149
164
  var scaleType = this.scaleTypes[axisPosition];
150
165
  var scale = this.scales[axisPosition];
166
+ var mapsTo = axisOptions.mapsTo;
167
+ var value = datum[mapsTo] !== undefined ? datum[mapsTo] : datum;
151
168
  if (scaleType === ScaleTypes.LABELS) {
152
- var correspondingLabel = this.model.getDisplayData().labels[index];
153
- return scale(correspondingLabel) + scale.step() / 2;
169
+ return scale(value) + scale.step() / 2;
154
170
  }
155
- else if (scaleType === ScaleTypes.TIME) {
156
- return scale(new Date(datum.date || datum.label));
171
+ if (scaleType === ScaleTypes.TIME) {
172
+ return scale(new Date(value));
157
173
  }
158
174
  return scale(value);
159
175
  };
@@ -163,97 +179,63 @@ var CartesianScales = /** @class */ (function (_super) {
163
179
  CartesianScales.prototype.getRangeValue = function (d, i) {
164
180
  return this.getValueFromScale(this.rangeAxisPosition, d, i);
165
181
  };
166
- /** Uses the primary Y Axis to get data items associated with that value. */
182
+ CartesianScales.prototype.getDomainIdentifier = function () {
183
+ var options = this.model.getOptions();
184
+ var axisOptions = Tools.getProperty(options, "axes", this.domainAxisPosition);
185
+ return axisOptions.mapsTo;
186
+ };
187
+ CartesianScales.prototype.getRangeIdentifier = function () {
188
+ var options = this.model.getOptions();
189
+ var axisOptions = Tools.getProperty(options, "axes", this.rangeAxisPosition);
190
+ return axisOptions.mapsTo;
191
+ };
192
+ /** Uses the primary Y Axis to get data items associated with that value. */
167
193
  CartesianScales.prototype.getDataFromDomain = function (domainValue) {
168
194
  var displayData = this.model.getDisplayData();
169
- var activePoints = [];
195
+ var domainIdentifier = this.getDomainIdentifier();
170
196
  var scaleType = this.scaleTypes[this.domainAxisPosition];
171
- switch (scaleType) {
172
- case ScaleTypes.LABELS:
173
- // based on labels we use the index to get the associated data
174
- var index_1 = displayData.labels.indexOf(domainValue);
175
- displayData.datasets.forEach(function (dataset) {
176
- activePoints.push({
177
- datasetLabel: dataset.label,
178
- value: dataset.data[index_1],
179
- });
180
- });
181
- break;
182
- case ScaleTypes.TIME:
183
- // time series we filter using the date
184
- var domainKey_1 = Object.keys(displayData.datasets[0].data[0]).filter(function (key) { return key !== "value"; })[0];
185
- displayData.datasets.forEach(function (dataset) {
186
- var sharedLabel = dataset.label;
187
- // filter the items in each dataset for the points associated with the Domain
188
- var dataItems = dataset.data.filter(function (item) {
189
- var date1 = new Date(item[domainKey_1]);
190
- var date2 = new Date(domainValue);
191
- return date1.getTime() === date2.getTime();
192
- });
193
- // assign the shared label on the data items and add them to the array
194
- dataItems.forEach(function (item) {
195
- activePoints.push(Object.assign({
196
- datasetLabel: sharedLabel,
197
- value: item.value,
198
- }, item));
199
- });
200
- });
201
- break;
197
+ if (scaleType === ScaleTypes.TIME) {
198
+ return displayData.filter(function (datum) {
199
+ return datum[domainIdentifier].getTime() === domainValue.getTime();
200
+ });
202
201
  }
203
- return activePoints;
202
+ return displayData.filter(function (datum) {
203
+ return datum[domainIdentifier] === domainValue;
204
+ });
204
205
  };
205
206
  CartesianScales.prototype.getScaleDomain = function (axisPosition) {
206
207
  var options = this.model.getOptions();
207
208
  var axisOptions = Tools.getProperty(options, "axes", axisPosition);
208
209
  var includeZero = axisOptions.includeZero;
209
- var _a = this.model.getDisplayData(), datasets = _a.datasets, labels = _a.labels;
210
+ var scaleType = Tools.getProperty(axisOptions, "scaleType") || ScaleTypes.LINEAR;
211
+ var displayData = this.model.getDisplayData();
212
+ var mapsTo = axisOptions.mapsTo;
213
+ // If domain is specified return that domain
214
+ if (axisOptions.domain) {
215
+ return axisOptions.domain;
216
+ }
210
217
  // If scale is a LABELS scale, return some labels as the domain
211
218
  if (axisOptions && axisOptions.scaleType === ScaleTypes.LABELS) {
212
- if (labels) {
213
- return labels;
214
- }
215
- else {
216
- return this.model.getDisplayData().datasets[0].data.map(function (d, i) { return i + 1; });
217
- }
219
+ // Get unique values
220
+ return map(displayData, function (d) { return d[mapsTo]; }).keys();
218
221
  }
219
222
  // Get the extent of the domain
220
223
  var domain;
221
- // If domain is specified return that domain
222
- if (axisOptions.domain) {
223
- return axisOptions.domain;
224
- }
224
+ var allDataValues;
225
225
  // If the scale is stacked
226
226
  if (axisOptions.stacked) {
227
- domain = extent(labels.reduce(function (m, label, i) {
228
- var correspondingValues = datasets.map(function (dataset) {
229
- return !isNaN(dataset.data[i]) ? dataset.data[i] : dataset.data[i].value;
230
- });
231
- var totalValue = correspondingValues.reduce(function (a, b) { return a + b; }, 0);
232
- // Save both the total value and the minimum
233
- return m.concat(totalValue, min(correspondingValues));
234
- }, [])
235
- // Currently stack layouts in the library
236
- // Only support positive values
237
- .concat(0));
227
+ var dataValuesGroupedByKeys = this.model.getDataValuesGroupedByKeys();
228
+ allDataValues = dataValuesGroupedByKeys.map(function (dataValues) {
229
+ return sum(values(dataValues));
230
+ });
238
231
  }
239
232
  else {
240
- // Get all the chart's data values in a flat array
241
- var allDataValues = datasets.reduce(function (dataValues, dataset) {
242
- dataset.data.forEach(function (datum) {
243
- if (axisOptions.scaleType === ScaleTypes.TIME) {
244
- dataValues = dataValues.concat(datum.date);
245
- }
246
- else {
247
- dataValues = dataValues.concat(isNaN(datum) ? datum.value : datum);
248
- }
249
- });
250
- return dataValues;
251
- }, []);
252
- if (axisOptions.scaleType !== ScaleTypes.TIME && includeZero) {
253
- allDataValues = allDataValues.concat(0);
254
- }
255
- domain = extent(allDataValues);
233
+ allDataValues = displayData.map(function (datum) { return datum[mapsTo]; });
256
234
  }
235
+ if (axisOptions.scaleType !== ScaleTypes.TIME && includeZero) {
236
+ allDataValues.push(0);
237
+ }
238
+ domain = extent(allDataValues);
257
239
  if (axisOptions.scaleType === ScaleTypes.TIME) {
258
240
  var spaceToAddToEdges = Tools.getProperty(options, "timeScale", "addSpaceOnEdges");
259
241
  if (spaceToAddToEdges) {
@@ -285,12 +267,12 @@ var CartesianScales = /** @class */ (function (_super) {
285
267
  }
286
268
  return [startDate, endDate];
287
269
  }
288
- return [
289
- new Date(domain[0]),
290
- new Date(domain[1])
291
- ];
292
270
  }
293
- return addPaddingInDomain(domain, Configuration.axis.paddingRatio);
271
+ domain = addPaddingInDomain(domain, Configuration.axis.paddingRatio);
272
+ if (scaleType === ScaleTypes.TIME) {
273
+ domain = domain.map(function (d) { return new Date(d); });
274
+ }
275
+ return domain;
294
276
  };
295
277
  CartesianScales.prototype.createScale = function (axisPosition) {
296
278
  var options = this.model.getOptions();
@@ -1 +1 @@
1
- {"version":3,"file":"scales-cartesian.js","sourceRoot":"","sources":["scales-cartesian.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport * as Configuration from \"../configuration\";\nimport { Service } from \"./service\";\nimport { AxisPositions, CartesianOrientations, ScaleTypes, AxesOptions } from \"../interfaces\";\nimport { Tools } from \"../tools\";\n\n// D3 Imports\nimport {\n\tscaleBand,\n\tscaleLinear,\n\tscaleTime,\n\tscaleLog\n} from \"d3-scale\";\nimport { min, extent } from \"d3-array\";\n\n// Misc\nimport {\n\tdifferenceInYears,\n\taddYears,\n\tsubYears,\n\tdifferenceInMonths,\n\taddMonths,\n\tsubMonths,\n\tdifferenceInDays,\n\taddDays,\n\tsubDays,\n\tdifferenceInHours,\n\taddHours,\n\tsubHours,\n\tdifferenceInMinutes,\n\taddMinutes,\n\tsubMinutes,\n\tdifferenceInSeconds,\n\tsubSeconds,\n\taddSeconds\n} from \"date-fns\";\n\nfunction addPaddingInDomain([lower, upper]: number[], paddingRatio: number) {\n\tconst domainLength = upper - lower;\n\tconst padding = domainLength * paddingRatio;\n\n\t// If padding crosses 0, keep 0 as new upper bound\n\tconst newUpper = upper <= 0 && upper + padding > 0 ? 0 : upper + padding;\n\t// If padding crosses 0, keep 0 as new lower bound\n\tconst newLower = lower >= 0 && lower - padding < 0 ? 0 : lower - padding;\n\n\treturn [newLower, newUpper];\n}\n\nexport class CartesianScales extends Service {\n\tprotected scaleTypes = {\n\t\ttop: null,\n\t\tright: null,\n\t\tbottom: null,\n\t\tleft: null\n\t};\n\n\tprotected scales = {\n\t\ttop: null,\n\t\tright: null,\n\t\tbottom: null,\n\t\tleft: null\n\t};\n\n\tprotected domainAxisPosition: AxisPositions;\n\tprotected rangeAxisPosition: AxisPositions;\n\n\tprotected orientation: CartesianOrientations;\n\n\tgetDomainAxisPosition() {\n\t\treturn this.domainAxisPosition;\n\t}\n\n\tgetRangeAxisPosition() {\n\t\treturn this.rangeAxisPosition;\n\t}\n\n\tsetDefaultAxes() {\n\t\tconst axesOptions = Tools.getProperty(this.model.getOptions(), \"axes\");\n\t\tif (!axesOptions) {\n\t\t\t(this.model.getOptions().axes as AxesOptions) = {\n\t\t\t\tleft: {\n\t\t\t\t\tprimary: true,\n\t\t\t\t\tincludeZero: true,\n\t\t\t\t},\n\t\t\t\tbottom: {\n\t\t\t\t\tsecondary: true,\n\t\t\t\t\tincludeZero: true,\n\t\t\t\t\tscaleType: this.model.getDisplayData().labels ? ScaleTypes.LABELS : undefined\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\n\tupdate(animate = true) {\n\t\tthis.setDefaultAxes();\n\t\tthis.determineOrientation();\n\t\tconst axisPositions = Object.keys(AxisPositions).map(axisPositionKey => AxisPositions[axisPositionKey]);\n\t\taxisPositions.forEach(axisPosition => {\n\t\t\tthis.scales[axisPosition] = this.createScale(axisPosition);\n\t\t});\n\t}\n\n\tdetermineOrientation() {\n\t\tconst options = this.model.getOptions();\n\n\t\t// Manually specifying positions here\n\t\t// In order to enforce a priority\n\t\t[\n\t\t\tAxisPositions.LEFT,\n\t\t\tAxisPositions.BOTTOM,\n\t\t\tAxisPositions.RIGHT,\n\t\t\tAxisPositions.TOP\n\t\t].forEach(axisPosition => {\n\t\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\n\t\t\tif (axisOptions) {\n\t\t\t\tconst scaleType = axisOptions.scaleType || ScaleTypes.LINEAR;\n\t\t\t\tthis.scaleTypes[axisPosition] = scaleType;\n\n\t\t\t\tif (scaleType === ScaleTypes.LINEAR) {\n\t\t\t\t\tthis.rangeAxisPosition = axisPosition;\n\t\t\t\t} else {\n\t\t\t\t\tthis.domainAxisPosition = axisPosition;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (this.rangeAxisPosition === AxisPositions.LEFT && this.domainAxisPosition === AxisPositions.BOTTOM) {\n\t\t\tthis.orientation = CartesianOrientations.VERTICAL;\n\t\t} else {\n\t\t\tthis.orientation = CartesianOrientations.HORIZONTAL;\n\t\t}\n\t}\n\n\tgetOrientation() {\n\t\treturn this.orientation;\n\t}\n\n\tgetScaleByPosition(axisPosition: AxisPositions) {\n\t\treturn this.scales[axisPosition];\n\t}\n\n\tgetScaleTypeByPosition(axisPosition: AxisPositions) {\n\t\treturn this.scaleTypes[axisPosition];\n\t}\n\n\tgetDomainScale() {\n\t\treturn this.scales[this.domainAxisPosition];\n\t}\n\n\tgetRangeScale() {\n\t\treturn this.scales[this.rangeAxisPosition];\n\t}\n\n\t// Find the main x-axis out of the 2 x-axis on the chart (when 2D axis is used)\n\tgetMainXAxisPosition() {\n\t\tconst possibleXAxisPositions = [AxisPositions.BOTTOM, AxisPositions.TOP];\n\n\t\treturn [this.domainAxisPosition, this.rangeAxisPosition]\n\t\t\t.find(position => possibleXAxisPositions.indexOf(position) > -1);\n\t}\n\n\t// Find the main y-axis out of the 2 y-axis on the chart (when 2D axis is used)\n\tgetMainYAxisPosition() {\n\t\tconst possibleYAxisPositions = [AxisPositions.LEFT, AxisPositions.RIGHT];\n\n\t\treturn [this.domainAxisPosition, this.rangeAxisPosition]\n\t\t\t.find(position => possibleYAxisPositions.indexOf(position) > -1);\n\t}\n\n\tgetMainXScale() {\n\t\treturn this.scales[this.getMainXAxisPosition()];\n\t}\n\n\tgetMainYScale() {\n\t\treturn this.scales[this.getMainYAxisPosition()];\n\t}\n\n\tgetValueFromScale(axisPosition: AxisPositions, datum: any, index?: number) {\n\t\tconst value = isNaN(datum) ? datum.value : datum;\n\t\tconst scaleType = this.scaleTypes[axisPosition];\n\t\tconst scale = this.scales[axisPosition];\n\t\tif (scaleType === ScaleTypes.LABELS) {\n\t\t\tconst correspondingLabel = this.model.getDisplayData().labels[index];\n\t\t\treturn scale(correspondingLabel) + scale.step() / 2;\n\t\t} else if (scaleType === ScaleTypes.TIME) {\n\t\t\treturn scale(new Date(datum.date || datum.label));\n\t\t}\n\n\t\treturn scale(value);\n\t}\n\n\tgetDomainValue(d, i) {\n\t\treturn this.getValueFromScale(this.domainAxisPosition, d, i);\n\t}\n\n\tgetRangeValue(d, i) {\n\t\treturn this.getValueFromScale(this.rangeAxisPosition, d, i);\n\t}\n\n\t/** Uses the primary Y Axis to get data items associated with that value. */\n\tgetDataFromDomain(domainValue) {\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst activePoints = [];\n\t\tconst scaleType = this.scaleTypes[this.domainAxisPosition];\n\n\t\tswitch (scaleType) {\n\t\t\tcase ScaleTypes.LABELS:\n\t\t\t\t// based on labels we use the index to get the associated data\n\t\t\t\tconst index = displayData.labels.indexOf(domainValue);\n\n\t\t\t\tdisplayData.datasets.forEach(dataset => {\n\t\t\t\t\tactivePoints.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\t\tvalue: dataset.data[index],\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase ScaleTypes.TIME:\n\t\t\t\t// time series we filter using the date\n\t\t\t\tconst domainKey = Object.keys(displayData.datasets[0].data[0]).filter(key => key !== \"value\")[0];\n\n\t\t\t\tdisplayData.datasets.forEach(dataset => {\n\t\t\t\t\tconst sharedLabel = dataset.label;\n\n\t\t\t\t\t// filter the items in each dataset for the points associated with the Domain\n\t\t\t\t\tconst dataItems = dataset.data.filter(item => {\n\t\t\t\t\t\tconst date1 = new Date(item[domainKey]);\n\t\t\t\t\t\tconst date2 = new Date(domainValue);\n\t\t\t\t\t\treturn date1.getTime() === date2.getTime();\n\t\t\t\t\t});\n\n\t\t\t\t\t// assign the shared label on the data items and add them to the array\n\t\t\t\t\tdataItems.forEach(item => {\n\t\t\t\t\t\tactivePoints.push(\n\t\t\t\t\t\t\tObject.assign({\n\t\t\t\t\t\t\t\tdatasetLabel: sharedLabel,\n\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t}, item)\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t\treturn activePoints;\n\t}\n\n\tprotected getScaleDomain(axisPosition: AxisPositions) {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\t\tconst { includeZero } = axisOptions;\n\t\tconst { datasets, labels } = this.model.getDisplayData();\n\n\t\t// If scale is a LABELS scale, return some labels as the domain\n\t\tif (axisOptions && axisOptions.scaleType === ScaleTypes.LABELS) {\n\t\t\tif (labels) {\n\t\t\t\treturn labels;\n\t\t\t} else {\n\t\t\t\treturn this.model.getDisplayData().datasets[0].data.map((d, i) => i + 1);\n\t\t\t}\n\t\t}\n\n\t\t// Get the extent of the domain\n\t\tlet domain;\n\n\t\t// If domain is specified return that domain\n\t\tif (axisOptions.domain) {\n\t\t\treturn axisOptions.domain;\n\t\t}\n\n\t\t// If the scale is stacked\n\t\tif (axisOptions.stacked) {\n\t\t\tdomain = extent(\n\t\t\t\tlabels.reduce((m, label: any, i) => {\n\t\t\t\t\tconst correspondingValues = datasets.map(dataset => {\n\t\t\t\t\t\treturn !isNaN(dataset.data[i]) ? dataset.data[i] : dataset.data[i].value;\n\t\t\t\t\t});\n\t\t\t\t\tconst totalValue = correspondingValues.reduce((a, b) => a + b, 0);\n\n\t\t\t\t\t// Save both the total value and the minimum\n\t\t\t\t\treturn m.concat(totalValue, min(correspondingValues));\n\t\t\t\t}, [])\n\t\t\t\t\t// Currently stack layouts in the library\n\t\t\t\t\t// Only support positive values\n\t\t\t\t\t.concat(0)\n\t\t\t);\n\t\t} else {\n\t\t\t// Get all the chart's data values in a flat array\n\t\t\tlet allDataValues = datasets.reduce((dataValues, dataset: any) => {\n\t\t\t\tdataset.data.forEach((datum: any) => {\n\t\t\t\t\tif (axisOptions.scaleType === ScaleTypes.TIME) {\n\t\t\t\t\t\tdataValues = dataValues.concat(datum.date);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdataValues = dataValues.concat(isNaN(datum) ? datum.value : datum);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn dataValues;\n\t\t\t}, []);\n\n\t\t\tif (axisOptions.scaleType !== ScaleTypes.TIME && includeZero) {\n\t\t\t\tallDataValues = allDataValues.concat(0);\n\t\t\t}\n\n\t\t\tdomain = extent(allDataValues);\n\t\t}\n\n\t\tif (axisOptions.scaleType === ScaleTypes.TIME) {\n\t\t\tconst spaceToAddToEdges = Tools.getProperty(options, \"timeScale\", \"addSpaceOnEdges\");\n\n\t\t\tif (spaceToAddToEdges) {\n\t\t\t\tconst startDate = new Date(domain[0]);\n\t\t\t\tconst endDate = new Date(domain[1]);\n\n\t\t\t\tif (differenceInYears(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subYears(startDate, spaceToAddToEdges), addYears(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMonths(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subMonths(startDate, spaceToAddToEdges), addMonths(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInDays(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subDays(startDate, spaceToAddToEdges), addDays(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInHours(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subHours(startDate, spaceToAddToEdges), addHours(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMinutes(endDate, startDate) > 30) {\n\t\t\t\t\treturn [subMinutes(startDate, spaceToAddToEdges * 30), addMinutes(endDate, spaceToAddToEdges * 30)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMinutes(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subMinutes(startDate, spaceToAddToEdges), addMinutes(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInSeconds(endDate, startDate) > 15) {\n\t\t\t\t\treturn [subSeconds(startDate, spaceToAddToEdges * 15), addSeconds(endDate, spaceToAddToEdges * 15)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInSeconds(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subSeconds(startDate, spaceToAddToEdges), addSeconds(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\treturn [startDate, endDate];\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\tnew Date(domain[0]),\n\t\t\t\tnew Date(domain[1])\n\t\t\t];\n\t\t}\n\n\t\treturn addPaddingInDomain(domain, Configuration.axis.paddingRatio);\n\t}\n\n\tprotected createScale(axisPosition: AxisPositions) {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\n\t\tif (!axisOptions) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst scaleType = Tools.getProperty(axisOptions, \"scaleType\") || ScaleTypes.LINEAR;\n\t\tthis.scaleTypes[axisPosition] = scaleType;\n\n\t\tlet scale;\n\t\tif (scaleType === ScaleTypes.TIME) {\n\t\t\tscale = scaleTime();\n\t\t} else if (scaleType === ScaleTypes.LOG) {\n\t\t\tscale = scaleLog().base(axisOptions.base || 10);\n\t\t} else if (scaleType === ScaleTypes.LABELS) {\n\t\t\tscale = scaleBand();\n\t\t} else {\n\t\t\tscale = scaleLinear();\n\t\t}\n\n\t\tscale.domain(this.getScaleDomain(axisPosition));\n\t\treturn scale;\n\t}\n}\n"]}
1
+ {"version":3,"file":"scales-cartesian.js","sourceRoot":"","sources":["scales-cartesian.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport * as Configuration from \"../configuration\";\nimport { Service } from \"./service\";\nimport { AxisPositions, CartesianOrientations, ScaleTypes, AxesOptions } from \"../interfaces\";\nimport { Tools } from \"../tools\";\n\n// D3 Imports\nimport {\n\tscaleBand,\n\tscaleLinear,\n\tscaleTime,\n\tscaleLog\n} from \"d3-scale\";\nimport { extent, sum } from \"d3-array\";\nimport { map, values } from \"d3-collection\";\n\n// Misc\nimport {\n\tdifferenceInYears,\n\taddYears,\n\tsubYears,\n\tdifferenceInMonths,\n\taddMonths,\n\tsubMonths,\n\tdifferenceInDays,\n\taddDays,\n\tsubDays,\n\tdifferenceInHours,\n\taddHours,\n\tsubHours,\n\tdifferenceInMinutes,\n\taddMinutes,\n\tsubMinutes,\n\tdifferenceInSeconds,\n\tsubSeconds,\n\taddSeconds\n} from \"date-fns\";\n\nfunction addPaddingInDomain([lower, upper]: number[], paddingRatio: number) {\n\tconst domainLength = upper - lower;\n\tconst padding = domainLength * paddingRatio;\n\n\t// If padding crosses 0, keep 0 as new upper bound\n\tconst newUpper = upper <= 0 && upper + padding > 0 ? 0 : upper + padding;\n\t// If padding crosses 0, keep 0 as new lower bound\n\tconst newLower = lower >= 0 && lower - padding < 0 ? 0 : lower - padding;\n\n\treturn [newLower, newUpper];\n}\n\nexport class CartesianScales extends Service {\n\tprotected scaleTypes = {\n\t\ttop: null,\n\t\tright: null,\n\t\tbottom: null,\n\t\tleft: null\n\t};\n\n\tprotected scales = {\n\t\ttop: null,\n\t\tright: null,\n\t\tbottom: null,\n\t\tleft: null\n\t};\n\n\tprotected domainAxisPosition: AxisPositions;\n\tprotected rangeAxisPosition: AxisPositions;\n\n\tprotected orientation: CartesianOrientations;\n\n\tgetDomainAxisPosition() {\n\t\treturn this.domainAxisPosition;\n\t}\n\n\tgetRangeAxisPosition() {\n\t\treturn this.rangeAxisPosition;\n\t}\n\n\tupdate(animate = true) {\n\t\tthis.findDomainAndRangeAxes();\n\t\tthis.determineOrientation();\n\t\tconst axisPositions = Object.keys(AxisPositions).map(axisPositionKey => AxisPositions[axisPositionKey]);\n\t\taxisPositions.forEach(axisPosition => {\n\t\t\tthis.scales[axisPosition] = this.createScale(axisPosition);\n\t\t});\n\t}\n\n\tprotected findMainVerticalAxisPosition() {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\");\n\n\t\t// If right axis has been specified as `main`\n\t\tif (Tools.getProperty(axisOptions, \"axes\", AxisPositions.RIGHT, \"main\") === true) {\n\t\t\treturn AxisPositions.RIGHT;\n\t\t}\n\n\t\treturn AxisPositions.LEFT;\n\t}\n\n\tprotected findMainHorizontalAxisPosition() {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\");\n\n\t\t// If top axis has been specified as `main`\n\t\tif (Tools.getProperty(axisOptions, \"axes\", AxisPositions.TOP, \"main\") === true) {\n\t\t\treturn AxisPositions.TOP;\n\t\t}\n\n\t\treturn AxisPositions.BOTTOM;\n\t}\n\n\tprotected findDomainAndRangeAxesPositions(mainVerticalAxisPosition: AxisPositions, mainHorizontalAxisPosition: AxisPositions) {\n\t\tconst options = this.model.getOptions();\n\n\t\tconst mainVerticalAxisOptions = Tools.getProperty(options, \"axes\", mainVerticalAxisPosition);\n\t\tconst mainHorizontalAxisOptions = Tools.getProperty(options, \"axes\", mainHorizontalAxisPosition);\n\n\t\tconst mainVerticalScaleType = mainVerticalAxisOptions.scaleType || ScaleTypes.LINEAR;\n\t\tconst mainHorizontalScaleType = mainHorizontalAxisOptions.scaleType || ScaleTypes.LINEAR;\n\n\t\tconst result = {\n\t\t\tdomainAxisPosition: null,\n\t\t\trangeAxisPosition: null\n\t\t};\n\t\tif (mainHorizontalScaleType === ScaleTypes.LABELS || mainHorizontalScaleType === ScaleTypes.TIME) {\n\t\t\tresult.domainAxisPosition = mainHorizontalAxisPosition;\n\t\t\tresult.rangeAxisPosition = mainVerticalAxisPosition;\n\t\t} else if (mainVerticalScaleType === ScaleTypes.LABELS || mainVerticalScaleType === ScaleTypes.TIME) {\n\t\t\tresult.domainAxisPosition = mainVerticalAxisPosition;\n\t\t\tresult.rangeAxisPosition = mainHorizontalAxisPosition;\n\t\t} else {\n\t\t\tresult.domainAxisPosition = mainHorizontalAxisPosition;\n\t\t\tresult.rangeAxisPosition = mainVerticalAxisPosition;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tfindDomainAndRangeAxes() {\n\t\t// find main axes between (left & right) && (bottom & top)\n\t\tconst mainVerticalAxisPosition = this.findMainVerticalAxisPosition();\n\t\tconst mainHorizontalAxisPosition = this.findMainHorizontalAxisPosition();\n\n\t\t// Now we have horizontal & vertical main axes to choose domain & range axes from\n\t\tconst domainAndRangeAxesPositions = this.findDomainAndRangeAxesPositions(mainVerticalAxisPosition, mainHorizontalAxisPosition);\n\n\t\tthis.domainAxisPosition = domainAndRangeAxesPositions.domainAxisPosition;\n\t\tthis.rangeAxisPosition = domainAndRangeAxesPositions.rangeAxisPosition;\n\t}\n\n\tdetermineOrientation() {\n\t\tif (this.rangeAxisPosition === AxisPositions.LEFT && this.domainAxisPosition === AxisPositions.BOTTOM) {\n\t\t\tthis.orientation = CartesianOrientations.VERTICAL;\n\t\t} else {\n\t\t\tthis.orientation = CartesianOrientations.HORIZONTAL;\n\t\t}\n\t}\n\n\tgetOrientation() {\n\t\treturn this.orientation;\n\t}\n\n\tgetScaleByPosition(axisPosition: AxisPositions) {\n\t\treturn this.scales[axisPosition];\n\t}\n\n\tgetScaleTypeByPosition(axisPosition: AxisPositions) {\n\t\treturn this.scaleTypes[axisPosition];\n\t}\n\n\tgetDomainScale() {\n\t\treturn this.scales[this.domainAxisPosition];\n\t}\n\n\tgetRangeScale() {\n\t\treturn this.scales[this.rangeAxisPosition];\n\t}\n\n\t// Find the main x-axis out of the 2 x-axis on the chart (when 2D axis is used)\n\tgetMainXAxisPosition() {\n\t\tconst possibleXAxisPositions = [AxisPositions.BOTTOM, AxisPositions.TOP];\n\n\t\treturn [this.domainAxisPosition, this.rangeAxisPosition]\n\t\t\t.find(position => possibleXAxisPositions.indexOf(position) > -1);\n\t}\n\n\t// Find the main y-axis out of the 2 y-axis on the chart (when 2D axis is used)\n\tgetMainYAxisPosition() {\n\t\tconst possibleYAxisPositions = [AxisPositions.LEFT, AxisPositions.RIGHT];\n\n\t\treturn [this.domainAxisPosition, this.rangeAxisPosition]\n\t\t\t.find(position => possibleYAxisPositions.indexOf(position) > -1);\n\t}\n\n\tgetMainXScale() {\n\t\treturn this.scales[this.getMainXAxisPosition()];\n\t}\n\n\tgetMainYScale() {\n\t\treturn this.scales[this.getMainYAxisPosition()];\n\t}\n\n\tgetValueFromScale(axisPosition: AxisPositions, datum: any, index?: number) {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\n\t\tconst scaleType = this.scaleTypes[axisPosition];\n\t\tconst scale = this.scales[axisPosition];\n\n\t\tconst { mapsTo } = axisOptions;\n\t\tconst value = datum[mapsTo] !== undefined ? datum[mapsTo] : datum;\n\n\t\tif (scaleType === ScaleTypes.LABELS) {\n\t\t\treturn scale(value) + scale.step() / 2;\n\t\t}\n\n\t\tif (scaleType === ScaleTypes.TIME) {\n\t\t\treturn scale(new Date(value));\n\t\t}\n\n\t\treturn scale(value);\n\t}\n\n\tgetDomainValue(d, i) {\n\t\treturn this.getValueFromScale(this.domainAxisPosition, d, i);\n\t}\n\n\tgetRangeValue(d, i) {\n\t\treturn this.getValueFromScale(this.rangeAxisPosition, d, i);\n\t}\n\n\tgetDomainIdentifier() {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", this.domainAxisPosition);\n\n\t\treturn axisOptions.mapsTo;\n\t}\n\n\tgetRangeIdentifier() {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", this.rangeAxisPosition);\n\n\t\treturn axisOptions.mapsTo;\n\t}\n\n\t/** Uses the primary Y Axis to get data items associated with that value. */\n\tgetDataFromDomain(domainValue) {\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst domainIdentifier = this.getDomainIdentifier();\n\t\tconst scaleType = this.scaleTypes[this.domainAxisPosition];\n\n\t\tif (scaleType === ScaleTypes.TIME) {\n\t\t\treturn displayData.filter(datum => {\n\t\t\t\treturn datum[domainIdentifier].getTime() === domainValue.getTime();\n\t\t\t});\n\t\t}\n\n\t\treturn displayData.filter(datum => {\n\t\t\treturn datum[domainIdentifier] === domainValue;\n\t\t});\n\t}\n\n\tprotected getScaleDomain(axisPosition: AxisPositions) {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\t\tconst { includeZero } = axisOptions;\n\t\tconst scaleType = Tools.getProperty(axisOptions, \"scaleType\") || ScaleTypes.LINEAR;\n\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst { mapsTo } = axisOptions;\n\n\t\t// If domain is specified return that domain\n\t\tif (axisOptions.domain) {\n\t\t\treturn axisOptions.domain;\n\t\t}\n\n\t\t// If scale is a LABELS scale, return some labels as the domain\n\t\tif (axisOptions && axisOptions.scaleType === ScaleTypes.LABELS) {\n\t\t\t// Get unique values\n\t\t\treturn map(displayData, d => d[mapsTo]).keys();\n\t\t}\n\n\n\t\t// Get the extent of the domain\n\t\tlet domain;\n\t\tlet allDataValues;\n\t\t// If the scale is stacked\n\t\tif (axisOptions.stacked) {\n\t\t\tconst dataValuesGroupedByKeys = this.model.getDataValuesGroupedByKeys();\n\t\t\tallDataValues = dataValuesGroupedByKeys.map(dataValues => {\n\t\t\t\treturn sum(\n\t\t\t\t\tvalues(dataValues) as any\n\t\t\t\t);\n\t\t\t});\n\t\t} else {\n\t\t\tallDataValues = displayData.map(datum => datum[mapsTo]);\n\t\t}\n\n\t\tif (axisOptions.scaleType !== ScaleTypes.TIME && includeZero) {\n\t\t\tallDataValues.push(0);\n\t\t}\n\n\t\tdomain = extent(allDataValues);\n\n\t\tif (axisOptions.scaleType === ScaleTypes.TIME) {\n\t\t\tconst spaceToAddToEdges = Tools.getProperty(options, \"timeScale\", \"addSpaceOnEdges\");\n\n\t\t\tif (spaceToAddToEdges) {\n\t\t\t\tconst startDate = new Date(domain[0]);\n\t\t\t\tconst endDate = new Date(domain[1]);\n\n\t\t\t\tif (differenceInYears(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subYears(startDate, spaceToAddToEdges), addYears(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMonths(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subMonths(startDate, spaceToAddToEdges), addMonths(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInDays(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subDays(startDate, spaceToAddToEdges), addDays(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInHours(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subHours(startDate, spaceToAddToEdges), addHours(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMinutes(endDate, startDate) > 30) {\n\t\t\t\t\treturn [subMinutes(startDate, spaceToAddToEdges * 30), addMinutes(endDate, spaceToAddToEdges * 30)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInMinutes(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subMinutes(startDate, spaceToAddToEdges), addMinutes(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInSeconds(endDate, startDate) > 15) {\n\t\t\t\t\treturn [subSeconds(startDate, spaceToAddToEdges * 15), addSeconds(endDate, spaceToAddToEdges * 15)];\n\t\t\t\t}\n\n\t\t\t\tif (differenceInSeconds(endDate, startDate) > 1) {\n\t\t\t\t\treturn [subSeconds(startDate, spaceToAddToEdges), addSeconds(endDate, spaceToAddToEdges)];\n\t\t\t\t}\n\n\t\t\t\treturn [startDate, endDate];\n\t\t\t}\n\t\t}\n\n\t\tdomain = addPaddingInDomain(domain, Configuration.axis.paddingRatio);\n\t\tif (scaleType === ScaleTypes.TIME) {\n\t\t\tdomain = domain.map(d => new Date(d));\n\t\t}\n\n\t\treturn domain;\n\t}\n\n\tprotected createScale(axisPosition: AxisPositions) {\n\t\tconst options = this.model.getOptions();\n\t\tconst axisOptions = Tools.getProperty(options, \"axes\", axisPosition);\n\n\t\tif (!axisOptions) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst scaleType = Tools.getProperty(axisOptions, \"scaleType\") || ScaleTypes.LINEAR;\n\t\tthis.scaleTypes[axisPosition] = scaleType;\n\n\t\tlet scale;\n\t\tif (scaleType === ScaleTypes.TIME) {\n\t\t\tscale = scaleTime();\n\t\t} else if (scaleType === ScaleTypes.LOG) {\n\t\t\tscale = scaleLog().base(axisOptions.base || 10);\n\t\t} else if (scaleType === ScaleTypes.LABELS) {\n\t\t\tscale = scaleBand();\n\t\t} else {\n\t\t\tscale = scaleLinear();\n\t\t}\n\n\t\tscale.domain(this.getScaleDomain(axisPosition));\n\t\treturn scale;\n\t}\n}\n"]}
package/tools.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CartesianOrientations, AxisChartOptions } from "./interfaces";
1
+ import { CartesianOrientations } from "./interfaces";
2
2
  export declare namespace Tools {
3
3
  export const debounce: any;
4
4
  export const clone: any;
@@ -15,7 +15,7 @@ export declare namespace Tools {
15
15
  * @param {AxisChartOptions} providedOptions user provided options
16
16
  * @returns merged options
17
17
  */
18
- export function mergeDefaultChartOptions(defaultOptions: AxisChartOptions, providedOptions: AxisChartOptions): any;
18
+ export function mergeDefaultChartOptions(defaultOptions: any, providedOptions: any): any;
19
19
  /**************************************
20
20
  * DOM-related operations *
21
21
  *************************************/
package/tools.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Internal imports
2
- import { CartesianOrientations } from "./interfaces";
2
+ import { CartesianOrientations, ScaleTypes } from "./interfaces";
3
3
  import { debounce as lodashDebounce, merge as lodashMerge, cloneDeep as lodashCloneDeep, uniq as lodashUnique, clamp as lodashClamp } from "lodash-es";
4
4
  // Functions
5
5
  export var Tools;
@@ -26,8 +26,29 @@ export var Tools;
26
26
  if (providedAxesNames.length === 0) {
27
27
  delete defaultOptions.axes;
28
28
  }
29
+ // Update deprecated options to work with the tabular data format
30
+ // Similar to the functionality in model.transformToTabularData()
29
31
  for (var axisName in defaultOptions.axes) {
30
- if (!providedAxesNames.includes(axisName)) {
32
+ if (providedAxesNames.includes(axisName)) {
33
+ var providedAxisOptions = providedOptions.axes[axisName];
34
+ if (providedAxisOptions["primary"] || providedAxisOptions["secondary"]) {
35
+ console.warn("`primary` & `secondary` are no longer needed for axis configurations. Read more here https://carbon-design-system.github.io/carbon-charts/?path=/story/tutorials--tabular-data-format");
36
+ }
37
+ var identifier = providedAxisOptions["mapsTo"];
38
+ if (identifier === undefined || identifier === null) {
39
+ var scaleType = providedAxisOptions["scaleType"];
40
+ if (scaleType === undefined || scaleType === null) {
41
+ providedAxisOptions["mapsTo"] = "value";
42
+ }
43
+ else if (scaleType === ScaleTypes.TIME) {
44
+ providedAxisOptions["mapsTo"] = "date";
45
+ }
46
+ else if (scaleType === ScaleTypes.LABELS) {
47
+ providedAxisOptions["mapsTo"] = "key";
48
+ }
49
+ }
50
+ }
51
+ else {
31
52
  delete defaultOptions.axes[axisName];
32
53
  }
33
54
  }
package/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["tools.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal imports\nimport { CartesianOrientations, AxisChartOptions } from \"./interfaces\";\n\nimport {\n\tdebounce as lodashDebounce,\n\tmerge as lodashMerge,\n\tcloneDeep as lodashCloneDeep,\n\tuniq as lodashUnique,\n\tclamp as lodashClamp,\n\t// the imports below are needed because of typescript bug (error TS4029)\n\tCancelable,\n\tDebounceSettings\n} from \"lodash-es\";\n\n// Functions\nexport namespace Tools {\n\t// Export these functions from lodash\n\texport const debounce = lodashDebounce;\n\texport const clone = lodashCloneDeep;\n\texport const merge = lodashMerge;\n\texport const removeArrayDuplicates = lodashUnique;\n\texport const clamp = lodashClamp;\n\n\n\t/**\n\t * Returns default chart options merged with provided options,\n\t * with special cases for axes.\n\t * Axes object will not merge the not provided axes.\n\t *\n\t * @export\n\t * @param {AxisChartOptions} defaultOptions Configuration.options[chartType]\n\t * @param {AxisChartOptions} providedOptions user provided options\n\t * @returns merged options\n\t */\n\texport function mergeDefaultChartOptions(defaultOptions: AxisChartOptions, providedOptions: AxisChartOptions) {\n\t\tdefaultOptions = Tools.clone(defaultOptions);\n\t\tconst providedAxesNames = Object.keys(providedOptions.axes || {});\n\n\t\tif (providedAxesNames.length === 0) {\n\t\t\tdelete defaultOptions.axes;\n\t\t}\n\n\t\tfor (const axisName in defaultOptions.axes) {\n\t\t\tif (!providedAxesNames.includes(axisName)) {\n\t\t\t\tdelete defaultOptions.axes[axisName];\n\t\t\t}\n\t\t}\n\n\t\treturn Tools.merge(\n\t\t\tdefaultOptions,\n\t\t\tprovidedOptions\n\t\t);\n\t}\n\n\t/**************************************\n\t * DOM-related operations *\n\t *************************************/\n\n\t/**\n\t * Get width & height of an element\n\t *\n\t * @export\n\t * @param {any} el element to get dimensions from\n\t * @returns an object containing the width and height of el\n\t */\n\texport function getDimensions(el) {\n\t\treturn {\n\t\t\twidth: parseFloat(el.style.width.replace(\"px\", \"\") || el.offsetWidth),\n\t\t\theight: parseFloat(el.style.height.replace(\"px\", \"\") || el.offsetHeight)\n\t\t};\n\t}\n\n\t/**\n\t * Returns an elements's x and y translations from attribute transform\n\t * @param {HTMLElement} element\n\t * @returns an object containing the x and y translations or null\n\t */\n\texport function getTranslationValues(elementRef: HTMLElement) {\n\t\t// regex to ONLY get values for translate (instead of all rotate, translate, skew, etc)\n\t\tconst translateRegex = /translate\\([0-9]+\\.?[0-9]*,[0-9]+\\.?[0-9]*\\)/;\n\n\t\tconst transformStr = elementRef.getAttribute(\"transform\").match(translateRegex);\n\t\t// check for the match\n\t\tif (transformStr[0]) {\n\t\t\tconst transforms = transformStr[0].replace(/translate\\(/, \"\").replace(/\\)/, \"\").split(\",\");\n\n\t\t\treturn {\n\t\t\t\ttx: transforms[0],\n\t\t\t\tty: transforms[1]\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**************************************\n\t * Formatting & calculations *\n\t *************************************/\n\n\t/**\n\t * Gets x and y coordinates from a HTML transform attribute\n\t *\n\t * @export\n\t * @param {any} string the transform attribute string ie. transform(x,y)\n\t * @returns Returns an object with x and y offsets of the transform\n\t */\n\texport function getTranformOffsets(string) {\n\t\tconst regExp = /\\(([^)]+)\\)/;\n\t\tconst match = regExp.exec(string)[1];\n\t\tconst xyString = match.split(\",\");\n\n\t\treturn {\n\t\t\tx: parseFloat(xyString[0]),\n\t\t\ty: parseFloat(xyString[1])\n\t\t};\n\t}\n\n\t/**\n\t * Capitalizes first letter of a string\n\t *\n\t * @export\n\t * @param {any} string the string whose first letter you'd like to capitalize\n\t * @returns The input string with its first letter capitalized\n\t */\n\texport function capitalizeFirstLetter(string) {\n\t\treturn string[0].toUpperCase() + string.slice(1);\n\t}\n\n\t/**\n\t * Get the percentage of a datapoint compared to the entire data-set.\n\t * Returns 1 significant digit if percentage is less than 1%.\n\t * @export\n\t * @param {any} item\n\t * @param {any} fullData\n\t * @returns The percentage in the form of a number\n\t */\n\texport function convertValueToPercentage(item, fullData) {\n\t\tconst percentage = item / fullData.reduce((accum, val) => accum + val.value, 0) * 100;\n\t\treturn percentage < 1 ? percentage.toPrecision(1) : Math.floor(percentage);\n\t}\n\n\t/**************************************\n\t * Object/array related checks *\n\t *************************************/\n\t/**\n\t * Get the difference between two arrays' items\n\t *\n\t * @export\n\t * @param {any[]} oldArray\n\t * @param {any[]} newArray\n\t * @returns The items missing in newArray from oldArray, and items added to newArray compared to oldArray\n\t */\n\texport function arrayDifferences(oldArray: any[], newArray: any[]) {\n\t\tconst difference = {\n\t\t\tmissing: [],\n\t\t\tadded: []\n\t\t};\n\n\t\toldArray.forEach(element => {\n\t\t\tif (newArray.indexOf(element) === -1) {\n\t\t\t\tdifference.missing.push(element);\n\t\t\t}\n\t\t});\n\n\t\tnewArray.forEach(element => {\n\t\t\tif (oldArray.indexOf(element) === -1) {\n\t\t\t\tdifference.added.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn difference;\n\t}\n\n\t/**\n\t * Lists out the duplicated keys in an array of data\n\t *\n\t * @export\n\t * @param {*} data - array of data\n\t * @returns A list of the duplicated keys in data\n\t */\n\texport function getDuplicateValues(arr: any) {\n\t\tconst values = [];\n\t\tconst duplicateValues = [];\n\n\t\tarr.forEach(value => {\n\t\t\tif (values.indexOf(value) !== -1 && duplicateValues.indexOf(value) === -1) {\n\t\t\t\tduplicateValues.push(value);\n\t\t\t}\n\n\t\t\tvalues.push(value);\n\t\t});\n\n\t\treturn duplicateValues;\n\t}\n\n\t// ================================================================================\n\t// D3 Extensions\n\t// ================================================================================\n\t/**\n\t * In D3, moves an element to the front of the canvas\n\t *\n\t * @export\n\t * @param {any} element\n\t * @returns The function to be used by D3 to push element to the top of the canvas\n\t */\n\texport function moveToFront(element) {\n\t\treturn element.each(function() {\n\t\t\tthis.parentNode.appendChild(this);\n\t\t});\n\t}\n\n\t// ================================================================================\n\t// Style Helpers\n\t// ================================================================================\n\n\texport const getProperty = (object, ...propPath) => {\n\t\tlet position = object;\n\t\tif (position) {\n\t\t\tfor (const prop of propPath) {\n\t\t\t\tif (position[prop] !== null && position[prop] !== undefined) {\n\t\t\t\t\tposition = position[prop];\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn position;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tinterface SVGPathCoordinates {\n\t\tx0: number;\n\t\tx1: number;\n\t\ty0: number;\n\t\ty1: number;\n\t}\n\n\texport const flipSVGCoordinatesBasedOnOrientation = (verticalCoordinates: SVGPathCoordinates, orientation?: CartesianOrientations) => {\n\t\tif (orientation === CartesianOrientations.HORIZONTAL) {\n\t\t\treturn {\n\t\t\t\ty0: verticalCoordinates.x0,\n\t\t\t\ty1: verticalCoordinates.x1,\n\t\t\t\tx0: verticalCoordinates.y0,\n\t\t\t\tx1: verticalCoordinates.y1\n\t\t\t};\n\t\t}\n\n\t\treturn verticalCoordinates;\n\t};\n\n\texport const generateSVGPathString = (verticalCoordinates: SVGPathCoordinates, orientation?: CartesianOrientations) => {\n\t\tconst { x0, x1, y0, y1 } = flipSVGCoordinatesBasedOnOrientation(verticalCoordinates, orientation);\n\n\t\treturn `M${x0},${y0}L${x0},${y1}L${x1},${y1}L${x1},${y0}L${x0},${y0}`;\n\t};\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["tools.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal imports\nimport {\n\tAxisChartOptions,\n\tCartesianOrientations,\n\tScaleTypes\n} from \"./interfaces\";\n\nimport {\n\tdebounce as lodashDebounce,\n\tmerge as lodashMerge,\n\tcloneDeep as lodashCloneDeep,\n\tuniq as lodashUnique,\n\tclamp as lodashClamp,\n\t// the imports below are needed because of typescript bug (error TS4029)\n\tCancelable,\n\tDebounceSettings\n} from \"lodash-es\";\n\n// Functions\nexport namespace Tools {\n\t// Export these functions from lodash\n\texport const debounce = lodashDebounce;\n\texport const clone = lodashCloneDeep;\n\texport const merge = lodashMerge;\n\texport const removeArrayDuplicates = lodashUnique;\n\texport const clamp = lodashClamp;\n\n\t/**\n\t * Returns default chart options merged with provided options,\n\t * with special cases for axes.\n\t * Axes object will not merge the not provided axes.\n\t *\n\t * @export\n\t * @param {AxisChartOptions} defaultOptions Configuration.options[chartType]\n\t * @param {AxisChartOptions} providedOptions user provided options\n\t * @returns merged options\n\t */\n\texport function mergeDefaultChartOptions(defaultOptions: any, providedOptions: any) {\n\t\tdefaultOptions = Tools.clone(defaultOptions);\n\t\tconst providedAxesNames = Object.keys(providedOptions.axes || {});\n\n\t\tif (providedAxesNames.length === 0) {\n\t\t\tdelete defaultOptions.axes;\n\t\t}\n\n\t\t// Update deprecated options to work with the tabular data format\n\t\t// Similar to the functionality in model.transformToTabularData()\n\t\tfor (const axisName in defaultOptions.axes) {\n\t\t\tif (providedAxesNames.includes(axisName)) {\n\t\t\t\tconst providedAxisOptions = providedOptions.axes[axisName];\n\n\t\t\t\tif (providedAxisOptions[\"primary\"] || providedAxisOptions[\"secondary\"]) {\n\t\t\t\t\tconsole.warn(\"`primary` & `secondary` are no longer needed for axis configurations. Read more here https://carbon-design-system.github.io/carbon-charts/?path=/story/tutorials--tabular-data-format\")\n\t\t\t\t}\n\n\t\t\t\tconst identifier = providedAxisOptions[\"mapsTo\"];\n\t\t\t\tif (identifier === undefined || identifier === null) {\n\t\t\t\t\tconst scaleType = providedAxisOptions[\"scaleType\"];\n\n\t\t\t\t\tif (scaleType === undefined || scaleType === null) {\n\t\t\t\t\t\tprovidedAxisOptions[\"mapsTo\"] = \"value\";\n\t\t\t\t\t} else if (scaleType === ScaleTypes.TIME) {\n\t\t\t\t\t\tprovidedAxisOptions[\"mapsTo\"] = \"date\";\n\t\t\t\t\t} else if (scaleType === ScaleTypes.LABELS) {\n\t\t\t\t\t\tprovidedAxisOptions[\"mapsTo\"] = \"key\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdelete defaultOptions.axes[axisName];\n\t\t\t}\n\t\t}\n\n\t\treturn Tools.merge(\n\t\t\tdefaultOptions,\n\t\t\tprovidedOptions\n\t\t);\n\t}\n\n\t/**************************************\n\t * DOM-related operations *\n\t *************************************/\n\n\t/**\n\t * Get width & height of an element\n\t *\n\t * @export\n\t * @param {any} el element to get dimensions from\n\t * @returns an object containing the width and height of el\n\t */\n\texport function getDimensions(el) {\n\t\treturn {\n\t\t\twidth: parseFloat(el.style.width.replace(\"px\", \"\") || el.offsetWidth),\n\t\t\theight: parseFloat(el.style.height.replace(\"px\", \"\") || el.offsetHeight)\n\t\t};\n\t}\n\n\t/**\n\t * Returns an elements's x and y translations from attribute transform\n\t * @param {HTMLElement} element\n\t * @returns an object containing the x and y translations or null\n\t */\n\texport function getTranslationValues(elementRef: HTMLElement) {\n\t\t// regex to ONLY get values for translate (instead of all rotate, translate, skew, etc)\n\t\tconst translateRegex = /translate\\([0-9]+\\.?[0-9]*,[0-9]+\\.?[0-9]*\\)/;\n\n\t\tconst transformStr = elementRef.getAttribute(\"transform\").match(translateRegex);\n\t\t// check for the match\n\t\tif (transformStr[0]) {\n\t\t\tconst transforms = transformStr[0].replace(/translate\\(/, \"\").replace(/\\)/, \"\").split(\",\");\n\n\t\t\treturn {\n\t\t\t\ttx: transforms[0],\n\t\t\t\tty: transforms[1]\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**************************************\n\t * Formatting & calculations *\n\t *************************************/\n\n\t/**\n\t * Gets x and y coordinates from a HTML transform attribute\n\t *\n\t * @export\n\t * @param {any} string the transform attribute string ie. transform(x,y)\n\t * @returns Returns an object with x and y offsets of the transform\n\t */\n\texport function getTranformOffsets(string) {\n\t\tconst regExp = /\\(([^)]+)\\)/;\n\t\tconst match = regExp.exec(string)[1];\n\t\tconst xyString = match.split(\",\");\n\n\t\treturn {\n\t\t\tx: parseFloat(xyString[0]),\n\t\t\ty: parseFloat(xyString[1])\n\t\t};\n\t}\n\n\t/**\n\t * Capitalizes first letter of a string\n\t *\n\t * @export\n\t * @param {any} string the string whose first letter you'd like to capitalize\n\t * @returns The input string with its first letter capitalized\n\t */\n\texport function capitalizeFirstLetter(string) {\n\t\treturn string[0].toUpperCase() + string.slice(1);\n\t}\n\n\t/**\n\t * Get the percentage of a datapoint compared to the entire data-set.\n\t * Returns 1 significant digit if percentage is less than 1%.\n\t * @export\n\t * @param {any} item\n\t * @param {any} fullData\n\t * @returns The percentage in the form of a number\n\t */\n\texport function convertValueToPercentage(item, fullData) {\n\t\tconst percentage = item / fullData.reduce((accum, val) => accum + val.value, 0) * 100;\n\t\treturn percentage < 1 ? percentage.toPrecision(1) : Math.floor(percentage);\n\t}\n\n\t/**************************************\n\t * Object/array related checks *\n\t *************************************/\n\t/**\n\t * Get the difference between two arrays' items\n\t *\n\t * @export\n\t * @param {any[]} oldArray\n\t * @param {any[]} newArray\n\t * @returns The items missing in newArray from oldArray, and items added to newArray compared to oldArray\n\t */\n\texport function arrayDifferences(oldArray: any[], newArray: any[]) {\n\t\tconst difference = {\n\t\t\tmissing: [],\n\t\t\tadded: []\n\t\t};\n\n\t\toldArray.forEach(element => {\n\t\t\tif (newArray.indexOf(element) === -1) {\n\t\t\t\tdifference.missing.push(element);\n\t\t\t}\n\t\t});\n\n\t\tnewArray.forEach(element => {\n\t\t\tif (oldArray.indexOf(element) === -1) {\n\t\t\t\tdifference.added.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn difference;\n\t}\n\n\t/**\n\t * Lists out the duplicated keys in an array of data\n\t *\n\t * @export\n\t * @param {*} data - array of data\n\t * @returns A list of the duplicated keys in data\n\t */\n\texport function getDuplicateValues(arr: any) {\n\t\tconst values = [];\n\t\tconst duplicateValues = [];\n\n\t\tarr.forEach(value => {\n\t\t\tif (values.indexOf(value) !== -1 && duplicateValues.indexOf(value) === -1) {\n\t\t\t\tduplicateValues.push(value);\n\t\t\t}\n\n\t\t\tvalues.push(value);\n\t\t});\n\n\t\treturn duplicateValues;\n\t}\n\n\t// ================================================================================\n\t// D3 Extensions\n\t// ================================================================================\n\t/**\n\t * In D3, moves an element to the front of the canvas\n\t *\n\t * @export\n\t * @param {any} element\n\t * @returns The function to be used by D3 to push element to the top of the canvas\n\t */\n\texport function moveToFront(element) {\n\t\treturn element.each(function() {\n\t\t\tthis.parentNode.appendChild(this);\n\t\t});\n\t}\n\n\t// ================================================================================\n\t// Style Helpers\n\t// ================================================================================\n\n\texport const getProperty = (object, ...propPath) => {\n\t\tlet position = object;\n\t\tif (position) {\n\t\t\tfor (const prop of propPath) {\n\t\t\t\tif (position[prop] !== null && position[prop] !== undefined) {\n\t\t\t\t\tposition = position[prop];\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn position;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tinterface SVGPathCoordinates {\n\t\tx0: number;\n\t\tx1: number;\n\t\ty0: number;\n\t\ty1: number;\n\t}\n\n\texport const flipSVGCoordinatesBasedOnOrientation = (verticalCoordinates: SVGPathCoordinates, orientation?: CartesianOrientations) => {\n\t\tif (orientation === CartesianOrientations.HORIZONTAL) {\n\t\t\treturn {\n\t\t\t\ty0: verticalCoordinates.x0,\n\t\t\t\ty1: verticalCoordinates.x1,\n\t\t\t\tx0: verticalCoordinates.y0,\n\t\t\t\tx1: verticalCoordinates.y1\n\t\t\t};\n\t\t}\n\n\t\treturn verticalCoordinates;\n\t};\n\n\texport const generateSVGPathString = (verticalCoordinates: SVGPathCoordinates, orientation?: CartesianOrientations) => {\n\t\tconst { x0, x1, y0, y1 } = flipSVGCoordinatesBasedOnOrientation(verticalCoordinates, orientation);\n\n\t\treturn `M${x0},${y0}L${x0},${y1}L${x1},${y1}L${x1},${y0}L${x0},${y0}`;\n\t};\n}\n"]}