@apia/charts 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/charts/ChartContext.js +6 -0
  2. package/dist/charts/ChartContext.js.map +1 -0
  3. package/dist/charts/ChartRenderer.d.ts +17 -0
  4. package/dist/charts/ChartRenderer.d.ts.map +1 -0
  5. package/dist/charts/ChartRenderer.js +175 -0
  6. package/dist/charts/ChartRenderer.js.map +1 -0
  7. package/dist/charts/horizontalBars/Bar.js +226 -0
  8. package/dist/charts/horizontalBars/Bar.js.map +1 -0
  9. package/dist/charts/horizontalBars/HorizontalBars.js +374 -0
  10. package/dist/charts/horizontalBars/HorizontalBars.js.map +1 -0
  11. package/dist/charts/linear/LineChart.js +528 -0
  12. package/dist/charts/linear/LineChart.js.map +1 -0
  13. package/dist/charts/linear/Node.js +56 -0
  14. package/dist/charts/linear/Node.js.map +1 -0
  15. package/dist/charts/pie/Pie.js +184 -0
  16. package/dist/charts/pie/Pie.js.map +1 -0
  17. package/dist/charts/pie/Slice.js +96 -0
  18. package/dist/charts/pie/Slice.js.map +1 -0
  19. package/dist/charts/pie/usePieAnimation.js +123 -0
  20. package/dist/charts/pie/usePieAnimation.js.map +1 -0
  21. package/dist/charts/types.d.ts +188 -0
  22. package/dist/charts/types.d.ts.map +1 -0
  23. package/dist/charts/util/ChartSelector.js +36 -0
  24. package/dist/charts/util/ChartSelector.js.map +1 -0
  25. package/dist/charts/util/ColoredLegendItem.js +46 -0
  26. package/dist/charts/util/ColoredLegendItem.js.map +1 -0
  27. package/dist/charts/util/EmptyGrid.d.ts +8 -0
  28. package/dist/charts/util/EmptyGrid.d.ts.map +1 -0
  29. package/dist/charts/util/EmptyGrid.js +51 -0
  30. package/dist/charts/util/EmptyGrid.js.map +1 -0
  31. package/dist/charts/util/LegendContainer.js +53 -0
  32. package/dist/charts/util/LegendContainer.js.map +1 -0
  33. package/dist/charts/util/NumberedLegendItem.js +45 -0
  34. package/dist/charts/util/NumberedLegendItem.js.map +1 -0
  35. package/dist/charts/util/getBarColor.js +29 -0
  36. package/dist/charts/util/getBarColor.js.map +1 -0
  37. package/dist/charts/util/parseMargin.js +11 -0
  38. package/dist/charts/util/parseMargin.js.map +1 -0
  39. package/dist/charts/util/useChartStyles.js +35 -0
  40. package/dist/charts/util/useChartStyles.js.map +1 -0
  41. package/dist/charts/verticalBars/Bar.js +239 -0
  42. package/dist/charts/verticalBars/Bar.js.map +1 -0
  43. package/dist/charts/verticalBars/VerticalBars.js +394 -0
  44. package/dist/charts/verticalBars/VerticalBars.js.map +1 -0
  45. package/dist/charts/waterfallBars/WaterfallBar.js +84 -0
  46. package/dist/charts/waterfallBars/WaterfallBar.js.map +1 -0
  47. package/dist/charts/waterfallBars/WaterfallBars.js +289 -0
  48. package/dist/charts/waterfallBars/WaterfallBars.js.map +1 -0
  49. package/dist/index.d.ts +6 -250
  50. package/dist/index.js +4 -4263
  51. package/dist/index.js.map +1 -1
  52. package/dist/widgets/WidgetContainer.d.ts +10 -0
  53. package/dist/widgets/WidgetContainer.d.ts.map +1 -0
  54. package/dist/widgets/WidgetContainer.js +68 -0
  55. package/dist/widgets/WidgetContainer.js.map +1 -0
  56. package/dist/widgets/counter/Counter.js +108 -0
  57. package/dist/widgets/counter/Counter.js.map +1 -0
  58. package/dist/widgets/custom/useCustomWidget.js +64 -0
  59. package/dist/widgets/custom/useCustomWidget.js.map +1 -0
  60. package/dist/widgets/custom/util.js +9 -0
  61. package/dist/widgets/custom/util.js.map +1 -0
  62. package/dist/widgets/oxford/Oxford.js +241 -0
  63. package/dist/widgets/oxford/Oxford.js.map +1 -0
  64. package/dist/widgets/ring/Ring.js +123 -0
  65. package/dist/widgets/ring/Ring.js.map +1 -0
  66. package/dist/widgets/scale/Scale.js +145 -0
  67. package/dist/widgets/scale/Scale.js.map +1 -0
  68. package/dist/widgets/speedMeter/SpeedMeter.js +187 -0
  69. package/dist/widgets/speedMeter/SpeedMeter.js.map +1 -0
  70. package/dist/widgets/tLight/TLight.js +134 -0
  71. package/dist/widgets/tLight/TLight.js.map +1 -0
  72. package/dist/widgets/thermometer/Thermometer.js +144 -0
  73. package/dist/widgets/thermometer/Thermometer.js.map +1 -0
  74. package/dist/widgets/thermometer/util.js +31 -0
  75. package/dist/widgets/thermometer/util.js.map +1 -0
  76. package/dist/widgets/types.d.ts +41 -0
  77. package/dist/widgets/types.d.ts.map +1 -0
  78. package/package.json +30 -43
  79. package/LICENSE.md +0 -21
  80. package/README.md +0 -1
  81. package/cleanDist.json +0 -3
