drizzle-cube 0.3.21 → 0.3.23
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/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +1 -1
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +1 -1
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +1 -1
- package/dist/adapters/{mcp-transport-DHBUNdYg.js → mcp-transport-lkEjNwDH.js} +3242 -3201
- package/dist/adapters/mcp-transport-oPf8JYHv.cjs +275 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/client/charts/chartConfigs.d.ts +21 -0
- package/dist/client/charts.js +14 -14
- package/dist/client/chunks/{RetentionCombinedChart-DsWhPI0q.js → RetentionCombinedChart-DpEKFYsd.js} +3 -3
- package/dist/client/chunks/RetentionCombinedChart-DpEKFYsd.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-DcZgXtPK.js → analysis-builder-DiaxkEY-.js} +9 -9
- package/dist/client/chunks/{analysis-builder-DcZgXtPK.js.map → analysis-builder-DiaxkEY-.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-ZnrPzt_d.js → analysis-builder-shared-BzM5Vwpr.js} +5 -5
- package/dist/client/chunks/{analysis-builder-shared-ZnrPzt_d.js.map → analysis-builder-shared-BzM5Vwpr.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-BUc21L0U.js → chart-activity-grid-CCGyWo1c.js} +116 -106
- package/dist/client/chunks/chart-activity-grid-CCGyWo1c.js.map +1 -0
- package/dist/client/chunks/chart-area-ZZp1libT.js +234 -0
- package/dist/client/chunks/chart-area-ZZp1libT.js.map +1 -0
- package/dist/client/chunks/chart-bar-B4grbo6Q.js +254 -0
- package/dist/client/chunks/chart-bar-B4grbo6Q.js.map +1 -0
- package/dist/client/chunks/{chart-bubble-CO7qvWR9.js → chart-bubble-BGGAQQUQ.js} +2 -2
- package/dist/client/chunks/{chart-bubble-CO7qvWR9.js.map → chart-bubble-BGGAQQUQ.js.map} +1 -1
- package/dist/client/chunks/{chart-config-activity-grid-BBSNCbkb.js → chart-config-activity-grid-CAlo1cHA.js} +3 -2
- package/dist/client/chunks/{chart-config-activity-grid-BBSNCbkb.js.map → chart-config-activity-grid-CAlo1cHA.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bar-BJKGnfLt.js → chart-config-bar-soxw6m2o.js} +2 -1
- package/dist/client/chunks/chart-config-bar-soxw6m2o.js.map +1 -0
- package/dist/client/chunks/{chart-config-line-DR0ThxZy.js → chart-config-line-D5ME6w0v.js} +2 -1
- package/dist/client/chunks/chart-config-line-D5ME6w0v.js.map +1 -0
- package/dist/client/chunks/{chart-config-pie-BM5lgH-w.js → chart-config-pie-DlHa2jTy.js} +2 -1
- package/dist/client/chunks/chart-config-pie-DlHa2jTy.js.map +1 -0
- package/dist/client/chunks/{chart-config-tree-map-CLmRvvMR.js → chart-config-tree-map-IRAYf9YM.js} +3 -2
- package/dist/client/chunks/{chart-config-tree-map-CLmRvvMR.js.map → chart-config-tree-map-IRAYf9YM.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-bclSKgkZ.js → chart-data-table-BcH_h6kZ.js} +3 -3
- package/dist/client/chunks/{chart-data-table-bclSKgkZ.js.map → chart-data-table-BcH_h6kZ.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-FvDvq015.js → chart-funnel-DI8RMacf.js} +3 -3
- package/dist/client/chunks/chart-funnel-DI8RMacf.js.map +1 -0
- package/dist/client/chunks/{chart-heat-map-GpFE-PFB.js → chart-heat-map-D3xNV9ep.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-GpFE-PFB.js.map → chart-heat-map-D3xNV9ep.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-jmz-CK8X.js → chart-kpi-delta-BJMQKPor.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-jmz-CK8X.js.map → chart-kpi-delta-BJMQKPor.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-DbSmomE8.js → chart-kpi-number-B8u4tWmu.js} +2 -2
- package/dist/client/chunks/{chart-kpi-number-DbSmomE8.js.map → chart-kpi-number-B8u4tWmu.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-erI9U7PZ.js → chart-kpi-text--r1d4zAz.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-erI9U7PZ.js.map → chart-kpi-text--r1d4zAz.js.map} +1 -1
- package/dist/client/chunks/chart-line-K0ACw4cV.js +413 -0
- package/dist/client/chunks/chart-line-K0ACw4cV.js.map +1 -0
- package/dist/client/chunks/chart-pie-DC7axSwd.js +137 -0
- package/dist/client/chunks/chart-pie-DC7axSwd.js.map +1 -0
- package/dist/client/chunks/{chart-radar-BE6xsFiF.js → chart-radar-BDKgpLw5.js} +33 -33
- package/dist/client/chunks/chart-radar-BDKgpLw5.js.map +1 -0
- package/dist/client/chunks/{chart-radial-bar-BEEwtFDc.js → chart-radial-bar-BYNng7Nz.js} +7 -6
- package/dist/client/chunks/chart-radial-bar-BYNng7Nz.js.map +1 -0
- package/dist/client/chunks/{chart-sankey-Dt3KaYrH.js → chart-sankey-CpsKerey.js} +2 -2
- package/dist/client/chunks/{chart-sankey-Dt3KaYrH.js.map → chart-sankey-CpsKerey.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-gAlYkQcW.js → chart-scatter-CXqFltJg.js} +11 -11
- package/dist/client/chunks/chart-scatter-CXqFltJg.js.map +1 -0
- package/dist/client/chunks/{chart-sunburst-D0Lvdjwu.js → chart-sunburst-DSsO2CzY.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-D0Lvdjwu.js.map → chart-sunburst-DSsO2CzY.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-Bv_PYe0c.js → chart-tree-map-D_SeBBD-.js} +77 -57
- package/dist/client/chunks/chart-tree-map-D_SeBBD-.js.map +1 -0
- package/dist/client/chunks/{chartConfigRegistry-BumUIPw4.js → chartConfigRegistry-DNEbwgTc.js} +6 -6
- package/dist/client/chunks/{chartConfigRegistry-BumUIPw4.js.map → chartConfigRegistry-DNEbwgTc.js.map} +1 -1
- package/dist/client/chunks/{charts-DqWRT0TE.js → charts-T6qNi6FO.js} +17 -17
- package/dist/client/chunks/charts-T6qNi6FO.js.map +1 -0
- package/dist/client/chunks/{charts-core-BfxnhMfd.js → charts-core-8jDh3mKC.js} +64 -63
- package/dist/client/chunks/charts-core-8jDh3mKC.js.map +1 -0
- package/dist/client/chunks/{charts-loader-DCGbL50r.js → charts-loader-DpJr9z2e.js} +20 -20
- package/dist/client/chunks/{charts-loader-DCGbL50r.js.map → charts-loader-DpJr9z2e.js.map} +1 -1
- package/dist/client/chunks/{components-NmBmOEqV.js → components-vl_fdWud.js} +3579 -2880
- package/dist/client/chunks/components-vl_fdWud.js.map +1 -0
- package/dist/client/chunks/{hooks-D7APQ8uS.js → hooks-CKYzVf_7.js} +3 -3
- package/dist/client/chunks/{hooks-D7APQ8uS.js.map → hooks-CKYzVf_7.js.map} +1 -1
- package/dist/client/chunks/{index-CBvXpG92.js → index-_2PSgbkC.js} +270 -261
- package/dist/client/chunks/index-_2PSgbkC.js.map +1 -0
- package/dist/client/chunks/{providers-Cj7PQfXn.js → providers-BBrUJB2U.js} +2 -2
- package/dist/client/chunks/{providers-Cj7PQfXn.js.map → providers-BBrUJB2U.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-ZSi3voVl.js → useDirtyStateTracking-DDQ_Lbki.js} +2 -2
- package/dist/client/chunks/{useDirtyStateTracking-ZSi3voVl.js.map → useDirtyStateTracking-DDQ_Lbki.js.map} +1 -1
- package/dist/client/components/DrillBreadcrumb.d.ts +6 -0
- package/dist/client/components/DrillMenu.d.ts +8 -0
- package/dist/client/components/charts/AngledXAxisTick.d.ts +19 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/useDrillInteraction.d.ts +9 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/index.js +9 -9
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types/drill.d.ts +240 -0
- package/dist/client/types.d.ts +53 -2
- package/dist/client/utils/drillQueryBuilder.d.ts +41 -0
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +31 -31
- package/dist/server/index.d.ts +78 -0
- package/dist/server/index.js +2730 -2689
- package/package.json +6 -3
- package/dist/adapters/mcp-transport-B37JTeww.cjs +0 -275
- package/dist/client/chunks/RetentionCombinedChart-DsWhPI0q.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-BUc21L0U.js.map +0 -1
- package/dist/client/chunks/chart-area-B_64FScj.js +0 -190
- package/dist/client/chunks/chart-area-B_64FScj.js.map +0 -1
- package/dist/client/chunks/chart-bar-Ctiy2tpQ.js +0 -216
- package/dist/client/chunks/chart-bar-Ctiy2tpQ.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-BJKGnfLt.js.map +0 -1
- package/dist/client/chunks/chart-config-line-DR0ThxZy.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-BM5lgH-w.js.map +0 -1
- package/dist/client/chunks/chart-funnel-FvDvq015.js.map +0 -1
- package/dist/client/chunks/chart-line-B0YOZ88n.js +0 -364
- package/dist/client/chunks/chart-line-B0YOZ88n.js.map +0 -1
- package/dist/client/chunks/chart-pie-CImB6r4F.js +0 -125
- package/dist/client/chunks/chart-pie-CImB6r4F.js.map +0 -1
- package/dist/client/chunks/chart-radar-BE6xsFiF.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-BEEwtFDc.js.map +0 -1
- package/dist/client/chunks/chart-scatter-gAlYkQcW.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-Bv_PYe0c.js.map +0 -1
- package/dist/client/chunks/charts-DqWRT0TE.js.map +0 -1
- package/dist/client/chunks/charts-core-BfxnhMfd.js.map +0 -1
- package/dist/client/chunks/components-NmBmOEqV.js.map +0 -1
- package/dist/client/chunks/index-CBvXpG92.js.map +0 -1
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { jsx as t, jsxs as c, Fragment as Q } from "react/jsx-runtime";
|
|
2
|
+
import Z, { useState as ee } from "react";
|
|
3
|
+
import { ComposedChart as te, CartesianGrid as se, XAxis as re, YAxis as R, Legend as ie, Area as ae, Line as V } from "recharts";
|
|
4
|
+
import { u as ce, t as ne, C as le, p as oe, s as de, a as xe, f as N, b as me, c as G } from "./charts-core-8jDh3mKC.js";
|
|
5
|
+
import { A as fe } from "./chart-bar-B4grbo6Q.js";
|
|
6
|
+
const ke = Z.memo(function({
|
|
7
|
+
data: b,
|
|
8
|
+
chartConfig: s,
|
|
9
|
+
displayConfig: i = {},
|
|
10
|
+
queryObject: M,
|
|
11
|
+
height: l = "100%",
|
|
12
|
+
colorPalette: F,
|
|
13
|
+
onDataPointClick: I,
|
|
14
|
+
drillEnabled: W
|
|
15
|
+
}) {
|
|
16
|
+
const [y, _] = ee(null), A = ce();
|
|
17
|
+
try {
|
|
18
|
+
const d = i?.stackType ?? (i?.stacked ? "normal" : "none"), X = d !== "none", H = d === "percent", g = {
|
|
19
|
+
showLegend: i?.showLegend ?? !0,
|
|
20
|
+
showGrid: i?.showGrid ?? !0,
|
|
21
|
+
showTooltip: i?.showTooltip ?? !0,
|
|
22
|
+
connectNulls: i?.connectNulls ?? !1
|
|
23
|
+
}, x = i?.leftYAxisFormat, v = i?.rightYAxisFormat;
|
|
24
|
+
if (!b || b.length === 0)
|
|
25
|
+
return /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: l }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
26
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No data available" }),
|
|
27
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs text-dc-text-secondary", children: "No data points to display in area chart" })
|
|
28
|
+
] }) });
|
|
29
|
+
let p, a, D = [];
|
|
30
|
+
if (s?.xAxis && s?.yAxis)
|
|
31
|
+
p = Array.isArray(s.xAxis) ? s.xAxis[0] : s.xAxis, a = Array.isArray(s.yAxis) ? s.yAxis : [s.yAxis], D = s.series || [];
|
|
32
|
+
else if (s?.x && s?.y)
|
|
33
|
+
p = s.x, a = Array.isArray(s.y) ? s.y : [s.y];
|
|
34
|
+
else
|
|
35
|
+
return /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning", style: { height: l }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
36
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Configuration Error" }),
|
|
37
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs", children: "Invalid or missing chart axis configuration" })
|
|
38
|
+
] }) });
|
|
39
|
+
if (!p || !a || a.length === 0)
|
|
40
|
+
return /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning", style: { height: l }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
41
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Configuration Error" }),
|
|
42
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
43
|
+
] }) });
|
|
44
|
+
const { data: m, seriesKeys: K } = ne(
|
|
45
|
+
b,
|
|
46
|
+
p,
|
|
47
|
+
a,
|
|
48
|
+
M,
|
|
49
|
+
D,
|
|
50
|
+
A
|
|
51
|
+
), f = s?.yAxisAssignment || {}, w = {};
|
|
52
|
+
a.forEach((e) => {
|
|
53
|
+
const r = A(e);
|
|
54
|
+
w[r] = e;
|
|
55
|
+
});
|
|
56
|
+
const k = a.some((e) => f[e] === "right"), E = a.filter((e) => (f[e] || "left") === "left"), j = a.filter((e) => f[e] === "right"), $ = X && !k, h = H && !k, q = g.showLegend, B = {
|
|
57
|
+
...le,
|
|
58
|
+
left: 40,
|
|
59
|
+
// Space for left Y-axis label
|
|
60
|
+
right: k ? 40 : 20
|
|
61
|
+
// Extra space for right Y-axis label if needed
|
|
62
|
+
}, C = oe(i?.target || ""), T = de(C, m.length);
|
|
63
|
+
let z = m;
|
|
64
|
+
return T.length > 0 && (z = m.map((e, r) => ({
|
|
65
|
+
...e,
|
|
66
|
+
__target: T[r] || null
|
|
67
|
+
}))), !m || m.length === 0 ? /* @__PURE__ */ t("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: l }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
68
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No valid data" }),
|
|
69
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs text-dc-text-secondary", children: "No valid data points for area chart after transformation" })
|
|
70
|
+
] }) }) : /* @__PURE__ */ t(xe, { height: l, children: /* @__PURE__ */ c(te, { data: z, margin: B, stackOffset: h ? "expand" : void 0, accessibilityLayer: !1, children: [
|
|
71
|
+
g.showGrid && /* @__PURE__ */ t(se, { strokeDasharray: "3 3", style: { pointerEvents: "none" } }),
|
|
72
|
+
/* @__PURE__ */ t(re, { dataKey: "name", type: "category", tick: /* @__PURE__ */ t(fe, {}), height: 60 }),
|
|
73
|
+
/* @__PURE__ */ t(
|
|
74
|
+
R,
|
|
75
|
+
{
|
|
76
|
+
yAxisId: "left",
|
|
77
|
+
orientation: "left",
|
|
78
|
+
tick: { fontSize: 12 },
|
|
79
|
+
tickFormatter: h ? (e) => `${(e * 100).toFixed(0)}%` : x ? (e) => N(e, x) : void 0,
|
|
80
|
+
domain: h ? [0, 1] : void 0,
|
|
81
|
+
label: h ? void 0 : E.length > 0 ? {
|
|
82
|
+
value: x?.label || A(E[0]),
|
|
83
|
+
angle: -90,
|
|
84
|
+
position: "left",
|
|
85
|
+
style: { textAnchor: "middle", fontSize: "12px" }
|
|
86
|
+
} : void 0
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
k && /* @__PURE__ */ t(
|
|
90
|
+
R,
|
|
91
|
+
{
|
|
92
|
+
yAxisId: "right",
|
|
93
|
+
orientation: "right",
|
|
94
|
+
tick: { fontSize: 12 },
|
|
95
|
+
tickFormatter: v ? (e) => N(e, v) : void 0,
|
|
96
|
+
label: j.length > 0 ? {
|
|
97
|
+
value: v?.label || A(j[0]),
|
|
98
|
+
angle: 90,
|
|
99
|
+
position: "right",
|
|
100
|
+
style: { textAnchor: "middle", fontSize: "12px" }
|
|
101
|
+
} : void 0
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
g.showTooltip && /* @__PURE__ */ t(
|
|
105
|
+
me,
|
|
106
|
+
{
|
|
107
|
+
formatter: (e, r) => {
|
|
108
|
+
if (e == null)
|
|
109
|
+
return ["No data", r];
|
|
110
|
+
if (r === "Target")
|
|
111
|
+
return [N(e, x), "Target Value"];
|
|
112
|
+
if (h && typeof e == "number")
|
|
113
|
+
return [`${(e * 100).toFixed(1)}%`, r];
|
|
114
|
+
const o = w[r], u = (o && f[o] === "right" ? "right" : "left") === "right" ? v : x;
|
|
115
|
+
return [N(e, u), r];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
q && /* @__PURE__ */ t(
|
|
120
|
+
ie,
|
|
121
|
+
{
|
|
122
|
+
wrapperStyle: { fontSize: "12px", paddingTop: "10px" },
|
|
123
|
+
iconType: "rect",
|
|
124
|
+
iconSize: 8,
|
|
125
|
+
layout: "horizontal",
|
|
126
|
+
align: "center",
|
|
127
|
+
verticalAlign: "bottom",
|
|
128
|
+
onMouseEnter: (e) => _(String(e.dataKey || "")),
|
|
129
|
+
onMouseLeave: () => _(null)
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
K.map((e, r) => {
|
|
133
|
+
const o = w[e], Y = o && f[o] === "right" ? "right" : "left", u = F?.colors && F.colors[r % F.colors.length] || G[r % G.length];
|
|
134
|
+
return /* @__PURE__ */ t(
|
|
135
|
+
ae,
|
|
136
|
+
{
|
|
137
|
+
type: "monotone",
|
|
138
|
+
dataKey: e,
|
|
139
|
+
yAxisId: Y,
|
|
140
|
+
stackId: $ ? "stack" : void 0,
|
|
141
|
+
stroke: u,
|
|
142
|
+
fill: u,
|
|
143
|
+
fillOpacity: y ? y === e ? 0.6 : 0.1 : 0.3,
|
|
144
|
+
strokeWidth: 2,
|
|
145
|
+
strokeOpacity: y ? y === e ? 1 : 0.3 : 1,
|
|
146
|
+
connectNulls: g.connectNulls,
|
|
147
|
+
dot: (P) => {
|
|
148
|
+
const { cx: S, cy: L, payload: O, key: U } = P;
|
|
149
|
+
if (!W || S === void 0 || L === void 0) return null;
|
|
150
|
+
const J = (n) => {
|
|
151
|
+
n.stopPropagation(), n.preventDefault(), I && I({
|
|
152
|
+
dataPoint: O,
|
|
153
|
+
clickedField: o || e,
|
|
154
|
+
xValue: O.name,
|
|
155
|
+
position: { x: n.clientX, y: n.clientY },
|
|
156
|
+
nativeEvent: n
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
return /* @__PURE__ */ c("g", { children: [
|
|
160
|
+
/* @__PURE__ */ t(
|
|
161
|
+
"circle",
|
|
162
|
+
{
|
|
163
|
+
cx: S,
|
|
164
|
+
cy: L,
|
|
165
|
+
r: 6,
|
|
166
|
+
fill: "var(--dc-surface)",
|
|
167
|
+
style: { pointerEvents: "none" }
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
/* @__PURE__ */ t(
|
|
171
|
+
"circle",
|
|
172
|
+
{
|
|
173
|
+
cx: S,
|
|
174
|
+
cy: L,
|
|
175
|
+
r: 4,
|
|
176
|
+
fill: "var(--dc-surface)",
|
|
177
|
+
stroke: u,
|
|
178
|
+
strokeWidth: 2,
|
|
179
|
+
cursor: "pointer",
|
|
180
|
+
onClick: (n) => {
|
|
181
|
+
J(n);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
] }, U);
|
|
186
|
+
},
|
|
187
|
+
activeDot: !1
|
|
188
|
+
},
|
|
189
|
+
e
|
|
190
|
+
);
|
|
191
|
+
}),
|
|
192
|
+
T.length > 0 && /* @__PURE__ */ c(Q, { children: [
|
|
193
|
+
/* @__PURE__ */ t(
|
|
194
|
+
V,
|
|
195
|
+
{
|
|
196
|
+
type: "monotone",
|
|
197
|
+
dataKey: "__target",
|
|
198
|
+
yAxisId: "left",
|
|
199
|
+
stroke: "#ffffff",
|
|
200
|
+
strokeWidth: 2,
|
|
201
|
+
dot: !1,
|
|
202
|
+
activeDot: !1,
|
|
203
|
+
connectNulls: !1
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
/* @__PURE__ */ t(
|
|
207
|
+
V,
|
|
208
|
+
{
|
|
209
|
+
type: "monotone",
|
|
210
|
+
dataKey: "__target",
|
|
211
|
+
yAxisId: "left",
|
|
212
|
+
name: "Target",
|
|
213
|
+
stroke: "#8B5CF6",
|
|
214
|
+
strokeWidth: 2,
|
|
215
|
+
strokeDasharray: "2 3",
|
|
216
|
+
dot: !1,
|
|
217
|
+
activeDot: !1,
|
|
218
|
+
connectNulls: !1
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
] })
|
|
222
|
+
] }) });
|
|
223
|
+
} catch (d) {
|
|
224
|
+
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: l }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
225
|
+
/* @__PURE__ */ t("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Area Chart Error" }),
|
|
226
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs dc:mb-2", children: d instanceof Error ? d.message : "Unknown rendering error" }),
|
|
227
|
+
/* @__PURE__ */ t("div", { className: "dc:text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
228
|
+
] }) });
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
export {
|
|
232
|
+
ke as default
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=chart-area-ZZp1libT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-area-ZZp1libT.js","sources":["../../../src/client/components/charts/AreaChart.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { ComposedChart, Area, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst AreaChart = React.memo(function AreaChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n // Determine stacking from stackType (new) or stacked (legacy)\n const stackType = displayConfig?.stackType ?? (displayConfig?.stacked ? 'normal' : 'none')\n const shouldStack = stackType !== 'none'\n const isPercentStack = stackType === 'percent'\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\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=\"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 area chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig\n const yAxisAssignment = chartConfig?.yAxisAssignment || {}\n\n // Build mapping from series key (label) to original field name\n const seriesKeyToField: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = getFieldLabel(field)\n seriesKeyToField[label] = field\n })\n\n // Determine if we need a right Y-axis\n const hasRightAxis = yAxisFields.some((field) => yAxisAssignment[field] === 'right')\n\n // Get fields for left and right axes for labels\n const leftAxisFields = yAxisFields.filter((f) => (yAxisAssignment[f] || 'left') === 'left')\n const rightAxisFields = yAxisFields.filter((f) => yAxisAssignment[f] === 'right')\n\n // Disable stacking when dual Y-axis is used (areas on different axes can't be stacked)\n const effectiveShouldStack = shouldStack && !hasRightAxis\n const effectiveIsPercentStack = isPercentStack && !hasRightAxis\n\n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40, // Space for left Y-axis label\n right: hasRightAxis ? 40 : 20 // Extra space for right Y-axis label if needed\n }\n \n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n \n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n \n // Validate transformed data\n if (!chartData || chartData.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=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No valid data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No valid data points for area chart after transformation</div>\n </div>\n </div>\n )\n }\n\n // Determine stack offset for percentage stacking\n const stackOffset = effectiveIsPercentStack ? ('expand' as const) : undefined\n\n return (\n <ChartContainer height={height}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />}\n <XAxis dataKey=\"name\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n yAxisId=\"left\"\n orientation=\"left\"\n tick={{ fontSize: 12 }}\n tickFormatter={\n effectiveIsPercentStack\n ? (v) => `${(v * 100).toFixed(0)}%`\n : leftYAxisFormat\n ? (value) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n domain={effectiveIsPercentStack ? [0, 1] : undefined}\n label={\n effectiveIsPercentStack\n ? undefined\n : leftAxisFields.length > 0\n ? {\n value: leftYAxisFormat?.label || getFieldLabel(leftAxisFields[0]),\n angle: -90,\n position: 'left',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n {hasRightAxis && (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tick={{ fontSize: 12 }}\n tickFormatter={rightYAxisFormat ? (value) => formatAxisValue(value, rightYAxisFormat) : undefined}\n label={\n rightAxisFields.length > 0\n ? {\n value: rightYAxisFormat?.label || getFieldLabel(rightAxisFields[0]),\n angle: 90,\n position: 'right',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n // Use left Y-axis format for target values\n return [formatAxisValue(value, leftYAxisFormat), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (effectiveIsPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n // Determine which axis format to use based on series name\n const originalField = seriesKeyToField[name]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n const formatConfig = axisId === 'right' ? rightYAxisFormat : leftYAxisFormat\n return [formatAxisValue(value, formatConfig), name]\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n // Look up the original field name to get its axis assignment\n const originalField = seriesKeyToField[seriesKey]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n // When drill is enabled, show persistent dots for better click targets\n const areaColor = (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n\n return (\n <Area\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n stroke={areaColor}\n fill={areaColor}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeWidth={2}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n connectNulls={safeDisplayConfig.connectNulls}\n dot={(props: any) => {\n const { cx, cy, payload, key } = props\n if (!drillEnabled || cx === undefined || cy === undefined) return null\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation()\n event.preventDefault()\n if (onDataPointClick) {\n onDataPointClick({\n dataPoint: payload,\n clickedField: originalField || seriesKey,\n xValue: payload.name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }\n\n return (\n <g key={key}>\n {/* Background to mask grid lines - uses theme surface color */}\n <circle\n cx={cx}\n cy={cy}\n r={6}\n fill=\"var(--dc-surface)\"\n style={{ pointerEvents: 'none' }}\n />\n {/* Visible dot with click handler */}\n <circle\n cx={cx}\n cy={cy}\n r={4}\n fill=\"var(--dc-surface)\"\n stroke={areaColor}\n strokeWidth={2}\n cursor=\"pointer\"\n onClick={(e: React.MouseEvent<SVGCircleElement>) => {\n handleClick(e as unknown as React.MouseEvent)\n }}\n />\n </g>\n )\n }}\n activeDot={false}\n />\n )\n })}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </ComposedChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'AreaChart rendering 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=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Area 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 AreaChart"],"names":["AreaChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","onDataPointClick","drillEnabled","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeFieldLabel","stackType","shouldStack","isPercentStack","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","jsx","jsxs","xAxisField","yAxisFields","seriesFields","chartData","seriesKeys","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","effectiveShouldStack","effectiveIsPercentStack","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","AngledXAxisTick","YAxis","v","value","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","areaColor","CHART_COLORS","Area","props","cx","cy","payload","key","handleClick","event","e","Fragment","Line","error"],"mappings":"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"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { jsx as e, jsxs as d, Fragment as se } from "react/jsx-runtime";
|
|
2
|
+
import re, { useState as ie, useMemo as N } from "react";
|
|
3
|
+
import { ComposedChart as ne, CartesianGrid as ae, XAxis as le, YAxis as H, Legend as oe, Bar as ce, Cell as de, Line as W } from "recharts";
|
|
4
|
+
import { u as xe, t as me, i as fe, C as ue, p as he, s as ge, a as ye, f as I, b as pe, N as Ae, P as K, c as U } from "./charts-core-8jDh3mKC.js";
|
|
5
|
+
const ve = ({
|
|
6
|
+
x: R = 0,
|
|
7
|
+
y: o = 0,
|
|
8
|
+
payload: s,
|
|
9
|
+
tickFormatter: a,
|
|
10
|
+
index: k = 0
|
|
11
|
+
}) => {
|
|
12
|
+
if (!s) return null;
|
|
13
|
+
const x = a ? a(s.value, k) : String(s.value);
|
|
14
|
+
return /* @__PURE__ */ e("g", { transform: `translate(${R},${o})`, children: /* @__PURE__ */ e(
|
|
15
|
+
"text",
|
|
16
|
+
{
|
|
17
|
+
x: 0,
|
|
18
|
+
y: 0,
|
|
19
|
+
dy: 16,
|
|
20
|
+
textAnchor: "end",
|
|
21
|
+
fill: "currentColor",
|
|
22
|
+
fontSize: 12,
|
|
23
|
+
transform: "rotate(-45)",
|
|
24
|
+
children: x
|
|
25
|
+
}
|
|
26
|
+
) });
|
|
27
|
+
}, Ne = re.memo(function({
|
|
28
|
+
data: o,
|
|
29
|
+
chartConfig: s,
|
|
30
|
+
displayConfig: a = {},
|
|
31
|
+
queryObject: k,
|
|
32
|
+
height: x = "100%",
|
|
33
|
+
colorPalette: L,
|
|
34
|
+
onDataPointClick: j,
|
|
35
|
+
drillEnabled: B
|
|
36
|
+
}) {
|
|
37
|
+
const [F, C] = ie(null), h = xe(), M = a?.stackType ?? (a?.stacked ? "normal" : "none"), q = M !== "none", J = M === "percent", E = {
|
|
38
|
+
showLegend: a?.showLegend ?? !0,
|
|
39
|
+
showGrid: a?.showGrid ?? !0,
|
|
40
|
+
showTooltip: a?.showTooltip ?? !0
|
|
41
|
+
}, A = a?.leftYAxisFormat, b = a?.rightYAxisFormat, { xAxisField: O, yAxisFields: m, seriesFields: Y, configError: S } = N(() => {
|
|
42
|
+
let r, i = [], c = [], l = null;
|
|
43
|
+
return s?.xAxis && s?.yAxis ? (r = Array.isArray(s.xAxis) ? s.xAxis[0] : s.xAxis, i = Array.isArray(s.yAxis) ? s.yAxis : [s.yAxis], c = s.series || []) : s?.x && s?.y ? (r = s.x, i = Array.isArray(s.y) ? s.y : [s.y]) : l = "Invalid or missing chart axis configuration", !l && (!r || !i || i.length === 0) && (l = "Missing required X-axis or Y-axis fields"), { xAxisField: r, yAxisFields: i, seriesFields: c, configError: l };
|
|
44
|
+
}, [s]), { data: T, seriesKeys: g } = N(() => S || !o || o.length === 0 || !O ? { data: [], seriesKeys: [] } : me(
|
|
45
|
+
o,
|
|
46
|
+
O,
|
|
47
|
+
m,
|
|
48
|
+
k,
|
|
49
|
+
Y,
|
|
50
|
+
h
|
|
51
|
+
), [o, O, m, k, Y, h, S]), v = N(
|
|
52
|
+
() => s?.yAxisAssignment || {},
|
|
53
|
+
[s?.yAxisAssignment]
|
|
54
|
+
), G = N(() => {
|
|
55
|
+
const r = {};
|
|
56
|
+
return m.forEach((i) => {
|
|
57
|
+
const c = h(i);
|
|
58
|
+
r[c] = i;
|
|
59
|
+
}), r;
|
|
60
|
+
}, [m, h]), w = m.some((r) => v[r] === "right"), $ = m.filter((r) => (v[r] || "left") === "left"), P = m.filter((r) => v[r] === "right"), { chartData: f, skippedCount: _ } = N(() => {
|
|
61
|
+
if (T.length === 0 || g.length === 0)
|
|
62
|
+
return { chartData: [], skippedCount: 0 };
|
|
63
|
+
const r = T.filter((c) => g.some((l) => fe(c[l]))), i = T.length - r.length;
|
|
64
|
+
return { chartData: r, skippedCount: i };
|
|
65
|
+
}, [T, g]);
|
|
66
|
+
try {
|
|
67
|
+
if (!o || o.length === 0)
|
|
68
|
+
return /* @__PURE__ */ e("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: x }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
|
|
69
|
+
/* @__PURE__ */ e("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No data available" }),
|
|
70
|
+
/* @__PURE__ */ e("div", { className: "dc:text-xs text-dc-text-secondary", children: "No data points to display in bar chart" })
|
|
71
|
+
] }) });
|
|
72
|
+
if (S)
|
|
73
|
+
return /* @__PURE__ */ e("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning", style: { height: x }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
|
|
74
|
+
/* @__PURE__ */ e("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Configuration Error" }),
|
|
75
|
+
/* @__PURE__ */ e("div", { className: "dc:text-xs", children: S })
|
|
76
|
+
] }) });
|
|
77
|
+
const r = q && !w, i = J && !w, c = i ? "expand" : void 0, l = g.length === 1 && f.some((t) => {
|
|
78
|
+
const n = t[g[0]];
|
|
79
|
+
return typeof n == "number" && n < 0;
|
|
80
|
+
}), Q = E.showLegend, Z = {
|
|
81
|
+
...ue,
|
|
82
|
+
left: 40,
|
|
83
|
+
// Space for left Y-axis label
|
|
84
|
+
right: w ? 40 : 20
|
|
85
|
+
// Extra space for right Y-axis label if needed
|
|
86
|
+
}, ee = he(a?.target || ""), V = ge(ee, f.length);
|
|
87
|
+
let z = f;
|
|
88
|
+
return V.length > 0 && (z = f.map((t, n) => ({
|
|
89
|
+
...t,
|
|
90
|
+
__target: V[n] || null
|
|
91
|
+
}))), !f || f.length === 0 ? /* @__PURE__ */ e("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: x }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
|
|
92
|
+
/* @__PURE__ */ e("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No valid data" }),
|
|
93
|
+
/* @__PURE__ */ e("div", { className: "dc:text-xs text-dc-text-secondary", children: "No valid data points for bar chart after transformation" })
|
|
94
|
+
] }) }) : /* @__PURE__ */ d("div", { className: "dc:relative dc:w-full", style: { height: x }, children: [
|
|
95
|
+
/* @__PURE__ */ e(ye, { height: _ > 0 ? "calc(100% - 20px)" : "100%", children: /* @__PURE__ */ d(ne, { data: z, margin: Z, stackOffset: c, accessibilityLayer: !1, children: [
|
|
96
|
+
E.showGrid && /* @__PURE__ */ e(ae, { strokeDasharray: "3 3", style: { pointerEvents: "none" } }),
|
|
97
|
+
/* @__PURE__ */ e(
|
|
98
|
+
le,
|
|
99
|
+
{
|
|
100
|
+
dataKey: "name",
|
|
101
|
+
type: "category",
|
|
102
|
+
tick: /* @__PURE__ */ e(ve, {}),
|
|
103
|
+
height: 60
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ e(
|
|
107
|
+
H,
|
|
108
|
+
{
|
|
109
|
+
yAxisId: "left",
|
|
110
|
+
orientation: "left",
|
|
111
|
+
tick: { fontSize: 12 },
|
|
112
|
+
tickFormatter: i ? (t) => `${(t * 100).toFixed(0)}%` : A ? (t) => I(t, A) : void 0,
|
|
113
|
+
domain: i ? [0, 1] : void 0,
|
|
114
|
+
label: i ? void 0 : $.length > 0 ? {
|
|
115
|
+
value: A?.label || h($[0]),
|
|
116
|
+
angle: -90,
|
|
117
|
+
position: "left",
|
|
118
|
+
style: { textAnchor: "middle", fontSize: "12px" }
|
|
119
|
+
} : void 0
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
w && /* @__PURE__ */ e(
|
|
123
|
+
H,
|
|
124
|
+
{
|
|
125
|
+
yAxisId: "right",
|
|
126
|
+
orientation: "right",
|
|
127
|
+
tick: { fontSize: 12 },
|
|
128
|
+
tickFormatter: b ? (t) => I(t, b) : void 0,
|
|
129
|
+
label: P.length > 0 ? {
|
|
130
|
+
value: b?.label || h(P[0]),
|
|
131
|
+
angle: 90,
|
|
132
|
+
position: "right",
|
|
133
|
+
style: { textAnchor: "middle", fontSize: "12px" }
|
|
134
|
+
} : void 0
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
E.showTooltip && /* @__PURE__ */ e(
|
|
138
|
+
pe,
|
|
139
|
+
{
|
|
140
|
+
formatter: (t, n) => {
|
|
141
|
+
if (t == null)
|
|
142
|
+
return ["No data", n];
|
|
143
|
+
if (n === "Target")
|
|
144
|
+
return [I(t, A), "Target Value"];
|
|
145
|
+
if (i && typeof t == "number")
|
|
146
|
+
return [`${(t * 100).toFixed(1)}%`, n];
|
|
147
|
+
const y = G[n], u = (y && v[y] === "right" ? "right" : "left") === "right" ? b : A;
|
|
148
|
+
return [I(t, u), n];
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
),
|
|
152
|
+
Q && /* @__PURE__ */ e(
|
|
153
|
+
oe,
|
|
154
|
+
{
|
|
155
|
+
wrapperStyle: { fontSize: "12px", paddingTop: "25px" },
|
|
156
|
+
iconType: "rect",
|
|
157
|
+
iconSize: 8,
|
|
158
|
+
layout: "horizontal",
|
|
159
|
+
align: "center",
|
|
160
|
+
verticalAlign: "bottom",
|
|
161
|
+
onMouseEnter: (t) => C(String(t.dataKey || "")),
|
|
162
|
+
onMouseLeave: () => C(null)
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
g.map((t, n) => {
|
|
166
|
+
const y = G[t], X = y && v[y] === "right" ? "right" : "left";
|
|
167
|
+
return /* @__PURE__ */ e(
|
|
168
|
+
ce,
|
|
169
|
+
{
|
|
170
|
+
dataKey: t,
|
|
171
|
+
yAxisId: X,
|
|
172
|
+
stackId: r ? "stack" : void 0,
|
|
173
|
+
fill: l ? K : L?.colors && L.colors[n % L.colors.length] || U[n % U.length],
|
|
174
|
+
fillOpacity: F ? F === t ? 1 : 0.3 : 1,
|
|
175
|
+
cursor: B ? "pointer" : void 0,
|
|
176
|
+
onClick: (u, D, p) => {
|
|
177
|
+
j && B && u && j({
|
|
178
|
+
dataPoint: z[D] || u,
|
|
179
|
+
clickedField: y || t,
|
|
180
|
+
xValue: u.name,
|
|
181
|
+
position: { x: p.clientX, y: p.clientY },
|
|
182
|
+
nativeEvent: p
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
children: l && f.map((u, D) => {
|
|
186
|
+
const p = u[t], te = typeof p == "number" && p < 0 ? Ae : K;
|
|
187
|
+
return /* @__PURE__ */ e(
|
|
188
|
+
de,
|
|
189
|
+
{
|
|
190
|
+
fill: te,
|
|
191
|
+
fillOpacity: F ? F === t ? 1 : 0.3 : 1
|
|
192
|
+
},
|
|
193
|
+
`cell-${D}`
|
|
194
|
+
);
|
|
195
|
+
})
|
|
196
|
+
},
|
|
197
|
+
t
|
|
198
|
+
);
|
|
199
|
+
}),
|
|
200
|
+
V.length > 0 && /* @__PURE__ */ d(se, { children: [
|
|
201
|
+
/* @__PURE__ */ e(
|
|
202
|
+
W,
|
|
203
|
+
{
|
|
204
|
+
type: "monotone",
|
|
205
|
+
dataKey: "__target",
|
|
206
|
+
yAxisId: "left",
|
|
207
|
+
stroke: "#ffffff",
|
|
208
|
+
strokeWidth: 2,
|
|
209
|
+
dot: !1,
|
|
210
|
+
activeDot: !1,
|
|
211
|
+
connectNulls: !1
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
/* @__PURE__ */ e(
|
|
215
|
+
W,
|
|
216
|
+
{
|
|
217
|
+
type: "monotone",
|
|
218
|
+
dataKey: "__target",
|
|
219
|
+
yAxisId: "left",
|
|
220
|
+
name: "Target",
|
|
221
|
+
stroke: "#8B5CF6",
|
|
222
|
+
strokeWidth: 2,
|
|
223
|
+
strokeDasharray: "2 3",
|
|
224
|
+
dot: !1,
|
|
225
|
+
activeDot: !1,
|
|
226
|
+
connectNulls: !1
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
] })
|
|
230
|
+
] }) }),
|
|
231
|
+
_ > 0 && /* @__PURE__ */ d("div", { className: "dc:text-xs text-dc-text-muted text-center dc:mt-1", children: [
|
|
232
|
+
_,
|
|
233
|
+
" data point",
|
|
234
|
+
_ !== 1 ? "s" : "",
|
|
235
|
+
" with no values hidden"
|
|
236
|
+
] })
|
|
237
|
+
] });
|
|
238
|
+
} catch (r) {
|
|
239
|
+
return /* @__PURE__ */ e("div", { className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4", style: { height: x }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
|
|
240
|
+
/* @__PURE__ */ e("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Bar Chart Error" }),
|
|
241
|
+
/* @__PURE__ */ e("div", { className: "dc:text-xs dc:mb-2", children: r instanceof Error ? r.message : "Unknown rendering error" }),
|
|
242
|
+
/* @__PURE__ */ e("div", { className: "dc:text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
243
|
+
] }) });
|
|
244
|
+
}
|
|
245
|
+
}), Te = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
246
|
+
__proto__: null,
|
|
247
|
+
default: Ne
|
|
248
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
249
|
+
export {
|
|
250
|
+
ve as A,
|
|
251
|
+
Ne as B,
|
|
252
|
+
Te as a
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=chart-bar-B4grbo6Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-bar-B4grbo6Q.js","sources":["../../../src/client/components/charts/AngledXAxisTick.tsx","../../../src/client/components/charts/BarChart.tsx"],"sourcesContent":["import React from 'react'\n\ninterface AngledXAxisTickProps {\n x?: number\n y?: number\n payload?: {\n value: string | number\n }\n tickFormatter?: (value: string | number, index: number) => string\n index?: number\n visibleTicksCount?: number\n // Allow any additional props recharts might pass\n [key: string]: unknown\n}\n\n/**\n * Custom XAxis tick component for properly aligned angled labels.\n * Fixes alignment issues in recharts 3.7+ where angled labels don't\n * center properly under data points.\n */\nconst AngledXAxisTick: React.FC<AngledXAxisTickProps> = ({\n x = 0,\n y = 0,\n payload,\n tickFormatter,\n index = 0\n}) => {\n if (!payload) return null\n\n const displayValue = tickFormatter\n ? tickFormatter(payload.value, index)\n : String(payload.value)\n\n return (\n <g transform={`translate(${x},${y})`}>\n <text\n x={0}\n y={0}\n dy={16}\n textAnchor=\"end\"\n fill=\"currentColor\"\n fontSize={12}\n transform=\"rotate(-45)\"\n >\n {displayValue}\n </text>\n </g>\n )\n}\n\nexport default AngledXAxisTick\n","import React, { useState, useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_COLORS, POSITIVE_COLOR, NEGATIVE_COLOR, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst BarChart = React.memo(function BarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Determine stacking from stackType (new) or stacked (legacy)\n const stackType = displayConfig?.stackType ?? (displayConfig?.stacked ? 'normal' : 'none')\n const shouldStack = stackType !== 'none'\n const isPercentStack = stackType === 'percent'\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true\n }\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n // Validate chartConfig - support both legacy and new formats\n // Do validation but don't early return yet (hooks must come first)\n const { xAxisField, yAxisFields, seriesFields, configError } = useMemo(() => {\n let xAxisField: string | undefined\n let yAxisFields: string[] = []\n let seriesFields: string[] = []\n let configError: string | null = null\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n configError = 'Invalid or missing chart axis configuration'\n }\n\n if (!configError && (!xAxisField || !yAxisFields || yAxisFields.length === 0)) {\n configError = 'Missing required X-axis or Y-axis fields'\n }\n\n return { xAxisField, yAxisFields, seriesFields, configError }\n }, [chartConfig])\n\n // Transform data (will be empty arrays if config is invalid)\n const { data: transformedData, seriesKeys } = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField) {\n return { data: [], seriesKeys: [] }\n }\n return transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisFields, queryObject, seriesFields, getFieldLabel, configError])\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig (memoized to prevent object recreation)\n const yAxisAssignment = useMemo(() =>\n chartConfig?.yAxisAssignment || {},\n [chartConfig?.yAxisAssignment]\n )\n\n // Build mapping from series key (label) to original field name\n const seriesKeyToField: Record<string, string> = useMemo(() => {\n const mapping: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = getFieldLabel(field)\n mapping[label] = field\n })\n return mapping\n }, [yAxisFields, getFieldLabel])\n\n // Determine if we need a right Y-axis\n const hasRightAxis = yAxisFields.some((field) => yAxisAssignment[field] === 'right')\n\n // Get fields for left and right axes for labels\n const leftAxisFields = yAxisFields.filter((f) => (yAxisAssignment[f] || 'left') === 'left')\n const rightAxisFields = yAxisFields.filter((f) => yAxisAssignment[f] === 'right')\n\n // Null handling: Filter out data points where ALL measure values are null\n // This prevents rendering empty bars and makes the chart clearer\n const { chartData, skippedCount } = useMemo(() => {\n if (transformedData.length === 0 || seriesKeys.length === 0) {\n return { chartData: [], skippedCount: 0 }\n }\n const filtered = transformedData.filter(row => {\n // Keep the row if at least one series has a valid numeric value\n return seriesKeys.some(key => isValidNumericValue(row[key]))\n })\n const skipped = transformedData.length - filtered.length\n return { chartData: filtered, skippedCount: skipped }\n }, [transformedData, seriesKeys])\n\n // Now handle early returns AFTER all hooks\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=\"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 bar 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=\"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\n // Determine stack offset for percentage stacking\n // Disable stacking when dual Y-axis is used (bars on different axes can't be stacked)\n const effectiveShouldStack = shouldStack && !hasRightAxis\n const effectiveIsPercentStack = isPercentStack && !hasRightAxis\n const stackOffset = effectiveIsPercentStack ? 'expand' as const : undefined\n\n // Check if we should use positive/negative coloring\n // This is enabled when we have single series data with mixed positive/negative values\n const usePositiveNegativeColoring = seriesKeys.length === 1 && chartData.some(row => {\n const value = row[seriesKeys[0]]\n return typeof value === 'number' && value < 0\n })\n\n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40, // Space for left Y-axis label\n right: hasRightAxis ? 40 : 20 // Extra space for right Y-axis label if needed\n }\n \n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n \n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n \n // Validate transformed data\n if (!chartData || chartData.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=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No valid data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No valid data points for bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height={skippedCount > 0 ? `calc(100% - 20px)` : \"100%\"}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n )}\n <XAxis\n dataKey=\"name\"\n type=\"category\"\n tick={<AngledXAxisTick />}\n height={60}\n />\n <YAxis\n yAxisId=\"left\"\n orientation=\"left\"\n tick={{ fontSize: 12 }}\n tickFormatter={\n effectiveIsPercentStack\n ? (v) => `${(v * 100).toFixed(0)}%`\n : leftYAxisFormat\n ? (value) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n domain={effectiveIsPercentStack ? [0, 1] : undefined}\n label={\n effectiveIsPercentStack\n ? undefined\n : leftAxisFields.length > 0\n ? {\n value: leftYAxisFormat?.label || getFieldLabel(leftAxisFields[0]),\n angle: -90,\n position: 'left',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n {hasRightAxis && (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tick={{ fontSize: 12 }}\n tickFormatter={rightYAxisFormat ? (value) => formatAxisValue(value, rightYAxisFormat) : undefined}\n label={\n rightAxisFields.length > 0\n ? {\n value: rightYAxisFormat?.label || getFieldLabel(rightAxisFields[0]),\n angle: 90,\n position: 'right',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n // Use left Y-axis format for target values\n return [formatAxisValue(value, leftYAxisFormat), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (effectiveIsPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n // Determine which axis format to use based on series name\n const originalField = seriesKeyToField[name]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n const formatConfig = axisId === 'right' ? rightYAxisFormat : leftYAxisFormat\n return [formatAxisValue(value, formatConfig), name]\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '25px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n // Look up the original field name to get its axis assignment\n const originalField = seriesKeyToField[seriesKey]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n return (\n <Bar\n key={seriesKey}\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n fill={\n usePositiveNegativeColoring\n ? POSITIVE_COLOR\n : (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, dataIndex: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData) {\n onDataPointClick({\n dataPoint: enhancedChartData[dataIndex] || barData,\n clickedField: originalField || seriesKey,\n xValue: barData.name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }}\n >\n {usePositiveNegativeColoring &&\n chartData.map((entry, entryIndex) => {\n const value = entry[seriesKey]\n const fillColor = typeof value === 'number' && value < 0 ? NEGATIVE_COLOR : POSITIVE_COLOR\n return (\n <Cell\n key={`cell-${entryIndex}`}\n fill={fillColor}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n />\n )\n })}\n </Bar>\n )\n })}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </ComposedChart>\n </ChartContainer>\n {skippedCount > 0 && (\n <div className=\"dc:text-xs text-dc-text-muted text-center dc:mt-1\">\n {skippedCount} data point{skippedCount !== 1 ? 's' : ''} with no values hidden\n </div>\n )}\n </div>\n )\n } catch (error) {\n // 'BarChart rendering 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=\"text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Bar 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 BarChart"],"names":["AngledXAxisTick","x","y","payload","tickFormatter","index","displayValue","jsx","BarChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","onDataPointClick","drillEnabled","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeFieldLabel","stackType","shouldStack","isPercentStack","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","xAxisField","yAxisFields","seriesFields","configError","useMemo","transformedData","seriesKeys","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","mapping","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","chartData","skippedCount","filtered","row","key","isValidNumericValue","skipped","jsxs","effectiveShouldStack","effectiveIsPercentStack","stackOffset","usePositiveNegativeColoring","value","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Bar","POSITIVE_COLOR","CHART_COLORS","barData","dataIndex","event","entry","entryIndex","fillColor","NEGATIVE_COLOR","Cell","Fragment","Line","error"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as y, jsxs as te } from "react/jsx-runtime";
|
|
2
2
|
import Ae, { useSyncExternalStore as Fe, useCallback as Se, useRef as ne, useState as oe, useMemo as we, useLayoutEffect as ve, useEffect as ce } from "react";
|
|
3
3
|
import { select as D, scaleLinear as de, extent as ue, scaleSqrt as ze, max as Te, scaleQuantize as $e, scaleOrdinal as me, axisBottom as xe, axisLeft as fe } from "d3";
|
|
4
|
-
import { u as Ne, g as ke, d as ye, i as Ye, e as he, C as pe, h as ge, c as se, f as N } from "./charts-core-
|
|
4
|
+
import { u as Ne, g as ke, d as ye, i as Ye, e as he, C as pe, h as ge, c as se, f as N } from "./charts-core-8jDh3mKC.js";
|
|
5
5
|
import { g as be, s as Re, w as Ve } from "./theme-Dp3hFed1.js";
|
|
6
6
|
const H = {
|
|
7
7
|
listeners: /* @__PURE__ */ new Set(),
|
|
@@ -246,4 +246,4 @@ export {
|
|
|
246
246
|
He as B,
|
|
247
247
|
Be as u
|
|
248
248
|
};
|
|
249
|
-
//# sourceMappingURL=chart-bubble-
|
|
249
|
+
//# sourceMappingURL=chart-bubble-BGGAQQUQ.js.map
|