@apia/charts 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2475 +1,2 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import React, { createContext, useContext, useState, useMemo, useLayoutEffect, useEffect, useRef } from 'react';
3
- import { Box, Select } from 'theme-ui';
4
- import { ThemeProviderContext, spacing, makeStyledComponent, getVariant } from '@apia/theme';
5
- import { uniqueId } from 'lodash';
6
- import { makeImperativeComponent, arrayOrArray, useImperativeComponentEvents, getValueByPath, usePanAndZoom, usePrevious, getIndex } from '@apia/util';
7
- import { scaleBand, scaleLog, scaleLinear, scaleOrdinal } from '@visx/scale';
8
- import { Grid } from '@visx/visx';
9
- import { Group } from '@visx/group';
10
- import { BarGroupHorizontal, BarGroup, LinePath, Line } from '@visx/shape';
11
- import { AxisLeft, AxisBottom } from '@visx/axis';
12
- import { usePanelParametersSelector } from '@apia/dashboard';
13
- import tinycolor from 'tinycolor2';
14
- import { localPoint } from '@visx/event';
15
- import { SimpleButton, useTooltip } from '@apia/components';
16
- import { icons } from '@apia/icons';
17
- import Pie from '@visx/shape/lib/shapes/Pie';
18
- import { min, max, extent } from 'd3-array';
19
- import * as allCurves from '@visx/curve';
20
- import { Fragment as Fragment$1 } from 'theme-ui/jsx-runtime';
21
- import { GridRows } from '@visx/grid';
22
- import { useGauge } from 'use-gauge';
23
-
24
- function parseMargin(margin = {
25
- left: 100,
26
- right: 50,
27
- top: 50,
28
- bottom: 70
29
- }) {
30
- return typeof margin === "number" ? { left: margin, right: margin, top: margin, bottom: margin } : margin;
31
- }
32
-
33
- const ChartContext = createContext({});
34
-
35
- const LegendItem = ({
36
- groupId,
37
- title,
38
- color,
39
- className,
40
- isHighlighted,
41
- isAnyHighlighted,
42
- avoidEvent
43
- }) => {
44
- const { chartId } = useContext(ChartContext);
45
- return /* @__PURE__ */ jsx(
46
- SimpleButton,
47
- {
48
- variant: "icon-outline",
49
- className: `${className != null ? className : ""} ${isHighlighted ? "highlight" : ""}`,
50
- iconColor: color || "black",
51
- icon: color === "transparent" ? void 0 : icons.SquareFilled,
52
- sx: {
53
- opacity: isAnyHighlighted && !isHighlighted ? "0.15" : "1"
54
- },
55
- onMouseEnter: () => {
56
- if (avoidEvent) {
57
- return;
58
- }
59
- chartMethods(chartId, "highlight", groupId);
60
- },
61
- onMouseLeave: () => {
62
- if (avoidEvent) {
63
- return;
64
- }
65
- chartMethods(chartId, "highlight", "");
66
- },
67
- children: title
68
- }
69
- );
70
- };
71
-
72
- const [legendContainerMethods, , LegendContainer] = makeImperativeComponent()({
73
- initialState: {
74
- highlightedBarGroup: ""
75
- },
76
- methods: {
77
- highlight(setState, highlightedBarGroup) {
78
- setState({ highlightedBarGroup });
79
- }
80
- },
81
- Component: ({
82
- references,
83
- containerClassName,
84
- highlightedBarGroup,
85
- avoidEvent
86
- }) => {
87
- return /* @__PURE__ */ jsx(Box, { className: containerClassName, children: references.map((data) => {
88
- return /* @__PURE__ */ jsx(
89
- LegendItem,
90
- {
91
- isHighlighted: data.title === highlightedBarGroup,
92
- isAnyHighlighted: highlightedBarGroup !== "",
93
- groupId: data.title,
94
- color: data.color,
95
- title: data.title,
96
- avoidEvent: avoidEvent != null ? avoidEvent : false
97
- },
98
- data.title
99
- );
100
- }) });
101
- }
102
- });
103
-
104
- const Bar$1 = ({
105
- bar,
106
- barGroup,
107
- chart,
108
- parsedData,
109
- isSingle,
110
- effectiveMargin,
111
- setsWithColor
112
- }) => {
113
- var _a;
114
- const column = arrayOrArray(chart.dataSets.data)[bar.index];
115
- const set = arrayOrArray(column == null ? void 0 : column.sets)[barGroup.index];
116
- const currentBarColor = (_a = setsWithColor.find(
117
- (innerSet) => innerSet.columnName === column.name && innerSet.key === set.key
118
- )) == null ? void 0 : _a.color;
119
- const [isHighlighted, setIsHighlighted] = useState(false);
120
- const [isAnyHighlighted, setIsAnyHighlighted] = useState(false);
121
- const { open } = useTooltip({
122
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
123
- /* @__PURE__ */ jsx(
124
- "div",
125
- {
126
- style: {
127
- color: currentBarColor
128
- },
129
- children: /* @__PURE__ */ jsx("strong", { children: parsedData[barGroup.index].columnName })
130
- }
131
- ),
132
- chart.showValues && /* @__PURE__ */ jsx("div", { children: bar.value }),
133
- /* @__PURE__ */ jsx("div", { children: bar.key })
134
- ] })
135
- });
136
- useImperativeComponentEvents({
137
- highlight(barName) {
138
- if (barName.split(" - ").length === 1) {
139
- setIsHighlighted(barName === bar.key);
140
- setIsAnyHighlighted(barName !== bar.key && barName !== "");
141
- } else if (barName.split(" - ").length === 2) {
142
- setIsHighlighted(
143
- barName.split(" - ")[0] === bar.key && barName.split(" - ")[1] === set.key
144
- );
145
- setIsAnyHighlighted(
146
- barName.split(" - ")[0] !== bar.key && barName.split(" - ")[0] !== ""
147
- );
148
- }
149
- }
150
- });
151
- const { chartId } = useContext(ChartContext);
152
- return /* @__PURE__ */ jsxs("g", { children: [
153
- /* @__PURE__ */ jsxs(
154
- "text",
155
- {
156
- x: bar.x + 5,
157
- y: bar.y - 5,
158
- width: bar.width,
159
- height: bar.height,
160
- textAnchor: "start",
161
- style: {
162
- display: isHighlighted ? "block" : "none",
163
- opacity: isHighlighted ? 1 : 0,
164
- transition: "opacity 500ms"
165
- },
166
- children: [
167
- bar.value,
168
- " - ",
169
- parsedData[barGroup.index].columnName
170
- ]
171
- }
172
- ),
173
- /* @__PURE__ */ jsx(
174
- Box,
175
- {
176
- as: "rect",
177
- className: "chart__barRect",
178
- sx: useMemo(
179
- () => ({
180
- fill: isAnyHighlighted ? `#${tinycolor(currentBarColor).desaturate(70).toHex()}` : currentBarColor,
181
- "&:hover": {
182
- fill: `#${tinycolor(currentBarColor).saturate(25).toHex()}`
183
- },
184
- transition: "fill 500ms, opacity 500ms",
185
- x: bar.x,
186
- y: bar.y,
187
- width: bar.width - effectiveMargin.left,
188
- opacity: isAnyHighlighted && !isHighlighted ? 0.15 : 1,
189
- height: bar.height > 0 ? bar.height : 0
190
- }),
191
- [
192
- bar.height,
193
- bar.width,
194
- bar.x,
195
- bar.y,
196
- currentBarColor,
197
- effectiveMargin.left,
198
- isAnyHighlighted,
199
- isHighlighted
200
- ]
201
- ),
202
- onMouseEnter: (ev) => {
203
- var _a2, _b, _c;
204
- if (!isSingle) {
205
- legendContainerMethods.highlight(chartId, bar.key);
206
- }
207
- (_a2 = ev.target.classList) == null ? void 0 : _a2.add("over");
208
- const point = {
209
- x: (_b = localPoint(ev)) == null ? void 0 : _b.x,
210
- y: (_c = localPoint(ev)) == null ? void 0 : _c.y
211
- };
212
- if (!point)
213
- return;
214
- open({
215
- attachToElement: () => ev.target,
216
- attachToElementAnchorPoint: "center"
217
- });
218
- },
219
- onMouseLeave: (ev) => {
220
- var _a2;
221
- if (!isSingle) {
222
- legendContainerMethods.highlight(chartId, "");
223
- }
224
- (_a2 = ev.target.classList) == null ? void 0 : _a2.remove("over");
225
- },
226
- children: /* @__PURE__ */ jsx(
227
- "animate",
228
- {
229
- attributeName: "width",
230
- from: 0,
231
- to: bar.width,
232
- dur: "0.5s",
233
- calcMode: "paced",
234
- keySplines: "0.5 0 0.5 1;",
235
- keyTimes: "0; 1"
236
- }
237
- )
238
- }
239
- )
240
- ] });
241
- };
242
-
243
- function getBarColor(colors, index, alwaysDiffer = false) {
244
- const module = colors.length;
245
- let count = 0;
246
- let barColor = "";
247
- if (!alwaysDiffer) {
248
- if (colors[index]) {
249
- barColor = colors[index];
250
- } else {
251
- let innerIndex = index;
252
- while (innerIndex >= module) {
253
- innerIndex = index / module;
254
- count++;
255
- }
256
- barColor = tinycolor(colors[index % module]).desaturate(count * 5).toHex();
257
- }
258
- } else {
259
- if (colors[index]) {
260
- barColor = colors[index];
261
- } else {
262
- barColor = tinycolor(colors[index % module]).toHex();
263
- }
264
- }
265
- return barColor;
266
- }
267
-
268
- var __defProp$7 = Object.defineProperty;
269
- var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
270
- var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
271
- var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
272
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
273
- var __spreadValues$7 = (a, b) => {
274
- for (var prop in b || (b = {}))
275
- if (__hasOwnProp$7.call(b, prop))
276
- __defNormalProp$7(a, prop, b[prop]);
277
- if (__getOwnPropSymbols$7)
278
- for (var prop of __getOwnPropSymbols$7(b)) {
279
- if (__propIsEnum$7.call(b, prop))
280
- __defNormalProp$7(a, prop, b[prop]);
281
- }
282
- return a;
283
- };
284
- function useChartStyles(schemeName) {
285
- var _a, _b, _c;
286
- const theme = useContext(ThemeProviderContext);
287
- if (!theme.layout)
288
- console.error("The layout property is missing in the current theme");
289
- const charts = (_b = (_a = theme.layout) == null ? void 0 : _a.charts) != null ? _b : {};
290
- const defaultStyles = charts.common;
291
- const currentStylescheme = {
292
- schema: getValueByPath(
293
- theme.colors,
294
- // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
295
- (_c = charts[schemeName || "blue"]) == null ? void 0 : _c.schema
296
- )
297
- };
298
- return __spreadValues$7(__spreadValues$7({}, defaultStyles), currentStylescheme);
299
- }
300
-
301
- var __defProp$6 = Object.defineProperty;
302
- var __defProps$6 = Object.defineProperties;
303
- var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
304
- var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
305
- var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
306
- var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
307
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
308
- var __spreadValues$6 = (a, b) => {
309
- for (var prop in b || (b = {}))
310
- if (__hasOwnProp$6.call(b, prop))
311
- __defNormalProp$6(a, prop, b[prop]);
312
- if (__getOwnPropSymbols$6)
313
- for (var prop of __getOwnPropSymbols$6(b)) {
314
- if (__propIsEnum$6.call(b, prop))
315
- __defNormalProp$6(a, prop, b[prop]);
316
- }
317
- return a;
318
- };
319
- var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
320
- function adjustDimensions$4({
321
- width,
322
- height,
323
- maxWidth
324
- }) {
325
- if (width <= maxWidth) {
326
- return { width, height };
327
- }
328
- const ratio = width / height;
329
- const newWidth = maxWidth;
330
- const newHeight = Math.floor(newWidth / ratio);
331
- return { width: newWidth, height: newHeight };
332
- }
333
- const getYValue = (d) => d.columnName;
334
- const HorizontalBars = ({
335
- margin = { top: 20, left: 50, bottom: 150, right: 20 },
336
- chart,
337
- className,
338
- chartId,
339
- outerClassName,
340
- allowZoom
341
- }) => {
342
- var _a;
343
- const effectiveMargin = parseMargin(margin);
344
- let innerWidth = chart.ratio.width + (-effectiveMargin.left - effectiveMargin.right) / 2;
345
- let innerHeight = chart.ratio.height + (-effectiveMargin.top - effectiveMargin.bottom) / 2;
346
- if (innerWidth > chart.ratio.maxWidth) {
347
- const newValues = adjustDimensions$4({
348
- height: innerHeight,
349
- width: innerWidth,
350
- maxWidth: chart.ratio.maxWidth
351
- });
352
- innerWidth = newValues.width;
353
- innerHeight = newValues.height;
354
- }
355
- const columnas = arrayOrArray((_a = chart.dataSets) == null ? void 0 : _a.data).filter((column) => !!column.sets).map((column) => {
356
- return __spreadProps$6(__spreadValues$6({}, column), {
357
- sets: column.sets
358
- });
359
- });
360
- const xValues = arrayOrArray(columnas[0].sets).map(
361
- (innerCoord) => innerCoord.key
362
- );
363
- const columnNames = columnas.map((col) => {
364
- return col.name;
365
- });
366
- const parsedData = xValues.map((x) => {
367
- const obj = columnas.reduce(
368
- (acc, column) => {
369
- return __spreadProps$6(__spreadValues$6({}, acc), {
370
- [column.name]: arrayOrArray(column.sets).filter((coord) => {
371
- return coord.key === x;
372
- })[0].value
373
- });
374
- },
375
- { columnName: x }
376
- );
377
- return obj;
378
- });
379
- const yScale = scaleBand({
380
- range: [
381
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top,
382
- innerHeight
383
- ],
384
- domain: parsedData.map(getYValue),
385
- padding: 0.2
386
- });
387
- const columnGroupScale = scaleBand({
388
- domain: columnNames,
389
- range: [0, yScale.bandwidth()]
390
- });
391
- const xScaleLog = scaleLog({
392
- range: [
393
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.left,
394
- innerWidth
395
- ],
396
- domain: [
397
- 1,
398
- Math.max(
399
- ...parsedData.map(
400
- (d) => Math.max(...columnNames.map((key) => Number(d[key])))
401
- )
402
- )
403
- ],
404
- base: 10
405
- });
406
- const xScaleLine = scaleLinear({
407
- range: [
408
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.left,
409
- innerWidth
410
- ],
411
- domain: [
412
- 0,
413
- Math.max(
414
- ...parsedData.map(
415
- (d) => Math.max(...columnNames.map((key) => Number(d[key])))
416
- )
417
- )
418
- ]
419
- });
420
- const color = scaleOrdinal({
421
- domain: columnNames,
422
- range: columnas.map((col) => col.color)
423
- });
424
- const parameters = usePanelParametersSelector((global) => {
425
- return global;
426
- });
427
- const scale = parameters.PRMT_CHART_SCALE;
428
- const isLogScale = scale === "0";
429
- const xScale = useMemo(() => {
430
- if (!isLogScale) {
431
- return xScaleLine;
432
- }
433
- return xScaleLog;
434
- }, [isLogScale, xScaleLine, xScaleLog]);
435
- const id = useMemo(() => `VerticalBars${uniqueId()}`, []);
436
- useLayoutEffect(() => {
437
- document.querySelectorAll(
438
- `#${id} .__${chartId != null ? chartId : outerClassName}`
439
- ).forEach((current) => {
440
- const width = current.getBoundingClientRect().width;
441
- current.style.transformOrigin = current.getAttribute("x") + "px 14px";
442
- current.style.transform = `rotate(15deg) translateX(${width / 2}px)`;
443
- });
444
- });
445
- const styles = useChartStyles(chart.colorSchema);
446
- const { boxRef, elementRef } = usePanAndZoom(
447
- void 0,
448
- !allowZoom
449
- );
450
- const setsWithColor = arrayOrArray(chart.dataSets.data).map((data, index) => {
451
- const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
452
- const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(styles.schema).length > 0 ? getBarColor(arrayOrArray(styles.schema), index, isSingle) : "";
453
- const returnColumnsArray = [];
454
- arrayOrArray(data.sets).forEach((set) => {
455
- if (set.color !== "" && set.color !== void 0) {
456
- returnColumnsArray.push(__spreadProps$6(__spreadValues$6({}, set), { columnName: data.name }));
457
- } else {
458
- returnColumnsArray.push(__spreadProps$6(__spreadValues$6({}, set), {
459
- color: dataColor,
460
- columnName: data.name
461
- }));
462
- }
463
- });
464
- return returnColumnsArray;
465
- });
466
- const colorReference = setsWithColor.map((column) => {
467
- var _a2;
468
- return {
469
- color: (_a2 = column[0].color) != null ? _a2 : "",
470
- title: column[0].columnName
471
- };
472
- });
473
- arrayOrArray(chart.dataSets.data).map((data) => {
474
- const returnArray = [];
475
- arrayOrArray(data.sets).forEach((set) => {
476
- if (set.color !== "" && set.color !== void 0) {
477
- returnArray.push({
478
- color: set.color,
479
- title: data.name + " - " + set.key
480
- });
481
- }
482
- });
483
- return returnArray;
484
- }).flat().forEach((addRef) => colorReference.push(addRef));
485
- return /* @__PURE__ */ jsxs(Fragment, { children: [
486
- /* @__PURE__ */ jsx(
487
- Box,
488
- {
489
- ref: boxRef,
490
- id,
491
- className: `${outerClassName != null ? outerClassName : ""} ${chartId} ${chart.title}`,
492
- sx: React.useMemo(() => {
493
- return {
494
- [`.__${chartId != null ? chartId : outerClassName}`]: {
495
- transform: "rotate(45deg)",
496
- transformOrigin: "attr(x) 18px"
497
- },
498
- overflow: "auto",
499
- position: "relative",
500
- height: `${chart.ratio.height}px`,
501
- width: `${chart.ratio.width}px`
502
- };
503
- }, [chart.ratio.height, chart.ratio.width, chartId, outerClassName]),
504
- children: /* @__PURE__ */ jsxs(
505
- "svg",
506
- {
507
- ref: elementRef,
508
- className: `_${chartId} ${className ? className : ""} chart__svg`,
509
- height: chart.ratio.height,
510
- width: chart.ratio.width,
511
- style: {
512
- position: "absolute"
513
- },
514
- children: [
515
- chart.showGrid && /* @__PURE__ */ jsx(
516
- Grid.Grid,
517
- {
518
- xScale,
519
- yScale,
520
- left: 0,
521
- width: innerWidth,
522
- height: innerHeight,
523
- numTicksRows: 10,
524
- numTicksColumns: 10,
525
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20
526
- }
527
- ),
528
- /* @__PURE__ */ jsx(
529
- Group,
530
- {
531
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
532
- left: effectiveMargin.left,
533
- children: /* @__PURE__ */ jsx(
534
- BarGroupHorizontal,
535
- {
536
- data: parsedData,
537
- keys: columnNames,
538
- width: innerWidth,
539
- y0: getYValue,
540
- y0Scale: yScale,
541
- y1Scale: columnGroupScale,
542
- xScale,
543
- color,
544
- children: (barGroups) => barGroups.map((barGroup) => {
545
- return /* @__PURE__ */ jsx(
546
- Group,
547
- {
548
- top: barGroup.y0,
549
- children: barGroup.bars.map((bar) => {
550
- const key = `${barGroup.index}-${bar.index}-${bar.key}`;
551
- return /* @__PURE__ */ jsx(
552
- Bar$1,
553
- {
554
- isSingle: barGroup.bars.length === 1,
555
- bar,
556
- barGroup,
557
- chart,
558
- parsedData,
559
- effectiveMargin,
560
- setsWithColor: setsWithColor.flat()
561
- },
562
- key
563
- );
564
- })
565
- },
566
- `bar-group-${barGroup.index}-${barGroup.y0}`
567
- );
568
- })
569
- }
570
- )
571
- }
572
- ),
573
- /* @__PURE__ */ jsx(
574
- AxisLeft,
575
- {
576
- scale: yScale,
577
- left: effectiveMargin.left,
578
- label: chart.chartType !== "pie2D" && chart.showAxisYTitle ? chart.axisYTitle : "",
579
- tickLabelProps: () => ({
580
- display: "none"
581
- })
582
- }
583
- ),
584
- /* @__PURE__ */ jsx(
585
- AxisBottom,
586
- {
587
- top: innerHeight,
588
- scale: xScale,
589
- label: chart.chartType !== "pie2D" && chart.showAxisXTitle ? chart.axisXTitle : "",
590
- tickLabelProps: {
591
- className: "tickLabel"
592
- },
593
- labelOffset: 50
594
- }
595
- )
596
- ]
597
- }
598
- )
599
- }
600
- ),
601
- colorReference.length > 1 && /* @__PURE__ */ jsx(
602
- LegendContainer,
603
- {
604
- id: chartId,
605
- containerClassName: "legendContainer",
606
- references: colorReference
607
- }
608
- )
609
- ] });
610
- };
611
-
612
- const Slice = ({
613
- arc,
614
- arcPath,
615
- chart,
616
- actualColor
617
- }) => {
618
- const [isHighlighted, setIsHighlighted] = useState(false);
619
- const [isAnyHighlighted, setIsAnyHighlighted] = useState(false);
620
- const { open } = useTooltip({
621
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
622
- /* @__PURE__ */ jsx(
623
- "div",
624
- {
625
- style: {
626
- color: `#${tinycolor(actualColor).toHex()}`
627
- },
628
- children: /* @__PURE__ */ jsx("strong", { children: arc.data.key })
629
- }
630
- ),
631
- chart.showValues && /* @__PURE__ */ jsx("div", { children: `${arc.value} ${arc.data.percentage ? "- " + arc.data.percentage : ""}${arc.data.percentage ? "%" : ""}` })
632
- ] })
633
- });
634
- useImperativeComponentEvents({
635
- highlight(barName) {
636
- setIsHighlighted(barName === arc.data.key);
637
- setIsAnyHighlighted(barName !== arc.data.key && barName !== "");
638
- }
639
- });
640
- const { chartId } = useContext(ChartContext);
641
- const name = arc.data;
642
- return /* @__PURE__ */ jsx(
643
- "path",
644
- {
645
- style: useMemo(
646
- () => ({
647
- "&:hover": {
648
- fill: `#${tinycolor(actualColor).saturate(25).toHex()}`
649
- },
650
- transition: "fill 500ms, opacity 500ms"
651
- }),
652
- [actualColor]
653
- ),
654
- fill: isAnyHighlighted ? `#${tinycolor(actualColor).desaturate(70).toHex()}` : actualColor,
655
- opacity: isAnyHighlighted && !isHighlighted ? 0.15 : 1,
656
- d: arcPath != null ? arcPath : "",
657
- onMouseEnter: (ev) => {
658
- var _a, _b, _c;
659
- legendContainerMethods.highlight(chartId, arc.data.key);
660
- (_a = ev.target.classList) == null ? void 0 : _a.add("over");
661
- const point = {
662
- x: (_b = localPoint(ev)) == null ? void 0 : _b.x,
663
- y: (_c = localPoint(ev)) == null ? void 0 : _c.y
664
- };
665
- if (!point)
666
- return;
667
- open({
668
- attachToElement: () => ev.target,
669
- attachToElementAnchorPoint: "center"
670
- });
671
- },
672
- onMouseLeave: (ev) => {
673
- var _a;
674
- legendContainerMethods.highlight(chartId, "");
675
- (_a = ev.target.classList) == null ? void 0 : _a.remove("over");
676
- }
677
- },
678
- `arc-${name.key}-${name.value}`
679
- );
680
- };
681
-
682
- function ChartSelector({
683
- chartId,
684
- pieces,
685
- className,
686
- current,
687
- setCurrent
688
- }) {
689
- return /* @__PURE__ */ jsxs(
690
- Select,
691
- {
692
- sx: { width: "auto" },
693
- name: `chartSelector_${chartId}`,
694
- className: `chartSelector_${chartId} ${className != null ? className : ""}`,
695
- value: current != null ? current : "0",
696
- onChange: (ev) => {
697
- ev.preventDefault();
698
- setCurrent(ev.target.value);
699
- },
700
- children: [
701
- pieces.map((piece, i) => {
702
- return {
703
- label: piece,
704
- value: `${i}`
705
- };
706
- }).map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value)),
707
- " "
708
- ]
709
- }
710
- );
711
- }
712
-
713
- const TextSlice = ({
714
- arc,
715
- x,
716
- y,
717
- dy
718
- }) => {
719
- const [isHighlighted, setIsHighlighted] = useState(false);
720
- useImperativeComponentEvents({
721
- highlight(barName) {
722
- setIsHighlighted(barName === arc.data.key);
723
- }
724
- });
725
- return /* @__PURE__ */ jsx(
726
- "text",
727
- {
728
- textAnchor: "middle",
729
- style: {
730
- opacity: isHighlighted ? 1 : 0,
731
- display: isHighlighted ? "block" : "none",
732
- transition: "opacity 500ms"
733
- },
734
- x,
735
- y,
736
- dy,
737
- children: arc.value
738
- }
739
- );
740
- };
741
-
742
- var __defProp$5 = Object.defineProperty;
743
- var __defProps$5 = Object.defineProperties;
744
- var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
745
- var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
746
- var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
747
- var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
748
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
749
- var __spreadValues$5 = (a, b) => {
750
- for (var prop in b || (b = {}))
751
- if (__hasOwnProp$5.call(b, prop))
752
- __defNormalProp$5(a, prop, b[prop]);
753
- if (__getOwnPropSymbols$5)
754
- for (var prop of __getOwnPropSymbols$5(b)) {
755
- if (__propIsEnum$5.call(b, prop))
756
- __defNormalProp$5(a, prop, b[prop]);
757
- }
758
- return a;
759
- };
760
- var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
761
- function adjustDimensions$3({
762
- width,
763
- height,
764
- maxWidth
765
- }) {
766
- if (width <= maxWidth) {
767
- return { width, height };
768
- }
769
- const ratio = width / height;
770
- const newWidth = maxWidth;
771
- const newHeight = Math.floor(newWidth / ratio);
772
- return { width: newWidth, height: newHeight };
773
- }
774
- const PieChart = ({
775
- // margin = { top: 20, left: 100, bottom: 150, right: 20 },
776
- chart,
777
- className,
778
- chartId,
779
- allowZoom
780
- }) => {
781
- var _a;
782
- const [chartData, setChartData] = useState(
783
- {}
784
- );
785
- let innerWidth = chart.ratio.width > chart.ratio.height ? chart.ratio.width : chart.ratio.height;
786
- let innerHeight = chart.ratio.width > chart.ratio.height ? chart.ratio.width : chart.ratio.height;
787
- if (innerWidth > chart.ratio.maxWidth) {
788
- const newValues = adjustDimensions$3({
789
- height: innerHeight,
790
- width: innerWidth,
791
- maxWidth: chart.ratio.maxWidth
792
- });
793
- innerWidth = newValues.width;
794
- innerHeight = newValues.height;
795
- }
796
- const piezas = arrayOrArray((_a = chart.dataSets) == null ? void 0 : _a.data).filter((piece) => !!piece.sets).map((piece) => {
797
- return __spreadProps$5(__spreadValues$5({}, piece), {
798
- coordinate: piece.sets
799
- });
800
- });
801
- const [currentPie, setCurrentPie] = useState("0");
802
- useEffect(() => {
803
- setChartData(piezas[currentPie != null ? currentPie : 0]);
804
- }, [currentPie]);
805
- const centerY = useMemo(() => {
806
- return innerHeight / 2.5;
807
- }, [innerHeight]);
808
- const centerX = useMemo(() => {
809
- return innerWidth / 2.5;
810
- }, [innerWidth]);
811
- const top = centerY;
812
- const left = centerX;
813
- const getValue = (d) => Number(d.value) === 0 && piezas.length === 1 && arrayOrArray(piezas.map((p) => p.coordinate)[0]).length === 1 ? 100 : Number(d.value);
814
- const radius = Math.min(innerHeight, innerWidth) / 2.5;
815
- const piecesNames = piezas.map((piece) => {
816
- return piece.name;
817
- });
818
- const styles = useChartStyles(chart.colorSchema);
819
- const colorsArray = styles.schema;
820
- const names = arrayOrArray(arrayOrArray(chart.dataSets.data)[0].sets).map(
821
- (coord) => {
822
- return coord.key;
823
- }
824
- );
825
- const colorReference = names.map((name, index) => {
826
- return {
827
- title: name,
828
- color: getBarColor(arrayOrArray(colorsArray), index)
829
- };
830
- });
831
- const { boxRef, elementRef } = usePanAndZoom(
832
- void 0,
833
- !allowZoom
834
- );
835
- const previousPaths = useRef([]);
836
- return /* @__PURE__ */ jsxs(Fragment, { children: [
837
- piezas.length > 1 && /* @__PURE__ */ jsx(Box, { className: "chart__combo__wrapper", children: /* @__PURE__ */ jsx(
838
- ChartSelector,
839
- {
840
- chartId,
841
- pieces: piecesNames,
842
- className: "chartSelectorCombo",
843
- current: currentPie,
844
- setCurrent: setCurrentPie
845
- }
846
- ) }),
847
- /* @__PURE__ */ jsx(
848
- Box,
849
- {
850
- ref: boxRef,
851
- className: `${className ? className : ""} ${chartId}`,
852
- sx: { textAlign: "center", pb: spacing(5) },
853
- children: /* @__PURE__ */ jsx(
854
- "svg",
855
- {
856
- ref: elementRef,
857
- height: radius * 2,
858
- width: radius * 2,
859
- className: `_${chartId} chart__svg`,
860
- children: /* @__PURE__ */ jsxs(Group, { top: top != null ? top : 0, left: left != null ? left : 0, children: [
861
- /* @__PURE__ */ jsx(
862
- Pie,
863
- {
864
- data: arrayOrArray(chartData.coordinate),
865
- pieValue: getValue,
866
- pieSort: null,
867
- outerRadius: radius,
868
- children: (pie) => {
869
- const paths = arrayOrArray(pie.arcs).map((arc) => {
870
- return pie.path(arc);
871
- });
872
- const result = pie.arcs.map((arc) => {
873
- var _a2, _b;
874
- const name = arc.data;
875
- const arcPath = pie.path(arc);
876
- return /* @__PURE__ */ jsx(
877
- Slice,
878
- {
879
- arc,
880
- arcPath,
881
- chart,
882
- actualColor: (_b = (_a2 = colorReference.find((color) => {
883
- return color.title === name.key;
884
- })) == null ? void 0 : _a2.color) != null ? _b : ""
885
- },
886
- `${name.key}_${name.value}`
887
- );
888
- });
889
- previousPaths.current = paths;
890
- return result;
891
- }
892
- }
893
- ),
894
- /* @__PURE__ */ jsx(
895
- Pie,
896
- {
897
- data: arrayOrArray(chartData.coordinate),
898
- pieValue: getValue,
899
- pieSort: null,
900
- outerRadius: radius,
901
- children: (pie) => {
902
- return pie.arcs.map((arc) => {
903
- const name = arc.data;
904
- const angle = (arc.startAngle - Math.PI + arc.endAngle) / 2;
905
- const x = Math.cos(angle) * (radius * 0.75);
906
- const y = Math.sin(angle) * (radius * 0.75);
907
- return /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
908
- TextSlice,
909
- {
910
- arc,
911
- chart,
912
- dy: "0.33em",
913
- x,
914
- y
915
- }
916
- ) }, `arc-${name.key}-${name.value}`);
917
- });
918
- }
919
- }
920
- )
921
- ] })
922
- }
923
- )
924
- },
925
- chartData.name
926
- ),
927
- colorReference.length > 1 && /* @__PURE__ */ jsx(
928
- LegendContainer,
929
- {
930
- id: chartId,
931
- containerClassName: "legendContainer",
932
- references: colorReference
933
- }
934
- )
935
- ] });
936
- };
937
-
938
- const Bar = ({
939
- bar,
940
- barGroup,
941
- chart,
942
- parsedData,
943
- isSingle,
944
- setsWithColor
945
- }) => {
946
- var _a;
947
- const column = arrayOrArray(chart.dataSets.data)[bar.index];
948
- const set = arrayOrArray(column == null ? void 0 : column.sets)[barGroup.index];
949
- const currentBarColor = (_a = setsWithColor.find(
950
- (innerSet) => innerSet.columnName === column.name && innerSet.key === set.key
951
- )) == null ? void 0 : _a.color;
952
- const [isHighlighted, setIsHighlighted] = useState(false);
953
- const [isAnyHighlighted, setIsAnyHighlighted] = useState(false);
954
- const { open } = useTooltip({
955
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
956
- /* @__PURE__ */ jsx(
957
- "div",
958
- {
959
- style: {
960
- color: currentBarColor
961
- },
962
- children: /* @__PURE__ */ jsx("strong", { children: parsedData[barGroup.index].columnName })
963
- }
964
- ),
965
- chart.showValues && /* @__PURE__ */ jsx("div", { children: bar.value }),
966
- /* @__PURE__ */ jsx("div", { children: bar.key })
967
- ] })
968
- });
969
- useImperativeComponentEvents({
970
- highlight(barName) {
971
- if (barName.split(" - ").length === 1) {
972
- setIsHighlighted(barName === bar.key);
973
- setIsAnyHighlighted(barName !== bar.key && barName !== "");
974
- } else if (barName.split(" - ").length === 2) {
975
- setIsHighlighted(
976
- barName.split(" - ")[0] === bar.key && barName.split(" - ")[1] === set.key
977
- );
978
- setIsAnyHighlighted(
979
- barName.split(" - ")[0] !== bar.key && barName.split(" - ")[0] !== ""
980
- );
981
- }
982
- }
983
- });
984
- const { chartId } = useContext(ChartContext);
985
- return /* @__PURE__ */ jsxs("g", { children: [
986
- /* @__PURE__ */ jsx(
987
- "text",
988
- {
989
- x: bar.x + bar.width / 2,
990
- y: bar.y - 5,
991
- width: bar.width,
992
- height: bar.height,
993
- textAnchor: "middle",
994
- style: {
995
- display: isHighlighted ? "block" : "none",
996
- opacity: isHighlighted ? 1 : 0,
997
- transition: "opacity 500ms"
998
- },
999
- children: bar.value
1000
- }
1001
- ),
1002
- /* @__PURE__ */ jsxs(
1003
- Box,
1004
- {
1005
- as: "rect",
1006
- className: "chart__barRect",
1007
- sx: useMemo(
1008
- () => ({
1009
- fill: isAnyHighlighted ? `#${tinycolor(currentBarColor).desaturate(70).toHex()}` : currentBarColor,
1010
- "&:hover": {
1011
- fill: `#${tinycolor(currentBarColor).saturate(25).toHex()}`
1012
- },
1013
- transition: "fill 500ms, opacity 500ms",
1014
- x: bar.x,
1015
- y: bar.y,
1016
- width: bar.width,
1017
- opacity: isAnyHighlighted && !isHighlighted ? 0.15 : 1,
1018
- height: bar.height > 0 ? bar.height : 0
1019
- }),
1020
- [
1021
- bar.height,
1022
- bar.width,
1023
- bar.x,
1024
- bar.y,
1025
- currentBarColor,
1026
- isAnyHighlighted,
1027
- isHighlighted
1028
- ]
1029
- ),
1030
- onMouseEnter: (ev) => {
1031
- var _a2, _b, _c;
1032
- if (!isSingle) {
1033
- legendContainerMethods.highlight(chartId, bar.key);
1034
- }
1035
- (_a2 = ev.target.classList) == null ? void 0 : _a2.add("over");
1036
- const point = {
1037
- x: (_b = localPoint(ev)) == null ? void 0 : _b.x,
1038
- y: (_c = localPoint(ev)) == null ? void 0 : _c.y
1039
- };
1040
- if (!point)
1041
- return;
1042
- open({
1043
- attachToElement: () => ev.target,
1044
- attachToElementAnchorPoint: "center"
1045
- });
1046
- },
1047
- onMouseLeave: (ev) => {
1048
- var _a2;
1049
- if (!isSingle) {
1050
- legendContainerMethods.highlight(chartId, "");
1051
- }
1052
- (_a2 = ev.target.classList) == null ? void 0 : _a2.remove("over");
1053
- },
1054
- children: [
1055
- /* @__PURE__ */ jsx(
1056
- "animate",
1057
- {
1058
- attributeName: "height",
1059
- from: 0,
1060
- to: bar.height,
1061
- dur: "0.5s",
1062
- calcMode: "paced",
1063
- keySplines: "0.5 0 0.5 1;",
1064
- keyTimes: "0; 1"
1065
- }
1066
- ),
1067
- /* @__PURE__ */ jsx(
1068
- "animate",
1069
- {
1070
- attributeName: "y",
1071
- from: bar.y + bar.height,
1072
- to: bar.y,
1073
- dur: "0.5s",
1074
- calcMode: "paced",
1075
- keySplines: "0.5 0 0.5 1;",
1076
- keyTimes: "0; 1"
1077
- }
1078
- )
1079
- ]
1080
- }
1081
- )
1082
- ] });
1083
- };
1084
-
1085
- var __defProp$4 = Object.defineProperty;
1086
- var __defProps$4 = Object.defineProperties;
1087
- var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
1088
- var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
1089
- var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
1090
- var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
1091
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1092
- var __spreadValues$4 = (a, b) => {
1093
- for (var prop in b || (b = {}))
1094
- if (__hasOwnProp$4.call(b, prop))
1095
- __defNormalProp$4(a, prop, b[prop]);
1096
- if (__getOwnPropSymbols$4)
1097
- for (var prop of __getOwnPropSymbols$4(b)) {
1098
- if (__propIsEnum$4.call(b, prop))
1099
- __defNormalProp$4(a, prop, b[prop]);
1100
- }
1101
- return a;
1102
- };
1103
- var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
1104
- function adjustDimensions$2({
1105
- width,
1106
- height,
1107
- maxWidth
1108
- }) {
1109
- if (width <= maxWidth) {
1110
- return { width, height };
1111
- }
1112
- const ratio = width / height;
1113
- const newWidth = maxWidth;
1114
- const newHeight = Math.floor(newWidth / ratio);
1115
- return { width: newWidth, height: newHeight };
1116
- }
1117
- const getXValue = (d) => d.columnName;
1118
- const VerticalBars = ({
1119
- margin = { top: 20, left: 100, bottom: 150, right: 20 },
1120
- chart,
1121
- className,
1122
- chartId,
1123
- allowZoom
1124
- }) => {
1125
- var _a;
1126
- const effectiveMargin = parseMargin(margin);
1127
- if (!chart.showAxisYTitle) {
1128
- effectiveMargin.left = 50;
1129
- }
1130
- let innerWidth = chart.ratio.width + (-effectiveMargin.left - effectiveMargin.right) / 2;
1131
- let innerHeight = chart.ratio.height + (-effectiveMargin.top - effectiveMargin.bottom) / 2;
1132
- if (innerWidth > chart.ratio.maxWidth) {
1133
- const newValues = adjustDimensions$2({
1134
- height: innerHeight,
1135
- width: innerWidth,
1136
- maxWidth: chart.ratio.maxWidth
1137
- });
1138
- innerWidth = newValues.width;
1139
- innerHeight = newValues.height;
1140
- }
1141
- const styles = useChartStyles(chart.colorSchema);
1142
- const columnas = arrayOrArray((_a = chart.dataSets) == null ? void 0 : _a.data).filter((column) => !!column.sets).map((column) => {
1143
- return __spreadProps$4(__spreadValues$4({}, column), {
1144
- sets: column.sets
1145
- });
1146
- });
1147
- const xValues = arrayOrArray(columnas[0].sets).map(
1148
- (innerCoord) => innerCoord.key
1149
- );
1150
- const columnNames = columnas.map((col) => {
1151
- return col.name;
1152
- });
1153
- const parsedData = xValues.map((x) => {
1154
- const obj = columnas.reduce(
1155
- (acc, column) => {
1156
- return __spreadProps$4(__spreadValues$4({}, acc), {
1157
- [column.name]: arrayOrArray(column.sets).filter((coord) => {
1158
- return coord.key === x;
1159
- })[0].value
1160
- });
1161
- },
1162
- { columnName: x }
1163
- );
1164
- return obj;
1165
- });
1166
- const xScale = scaleBand({
1167
- range: [
1168
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.left,
1169
- innerWidth
1170
- ],
1171
- domain: parsedData.map(getXValue),
1172
- padding: 0.2
1173
- });
1174
- const columnGroupScale = scaleBand({
1175
- domain: columnNames,
1176
- range: [0, xScale.bandwidth()]
1177
- });
1178
- const yScaleLog = scaleLog({
1179
- range: [
1180
- innerHeight,
1181
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
1182
- ],
1183
- domain: [
1184
- 1,
1185
- Math.max(
1186
- ...parsedData.map(
1187
- (d) => Math.max(...columnNames.map((key) => Number(d[key])))
1188
- )
1189
- )
1190
- ],
1191
- base: 10
1192
- });
1193
- const yScaleLine = scaleLinear({
1194
- range: [
1195
- innerHeight,
1196
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
1197
- ],
1198
- domain: [
1199
- 0,
1200
- Math.max(
1201
- ...parsedData.map(
1202
- (d) => Math.max(...columnNames.map((key) => Number(d[key])))
1203
- )
1204
- )
1205
- ]
1206
- });
1207
- const color = scaleOrdinal({
1208
- domain: columnNames,
1209
- range: columnas.map((col) => col.color)
1210
- });
1211
- const parameters = usePanelParametersSelector((global) => {
1212
- return global;
1213
- });
1214
- const scale = parameters.PRMT_CHART_SCALE;
1215
- const isLogScale = scale === "0";
1216
- const yScale = useMemo(() => {
1217
- if (!isLogScale) {
1218
- return yScaleLine;
1219
- }
1220
- return yScaleLog;
1221
- }, [isLogScale, yScaleLine, yScaleLog]);
1222
- const id = useMemo(() => `VerticalBars${uniqueId()}`, []);
1223
- useLayoutEffect(() => {
1224
- document.querySelectorAll(`#${id} .tickLabel`).forEach((current) => {
1225
- const width = current.getBoundingClientRect().width;
1226
- current.style.transformOrigin = current.getAttribute("x") + "px 14px";
1227
- current.style.transform = `rotate(25deg) translateX(${width / 2}px)`;
1228
- });
1229
- });
1230
- const { boxRef, elementRef } = usePanAndZoom(
1231
- void 0,
1232
- !allowZoom
1233
- );
1234
- const setsWithColor = arrayOrArray(chart.dataSets.data).map((data, index) => {
1235
- const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
1236
- const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(styles.schema).length > 0 ? getBarColor(arrayOrArray(styles.schema), index, isSingle) : "";
1237
- const returnColumnsArray = [];
1238
- arrayOrArray(data.sets).forEach((set) => {
1239
- if (set.color !== "" && set.color !== void 0) {
1240
- returnColumnsArray.push(__spreadProps$4(__spreadValues$4({}, set), { columnName: data.name }));
1241
- } else {
1242
- returnColumnsArray.push(__spreadProps$4(__spreadValues$4({}, set), {
1243
- color: dataColor,
1244
- columnName: data.name
1245
- }));
1246
- }
1247
- });
1248
- return returnColumnsArray;
1249
- });
1250
- const colorReference = arrayOrArray(chart.dataSets.data).map(
1251
- (data, index) => {
1252
- const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
1253
- const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(styles.schema).length > 0 ? getBarColor(arrayOrArray(styles.schema), index, isSingle) : "";
1254
- return {
1255
- color: dataColor,
1256
- title: data.name
1257
- };
1258
- }
1259
- );
1260
- arrayOrArray(chart.dataSets.data).map((data) => {
1261
- const returnArray = [];
1262
- arrayOrArray(data.sets).forEach((set) => {
1263
- if (set.color !== "" && set.color !== void 0) {
1264
- returnArray.push({
1265
- color: set.color,
1266
- title: data.name + " - " + set.key
1267
- });
1268
- }
1269
- });
1270
- return returnArray;
1271
- }).flat().forEach((addRef) => colorReference.push(addRef));
1272
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1273
- /* @__PURE__ */ jsx(
1274
- Box,
1275
- {
1276
- ref: boxRef,
1277
- id,
1278
- className: `${className != null ? className : ""} ${chart.title}`,
1279
- sx: {
1280
- overflow: "hidden"
1281
- },
1282
- children: /* @__PURE__ */ jsxs(
1283
- "svg",
1284
- {
1285
- ref: elementRef,
1286
- className: `_${chartId} chart__svg`,
1287
- height: chart.ratio.height,
1288
- width: chart.ratio.width,
1289
- children: [
1290
- chart.showGrid && /* @__PURE__ */ jsx(
1291
- Grid.Grid,
1292
- {
1293
- xScale,
1294
- yScale,
1295
- left: 0,
1296
- width: innerWidth,
1297
- height: innerHeight,
1298
- numTicksRows: 10,
1299
- numTicksColumns: 10,
1300
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20
1301
- }
1302
- ),
1303
- /* @__PURE__ */ jsx(
1304
- Group,
1305
- {
1306
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
1307
- children: /* @__PURE__ */ jsx(
1308
- BarGroup,
1309
- {
1310
- data: parsedData,
1311
- keys: columnNames,
1312
- height: innerHeight,
1313
- x0: getXValue,
1314
- x0Scale: xScale,
1315
- x1Scale: columnGroupScale,
1316
- yScale,
1317
- color,
1318
- children: (barGroups) => barGroups.map((barGroup) => {
1319
- return /* @__PURE__ */ jsx(
1320
- Group,
1321
- {
1322
- left: barGroup.x0,
1323
- children: barGroup.bars.map((bar) => {
1324
- const key = `${barGroup.index}-${bar.index}-${bar.key}`;
1325
- return /* @__PURE__ */ jsx(
1326
- Bar,
1327
- {
1328
- isSingle: barGroup.bars.length === 1,
1329
- bar,
1330
- barGroup,
1331
- chart,
1332
- parsedData,
1333
- setsWithColor: setsWithColor.flat()
1334
- },
1335
- key
1336
- );
1337
- })
1338
- },
1339
- `bar-group-${barGroup.index}-${barGroup.x0}`
1340
- );
1341
- })
1342
- }
1343
- )
1344
- }
1345
- ),
1346
- /* @__PURE__ */ jsx(
1347
- AxisLeft,
1348
- {
1349
- scale: yScale,
1350
- left: effectiveMargin.left,
1351
- label: chart.chartType !== "pie2D" && chart.showAxisYTitle ? chart.axisYTitle : ""
1352
- }
1353
- ),
1354
- /* @__PURE__ */ jsx(
1355
- AxisBottom,
1356
- {
1357
- top: innerHeight,
1358
- scale: xScale,
1359
- label: chart.chartType !== "pie2D" && chart.showAxisXTitle ? chart.axisXTitle : "",
1360
- tickLabelProps: {
1361
- className: "tickLabel"
1362
- },
1363
- labelOffset: 50
1364
- }
1365
- )
1366
- ]
1367
- }
1368
- )
1369
- }
1370
- ),
1371
- colorReference.length > 1 && /* @__PURE__ */ jsx(
1372
- LegendContainer,
1373
- {
1374
- id: chartId,
1375
- containerClassName: "legendContainer",
1376
- references: (
1377
- // hideLegendsColors
1378
- // ? colorReference.map((ref) => {
1379
- // return { ...ref, color: 'transparent' };
1380
- // })
1381
- colorReference
1382
- )
1383
- }
1384
- )
1385
- ] });
1386
- };
1387
-
1388
- const Node = ({
1389
- currentCircle,
1390
- innerKey,
1391
- cx,
1392
- cy,
1393
- // coordinate,
1394
- color,
1395
- setCurrentCircle
1396
- }) => {
1397
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1398
- currentCircle.includes(innerKey) && /* @__PURE__ */ jsx(
1399
- "circle",
1400
- {
1401
- r: 6,
1402
- cx,
1403
- cy,
1404
- stroke: `#${tinycolor(color).saturate(25).toHex()}`,
1405
- fill: `#${tinycolor(color).saturate(25).toHex()}`
1406
- }
1407
- ),
1408
- /* @__PURE__ */ jsx(
1409
- "circle",
1410
- {
1411
- r: 3,
1412
- cx,
1413
- cy,
1414
- stroke: `#${tinycolor(color).darken(15).toHex()}`,
1415
- fill: `#${tinycolor(color).darken(15).toHex()}`
1416
- }
1417
- ),
1418
- /* @__PURE__ */ jsx(
1419
- "circle",
1420
- {
1421
- r: 10,
1422
- cx,
1423
- cy,
1424
- stroke: "transparent",
1425
- fill: "transparent",
1426
- onMouseEnter: () => {
1427
- setCurrentCircle([innerKey]);
1428
- },
1429
- onMouseLeave: () => {
1430
- setCurrentCircle([]);
1431
- },
1432
- style: { cursor: "pointer" }
1433
- }
1434
- )
1435
- ] }, innerKey);
1436
- };
1437
-
1438
- var __defProp$3 = Object.defineProperty;
1439
- var __defProps$3 = Object.defineProperties;
1440
- var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
1441
- var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
1442
- var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
1443
- var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
1444
- var __pow = Math.pow;
1445
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1446
- var __spreadValues$3 = (a, b) => {
1447
- for (var prop in b || (b = {}))
1448
- if (__hasOwnProp$3.call(b, prop))
1449
- __defNormalProp$3(a, prop, b[prop]);
1450
- if (__getOwnPropSymbols$3)
1451
- for (var prop of __getOwnPropSymbols$3(b)) {
1452
- if (__propIsEnum$3.call(b, prop))
1453
- __defNormalProp$3(a, prop, b[prop]);
1454
- }
1455
- return a;
1456
- };
1457
- var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
1458
- function adjustDimensions$1({
1459
- width,
1460
- height,
1461
- maxWidth
1462
- }) {
1463
- if (width <= maxWidth) {
1464
- return { width, height };
1465
- }
1466
- const ratio = width / height;
1467
- const newWidth = maxWidth;
1468
- const newHeight = Math.floor(newWidth / ratio);
1469
- return { width: newWidth, height: newHeight };
1470
- }
1471
- function getX(coordinate) {
1472
- return coordinate.key;
1473
- }
1474
- function getY(coordinate) {
1475
- return Number(coordinate.value);
1476
- }
1477
- function parseData(chart) {
1478
- var _a, _b, _c, _d, _e, _f, _g;
1479
- const columns = arrayOrArray((_a = chart.dataSets) == null ? void 0 : _a.data);
1480
- const data = columns.map((column) => column.sets);
1481
- const allData = data.reduce(
1482
- (rec, d) => arrayOrArray(rec).concat(d),
1483
- []
1484
- );
1485
- return {
1486
- columns,
1487
- xScale: scaleOrdinal({
1488
- domain: arrayOrArray(columns[0].sets).map(getX)
1489
- }),
1490
- yScale: scaleLinear({
1491
- domain: [
1492
- ((_b = min(allData, getY)) != null ? _b : 0 < 0) ? (_c = min(allData, getY)) != null ? _c : 0 : 0,
1493
- (_d = max(allData, getY)) != null ? _d : 1
1494
- ]
1495
- }),
1496
- yScaleLog: scaleLog({
1497
- domain: [
1498
- ((_e = min(allData, getY)) != null ? _e : 1 > 0) ? (_f = min(allData, getY)) != null ? _f : 1 : 1,
1499
- (_g = max(allData, getY)) != null ? _g : 10
1500
- ]
1501
- })
1502
- };
1503
- }
1504
- const LineChart = ({
1505
- chart,
1506
- margin = { top: 20, left: 100, bottom: 150, right: 70 },
1507
- chartId,
1508
- allowZoom
1509
- }) => {
1510
- const effectiveMargin = parseMargin(margin);
1511
- if (!chart.showAxisYTitle) {
1512
- effectiveMargin.left = 50;
1513
- }
1514
- let innerWidth = chart.ratio.width;
1515
- let innerHeight = chart.ratio.height - (effectiveMargin.top + effectiveMargin.bottom) / 2;
1516
- if (innerWidth > chart.ratio.maxWidth) {
1517
- const newValues = adjustDimensions$1({
1518
- height: innerHeight,
1519
- width: innerWidth,
1520
- maxWidth: chart.ratio.maxWidth
1521
- });
1522
- innerWidth = newValues.width;
1523
- innerHeight = newValues.height;
1524
- }
1525
- const { columns, xScale, yScale, yScaleLog } = parseData(chart);
1526
- const styles = useChartStyles(chart.colorSchema);
1527
- const coordinates = arrayOrArray(columns[0].sets);
1528
- const coordinatesArray = columns.map((col) => {
1529
- return col.sets;
1530
- });
1531
- const step = innerWidth / coordinates.length;
1532
- xScale.range(
1533
- coordinates.map((_, i) => {
1534
- if (i === 0) {
1535
- return effectiveMargin.left;
1536
- }
1537
- return i * step + effectiveMargin.left;
1538
- })
1539
- );
1540
- yScale.range([
1541
- innerHeight - (effectiveMargin.top + effectiveMargin.bottom) / 2,
1542
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
1543
- ]);
1544
- yScaleLog.range([
1545
- innerHeight,
1546
- typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top
1547
- ]);
1548
- const [currentCircle, setCurrentCircle] = useState([]);
1549
- const actualYScale = useMemo(() => {
1550
- return yScale;
1551
- }, [yScale]);
1552
- const id = useMemo(() => `VerticalBars${uniqueId()}`, []);
1553
- useLayoutEffect(() => {
1554
- document.querySelectorAll(`#${id} .tickLabel`).forEach((current) => {
1555
- const width = current.getBoundingClientRect().width;
1556
- current.style.transformOrigin = current.getAttribute("x") + "px 14px";
1557
- current.style.transform = `rotate(25deg) translateX(${width / 2}px)`;
1558
- });
1559
- });
1560
- function addNameToProps(names, objects, fixedValue) {
1561
- return objects.map((object, index) => {
1562
- const nameIndex = Math.floor(index / fixedValue);
1563
- const name = names[nameIndex];
1564
- return __spreadProps$3(__spreadValues$3({}, object), { columnName: name });
1565
- });
1566
- }
1567
- const [nodes, setNodes] = useState([]);
1568
- useEffect(() => {
1569
- const coords = coordinatesArray.flat().map((coord) => {
1570
- return {
1571
- xValue: coord.key,
1572
- yValue: coord.value,
1573
- x: xScale(getX(coord)),
1574
- y: actualYScale(getY(coord))
1575
- };
1576
- });
1577
- const columnNames = columns.map((column) => {
1578
- return column.name;
1579
- });
1580
- const nodesData = addNameToProps(columnNames, coords, coordinates.length);
1581
- setNodes(nodesData);
1582
- }, []);
1583
- const [nearNodesArray, setNearNodesArray] = useState([]);
1584
- const previousNearNodesArray = usePrevious(nearNodesArray);
1585
- const setsWithColor = arrayOrArray(chart.dataSets.data).map((data, index) => {
1586
- const isSingle = arrayOrArray(chart.dataSets.data).length === 1;
1587
- const dataColor = data.color !== "" && data.color !== void 0 ? data.color : arrayOrArray(styles.schema).length > 0 ? getBarColor(arrayOrArray(styles.schema), index, isSingle) : "";
1588
- const returnColumnsArray = [];
1589
- arrayOrArray(data.sets).forEach((set) => {
1590
- if (set.color !== "" && set.color !== void 0) {
1591
- returnColumnsArray.push(__spreadProps$3(__spreadValues$3({}, set), { columnName: data.name }));
1592
- } else {
1593
- returnColumnsArray.push(__spreadProps$3(__spreadValues$3({}, set), {
1594
- color: dataColor,
1595
- columnName: data.name
1596
- }));
1597
- }
1598
- });
1599
- return { returnColumnsArray, columnColor: dataColor };
1600
- });
1601
- const colorReference = setsWithColor.map((column) => {
1602
- var _a;
1603
- return {
1604
- color: (_a = column.columnColor) != null ? _a : "",
1605
- title: column.returnColumnsArray[0].columnName
1606
- };
1607
- });
1608
- arrayOrArray(chart.dataSets.data).map((data) => {
1609
- const returnArray = [];
1610
- arrayOrArray(data.sets).forEach((set) => {
1611
- if (set.color !== "" && set.color !== void 0) {
1612
- returnArray.push({
1613
- color: set.color,
1614
- title: data.name + " - " + set.key
1615
- });
1616
- }
1617
- });
1618
- return returnArray;
1619
- }).flat().forEach((addRef) => colorReference.push(addRef));
1620
- const { open } = useTooltip({
1621
- children: nearNodesArray.sort((a, b) => Number(b.yValue) - Number(a.yValue)).map((node, i) => {
1622
- const useSpecific = colorReference.some(
1623
- (ref) => ref.title === node.columnName + " - " + node.xValue
1624
- );
1625
- return /* @__PURE__ */ jsxs(Box, { children: [
1626
- /* @__PURE__ */ jsx(
1627
- "div",
1628
- {
1629
- style: {
1630
- color: colorReference[colorReference.findIndex((ref) => {
1631
- return ref.title === (useSpecific ? node.columnName + " - " + node.xValue : node.columnName);
1632
- })].color
1633
- },
1634
- children: /* @__PURE__ */ jsx("strong", { children: node.columnName })
1635
- }
1636
- ),
1637
- chart.showValues && /* @__PURE__ */ jsx("div", { children: node.yValue }),
1638
- /* @__PURE__ */ jsx("div", { children: node.xValue }),
1639
- nearNodesArray[i + 1] && /* @__PURE__ */ jsx("hr", {})
1640
- ] }, `${node.columnName}_${node.xValue}_${node.yValue}`);
1641
- })
1642
- });
1643
- const [highlightedBar, setHighlightedBar] = useState("");
1644
- useImperativeComponentEvents({
1645
- highlight(barName) {
1646
- if (barName.split(" - ").length === 1) {
1647
- setHighlightedBar(barName);
1648
- } else if (barName.split(" - ").length === 2) {
1649
- setHighlightedBar(barName.split(" - ")[0]);
1650
- }
1651
- }
1652
- });
1653
- const { boxRef, elementRef } = usePanAndZoom(
1654
- void 0,
1655
- !allowZoom
1656
- );
1657
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1658
- /* @__PURE__ */ jsx(Box, { id, ref: boxRef, children: /* @__PURE__ */ jsxs(
1659
- "svg",
1660
- {
1661
- ref: elementRef,
1662
- width: innerWidth,
1663
- height: innerHeight,
1664
- id: "LinesChart",
1665
- className: `_${chartId} chart__svg`,
1666
- onMouseMove: (ev) => {
1667
- var _a;
1668
- const rect = (_a = elementRef.current) == null ? void 0 : _a.getBoundingClientRect();
1669
- let clientX = ev.clientX;
1670
- let clientY = ev.clientY - (effectiveMargin.top + effectiveMargin.bottom) / 2;
1671
- if (rect) {
1672
- clientX = ev.clientX - rect.left;
1673
- clientY = ev.clientY - rect.top;
1674
- }
1675
- const nearNodes = nodes.filter((node) => {
1676
- return Math.sqrt(__pow(node.x - clientX, 2) + __pow(node.y - clientY, 2)) < 20;
1677
- });
1678
- if (previousNearNodesArray.current && nearNodes.length > 0) {
1679
- const currentColumns = columns.map((col) => {
1680
- let colNames = "";
1681
- nearNodes.forEach((node) => {
1682
- if (col.name === node.columnName) {
1683
- colNames = node.columnName;
1684
- }
1685
- });
1686
- return colNames;
1687
- }).filter((name) => name !== "");
1688
- const currentIndex = coordinates.findIndex((coord) => {
1689
- return coord.key === nearNodes[0].xValue;
1690
- });
1691
- if (currentColumns && currentIndex !== void 0) {
1692
- const newCircleValues = currentColumns.map((col) => {
1693
- return `${col}${currentIndex}`;
1694
- });
1695
- setCurrentCircle([...newCircleValues]);
1696
- }
1697
- setNearNodesArray(nearNodes);
1698
- open({
1699
- attachToElement: () => ev.target,
1700
- attachToElementAnchorPoint: "center"
1701
- });
1702
- } else if (nearNodes.length === 0) {
1703
- setCurrentCircle([]);
1704
- }
1705
- },
1706
- children: [
1707
- chart.showGrid && /* @__PURE__ */ jsx(
1708
- Grid.Grid,
1709
- {
1710
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
1711
- left: 0,
1712
- xScale,
1713
- yScale: actualYScale,
1714
- width: innerWidth,
1715
- height: innerHeight,
1716
- stroke: styles.grid.stroke,
1717
- strokeOpacity: styles.grid.opacity
1718
- }
1719
- ),
1720
- columns.map((column, i) => {
1721
- var _a;
1722
- const currentCoordinates = arrayOrArray(column.sets);
1723
- const newColor = (_a = setsWithColor.find(
1724
- (data) => data.returnColumnsArray[0].columnName === column.name
1725
- )) == null ? void 0 : _a.columnColor;
1726
- return /* @__PURE__ */ jsxs(
1727
- Group,
1728
- {
1729
- top: (typeof effectiveMargin === "number" ? effectiveMargin : effectiveMargin.top) - 20,
1730
- style: {
1731
- opacity: highlightedBar !== "" && highlightedBar !== column.name ? 0.15 : 1,
1732
- transition: "opacity 500ms"
1733
- },
1734
- children: [
1735
- /* @__PURE__ */ jsx(
1736
- LinePath,
1737
- {
1738
- curve: allCurves.curveMonotoneX,
1739
- data: currentCoordinates,
1740
- x: (coordinate) => {
1741
- var _a2;
1742
- return (_a2 = xScale(getX(coordinate))) != null ? _a2 : 0;
1743
- },
1744
- y: (coordinate) => {
1745
- var _a2;
1746
- return (_a2 = actualYScale(getY(coordinate))) != null ? _a2 : 0;
1747
- },
1748
- stroke: newColor != null ? newColor : "black",
1749
- strokeWidth: 2,
1750
- strokeOpacity: 1,
1751
- shapeRendering: "geometricPrecision"
1752
- }
1753
- ),
1754
- currentCoordinates.map((coordinate, j) => {
1755
- var _a2;
1756
- const key = column.name + j.toString();
1757
- const realColor = (_a2 = setsWithColor.map((sets) => sets.returnColumnsArray).flat().find(
1758
- (set) => set.columnName === column.name && set.key === coordinate.key
1759
- )) == null ? void 0 : _a2.color;
1760
- return /* @__PURE__ */ jsxs("g", { children: [
1761
- /* @__PURE__ */ jsx(
1762
- "text",
1763
- {
1764
- x: xScale(getX(coordinate)) + 10,
1765
- y: actualYScale(getY(coordinate)) - 5,
1766
- textAnchor: "middle",
1767
- style: {
1768
- display: highlightedBar === column.name ? "block" : "none",
1769
- opacity: highlightedBar === column.name ? 1 : 0,
1770
- transition: "opacity 500ms"
1771
- },
1772
- children: coordinate.value
1773
- }
1774
- ),
1775
- /* @__PURE__ */ jsx(
1776
- Node,
1777
- {
1778
- color: realColor != null ? realColor : "black",
1779
- coordinate,
1780
- currentCircle,
1781
- cx: xScale(getX(coordinate)),
1782
- cy: actualYScale(getY(coordinate)),
1783
- setCurrentCircle,
1784
- innerKey: key,
1785
- column
1786
- }
1787
- )
1788
- ] }, key);
1789
- })
1790
- ]
1791
- },
1792
- `lines-${column.name + i.toString()}`
1793
- );
1794
- }),
1795
- /* @__PURE__ */ jsx(
1796
- AxisLeft,
1797
- {
1798
- scale: actualYScale,
1799
- left: effectiveMargin.left,
1800
- label: chart.chartType !== "pie2D" && chart.showAxisYTitle ? chart.axisYTitle : ""
1801
- }
1802
- ),
1803
- /* @__PURE__ */ jsx(
1804
- AxisBottom,
1805
- {
1806
- top: innerHeight - (effectiveMargin.top + effectiveMargin.bottom) / 2,
1807
- scale: xScale,
1808
- label: chart.chartType !== "pie2D" && chart.showAxisXTitle ? chart.axisXTitle : "",
1809
- tickLabelProps: {
1810
- className: "tickLabel"
1811
- },
1812
- labelOffset: 50
1813
- }
1814
- )
1815
- ]
1816
- }
1817
- ) }),
1818
- colorReference.length > 1 && /* @__PURE__ */ jsx(
1819
- LegendContainer,
1820
- {
1821
- id: chartId,
1822
- containerClassName: "legendContainer",
1823
- references: colorReference
1824
- }
1825
- )
1826
- ] });
1827
- };
1828
-
1829
- const WaterfallBar = ({
1830
- width,
1831
- height,
1832
- x,
1833
- y,
1834
- fill,
1835
- x1,
1836
- lineY,
1837
- x2,
1838
- stroke,
1839
- strokeDashArray,
1840
- textX,
1841
- textY,
1842
- textContent,
1843
- isLast,
1844
- step,
1845
- columnName,
1846
- chart
1847
- }) => {
1848
- const { open } = useTooltip({
1849
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
1850
- /* @__PURE__ */ jsx(
1851
- "div",
1852
- {
1853
- style: {
1854
- color: step.color
1855
- },
1856
- children: /* @__PURE__ */ jsx("strong", { children: columnName })
1857
- }
1858
- ),
1859
- chart.showValues && /* @__PURE__ */ jsx("div", { children: step.y }),
1860
- /* @__PURE__ */ jsx("div", { children: step.x })
1861
- ] })
1862
- });
1863
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1864
- /* @__PURE__ */ jsx(
1865
- Box,
1866
- {
1867
- as: "rect",
1868
- sx: useMemo(() => {
1869
- return {
1870
- width: `${width}px`,
1871
- height: `${height}px`,
1872
- x: `${x}px`,
1873
- y: `${y}px`,
1874
- fill: `${fill}`,
1875
- "&:hover": {
1876
- fill: `#${tinycolor(fill).saturate(25).toHex()}`
1877
- },
1878
- transition: "fill 500ms"
1879
- };
1880
- }, [fill, height, width, x, y]),
1881
- onMouseEnter: (ev) => {
1882
- open({
1883
- attachToElement: () => ev.target,
1884
- attachToElementAnchorPoint: "center"
1885
- });
1886
- },
1887
- onMouseLeave: () => {
1888
- }
1889
- }
1890
- ),
1891
- !isLast && /* @__PURE__ */ jsx(
1892
- Line,
1893
- {
1894
- x1,
1895
- x2,
1896
- y1: lineY,
1897
- y2: lineY,
1898
- stroke,
1899
- strokeDasharray: strokeDashArray
1900
- }
1901
- ),
1902
- /* @__PURE__ */ jsx("text", { textAnchor: "middle", x: textX, y: textY, children: textContent })
1903
- ] });
1904
- };
1905
-
1906
- var __defProp$2 = Object.defineProperty;
1907
- var __defProps$2 = Object.defineProperties;
1908
- var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
1909
- var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
1910
- var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
1911
- var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
1912
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1913
- var __spreadValues$2 = (a, b) => {
1914
- for (var prop in b || (b = {}))
1915
- if (__hasOwnProp$2.call(b, prop))
1916
- __defNormalProp$2(a, prop, b[prop]);
1917
- if (__getOwnPropSymbols$2)
1918
- for (var prop of __getOwnPropSymbols$2(b)) {
1919
- if (__propIsEnum$2.call(b, prop))
1920
- __defNormalProp$2(a, prop, b[prop]);
1921
- }
1922
- return a;
1923
- };
1924
- var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
1925
- var __objRest = (source, exclude) => {
1926
- var target = {};
1927
- for (var prop in source)
1928
- if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0)
1929
- target[prop] = source[prop];
1930
- if (source != null && __getOwnPropSymbols$2)
1931
- for (var prop of __getOwnPropSymbols$2(source)) {
1932
- if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop))
1933
- target[prop] = source[prop];
1934
- }
1935
- return target;
1936
- };
1937
- const calculateWaterfallSteps = ({
1938
- data,
1939
- xAccessor,
1940
- yAccessor,
1941
- showFinal,
1942
- colors
1943
- }) => {
1944
- let cumulativeTotal = 0;
1945
- const steps = data.map((datum) => {
1946
- const xValue = xAccessor(datum);
1947
- const yValue = yAccessor(datum);
1948
- const prevTotal = cumulativeTotal;
1949
- cumulativeTotal += Number(yValue);
1950
- return {
1951
- x: xValue,
1952
- y: yValue,
1953
- start: prevTotal,
1954
- end: cumulativeTotal,
1955
- color: Number(yValue) > 0 ? colors.positive : colors.negative
1956
- };
1957
- });
1958
- if (showFinal) {
1959
- steps.push({
1960
- x: "Total",
1961
- y: cumulativeTotal,
1962
- start: 0,
1963
- end: cumulativeTotal,
1964
- color: colors.total
1965
- });
1966
- }
1967
- return steps;
1968
- };
1969
- function adjustDimensions({
1970
- width,
1971
- height,
1972
- maxWidth
1973
- }) {
1974
- if (width <= maxWidth) {
1975
- return { width, height };
1976
- }
1977
- const ratio = width / height;
1978
- const newWidth = maxWidth;
1979
- const newHeight = Math.floor(newWidth / ratio);
1980
- return { width: newWidth, height: newHeight };
1981
- }
1982
- const WaterfallBars = (_a) => {
1983
- var _b = _a, {
1984
- margin = { top: 20, left: 100, bottom: 150, right: 70 },
1985
- chart: _c
1986
- } = _b, _d = _c, {
1987
- waterfallColors = {
1988
- positive: "#49b86f",
1989
- negative: "#c92e5b",
1990
- total: "#434857",
1991
- stepConnector: "#888d94"
1992
- }
1993
- } = _d, chart = __objRest(_d, [
1994
- "waterfallColors"
1995
- ]), {
1996
- className,
1997
- chartId,
1998
- allowZoom
1999
- } = _b;
2000
- var _a2;
2001
- const effectiveMargin = parseMargin(margin);
2002
- if (!chart.showAxisYTitle) {
2003
- effectiveMargin.left = 50;
2004
- }
2005
- let innerWidth = chart.ratio.width + (-effectiveMargin.left - effectiveMargin.right) / 2;
2006
- let innerHeight = chart.ratio.height + (-effectiveMargin.top - effectiveMargin.bottom) / 2;
2007
- if (innerWidth > chart.ratio.maxWidth) {
2008
- const newValues = adjustDimensions({
2009
- height: innerHeight,
2010
- width: innerWidth,
2011
- maxWidth: chart.ratio.maxWidth
2012
- });
2013
- innerWidth = newValues.width;
2014
- innerHeight = newValues.height;
2015
- }
2016
- const getXValue = (d) => d.key;
2017
- const getYValue = (d) => d.value;
2018
- const charts = arrayOrArray((_a2 = chart.dataSets) == null ? void 0 : _a2.data).filter((piece) => !!piece.sets).map((piece) => {
2019
- return __spreadProps$2(__spreadValues$2({}, piece), {
2020
- coordinate: piece.sets
2021
- });
2022
- });
2023
- const [currentPie, setCurrentPie] = useState("0");
2024
- const chartNames = charts.map((piece) => {
2025
- return piece.name;
2026
- });
2027
- const steps = useMemo(
2028
- () => {
2029
- var _a3;
2030
- return calculateWaterfallSteps({
2031
- data: arrayOrArray(chart.dataSets.data)[currentPie].sets,
2032
- xAccessor: getXValue,
2033
- yAccessor: getYValue,
2034
- showFinal: (_a3 = chart.showTotal) != null ? _a3 : true,
2035
- colors: waterfallColors
2036
- });
2037
- },
2038
- [chart.dataSets.data, chart.showTotal, currentPie, waterfallColors]
2039
- );
2040
- const padding = 0.2;
2041
- const xScale = scaleBand({
2042
- domain: steps.map((step) => step.x),
2043
- padding,
2044
- range: [0, innerWidth]
2045
- });
2046
- const yDomain = useMemo(() => {
2047
- const values = steps.flatMap((step) => [step.start, step.end]);
2048
- const [min, max] = extent(values);
2049
- return min != null && max != null ? [min - 5, max + 5] : void 0;
2050
- }, [steps]);
2051
- const yScale = scaleLinear({
2052
- domain: yDomain,
2053
- nice: true,
2054
- range: [innerHeight, 0]
2055
- });
2056
- const id = useMemo(() => `VerticalBars${uniqueId()}`, []);
2057
- useLayoutEffect(() => {
2058
- document.querySelectorAll(`#${id} .tickLabel`).forEach((current) => {
2059
- const width = current.getBoundingClientRect().width;
2060
- current.style.transformOrigin = current.getAttribute("x") + "px 14px";
2061
- current.style.transform = `rotate(25deg) translateX(${width / 2}px)`;
2062
- });
2063
- });
2064
- const { boxRef, elementRef } = usePanAndZoom(
2065
- void 0,
2066
- !allowZoom
2067
- );
2068
- return /* @__PURE__ */ jsxs(Fragment, { children: [
2069
- charts.length > 1 && /* @__PURE__ */ jsx(Box, { className: "chart__combo__wrapper", children: /* @__PURE__ */ jsx(
2070
- ChartSelector,
2071
- {
2072
- chartId,
2073
- pieces: chartNames,
2074
- className: "chartSelectorCombo",
2075
- current: currentPie,
2076
- setCurrent: setCurrentPie
2077
- }
2078
- ) }),
2079
- /* @__PURE__ */ jsx(Box, { id, className, ref: boxRef, children: /* @__PURE__ */ jsx(
2080
- "svg",
2081
- {
2082
- height: chart.ratio.height,
2083
- width: chart.ratio.width,
2084
- ref: elementRef,
2085
- children: /* @__PURE__ */ jsxs(Group, { left: effectiveMargin.left, top: effectiveMargin.top, children: [
2086
- /* @__PURE__ */ jsx(GridRows, { scale: yScale, width: innerWidth, strokeDasharray: "5" }),
2087
- steps.map((step, index) => {
2088
- var _a3;
2089
- const x = xScale(step.x);
2090
- const y = yScale(Math.max(step.start, step.end));
2091
- if (x == null || y == null) {
2092
- return null;
2093
- }
2094
- const barHeight = Math.abs(yScale(step.start) - yScale(step.end));
2095
- const isLast = index === steps.length - 1;
2096
- const linePadding = 2;
2097
- const x1 = x + xScale.bandwidth() + linePadding;
2098
- const x2 = x + xScale.bandwidth() / (1 - padding) - linePadding;
2099
- const lineY = step.end < step.start ? y + barHeight : y;
2100
- const labelOffset = 10;
2101
- const labelY = yScale(step.end) + (step.y < 0 ? labelOffset : -labelOffset);
2102
- let currentYValue = 0;
2103
- steps.filter((_, i) => {
2104
- var _a4;
2105
- if (((_a4 = chart.showTotal) != null ? _a4 : true) && !steps[i + 1]) {
2106
- return false;
2107
- }
2108
- return i <= index;
2109
- }).forEach((step2) => {
2110
- currentYValue += Number(step2.y);
2111
- });
2112
- return /* @__PURE__ */ jsx(
2113
- WaterfallBar,
2114
- {
2115
- chart,
2116
- columnName: chartNames[currentPie],
2117
- fill: step.color,
2118
- height: barHeight,
2119
- isLast,
2120
- lineY,
2121
- step,
2122
- stroke: waterfallColors.stepConnector,
2123
- strokeDashArray: 2,
2124
- textContent: ((_a3 = chart.showTotal) != null ? _a3 : true) ? step.y : currentYValue,
2125
- textX: x + xScale.bandwidth() / 2,
2126
- textY: labelY + 5,
2127
- width: xScale.bandwidth(),
2128
- x,
2129
- y,
2130
- x1,
2131
- x2
2132
- },
2133
- index
2134
- );
2135
- }),
2136
- /* @__PURE__ */ jsx(
2137
- AxisLeft,
2138
- {
2139
- label: "",
2140
- scale: yScale,
2141
- hideAxisLine: true,
2142
- hideTicks: true,
2143
- tickLabelProps: () => ({
2144
- textAnchor: "end",
2145
- verticalAnchor: "middle"
2146
- })
2147
- }
2148
- ),
2149
- /* @__PURE__ */ jsx(
2150
- AxisBottom,
2151
- {
2152
- scale: xScale,
2153
- top: innerHeight,
2154
- tickLabelProps: () => ({
2155
- textAnchor: "middle",
2156
- verticalAnchor: "middle",
2157
- className: "tickLabel"
2158
- })
2159
- }
2160
- )
2161
- ] })
2162
- }
2163
- ) }),
2164
- /* @__PURE__ */ jsx(
2165
- LegendContainer,
2166
- {
2167
- id: chartId,
2168
- avoidEvent: true,
2169
- references: [
2170
- {
2171
- title: arrayOrArray(chart.dataSets.data)[currentPie].name,
2172
- color: "transparent"
2173
- }
2174
- ]
2175
- }
2176
- )
2177
- ] });
2178
- };
2179
-
2180
- var __defProp$1 = Object.defineProperty;
2181
- var __defProps$1 = Object.defineProperties;
2182
- var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
2183
- var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
2184
- var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
2185
- var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
2186
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2187
- var __spreadValues$1 = (a, b) => {
2188
- for (var prop in b || (b = {}))
2189
- if (__hasOwnProp$1.call(b, prop))
2190
- __defNormalProp$1(a, prop, b[prop]);
2191
- if (__getOwnPropSymbols$1)
2192
- for (var prop of __getOwnPropSymbols$1(b)) {
2193
- if (__propIsEnum$1.call(b, prop))
2194
- __defNormalProp$1(a, prop, b[prop]);
2195
- }
2196
- return a;
2197
- };
2198
- var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
2199
- const frontColor = "hsl(196, 37%, 13%)";
2200
- function useMultipleRefs(...refs) {
2201
- return React.useCallback(
2202
- function setRef(element) {
2203
- refs.forEach((current) => {
2204
- if (current)
2205
- current.current = element;
2206
- });
2207
- },
2208
- [refs]
2209
- );
2210
- }
2211
- const [, chartMethods, ChartRenderer] = makeImperativeComponent()({
2212
- Component: makeStyledComponent(
2213
- "ChartRenderer",
2214
- "layout.charts",
2215
- {
2216
- red: {
2217
- schema: "schemas.red"
2218
- },
2219
- orange: {
2220
- schema: "schemas.orange"
2221
- },
2222
- green: {
2223
- schema: "schemas.green"
2224
- },
2225
- blue: {
2226
- schema: "schemas.blue"
2227
- },
2228
- violet: {
2229
- schema: "schemas.violet"
2230
- },
2231
- turquoise: {
2232
- schema: "schemas.turquoise"
2233
- },
2234
- yellow: {
2235
- schema: "schemas.yellow"
2236
- },
2237
- grey: {
2238
- schema: "schemas.grey"
2239
- },
2240
- ocean: {
2241
- schema: "schemas.ocean"
2242
- },
2243
- sunset: {
2244
- schema: "schemas.sunset"
2245
- },
2246
- common: {
2247
- axis: {
2248
- stroke: frontColor,
2249
- title: frontColor
2250
- },
2251
- schema: frontColor,
2252
- background: "hsl(200deg 20% 98%)",
2253
- grid: {
2254
- stroke: frontColor,
2255
- opacity: "0.1"
2256
- },
2257
- toolTip: {
2258
- backgroundColor: "rgb(232, 241, 255)",
2259
- border: "1px solid #07c",
2260
- color: frontColor,
2261
- padding: ".3rem .5rem",
2262
- borderRadius: "3px",
2263
- fontSize: "18px",
2264
- boxShadow: "0 1px 2px rgba(33,33,33,0.2)",
2265
- lineHeight: "1em"
2266
- }
2267
- },
2268
- ".legendContainer": {
2269
- display: "flex",
2270
- flexDirection: "row",
2271
- gap: spacing(3),
2272
- flexWrap: "wrap"
2273
- },
2274
- ".chart__combo__wrapper": {
2275
- position: "absolute"
2276
- }
2277
- },
2278
- // eslint-disable-next-line react/display-name
2279
- React.forwardRef(
2280
- ({
2281
- currentChart,
2282
- chartId,
2283
- allowZoom
2284
- }, ref) => {
2285
- const innerRef = React.useRef(null);
2286
- const setRefs = useMultipleRefs(
2287
- ref,
2288
- innerRef
2289
- );
2290
- const contextValue = useMemo(() => ({ chartId }), [chartId]);
2291
- const CurrentChart = getIndex(
2292
- [PieChart, HorizontalBars, VerticalBars, LineChart, WaterfallBars],
2293
- [
2294
- currentChart.chartType === "pie2D",
2295
- currentChart.chartType === "barH2D",
2296
- currentChart.chartType === "barV2D",
2297
- currentChart.chartType === "linear",
2298
- currentChart.chartType === "waterfall"
2299
- ],
2300
- 0
2301
- );
2302
- return /* @__PURE__ */ jsx(ChartContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
2303
- Box,
2304
- __spreadProps$1(__spreadValues$1({
2305
- ref: setRefs,
2306
- className: "chart__chartRenderer"
2307
- }, getVariant("layout.charts")), {
2308
- children: /* @__PURE__ */ jsx(
2309
- CurrentChart,
2310
- {
2311
- chart: currentChart,
2312
- chartId,
2313
- parentRef: innerRef,
2314
- allowZoom
2315
- }
2316
- )
2317
- })
2318
- ) });
2319
- }
2320
- ),
2321
- true
2322
- )
2323
- });
2324
-
2325
- var __defProp = Object.defineProperty;
2326
- var __defProps = Object.defineProperties;
2327
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
2328
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
2329
- var __hasOwnProp = Object.prototype.hasOwnProperty;
2330
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
2331
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2332
- var __spreadValues = (a, b) => {
2333
- for (var prop in b || (b = {}))
2334
- if (__hasOwnProp.call(b, prop))
2335
- __defNormalProp(a, prop, b[prop]);
2336
- if (__getOwnPropSymbols)
2337
- for (var prop of __getOwnPropSymbols(b)) {
2338
- if (__propIsEnum.call(b, prop))
2339
- __defNormalProp(a, prop, b[prop]);
2340
- }
2341
- return a;
2342
- };
2343
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
2344
- const START_ANGLE = 0;
2345
- const END_ANGLE = 360;
2346
- const TLight = ({
2347
- addBorder = false,
2348
- colorRanges,
2349
- maxValue,
2350
- minValue,
2351
- currentValue,
2352
- height,
2353
- valueRanges,
2354
- width,
2355
- currentValueColor,
2356
- currentValueFontSize
2357
- }) => {
2358
- const value = currentValue;
2359
- const diameter = Math.min(height, width);
2360
- const domainMax = maxValue != null ? maxValue : valueRanges[valueRanges.length - 1];
2361
- const domainMin = minValue != null ? minValue : valueRanges[0];
2362
- const gauge = useGauge({
2363
- domain: [domainMin, domainMax],
2364
- startAngle: START_ANGLE,
2365
- endAngle: END_ANGLE,
2366
- numTicks: 0,
2367
- diameter
2368
- });
2369
- function getColor(value2) {
2370
- var _a;
2371
- const index = valueRanges.findIndex((range) => value2 < range);
2372
- if (index === -1) {
2373
- return colorRanges[0];
2374
- }
2375
- return (_a = colorRanges[index - 1]) != null ? _a : colorRanges[index];
2376
- }
2377
- return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs("svg", __spreadProps(__spreadValues({}, gauge.getSVGProps()), { viewBox: "-325 -325 600 600", children: [
2378
- /* @__PURE__ */ jsx("g", { id: "arcs", children: /* @__PURE__ */ jsx(
2379
- "path",
2380
- __spreadProps(__spreadValues({}, gauge.getArcProps({
2381
- offset: 20,
2382
- startAngle: START_ANGLE,
2383
- endAngle: END_ANGLE
2384
- })), {
2385
- stroke: addBorder ? "black" : "transparent",
2386
- fill: getColor(value),
2387
- strokeLinecap: "round",
2388
- strokeWidth: 5
2389
- })
2390
- ) }),
2391
- /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
2392
- "text",
2393
- {
2394
- textAnchor: "middle",
2395
- style: { fontSize: `${currentValueFontSize != null ? currentValueFontSize : 100}px` },
2396
- alignmentBaseline: "central",
2397
- fill: currentValueColor,
2398
- children: value
2399
- }
2400
- ) })
2401
- ] })) });
2402
- };
2403
-
2404
- const WidgetContainer = () => {
2405
- const mockData = {
2406
- addBorder: true,
2407
- backgColor: "white",
2408
- currentValue: 1010,
2409
- height: 400,
2410
- width: 400,
2411
- maxValue: 1050,
2412
- minValue: 1e3,
2413
- noValueColor: "",
2414
- pointerColor: "blue",
2415
- ringAnchor: 5,
2416
- scaleFontSize: 20,
2417
- valueColor: "darkblue",
2418
- valueDecimals: 1,
2419
- valueFontSize: 50,
2420
- valueType: "",
2421
- widKpiType: 0,
2422
- zones: [
2423
- {
2424
- color: "blue",
2425
- maximum: 1020,
2426
- minimum: 1e3,
2427
- transparency: 20
2428
- },
2429
- {
2430
- color: "purple",
2431
- maximum: 1040,
2432
- minimum: 1020,
2433
- transparency: 50
2434
- },
2435
- {
2436
- color: "red",
2437
- maximum: 1050,
2438
- minimum: 1040,
2439
- transparency: 0
2440
- }
2441
- ]
2442
- };
2443
- const valueRanges = Array.from(
2444
- new Set(
2445
- arrayOrArray(mockData.zones).map((zone) => {
2446
- return [zone.minimum, zone.maximum];
2447
- }).flat().sort((a, b) => a - b)
2448
- )
2449
- );
2450
- const colorRanges = arrayOrArray(mockData.zones).map((zone) => {
2451
- return tinycolor(zone.color).setAlpha(1 - zone.transparency / 100).toPercentageRgbString();
2452
- }).flat();
2453
- return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
2454
- TLight,
2455
- {
2456
- addBorder: mockData.addBorder,
2457
- backgroundColor: mockData.backgColor,
2458
- colorRanges,
2459
- currentValue: mockData.currentValue,
2460
- decimals: mockData.valueDecimals,
2461
- currentValueColor: mockData.valueColor,
2462
- currentValueFontSize: mockData.valueFontSize,
2463
- height: mockData.height,
2464
- maxValue: mockData.maxValue,
2465
- minValue: mockData.minValue,
2466
- pointerColor: mockData.pointerColor,
2467
- scaleValuesSize: mockData.scaleFontSize,
2468
- valueRanges,
2469
- width: mockData.width
2470
- }
2471
- ) });
2472
- };
2473
-
2474
- export { ChartRenderer, WidgetContainer };
1
+ import{jsx as l,jsxs as P,Fragment as q}from"react/jsx-runtime";import de,{createContext as dt,useContext as te,useState as H,useMemo as B,useLayoutEffect as me,useEffect as Ee,useRef as mt}from"react";import{Box as D,Select as ut}from"theme-ui";import{ThemeProviderContext as pt,spacing as je,makeStyledComponent as gt,getVariant as ft}from"@apia/theme";import{uniqueId as ue}from"lodash";import{makeImperativeComponent as _e,arrayOrArray as p,useImperativeComponentEvents as re,getValueByPath as yt,usePanAndZoom as ae,usePrevious as vt,getIndex as xt}from"@apia/util";import{scaleBand as oe,scaleLog as Ce,scaleLinear as pe,scaleOrdinal as Oe}from"@visx/scale";import{Grid as Ne}from"@visx/visx";import{Group as Q}from"@visx/group";import{BarGroupHorizontal as bt,BarGroup as wt,LinePath as $t,Line as kt}from"@visx/shape";import{AxisLeft as ge,AxisBottom as fe}from"@visx/axis";import{usePanelParametersSelector as Le}from"@apia/dashboard";import W from"tinycolor2";import{localPoint as U}from"@visx/event";import{SimpleButton as St,useTooltip as le}from"@apia/components";import{icons as Ct}from"@apia/icons";import Ve from"@visx/shape/lib/shapes/Pie";import{min as ye,max as Re,extent as Ot}from"d3-array";import*as Nt from"@visx/curve";import{Fragment as Pt}from"theme-ui/jsx-runtime";import{GridRows as At}from"@visx/grid";import{useGauge as Tt}from"use-gauge";function ve(e={left:100,right:50,top:50,bottom:70}){return typeof e=="number"?{left:e,right:e,top:e,bottom:e}:e}const ne=dt({}),Mt=({groupId:e,title:t,color:r,className:o,isHighlighted:a,isAnyHighlighted:s,avoidEvent:i})=>{const{chartId:d}=te(ne);return l(St,{variant:"icon-outline",className:`${o??""} ${a?"highlight":""}`,iconColor:r||"black",icon:r==="transparent"?void 0:Ct.SquareFilled,sx:{opacity:s&&!a?"0.15":"1"},onMouseEnter:()=>{i||ot(d,"highlight",e)},onMouseLeave:()=>{i||ot(d,"highlight","")},children:t})},[ee,,ie]=_e()({initialState:{highlightedBarGroup:""},methods:{highlight(e,t){e({highlightedBarGroup:t})}},Component:({references:e,containerClassName:t,highlightedBarGroup:r,avoidEvent:o})=>l(D,{className:t,children:e.map(a=>l(Mt,{isHighlighted:a.title===r,isAnyHighlighted:r!=="",groupId:a.title,color:a.color,title:a.title,avoidEvent:o??!1},a.title))})}),Et=({bar:e,barGroup:t,chart:r,parsedData:o,isSingle:a,effectiveMargin:s,setsWithColor:i})=>{var d;const g=p(r.dataSets.data)[e.index],f=p(g?.sets)[t.index],y=(d=i.find(u=>u.columnName===g.name&&u.key===f.key))==null?void 0:d.color,[v,b]=H(!1),[k,S]=H(!1),{open:V}=le({children:P(q,{children:[l("div",{style:{color:y},children:l("strong",{children:o[t.index].columnName})}),r.showValues&&l("div",{children:e.value}),l("div",{children:e.key})]})});re({highlight(u){u.split(" - ").length===1?(b(u===e.key),S(u!==e.key&&u!=="")):u.split(" - ").length===2&&(b(u.split(" - ")[0]===e.key&&u.split(" - ")[1]===f.key),S(u.split(" - ")[0]!==e.key&&u.split(" - ")[0]!==""))}});const{chartId:x}=te(ne);return P("g",{children:[P("text",{x:e.x+5,y:e.y-5,width:e.width,height:e.height,textAnchor:"start",style:{display:v?"block":"none",opacity:v?1:0,transition:"opacity 500ms"},children:[e.value," - ",o[t.index].columnName]}),l(D,{as:"rect",className:"chart__barRect",sx:B(()=>({fill:k?`#${W(y).desaturate(70).toHex()}`:y,"&:hover":{fill:`#${W(y).saturate(25).toHex()}`},transition:"fill 500ms, opacity 500ms",x:e.x,y:e.y,width:e.width-s.left,opacity:k&&!v?.15:1,height:e.height>0?e.height:0}),[e.height,e.width,e.x,e.y,y,s.left,k,v]),onMouseEnter:u=>{var N,L,A;a||ee.highlight(x,e.key),(N=u.target.classList)==null||N.add("over"),(L=U(u))==null||L.x,(A=U(u))==null||A.y,V({attachToElement:()=>u.target,attachToElementAnchorPoint:"center"})},onMouseLeave:u=>{var N;a||ee.highlight(x,""),(N=u.target.classList)==null||N.remove("over")},children:l("animate",{attributeName:"width",from:0,to:e.width,dur:"0.5s",calcMode:"paced",keySplines:"0.5 0 0.5 1;",keyTimes:"0; 1"})})]})};function ce(e,t,r=!1){const o=e.length;let a=0,s="";if(r)e[t]?s=e[t]:s=W(e[t%o]).toHex();else if(e[t])s=e[t];else{let i=t;for(;i>=o;)i=t/o,a++;s=W(e[t%o]).desaturate(a*5).toHex()}return s}var jt=Object.defineProperty,Ie=Object.getOwnPropertySymbols,_t=Object.prototype.hasOwnProperty,Lt=Object.prototype.propertyIsEnumerable,Be=(e,t,r)=>t in e?jt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,De=(e,t)=>{for(var r in t||(t={}))_t.call(t,r)&&Be(e,r,t[r]);if(Ie)for(var r of Ie(t))Lt.call(t,r)&&Be(e,r,t[r]);return e};function xe(e){var t,r,o;const a=te(pt);a.layout||console.error("The layout property is missing in the current theme");const s=(r=(t=a.layout)==null?void 0:t.charts)!=null?r:{},i=s.common,d={schema:yt(a.colors,(o=s[e||"blue"])==null?void 0:o.schema)};return De(De({},i),d)}var Vt=Object.defineProperty,Rt=Object.defineProperties,It=Object.getOwnPropertyDescriptors,We=Object.getOwnPropertySymbols,Bt=Object.prototype.hasOwnProperty,Dt=Object.prototype.propertyIsEnumerable,He=(e,t,r)=>t in e?Vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,be=(e,t)=>{for(var r in t||(t={}))Bt.call(t,r)&&He(e,r,t[r]);if(We)for(var r of We(t))Dt.call(t,r)&&He(e,r,t[r]);return e},we=(e,t)=>Rt(e,It(t));function Wt({width:e,height:t,maxWidth:r}){if(e<=r)return{width:e,height:t};const o=e/t,a=r,s=Math.floor(a/o);return{width:a,height:s}}const Ge=e=>e.columnName,Ht=({margin:e={top:20,left:50,bottom:150,right:20},chart:t,className:r,chartId:o,outerClassName:a,allowZoom:s})=>{var i;const d=ve(e);let g=t.ratio.width+(-d.left-d.right)/2,f=t.ratio.height+(-d.top-d.bottom)/2;if(g>t.ratio.maxWidth){const c=Wt({height:f,width:g,maxWidth:t.ratio.maxWidth});g=c.width,f=c.height}const y=p((i=t.dataSets)==null?void 0:i.data).filter(c=>!!c.sets).map(c=>we(be({},c),{sets:c.sets})),v=p(y[0].sets).map(c=>c.key),b=y.map(c=>c.name),k=v.map(c=>y.reduce((n,$)=>we(be({},n),{[$.name]:p($.sets).filter(j=>j.key===c)[0].value}),{columnName:c})),S=oe({range:[typeof d=="number"?d:d.top,f],domain:k.map(Ge),padding:.2}),V=oe({domain:b,range:[0,S.bandwidth()]}),x=Ce({range:[typeof d=="number"?d:d.left,g],domain:[1,Math.max(...k.map(c=>Math.max(...b.map(n=>Number(c[n])))))],base:10}),u=pe({range:[typeof d=="number"?d:d.left,g],domain:[0,Math.max(...k.map(c=>Math.max(...b.map(n=>Number(c[n])))))]}),N=Oe({domain:b,range:y.map(c=>c.color)}),L=Le(c=>c).PRMT_CHART_SCALE==="0",A=B(()=>L?x:u,[L,u,x]),Y=B(()=>`VerticalBars${ue()}`,[]);me(()=>{document.querySelectorAll(`#${Y} .__${o??a}`).forEach(c=>{const n=c.getBoundingClientRect().width;c.style.transformOrigin=c.getAttribute("x")+"px 14px",c.style.transform=`rotate(15deg) translateX(${n/2}px)`})});const R=xe(t.colorSchema),{boxRef:K,elementRef:w}=ae(void 0,!s),T=p(t.dataSets.data).map((c,n)=>{const $=p(t.dataSets.data).length===1,j=c.color!==""&&c.color!==void 0?c.color:p(R.schema).length>0?ce(p(R.schema),n,$):"",E=[];return p(c.sets).forEach(h=>{h.color!==""&&h.color!==void 0?E.push(we(be({},h),{columnName:c.name})):E.push(we(be({},h),{color:j,columnName:c.name}))}),E}),m=T.map(c=>{var n;return{color:(n=c[0].color)!=null?n:"",title:c[0].columnName}});return p(t.dataSets.data).map(c=>{const n=[];return p(c.sets).forEach($=>{$.color!==""&&$.color!==void 0&&n.push({color:$.color,title:c.name+" - "+$.key})}),n}).flat().forEach(c=>m.push(c)),P(q,{children:[l(D,{ref:K,id:Y,className:`${a??""} ${o} ${t.title}`,sx:de.useMemo(()=>({[`.__${o??a}`]:{transform:"rotate(45deg)",transformOrigin:"attr(x) 18px"},overflow:"auto",position:"relative",height:`${t.ratio.height}px`,width:`${t.ratio.width}px`}),[t.ratio.height,t.ratio.width,o,a]),children:P("svg",{ref:w,className:`_${o} ${r||""} chart__svg`,height:t.ratio.height,width:t.ratio.width,style:{position:"absolute"},children:[t.showGrid&&l(Ne.Grid,{xScale:A,yScale:S,left:0,width:g,height:f,numTicksRows:10,numTicksColumns:10,top:(typeof d=="number"?d:d.top)-20}),l(Q,{top:(typeof d=="number"?d:d.top)-20,left:d.left,children:l(bt,{data:k,keys:b,width:g,y0:Ge,y0Scale:S,y1Scale:V,xScale:A,color:N,children:c=>c.map(n=>l(Q,{top:n.y0,children:n.bars.map($=>{const j=`${n.index}-${$.index}-${$.key}`;return l(Et,{isSingle:n.bars.length===1,bar:$,barGroup:n,chart:t,parsedData:k,effectiveMargin:d,setsWithColor:T.flat()},j)})},`bar-group-${n.index}-${n.y0}`))})}),l(ge,{scale:S,left:d.left,label:t.chartType!=="pie2D"&&t.showAxisYTitle?t.axisYTitle:"",tickLabelProps:()=>({display:"none"})}),l(fe,{top:f,scale:A,label:t.chartType!=="pie2D"&&t.showAxisXTitle?t.axisXTitle:"",tickLabelProps:{className:"tickLabel"},labelOffset:50})]})}),m.length>1&&l(ie,{id:o,containerClassName:"legendContainer",references:m})]})},Gt=({arc:e,arcPath:t,chart:r,actualColor:o})=>{const[a,s]=H(!1),[i,d]=H(!1),{open:g}=le({children:P(q,{children:[l("div",{style:{color:`#${W(o).toHex()}`},children:l("strong",{children:e.data.key})}),r.showValues&&l("div",{children:`${e.value} ${e.data.percentage?"- "+e.data.percentage:""}${e.data.percentage?"%":""}`})]})});re({highlight(v){s(v===e.data.key),d(v!==e.data.key&&v!=="")}});const{chartId:f}=te(ne),y=e.data;return l("path",{style:B(()=>({"&:hover":{fill:`#${W(o).saturate(25).toHex()}`},transition:"fill 500ms, opacity 500ms"}),[o]),fill:i?`#${W(o).desaturate(70).toHex()}`:o,opacity:i&&!a?.15:1,d:t??"",onMouseEnter:v=>{var b,k,S;ee.highlight(f,e.data.key),(b=v.target.classList)==null||b.add("over"),(k=U(v))==null||k.x,(S=U(v))==null||S.y,g({attachToElement:()=>v.target,attachToElementAnchorPoint:"center"})},onMouseLeave:v=>{var b;ee.highlight(f,""),(b=v.target.classList)==null||b.remove("over")}},`arc-${y.key}-${y.value}`)};function Ye({chartId:e,pieces:t,className:r,current:o,setCurrent:a}){return P(ut,{sx:{width:"auto"},name:`chartSelector_${e}`,className:`chartSelector_${e} ${r??""}`,value:o??"0",onChange:s=>{s.preventDefault(),a(s.target.value)},children:[t.map((s,i)=>({label:s,value:`${i}`})).map(s=>l("option",{value:s.value,children:s.label},s.value))," "]})}const Yt=({arc:e,x:t,y:r,dy:o})=>{const[a,s]=H(!1);return re({highlight(i){s(i===e.data.key)}}),l("text",{textAnchor:"middle",style:{opacity:a?1:0,display:a?"block":"none",transition:"opacity 500ms"},x:t,y:r,dy:o,children:e.value})};var Xt=Object.defineProperty,zt=Object.defineProperties,Ft=Object.getOwnPropertyDescriptors,Xe=Object.getOwnPropertySymbols,qt=Object.prototype.hasOwnProperty,Zt=Object.prototype.propertyIsEnumerable,ze=(e,t,r)=>t in e?Xt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Kt=(e,t)=>{for(var r in t||(t={}))qt.call(t,r)&&ze(e,r,t[r]);if(Xe)for(var r of Xe(t))Zt.call(t,r)&&ze(e,r,t[r]);return e},Jt=(e,t)=>zt(e,Ft(t));function Qt({width:e,height:t,maxWidth:r}){if(e<=r)return{width:e,height:t};const o=e/t,a=r,s=Math.floor(a/o);return{width:a,height:s}}const Ut=({chart:e,className:t,chartId:r,allowZoom:o})=>{var a;const[s,i]=H({});let d=e.ratio.width>e.ratio.height?e.ratio.width:e.ratio.height,g=e.ratio.width>e.ratio.height?e.ratio.width:e.ratio.height;if(d>e.ratio.maxWidth){const w=Qt({height:g,width:d,maxWidth:e.ratio.maxWidth});d=w.width,g=w.height}const f=p((a=e.dataSets)==null?void 0:a.data).filter(w=>!!w.sets).map(w=>Jt(Kt({},w),{coordinate:w.sets})),[y,v]=H("0");Ee(()=>{i(f[y??0])},[y]);const b=B(()=>g/2.5,[g]),k=B(()=>d/2.5,[d]),S=b,V=k,x=w=>Number(w.value)===0&&f.length===1&&p(f.map(T=>T.coordinate)[0]).length===1?100:Number(w.value),u=Math.min(g,d)/2.5,N=f.map(w=>w.name),L=xe(e.colorSchema).schema,A=p(p(e.dataSets.data)[0].sets).map(w=>w.key).map((w,T)=>({title:w,color:ce(p(L),T)})),{boxRef:Y,elementRef:R}=ae(void 0,!o),K=mt([]);return P(q,{children:[f.length>1&&l(D,{className:"chart__combo__wrapper",children:l(Ye,{chartId:r,pieces:N,className:"chartSelectorCombo",current:y,setCurrent:v})}),l(D,{ref:Y,className:`${t||""} ${r}`,sx:{textAlign:"center",pb:je(5)},children:l("svg",{ref:R,height:u*2,width:u*2,className:`_${r} chart__svg`,children:P(Q,{top:S??0,left:V??0,children:[l(Ve,{data:p(s.coordinate),pieValue:x,pieSort:null,outerRadius:u,children:w=>{const T=p(w.arcs).map(c=>w.path(c)),m=w.arcs.map(c=>{var n,$;const j=c.data,E=w.path(c);return l(Gt,{arc:c,arcPath:E,chart:e,actualColor:($=(n=A.find(h=>h.title===j.key))==null?void 0:n.color)!=null?$:""},`${j.key}_${j.value}`)});return K.current=T,m}}),l(Ve,{data:p(s.coordinate),pieValue:x,pieSort:null,outerRadius:u,children:w=>w.arcs.map(T=>{const m=T.data,c=(T.startAngle-Math.PI+T.endAngle)/2,n=Math.cos(c)*(u*.75),$=Math.sin(c)*(u*.75);return l("g",{children:l(Yt,{arc:T,chart:e,dy:"0.33em",x:n,y:$})},`arc-${m.key}-${m.value}`)})})]})})},s.name),A.length>1&&l(ie,{id:r,containerClassName:"legendContainer",references:A})]})},er=({bar:e,barGroup:t,chart:r,parsedData:o,isSingle:a,setsWithColor:s})=>{var i;const d=p(r.dataSets.data)[e.index],g=p(d?.sets)[t.index],f=(i=s.find(x=>x.columnName===d.name&&x.key===g.key))==null?void 0:i.color,[y,v]=H(!1),[b,k]=H(!1),{open:S}=le({children:P(q,{children:[l("div",{style:{color:f},children:l("strong",{children:o[t.index].columnName})}),r.showValues&&l("div",{children:e.value}),l("div",{children:e.key})]})});re({highlight(x){x.split(" - ").length===1?(v(x===e.key),k(x!==e.key&&x!=="")):x.split(" - ").length===2&&(v(x.split(" - ")[0]===e.key&&x.split(" - ")[1]===g.key),k(x.split(" - ")[0]!==e.key&&x.split(" - ")[0]!==""))}});const{chartId:V}=te(ne);return P("g",{children:[l("text",{x:e.x+e.width/2,y:e.y-5,width:e.width,height:e.height,textAnchor:"middle",style:{display:y?"block":"none",opacity:y?1:0,transition:"opacity 500ms"},children:e.value}),P(D,{as:"rect",className:"chart__barRect",sx:B(()=>({fill:b?`#${W(f).desaturate(70).toHex()}`:f,"&:hover":{fill:`#${W(f).saturate(25).toHex()}`},transition:"fill 500ms, opacity 500ms",x:e.x,y:e.y,width:e.width,opacity:b&&!y?.15:1,height:e.height>0?e.height:0}),[e.height,e.width,e.x,e.y,f,b,y]),onMouseEnter:x=>{var u,N,L;a||ee.highlight(V,e.key),(u=x.target.classList)==null||u.add("over"),(N=U(x))==null||N.x,(L=U(x))==null||L.y,S({attachToElement:()=>x.target,attachToElementAnchorPoint:"center"})},onMouseLeave:x=>{var u;a||ee.highlight(V,""),(u=x.target.classList)==null||u.remove("over")},children:[l("animate",{attributeName:"height",from:0,to:e.height,dur:"0.5s",calcMode:"paced",keySplines:"0.5 0 0.5 1;",keyTimes:"0; 1"}),l("animate",{attributeName:"y",from:e.y+e.height,to:e.y,dur:"0.5s",calcMode:"paced",keySplines:"0.5 0 0.5 1;",keyTimes:"0; 1"})]})]})};var tr=Object.defineProperty,rr=Object.defineProperties,ar=Object.getOwnPropertyDescriptors,Fe=Object.getOwnPropertySymbols,or=Object.prototype.hasOwnProperty,lr=Object.prototype.propertyIsEnumerable,qe=(e,t,r)=>t in e?tr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$e=(e,t)=>{for(var r in t||(t={}))or.call(t,r)&&qe(e,r,t[r]);if(Fe)for(var r of Fe(t))lr.call(t,r)&&qe(e,r,t[r]);return e},ke=(e,t)=>rr(e,ar(t));function nr({width:e,height:t,maxWidth:r}){if(e<=r)return{width:e,height:t};const o=e/t,a=r,s=Math.floor(a/o);return{width:a,height:s}}const Ze=e=>e.columnName,ir=({margin:e={top:20,left:100,bottom:150,right:20},chart:t,className:r,chartId:o,allowZoom:a})=>{var s;const i=ve(e);t.showAxisYTitle||(i.left=50);let d=t.ratio.width+(-i.left-i.right)/2,g=t.ratio.height+(-i.top-i.bottom)/2;if(d>t.ratio.maxWidth){const m=nr({height:g,width:d,maxWidth:t.ratio.maxWidth});d=m.width,g=m.height}const f=xe(t.colorSchema),y=p((s=t.dataSets)==null?void 0:s.data).filter(m=>!!m.sets).map(m=>ke($e({},m),{sets:m.sets})),v=p(y[0].sets).map(m=>m.key),b=y.map(m=>m.name),k=v.map(m=>y.reduce((c,n)=>ke($e({},c),{[n.name]:p(n.sets).filter($=>$.key===m)[0].value}),{columnName:m})),S=oe({range:[typeof i=="number"?i:i.left,d],domain:k.map(Ze),padding:.2}),V=oe({domain:b,range:[0,S.bandwidth()]}),x=Ce({range:[g,typeof i=="number"?i:i.top],domain:[1,Math.max(...k.map(m=>Math.max(...b.map(c=>Number(m[c])))))],base:10}),u=pe({range:[g,typeof i=="number"?i:i.top],domain:[0,Math.max(...k.map(m=>Math.max(...b.map(c=>Number(m[c])))))]}),N=Oe({domain:b,range:y.map(m=>m.color)}),L=Le(m=>m).PRMT_CHART_SCALE==="0",A=B(()=>L?x:u,[L,u,x]),Y=B(()=>`VerticalBars${ue()}`,[]);me(()=>{document.querySelectorAll(`#${Y} .tickLabel`).forEach(m=>{const c=m.getBoundingClientRect().width;m.style.transformOrigin=m.getAttribute("x")+"px 14px",m.style.transform=`rotate(25deg) translateX(${c/2}px)`})});const{boxRef:R,elementRef:K}=ae(void 0,!a),w=p(t.dataSets.data).map((m,c)=>{const n=p(t.dataSets.data).length===1,$=m.color!==""&&m.color!==void 0?m.color:p(f.schema).length>0?ce(p(f.schema),c,n):"",j=[];return p(m.sets).forEach(E=>{E.color!==""&&E.color!==void 0?j.push(ke($e({},E),{columnName:m.name})):j.push(ke($e({},E),{color:$,columnName:m.name}))}),j}),T=p(t.dataSets.data).map((m,c)=>{const n=p(t.dataSets.data).length===1;return{color:m.color!==""&&m.color!==void 0?m.color:p(f.schema).length>0?ce(p(f.schema),c,n):"",title:m.name}});return p(t.dataSets.data).map(m=>{const c=[];return p(m.sets).forEach(n=>{n.color!==""&&n.color!==void 0&&c.push({color:n.color,title:m.name+" - "+n.key})}),c}).flat().forEach(m=>T.push(m)),P(q,{children:[l(D,{ref:R,id:Y,className:`${r??""} ${t.title}`,sx:{overflow:"hidden"},children:P("svg",{ref:K,className:`_${o} chart__svg`,height:t.ratio.height,width:t.ratio.width,children:[t.showGrid&&l(Ne.Grid,{xScale:S,yScale:A,left:0,width:d,height:g,numTicksRows:10,numTicksColumns:10,top:(typeof i=="number"?i:i.top)-20}),l(Q,{top:(typeof i=="number"?i:i.top)-20,children:l(wt,{data:k,keys:b,height:g,x0:Ze,x0Scale:S,x1Scale:V,yScale:A,color:N,children:m=>m.map(c=>l(Q,{left:c.x0,children:c.bars.map(n=>{const $=`${c.index}-${n.index}-${n.key}`;return l(er,{isSingle:c.bars.length===1,bar:n,barGroup:c,chart:t,parsedData:k,setsWithColor:w.flat()},$)})},`bar-group-${c.index}-${c.x0}`))})}),l(ge,{scale:A,left:i.left,label:t.chartType!=="pie2D"&&t.showAxisYTitle?t.axisYTitle:""}),l(fe,{top:g,scale:S,label:t.chartType!=="pie2D"&&t.showAxisXTitle?t.axisXTitle:"",tickLabelProps:{className:"tickLabel"},labelOffset:50})]})}),T.length>1&&l(ie,{id:o,containerClassName:"legendContainer",references:T})]})},cr=({currentCircle:e,innerKey:t,cx:r,cy:o,color:a,setCurrentCircle:s})=>P(Pt,{children:[e.includes(t)&&l("circle",{r:6,cx:r,cy:o,stroke:`#${W(a).saturate(25).toHex()}`,fill:`#${W(a).saturate(25).toHex()}`}),l("circle",{r:3,cx:r,cy:o,stroke:`#${W(a).darken(15).toHex()}`,fill:`#${W(a).darken(15).toHex()}`}),l("circle",{r:10,cx:r,cy:o,stroke:"transparent",fill:"transparent",onMouseEnter:()=>{s([t])},onMouseLeave:()=>{s([])},style:{cursor:"pointer"}})]},t);var sr=Object.defineProperty,hr=Object.defineProperties,dr=Object.getOwnPropertyDescriptors,Ke=Object.getOwnPropertySymbols,mr=Object.prototype.hasOwnProperty,ur=Object.prototype.propertyIsEnumerable,Je=Math.pow,Qe=(e,t,r)=>t in e?sr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Pe=(e,t)=>{for(var r in t||(t={}))mr.call(t,r)&&Qe(e,r,t[r]);if(Ke)for(var r of Ke(t))ur.call(t,r)&&Qe(e,r,t[r]);return e},Ae=(e,t)=>hr(e,dr(t));function pr({width:e,height:t,maxWidth:r}){if(e<=r)return{width:e,height:t};const o=e/t,a=r,s=Math.floor(a/o);return{width:a,height:s}}function se(e){return e.key}function Z(e){return Number(e.value)}function gr(e){var t,r,o,a,s,i,d;const g=p((t=e.dataSets)==null?void 0:t.data),f=g.map(y=>y.sets).reduce((y,v)=>p(y).concat(v),[]);return{columns:g,xScale:Oe({domain:p(g[0].sets).map(se)}),yScale:pe({domain:[((r=ye(f,Z))!=null?r:0<0)&&(o=ye(f,Z))!=null?o:0,(a=Re(f,Z))!=null?a:1]}),yScaleLog:Ce({domain:[((s=ye(f,Z))!=null?s:1>0)&&(i=ye(f,Z))!=null?i:1,(d=Re(f,Z))!=null?d:10]})}}const fr=({chart:e,margin:t={top:20,left:100,bottom:150,right:70},chartId:r,allowZoom:o})=>{const a=ve(t);e.showAxisYTitle||(a.left=50);let s=e.ratio.width,i=e.ratio.height-(a.top+a.bottom)/2;if(s>e.ratio.maxWidth){const h=pr({height:i,width:s,maxWidth:e.ratio.maxWidth});s=h.width,i=h.height}const{columns:d,xScale:g,yScale:f,yScaleLog:y}=gr(e),v=xe(e.colorSchema),b=p(d[0].sets),k=d.map(h=>h.sets),S=s/b.length;g.range(b.map((h,C)=>C===0?a.left:C*S+a.left)),f.range([i-(a.top+a.bottom)/2,typeof a=="number"?a:a.top]),y.range([i,typeof a=="number"?a:a.top]);const[V,x]=H([]),u=B(()=>f,[f]),N=B(()=>`VerticalBars${ue()}`,[]);me(()=>{document.querySelectorAll(`#${N} .tickLabel`).forEach(h=>{const C=h.getBoundingClientRect().width;h.style.transformOrigin=h.getAttribute("x")+"px 14px",h.style.transform=`rotate(25deg) translateX(${C/2}px)`})});function L(h,C,_){return C.map((M,G)=>{const O=Math.floor(G/_),I=h[O];return Ae(Pe({},M),{columnName:I})})}const[A,Y]=H([]);Ee(()=>{const h=k.flat().map(M=>({xValue:M.key,yValue:M.value,x:g(se(M)),y:u(Z(M))})),C=d.map(M=>M.name),_=L(C,h,b.length);Y(_)},[]);const[R,K]=H([]),w=vt(R),T=p(e.dataSets.data).map((h,C)=>{const _=p(e.dataSets.data).length===1,M=h.color!==""&&h.color!==void 0?h.color:p(v.schema).length>0?ce(p(v.schema),C,_):"",G=[];return p(h.sets).forEach(O=>{O.color!==""&&O.color!==void 0?G.push(Ae(Pe({},O),{columnName:h.name})):G.push(Ae(Pe({},O),{color:M,columnName:h.name}))}),{returnColumnsArray:G,columnColor:M}}),m=T.map(h=>{var C;return{color:(C=h.columnColor)!=null?C:"",title:h.returnColumnsArray[0].columnName}});p(e.dataSets.data).map(h=>{const C=[];return p(h.sets).forEach(_=>{_.color!==""&&_.color!==void 0&&C.push({color:_.color,title:h.name+" - "+_.key})}),C}).flat().forEach(h=>m.push(h));const{open:c}=le({children:R.sort((h,C)=>Number(C.yValue)-Number(h.yValue)).map((h,C)=>{const _=m.some(M=>M.title===h.columnName+" - "+h.xValue);return P(D,{children:[l("div",{style:{color:m[m.findIndex(M=>M.title===(_?h.columnName+" - "+h.xValue:h.columnName))].color},children:l("strong",{children:h.columnName})}),e.showValues&&l("div",{children:h.yValue}),l("div",{children:h.xValue}),R[C+1]&&l("hr",{})]},`${h.columnName}_${h.xValue}_${h.yValue}`)})}),[n,$]=H("");re({highlight(h){h.split(" - ").length===1?$(h):h.split(" - ").length===2&&$(h.split(" - ")[0])}});const{boxRef:j,elementRef:E}=ae(void 0,!o);return P(q,{children:[l(D,{id:N,ref:j,children:P("svg",{ref:E,width:s,height:i,id:"LinesChart",className:`_${r} chart__svg`,onMouseMove:h=>{var C;const _=(C=E.current)==null?void 0:C.getBoundingClientRect();let M=h.clientX,G=h.clientY-(a.top+a.bottom)/2;_&&(M=h.clientX-_.left,G=h.clientY-_.top);const O=A.filter(I=>Math.sqrt(Je(I.x-M,2)+Je(I.y-G,2))<20);if(w.current&&O.length>0){const I=d.map(X=>{let z="";return O.forEach(F=>{X.name===F.columnName&&(z=F.columnName)}),z}).filter(X=>X!==""),J=b.findIndex(X=>X.key===O[0].xValue);if(I&&J!==void 0){const X=I.map(z=>`${z}${J}`);x([...X])}K(O),c({attachToElement:()=>h.target,attachToElementAnchorPoint:"center"})}else O.length===0&&x([])},children:[e.showGrid&&l(Ne.Grid,{top:(typeof a=="number"?a:a.top)-20,left:0,xScale:g,yScale:u,width:s,height:i,stroke:v.grid.stroke,strokeOpacity:v.grid.opacity}),d.map((h,C)=>{var _;const M=p(h.sets),G=(_=T.find(O=>O.returnColumnsArray[0].columnName===h.name))==null?void 0:_.columnColor;return P(Q,{top:(typeof a=="number"?a:a.top)-20,style:{opacity:n!==""&&n!==h.name?.15:1,transition:"opacity 500ms"},children:[l($t,{curve:Nt.curveMonotoneX,data:M,x:O=>{var I;return(I=g(se(O)))!=null?I:0},y:O=>{var I;return(I=u(Z(O)))!=null?I:0},stroke:G??"black",strokeWidth:2,strokeOpacity:1,shapeRendering:"geometricPrecision"}),M.map((O,I)=>{var J;const X=h.name+I.toString(),z=(J=T.map(F=>F.returnColumnsArray).flat().find(F=>F.columnName===h.name&&F.key===O.key))==null?void 0:J.color;return P("g",{children:[l("text",{x:g(se(O))+10,y:u(Z(O))-5,textAnchor:"middle",style:{display:n===h.name?"block":"none",opacity:n===h.name?1:0,transition:"opacity 500ms"},children:O.value}),l(cr,{color:z??"black",coordinate:O,currentCircle:V,cx:g(se(O)),cy:u(Z(O)),setCurrentCircle:x,innerKey:X,column:h})]},X)})]},`lines-${h.name+C.toString()}`)}),l(ge,{scale:u,left:a.left,label:e.chartType!=="pie2D"&&e.showAxisYTitle?e.axisYTitle:""}),l(fe,{top:i-(a.top+a.bottom)/2,scale:g,label:e.chartType!=="pie2D"&&e.showAxisXTitle?e.axisXTitle:"",tickLabelProps:{className:"tickLabel"},labelOffset:50})]})}),m.length>1&&l(ie,{id:r,containerClassName:"legendContainer",references:m})]})},yr=({width:e,height:t,x:r,y:o,fill:a,x1:s,lineY:i,x2:d,stroke:g,strokeDashArray:f,textX:y,textY:v,textContent:b,isLast:k,step:S,columnName:V,chart:x})=>{const{open:u}=le({children:P(q,{children:[l("div",{style:{color:S.color},children:l("strong",{children:V})}),x.showValues&&l("div",{children:S.y}),l("div",{children:S.x})]})});return P(q,{children:[l(D,{as:"rect",sx:B(()=>({width:`${e}px`,height:`${t}px`,x:`${r}px`,y:`${o}px`,fill:`${a}`,"&:hover":{fill:`#${W(a).saturate(25).toHex()}`},transition:"fill 500ms"}),[a,t,e,r,o]),onMouseEnter:N=>{u({attachToElement:()=>N.target,attachToElementAnchorPoint:"center"})},onMouseLeave:()=>{}}),!k&&l(kt,{x1:s,x2:d,y1:i,y2:i,stroke:g,strokeDasharray:f}),l("text",{textAnchor:"middle",x:y,y:v,children:b})]})};var vr=Object.defineProperty,xr=Object.defineProperties,br=Object.getOwnPropertyDescriptors,Se=Object.getOwnPropertySymbols,Ue=Object.prototype.hasOwnProperty,et=Object.prototype.propertyIsEnumerable,tt=(e,t,r)=>t in e?vr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,wr=(e,t)=>{for(var r in t||(t={}))Ue.call(t,r)&&tt(e,r,t[r]);if(Se)for(var r of Se(t))et.call(t,r)&&tt(e,r,t[r]);return e},$r=(e,t)=>xr(e,br(t)),kr=(e,t)=>{var r={};for(var o in e)Ue.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Se)for(var o of Se(e))t.indexOf(o)<0&&et.call(e,o)&&(r[o]=e[o]);return r};const Sr=({data:e,xAccessor:t,yAccessor:r,showFinal:o,colors:a})=>{let s=0;const i=e.map(d=>{const g=t(d),f=r(d),y=s;return s+=Number(f),{x:g,y:f,start:y,end:s,color:Number(f)>0?a.positive:a.negative}});return o&&i.push({x:"Total",y:s,start:0,end:s,color:a.total}),i};function Cr({width:e,height:t,maxWidth:r}){if(e<=r)return{width:e,height:t};const o=e/t,a=r,s=Math.floor(a/o);return{width:a,height:s}}const Or=e=>{var t=e,{margin:r={top:20,left:100,bottom:150,right:70},chart:o}=t,a=o,{waterfallColors:s={positive:"#49b86f",negative:"#c92e5b",total:"#434857",stepConnector:"#888d94"}}=a,i=kr(a,["waterfallColors"]),{className:d,chartId:g,allowZoom:f}=t,y;const v=ve(r);i.showAxisYTitle||(v.left=50);let b=i.ratio.width+(-v.left-v.right)/2,k=i.ratio.height+(-v.top-v.bottom)/2;if(b>i.ratio.maxWidth){const n=Cr({height:k,width:b,maxWidth:i.ratio.maxWidth});b=n.width,k=n.height}const S=n=>n.key,V=n=>n.value,x=p((y=i.dataSets)==null?void 0:y.data).filter(n=>!!n.sets).map(n=>$r(wr({},n),{coordinate:n.sets})),[u,N]=H("0"),L=x.map(n=>n.name),A=B(()=>{var n;return Sr({data:p(i.dataSets.data)[u].sets,xAccessor:S,yAccessor:V,showFinal:(n=i.showTotal)!=null?n:!0,colors:s})},[i.dataSets.data,i.showTotal,u,s]),Y=.2,R=oe({domain:A.map(n=>n.x),padding:Y,range:[0,b]}),K=B(()=>{const n=A.flatMap(E=>[E.start,E.end]),[$,j]=Ot(n);return $!=null&&j!=null?[$-5,j+5]:void 0},[A]),w=pe({domain:K,nice:!0,range:[k,0]}),T=B(()=>`VerticalBars${ue()}`,[]);me(()=>{document.querySelectorAll(`#${T} .tickLabel`).forEach(n=>{const $=n.getBoundingClientRect().width;n.style.transformOrigin=n.getAttribute("x")+"px 14px",n.style.transform=`rotate(25deg) translateX(${$/2}px)`})});const{boxRef:m,elementRef:c}=ae(void 0,!f);return P(q,{children:[x.length>1&&l(D,{className:"chart__combo__wrapper",children:l(Ye,{chartId:g,pieces:L,className:"chartSelectorCombo",current:u,setCurrent:N})}),l(D,{id:T,className:d,ref:m,children:l("svg",{height:i.ratio.height,width:i.ratio.width,ref:c,children:P(Q,{left:v.left,top:v.top,children:[l(At,{scale:w,width:b,strokeDasharray:"5"}),A.map((n,$)=>{var j;const E=R(n.x),h=w(Math.max(n.start,n.end));if(E==null||h==null)return null;const C=Math.abs(w(n.start)-w(n.end)),_=$===A.length-1,M=2,G=E+R.bandwidth()+M,O=E+R.bandwidth()/(1-Y)-M,I=n.end<n.start?h+C:h,J=10,X=w(n.end)+(n.y<0?J:-J);let z=0;return A.filter((F,Te)=>{var Me;return((Me=i.showTotal)==null||Me)&&!A[Te+1]?!1:Te<=$}).forEach(F=>{z+=Number(F.y)}),l(yr,{chart:i,columnName:L[u],fill:n.color,height:C,isLast:_,lineY:I,step:n,stroke:s.stepConnector,strokeDashArray:2,textContent:(j=i.showTotal)==null||j?n.y:z,textX:E+R.bandwidth()/2,textY:X+5,width:R.bandwidth(),x:E,y:h,x1:G,x2:O},$)}),l(ge,{label:"",scale:w,hideAxisLine:!0,hideTicks:!0,tickLabelProps:()=>({textAnchor:"end",verticalAnchor:"middle"})}),l(fe,{scale:R,top:k,tickLabelProps:()=>({textAnchor:"middle",verticalAnchor:"middle",className:"tickLabel"})})]})})}),l(ie,{id:g,avoidEvent:!0,references:[{title:p(i.dataSets.data)[u].name,color:"transparent"}]})]})};var Nr=Object.defineProperty,Pr=Object.defineProperties,Ar=Object.getOwnPropertyDescriptors,rt=Object.getOwnPropertySymbols,Tr=Object.prototype.hasOwnProperty,Mr=Object.prototype.propertyIsEnumerable,at=(e,t,r)=>t in e?Nr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Er=(e,t)=>{for(var r in t||(t={}))Tr.call(t,r)&&at(e,r,t[r]);if(rt)for(var r of rt(t))Mr.call(t,r)&&at(e,r,t[r]);return e},jr=(e,t)=>Pr(e,Ar(t));const he="hsl(196, 37%, 13%)";function _r(...e){return de.useCallback(function(t){e.forEach(r=>{r&&(r.current=t)})},[e])}const[,ot,Lr]=_e()({Component:gt("ChartRenderer","layout.charts",{red:{schema:"schemas.red"},orange:{schema:"schemas.orange"},green:{schema:"schemas.green"},blue:{schema:"schemas.blue"},violet:{schema:"schemas.violet"},turquoise:{schema:"schemas.turquoise"},yellow:{schema:"schemas.yellow"},grey:{schema:"schemas.grey"},ocean:{schema:"schemas.ocean"},sunset:{schema:"schemas.sunset"},common:{axis:{stroke:he,title:he},schema:he,background:"hsl(200deg 20% 98%)",grid:{stroke:he,opacity:"0.1"},toolTip:{backgroundColor:"rgb(232, 241, 255)",border:"1px solid #07c",color:he,padding:".3rem .5rem",borderRadius:"3px",fontSize:"18px",boxShadow:"0 1px 2px rgba(33,33,33,0.2)",lineHeight:"1em"}},".legendContainer":{display:"flex",flexDirection:"row",gap:je(3),flexWrap:"wrap"},".chart__combo__wrapper":{position:"absolute"}},de.forwardRef(({currentChart:e,chartId:t,allowZoom:r},o)=>{const a=de.useRef(null),s=_r(o,a),i=B(()=>({chartId:t}),[t]),d=xt([Ut,Ht,ir,fr,Or],[e.chartType==="pie2D",e.chartType==="barH2D",e.chartType==="barV2D",e.chartType==="linear",e.chartType==="waterfall"],0);return l(ne.Provider,{value:i,children:l(D,jr(Er({ref:s,className:"chart__chartRenderer"},ft("layout.charts")),{children:l(d,{chart:e,chartId:t,parentRef:a,allowZoom:r})}))})}),!0)});var Vr=Object.defineProperty,Rr=Object.defineProperties,Ir=Object.getOwnPropertyDescriptors,lt=Object.getOwnPropertySymbols,Br=Object.prototype.hasOwnProperty,Dr=Object.prototype.propertyIsEnumerable,nt=(e,t,r)=>t in e?Vr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,it=(e,t)=>{for(var r in t||(t={}))Br.call(t,r)&&nt(e,r,t[r]);if(lt)for(var r of lt(t))Dr.call(t,r)&&nt(e,r,t[r]);return e},ct=(e,t)=>Rr(e,Ir(t));const st=0,ht=360,Wr=({addBorder:e=!1,colorRanges:t,maxValue:r,minValue:o,currentValue:a,height:s,valueRanges:i,width:d,currentValueColor:g,currentValueFontSize:f})=>{const y=a,v=Math.min(s,d),b=r??i[i.length-1],k=o??i[0],S=Tt({domain:[k,b],startAngle:st,endAngle:ht,numTicks:0,diameter:v});function V(x){var u;const N=i.findIndex(L=>x<L);return N===-1?t[0]:(u=t[N-1])!=null?u:t[N]}return l(D,{children:P("svg",ct(it({},S.getSVGProps()),{viewBox:"-325 -325 600 600",children:[l("g",{id:"arcs",children:l("path",ct(it({},S.getArcProps({offset:20,startAngle:st,endAngle:ht})),{stroke:e?"black":"transparent",fill:V(y),strokeLinecap:"round",strokeWidth:5}))}),l("g",{children:l("text",{textAnchor:"middle",style:{fontSize:`${f??100}px`},alignmentBaseline:"central",fill:g,children:y})})]}))})},Hr=()=>{const e={addBorder:!0,backgColor:"white",currentValue:1010,height:400,width:400,maxValue:1050,minValue:1e3,noValueColor:"",pointerColor:"blue",ringAnchor:5,scaleFontSize:20,valueColor:"darkblue",valueDecimals:1,valueFontSize:50,valueType:"",widKpiType:0,zones:[{color:"blue",maximum:1020,minimum:1e3,transparency:20},{color:"purple",maximum:1040,minimum:1020,transparency:50},{color:"red",maximum:1050,minimum:1040,transparency:0}]},t=Array.from(new Set(p(e.zones).map(o=>[o.minimum,o.maximum]).flat().sort((o,a)=>o-a))),r=p(e.zones).map(o=>W(o.color).setAlpha(1-o.transparency/100).toPercentageRgbString()).flat();return l(D,{children:l(Wr,{addBorder:e.addBorder,backgroundColor:e.backgColor,colorRanges:r,currentValue:e.currentValue,decimals:e.valueDecimals,currentValueColor:e.valueColor,currentValueFontSize:e.valueFontSize,height:e.height,maxValue:e.maxValue,minValue:e.minValue,pointerColor:e.pointerColor,scaleValuesSize:e.scaleFontSize,valueRanges:t,width:e.width})})};export{Lr as ChartRenderer,Hr as WidgetContainer};
2475
2
  //# sourceMappingURL=index.js.map