@@ -0,0 +1,528 @@
1
+ import { jsxs, jsx, Fragment } from '@apia/theme/jsx-runtime';
2
+ import { arrayOrArray, useImperativeComponentEvents, usePanAndZoom, usePrevious, getLabel } from '@apia/util';
3
+ import { scaleOrdinal, scaleLinear, scaleLog } from '@visx/scale';
4
+ import { min, max } from 'd3-array';
5
+ import { parseMargin } from '../util/parseMargin.js';
6
+ import { useMemo, useState, useLayoutEffect } from 'react';
7
+ import { useChartStyles } from '../util/useChartStyles.js';
8
+ import { Box, Heading } from '@apia/theme';
9
+ import { Grid } from '@visx/visx';
10
+ import { Group } from '@visx/group';
11
+ import { LinePath } from '@visx/shape';
12
+ import { AxisLeft, AxisBottom } from '@visx/axis';
13
+ import * as allCurves from '@visx/curve';
14
+ import uniqueId from 'lodash-es/uniqueId';
15
+ import { Node } from './Node.js';
16
+ import { getBarColor } from '../util/getBarColor.js';
17
+ import { LegendContainer } from '../util/LegendContainer.js';
18
+ import { ApiaUtil } from '@apia/components';
19
+
20
+ function adjustDimensions({
21
+ width,
22
+ height,
23
+ maxWidth
24
+ }) {
25
+ if (width <= maxWidth) {
26
+ return { width, height };
27
+ }
28
+ const ratio = width / height;
29
+ const newWidth = maxWidth;
30
+ const newHeight = Math.floor(newWidth / ratio);
31
+ return { width: newWidth, height: newHeight };
32
+ }
33
+ function getX(coordinate) {
34
+ return coordinate.key;
35
+ }
36
+ function getY(coordinate) {
37
+ return Number(coordinate.value);
38
+ }
39
+ function parseData(chart) {
40
+ const setsArray = arrayOrArray(chart.dataSets?.data).map(
41
+ (col) => arrayOrArray(col.sets)
42
+ );
43
+ let longestLine = [];
44
+ let longestLineIndex = -1;
45
+ for (let i = 0; i < setsArray.length; i++) {
46
+ const array = setsArray[i];
47
+ if (!longestLine || array.length > longestLine.length) {
48
+ longestLine = array;
49
+ longestLineIndex = i;
50
+ }
51
+ }
52
+ const lines = arrayOrArray(chart.dataSets?.data);
53
+ const nodesDataArray = lines.map((line) => line.sets);
54
+ const nodesData = nodesDataArray.reduce(
55
+ (rec, d) => arrayOrArray(rec).concat(d),
56
+ []
57
+ );
58
+ return {
59
+ lines,
60
+ longestLine,
61
+ longestLineIndex,
62
+ tallestLine: [...new Set(nodesData.map((value) => value.value))],
63
+ xScale: scaleOrdinal({
64
+ domain: longestLine.map(getX)
65
+ }),
66
+ yScale: scaleLinear({
67
+ domain: [
68
+ (min(nodesData, getY) ?? 0) < 0 ? min(nodesData, getY) ?? 0 : 0,
69
+ max(nodesData, getY) ?? 1
70
+ ]
71
+ }),
72
+ yScaleLog: scaleLog({
73
+ domain: [
74
+ (min(nodesData, getY) ?? 1) > 0 ? min(nodesData, getY) ?? 1 : 1,
75
+ max(nodesData, getY) ?? 10
76
+ ]
77
+ })
78
+ };
79
+ }
80
+ const LineChart = ({
81
+ chart,
82
+ margin = { top: 20, left: 100, bottom: 24, right: 0 },
83
+ chartId,
84
+ allowZoom
85
+ }) => {
86
+ const effectiveMargin = parseMargin(margin);
87
+ if (!chart.showAxisYTitle && effectiveMargin.left > 50) {
88
+ effectiveMargin.left = 50;
89
+ }
90
+ let innerWidth = chart.ratio.width - (effectiveMargin.left + effectiveMargin.right) / 2;
91
+ let innerHeight = chart.ratio.height - (effectiveMargin.top + effectiveMargin.bottom) / 2;
92
+ if (innerWidth > chart.ratio.maxWidth) {
93
+ const newValues = adjustDimensions({
94
+ height: innerHeight,
95
+ width: innerWidth,
96
+ maxWidth: chart.ratio.maxWidth
97
+ });
98
+ innerWidth = newValues.width;
99
+ innerHeight = newValues.height;
100
+ }
101
+ const { lines, xScale, yScale, yScaleLog, longestLine } = parseData(chart);
102
+ const styles = useChartStyles(chart.colorSchema);
103
+ const coordinates = arrayOrArray(lines[0].sets);
104
+ const coordinatesArray = lines.map((col) => {
105
+ return col.sets;
106
+ });
107
+ const divideRangeBetweenStrings = (min2, max2, strings) => {
108
+ const numStrings = strings.length;
109
+ const step = (max2 - min2) / (numStrings - 1);
110
+ const resultArray = [];
111
+ let currentValue = min2;
112
+ for (let i = 0; i < numStrings; i++) {
113
+ resultArray.push(currentValue);
114
+ currentValue += step;
115
+ }
116
+ return resultArray;
117
+ };
118
+ const xScaleRange = useMemo(() => {
119
+ const rangeArr = [
120
+ typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.left,
121
+ innerWidth
122
+ ];
123
+ return divideRangeBetweenStrings(rangeArr[0], rangeArr[1], longestLine);
124
+ }, [effectiveMargin, innerWidth, longestLine]);
125
+ xScale.range(xScaleRange);
126
+ const yScaleRange = useMemo(() => {
127
+ const rangeArr = [
128
+ innerHeight - (effectiveMargin.top + effectiveMargin.bottom),
129
+ typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
130
+ ];
131
+ return rangeArr;
132
+ }, [effectiveMargin, innerHeight]);
133
+ yScale.range(yScaleRange);
134
+ yScaleLog.range([
135
+ innerHeight,
136
+ typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
137
+ ]);
138
+ const [currentCircle, setCurrentCircle] = useState([]);
139
+ const actualYScale = useMemo(() => {
140
+ return yScale;
141
+ }, [yScale]);
142
+ const id = useMemo(() => `Linear${uniqueId()}`, []);
143
+ useLayoutEffect(() => {
144
+ document.querySelectorAll(`#${id} .tickLabel`).forEach((current) => {
145
+ const width = current.getBoundingClientRect().width;
146
+ current.style.transformOrigin = current.getAttribute("x") + "px 14px";
147
+ current.style.transform = `rotate(25deg) translateX(${width / 2}px)`;
148
+ });
149
+ });
150
+ function addNameToProps(names, objects, fixedValue) {
151
+ return objects.map((object, index) => {
152
+ const nameIndex = Math.floor(index / fixedValue);
153
+ const name = names[nameIndex];
154
+ return { ...object, columnName: name };
155
+ });
156
+ }
157
+ const setsWithColor = arrayOrArray(chart.dataSets.data).map((data, index) => {
158
+ const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
159
+ const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(
160
+ styles ? styles.schema : [
161
+ "#7ad6f4",
162
+ "#45bdee",
163
+ "#28a7ea",
164
+ "#006cbb",
165
+ "#034698",
166
+ "#032f64"
167
+ ]
168
+ ).length > 0 ? getBarColor(
169
+ arrayOrArray(
170
+ styles ? styles.schema : [
171
+ "#7ad6f4",
172
+ "#45bdee",
173
+ "#28a7ea",
174
+ "#006cbb",
175
+ "#034698",
176
+ "#032f64"
177
+ ]
178
+ ),
179
+ index,
180
+ isSingle
181
+ ) : "";
182
+ const returnColumnsArray = [];
183
+ arrayOrArray(data.sets).forEach((set) => {
184
+ if (set.color !== "" && set.color !== void 0) {
185
+ returnColumnsArray.push({ ...set, columnName: data.name });
186
+ } else {
187
+ returnColumnsArray.push({
188
+ ...set,
189
+ color: dataColor,
190
+ columnName: data.name
191
+ });
192
+ }
193
+ });
194
+ return { returnColumnsArray, columnColor: dataColor };
195
+ });
196
+ const colorReference = arrayOrArray(chart.dataSets.data).map(
197
+ (data, index) => {
198
+ const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
199
+ const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(
200
+ styles ? styles.schema : [
201
+ "#7ad6f4",
202
+ "#45bdee",
203
+ "#28a7ea",
204
+ "#006cbb",
205
+ "#034698",
206
+ "#032f64"
207
+ ]
208
+ ).length > 0 ? getBarColor(
209
+ arrayOrArray(
210
+ styles ? styles.schema : [
211
+ "#7ad6f4",
212
+ "#45bdee",
213
+ "#28a7ea",
214
+ "#006cbb",
215
+ "#034698",
216
+ "#032f64"
217
+ ]
218
+ ),
219
+ index,
220
+ isSingle
221
+ ) : "";
222
+ return {
223
+ color: dataColor,
224
+ title: data.name
225
+ };
226
+ }
227
+ );
228
+ arrayOrArray(chart.dataSets.data).map((data) => {
229
+ const returnArray = [];
230
+ arrayOrArray(data.sets).forEach((set) => {
231
+ if (set.color !== "" && set.color !== void 0) {
232
+ returnArray.push({
233
+ color: set.color,
234
+ title: data.name + " - " + set.key
235
+ });
236
+ }
237
+ });
238
+ return returnArray;
239
+ }).flat().forEach((addRef) => colorReference.push(addRef));
240
+ const [highlightedBar, setHighlightedBar] = useState("");
241
+ useImperativeComponentEvents({
242
+ highlight(barName) {
243
+ if (barName.split(" - ").length === 1) {
244
+ setHighlightedBar(barName);
245
+ if (chart.showAxisXTitle || chart.showLegend || chart.showValues) {
246
+ console.log({ barName, lines });
247
+ const selectedLineGroup = lines.find((l) => l.name === barName);
248
+ const selectedLineGroupIndex = lines.findIndex(
249
+ (l) => l.name === barName
250
+ );
251
+ console.log({ selectedLineGroup, selectedLineGroupIndex });
252
+ if (selectedLineGroup && selectedLineGroupIndex !== -1) {
253
+ ApiaUtil.instance.tooltips.open({
254
+ children: arrayOrArray(selectedLineGroup.sets).map((dat, i) => {
255
+ return /* @__PURE__ */ jsxs("div", { children: [
256
+ /* @__PURE__ */ jsx(
257
+ "div",
258
+ {
259
+ style: {
260
+ color: colorReference[selectedLineGroupIndex].color
261
+ },
262
+ children: /* @__PURE__ */ jsx("strong", { children: chart.showAxisXTitle ? dat.key : chart.showLegend ? barName : "" })
263
+ }
264
+ ),
265
+ chart.showValues && /* @__PURE__ */ jsx("div", { children: dat.value }),
266
+ /* @__PURE__ */ jsx("div", {}),
267
+ arrayOrArray(selectedLineGroup.sets)[i + 1] && /* @__PURE__ */ jsx("hr", {})
268
+ ] }, `${dat.key}`);
269
+ }),
270
+ attachToMousePosition: true
271
+ });
272
+ }
273
+ }
274
+ } else if (barName.split(" - ").length === 2) {
275
+ setHighlightedBar(barName.split(" - ")[0]);
276
+ }
277
+ }
278
+ });
279
+ const { boxRef, elementRef } = usePanAndZoom(
280
+ void 0,
281
+ !allowZoom
282
+ );
283
+ const coords = coordinatesArray.flat().map((coord) => {
284
+ return {
285
+ xValue: coord.key,
286
+ yValue: coord.value,
287
+ x: xScale(getX(coord)),
288
+ y: actualYScale(getY(coord))
289
+ };
290
+ });
291
+ const columnNames = lines.map((column) => {
292
+ return column.name;
293
+ });
294
+ const nodes = addNameToProps(columnNames, coords, coordinates.length);
295
+ const [nearNodesArray, setNearNodesArray] = useState([]);
296
+ const previousNearNodesArray = usePrevious(nearNodesArray);
297
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
298
+ /* @__PURE__ */ jsx(Box, { id, ref: boxRef, className: "chartBox chartContainer", children: /* @__PURE__ */ jsxs(
299
+ "svg",
300
+ {
301
+ ref: elementRef,
302
+ width: innerWidth,
303
+ height: innerHeight,
304
+ id: "LinesChart",
305
+ className: `_${chartId} chart__svg`,
306
+ onMouseMove: (ev) => {
307
+ const rect = elementRef.current?.getBoundingClientRect();
308
+ let clientX = ev.clientX - (effectiveMargin.left + effectiveMargin.right) / 2;
309
+ let clientY = ev.clientY - (effectiveMargin.top + effectiveMargin.bottom) / 2;
310
+ if (rect) {
311
+ clientX = ev.clientX - rect.left;
312
+ clientY = ev.clientY - rect.top;
313
+ }
314
+ const nearNodes = nodes.filter((node) => {
315
+ return Math.sqrt((node.x - clientX) ** 2 + (node.y - clientY) ** 2) < 20;
316
+ });
317
+ if (previousNearNodesArray.current && nearNodes.length > 0) {
318
+ const currentColumns = lines.map((col) => {
319
+ let colNames = "";
320
+ nearNodes.forEach((node) => {
321
+ if (col.name === node.columnName) {
322
+ colNames = node.columnName;
323
+ }
324
+ });
325
+ return colNames;
326
+ }).filter((name) => name !== "");
327
+ const currentIndex = coordinates.findIndex((coord) => {
328
+ return coord.key === nearNodes[0].xValue;
329
+ });
330
+ if (currentColumns && currentIndex !== void 0) {
331
+ const newCircleValues = currentColumns.map((col) => {
332
+ return `${col}${currentIndex}`;
333
+ });
334
+ setCurrentCircle([...newCircleValues]);
335
+ }
336
+ setNearNodesArray(nearNodes);
337
+ const elementUnderCursor = document.elementFromPoint(
338
+ ev.clientX,
339
+ ev.clientY
340
+ );
341
+ if (elementUnderCursor && elementUnderCursor.tagName === "circle") {
342
+ if (chart.showAxisXTitle || chart.showLegend || chart.showValues) {
343
+ ApiaUtil.instance.tooltips.open({
344
+ children: nearNodes.sort((a, b) => Number(b.yValue) - Number(a.yValue)).map((node, i) => {
345
+ const useSpecific = colorReference.some(
346
+ (ref) => ref.title === node.columnName + " - " + node.xValue
347
+ );
348
+ return /* @__PURE__ */ jsxs(
349
+ Box,
350
+ {
351
+ children: [
352
+ /* @__PURE__ */ jsx(
353
+ "div",
354
+ {
355
+ style: {
356
+ color: colorReference[colorReference.findIndex((ref) => {
357
+ return ref.title === (useSpecific ? node.columnName + " - " + node.xValue : node.columnName);
358
+ })].color
359
+ },
360
+ children: /* @__PURE__ */ jsx("strong", { children: chart.showAxisXTitle ? node.xValue : chart.showLegend ? node.columnName : "" })
361
+ }
362
+ ),
363
+ chart.showValues && /* @__PURE__ */ jsx("div", { children: node.yValue }),
364
+ /* @__PURE__ */ jsx("div", { children: chart.showAxisXTitle && chart.showLegend ? node.columnName : "" }),
365
+ nearNodesArray[i + 1] && /* @__PURE__ */ jsx("hr", {})
366
+ ]
367
+ },
368
+ `${node.columnName}_${node.xValue}_${node.yValue}`
369
+ );
370
+ }),
371
+ attachToMousePosition: true
372
+ });
373
+ }
374
+ } else {
375
+ ApiaUtil.instance.tooltips.closeAll();
376
+ }
377
+ } else if (nearNodes.length === 0) {
378
+ setCurrentCircle([]);
379
+ }
380
+ },
381
+ children: [
382
+ chart.showGrid && /* @__PURE__ */ jsx(
383
+ Grid.Grid,
384
+ {
385
+ top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
386
+ left: 0,
387
+ xScale,
388
+ yScale: actualYScale,
389
+ width: innerWidth,
390
+ height: innerHeight,
391
+ stroke: styles?.grid.stroke,
392
+ strokeOpacity: styles?.grid.opacity
393
+ }
394
+ ),
395
+ lines.map((column, i) => {
396
+ const currentCoordinates = arrayOrArray(column.sets);
397
+ const newColor = setsWithColor.find(
398
+ (data) => data.returnColumnsArray[0].columnName === column.name
399
+ )?.columnColor;
400
+ return /* @__PURE__ */ jsxs(
401
+ Group,
402
+ {
403
+ top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
404
+ style: {
405
+ opacity: highlightedBar !== "" && highlightedBar !== column.name ? 0.15 : 1,
406
+ transition: "opacity 500ms"
407
+ },
408
+ children: [
409
+ /* @__PURE__ */ jsx(
410
+ LinePath,
411
+ {
412
+ curve: allCurves.curveMonotoneX,
413
+ data: currentCoordinates,
414
+ x: (coordinate) => {
415
+ return xScale(getX(coordinate)) ?? 0;
416
+ },
417
+ y: (coordinate) => actualYScale(getY(coordinate)) ?? 0,
418
+ stroke: newColor ?? "black",
419
+ strokeWidth: 2,
420
+ strokeOpacity: 1,
421
+ shapeRendering: "geometricPrecision",
422
+ color: "transparent"
423
+ }
424
+ ),
425
+ currentCoordinates.map((coordinate, j) => {
426
+ const key = column.name + j.toString();
427
+ const realColor = setsWithColor.map((sets) => sets.returnColumnsArray).flat().find(
428
+ (set) => set.columnName === column.name && set.key === coordinate.key
429
+ )?.color;
430
+ return /* @__PURE__ */ jsxs("g", { children: [
431
+ chart.showValues && /* @__PURE__ */ jsx(
432
+ "text",
433
+ {
434
+ x: xScale(getX(coordinate)) + 10,
435
+ y: actualYScale(getY(coordinate)) - 5,
436
+ textAnchor: "middle",
437
+ style: {
438
+ display: highlightedBar === column.name ? "block" : "none",
439
+ opacity: highlightedBar === column.name ? 1 : 0,
440
+ transition: "opacity 500ms"
441
+ },
442
+ children: coordinate.value
443
+ }
444
+ ),
445
+ /* @__PURE__ */ jsx(
446
+ Node,
447
+ {
448
+ color: realColor ?? "black",
449
+ coordinate,
450
+ currentCircle,
451
+ cx: xScale(getX(coordinate)),
452
+ cy: actualYScale(getY(coordinate)),
453
+ setCurrentCircle,
454
+ innerKey: key,
455
+ column
456
+ }
457
+ )
458
+ ] }, key);
459
+ })
460
+ ]
461
+ },
462
+ `lines-${column.name + i.toString()}`
463
+ );
464
+ }),
465
+ /* @__PURE__ */ jsx(
466
+ AxisLeft,
467
+ {
468
+ scale: actualYScale,
469
+ left: effectiveMargin.left,
470
+ label: chart.chartType !== "pie2D" && chart.showAxisYTitle ? chart.axisYTitle : "",
471
+ tickLabelProps: {
472
+ display: chart.showAxisYTitle ? "auto" : "none"
473
+ },
474
+ tickComponent: (props) => {
475
+ let value = Number(props.formattedValue?.replace(",", ""));
476
+ let counter = -1;
477
+ const units = ["k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q"];
478
+ while (value >= 1e3) {
479
+ value = value / 1e3;
480
+ counter++;
481
+ }
482
+ let stringValue = `${value}`;
483
+ if (stringValue.length > 3) {
484
+ stringValue = stringValue.slice(0, 3);
485
+ }
486
+ if (stringValue.endsWith(".")) {
487
+ stringValue = stringValue.replace(".", "");
488
+ }
489
+ const newValue = `${stringValue}${counter >= 0 ? units[counter] : ""}`;
490
+ return /* @__PURE__ */ jsx(Fragment, { children: chart.showAxisYTitle && /* @__PURE__ */ jsx(
491
+ "text",
492
+ {
493
+ dx: props.dx,
494
+ dy: props.dy,
495
+ fill: props.fill,
496
+ fontSize: props.fontSize,
497
+ textAnchor: props.textAnchor,
498
+ x: props.x,
499
+ y: props.y,
500
+ children: newValue
501
+ }
502
+ ) });
503
+ }
504
+ }
505
+ ),
506
+ /* @__PURE__ */ jsx(
507
+ AxisBottom,
508
+ {
509
+ top: innerHeight - (effectiveMargin.top + effectiveMargin.bottom),
510
+ scale: xScale,
511
+ label: chart.chartType !== "pie2D" && chart.showAxisXTitle ? chart.axisXTitle : "",
512
+ tickLabelProps: { display: "none" },
513
+ tickLineProps: { display: "none" },
514
+ labelOffset: 10
515
+ }
516
+ )
517
+ ]
518
+ }
519
+ ) }),
520
+ /* @__PURE__ */ jsx(Box, { className: "chartLegend__Wrapper", children: chart.showLegend && colorReference.length !== 0 && /* @__PURE__ */ jsxs(Box, { className: "chart__legend__wrapper", children: [
521
+ /* @__PURE__ */ jsx(Heading, { as: "h6", children: getLabel("mnuLeyends").text }),
522
+ /* @__PURE__ */ jsx(LegendContainer, { id: chartId, references: colorReference })
523
+ ] }) })
524
+ ] });
525
+ };
526
+
527
+ export { LineChart };
528
+ //# sourceMappingURL=LineChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LineChart.js","sources":["../../../src/charts/linear/LineChart.tsx"],"sourcesContent":["import {\n arrayOrArray,\n getLabel,\n useImperativeComponentEvents,\n usePanAndZoom,\n usePrevious,\n} from '@apia/util';\nimport {\n TApiaChartColorDisposition,\n TApiaChartCoordinate,\n TApiaChartDefinition,\n TChartRendererProps,\n} from '../types';\nimport { scaleLinear, scaleLog, scaleOrdinal } from '@visx/scale';\nimport { min, max } from 'd3-array';\nimport { parseMargin } from '../util/parseMargin';\nimport { useMemo, useState, useLayoutEffect } from 'react';\nimport { useChartStyles } from '../util/useChartStyles';\nimport { Box, Heading } from '@apia/theme';\nimport { Grid } from '@visx/visx';\nimport { Group } from '@visx/group';\nimport { LinePath } from '@visx/shape';\nimport { AxisBottom, AxisLeft } from '@visx/axis';\nimport * as allCurves from '@visx/curve';\nimport uniqueId from 'lodash-es/uniqueId';\nimport { Node } from './Node';\nimport { getBarColor } from '../util/getBarColor';\nimport { LegendContainer, TChartReference } from '../util/LegendContainer';\nimport { TChartEvents } from '../ChartRenderer';\nimport { ApiaUtil } from '@apia/components';\n\nfunction adjustDimensions({\n width,\n height,\n maxWidth,\n}: {\n width: number;\n height: number;\n maxWidth: number;\n}) {\n if (width <= maxWidth) {\n return { width, height };\n }\n\n const ratio = width / height;\n const newWidth = maxWidth;\n const newHeight = Math.floor(newWidth / ratio);\n\n return { width: newWidth, height: newHeight };\n}\n\nfunction getX(coordinate: TApiaChartCoordinate) {\n return coordinate.key;\n}\n\nfunction getY(coordinate: TApiaChartCoordinate) {\n return Number(coordinate.value);\n}\n\nfunction parseData(chart: TApiaChartDefinition) {\n const setsArray = arrayOrArray(chart.dataSets?.data).map((col) =>\n arrayOrArray(col.sets),\n );\n let longestLine: TApiaChartCoordinate[] = [];\n let longestLineIndex = -1;\n\n for (let i = 0; i < setsArray.length; i++) {\n const array = setsArray[i];\n if (!longestLine || array.length > longestLine.length) {\n longestLine = array;\n longestLineIndex = i;\n }\n }\n\n const lines = arrayOrArray(chart.dataSets?.data);\n const nodesDataArray = lines.map((line) => line.sets);\n const nodesData = nodesDataArray.reduce<TApiaChartCoordinate[]>(\n (rec, d) => arrayOrArray(rec).concat(d),\n [],\n );\n return {\n lines,\n longestLine,\n longestLineIndex,\n tallestLine: [...new Set(nodesData.map((value) => value.value))],\n xScale: scaleOrdinal<string, number>({\n domain: longestLine.map(getX),\n }),\n yScale: scaleLinear<number>({\n domain: [\n (min(nodesData, getY) ?? 0) < 0 ? min(nodesData, getY) ?? 0 : 0,\n max(nodesData, getY) ?? 1,\n ],\n }),\n yScaleLog: scaleLog<number>({\n domain: [\n (min(nodesData, getY) ?? 1) > 0 ? min(nodesData, getY) ?? 1 : 1,\n max(nodesData, getY) ?? 10,\n ],\n }),\n };\n}\nexport type TLineChartEvents = { highlight: { barName: string } };\n\nexport type TChartNode = {\n x: number;\n y: number;\n xValue: string;\n yValue: string;\n columnName: string;\n};\n\nconst LineChart = ({\n chart,\n margin = { top: 20, left: 100, bottom: 24, right: 0 },\n chartId,\n allowZoom,\n}: TChartRendererProps) => {\n const effectiveMargin = parseMargin(margin);\n if (!chart.showAxisYTitle && effectiveMargin.left > 50) {\n effectiveMargin.left = 50;\n }\n let innerWidth =\n chart.ratio.width - (effectiveMargin.left + effectiveMargin.right) / 2;\n let innerHeight =\n chart.ratio.height - (effectiveMargin.top + effectiveMargin.bottom) / 2;\n if (innerWidth > chart.ratio.maxWidth) {\n const newValues = adjustDimensions({\n height: innerHeight,\n width: innerWidth,\n maxWidth: chart.ratio.maxWidth,\n });\n innerWidth = newValues.width;\n innerHeight = newValues.height;\n }\n\n const { lines, xScale, yScale, yScaleLog, longestLine } = parseData(chart);\n const styles = useChartStyles(chart.colorSchema);\n const coordinates = arrayOrArray(lines[0].sets);\n const coordinatesArray = lines.map((col) => {\n return col.sets;\n });\n const divideRangeBetweenStrings = (\n min: number,\n max: number,\n strings: TApiaChartCoordinate[] | string[],\n ): number[] => {\n const numStrings = strings.length;\n const step = (max - min) / (numStrings - 1);\n\n const resultArray: number[] = [];\n let currentValue = min;\n\n for (let i = 0; i < numStrings; i++) {\n resultArray.push(currentValue);\n currentValue += step;\n }\n return resultArray;\n };\n const xScaleRange = useMemo(() => {\n const rangeArr = [\n typeof effectiveMargin === 'number'\n ? effectiveMargin\n : effectiveMargin.left,\n innerWidth,\n ];\n return divideRangeBetweenStrings(rangeArr[0], rangeArr[1], longestLine);\n }, [effectiveMargin, innerWidth, longestLine]);\n\n xScale.range(xScaleRange);\n const yScaleRange = useMemo(() => {\n const rangeArr = [\n innerHeight - (effectiveMargin.top + effectiveMargin.bottom),\n typeof effectiveMargin === 'number'\n ? effectiveMargin\n : effectiveMargin.top,\n ];\n\n return rangeArr;\n }, [effectiveMargin, innerHeight]);\n\n yScale.range(yScaleRange);\n yScaleLog.range([\n innerHeight,\n typeof effectiveMargin === 'number' ? effectiveMargin : effectiveMargin.top,\n ]);\n\n const [currentCircle, setCurrentCircle] = useState<string[]>([]);\n\n const actualYScale = useMemo(() => {\n return yScale;\n }, [yScale]);\n const id = useMemo(() => `Linear${uniqueId()}`, []);\n useLayoutEffect(() => {\n document\n .querySelectorAll<HTMLElement>(`#${id} .tickLabel`)\n .forEach((current) => {\n const width = current.getBoundingClientRect().width;\n // eslint-disable-next-line no-param-reassign\n current.style.transformOrigin =\n (current.getAttribute('x') as string) + 'px 14px';\n // eslint-disable-next-line no-param-reassign\n current.style.transform = `rotate(25deg) translateX(${width / 2}px)`;\n });\n });\n function addNameToProps(\n names: string[],\n objects: {\n xValue: string;\n yValue: string;\n x: number;\n y: number;\n }[],\n fixedValue: number,\n ) {\n return objects.map((object, index) => {\n const nameIndex = Math.floor(index / fixedValue);\n const name = names[nameIndex];\n return { ...object, columnName: name };\n });\n }\n\n const setsWithColor = arrayOrArray(chart.dataSets.data).map((data, index) => {\n const isSingle = arrayOrArray(chart.dataSets.data).length === 1;\n const dataColor =\n data.color !== '' && data.color !== undefined\n ? data.color\n : arrayOrArray(\n styles\n ? styles.schema\n : [\n '#7ad6f4',\n '#45bdee',\n '#28a7ea',\n '#006cbb',\n '#034698',\n '#032f64',\n ],\n ).length > 0\n ? getBarColor(\n arrayOrArray(\n styles\n ? styles.schema\n : [\n '#7ad6f4',\n '#45bdee',\n '#28a7ea',\n '#006cbb',\n '#034698',\n '#032f64',\n ],\n ),\n index,\n isSingle,\n )\n : '';\n const returnColumnsArray: TApiaChartColorDisposition[] = [];\n arrayOrArray(data.sets).forEach((set) => {\n if (set.color !== '' && set.color !== undefined) {\n returnColumnsArray.push({ ...set, columnName: data.name });\n } else {\n returnColumnsArray.push({\n ...set,\n color: dataColor,\n columnName: data.name,\n });\n }\n });\n return { returnColumnsArray, columnColor: dataColor };\n });\n\n const colorReference: TChartReference = arrayOrArray(chart.dataSets.data).map(\n (data, index) => {\n const isSingle = arrayOrArray(chart.dataSets.data).length === 1;\n const dataColor =\n data.color !== '' && data.color !== undefined\n ? data.color\n : arrayOrArray(\n styles\n ? styles.schema\n : [\n '#7ad6f4',\n '#45bdee',\n '#28a7ea',\n '#006cbb',\n '#034698',\n '#032f64',\n ],\n ).length > 0\n ? getBarColor(\n arrayOrArray(\n styles\n ? styles.schema\n : [\n '#7ad6f4',\n '#45bdee',\n '#28a7ea',\n '#006cbb',\n '#034698',\n '#032f64',\n ],\n ),\n index,\n isSingle,\n )\n : '';\n return {\n color: dataColor,\n title: data.name,\n };\n },\n );\n\n arrayOrArray(chart.dataSets.data)\n .map((data) => {\n const returnArray: { color: string; title: string }[] = [];\n arrayOrArray(data.sets).forEach((set) => {\n if (set.color !== '' && set.color !== undefined) {\n returnArray.push({\n color: set.color,\n title: data.name + ' - ' + set.key,\n });\n }\n });\n return returnArray;\n })\n .flat()\n .forEach((addRef) => colorReference.push(addRef));\n\n const [highlightedBar, setHighlightedBar] = useState('');\n useImperativeComponentEvents<TChartEvents>({\n highlight(barName) {\n if (barName.split(' - ').length === 1) {\n setHighlightedBar(barName);\n if (chart.showAxisXTitle || chart.showLegend || chart.showValues) {\n console.log({ barName, lines });\n const selectedLineGroup = lines.find((l) => l.name === barName);\n const selectedLineGroupIndex = lines.findIndex(\n (l) => l.name === barName,\n );\n console.log({ selectedLineGroup, selectedLineGroupIndex });\n\n if (selectedLineGroup && selectedLineGroupIndex !== -1) {\n ApiaUtil.instance.tooltips.open({\n children: arrayOrArray(selectedLineGroup.sets).map((dat, i) => {\n return (\n <div key={`${dat.key}`}>\n <div\n style={{\n color: colorReference[selectedLineGroupIndex].color,\n }}\n >\n <strong>\n {chart.showAxisXTitle\n ? dat.key\n : chart.showLegend\n ? barName\n : ''}\n </strong>\n </div>\n {chart.showValues && <div>{dat.value}</div>}\n <div>\n {/* {chart.showAxisXTitle && chart.showLegend\n ? Object.keys(dat).find(\n (key) => dat[key] === dat[barName],\n )\n : ''} */}\n </div>\n {arrayOrArray(selectedLineGroup.sets)[i + 1] && <hr />}\n </div>\n );\n }),\n attachToMousePosition: true,\n });\n }\n }\n } else if (barName.split(' - ').length === 2) {\n setHighlightedBar(barName.split(' - ')[0]);\n }\n },\n });\n\n const { boxRef, elementRef } = usePanAndZoom<HTMLElement, SVGSVGElement>(\n undefined,\n !allowZoom ?? true,\n );\n const coords = coordinatesArray.flat().map((coord) => {\n return {\n xValue: coord.key,\n yValue: coord.value,\n x: xScale(getX(coord)),\n y: actualYScale(getY(coord)),\n };\n });\n const columnNames = lines.map((column) => {\n return column.name;\n });\n const nodes = addNameToProps(columnNames, coords, coordinates.length);\n\n const [nearNodesArray, setNearNodesArray] = useState<TChartNode[]>([]);\n const previousNearNodesArray = usePrevious(nearNodesArray);\n return (\n <>\n <Box id={id} ref={boxRef} className=\"chartBox chartContainer\">\n <svg\n ref={elementRef}\n width={innerWidth}\n height={innerHeight}\n id=\"LinesChart\"\n className={`_${chartId} chart__svg`}\n onMouseMove={(ev) => {\n const rect = elementRef.current?.getBoundingClientRect();\n\n let clientX =\n ev.clientX - (effectiveMargin.left + effectiveMargin.right) / 2;\n let clientY =\n ev.clientY - (effectiveMargin.top + effectiveMargin.bottom) / 2;\n\n if (rect) {\n clientX = ev.clientX - rect.left;\n clientY = ev.clientY - rect.top;\n }\n const nearNodes = nodes.filter((node) => {\n return (\n Math.sqrt((node.x - clientX) ** 2 + (node.y - clientY) ** 2) <\n 20\n );\n });\n\n if (previousNearNodesArray.current && nearNodes.length > 0) {\n const currentColumns = lines\n .map((col) => {\n let colNames = '';\n nearNodes.forEach((node) => {\n if (col.name === node.columnName) {\n colNames = node.columnName;\n }\n });\n\n return colNames;\n })\n .filter((name) => name !== '');\n const currentIndex = coordinates.findIndex((coord) => {\n return coord.key === nearNodes[0].xValue;\n });\n\n if (currentColumns && currentIndex !== undefined) {\n const newCircleValues = currentColumns.map((col) => {\n return `${col}${currentIndex}`;\n });\n\n setCurrentCircle([...newCircleValues]);\n }\n setNearNodesArray(nearNodes);\n const elementUnderCursor = document.elementFromPoint(\n ev.clientX,\n ev.clientY,\n );\n if (\n elementUnderCursor &&\n elementUnderCursor.tagName === 'circle'\n ) {\n if (\n chart.showAxisXTitle ||\n chart.showLegend ||\n chart.showValues\n ) {\n ApiaUtil.instance.tooltips.open({\n children: nearNodes\n .sort((a, b) => Number(b.yValue) - Number(a.yValue))\n .map((node, i) => {\n const useSpecific = colorReference.some(\n (ref) =>\n ref.title === node.columnName + ' - ' + node.xValue,\n );\n\n return (\n <Box\n key={`${node.columnName}_${node.xValue}_${node.yValue}`}\n >\n <div\n style={{\n color:\n colorReference[\n colorReference.findIndex((ref) => {\n return (\n ref.title ===\n (useSpecific\n ? node.columnName +\n ' - ' +\n node.xValue\n : node.columnName)\n );\n })\n ].color,\n }}\n >\n <strong>\n {chart.showAxisXTitle\n ? node.xValue\n : chart.showLegend\n ? node.columnName\n : ''}\n </strong>\n </div>\n {chart.showValues && <div>{node.yValue}</div>}\n <div>\n {chart.showAxisXTitle && chart.showLegend\n ? node.columnName\n : ''}\n </div>\n {nearNodesArray[i + 1] && <hr />}\n </Box>\n );\n }),\n attachToMousePosition: true,\n });\n }\n } else {\n ApiaUtil.instance.tooltips.closeAll();\n }\n } else if (nearNodes.length === 0) {\n setCurrentCircle([]);\n }\n }}\n >\n {chart.showGrid && (\n <Grid.Grid\n top={\n (typeof effectiveMargin === 'number'\n ? effectiveMargin\n : effectiveMargin.top) - 20\n }\n left={0}\n xScale={xScale}\n yScale={actualYScale}\n width={innerWidth}\n height={innerHeight}\n stroke={styles?.grid.stroke}\n strokeOpacity={styles?.grid.opacity}\n />\n )}\n {lines.map((column, i) => {\n const currentCoordinates = arrayOrArray(column.sets);\n const newColor = setsWithColor.find(\n (data) => data.returnColumnsArray[0].columnName === column.name,\n )?.columnColor;\n\n return (\n <Group\n key={`lines-${column.name + i.toString()}`}\n top={\n (typeof effectiveMargin === 'number'\n ? effectiveMargin\n : effectiveMargin.top) - 20\n }\n style={{\n opacity:\n highlightedBar !== '' && highlightedBar !== column.name\n ? 0.15\n : 1,\n transition: 'opacity 500ms',\n }}\n >\n <LinePath\n curve={allCurves.curveMonotoneX}\n data={currentCoordinates}\n x={(coordinate) => {\n return xScale(getX(coordinate)) ?? 0;\n }}\n y={(coordinate) => actualYScale(getY(coordinate)) ?? 0}\n stroke={newColor ?? 'black'}\n strokeWidth={2}\n strokeOpacity={1}\n shapeRendering=\"geometricPrecision\"\n color=\"transparent\"\n />\n {currentCoordinates.map((coordinate, j) => {\n const key = column.name + j.toString();\n const realColor = setsWithColor\n .map((sets) => sets.returnColumnsArray)\n .flat()\n .find(\n (set) =>\n set.columnName === column.name &&\n set.key === coordinate.key,\n )?.color;\n\n return (\n <g key={key}>\n {chart.showValues && (\n <text\n x={xScale(getX(coordinate)) + 10}\n y={actualYScale(getY(coordinate)) - 5}\n textAnchor=\"middle\"\n style={{\n display:\n highlightedBar === column.name ? 'block' : 'none',\n opacity: highlightedBar === column.name ? 1 : 0,\n transition: 'opacity 500ms',\n }}\n >\n {coordinate.value}\n </text>\n )}\n <Node\n color={realColor ?? 'black'}\n coordinate={coordinate}\n currentCircle={currentCircle}\n cx={xScale(getX(coordinate))}\n cy={actualYScale(getY(coordinate))}\n setCurrentCircle={setCurrentCircle}\n innerKey={key}\n column={column}\n />\n </g>\n );\n })}\n </Group>\n );\n })}\n\n <AxisLeft\n scale={actualYScale}\n left={effectiveMargin.left}\n label={\n chart.chartType !== 'pie2D' && chart.showAxisYTitle\n ? chart.axisYTitle\n : ''\n }\n tickLabelProps={{\n display: chart.showAxisYTitle ? 'auto' : 'none',\n }}\n tickComponent={(props) => {\n let value = Number(props.formattedValue?.replace(',', ''));\n let counter = -1;\n const units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q'];\n while (value >= 1000) {\n value = value / 1000;\n counter++;\n }\n let stringValue = `${value}`;\n if (stringValue.length > 3) {\n stringValue = stringValue.slice(0, 3);\n }\n if (stringValue.endsWith('.')) {\n stringValue = stringValue.replace('.', '');\n }\n const newValue = `${stringValue}${\n counter >= 0 ? units[counter] : ''\n }`;\n\n return (\n <>\n {chart.showAxisYTitle && (\n <text\n dx={props.dx}\n dy={props.dy}\n fill={props.fill}\n fontSize={props.fontSize}\n textAnchor={props.textAnchor}\n x={props.x}\n y={props.y}\n >\n {newValue}\n </text>\n )}\n </>\n );\n }}\n />\n <AxisBottom\n top={innerHeight - (effectiveMargin.top + effectiveMargin.bottom)}\n scale={xScale}\n label={\n chart.chartType !== 'pie2D' && chart.showAxisXTitle\n ? chart.axisXTitle\n : ''\n }\n tickLabelProps={{ display: 'none' }}\n tickLineProps={{ display: 'none' }}\n labelOffset={10}\n />\n </svg>\n </Box>\n <Box className=\"chartLegend__Wrapper\">\n {chart.showLegend && colorReference.length !== 0 && (\n <Box className=\"chart__legend__wrapper\">\n {/* TODO LABEL */}\n <Heading as={'h6'}>{getLabel('mnuLeyends').text}</Heading>\n <LegendContainer id={chartId} references={colorReference} />\n </Box>\n )}\n </Box>\n </>\n );\n};\nexport { LineChart };\n"],"names":["min","max"],"mappings":"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"}