drizzle-cube 0.4.13 → 0.4.14
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/README.md +1 -0
- package/dist/adapters/express/index.cjs +6 -6
- package/dist/adapters/express/index.js +73 -72
- package/dist/adapters/fastify/index.cjs +5 -5
- package/dist/adapters/fastify/index.js +110 -109
- package/dist/adapters/{handler-CQkIwtxp.js → handler-DZnCbydH.js} +719 -272
- package/dist/adapters/handler-ZDYlokiM.cjs +25 -0
- package/dist/adapters/hono/index.cjs +6 -6
- package/dist/adapters/hono/index.js +121 -120
- package/dist/adapters/nextjs/index.cjs +5 -5
- package/dist/adapters/nextjs/index.js +92 -91
- package/dist/client/charts.js +67 -59
- package/dist/client/charts.js.map +1 -1
- package/dist/client/chunks/{RetentionCombinedChart-CEI8KQ3t.js → RetentionCombinedChart-CLq89aOJ.js} +2 -2
- package/dist/client/chunks/{RetentionCombinedChart-CEI8KQ3t.js.map → RetentionCombinedChart-CLq89aOJ.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-BMmWeFPr.js → analysis-builder-C5e52Z3p.js} +419 -411
- package/dist/client/chunks/analysis-builder-C5e52Z3p.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-shared-D56zYeV0.js → analysis-builder-shared-EnM-8plh.js} +2 -2
- package/dist/client/chunks/{analysis-builder-shared-D56zYeV0.js.map → analysis-builder-shared-EnM-8plh.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-CE7xGFQo.js → chart-activity-grid-CPGcTSuh.js} +2 -2
- package/dist/client/chunks/{chart-activity-grid-CE7xGFQo.js.map → chart-activity-grid-CPGcTSuh.js.map} +1 -1
- package/dist/client/chunks/{chart-area-BJAgusst.js → chart-area-ByJQ7NZd.js} +3 -3
- package/dist/client/chunks/{chart-area-BJAgusst.js.map → chart-area-ByJQ7NZd.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-Blypx8O4.js → chart-bar-dj14frMt.js} +2 -2
- package/dist/client/chunks/{chart-bar-Blypx8O4.js.map → chart-bar-dj14frMt.js.map} +1 -1
- package/dist/client/chunks/chart-box-plot-ZatBpatq.js +322 -0
- package/dist/client/chunks/chart-box-plot-ZatBpatq.js.map +1 -0
- package/dist/client/chunks/{chart-bubble-Bf42A1-B.js → chart-bubble-CemotLx-.js} +2 -2
- package/dist/client/chunks/{chart-bubble-Bf42A1-B.js.map → chart-bubble-CemotLx-.js.map} +1 -1
- package/dist/client/chunks/chart-candlestick-BIR4uGGt.js +269 -0
- package/dist/client/chunks/chart-candlestick-BIR4uGGt.js.map +1 -0
- package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js +38 -0
- package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js.map +1 -0
- package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js +70 -0
- package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js.map +1 -0
- package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js +64 -0
- package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js.map +1 -0
- package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js +70 -0
- package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js.map +1 -0
- package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js +60 -0
- package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-Ba_6tuJw.js → chart-data-table-D5G8nMnb.js} +2 -2
- package/dist/client/chunks/{chart-data-table-Ba_6tuJw.js.map → chart-data-table-D5G8nMnb.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-C9kenCpp.js → chart-funnel-dofnhD24.js} +2 -2
- package/dist/client/chunks/{chart-funnel-C9kenCpp.js.map → chart-funnel-dofnhD24.js.map} +1 -1
- package/dist/client/chunks/chart-gauge-CKJJ8m3b.js +374 -0
- package/dist/client/chunks/chart-gauge-CKJJ8m3b.js.map +1 -0
- package/dist/client/chunks/{chart-heat-map-CYGemyPB.js → chart-heat-map-BVuPUKHT.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-CYGemyPB.js.map → chart-heat-map-BVuPUKHT.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-D9XJoKuA.js → chart-kpi-delta-Dgg2eYRl.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-D9XJoKuA.js.map → chart-kpi-delta-Dgg2eYRl.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-C29Vj2g8.js → chart-kpi-number-DkoO99c1.js} +2 -2
- package/dist/client/chunks/{chart-kpi-number-C29Vj2g8.js.map → chart-kpi-number-DkoO99c1.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-CgjjrurK.js → chart-kpi-text-1O6_lmz7.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-CgjjrurK.js.map → chart-kpi-text-1O6_lmz7.js.map} +1 -1
- package/dist/client/chunks/{chart-line-zi6olZet.js → chart-line-DzyZkugh.js} +3 -3
- package/dist/client/chunks/{chart-line-zi6olZet.js.map → chart-line-DzyZkugh.js.map} +1 -1
- package/dist/client/chunks/chart-measure-profile-C2IkBG3V.js +114 -0
- package/dist/client/chunks/chart-measure-profile-C2IkBG3V.js.map +1 -0
- package/dist/client/chunks/{chart-pie-C4SuxKSN.js → chart-pie-akbfRfb9.js} +2 -2
- package/dist/client/chunks/{chart-pie-C4SuxKSN.js.map → chart-pie-akbfRfb9.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-BW3Z_-Ly.js → chart-radar-BaN-Kjww.js} +2 -2
- package/dist/client/chunks/{chart-radar-BW3Z_-Ly.js.map → chart-radar-BaN-Kjww.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-0Fa3aeP5.js → chart-radial-bar-DpptEL3s.js} +2 -2
- package/dist/client/chunks/{chart-radial-bar-0Fa3aeP5.js.map → chart-radial-bar-DpptEL3s.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-DBghfbg1.js → chart-sankey-CG-3hHmX.js} +2 -2
- package/dist/client/chunks/{chart-sankey-DBghfbg1.js.map → chart-sankey-CG-3hHmX.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DOVu1TNq.js → chart-scatter-l_yTVxF3.js} +2 -2
- package/dist/client/chunks/{chart-scatter-DOVu1TNq.js.map → chart-scatter-l_yTVxF3.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-LfNthFlZ.js → chart-sunburst-KhDcKhmZ.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-LfNthFlZ.js.map → chart-sunburst-KhDcKhmZ.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-DZtQPyWX.js → chart-tree-map-CBbiaBXV.js} +2 -2
- package/dist/client/chunks/{chart-tree-map-DZtQPyWX.js.map → chart-tree-map-CBbiaBXV.js.map} +1 -1
- package/dist/client/chunks/chart-waterfall-CX3vx_lI.js +191 -0
- package/dist/client/chunks/chart-waterfall-CX3vx_lI.js.map +1 -0
- package/dist/client/chunks/{charts-core-DmGfleFz.js → charts-core-CU9u_HtL.js} +2 -1
- package/dist/client/chunks/charts-core-CU9u_HtL.js.map +1 -0
- package/dist/client/chunks/{charts-loader-CH0_S06T.js → charts-loader-AW3T1nv5.js} +58 -42
- package/dist/client/chunks/charts-loader-AW3T1nv5.js.map +1 -0
- package/dist/client/chunks/{components-ClQziOcT.js → components-BkeSy9xv.js} +4 -4
- package/dist/client/chunks/components-BkeSy9xv.js.map +1 -0
- package/dist/client/components/AgenticNotebook/AgentChatPanel.d.ts +10 -0
- package/dist/client/components/AgenticNotebook/ChatMessage.d.ts +2 -0
- package/dist/client/components/AgenticNotebook/index.d.ts +11 -1
- package/dist/client/components/LoadingIndicator.d.ts +2 -2
- package/dist/client/components/charts/BoxPlotChart.config.d.ts +1 -7
- package/dist/client/components/charts/CandlestickChart.config.d.ts +5 -0
- package/dist/client/components/charts/CandlestickChart.d.ts +4 -0
- package/dist/client/components/charts/GaugeChart.config.d.ts +5 -0
- package/dist/client/components/charts/GaugeChart.d.ts +4 -0
- package/dist/client/components/charts/MeasureProfileChart.config.d.ts +5 -0
- package/dist/client/components/charts/MeasureProfileChart.d.ts +4 -0
- package/dist/client/components/charts/WaterfallChart.config.d.ts +5 -0
- package/dist/client/components/charts/WaterfallChart.d.ts +4 -0
- package/dist/client/components/charts/index.d.ts +4 -0
- package/dist/client/components.js +1 -1
- package/dist/client/hooks/useAgentChat.d.ts +20 -2
- package/dist/client/index.js +583 -522
- package/dist/client/index.js.map +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +19 -1
- package/dist/client/utils.js +4 -4
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +47 -45
- package/dist/server/index.d.ts +37 -0
- package/dist/server/index.js +1745 -1298
- package/package.json +4 -1
- package/dist/adapters/handler-dnkqpznh.cjs +0 -23
- package/dist/client/chunks/analysis-builder-BMmWeFPr.js.map +0 -1
- package/dist/client/chunks/chart-box-plot-Dja4LS3O.js +0 -313
- package/dist/client/chunks/chart-box-plot-Dja4LS3O.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-D3DA7_pr.js +0 -85
- package/dist/client/chunks/chart-config-box-plot-D3DA7_pr.js.map +0 -1
- package/dist/client/chunks/charts-core-DmGfleFz.js.map +0 -1
- package/dist/client/chunks/charts-loader-CH0_S06T.js.map +0 -1
- package/dist/client/chunks/components-ClQziOcT.js.map +0 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { jsx as t, jsxs as p } from "react/jsx-runtime";
|
|
2
|
+
import E, { useMemo as T } from "react";
|
|
3
|
+
import { ComposedChart as O, CartesianGrid as I, XAxis as S, YAxis as R, Legend as B, Bar as C, LabelList as D, Cell as W, Line as j } from "recharts";
|
|
4
|
+
import { u as K, a as Y, f as V, b as M, C as X } from "./charts-core-CU9u_HtL.js";
|
|
5
|
+
import { A as z } from "./chart-bar-dj14frMt.js";
|
|
6
|
+
const k = "#22c55e", F = "#ef4444", _ = "#6366f1", G = "#94a3b8";
|
|
7
|
+
function P(N, i, a, o, d) {
|
|
8
|
+
let n = 0;
|
|
9
|
+
const l = N.map((s, u) => {
|
|
10
|
+
const x = String(s[i] ?? `Row ${u + 1}`), g = s[a], f = typeof g == "number" ? g : parseFloat(String(g ?? "")), c = isNaN(f) ? 0 : f, m = c < 0, h = m ? n + c : n, y = {
|
|
11
|
+
label: x,
|
|
12
|
+
value: Math.abs(c),
|
|
13
|
+
runningBase: h,
|
|
14
|
+
isTotal: !1,
|
|
15
|
+
isNegative: m,
|
|
16
|
+
displayValue: c,
|
|
17
|
+
originalIndex: u
|
|
18
|
+
};
|
|
19
|
+
return n += c, y;
|
|
20
|
+
});
|
|
21
|
+
if (o) {
|
|
22
|
+
const s = d(a) || "Total";
|
|
23
|
+
l.push({
|
|
24
|
+
label: s,
|
|
25
|
+
value: Math.abs(n),
|
|
26
|
+
runningBase: n >= 0 ? 0 : n,
|
|
27
|
+
isTotal: !0,
|
|
28
|
+
isNegative: n < 0,
|
|
29
|
+
displayValue: n,
|
|
30
|
+
originalIndex: l.length
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return l;
|
|
34
|
+
}
|
|
35
|
+
function $(N) {
|
|
36
|
+
const { x: i = 0, y: a = 0, width: o = 0, value: d = 0, isNegative: n, displayValue: l } = N;
|
|
37
|
+
if (l == null) return null;
|
|
38
|
+
const s = Number(l), x = n || s < 0 ? a + d + 14 : a - 6;
|
|
39
|
+
return /* @__PURE__ */ p(
|
|
40
|
+
"text",
|
|
41
|
+
{
|
|
42
|
+
x: i + o / 2,
|
|
43
|
+
y: x,
|
|
44
|
+
fill: "currentColor",
|
|
45
|
+
textAnchor: "middle",
|
|
46
|
+
fontSize: 11,
|
|
47
|
+
children: [
|
|
48
|
+
s >= 0 ? "+" : "",
|
|
49
|
+
s.toLocaleString()
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const Z = E.memo(function({
|
|
55
|
+
data: i,
|
|
56
|
+
chartConfig: a,
|
|
57
|
+
displayConfig: o = {},
|
|
58
|
+
height: d = "100%",
|
|
59
|
+
onDataPointClick: n,
|
|
60
|
+
drillEnabled: l
|
|
61
|
+
}) {
|
|
62
|
+
const s = K(), u = o?.showTotal ?? !0, x = o?.showConnectorLine ?? !0, g = o?.showDataLabels ?? !1, f = o?.leftYAxisFormat, { xAxisField: c, yAxisField: m, configError: h } = T(() => {
|
|
63
|
+
const e = Array.isArray(a?.xAxis) ? a.xAxis[0] : a?.x, r = Array.isArray(a?.yAxis) ? a.yAxis[0] : a?.y?.[0];
|
|
64
|
+
return { xAxisField: e, yAxisField: r, configError: !e || !r ? "Waterfall chart requires an X-axis dimension and a Y-axis measure" : null };
|
|
65
|
+
}, [a]), y = T(() => h || !i || i.length === 0 || !c || !m ? [] : P(
|
|
66
|
+
i,
|
|
67
|
+
c,
|
|
68
|
+
m,
|
|
69
|
+
u,
|
|
70
|
+
s
|
|
71
|
+
), [i, c, m, u, s, h]), w = T(() => !x || y.length === 0 ? [] : y.map((e) => {
|
|
72
|
+
const r = e.isNegative ? e.runningBase : e.runningBase + e.value;
|
|
73
|
+
return { label: e.label, _connector: r };
|
|
74
|
+
}), [y, x]), A = T(() => y.map((e, r) => ({
|
|
75
|
+
...e,
|
|
76
|
+
_connector: w[r]?._connector
|
|
77
|
+
})), [y, w]);
|
|
78
|
+
try {
|
|
79
|
+
return !i || i.length === 0 ? /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: d }, children: /* @__PURE__ */ p("div", { className: "dc:text-center", children: [
|
|
80
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No data available" }),
|
|
81
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs text-dc-text-secondary", children: "No data points to display in waterfall chart" })
|
|
82
|
+
] }) }) : h ? /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning", style: { height: d }, children: /* @__PURE__ */ p("div", { className: "dc:text-center", children: [
|
|
83
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Configuration Error" }),
|
|
84
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs", children: h })
|
|
85
|
+
] }) }) : /* @__PURE__ */ t("div", { className: "dc:relative dc:w-full", style: { height: d }, children: /* @__PURE__ */ t(Y, { height: "100%", children: /* @__PURE__ */ p(O, { data: A, margin: { ...X, left: 40 }, accessibilityLayer: !1, children: [
|
|
86
|
+
/* @__PURE__ */ t(I, { strokeDasharray: "3 3", style: { pointerEvents: "none" } }),
|
|
87
|
+
/* @__PURE__ */ t(S, { dataKey: "label", type: "category", tick: /* @__PURE__ */ t(z, {}), height: 60 }),
|
|
88
|
+
/* @__PURE__ */ t(
|
|
89
|
+
R,
|
|
90
|
+
{
|
|
91
|
+
tick: { fontSize: 12 },
|
|
92
|
+
tickFormatter: f ? (e) => V(e, f) : void 0
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ t(
|
|
96
|
+
M,
|
|
97
|
+
{
|
|
98
|
+
formatter: (e, r, v) => {
|
|
99
|
+
if (r === "_connector") return ["", ""];
|
|
100
|
+
const b = v?.payload;
|
|
101
|
+
if (!b) return [e, r];
|
|
102
|
+
const L = b.displayValue ?? e;
|
|
103
|
+
return [
|
|
104
|
+
f ? V(L, f) : L?.toLocaleString?.() ?? L,
|
|
105
|
+
b.isTotal ? "Total" : b.isNegative ? "Decrease" : "Increase"
|
|
106
|
+
];
|
|
107
|
+
},
|
|
108
|
+
labelFormatter: (e) => e
|
|
109
|
+
}
|
|
110
|
+
),
|
|
111
|
+
/* @__PURE__ */ t(
|
|
112
|
+
B,
|
|
113
|
+
{
|
|
114
|
+
wrapperStyle: { fontSize: "12px", paddingTop: "8px" },
|
|
115
|
+
payload: [
|
|
116
|
+
{ value: "Increase", type: "rect", color: k },
|
|
117
|
+
{ value: "Decrease", type: "rect", color: F },
|
|
118
|
+
...u ? [{ value: "Total", type: "rect", color: _ }] : []
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
/* @__PURE__ */ t(C, { dataKey: "runningBase", stackId: "wf", fill: "transparent", legendType: "none", isAnimationActive: !1 }),
|
|
123
|
+
/* @__PURE__ */ p(
|
|
124
|
+
C,
|
|
125
|
+
{
|
|
126
|
+
dataKey: "value",
|
|
127
|
+
stackId: "wf",
|
|
128
|
+
isAnimationActive: !1,
|
|
129
|
+
cursor: l ? "pointer" : void 0,
|
|
130
|
+
onClick: (e, r, v) => {
|
|
131
|
+
n && l && e && !e.isTotal && n({
|
|
132
|
+
dataPoint: e,
|
|
133
|
+
clickedField: m,
|
|
134
|
+
xValue: e.label,
|
|
135
|
+
position: { x: v.clientX, y: v.clientY },
|
|
136
|
+
nativeEvent: v
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
children: [
|
|
140
|
+
g && /* @__PURE__ */ t(
|
|
141
|
+
D,
|
|
142
|
+
{
|
|
143
|
+
dataKey: "displayValue",
|
|
144
|
+
content: (e) => /* @__PURE__ */ t(
|
|
145
|
+
$,
|
|
146
|
+
{
|
|
147
|
+
...e,
|
|
148
|
+
runningBase: A[e.index]?.runningBase,
|
|
149
|
+
isNegative: A[e.index]?.isNegative,
|
|
150
|
+
displayValue: A[e.index]?.displayValue
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
A.map((e, r) => /* @__PURE__ */ t(
|
|
156
|
+
W,
|
|
157
|
+
{
|
|
158
|
+
fill: e.isTotal ? _ : e.isNegative ? F : k
|
|
159
|
+
},
|
|
160
|
+
`cell-${r}`
|
|
161
|
+
))
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
x && /* @__PURE__ */ t(
|
|
166
|
+
j,
|
|
167
|
+
{
|
|
168
|
+
type: "stepAfter",
|
|
169
|
+
dataKey: "_connector",
|
|
170
|
+
stroke: G,
|
|
171
|
+
strokeWidth: 1.5,
|
|
172
|
+
strokeDasharray: "4 2",
|
|
173
|
+
dot: !1,
|
|
174
|
+
activeDot: !1,
|
|
175
|
+
legendType: "none",
|
|
176
|
+
isAnimationActive: !1
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
] }) }) });
|
|
180
|
+
} catch (e) {
|
|
181
|
+
return /* @__PURE__ */ t("div", { className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4", style: { height: d }, children: /* @__PURE__ */ p("div", { className: "dc:text-center", children: [
|
|
182
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Waterfall Chart Error" }),
|
|
183
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs dc:mb-2", children: e instanceof Error ? e.message : "Unknown rendering error" }),
|
|
184
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
185
|
+
] }) });
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
export {
|
|
189
|
+
Z as default
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=chart-waterfall-CX3vx_lI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-waterfall-CX3vx_lI.js","sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, LabelList, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst POSITIVE_COLOR = '#22c55e'\nconst NEGATIVE_COLOR = '#ef4444'\nconst TOTAL_COLOR = '#6366f1'\nconst CONNECTOR_COLOR = '#94a3b8'\n\ninterface WaterfallDataPoint {\n label: string\n value: number\n runningBase: number\n isTotal: boolean\n isNegative: boolean\n displayValue: number\n originalIndex: number\n}\n\nfunction transformToWaterfall(\n data: Record<string, unknown>[],\n xField: string,\n yField: string,\n showTotal: boolean,\n getFieldLabel: (field: string) => string\n): WaterfallDataPoint[] {\n let running = 0\n const result: WaterfallDataPoint[] = data.map((row, i) => {\n const label = String(row[xField] ?? `Row ${i + 1}`)\n const rawValue = row[yField]\n const parsed = typeof rawValue === 'number' ? rawValue : parseFloat(String(rawValue ?? ''))\n const value = isNaN(parsed) ? 0 : parsed\n const isNegative = value < 0\n const base = isNegative ? running + value : running\n const point: WaterfallDataPoint = {\n label,\n value: Math.abs(value),\n runningBase: base,\n isTotal: false,\n isNegative,\n displayValue: value,\n originalIndex: i,\n }\n running += value\n return point\n })\n\n if (showTotal) {\n const totalLabel = getFieldLabel(yField) || 'Total'\n result.push({\n label: totalLabel,\n value: Math.abs(running),\n runningBase: running >= 0 ? 0 : running,\n isTotal: true,\n isNegative: running < 0,\n displayValue: running,\n originalIndex: result.length,\n })\n }\n\n return result\n}\n\ninterface ValueLabelProps {\n x?: number\n y?: number\n width?: number\n value?: number\n isNegative?: boolean\n displayValue?: number\n}\n\nfunction ValueLabel(props: ValueLabelProps) {\n const { x = 0, y = 0, width = 0, value = 0, isNegative, displayValue } = props\n if (displayValue === undefined || displayValue === null) return null\n const numericValue = Number(displayValue)\n const isNeg = isNegative || numericValue < 0\n const yPos = isNeg ? y + value + 14 : y - 6\n return (\n <text\n x={x + width / 2}\n y={yPos}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n fontSize={11}\n >\n {numericValue >= 0 ? '+' : ''}{numericValue.toLocaleString()}\n </text>\n )\n}\n\nconst WaterfallChart = React.memo(function WaterfallChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const getFieldLabel = useCubeFieldLabel()\n\n const showTotal = displayConfig?.showTotal ?? true\n const showConnectorLine = displayConfig?.showConnectorLine ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xAxisField, yAxisField, configError } = useMemo(() => {\n const xAxisField: string | undefined = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.x\n const yAxisField: string | undefined = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis[0]\n : chartConfig?.y?.[0]\n const configError =\n !xAxisField || !yAxisField\n ? 'Waterfall chart requires an X-axis dimension and a Y-axis measure'\n : null\n return { xAxisField, yAxisField, configError }\n }, [chartConfig])\n\n const waterfallData = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField || !yAxisField) return []\n return transformToWaterfall(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n showTotal,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisField, showTotal, getFieldLabel, configError])\n\n const connectorData = useMemo(() => {\n if (!showConnectorLine || waterfallData.length === 0) return []\n return waterfallData.map((d) => {\n const connectorY = d.isNegative ? d.runningBase : d.runningBase + d.value\n return { label: d.label, _connector: connectorY }\n })\n }, [waterfallData, showConnectorLine])\n\n const chartData = useMemo(() => {\n return waterfallData.map((d, i) => ({\n ...d,\n _connector: connectorData[i]?._connector,\n }))\n }, [waterfallData, connectorData])\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in waterfall chart</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <ComposedChart data={chartData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"label\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any, props: any) => {\n if (name === '_connector') return ['', '']\n const entry = props?.payload\n if (!entry) return [value, name]\n const displayValue = entry.displayValue ?? value\n return [\n yAxisFormat ? formatAxisValue(displayValue, yAxisFormat) : displayValue?.toLocaleString?.() ?? displayValue,\n entry.isTotal ? 'Total' : entry.isNegative ? 'Decrease' : 'Increase',\n ]\n }}\n labelFormatter={(label: string) => label}\n />\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }}\n {...{\n payload: [\n { value: 'Increase', type: 'rect' as const, color: POSITIVE_COLOR },\n { value: 'Decrease', type: 'rect' as const, color: NEGATIVE_COLOR },\n ...(showTotal ? [{ value: 'Total', type: 'rect' as const, color: TOTAL_COLOR }] : []),\n ],\n }}\n />\n <Bar dataKey=\"runningBase\" stackId=\"wf\" fill=\"transparent\" legendType=\"none\" isAnimationActive={false} />\n <Bar\n dataKey=\"value\"\n stackId=\"wf\"\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData && !barData.isTotal) {\n onDataPointClick({\n dataPoint: barData,\n clickedField: yAxisField!,\n xValue: barData.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n >\n {showDataLabels && (\n <LabelList\n dataKey=\"displayValue\"\n content={(props: any) => (\n <ValueLabel\n {...props}\n runningBase={chartData[props.index]?.runningBase}\n isNegative={chartData[props.index]?.isNegative}\n displayValue={chartData[props.index]?.displayValue}\n />\n )}\n />\n )}\n {chartData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.isTotal ? TOTAL_COLOR : entry.isNegative ? NEGATIVE_COLOR : POSITIVE_COLOR}\n />\n ))}\n </Bar>\n {showConnectorLine && (\n <Line\n type=\"stepAfter\"\n dataKey=\"_connector\"\n stroke={CONNECTOR_COLOR}\n strokeWidth={1.5}\n strokeDasharray=\"4 2\"\n dot={false}\n activeDot={false}\n legendType=\"none\"\n isAnimationActive={false}\n />\n )}\n </ComposedChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Waterfall Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"names":["POSITIVE_COLOR","NEGATIVE_COLOR","TOTAL_COLOR","CONNECTOR_COLOR","transformToWaterfall","data","xField","yField","showTotal","getFieldLabel","running","result","row","i","label","rawValue","parsed","value","isNegative","base","point","totalLabel","ValueLabel","props","x","y","width","displayValue","numericValue","yPos","jsxs","WaterfallChart","React","chartConfig","displayConfig","height","onDataPointClick","drillEnabled","useCubeFieldLabel","showConnectorLine","showDataLabels","yAxisFormat","xAxisField","yAxisField","configError","useMemo","waterfallData","connectorData","d","connectorY","chartData","jsx","ChartContainer","ComposedChart","CHART_MARGINS","CartesianGrid","XAxis","AngledXAxisTick","YAxis","v","formatAxisValue","ChartTooltip","name","entry","Legend","Bar","barData","_index","event","LabelList","index","Cell","Line","error"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { useMemo as U, useContext as H, useRef as D, useState as T, useLayoutEff
|
|
|
3
3
|
import { C as B } from "./providers-CgxXm6Ll.js";
|
|
4
4
|
import { ResponsiveContainer as I, Tooltip as z } from "recharts";
|
|
5
5
|
const G = {
|
|
6
|
+
xs: "dc:h-3 dc:w-3",
|
|
6
7
|
sm: "dc:h-6 dc:w-6",
|
|
7
8
|
md: "dc:h-8 dc:w-8",
|
|
8
9
|
lg: "dc:h-12 dc:w-12"
|
|
@@ -688,4 +689,4 @@ export {
|
|
|
688
689
|
ne as t,
|
|
689
690
|
se as u
|
|
690
691
|
};
|
|
691
|
-
//# sourceMappingURL=charts-core-
|
|
692
|
+
//# sourceMappingURL=charts-core-CU9u_HtL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charts-core-CU9u_HtL.js","sources":["../../../src/client/components/LoadingIndicator.tsx","../../../src/client/components/AnalysisBuilder/SectionHeading.tsx","../../../src/client/utils/chartUtils.ts","../../../src/client/components/charts/AxisFormatControls.tsx","../../../src/client/hooks/useCubeFieldLabel.ts","../../../src/client/utils/chartConstants.ts","../../../src/client/components/charts/ChartContainer.tsx","../../../src/client/components/charts/ChartTooltip.tsx","../../../src/client/utils/targetUtils.ts"],"sourcesContent":["/**\n * LoadingIndicator Component\n *\n * A centralized, theme-aware loading spinner that uses CSS variables\n * for consistent styling across all drizzle-cube components.\n *\n * Can be overridden at the Dashboard or Portlet level by passing a\n * custom loadingComponent prop.\n */\n\nexport interface LoadingIndicatorProps {\n /** Size variant: 'xs' (12px), 'sm' (24px), 'md' (32px), 'lg' (48px) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Additional CSS classes */\n className?: string\n}\n\nconst sizeClasses = {\n xs: 'dc:h-3 dc:w-3',\n sm: 'dc:h-6 dc:w-6',\n md: 'dc:h-8 dc:w-8',\n lg: 'dc:h-12 dc:w-12'\n}\n\nexport default function LoadingIndicator({\n size = 'md',\n className = ''\n}: LoadingIndicatorProps) {\n return (\n <div\n className={`dc:animate-spin dc:rounded-full dc:border-b-2 ${sizeClasses[size]} ${className}`}\n style={{ borderBottomColor: 'var(--dc-primary)' }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n )\n}\n","/**\n * SectionHeading Component\n *\n * A reusable section heading for the Analysis Builder panels.\n * Provides consistent styling that can be easily adjusted in one place.\n */\n\nimport type { ReactNode } from 'react'\n\ninterface SectionHeadingProps {\n children: ReactNode\n /** Optional className to add additional styles */\n className?: string\n}\n\n/**\n * Consistent section heading style for Analysis Builder panels.\n * Change the styles here to update all section headings at once.\n */\nexport default function SectionHeading({ children, className = '' }: SectionHeadingProps) {\n return (\n <h3 className={`dc:text-sm dc:font-semibold text-dc-primary dc:uppercase dc:tracking-wide ${className}`}>\n {children}\n </h3>\n )\n}\n","import type { FieldLabelMap, AxisFormatConfig } from '../types'\n\n// Utility function to check if a value is a valid numeric value (not null, undefined, or NaN)\n// This is used to preserve null values instead of converting them to 0\nexport function isValidNumericValue(value: any): boolean {\n return value !== null && value !== undefined && !isNaN(Number(value))\n}\n\n// Utility function to parse numeric value from data, preserving nulls\n// Returns null for null/undefined/NaN values, otherwise returns the numeric value\nexport function parseNumericValue(value: any): number | null {\n if (value === null || value === undefined) return null\n const num = typeof value === 'string' ? parseFloat(value) : Number(value)\n return isNaN(num) ? null : num\n}\n\n// Utility function to format numeric values for display in charts\n// Rounds to at most 2 decimal places, preserves integers\nexport function formatNumericValue(value: any): string {\n if (value === null || value === undefined) return 'No data'\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return String(value)\n if (Number.isInteger(num)) return num.toLocaleString()\n // Round to at most 2 decimal places, remove trailing zeros\n return parseFloat(num.toFixed(2)).toLocaleString()\n}\n\n/**\n * Format a numeric value for axis/tooltip display with configurable formatting\n *\n * @param value - The numeric value to format\n * @param config - Optional formatting configuration\n * @param locale - Optional locale string (defaults to browser locale)\n * @returns Formatted string representation of the value\n *\n * @example\n * formatAxisValue(1250000, { unit: 'currency', abbreviate: true }) // \"$1.25M\"\n * formatAxisValue(0.75, { unit: 'percent', decimals: 1 }) // \"75.0%\"\n * formatAxisValue(1234567, { abbreviate: true, decimals: 2 }) // \"1.23M\"\n */\nexport function formatAxisValue(\n value: number | null | undefined,\n config?: AxisFormatConfig,\n locale?: string\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) {\n return 'No data'\n }\n\n // Handle non-numeric values\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) {\n return String(value)\n }\n\n // Handle special cases\n if (!isFinite(num)) {\n return num > 0 ? '∞' : '-∞'\n }\n\n // Get locale (default to browser locale)\n const effectiveLocale = locale || (typeof navigator !== 'undefined' ? navigator.language : 'en-US')\n\n // If no config provided, use default formatting\n if (!config) {\n return formatNumericValue(value)\n }\n\n const { unit, abbreviate = true, decimals, customPrefix, customSuffix } = config\n\n // Calculate the display value and suffix for abbreviation\n // Default to true for abbreviation when config is provided\n let displayValue = num\n let abbreviationSuffix = ''\n\n if (abbreviate) {\n const absNum = Math.abs(num)\n if (absNum >= 1_000_000_000) {\n displayValue = num / 1_000_000_000\n abbreviationSuffix = 'B'\n } else if (absNum >= 1_000_000) {\n displayValue = num / 1_000_000\n abbreviationSuffix = 'M'\n } else if (absNum >= 1_000) {\n displayValue = num / 1_000\n abbreviationSuffix = 'K'\n }\n }\n\n // Determine decimal places\n // If decimals is undefined, use auto (2 for non-integers, 0 for integers after abbreviation)\n const effectiveDecimals = decimals !== undefined\n ? decimals\n : (Number.isInteger(displayValue) ? 0 : 2)\n\n // Format based on unit type\n switch (unit) {\n case 'currency': {\n // Use Intl.NumberFormat for currency\n // Currency code is determined by locale (USD for en-US, EUR for de-DE, etc.)\n const currencyCode = getCurrencyCodeForLocale(effectiveLocale)\n\n if (abbreviate && abbreviationSuffix) {\n // For abbreviated currency, format the number part and add suffix\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n // Insert abbreviation suffix before any trailing currency symbol or at end\n // Handle both \"$1.25\" -> \"$1.25M\" and \"1.25 €\" -> \"1.25M €\"\n const parts = new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n }).formatToParts(displayValue)\n const hasTrailingCurrency = parts[parts.length - 1]?.type === 'currency'\n if (hasTrailingCurrency) {\n // Currency symbol is at the end (e.g., \"1.25 €\")\n return formatted.replace(/(\\s*[^\\d\\s]+)$/, abbreviationSuffix + '$1')\n }\n return formatted + abbreviationSuffix\n }\n\n return new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n }\n\n case 'percent': {\n // Format as percentage (multiply by 100 if value is 0-1 range, otherwise use as-is)\n // Assume values > 1 are already percentages, values <= 1 need multiplication\n const percentValue = Math.abs(displayValue) <= 1 && !abbreviate ? displayValue * 100 : displayValue\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(percentValue)\n return formatted + abbreviationSuffix + '%'\n }\n\n case 'custom': {\n // Apply custom prefix/suffix\n const prefix = customPrefix || ''\n const suffix = customSuffix || ''\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n return prefix + formatted + abbreviationSuffix + suffix\n }\n\n case 'number':\n default: {\n // Standard number formatting with locale-aware grouping\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n return formatted + abbreviationSuffix\n }\n }\n}\n\n/**\n * Get the currency code for a given locale\n * Maps common locales to their default currency\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n // Extract language and region from locale (e.g., \"en-US\" -> [\"en\", \"US\"])\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n\n // Map regions to currencies\n const currencyMap: Record<string, string> = {\n 'US': 'USD',\n 'CA': 'CAD',\n 'GB': 'GBP',\n 'UK': 'GBP',\n 'AU': 'AUD',\n 'NZ': 'NZD',\n 'EU': 'EUR',\n 'DE': 'EUR',\n 'FR': 'EUR',\n 'IT': 'EUR',\n 'ES': 'EUR',\n 'NL': 'EUR',\n 'BE': 'EUR',\n 'AT': 'EUR',\n 'IE': 'EUR',\n 'PT': 'EUR',\n 'FI': 'EUR',\n 'JP': 'JPY',\n 'CN': 'CNY',\n 'KR': 'KRW',\n 'IN': 'INR',\n 'BR': 'BRL',\n 'MX': 'MXN',\n 'CH': 'CHF',\n 'SE': 'SEK',\n 'NO': 'NOK',\n 'DK': 'DKK',\n 'PL': 'PLN',\n 'RU': 'RUB',\n 'ZA': 'ZAR',\n 'SG': 'SGD',\n 'HK': 'HKD',\n 'TW': 'TWD',\n 'TH': 'THB',\n 'MY': 'MYR',\n 'PH': 'PHP',\n 'ID': 'IDR',\n 'VN': 'VND',\n 'AE': 'AED',\n 'SA': 'SAR',\n 'IL': 'ILS',\n 'TR': 'TRY',\n }\n\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Create a tick formatter function for Recharts axes\n * Returns a function that can be used as tickFormatter prop\n */\nexport function createAxisTickFormatter(config?: AxisFormatConfig): (value: any) => string {\n return (value: any) => formatAxisValue(value, config)\n}\n\n// Utility function to get field label from field name\nexport function getFieldLabel(fieldName: string, labelMap: FieldLabelMap): string {\n return labelMap[fieldName] || fieldName\n}\n\n// Utility function to transform series keys to use labels\nexport function transformSeriesKeysWithLabels(seriesKeys: string[], labelMap: FieldLabelMap): string[] {\n return seriesKeys.map(key => getFieldLabel(key, labelMap))\n}\n\n// Utility function to format time values for better display using known granularity\nexport function formatTimeValue(value: any, granularity?: string): string {\n if (!value) return String(value || 'Unknown')\n \n const str = String(value)\n \n // Check if it's a timestamp (ISO format or PostgreSQL format)\n // Handles formats like: \"2025-04-01T00:00:00.000\" or \"2023-02-01 00:00:00+00\"\n if (str.match(/^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}/)) {\n // Convert PostgreSQL format to ISO format if needed\n let isoStr = str\n if (str.includes(' ')) {\n // Convert \"2023-02-01 00:00:00+00\" to \"2023-02-01T00:00:00Z\"\n isoStr = str.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n // Ensure the timestamp ends with 'Z' if not present\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n const date = new Date(isoStr)\n \n // Ensure we're working with valid date\n if (isNaN(date.getTime())) {\n return str\n }\n \n // Use UTC methods on the properly UTC-parsed date\n const year = date.getUTCFullYear()\n const month = String(date.getUTCMonth() + 1).padStart(2, '0')\n const day = String(date.getUTCDate()).padStart(2, '0')\n const hours = date.getUTCHours()\n const minutes = date.getUTCMinutes()\n \n // Format based on known granularity if provided\n if (granularity) {\n switch (granularity.toLowerCase()) {\n case 'year':\n return `${year}`\n case 'quarter': {\n const quarter = Math.floor(date.getUTCMonth() / 3) + 1\n return `${year}-Q${quarter}`\n }\n case 'month':\n return `${year}-${month}`\n case 'week':\n // For week, we could calculate week number, but let's use date for simplicity\n return `${year}-${month}-${day}`\n case 'day':\n return `${year}-${month}-${day}`\n case 'hour':\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:00`\n case 'minute':\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`\n default:\n // Unknown granularity, fall back to heuristic\n break\n }\n }\n \n // Fallback heuristic if granularity not provided or unknown\n const seconds = date.getUTCSeconds()\n const milliseconds = date.getUTCMilliseconds()\n \n // If it's the first day of the month at exactly midnight UTC, it's likely a month granularity\n if (day === '01' && hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {\n // Check if it's also first month of a quarter (quarter granularity)\n if (month === '01' || month === '04' || month === '07' || month === '10') {\n const quarter = Math.floor(date.getUTCMonth() / 3) + 1\n return `${year}-Q${quarter}`\n }\n // Month granularity\n return `${year}-${month}`\n }\n \n // If it's exactly midnight UTC, it's likely a day granularity\n if (hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {\n return `${year}-${month}-${day}`\n }\n \n // If it has time components, include them (hour/minute granularity)\n if (minutes === 0 && seconds === 0 && milliseconds === 0) {\n // Hour granularity\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:00`\n }\n \n // Full timestamp\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`\n }\n \n // Return as-is if not a timestamp\n return str\n}\n\n// Helper function to get granularity for a field from the query timeDimensions\nexport function getFieldGranularity(queryObject: any, fieldName: string): string | undefined {\n try {\n if (queryObject?.timeDimensions) {\n // Find the timeDimension that matches this field\n const timeDim = queryObject.timeDimensions.find((td: any) => {\n // Check if field name matches the dimension or dimension with granularity suffix\n return fieldName === td.dimension || \n fieldName.startsWith(td.dimension.replace('.', '_')) ||\n fieldName === `${td.dimension}_${td.granularity}`\n })\n \n if (timeDim?.granularity) {\n return timeDim.granularity\n }\n }\n \n // Fallback: extract granularity from field name suffix if present\n const granularityMatch = fieldName.match(/_([a-z]+)$/)\n if (granularityMatch) {\n const suffix = granularityMatch[1]\n // Only return if it's a valid granularity\n if (['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'].includes(suffix)) {\n return suffix\n }\n }\n \n return undefined\n } catch {\n return undefined\n }\n}\n\n// Transform data for charts with proper type handling\n// NOTE: Preserves null values to allow charts to handle gaps/missing data appropriately\nexport function transformChartData(\n data: any[],\n xAxisField: string,\n yAxisFields: string[],\n queryObject: any,\n getFieldLabelFn: (fieldName: string) => string = (fieldName) => fieldName\n) {\n if (!data || data.length === 0) return []\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n\n return data.map((row: any) => {\n const transformed: any = {\n name: formatTimeValue(row[xAxisField], granularity) || row[xAxisField] || 'Unknown',\n }\n\n yAxisFields.forEach(field => {\n const displayName = getFieldLabelFn(field)\n // Preserve null values instead of converting to 0\n transformed[displayName] = parseNumericValue(row[field])\n })\n\n return transformed\n })\n}\n\nexport interface ChartSeriesResult {\n data: any[]\n seriesKeys: string[]\n hasDimensions: boolean\n}\n\n// Advanced data transformation that handles both measures and dimensions on Y-axis\n// NOTE: Preserves null values to allow charts to handle gaps/missing data appropriately\nexport function transformChartDataWithSeries(\n data: any[],\n xAxisField: string,\n yAxisFields: string[],\n queryObject: any,\n seriesFields?: string[], // New optional parameter for explicit series fields\n getFieldLabelFn: (fieldName: string) => string = (fieldName) => fieldName // Function to get field labels\n): ChartSeriesResult {\n if (!data || data.length === 0) {\n return { data: [], seriesKeys: [], hasDimensions: false }\n }\n\n const originalQuery = queryObject || {}\n const queryDimensions = [\n ...(originalQuery.dimensions || []),\n ...(originalQuery.timeDimensions?.map((td: any) => td.dimension) || [])\n ]\n const queryMeasures = originalQuery.measures || []\n\n // Use explicit series fields if provided, otherwise no dimension-based series\n const yAxisMeasures = yAxisFields.filter(field => queryMeasures.includes(field))\n const yAxisDimensions = (seriesFields || []).filter(field => queryDimensions.includes(field))\n\n // Handle complex case with dimensions on Y-axis\n if (yAxisDimensions.length > 0) {\n // Group data by X-axis field and create separate series for dimension values\n const groupedData: { [key: string]: any } = {}\n\n data.forEach((row: any) => {\n const granularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(row[xAxisField], granularity) || row[xAxisField] || 'Unknown'\n if (!groupedData[xValue]) {\n groupedData[xValue] = { name: String(xValue) }\n }\n\n // Add measures - preserve nulls for individual measures\n yAxisMeasures.forEach(measure => {\n const displayName = getFieldLabelFn(measure)\n const measureValue = parseNumericValue(row[measure])\n\n // For aggregation: sum non-null values, preserve null if all are null\n if (measureValue !== null) {\n const currentValue = groupedData[xValue][displayName]\n groupedData[xValue][displayName] = (currentValue === null || currentValue === undefined)\n ? measureValue\n : currentValue + measureValue\n } else if (!(displayName in groupedData[xValue])) {\n // Only set to null if no value exists yet\n groupedData[xValue][displayName] = null\n }\n })\n\n // Add dimensions as separate series (aggregate measure values by dimension)\n yAxisDimensions.forEach(dimension => {\n const dimValue = row[dimension]\n if (dimValue !== undefined && dimValue !== null) {\n const seriesName = String(dimValue)\n // Aggregate the first measure for this dimension value, or use totalCost if available\n const measureToAggregate = yAxisMeasures[0] || queryMeasures.find((m: string) =>\n m.includes('totalCost') || m.includes('count') || m.includes('sum')\n ) || queryMeasures[0]\n\n if (measureToAggregate) {\n const measureValue = parseNumericValue(row[measureToAggregate])\n\n // For dimension series: sum non-null values, preserve null if all are null\n if (measureValue !== null) {\n const currentValue = groupedData[xValue][seriesName]\n groupedData[xValue][seriesName] = (currentValue === null || currentValue === undefined)\n ? measureValue\n : currentValue + measureValue\n } else if (!(seriesName in groupedData[xValue])) {\n // Only set to null if no value exists yet\n groupedData[xValue][seriesName] = null\n }\n }\n }\n })\n })\n \n const chartData = Object.values(groupedData)\n \n // Get all series keys for rendering\n // When dimensions are on Y-axis, only show dimension series, not measures\n // The measures are the values being aggregated for each dimension series\n const dimensionSeries = Array.from(new Set(\n data.flatMap((row: any) => \n yAxisDimensions.map(dimension => {\n const value = row[dimension]\n return value !== undefined && value !== null \n ? String(value)\n : null\n }).filter((value): value is string => value !== null)\n )\n ))\n \n return {\n data: chartData,\n seriesKeys: dimensionSeries,\n hasDimensions: true\n }\n }\n \n // Standard measures-only path\n const chartData = transformChartData(data, xAxisField, yAxisFields, queryObject, getFieldLabelFn)\n const seriesKeys = yAxisFields.map(field => getFieldLabelFn(field))\n \n return {\n data: chartData,\n seriesKeys,\n hasDimensions: false\n }\n}","/**\n * AxisFormatControls Component\n *\n * A reusable component for configuring axis number formatting.\n * Provides controls for unit type, abbreviation, decimal places, and custom labels.\n */\n\nimport { useMemo } from 'react'\nimport SectionHeading from '../AnalysisBuilder/SectionHeading'\nimport type { AxisFormatConfig } from '../../types'\nimport { formatAxisValue } from '../../utils/chartUtils'\n\ninterface AxisFormatControlsProps {\n value: AxisFormatConfig\n onChange: (config: AxisFormatConfig) => void\n axisLabel: string // \"X-Axis\", \"Left Y-Axis\", \"Right Y-Axis\"\n /** Sample value for preview (default: 1250000) */\n previewValue?: number\n}\n\n/**\n * Get the currency symbol for the user's locale\n */\nfunction getLocaleCurrencySymbol(): string {\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US'\n // Format a number as currency and extract just the symbol\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: getCurrencyCodeForLocale(locale),\n currencyDisplay: 'narrowSymbol'\n }).format(0)\n // Extract the currency symbol (remove digits, spaces, and common separators)\n return formatted.replace(/[\\d.,\\s]/g, '').trim() || '$'\n}\n\n/**\n * Get the currency code for a given locale (duplicated from chartUtils for component isolation)\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n const currencyMap: Record<string, string> = {\n 'US': 'USD', 'CA': 'CAD', 'GB': 'GBP', 'UK': 'GBP', 'AU': 'AUD', 'NZ': 'NZD',\n 'EU': 'EUR', 'DE': 'EUR', 'FR': 'EUR', 'IT': 'EUR', 'ES': 'EUR', 'NL': 'EUR',\n 'BE': 'EUR', 'AT': 'EUR', 'IE': 'EUR', 'PT': 'EUR', 'FI': 'EUR',\n 'JP': 'JPY', 'CN': 'CNY', 'KR': 'KRW', 'IN': 'INR', 'BR': 'BRL', 'MX': 'MXN',\n 'CH': 'CHF', 'SE': 'SEK', 'NO': 'NOK', 'DK': 'DKK', 'PL': 'PLN', 'RU': 'RUB',\n 'ZA': 'ZAR', 'SG': 'SGD', 'HK': 'HKD', 'TW': 'TWD', 'TH': 'THB', 'MY': 'MYR',\n 'PH': 'PHP', 'ID': 'IDR', 'VN': 'VND', 'AE': 'AED', 'SA': 'SAR', 'IL': 'ILS', 'TR': 'TRY',\n }\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Single axis format control section\n */\nexport function AxisFormatControls({\n value,\n onChange,\n axisLabel,\n previewValue = 1250000\n}: AxisFormatControlsProps) {\n const config = useMemo(() => value || {}, [value])\n\n // Get locale-aware currency symbol for the button\n const currencySymbol = useMemo(() => getLocaleCurrencySymbol(), [])\n\n // Generate preview of formatted value\n const preview = useMemo(() => {\n return formatAxisValue(previewValue, config)\n }, [previewValue, config])\n\n const handleChange = (updates: Partial<AxisFormatConfig>) => {\n onChange({ ...config, ...updates })\n }\n\n const unitButtons: Array<{ value: AxisFormatConfig['unit']; label: string }> = [\n { value: 'currency', label: currencySymbol },\n { value: 'percent', label: '%' },\n { value: 'number', label: '#' },\n { value: 'custom', label: 'Custom' }\n ]\n\n return (\n <div className=\"dc:space-y-3 dc:pb-4\">\n {/* Axis Header */}\n <SectionHeading>{axisLabel}</SectionHeading>\n\n {/* Label Input */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Label</label>\n <input\n type=\"text\"\n value={config.label || ''}\n onChange={(e) => handleChange({ label: e.target.value || undefined })}\n placeholder=\"Auto-generated label\"\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n\n {/* Unit Type */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Unit</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n {unitButtons.map((btn) => (\n <button\n key={btn.value}\n type=\"button\"\n onClick={() => handleChange({ unit: btn.value })}\n className={`dc:flex-1 dc:px-2 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.unit === btn.value\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {btn.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom Prefix/Suffix (only when Custom is selected) */}\n {config.unit === 'custom' && (\n <div className=\"dc:flex dc:gap-2\">\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Prefix</label>\n <input\n type=\"text\"\n value={config.customPrefix || ''}\n onChange={(e) => handleChange({ customPrefix: e.target.value || undefined })}\n placeholder=\"e.g., $\"\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Suffix</label>\n <input\n type=\"text\"\n value={config.customSuffix || ''}\n onChange={(e) => handleChange({ customSuffix: e.target.value || undefined })}\n placeholder=\"e.g., units\"\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n </div>\n )}\n\n {/* Abbreviation Toggle */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Abbreviation</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: true })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate !== false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: false })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate === false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n No\n </button>\n </div>\n </div>\n\n {/* Decimals */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Decimals</label>\n <div className=\"dc:flex dc:gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current > 0) handleChange({ decimals: current - 1 })\n }}\n disabled={(config.decimals ?? 2) <= 0}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n ← .0\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current < 4) handleChange({ decimals: current + 1 })\n }}\n disabled={(config.decimals ?? 2) >= 4}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n .00 →\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">Preview</label>\n <div className=\"dc:text-sm dc:font-mono text-dc-text\">\n {preview}\n </div>\n </div>\n </div>\n )\n}\n\ninterface MultiAxisFormatControlsProps {\n displayConfig: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }\n onChange: (updates: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }) => void\n /** Which axes to show controls for */\n showAxes?: {\n xAxis?: boolean\n leftYAxis?: boolean\n rightYAxis?: boolean\n }\n}\n\n/**\n * Container component for multiple axis format controls\n */\nexport function MultiAxisFormatControls({\n displayConfig,\n onChange,\n showAxes = { leftYAxis: true, rightYAxis: true }\n}: MultiAxisFormatControlsProps) {\n return (\n <div className=\"dc:space-y-4\">\n {showAxes.leftYAxis && (\n <AxisFormatControls\n axisLabel=\"Left Y-Axis\"\n value={displayConfig.leftYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n leftYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.rightYAxis && (\n <AxisFormatControls\n axisLabel=\"Right Y-Axis\"\n value={displayConfig.rightYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n rightYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.xAxis && (\n <AxisFormatControls\n axisLabel=\"X-Axis\"\n value={displayConfig.xAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n xAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n previewValue={2024} // Use a year-like number for X-axis preview\n />\n )}\n </div>\n )\n}\n\nexport default AxisFormatControls\n","/**\n * Optimized hook that only subscribes to field label functionality\n * from CubeMeta context. This prevents re-renders when unrelated\n * contexts (CubeApi, Features) change.\n *\n * Use this instead of useCubeContext() when you only need getFieldLabel.\n */\n\nimport { useContext, useMemo } from 'react'\nimport { CubeMetaContext, type CubeMetaContextValue } from '../providers/CubeMetaContext'\n\n/**\n * Returns a stable reference to the getFieldLabel function.\n * Components using this hook will only re-render when the field label\n * mapping actually changes, not when unrelated API or feature contexts update.\n *\n * @returns Function to get human-readable label for a field name\n * @throws Error if used outside CubeProvider\n */\nexport function useCubeFieldLabel(): (fieldName: string) => string {\n const context = useContext(CubeMetaContext) as CubeMetaContextValue | null\n\n if (!context) {\n throw new Error('useCubeFieldLabel must be used within CubeProvider')\n }\n\n // Return stable reference - only changes when getFieldLabel itself changes\n return useMemo(() => context.getFieldLabel, [context.getFieldLabel])\n}\n","// Default color palette for charts - used as fallback when no dashboard palette is specified\n// These are now part of the 'default' palette in the unified color palette system\nexport const CHART_COLORS = [\n '#3b82f6', // blue\n '#10b981', // green\n '#f59e0b', // yellow\n '#ef4444', // red\n '#8b5cf6', // purple\n '#f97316', // orange\n '#06b6d4', // cyan\n '#84cc16', // lime\n]\n\n// Default gradient colors for continuous numeric scales - used as fallback\n// These are now part of the 'default' palette in the unified color palette system\nexport const CHART_COLORS_GRADIENT = [\n '#440154', // dark purple\n '#414487', // purple-blue\n '#2a788e', // teal\n '#22a884', // green-teal \n '#7ad151', // green\n '#fde725', // yellow\n]\n\n// Colors for positive/negative values\nexport const POSITIVE_COLOR = '#10b981' // green\nexport const NEGATIVE_COLOR = '#ef4444' // red\n\nexport const CHART_MARGINS = {\n top: 5,\n right: 30,\n left: 20,\n bottom: 5\n}\n\nexport const RESPONSIVE_CHART_MARGINS = {\n top: 5,\n right: 30,\n left: 20,\n bottom: 60 // Extra space for rotated labels\n}","import { ReactElement, useState, useRef, useLayoutEffect, startTransition } from 'react'\nimport { ResponsiveContainer } from 'recharts'\nimport LoadingIndicator from '../LoadingIndicator'\n\ninterface ChartContainerProps {\n children: ReactElement\n height?: string | number\n}\n\nexport default function ChartContainer({ children, height = \"100%\" }: ChartContainerProps) {\n // Track if container is ready to render ResponsiveContainer\n // We need to wait for the container to be in the DOM with valid dimensions\n const containerRef = useRef<HTMLDivElement>(null)\n const [isReady, setIsReady] = useState(false)\n const [containerSize, setContainerSize] = useState({ width: 0, height: 0 })\n const sizeRef = useRef({ width: 0, height: 0 })\n const readyRef = useRef(false)\n const pendingSizeRef = useRef<{ width: number; height: number } | null>(null)\n const frameRef = useRef<number | null>(null)\n\n // Use useLayoutEffect to measure before paint\n useLayoutEffect(() => {\n let mounted = true\n let resizeObserver: ResizeObserver | null = null\n\n const flushPendingSize = () => {\n frameRef.current = null\n if (!mounted) return\n const pending = pendingSizeRef.current\n pendingSizeRef.current = null\n if (!pending) return\n\n const nextWidth = Math.round(pending.width)\n const nextHeight = Math.round(pending.height)\n if (nextWidth <= 0 || nextHeight <= 0) return\n\n const sizeChanged =\n sizeRef.current.width !== nextWidth || sizeRef.current.height !== nextHeight\n const shouldBecomeReady = !readyRef.current\n\n if (!sizeChanged && !shouldBecomeReady) return\n\n sizeRef.current = { width: nextWidth, height: nextHeight }\n readyRef.current = true\n\n // Resize-driven chart updates can come in bursts (one per portlet).\n // Transitioning these avoids blocking urgent input and coalesces visual work.\n startTransition(() => {\n if (sizeChanged) {\n setContainerSize({ width: nextWidth, height: nextHeight })\n }\n if (shouldBecomeReady) {\n setIsReady(true)\n }\n })\n }\n\n const scheduleSizeUpdate = (width: number, height: number) => {\n pendingSizeRef.current = { width, height }\n if (frameRef.current === null) {\n frameRef.current = requestAnimationFrame(flushPendingSize)\n }\n }\n\n const measureAndSetReady = () => {\n if (!mounted || !containerRef.current) return\n\n const rect = containerRef.current.getBoundingClientRect()\n // Check both clientWidth/Height AND getBoundingClientRect for robustness\n const width = Math.max(containerRef.current.clientWidth, rect.width)\n const measuredHeight = Math.max(containerRef.current.clientHeight, rect.height)\n\n if (width > 0 && measuredHeight > 0) {\n scheduleSizeUpdate(width, measuredHeight)\n }\n }\n\n // Set up ResizeObserver to detect when container gets valid dimensions\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: entryHeight } = entry.contentRect\n if (width > 0 && entryHeight > 0) {\n scheduleSizeUpdate(width, entryHeight)\n }\n }\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n // Also try immediate measurement\n measureAndSetReady()\n }\n\n return () => {\n mounted = false\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current)\n frameRef.current = null\n }\n resizeObserver?.disconnect()\n }\n }, [])\n\n try {\n if (height === \"100%\") {\n // For 100% height, make the container fill the available flex space with proper sizing\n // user-select: none prevents browser selection box from appearing when clicking/dragging on charts\n return (\n <div\n ref={containerRef}\n className=\"dc:w-full dc:h-full dc:flex-1 dc:flex dc:flex-col dc:relative\"\n style={{ minHeight: '250px', minWidth: '100px', overflow: 'hidden', userSelect: 'none' }}\n >\n {isReady && containerSize.width > 0 && containerSize.height > 0 ? (\n <ResponsiveContainer\n width={containerSize.width}\n height={containerSize.height - 16}\n debounce={100}\n style={{ marginTop: '16px' }}\n >\n {children}\n </ResponsiveContainer>\n ) : (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\">\n <LoadingIndicator size=\"sm\" />\n </div>\n )}\n </div>\n )\n }\n\n // For specific heights, use them directly\n // user-select: none prevents browser selection box from appearing when clicking/dragging on charts\n const containerStyle = {\n height: typeof height === 'number' ? `${height}px` : height,\n width: '100%',\n minHeight: '200px',\n minWidth: '100px',\n userSelect: 'none' as const\n }\n\n return (\n <div\n ref={containerRef}\n className=\"dc:w-full dc:flex dc:flex-col dc:relative\"\n style={{ ...containerStyle, overflow: 'hidden' }}\n >\n {isReady && containerSize.width > 0 && containerSize.height > 0 ? (\n <ResponsiveContainer\n width={containerSize.width}\n height={containerSize.height - 16}\n debounce={100}\n style={{ marginTop: '16px' }}\n >\n {children}\n </ResponsiveContainer>\n ) : (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\">\n <LoadingIndicator size=\"sm\" />\n </div>\n )}\n </div>\n )\n } catch (error) {\n // ChartContainer ResponsiveContainer error\n\n return (\n <div\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4 dc:text-center dc:border dc:border-dashed dc:rounded-lg\"\n style={{ height, borderColor: 'var(--dc-border)', backgroundColor: 'var(--dc-surface)' }}\n >\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1 text-dc-text-muted\">Unable to display chart</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {error instanceof Error ? error.message : 'Failed to create responsive container'}\n </div>\n </div>\n )\n }\n}\n","import React from 'react'\nimport { Tooltip } from 'recharts'\nimport { formatNumericValue } from '../../utils/chartUtils'\n\ninterface ChartTooltipProps {\n formatter?: (value: any, name: any, props: any) => [React.ReactText, React.ReactText]\n labelFormatter?: (label: any, payload?: readonly any[]) => React.ReactText\n}\n\n// Default formatter that rounds numeric values to at most 2 decimal places\nconst defaultFormatter = (value: any, name: any): [React.ReactText, React.ReactText] => {\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n return [formatNumericValue(value), name]\n}\n\nexport default function ChartTooltip({ formatter, labelFormatter }: ChartTooltipProps) {\n return (\n <Tooltip\n formatter={formatter || defaultFormatter}\n labelFormatter={labelFormatter}\n contentStyle={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n padding: '8px 12px'\n }}\n />\n )\n}","/**\n * Utility functions for handling target values in charts\n */\n\n/**\n * Parse target values from string format\n * @param targetString - String containing target values (e.g., \"100\" or \"50,75,100\")\n * @returns Array of numeric target values\n */\nexport function parseTargetValues(targetString: string): number[] {\n if (!targetString || typeof targetString !== 'string') {\n return []\n }\n\n const trimmed = targetString.trim()\n if (!trimmed) {\n return []\n }\n\n try {\n // Split by comma and parse each value\n const values = trimmed\n .split(',')\n .map(val => val.trim())\n .filter(val => val !== '')\n .map(val => {\n const num = parseFloat(val)\n if (isNaN(num)) {\n throw new Error(`Invalid numeric value: ${val}`)\n }\n return num\n })\n\n return values.length > 0 ? values : []\n } catch (error) {\n console.warn('Failed to parse target values:', error)\n return []\n }\n}\n\n/**\n * Spread target values across data points\n * @param targets - Array of target values\n * @param dataLength - Number of data points to spread across\n * @returns Array of target values for each data point\n */\nexport function spreadTargetValues(targets: number[], dataLength: number): number[] {\n if (targets.length === 0 || dataLength <= 0) {\n return []\n }\n\n // If only one target value, repeat for all data points\n if (targets.length === 1) {\n return new Array(dataLength).fill(targets[0])\n }\n\n // If we have multiple targets, spread them evenly across data points\n const result: number[] = []\n const baseGroupSize = Math.floor(dataLength / targets.length)\n const remainder = dataLength % targets.length\n\n let currentIndex = 0\n \n for (let i = 0; i < targets.length; i++) {\n // Calculate group size for this target\n // First 'remainder' groups get an extra item\n const groupSize = baseGroupSize + (i < remainder ? 1 : 0)\n \n // Fill this group with the current target value\n for (let j = 0; j < groupSize; j++) {\n result[currentIndex++] = targets[i]\n }\n }\n\n return result\n}\n\n/**\n * Calculate variance between actual and target values\n * @param actual - Actual value\n * @param target - Target value\n * @returns Variance as percentage\n */\nexport function calculateVariance(actual: number, target: number): number {\n if (target === 0) {\n return actual === 0 ? 0 : (actual > 0 ? 100 : -100)\n }\n return ((actual - target) / target) * 100\n}\n\n/**\n * Format variance as percentage string with appropriate sign and color indication\n * @param variance - Variance percentage\n * @param decimals - Number of decimal places (default: 1)\n * @returns Formatted variance string (e.g., \"+12.5%\" or \"-8.3%\")\n */\nexport function formatVariance(variance: number, decimals: number = 1): string {\n const sign = variance >= 0 ? '+' : ''\n return `${sign}${variance.toFixed(decimals)}%`\n}\n\n/**\n * Get unique target values for reference lines\n * @param targets - Array of target values (may contain duplicates)\n * @returns Array of unique target values\n */\nexport function getUniqueTargets(targets: number[]): number[] {\n return [...new Set(targets)].sort((a, b) => a - b)\n}"],"names":["sizeClasses","LoadingIndicator","size","className","jsx","SectionHeading","children","isValidNumericValue","value","parseNumericValue","num","formatNumericValue","formatAxisValue","config","locale","effectiveLocale","unit","abbreviate","decimals","customPrefix","customSuffix","displayValue","abbreviationSuffix","absNum","effectiveDecimals","currencyCode","getCurrencyCodeForLocale","formatted","parts","percentValue","prefix","suffix","region","createAxisTickFormatter","getFieldLabel","fieldName","labelMap","transformSeriesKeysWithLabels","seriesKeys","key","formatTimeValue","granularity","str","isoStr","date","year","month","day","hours","minutes","quarter","seconds","milliseconds","getFieldGranularity","queryObject","timeDim","td","granularityMatch","transformChartData","data","xAxisField","yAxisFields","getFieldLabelFn","row","transformed","field","displayName","transformChartDataWithSeries","seriesFields","originalQuery","queryDimensions","queryMeasures","yAxisMeasures","yAxisDimensions","groupedData","xValue","measure","measureValue","currentValue","dimension","dimValue","seriesName","measureToAggregate","m","chartData","dimensionSeries","getLocaleCurrencySymbol","AxisFormatControls","onChange","axisLabel","previewValue","useMemo","currencySymbol","preview","handleChange","updates","unitButtons","jsxs","e","btn","current","useCubeFieldLabel","context","useContext","CubeMetaContext","CHART_COLORS","CHART_COLORS_GRADIENT","POSITIVE_COLOR","NEGATIVE_COLOR","CHART_MARGINS","RESPONSIVE_CHART_MARGINS","ChartContainer","height","containerRef","useRef","isReady","setIsReady","useState","containerSize","setContainerSize","sizeRef","readyRef","pendingSizeRef","frameRef","useLayoutEffect","mounted","resizeObserver","flushPendingSize","pending","nextWidth","nextHeight","sizeChanged","shouldBecomeReady","startTransition","scheduleSizeUpdate","width","measureAndSetReady","rect","measuredHeight","entries","entry","entryHeight","ResponsiveContainer","containerStyle","error","defaultFormatter","name","ChartTooltip","formatter","labelFormatter","Tooltip","parseTargetValues","targetString","trimmed","values","val","spreadTargetValues","targets","dataLength","result","baseGroupSize","remainder","currentIndex","i","groupSize","j","calculateVariance","actual","target","formatVariance","variance"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { Suspense as
|
|
1
|
+
import { jsxs as m, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense as c, lazy as d } from "react";
|
|
3
3
|
function p({
|
|
4
4
|
chartType: a,
|
|
5
5
|
packageName: e,
|
|
6
6
|
installCommand: r,
|
|
7
7
|
height: n = 200
|
|
8
8
|
}) {
|
|
9
|
-
return /* @__PURE__ */
|
|
9
|
+
return /* @__PURE__ */ m(
|
|
10
10
|
"div",
|
|
11
11
|
{
|
|
12
12
|
className: "dc-missing-dependency-fallback",
|
|
@@ -31,7 +31,7 @@ function p({
|
|
|
31
31
|
marginBottom: "0.5rem",
|
|
32
32
|
color: "var(--dc-text, #111827)"
|
|
33
33
|
}, children: "Missing Dependency" }),
|
|
34
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ m("p", { style: {
|
|
35
35
|
fontSize: "0.875rem",
|
|
36
36
|
color: "var(--dc-text-secondary, #6b7280)",
|
|
37
37
|
marginBottom: "1rem",
|
|
@@ -55,7 +55,7 @@ function p({
|
|
|
55
55
|
}, children: e }),
|
|
56
56
|
" package."
|
|
57
57
|
] }),
|
|
58
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ m("div", { style: {
|
|
59
59
|
backgroundColor: "var(--dc-surface-secondary, #f3f4f6)",
|
|
60
60
|
borderRadius: "0.5rem",
|
|
61
61
|
padding: "0.75rem 1rem",
|
|
@@ -78,7 +78,7 @@ function p({
|
|
|
78
78
|
}
|
|
79
79
|
);
|
|
80
80
|
}
|
|
81
|
-
const
|
|
81
|
+
const l = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(), f = {
|
|
82
82
|
// Recharts-based charts
|
|
83
83
|
bar: {
|
|
84
84
|
packageName: "recharts",
|
|
@@ -132,31 +132,47 @@ const m = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Set(), f = {
|
|
|
132
132
|
heatmap: {
|
|
133
133
|
packageName: "@nivo/heatmap",
|
|
134
134
|
installCommand: "npm install @nivo/heatmap"
|
|
135
|
+
},
|
|
136
|
+
waterfall: {
|
|
137
|
+
packageName: "recharts",
|
|
138
|
+
installCommand: "npm install recharts"
|
|
139
|
+
},
|
|
140
|
+
measureProfile: {
|
|
141
|
+
packageName: "recharts",
|
|
142
|
+
installCommand: "npm install recharts"
|
|
143
|
+
},
|
|
144
|
+
gauge: {
|
|
145
|
+
packageName: "d3-shape",
|
|
146
|
+
installCommand: "npm install d3-shape"
|
|
135
147
|
}
|
|
136
|
-
// Charts with no external deps: table, activityGrid, kpiNumber, kpiDelta, kpiText, markdown, retentionHeatmap, boxPlot
|
|
148
|
+
// Charts with no external deps: table, activityGrid, kpiNumber, kpiDelta, kpiText, markdown, retentionHeatmap, boxPlot, candlestick
|
|
137
149
|
}, o = {
|
|
138
|
-
bar: () => import("./chart-bar-
|
|
139
|
-
line: () => import("./chart-line-
|
|
140
|
-
area: () => import("./chart-area-
|
|
141
|
-
pie: () => import("./chart-pie-
|
|
142
|
-
scatter: () => import("./chart-scatter-
|
|
143
|
-
radar: () => import("./chart-radar-
|
|
144
|
-
radialBar: () => import("./chart-radial-bar-
|
|
145
|
-
treemap: () => import("./chart-tree-map-
|
|
146
|
-
bubble: () => import("./chart-bubble-
|
|
147
|
-
table: () => import("./chart-data-table-
|
|
148
|
-
activityGrid: () => import("./chart-activity-grid-
|
|
149
|
-
kpiNumber: () => import("./chart-kpi-number-
|
|
150
|
-
kpiDelta: () => import("./chart-kpi-delta-
|
|
151
|
-
kpiText: () => import("./chart-kpi-text-
|
|
150
|
+
bar: () => import("./chart-bar-dj14frMt.js").then((a) => a.a),
|
|
151
|
+
line: () => import("./chart-line-DzyZkugh.js").then((a) => a.h),
|
|
152
|
+
area: () => import("./chart-area-ByJQ7NZd.js"),
|
|
153
|
+
pie: () => import("./chart-pie-akbfRfb9.js"),
|
|
154
|
+
scatter: () => import("./chart-scatter-l_yTVxF3.js"),
|
|
155
|
+
radar: () => import("./chart-radar-BaN-Kjww.js"),
|
|
156
|
+
radialBar: () => import("./chart-radial-bar-DpptEL3s.js"),
|
|
157
|
+
treemap: () => import("./chart-tree-map-CBbiaBXV.js"),
|
|
158
|
+
bubble: () => import("./chart-bubble-CemotLx-.js").then((a) => a.B),
|
|
159
|
+
table: () => import("./chart-data-table-D5G8nMnb.js").then((a) => a.b),
|
|
160
|
+
activityGrid: () => import("./chart-activity-grid-CPGcTSuh.js"),
|
|
161
|
+
kpiNumber: () => import("./chart-kpi-number-DkoO99c1.js").then((a) => a.K),
|
|
162
|
+
kpiDelta: () => import("./chart-kpi-delta-Dgg2eYRl.js"),
|
|
163
|
+
kpiText: () => import("./chart-kpi-text-1O6_lmz7.js"),
|
|
152
164
|
markdown: () => import("./chart-markdown-Du4Z2iqK.js").then((a) => a.a),
|
|
153
|
-
funnel: () => import("./chart-funnel-
|
|
154
|
-
sankey: () => import("./chart-sankey-
|
|
155
|
-
sunburst: () => import("./chart-sunburst-
|
|
156
|
-
heatmap: () => import("./chart-heat-map-
|
|
165
|
+
funnel: () => import("./chart-funnel-dofnhD24.js"),
|
|
166
|
+
sankey: () => import("./chart-sankey-CG-3hHmX.js"),
|
|
167
|
+
sunburst: () => import("./chart-sunburst-KhDcKhmZ.js"),
|
|
168
|
+
heatmap: () => import("./chart-heat-map-BVuPUKHT.js"),
|
|
157
169
|
retentionHeatmap: () => import("./RetentionHeatmap-BHYU8MXY.js"),
|
|
158
|
-
retentionCombined: () => import("./RetentionCombinedChart-
|
|
159
|
-
boxPlot: () => import("./chart-box-plot-
|
|
170
|
+
retentionCombined: () => import("./RetentionCombinedChart-CLq89aOJ.js"),
|
|
171
|
+
boxPlot: () => import("./chart-box-plot-ZatBpatq.js"),
|
|
172
|
+
waterfall: () => import("./chart-waterfall-CX3vx_lI.js"),
|
|
173
|
+
candlestick: () => import("./chart-candlestick-BIR4uGGt.js"),
|
|
174
|
+
measureProfile: () => import("./chart-measure-profile-C2IkBG3V.js"),
|
|
175
|
+
gauge: () => import("./chart-gauge-CKJJ8m3b.js")
|
|
160
176
|
};
|
|
161
177
|
function u(a) {
|
|
162
178
|
const e = f[a], r = ({ height: n }) => /* @__PURE__ */ t(
|
|
@@ -178,24 +194,24 @@ function h(a, e) {
|
|
|
178
194
|
return console.warn(
|
|
179
195
|
`[drizzle-cube] Failed to load ${a} chart:`,
|
|
180
196
|
r instanceof Error ? r.message : r
|
|
181
|
-
),
|
|
197
|
+
), i.add(a), { default: u(a) };
|
|
182
198
|
}
|
|
183
199
|
};
|
|
184
200
|
}
|
|
185
|
-
function
|
|
186
|
-
if (!
|
|
201
|
+
function g(a) {
|
|
202
|
+
if (!l.has(a)) {
|
|
187
203
|
const e = o[a];
|
|
188
204
|
if (!e)
|
|
189
205
|
throw new Error(`Unknown chart type: ${a}`);
|
|
190
206
|
const r = h(a, e);
|
|
191
|
-
|
|
207
|
+
l.set(a, d(r));
|
|
192
208
|
}
|
|
193
|
-
return
|
|
209
|
+
return l.get(a);
|
|
194
210
|
}
|
|
195
211
|
function v(a) {
|
|
196
212
|
return a in o;
|
|
197
213
|
}
|
|
198
|
-
function
|
|
214
|
+
function b({ height: a }) {
|
|
199
215
|
return /* @__PURE__ */ t(
|
|
200
216
|
"div",
|
|
201
217
|
{
|
|
@@ -205,38 +221,38 @@ function g({ height: a }) {
|
|
|
205
221
|
}
|
|
206
222
|
);
|
|
207
223
|
}
|
|
208
|
-
function
|
|
224
|
+
function N({
|
|
209
225
|
chartType: a,
|
|
210
226
|
fallback: e,
|
|
211
227
|
height: r,
|
|
212
228
|
...n
|
|
213
229
|
}) {
|
|
214
|
-
const
|
|
215
|
-
return /* @__PURE__ */ t(
|
|
230
|
+
const s = g(a);
|
|
231
|
+
return /* @__PURE__ */ t(c, { fallback: e ?? /* @__PURE__ */ t(b, { height: r }), children: /* @__PURE__ */ t(s, { height: r, ...n }) });
|
|
216
232
|
}
|
|
217
233
|
function k(a) {
|
|
218
234
|
const e = o[a];
|
|
219
235
|
e && e();
|
|
220
236
|
}
|
|
221
|
-
function
|
|
237
|
+
function x(a) {
|
|
222
238
|
a.forEach(k);
|
|
223
239
|
}
|
|
224
240
|
function w() {
|
|
225
241
|
return Object.keys(o);
|
|
226
242
|
}
|
|
227
243
|
function z(a) {
|
|
228
|
-
return !
|
|
244
|
+
return !i.has(a);
|
|
229
245
|
}
|
|
230
246
|
function F() {
|
|
231
|
-
return Array.from(
|
|
247
|
+
return Array.from(i);
|
|
232
248
|
}
|
|
233
249
|
export {
|
|
234
|
-
|
|
235
|
-
|
|
250
|
+
N as L,
|
|
251
|
+
x as a,
|
|
236
252
|
z as b,
|
|
237
253
|
F as c,
|
|
238
254
|
w as g,
|
|
239
255
|
v as i,
|
|
240
256
|
k as p
|
|
241
257
|
};
|
|
242
|
-
//# sourceMappingURL=charts-loader-
|
|
258
|
+
//# sourceMappingURL=charts-loader-AW3T1nv5.js.map
|