@burdenoff/microfe-bigconsole 2026.613.2 → 2026.613.4
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/bigconsole/components/dashboard/DashboardCanvas.js +142 -135
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +124 -120
- package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +9 -9
- package/dist/bigconsole/components/widgets/WidgetRegistry.js +65 -8
- package/dist/bigconsole/components/widgets/WidgetRegistry.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +32 -27
- package/dist/bigconsole/components/widgets/WidgetTypeSelector.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetWrapper.js +9 -9
- package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/ChartWidget.js +123 -91
- package/dist/bigconsole/components/widgets/chart/ChartWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/charts/AreaChart.js +40 -35
- package/dist/bigconsole/components/widgets/chart/charts/AreaChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/charts/BarChart.js +30 -25
- package/dist/bigconsole/components/widgets/chart/charts/BarChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/charts/ComboChart.js +139 -0
- package/dist/bigconsole/components/widgets/chart/charts/ComboChart.js.map +1 -0
- package/dist/bigconsole/components/widgets/chart/charts/LineChart.js +35 -30
- package/dist/bigconsole/components/widgets/chart/charts/LineChart.js.map +1 -1
- package/dist/bigconsole/components/widgets/chart/charts/ScatterChart.js +128 -0
- package/dist/bigconsole/components/widgets/chart/charts/ScatterChart.js.map +1 -0
- package/dist/bigconsole/components/widgets/chart/charts/WaterfallChart.js +111 -0
- package/dist/bigconsole/components/widgets/chart/charts/WaterfallChart.js.map +1 -0
- package/dist/bigconsole/components/widgets/chart/charts/index.js +4 -0
- package/dist/bigconsole/components/widgets/chart/charts/referenceElements.js +49 -0
- package/dist/bigconsole/components/widgets/chart/charts/referenceElements.js.map +1 -0
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +72 -68
- package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +74 -24
- package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +87 -86
- package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableCell.js +55 -26
- package/dist/bigconsole/components/widgets/table/TableCell.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableHeader.js +25 -18
- package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
- package/dist/bigconsole/components/widgets/table/TableWidget.js +255 -107
- package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +91 -0
- package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -0
- package/dist/bigconsole/hooks/index.js +2 -0
- package/dist/bigconsole/hooks/useDashboardImageExport.js +1 -0
- package/dist/bigconsole/hooks/useWidgetCatalog.js +82 -0
- package/dist/bigconsole/hooks/useWidgetCatalog.js.map +1 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.js +172 -163
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/utils/widgetTypeMapping.js +1 -0
- package/dist/bigconsole/utils/widgetTypeMapping.js.map +1 -1
- package/dist/generated/wspace-operations.js +17 -17
- package/dist/generated/wspace-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import e from "../ChartTooltip.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { buildReferenceElements as t } from "./referenceElements.js";
|
|
3
|
+
import { memo as n, useMemo as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
import { CartesianGrid as o, Legend as s, Line as c, LineChart as l, ResponsiveContainer as u, Tooltip as d, XAxis as f, YAxis as p } from "recharts";
|
|
5
6
|
//#region src/bigconsole/components/widgets/chart/charts/LineChart.tsx
|
|
6
|
-
var
|
|
7
|
+
var m = [
|
|
7
8
|
"var(--color-chart-1)",
|
|
8
9
|
"var(--color-chart-2)",
|
|
9
10
|
"var(--color-chart-3)",
|
|
10
11
|
"var(--color-chart-4)",
|
|
11
12
|
"var(--color-chart-5)"
|
|
12
|
-
],
|
|
13
|
-
let
|
|
13
|
+
], h = n(function({ data: n = [], config: h, hiddenSeries: g = [], onDataClick: _ }) {
|
|
14
|
+
let v = r(() => n?.length ? Object.keys(n[0]).filter((e) => e !== h.xAxisKey && typeof n[0][e] == "number") : [], [n, h.xAxisKey]), y = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
|
|
14
15
|
notation: e >= 1e4 ? "compact" : "standard",
|
|
15
16
|
maximumFractionDigits: 2
|
|
16
17
|
}).format(e) : String(e);
|
|
17
|
-
return
|
|
18
|
+
return n?.length ? /* @__PURE__ */ i(u, {
|
|
18
19
|
width: "100%",
|
|
19
20
|
height: "100%",
|
|
20
|
-
children: /* @__PURE__ */
|
|
21
|
-
data:
|
|
21
|
+
children: /* @__PURE__ */ a(l, {
|
|
22
|
+
data: n,
|
|
22
23
|
margin: {
|
|
23
24
|
top: 10,
|
|
24
25
|
right: 10,
|
|
@@ -26,64 +27,68 @@ var p = [
|
|
|
26
27
|
bottom: 0
|
|
27
28
|
},
|
|
28
29
|
onClick: (e) => {
|
|
29
|
-
e?.activePayload?.[0] &&
|
|
30
|
+
e?.activePayload?.[0] && _ && _(e.activePayload[0].payload, e.activeTooltipIndex || 0);
|
|
30
31
|
},
|
|
31
32
|
children: [
|
|
32
|
-
|
|
33
|
+
h.showGrid !== !1 && /* @__PURE__ */ i(o, {
|
|
33
34
|
strokeDasharray: "3 3",
|
|
34
35
|
stroke: "var(--color-border-default)",
|
|
35
36
|
opacity: .5
|
|
36
37
|
}),
|
|
37
|
-
/* @__PURE__ */
|
|
38
|
-
dataKey:
|
|
38
|
+
/* @__PURE__ */ i(f, {
|
|
39
|
+
dataKey: h.xAxisKey || "name",
|
|
39
40
|
tick: {
|
|
40
41
|
fill: "var(--color-text-secondary)",
|
|
41
42
|
fontSize: 12
|
|
42
43
|
},
|
|
43
44
|
tickLine: { stroke: "var(--color-border-default)" },
|
|
44
45
|
axisLine: { stroke: "var(--color-border-default)" },
|
|
45
|
-
label:
|
|
46
|
-
value:
|
|
46
|
+
label: h.xAxisLabel ? {
|
|
47
|
+
value: h.xAxisLabel,
|
|
47
48
|
position: "insideBottom",
|
|
48
49
|
offset: -5,
|
|
49
50
|
fill: "var(--color-text-secondary)"
|
|
50
51
|
} : void 0
|
|
51
52
|
}),
|
|
52
|
-
/* @__PURE__ */
|
|
53
|
+
/* @__PURE__ */ i(p, {
|
|
53
54
|
tick: {
|
|
54
55
|
fill: "var(--color-text-secondary)",
|
|
55
56
|
fontSize: 12
|
|
56
57
|
},
|
|
57
58
|
tickLine: { stroke: "var(--color-border-default)" },
|
|
58
59
|
axisLine: { stroke: "var(--color-border-default)" },
|
|
59
|
-
tickFormatter:
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
tickFormatter: y,
|
|
61
|
+
scale: h.logScale ? "log" : "auto",
|
|
62
|
+
domain: h.logScale ? ["auto", "auto"] : void 0,
|
|
63
|
+
allowDataOverflow: h.logScale || void 0,
|
|
64
|
+
label: h.yAxisLabel ? {
|
|
65
|
+
value: h.yAxisLabel,
|
|
62
66
|
angle: -90,
|
|
63
67
|
position: "insideLeft",
|
|
64
68
|
fill: "var(--color-text-secondary)"
|
|
65
69
|
} : void 0
|
|
66
70
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
68
|
-
content: /* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ i(d, {
|
|
72
|
+
content: /* @__PURE__ */ i(e, { valueFormatter: y }),
|
|
69
73
|
cursor: { stroke: "var(--color-border-default)" }
|
|
70
74
|
}),
|
|
71
|
-
|
|
75
|
+
h.showLegend !== !1 && /* @__PURE__ */ i(s, {
|
|
72
76
|
wrapperStyle: { paddingTop: 20 },
|
|
73
|
-
formatter: (e) => /* @__PURE__ */
|
|
77
|
+
formatter: (e) => /* @__PURE__ */ i("span", {
|
|
74
78
|
style: { color: "var(--color-text-primary)" },
|
|
75
79
|
children: e
|
|
76
80
|
})
|
|
77
81
|
}),
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
t(h.referenceLines),
|
|
83
|
+
v.map((e, t) => /* @__PURE__ */ i(c, {
|
|
84
|
+
type: h.curveType || "monotone",
|
|
80
85
|
dataKey: e,
|
|
81
|
-
name:
|
|
82
|
-
stroke:
|
|
86
|
+
name: h.seriesNames?.[e] || e,
|
|
87
|
+
stroke: h.colors?.[t] || m[t % m.length],
|
|
83
88
|
strokeWidth: 2,
|
|
84
|
-
dot:
|
|
89
|
+
dot: h.showDots !== !1,
|
|
85
90
|
activeDot: { r: 6 },
|
|
86
|
-
hide:
|
|
91
|
+
hide: g.includes(e),
|
|
87
92
|
connectNulls: !0
|
|
88
93
|
}, e))
|
|
89
94
|
]
|
|
@@ -91,6 +96,6 @@ var p = [
|
|
|
91
96
|
}) : null;
|
|
92
97
|
});
|
|
93
98
|
//#endregion
|
|
94
|
-
export {
|
|
99
|
+
export { h as default };
|
|
95
100
|
|
|
96
101
|
//# sourceMappingURL=LineChart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/LineChart.tsx"],"sourcesContent":["/**\n * LineChart Component\n *\n * Line chart using Recharts.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n LineChart as RechartsLineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineChartProps {\n /** Chart data */\n data: ChartData[];\n /** Chart configuration */\n config: ChartConfig;\n /** Series to hide */\n hiddenSeries?: string[];\n /** Click handler for data points */\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const LineChart: FC<LineChartProps> = memo(function LineChart({\n data = [],\n config,\n hiddenSeries = [],\n onDataClick,\n}) {\n // Extract data keys (series)\n const dataKeys = useMemo(() => {\n if (!data?.length) return [];\n const keys = Object.keys(data[0]).filter((key) => key !== config.xAxisKey && typeof data[0][key] === 'number');\n return keys;\n }, [data, config.xAxisKey]);\n\n // Format value\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: value >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) {\n return null;\n }\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsLineChart\n data={data}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n\n <XAxis\n dataKey={config.xAxisKey || 'name'}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n label={\n config.xAxisLabel\n ? {\n value: config.xAxisLabel,\n position: 'insideBottom',\n offset: -5,\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n label={\n config.yAxisLabel\n ? {\n value: config.yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ stroke: 'var(--color-border-default)' }}\n />\n\n {config.showLegend !== false && (\n <Legend\n wrapperStyle={{ paddingTop: 20 }}\n formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>}\n />\n )}\n\n {dataKeys.map((key, index) => (\n <Line\n key={key}\n type={config.curveType || 'monotone'}\n dataKey={key}\n name={config.seriesNames?.[key] || key}\n stroke={config.colors?.[index] || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n strokeWidth={2}\n dot={config.showDots !== false}\n activeDot={{ r: 6 }}\n hide={hiddenSeries.includes(key)}\n connectNulls\n />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n );\n});\n\nexport default LineChart;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"LineChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/LineChart.tsx"],"sourcesContent":["/**\n * LineChart Component\n *\n * Line chart using Recharts.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n LineChart as RechartsLineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineChartProps {\n /** Chart data */\n data: ChartData[];\n /** Chart configuration */\n config: ChartConfig;\n /** Series to hide */\n hiddenSeries?: string[];\n /** Click handler for data points */\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const LineChart: FC<LineChartProps> = memo(function LineChart({\n data = [],\n config,\n hiddenSeries = [],\n onDataClick,\n}) {\n // Extract data keys (series)\n const dataKeys = useMemo(() => {\n if (!data?.length) return [];\n const keys = Object.keys(data[0]).filter((key) => key !== config.xAxisKey && typeof data[0][key] === 'number');\n return keys;\n }, [data, config.xAxisKey]);\n\n // Format value\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: value >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) {\n return null;\n }\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsLineChart\n data={data}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n\n <XAxis\n dataKey={config.xAxisKey || 'name'}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n label={\n config.xAxisLabel\n ? {\n value: config.xAxisLabel,\n position: 'insideBottom',\n offset: -5,\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n allowDataOverflow={config.logScale || undefined}\n label={\n config.yAxisLabel\n ? {\n value: config.yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ stroke: 'var(--color-border-default)' }}\n />\n\n {config.showLegend !== false && (\n <Legend\n wrapperStyle={{ paddingTop: 20 }}\n formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>}\n />\n )}\n\n {buildReferenceElements(config.referenceLines)}\n\n {dataKeys.map((key, index) => (\n <Line\n key={key}\n type={config.curveType || 'monotone'}\n dataKey={key}\n name={config.seriesNames?.[key] || key}\n stroke={config.colors?.[index] || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n strokeWidth={2}\n dot={config.showDots !== false}\n activeDot={{ r: 6 }}\n hide={hiddenSeries.includes(key)}\n connectNulls\n />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n );\n});\n\nexport default LineChart;\n"],"mappings":";;;;;;AAwCA,IAAM,IAAiB;CACrB;CACA;CACA;CACA;CACA;CACD,EAMY,IAAgC,EAAK,SAAmB,EACnE,UAAO,EAAE,EACT,WACA,kBAAe,EAAE,EACjB,kBACC;CAED,IAAM,IAAW,QACV,GAAM,SACE,OAAO,KAAK,EAAK,GAAG,CAAC,QAAQ,MAAQ,MAAQ,EAAO,YAAY,OAAO,EAAK,GAAG,MAAS,SAAS,GADpF,EAAE,EAG3B,CAAC,GAAM,EAAO,SAAS,CAAC,EAGrB,KAAe,MACf,OAAO,KAAU,WACd,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU,KAAS,MAAQ,YAAY;EACvC,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAM,GAJsB,OAAO,EAAM;AAWrD,QAJK,GAAM,SAKT,kBAAC,GAAD;EAAqB,OAAM;EAAO,QAAO;YACvC,kBAAC,GAAD;GACQ;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,MAAM;IAAG,QAAQ;IAAG;GAClD,UAAU,MAAM;AACd,IAAI,GAAG,gBAAgB,MAAM,KAC3B,EAAY,EAAE,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE;;aALxE;IASG,EAAO,aAAa,MACnB,kBAAC,GAAD;KAAe,iBAAgB;KAAM,QAAO;KAA8B,SAAS;KAAO,CAAA;IAG5F,kBAAC,GAAD;KACE,SAAS,EAAO,YAAY;KAC5B,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,UAAU;MACV,QAAQ;MACR,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,eAAe;KACf,OAAO,EAAO,WAAW,QAAQ;KACjC,QAAQ,EAAO,WAAW,CAAC,QAAQ,OAAO,GAAG,KAAA;KAC7C,mBAAmB,EAAO,YAAY,KAAA;KACtC,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,OAAO;MACP,UAAU;MACV,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAc,gBAAgB,GAAe,CAAA;KACtD,QAAQ,EAAE,QAAQ,+BAA+B;KACjD,CAAA;IAED,EAAO,eAAe,MACrB,kBAAC,GAAD;KACE,cAAc,EAAE,YAAY,IAAI;KAChC,YAAY,MAAU,kBAAC,QAAD;MAAM,OAAO,EAAE,OAAO,6BAA6B;gBAAG;MAAa,CAAA;KACzF,CAAA;IAGH,EAAuB,EAAO,eAAe;IAE7C,EAAS,KAAK,GAAK,MAClB,kBAAC,GAAD;KAEE,MAAM,EAAO,aAAa;KAC1B,SAAS;KACT,MAAM,EAAO,cAAc,MAAQ;KACnC,QAAQ,EAAO,SAAS,MAAU,EAAe,IAAQ,EAAe;KACxE,aAAa;KACb,KAAK,EAAO,aAAa;KACzB,WAAW,EAAE,GAAG,GAAG;KACnB,MAAM,EAAa,SAAS,EAAI;KAChC,cAAA;KACA,EAVK,EAUL,CACF;IACgB;;EACA,CAAA,GApFf;EAsFT"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import e from "../ChartTooltip.js";
|
|
2
|
+
import { buildReferenceElements as t } from "./referenceElements.js";
|
|
3
|
+
import { memo as n, useMemo as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
import { CartesianGrid as o, Legend as s, ResponsiveContainer as c, Scatter as l, ScatterChart as u, Tooltip as d, XAxis as f, YAxis as p, ZAxis as m } from "recharts";
|
|
6
|
+
//#region src/bigconsole/components/widgets/chart/charts/ScatterChart.tsx
|
|
7
|
+
var h = [
|
|
8
|
+
"var(--color-chart-1)",
|
|
9
|
+
"var(--color-chart-2)",
|
|
10
|
+
"var(--color-chart-3)",
|
|
11
|
+
"var(--color-chart-4)",
|
|
12
|
+
"var(--color-chart-5)"
|
|
13
|
+
], g = n(function({ data: n = [], config: g, onDataClick: _ }) {
|
|
14
|
+
let { xKey: v, yKey: y } = r(() => {
|
|
15
|
+
if (g.xField && g.yField) return {
|
|
16
|
+
xKey: g.xField,
|
|
17
|
+
yKey: g.yField
|
|
18
|
+
};
|
|
19
|
+
let e = n.length ? Object.keys(n[0]).filter((e) => typeof n[0][e] == "number") : [];
|
|
20
|
+
return {
|
|
21
|
+
xKey: g.xField || e[0] || "x",
|
|
22
|
+
yKey: g.yField || e[1] || "y"
|
|
23
|
+
};
|
|
24
|
+
}, [
|
|
25
|
+
g.xField,
|
|
26
|
+
g.yField,
|
|
27
|
+
n
|
|
28
|
+
]), b = g.sizeField, x = g.colorField, S = r(() => {
|
|
29
|
+
if (!x) return [{
|
|
30
|
+
name: g.seriesNames?.[y] || y,
|
|
31
|
+
points: n
|
|
32
|
+
}];
|
|
33
|
+
let e = /* @__PURE__ */ new Map();
|
|
34
|
+
for (let t of n) {
|
|
35
|
+
let n = String(t[x] ?? "—");
|
|
36
|
+
e.has(n) || e.set(n, []), e.get(n).push(t);
|
|
37
|
+
}
|
|
38
|
+
return Array.from(e.entries()).map(([e, t]) => ({
|
|
39
|
+
name: e,
|
|
40
|
+
points: t
|
|
41
|
+
}));
|
|
42
|
+
}, [
|
|
43
|
+
n,
|
|
44
|
+
x,
|
|
45
|
+
y,
|
|
46
|
+
g.seriesNames
|
|
47
|
+
]), C = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
|
|
48
|
+
notation: Math.abs(e) >= 1e4 ? "compact" : "standard",
|
|
49
|
+
maximumFractionDigits: 2
|
|
50
|
+
}).format(e) : String(e);
|
|
51
|
+
return n?.length ? /* @__PURE__ */ i(c, {
|
|
52
|
+
width: "100%",
|
|
53
|
+
height: "100%",
|
|
54
|
+
children: /* @__PURE__ */ a(u, {
|
|
55
|
+
margin: {
|
|
56
|
+
top: 10,
|
|
57
|
+
right: 10,
|
|
58
|
+
left: 0,
|
|
59
|
+
bottom: 0
|
|
60
|
+
},
|
|
61
|
+
children: [
|
|
62
|
+
g.showGrid !== !1 && /* @__PURE__ */ i(o, {
|
|
63
|
+
strokeDasharray: "3 3",
|
|
64
|
+
stroke: "var(--color-border-default)",
|
|
65
|
+
opacity: .5
|
|
66
|
+
}),
|
|
67
|
+
/* @__PURE__ */ i(f, {
|
|
68
|
+
type: "number",
|
|
69
|
+
dataKey: v,
|
|
70
|
+
name: g.xAxisLabel || v,
|
|
71
|
+
tick: {
|
|
72
|
+
fill: "var(--color-text-secondary)",
|
|
73
|
+
fontSize: 12
|
|
74
|
+
},
|
|
75
|
+
tickLine: { stroke: "var(--color-border-default)" },
|
|
76
|
+
axisLine: { stroke: "var(--color-border-default)" },
|
|
77
|
+
tickFormatter: C,
|
|
78
|
+
scale: g.logScale ? "log" : "auto",
|
|
79
|
+
domain: g.logScale ? ["auto", "auto"] : void 0
|
|
80
|
+
}),
|
|
81
|
+
/* @__PURE__ */ i(p, {
|
|
82
|
+
type: "number",
|
|
83
|
+
dataKey: y,
|
|
84
|
+
name: g.yAxisLabel || y,
|
|
85
|
+
tick: {
|
|
86
|
+
fill: "var(--color-text-secondary)",
|
|
87
|
+
fontSize: 12
|
|
88
|
+
},
|
|
89
|
+
tickLine: { stroke: "var(--color-border-default)" },
|
|
90
|
+
axisLine: { stroke: "var(--color-border-default)" },
|
|
91
|
+
tickFormatter: C,
|
|
92
|
+
scale: g.logScale ? "log" : "auto",
|
|
93
|
+
domain: g.logScale ? ["auto", "auto"] : void 0
|
|
94
|
+
}),
|
|
95
|
+
b && /* @__PURE__ */ i(m, {
|
|
96
|
+
type: "number",
|
|
97
|
+
dataKey: b,
|
|
98
|
+
range: [40, 400],
|
|
99
|
+
name: b
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ i(d, {
|
|
102
|
+
content: /* @__PURE__ */ i(e, { valueFormatter: C }),
|
|
103
|
+
cursor: {
|
|
104
|
+
strokeDasharray: "3 3",
|
|
105
|
+
stroke: "var(--color-border-default)"
|
|
106
|
+
}
|
|
107
|
+
}),
|
|
108
|
+
S.length > 1 && g.showLegend !== !1 && /* @__PURE__ */ i(s, { formatter: (e) => /* @__PURE__ */ i("span", {
|
|
109
|
+
style: { color: "var(--color-text-primary)" },
|
|
110
|
+
children: e
|
|
111
|
+
}) }),
|
|
112
|
+
t(g.referenceLines),
|
|
113
|
+
S.map((e, t) => /* @__PURE__ */ i(l, {
|
|
114
|
+
name: e.name,
|
|
115
|
+
data: e.points,
|
|
116
|
+
fill: g.colors?.[t] || h[t % h.length],
|
|
117
|
+
onClick: (e) => {
|
|
118
|
+
_ && e?.payload && _(e.payload, 0);
|
|
119
|
+
}
|
|
120
|
+
}, e.name))
|
|
121
|
+
]
|
|
122
|
+
})
|
|
123
|
+
}) : null;
|
|
124
|
+
});
|
|
125
|
+
//#endregion
|
|
126
|
+
export { g as default };
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=ScatterChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScatterChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/ScatterChart.tsx"],"sourcesContent":["/**\n * ScatterChart Component\n *\n * Scatter / bubble chart using Recharts `ScatterChart`. Plots `xField` vs\n * `yField`; an optional `sizeField` drives bubble radius (ZAxis) and an\n * optional `colorField` splits points into colored groups.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n ScatterChart as RechartsScatterChart,\n Scatter,\n XAxis,\n YAxis,\n ZAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\nexport interface ScatterChartProps {\n data: ChartData[];\n config: ChartConfig;\n hiddenSeries?: string[];\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\nexport const ScatterChart: FC<ScatterChartProps> = memo(function ScatterChart({ data = [], config, onDataClick }) {\n // Resolve axis fields, falling back to the first two numeric fields.\n const { xKey, yKey } = useMemo(() => {\n if (config.xField && config.yField) return { xKey: config.xField, yKey: config.yField };\n const numeric = data.length ? Object.keys(data[0]).filter((k) => typeof data[0][k] === 'number') : [];\n return { xKey: config.xField || numeric[0] || 'x', yKey: config.yField || numeric[1] || 'y' };\n }, [config.xField, config.yField, data]);\n\n const sizeKey = config.sizeField;\n const colorKey = config.colorField;\n\n // Group points by colorField (single group when absent).\n const groups = useMemo(() => {\n if (!colorKey) return [{ name: config.seriesNames?.[yKey] || yKey, points: data }];\n const map = new Map<string, ChartData[]>();\n for (const row of data) {\n const key = String(row[colorKey] ?? '—');\n if (!map.has(key)) map.set(key, []);\n map.get(key)!.push(row);\n }\n return Array.from(map.entries()).map(([name, points]) => ({ name, points }));\n }, [data, colorKey, yKey, config.seriesNames]);\n\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: Math.abs(value) >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) return null;\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsScatterChart margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n <XAxis\n type=\"number\"\n dataKey={xKey}\n name={config.xAxisLabel || xKey}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n />\n <YAxis\n type=\"number\"\n dataKey={yKey}\n name={config.yAxisLabel || yKey}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n />\n {sizeKey && <ZAxis type=\"number\" dataKey={sizeKey} range={[40, 400]} name={sizeKey} />}\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ strokeDasharray: '3 3', stroke: 'var(--color-border-default)' }}\n />\n {groups.length > 1 && config.showLegend !== false && (\n <Legend formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>} />\n )}\n {buildReferenceElements(config.referenceLines)}\n {groups.map((g, i) => (\n <Scatter\n key={g.name}\n name={g.name}\n data={g.points}\n fill={config.colors?.[i] || DEFAULT_COLORS[i % DEFAULT_COLORS.length]}\n onClick={(point) => {\n if (onDataClick && point?.payload) onDataClick(point.payload as ChartData, 0);\n }}\n />\n ))}\n </RechartsScatterChart>\n </ResponsiveContainer>\n );\n});\n\nexport default ScatterChart;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import e from "../ChartTooltip.js";
|
|
2
|
+
import { buildReferenceElements as t } from "./referenceElements.js";
|
|
3
|
+
import { memo as n, useMemo as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
import { Bar as o, BarChart as s, CartesianGrid as c, Cell as l, ResponsiveContainer as u, Tooltip as d, XAxis as f, YAxis as p } from "recharts";
|
|
6
|
+
//#region src/bigconsole/components/widgets/chart/charts/WaterfallChart.tsx
|
|
7
|
+
var m = "var(--color-status-success)", h = "var(--color-status-error)", g = "var(--color-chart-1)", _ = n(function({ data: n = [], config: _, onDataClick: v }) {
|
|
8
|
+
let y = _.labelField || _.xAxisKey || "name", b = _.valueField || "value", x = r(() => {
|
|
9
|
+
if (!n.length) return [];
|
|
10
|
+
let e = 0, t = n.map((t) => {
|
|
11
|
+
let n = typeof t[b] == "number" ? t[b] : Number(t[b]) || 0, r = n >= 0 ? e : e + n;
|
|
12
|
+
return e += n, {
|
|
13
|
+
name: String(t[y] ?? ""),
|
|
14
|
+
base: r,
|
|
15
|
+
delta: Math.abs(n),
|
|
16
|
+
cumulative: e,
|
|
17
|
+
isTotal: !1,
|
|
18
|
+
sign: n >= 0 ? "up" : "down"
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
return _.showTotal && t.push({
|
|
22
|
+
name: _.totalLabel || "Total",
|
|
23
|
+
base: 0,
|
|
24
|
+
delta: e,
|
|
25
|
+
cumulative: e,
|
|
26
|
+
isTotal: !0,
|
|
27
|
+
sign: "total"
|
|
28
|
+
}), t;
|
|
29
|
+
}, [
|
|
30
|
+
n,
|
|
31
|
+
y,
|
|
32
|
+
b,
|
|
33
|
+
_.showTotal,
|
|
34
|
+
_.totalLabel
|
|
35
|
+
]), S = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
|
|
36
|
+
notation: Math.abs(e) >= 1e4 ? "compact" : "standard",
|
|
37
|
+
maximumFractionDigits: 2
|
|
38
|
+
}).format(e) : String(e);
|
|
39
|
+
return x.length ? /* @__PURE__ */ i(u, {
|
|
40
|
+
width: "100%",
|
|
41
|
+
height: "100%",
|
|
42
|
+
children: /* @__PURE__ */ a(s, {
|
|
43
|
+
data: x,
|
|
44
|
+
margin: {
|
|
45
|
+
top: 10,
|
|
46
|
+
right: 10,
|
|
47
|
+
left: 0,
|
|
48
|
+
bottom: 0
|
|
49
|
+
},
|
|
50
|
+
onClick: (e) => {
|
|
51
|
+
e?.activePayload?.[0] && v && v(e.activePayload[0].payload, e.activeTooltipIndex || 0);
|
|
52
|
+
},
|
|
53
|
+
children: [
|
|
54
|
+
_.showGrid !== !1 && /* @__PURE__ */ i(c, {
|
|
55
|
+
strokeDasharray: "3 3",
|
|
56
|
+
stroke: "var(--color-border-default)",
|
|
57
|
+
opacity: .5,
|
|
58
|
+
vertical: !1
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ i(f, {
|
|
61
|
+
dataKey: "name",
|
|
62
|
+
tick: {
|
|
63
|
+
fill: "var(--color-text-secondary)",
|
|
64
|
+
fontSize: 12
|
|
65
|
+
},
|
|
66
|
+
tickLine: { stroke: "var(--color-border-default)" },
|
|
67
|
+
axisLine: { stroke: "var(--color-border-default)" }
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ i(p, {
|
|
70
|
+
tick: {
|
|
71
|
+
fill: "var(--color-text-secondary)",
|
|
72
|
+
fontSize: 12
|
|
73
|
+
},
|
|
74
|
+
tickLine: { stroke: "var(--color-border-default)" },
|
|
75
|
+
axisLine: { stroke: "var(--color-border-default)" },
|
|
76
|
+
tickFormatter: S
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ i(d, {
|
|
79
|
+
content: /* @__PURE__ */ i(e, { valueFormatter: S }),
|
|
80
|
+
cursor: {
|
|
81
|
+
fill: "var(--color-bg-muted)",
|
|
82
|
+
opacity: .5
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
t(_.referenceLines),
|
|
86
|
+
/* @__PURE__ */ i(o, {
|
|
87
|
+
dataKey: "base",
|
|
88
|
+
stackId: "wf",
|
|
89
|
+
fill: "transparent",
|
|
90
|
+
isAnimationActive: !1
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ i(o, {
|
|
93
|
+
dataKey: "delta",
|
|
94
|
+
stackId: "wf",
|
|
95
|
+
radius: [
|
|
96
|
+
4,
|
|
97
|
+
4,
|
|
98
|
+
0,
|
|
99
|
+
0
|
|
100
|
+
],
|
|
101
|
+
name: "Change",
|
|
102
|
+
children: x.map((e, t) => /* @__PURE__ */ i(l, { fill: e.sign === "total" ? g : e.sign === "up" ? m : h }, t))
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
})
|
|
106
|
+
}) : null;
|
|
107
|
+
});
|
|
108
|
+
//#endregion
|
|
109
|
+
export { _ as default };
|
|
110
|
+
|
|
111
|
+
//# sourceMappingURL=WaterfallChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaterfallChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/WaterfallChart.tsx"],"sourcesContent":["/**\n * WaterfallChart Component\n *\n * Bridge / waterfall chart (budget-vs-actual, P&L) using a Recharts stacked\n * BarChart: a transparent \"base\" bar floats each visible delta bar to its\n * running cumulative position. Positive steps render success-toned, negative\n * steps danger-toned, and an optional final bar shows the cumulative total.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n BarChart as RechartsBarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Cell,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\nexport interface WaterfallChartProps {\n data: ChartData[];\n config: ChartConfig;\n hiddenSeries?: string[];\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\ninterface WaterfallRow {\n name: string;\n base: number;\n delta: number;\n cumulative: number;\n isTotal: boolean;\n sign: 'up' | 'down' | 'total';\n}\n\nconst COLOR_UP = 'var(--color-status-success)';\nconst COLOR_DOWN = 'var(--color-status-error)';\nconst COLOR_TOTAL = 'var(--color-chart-1)';\n\nexport const WaterfallChart: FC<WaterfallChartProps> = memo(function WaterfallChart({\n data = [],\n config,\n onDataClick,\n}) {\n const labelKey = config.labelField || config.xAxisKey || 'name';\n const valueKey = config.valueField || 'value';\n\n const rows: WaterfallRow[] = useMemo(() => {\n if (!data.length) return [];\n let cumulative = 0;\n const out: WaterfallRow[] = data.map((d) => {\n const delta = typeof d[valueKey] === 'number' ? (d[valueKey] as number) : Number(d[valueKey]) || 0;\n const base = delta >= 0 ? cumulative : cumulative + delta;\n cumulative += delta;\n return {\n name: String(d[labelKey] ?? ''),\n base,\n delta: Math.abs(delta),\n cumulative,\n isTotal: false,\n sign: delta >= 0 ? 'up' : 'down',\n };\n });\n if (config.showTotal) {\n out.push({\n name: config.totalLabel || 'Total',\n base: 0,\n delta: cumulative,\n cumulative,\n isTotal: true,\n sign: 'total',\n });\n }\n return out;\n }, [data, labelKey, valueKey, config.showTotal, config.totalLabel]);\n\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: Math.abs(value) >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!rows.length) return null;\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsBarChart\n data={rows}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} vertical={false} />\n )}\n <XAxis\n dataKey=\"name\"\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n />\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n />\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ fill: 'var(--color-bg-muted)', opacity: 0.5 }}\n />\n {buildReferenceElements(config.referenceLines)}\n {/* Transparent floating base */}\n <Bar dataKey=\"base\" stackId=\"wf\" fill=\"transparent\" isAnimationActive={false} />\n {/* Visible delta, colored by direction */}\n <Bar dataKey=\"delta\" stackId=\"wf\" radius={[4, 4, 0, 0]} name=\"Change\">\n {rows.map((r, i) => (\n <Cell key={i} fill={r.sign === 'total' ? COLOR_TOTAL : r.sign === 'up' ? COLOR_UP : COLOR_DOWN} />\n ))}\n </Bar>\n </RechartsBarChart>\n </ResponsiveContainer>\n );\n});\n\nexport default WaterfallChart;\n"],"mappings":";;;;;;AAwCA,IAAM,IAAW,+BACX,IAAa,6BACb,IAAc,wBAEP,IAA0C,EAAK,SAAwB,EAClF,UAAO,EAAE,EACT,WACA,kBACC;CACD,IAAM,IAAW,EAAO,cAAc,EAAO,YAAY,QACnD,IAAW,EAAO,cAAc,SAEhC,IAAuB,QAAc;AACzC,MAAI,CAAC,EAAK,OAAQ,QAAO,EAAE;EAC3B,IAAI,IAAa,GACX,IAAsB,EAAK,KAAK,MAAM;GAC1C,IAAM,IAAQ,OAAO,EAAE,MAAc,WAAY,EAAE,KAAuB,OAAO,EAAE,GAAU,IAAI,GAC3F,IAAO,KAAS,IAAI,IAAa,IAAa;AAEpD,UADA,KAAc,GACP;IACL,MAAM,OAAO,EAAE,MAAa,GAAG;IAC/B;IACA,OAAO,KAAK,IAAI,EAAM;IACtB;IACA,SAAS;IACT,MAAM,KAAS,IAAI,OAAO;IAC3B;IACD;AAWF,SAVI,EAAO,aACT,EAAI,KAAK;GACP,MAAM,EAAO,cAAc;GAC3B,MAAM;GACN,OAAO;GACP;GACA,SAAS;GACT,MAAM;GACP,CAAC,EAEG;IACN;EAAC;EAAM;EAAU;EAAU,EAAO;EAAW,EAAO;EAAW,CAAC,EAE7D,KAAe,MACf,OAAO,KAAU,WACd,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU,KAAK,IAAI,EAAM,IAAI,MAAQ,YAAY;EACjD,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAM,GAJsB,OAAO,EAAM;AASrD,QAFK,EAAK,SAGR,kBAAC,GAAD;EAAqB,OAAM;EAAO,QAAO;YACvC,kBAAC,GAAD;GACE,MAAM;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,MAAM;IAAG,QAAQ;IAAG;GAClD,UAAU,MAAM;AACd,IAAI,GAAG,gBAAgB,MAAM,KAC3B,EAAY,EAAE,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE;;aALxE;IASG,EAAO,aAAa,MACnB,kBAAC,GAAD;KAAe,iBAAgB;KAAM,QAAO;KAA8B,SAAS;KAAK,UAAU;KAAS,CAAA;IAE7G,kBAAC,GAAD;KACE,SAAQ;KACR,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,CAAA;IACF,kBAAC,GAAD;KACE,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,eAAe;KACf,CAAA;IACF,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAc,gBAAgB,GAAe,CAAA;KACtD,QAAQ;MAAE,MAAM;MAAyB,SAAS;MAAK;KACvD,CAAA;IACD,EAAuB,EAAO,eAAe;IAE9C,kBAAC,GAAD;KAAK,SAAQ;KAAO,SAAQ;KAAK,MAAK;KAAc,mBAAmB;KAAS,CAAA;IAEhF,kBAAC,GAAD;KAAK,SAAQ;KAAQ,SAAQ;KAAK,QAAQ;MAAC;MAAG;MAAG;MAAG;MAAE;KAAE,MAAK;eAC1D,EAAK,KAAK,GAAG,MACZ,kBAAC,GAAD,EAAc,MAAM,EAAE,SAAS,UAAU,IAAc,EAAE,SAAS,OAAO,IAAW,GAAc,EAAvF,EAAuF,CAClG;KACE,CAAA;IACW;;EACC,CAAA,GA1CC;EA4CzB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { intentToCssVar as e } from "../../utils/conditionalFormat.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { ReferenceArea as n, ReferenceLine as r } from "recharts";
|
|
4
|
+
//#region src/bigconsole/components/widgets/chart/charts/referenceElements.tsx
|
|
5
|
+
function i(i, a) {
|
|
6
|
+
return i?.length ? i.map((i, o) => {
|
|
7
|
+
let s = e(i.color ?? "danger"), c = (i.axis ?? "y") === "y", l = a?.yAxisId;
|
|
8
|
+
if (i.value2 != null) {
|
|
9
|
+
let e = Math.min(i.value, i.value2), r = Math.max(i.value, i.value2);
|
|
10
|
+
return /* @__PURE__ */ t(n, {
|
|
11
|
+
...c ? {
|
|
12
|
+
y1: e,
|
|
13
|
+
y2: r
|
|
14
|
+
} : {
|
|
15
|
+
x1: e,
|
|
16
|
+
x2: r
|
|
17
|
+
},
|
|
18
|
+
...l == null ? {} : { yAxisId: l },
|
|
19
|
+
fill: s,
|
|
20
|
+
fillOpacity: .1,
|
|
21
|
+
stroke: s,
|
|
22
|
+
strokeOpacity: .3,
|
|
23
|
+
label: i.label ? {
|
|
24
|
+
value: i.label,
|
|
25
|
+
fill: s,
|
|
26
|
+
fontSize: 11,
|
|
27
|
+
position: "insideTopLeft"
|
|
28
|
+
} : void 0
|
|
29
|
+
}, `ref-band-${o}`);
|
|
30
|
+
}
|
|
31
|
+
return /* @__PURE__ */ t(r, {
|
|
32
|
+
...c ? { y: i.value } : { x: i.value },
|
|
33
|
+
...l == null ? {} : { yAxisId: l },
|
|
34
|
+
stroke: s,
|
|
35
|
+
strokeWidth: 1.5,
|
|
36
|
+
strokeDasharray: i.dashed === !1 ? void 0 : "6 4",
|
|
37
|
+
label: i.label ? {
|
|
38
|
+
value: i.label,
|
|
39
|
+
fill: s,
|
|
40
|
+
fontSize: 11,
|
|
41
|
+
position: "right"
|
|
42
|
+
} : void 0
|
|
43
|
+
}, `ref-line-${o}`);
|
|
44
|
+
}) : [];
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { i as buildReferenceElements };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=referenceElements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceElements.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/referenceElements.tsx"],"sourcesContent":["/**\n * Reference / threshold line & band helpers (Recharts).\n *\n * Builds `ReferenceLine` / `ReferenceArea` elements from a widget's\n * `config.referenceLines`. Colors are resolved from semantic intents so\n * targets / control limits / SLAs stay theme-aware.\n */\n\nimport { ReferenceLine, ReferenceArea } from 'recharts';\nimport type { ReactElement } from 'react';\nimport { intentToCssVar, type SemanticIntent } from '../../utils/conditionalFormat';\n\nexport interface ReferenceLineConfig {\n axis?: 'x' | 'y';\n value: number;\n value2?: number;\n label?: string;\n color?: SemanticIntent;\n dashed?: boolean;\n}\n\n/**\n * Build reference line/band elements for a cartesian chart.\n * `yAxisIds` lets dual-axis charts target the correct axis (defaults to none).\n */\nexport function buildReferenceElements(\n referenceLines: ReferenceLineConfig[] | undefined,\n opts?: { yAxisId?: string | number }\n): ReactElement[] {\n if (!referenceLines?.length) return [];\n\n return referenceLines.map((ref, index) => {\n const color = intentToCssVar(ref.color ?? 'danger');\n const onY = (ref.axis ?? 'y') === 'y';\n const yAxisId = opts?.yAxisId;\n\n // Band (shaded area) when a second bound is supplied.\n if (ref.value2 != null) {\n const lo = Math.min(ref.value, ref.value2);\n const hi = Math.max(ref.value, ref.value2);\n return (\n <ReferenceArea\n key={`ref-band-${index}`}\n {...(onY ? { y1: lo, y2: hi } : { x1: lo, x2: hi })}\n {...(yAxisId != null ? { yAxisId } : {})}\n fill={color}\n fillOpacity={0.1}\n stroke={color}\n strokeOpacity={0.3}\n label={ref.label ? { value: ref.label, fill: color, fontSize: 11, position: 'insideTopLeft' } : undefined}\n />\n );\n }\n\n return (\n <ReferenceLine\n key={`ref-line-${index}`}\n {...(onY ? { y: ref.value } : { x: ref.value })}\n {...(yAxisId != null ? { yAxisId } : {})}\n stroke={color}\n strokeWidth={1.5}\n strokeDasharray={ref.dashed === false ? undefined : '6 4'}\n label={ref.label ? { value: ref.label, fill: color, fontSize: 11, position: 'right' } : undefined}\n />\n );\n });\n}\n"],"mappings":";;;;AAyBA,SAAgB,EACd,GACA,GACgB;AAGhB,QAFK,GAAgB,SAEd,EAAe,KAAK,GAAK,MAAU;EACxC,IAAM,IAAQ,EAAe,EAAI,SAAS,SAAS,EAC7C,KAAO,EAAI,QAAQ,SAAS,KAC5B,IAAU,GAAM;AAGtB,MAAI,EAAI,UAAU,MAAM;GACtB,IAAM,IAAK,KAAK,IAAI,EAAI,OAAO,EAAI,OAAO,EACpC,IAAK,KAAK,IAAI,EAAI,OAAO,EAAI,OAAO;AAC1C,UACE,kBAAC,GAAD;IAEE,GAAK,IAAM;KAAE,IAAI;KAAI,IAAI;KAAI,GAAG;KAAE,IAAI;KAAI,IAAI;KAAI;IAClD,GAAK,KAAW,OAAqB,EAAE,GAAhB,EAAE,YAAS;IAClC,MAAM;IACN,aAAa;IACb,QAAQ;IACR,eAAe;IACf,OAAO,EAAI,QAAQ;KAAE,OAAO,EAAI;KAAO,MAAM;KAAO,UAAU;KAAI,UAAU;KAAiB,GAAG,KAAA;IAChG,EARK,YAAY,IAQjB;;AAIN,SACE,kBAAC,GAAD;GAEE,GAAK,IAAM,EAAE,GAAG,EAAI,OAAO,GAAG,EAAE,GAAG,EAAI,OAAO;GAC9C,GAAK,KAAW,OAAqB,EAAE,GAAhB,EAAE,YAAS;GAClC,QAAQ;GACR,aAAa;GACb,iBAAiB,EAAI,WAAW,KAAQ,KAAA,IAAY;GACpD,OAAO,EAAI,QAAQ;IAAE,OAAO,EAAI;IAAO,MAAM;IAAO,UAAU;IAAI,UAAU;IAAS,GAAG,KAAA;GACxF,EAPK,YAAY,IAOjB;GAEJ,GApCkC,EAAE"}
|