drizzle-cube 0.2.11 → 0.2.13
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/compiler-CMwSRhTS.cjs +22 -0
- package/dist/adapters/{compiler-gcKytLwd.js → compiler-DrkCCzf0.js} +16 -11
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +8 -8
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +9 -9
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +11 -11
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +59 -59
- package/dist/client/charts.js +11 -11
- package/dist/client/chunks/{chart-activitygridchart-D17Fxiuf.js → chart-activitygridchart-CUGN9Xq9.js} +3 -2
- package/dist/client/chunks/chart-activitygridchart-CUGN9Xq9.js.map +1 -0
- package/dist/client/chunks/{chart-areachart-udSbAzl1.js → chart-areachart-B4tknnsY.js} +25 -25
- package/dist/client/chunks/{chart-areachart-udSbAzl1.js.map → chart-areachart-B4tknnsY.js.map} +1 -1
- package/dist/client/chunks/{chart-axisformatcontrols-DqSa245M.js → chart-axisformatcontrols-Ch_IYF94.js} +18 -18
- package/dist/client/chunks/chart-axisformatcontrols-Ch_IYF94.js.map +1 -0
- package/dist/client/chunks/{chart-barchart-CDIpqCKS.js → chart-barchart-D_op06r-.js} +6 -6
- package/dist/client/chunks/{chart-barchart-CDIpqCKS.js.map → chart-barchart-D_op06r-.js.map} +1 -1
- package/dist/client/chunks/{chart-bubblechart-CivK_yfh.js → chart-bubblechart-BsaIXUbS.js} +3 -3
- package/dist/client/chunks/chart-bubblechart-BsaIXUbS.js.map +1 -0
- package/dist/client/chunks/{chart-charttooltip-BVEdz4Q-.js → chart-charttooltip-Bx3I8jQv.js} +2 -2
- package/dist/client/chunks/{chart-charttooltip-BVEdz4Q-.js.map → chart-charttooltip-Bx3I8jQv.js.map} +1 -1
- package/dist/client/chunks/{chart-datatable-NHE7BTMr.js → chart-datatable-C7MS9q4Y.js} +2 -2
- package/dist/client/chunks/{chart-datatable-NHE7BTMr.js.map → chart-datatable-C7MS9q4Y.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-D-FR2o4V.js → chart-kpidelta-7-KOmb3w.js} +62 -60
- package/dist/client/chunks/chart-kpidelta-7-KOmb3w.js.map +1 -0
- package/dist/client/chunks/{chart-kpinumber-DSH8RJxb.js → chart-kpinumber-HOPfcK2N.js} +4 -4
- package/dist/client/chunks/{chart-kpinumber-DSH8RJxb.js.map → chart-kpinumber-HOPfcK2N.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-Z9oh0bJq.js → chart-kpitext-BZkC9u3A.js} +24 -24
- package/dist/client/chunks/{chart-kpitext-Z9oh0bJq.js.map → chart-kpitext-BZkC9u3A.js.map} +1 -1
- package/dist/client/chunks/{chart-linechart-D4r0uD1j.js → chart-linechart-DqFmLbRe.js} +7 -7
- package/dist/client/chunks/{chart-linechart-D4r0uD1j.js.map → chart-linechart-DqFmLbRe.js.map} +1 -1
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js +256 -0
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js.map +1 -0
- package/dist/client/chunks/{chart-piechart-BhttUWuH.js → chart-piechart-CrXFd9pE.js} +6 -6
- package/dist/client/chunks/{chart-piechart-BhttUWuH.js.map → chart-piechart-CrXFd9pE.js.map} +1 -1
- package/dist/client/chunks/{chart-radarchart-DnqlfoGr.js → chart-radarchart-tar2GBkO.js} +5 -5
- package/dist/client/chunks/{chart-radarchart-DnqlfoGr.js.map → chart-radarchart-tar2GBkO.js.map} +1 -1
- package/dist/client/chunks/{chart-radialbarchart-BFxxiqLw.js → chart-radialbarchart-ab8Swtal.js} +5 -5
- package/dist/client/chunks/{chart-radialbarchart-BFxxiqLw.js.map → chart-radialbarchart-ab8Swtal.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js → chart-scatterchart-BP06BeU5.js} +5 -5
- package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js.map → chart-scatterchart-BP06BeU5.js.map} +1 -1
- package/dist/client/chunks/{chart-treemapchart-Nozh2m26.js → chart-treemapchart-DAiixITm.js} +31 -31
- package/dist/client/chunks/{chart-treemapchart-Nozh2m26.js.map → chart-treemapchart-DAiixITm.js.map} +1 -1
- package/dist/client/chunks/{charts-BSDHSv4l.js → charts-CHzWeaY1.js} +26 -26
- package/dist/client/chunks/charts-CHzWeaY1.js.map +1 -0
- package/dist/client/chunks/{components-CbDovlG-.js → components-DnM9CCUS.js} +2453 -2445
- package/dist/client/chunks/components-DnM9CCUS.js.map +1 -0
- package/dist/client/chunks/{index-th92_8oL.js → index-DlsvcKXf.js} +135 -135
- package/dist/client/chunks/index-DlsvcKXf.js.map +1 -0
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +5 -5
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +2 -7
- package/dist/client/components/AnalysisBuilder/types.d.ts +8 -8
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/useResponsiveDashboard.d.ts +2 -8
- package/dist/client/hooks.js +2 -2
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/icons/types.d.ts +2 -2
- package/dist/client/index.js +3 -3
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +16 -11
- package/package.json +3 -3
- package/dist/adapters/compiler-DP1pPIcg.cjs +0 -22
- package/dist/client/chunks/chart-activitygridchart-D17Fxiuf.js.map +0 -1
- package/dist/client/chunks/chart-axisformatcontrols-DqSa245M.js.map +0 -1
- package/dist/client/chunks/chart-bubblechart-CivK_yfh.js.map +0 -1
- package/dist/client/chunks/chart-kpidelta-D-FR2o4V.js.map +0 -1
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js +0 -254
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js.map +0 -1
- package/dist/client/chunks/charts-BSDHSv4l.js.map +0 -1
- package/dist/client/chunks/components-CbDovlG-.js.map +0 -1
- package/dist/client/chunks/index-th92_8oL.js.map +0 -1
|
@@ -2,8 +2,8 @@ import { jsx as r, jsxs as f, Fragment as K } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as C } from "react";
|
|
3
3
|
import { ComposedChart as X, CartesianGrid as q, XAxis as B, YAxis as M, Legend as U, Area as J, Line as O } from "recharts";
|
|
4
4
|
import { C as Q } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as Z } from "./chart-charttooltip-
|
|
6
|
-
import { u as P, t as ee, C as te, f as w, a as F } from "./chart-activitygridchart-
|
|
5
|
+
import { C as Z } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { u as P, t as ee, C as te, f as w, a as F } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
7
|
function re(s) {
|
|
8
8
|
if (!s || typeof s != "string")
|
|
9
9
|
return [];
|
|
@@ -11,10 +11,10 @@ function re(s) {
|
|
|
11
11
|
if (!t)
|
|
12
12
|
return [];
|
|
13
13
|
try {
|
|
14
|
-
const i = t.split(",").map((
|
|
15
|
-
const o = parseFloat(
|
|
14
|
+
const i = t.split(",").map((a) => a.trim()).filter((a) => a !== "").map((a) => {
|
|
15
|
+
const o = parseFloat(a);
|
|
16
16
|
if (isNaN(o))
|
|
17
|
-
throw new Error(`Invalid numeric value: ${
|
|
17
|
+
throw new Error(`Invalid numeric value: ${a}`);
|
|
18
18
|
return o;
|
|
19
19
|
});
|
|
20
20
|
return i.length > 0 ? i : [];
|
|
@@ -27,12 +27,12 @@ function se(s, t) {
|
|
|
27
27
|
return [];
|
|
28
28
|
if (s.length === 1)
|
|
29
29
|
return new Array(t).fill(s[0]);
|
|
30
|
-
const i = [],
|
|
30
|
+
const i = [], a = Math.floor(t / s.length), o = t % s.length;
|
|
31
31
|
let d = 0;
|
|
32
|
-
for (let
|
|
33
|
-
const p =
|
|
34
|
-
for (let
|
|
35
|
-
i[d++] = s[
|
|
32
|
+
for (let l = 0; l < s.length; l++) {
|
|
33
|
+
const p = a + (l < o ? 1 : 0);
|
|
34
|
+
for (let g = 0; g < p; g++)
|
|
35
|
+
i[d++] = s[l];
|
|
36
36
|
}
|
|
37
37
|
return i;
|
|
38
38
|
}
|
|
@@ -46,13 +46,13 @@ function ie({
|
|
|
46
46
|
data: s,
|
|
47
47
|
chartConfig: t,
|
|
48
48
|
displayConfig: i = {},
|
|
49
|
-
queryObject:
|
|
49
|
+
queryObject: a,
|
|
50
50
|
height: o = "100%",
|
|
51
51
|
colorPalette: d
|
|
52
52
|
}) {
|
|
53
|
-
const [
|
|
53
|
+
const [l, p] = C(null), { labelMap: g, getFieldLabel: S } = P();
|
|
54
54
|
try {
|
|
55
|
-
const m = i?.stackType ?? (i?.stacked ? "normal" : "none"), E = m !== "none", V = m === "percent",
|
|
55
|
+
const m = i?.stackType ?? (i?.stacked ? "normal" : "none"), E = m !== "none", V = m === "percent", v = {
|
|
56
56
|
showLegend: i?.showLegend ?? !0,
|
|
57
57
|
showGrid: i?.showGrid ?? !0,
|
|
58
58
|
showTooltip: i?.showTooltip ?? !0,
|
|
@@ -69,12 +69,12 @@ function ie({
|
|
|
69
69
|
else if (t?.x && t?.y)
|
|
70
70
|
k = t.x, c = Array.isArray(t.y) ? t.y : [t.y];
|
|
71
71
|
else
|
|
72
|
-
return /* @__PURE__ */ r("div", { className: "flex items-center justify-center w-full text-
|
|
72
|
+
return /* @__PURE__ */ r("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: o }, children: /* @__PURE__ */ f("div", { className: "text-center", children: [
|
|
73
73
|
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
74
74
|
/* @__PURE__ */ r("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
|
|
75
75
|
] }) });
|
|
76
76
|
if (!k || !c || c.length === 0)
|
|
77
|
-
return /* @__PURE__ */ r("div", { className: "flex items-center justify-center w-full text-
|
|
77
|
+
return /* @__PURE__ */ r("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: o }, children: /* @__PURE__ */ f("div", { className: "text-center", children: [
|
|
78
78
|
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
79
79
|
/* @__PURE__ */ r("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
80
80
|
] }) });
|
|
@@ -82,15 +82,15 @@ function ie({
|
|
|
82
82
|
s,
|
|
83
83
|
k,
|
|
84
84
|
c,
|
|
85
|
-
|
|
85
|
+
a,
|
|
86
86
|
_,
|
|
87
|
-
|
|
87
|
+
g
|
|
88
88
|
), h = t?.yAxisAssignment || {}, T = {};
|
|
89
89
|
c.forEach((e) => {
|
|
90
90
|
const n = S(e);
|
|
91
91
|
T[n] = e;
|
|
92
92
|
});
|
|
93
|
-
const b = c.some((e) => h[e] === "right"), z = c.filter((e) => (h[e] || "left") === "left"), j = c.filter((e) => h[e] === "right"), Y = E && !b, y = V && !b, $ =
|
|
93
|
+
const b = c.some((e) => h[e] === "right"), z = c.filter((e) => (h[e] || "left") === "left"), j = c.filter((e) => h[e] === "right"), Y = E && !b, y = V && !b, $ = v.showLegend, R = {
|
|
94
94
|
...te,
|
|
95
95
|
left: 40,
|
|
96
96
|
// Space for left Y-axis label
|
|
@@ -105,7 +105,7 @@ function ie({
|
|
|
105
105
|
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "No valid data" }),
|
|
106
106
|
/* @__PURE__ */ r("div", { className: "text-xs text-dc-text-secondary", children: "No valid data points for area chart after transformation" })
|
|
107
107
|
] }) }) : /* @__PURE__ */ r(Q, { height: o, children: /* @__PURE__ */ f(X, { data: D, margin: R, stackOffset: y ? "expand" : void 0, children: [
|
|
108
|
-
|
|
108
|
+
v.showGrid && /* @__PURE__ */ r(q, { strokeDasharray: "3 3" }),
|
|
109
109
|
/* @__PURE__ */ r(B, { dataKey: "name", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 60 }),
|
|
110
110
|
/* @__PURE__ */ r(
|
|
111
111
|
M,
|
|
@@ -138,7 +138,7 @@ function ie({
|
|
|
138
138
|
} : void 0
|
|
139
139
|
}
|
|
140
140
|
),
|
|
141
|
-
|
|
141
|
+
v.showTooltip && /* @__PURE__ */ r(
|
|
142
142
|
Z,
|
|
143
143
|
{
|
|
144
144
|
formatter: (e, n) => {
|
|
@@ -177,10 +177,10 @@ function ie({
|
|
|
177
177
|
stackId: Y ? "stack" : void 0,
|
|
178
178
|
stroke: d?.colors && d.colors[n % d.colors.length] || F[n % F.length],
|
|
179
179
|
fill: d?.colors && d.colors[n % d.colors.length] || F[n % F.length],
|
|
180
|
-
fillOpacity:
|
|
180
|
+
fillOpacity: l ? l === e ? 0.6 : 0.1 : 0.3,
|
|
181
181
|
strokeWidth: 2,
|
|
182
|
-
strokeOpacity:
|
|
183
|
-
connectNulls:
|
|
182
|
+
strokeOpacity: l ? l === e ? 1 : 0.3 : 1,
|
|
183
|
+
connectNulls: v.connectNulls
|
|
184
184
|
},
|
|
185
185
|
e
|
|
186
186
|
);
|
|
@@ -217,7 +217,7 @@ function ie({
|
|
|
217
217
|
] })
|
|
218
218
|
] }) });
|
|
219
219
|
} catch (m) {
|
|
220
|
-
return /* @__PURE__ */ r("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
220
|
+
return /* @__PURE__ */ r("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: o }, children: /* @__PURE__ */ f("div", { className: "text-center", children: [
|
|
221
221
|
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "Area Chart Error" }),
|
|
222
222
|
/* @__PURE__ */ r("div", { className: "text-xs mb-2", children: m instanceof Error ? m.message : "Unknown rendering error" }),
|
|
223
223
|
/* @__PURE__ */ r("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -236,4 +236,4 @@ export {
|
|
|
236
236
|
re as p,
|
|
237
237
|
se as s
|
|
238
238
|
};
|
|
239
|
-
//# sourceMappingURL=chart-areachart-
|
|
239
|
+
//# sourceMappingURL=chart-areachart-B4tknnsY.js.map
|
package/dist/client/chunks/{chart-areachart-udSbAzl1.js.map → chart-areachart-B4tknnsY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-areachart-udSbAzl1.js","sources":["../../../src/client/utils/targetUtils.ts","../../../src/client/components/charts/AreaChart.tsx"],"sourcesContent":["/**\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}","import { useState } from 'react'\nimport { ComposedChart, Area, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function AreaChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap, getFieldLabel } = useCubeContext()\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"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=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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 labelMap\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"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}>\n {safeDisplayConfig.showGrid && <CartesianGrid strokeDasharray=\"3 3\" />}\n <XAxis dataKey=\"name\" tick={{ fontSize: 12 }} angle={-45} textAnchor=\"end\" 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 return (\n <Area\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fill={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\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 />\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=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Area Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["parseTargetValues","targetString","trimmed","values","val","num","error","spreadTargetValues","targets","dataLength","result","baseGroupSize","remainder","currentIndex","i","groupSize","j","calculateVariance","actual","target","formatVariance","variance","decimals","AreaChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","getFieldLabel","useCubeContext","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","spreadTargets","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","value","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Area","CHART_COLORS","Fragment","Line"],"mappings":";;;;;;AASO,SAASA,GAAkBC,GAAgC;AAChE,MAAI,CAACA,KAAgB,OAAOA,KAAiB;AAC3C,WAAO,CAAA;AAGT,QAAMC,IAAUD,EAAa,KAAA;AAC7B,MAAI,CAACC;AACH,WAAO,CAAA;AAGT,MAAI;AAEF,UAAMC,IAASD,EACZ,MAAM,GAAG,EACT,IAAI,CAAAE,MAAOA,EAAI,KAAA,CAAM,EACrB,OAAO,CAAAA,MAAOA,MAAQ,EAAE,EACxB,IAAI,CAAAA,MAAO;AACV,YAAMC,IAAM,WAAWD,CAAG;AAC1B,UAAI,MAAMC,CAAG;AACX,cAAM,IAAI,MAAM,0BAA0BD,CAAG,EAAE;AAEjD,aAAOC;AAAA,IACT,CAAC;AAEH,WAAOF,EAAO,SAAS,IAAIA,IAAS,CAAA;AAAA,EACtC,SAASG,GAAO;AACd,mBAAQ,KAAK,kCAAkCA,CAAK,GAC7C,CAAA;AAAA,EACT;AACF;AAQO,SAASC,GAAmBC,GAAmBC,GAA8B;AAClF,MAAID,EAAQ,WAAW,KAAKC,KAAc;AACxC,WAAO,CAAA;AAIT,MAAID,EAAQ,WAAW;AACrB,WAAO,IAAI,MAAMC,CAAU,EAAE,KAAKD,EAAQ,CAAC,CAAC;AAI9C,QAAME,IAAmB,CAAA,GACnBC,IAAgB,KAAK,MAAMF,IAAaD,EAAQ,MAAM,GACtDI,IAAYH,IAAaD,EAAQ;AAEvC,MAAIK,IAAe;AAEnB,WAASC,IAAI,GAAGA,IAAIN,EAAQ,QAAQM,KAAK;AAGvC,UAAMC,IAAYJ,KAAiBG,IAAIF,IAAY,IAAI;AAGvD,aAASI,IAAI,GAAGA,IAAID,GAAWC;AAC7B,MAAAN,EAAOG,GAAc,IAAIL,EAAQM,CAAC;AAAA,EAEtC;AAEA,SAAOJ;AACT;AAQO,SAASO,GAAkBC,GAAgBC,GAAwB;AACxE,SAAIA,MAAW,IACND,MAAW,IAAI,IAAKA,IAAS,IAAI,MAAM,QAEvCA,IAASC,KAAUA,IAAU;AACxC;AAQO,SAASC,GAAeC,GAAkBC,IAAmB,GAAW;AAE7E,SAAO,GADMD,KAAY,IAAI,MAAM,EACrB,GAAGA,EAAS,QAAQC,CAAQ,CAAC;AAC7C;ACzFA,SAAwBC,GAAU;AAAA,EAChC,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC,IAAgB,CAAA;AAAA,EAChB,aAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,cAAAC;AACF,GAAe;AACb,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAwB,IAAI,GAChE,EAAE,UAAAC,GAAU,eAAAC,EAAA,IAAkBC,EAAA;AAEpC,MAAI;AAEF,UAAMC,IAAYV,GAAe,cAAcA,GAAe,UAAU,WAAW,SAC7EW,IAAcD,MAAc,QAC5BE,IAAiBF,MAAc,WAE/BG,IAAoB;AAAA,MACxB,YAAYb,GAAe,cAAc;AAAA,MACzC,UAAUA,GAAe,YAAY;AAAA,MACrC,aAAaA,GAAe,eAAe;AAAA,MAC3C,cAAcA,GAAe,gBAAgB;AAAA,IAAA,GAIzCc,IAAkBd,GAAe,iBACjCe,IAAmBf,GAAe;AAExC,QAAI,CAACF,KAAQA,EAAK,WAAW;AAC3B,aACE,gBAAAkB,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAd,EAAA,GACnF,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,qBAAiB;AAAA,QAC7D,gBAAAA,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,0CAAA,CAAuC;AAAA,MAAA,EAAA,CACzF,EAAA,CACF;AAKJ,QAAIE,GACAC,GACAC,IAAyB,CAAA;AAE7B,QAAIrB,GAAa,SAASA,GAAa;AAErC,MAAAmB,IAAa,MAAM,QAAQnB,EAAY,KAAK,IAAIA,EAAY,MAAM,CAAC,IAAIA,EAAY,OACnFoB,IAAc,MAAM,QAAQpB,EAAY,KAAK,IAAIA,EAAY,QAAQ,CAACA,EAAY,KAAK,GACvFqB,IAAerB,EAAY,UAAU,CAAA;AAAA,aAC5BA,GAAa,KAAKA,GAAa;AAExC,MAAAmB,IAAanB,EAAY,GACzBoB,IAAc,MAAM,QAAQpB,EAAY,CAAC,IAAIA,EAAY,IAAI,CAACA,EAAY,CAAC;AAAA;AAE3E,aACE,gBAAAiB,EAAC,OAAA,EAAI,WAAU,2DAA0D,OAAO,EAAE,QAAAd,EAAA,GAChF,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,uBAAmB;AAAA,QAC/D,gBAAAA,EAAC,OAAA,EAAI,WAAU,WAAU,UAAA,8CAAA,CAA2C;AAAA,MAAA,EAAA,CACtE,EAAA,CACF;AAIJ,QAAI,CAACE,KAAc,CAACC,KAAeA,EAAY,WAAW;AACxD,aACE,gBAAAH,EAAC,OAAA,EAAI,WAAU,2DAA0D,OAAO,EAAE,QAAAd,EAAA,GAChF,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,uBAAmB;AAAA,QAC/D,gBAAAA,EAAC,OAAA,EAAI,WAAU,WAAU,UAAA,2CAAA,CAAwC;AAAA,MAAA,EAAA,CACnE,EAAA,CACF;AAKJ,UAAM,EAAE,MAAMK,GAAW,YAAAC,EAAA,IAAeC;AAAA,MACtCzB;AAAA,MACAoB;AAAA,MACAC;AAAA,MACAlB;AAAA,MACAmB;AAAA,MACAb;AAAA,IAAA,GAIIiB,IAAkBzB,GAAa,mBAAmB,CAAA,GAGlD0B,IAA2C,CAAA;AACjD,IAAAN,EAAY,QAAQ,CAACO,MAAU;AAC7B,YAAMC,IAAQnB,EAAckB,CAAK;AACjC,MAAAD,EAAiBE,CAAK,IAAID;AAAA,IAC5B,CAAC;AAGD,UAAME,IAAeT,EAAY,KAAK,CAACO,MAAUF,EAAgBE,CAAK,MAAM,OAAO,GAG7EG,IAAiBV,EAAY,OAAO,CAACW,OAAON,EAAgBM,CAAC,KAAK,YAAY,MAAM,GACpFC,IAAkBZ,EAAY,OAAO,CAACW,MAAMN,EAAgBM,CAAC,MAAM,OAAO,GAG1EE,IAAuBrB,KAAe,CAACiB,GACvCK,IAA0BrB,KAAkB,CAACgB,GAG7CM,IAAarB,EAAkB,YAG/BsB,IAAe;AAAA,MACnB,GAAGC;AAAA,MACH,MAAM;AAAA;AAAA,MACN,OAAOR,IAAe,KAAK;AAAA;AAAA,IAAA,GAIvBS,IAAe/D,GAAkB0B,GAAe,UAAU,EAAE,GAC5DsC,IAAgBzD,GAAmBwD,GAAchB,EAAU,MAAM;AAGvE,QAAIkB,IAAoBlB;AASxB,WARIiB,EAAc,SAAS,MACzBC,IAAoBlB,EAAU,IAAI,CAACmB,GAAWC,OAAW;AAAA,MACvD,GAAGD;AAAA,MACH,UAAUF,EAAcG,CAAK,KAAK;AAAA,IAAA,EAClC,IAIA,CAACpB,KAAaA,EAAU,WAAW,IAEnC,gBAAAL,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAd,EAAA,GACnF,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,iBAAa;AAAA,MACzD,gBAAAA,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,2DAAA,CAAwD;AAAA,IAAA,EAAA,CAC1G,EAAA,CACF,IAQF,gBAAAA,EAAC0B,KAAe,QAAAxC,GACd,UAAA,gBAAAe,EAAC0B,KAAc,MAAMJ,GAAmB,QAAQJ,GAAc,aAJ9CF,IAA2B,WAAqB,QAK7D,UAAA;AAAA,MAAApB,EAAkB,YAAY,gBAAAG,EAAC4B,GAAA,EAAc,iBAAgB,OAAM;AAAA,MACpE,gBAAA5B,EAAC6B,GAAA,EAAM,SAAQ,QAAO,MAAM,EAAE,UAAU,GAAA,GAAM,OAAO,KAAK,YAAW,OAAM,QAAQ,IAAI;AAAA,MACvF,gBAAA7B;AAAA,QAAC8B;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,aAAY;AAAA,UACZ,MAAM,EAAE,UAAU,GAAA;AAAA,UAClB,eACEb,IACI,CAACc,MAAM,IAAIA,IAAI,KAAK,QAAQ,CAAC,CAAC,MAC9BjC,IACE,CAACkC,MAAUC,EAAgBD,GAAOlC,CAAe,IACjD;AAAA,UAER,QAAQmB,IAA0B,CAAC,GAAG,CAAC,IAAI;AAAA,UAC3C,OACEA,IACI,SACAJ,EAAe,SAAS,IACtB;AAAA,YACE,OAAOf,GAAiB,SAASN,EAAcqB,EAAe,CAAC,CAAC;AAAA,YAChE,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO,EAAE,YAAY,UAAU,UAAU,OAAA;AAAA,UAAO,IAElD;AAAA,QAAA;AAAA,MAAA;AAAA,MAGTD,KACC,gBAAAZ;AAAA,QAAC8B;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,aAAY;AAAA,UACZ,MAAM,EAAE,UAAU,GAAA;AAAA,UAClB,eAAe/B,IAAmB,CAACiC,MAAUC,EAAgBD,GAAOjC,CAAgB,IAAI;AAAA,UACxF,OACEgB,EAAgB,SAAS,IACrB;AAAA,YACE,OAAOhB,GAAkB,SAASP,EAAcuB,EAAgB,CAAC,CAAC;AAAA,YAClE,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO,EAAE,YAAY,UAAU,UAAU,OAAA;AAAA,UAAO,IAElD;AAAA,QAAA;AAAA,MAAA;AAAA,MAITlB,EAAkB,eACjB,gBAAAG;AAAA,QAACkC;AAAA,QAAA;AAAA,UACC,WAAW,CAACF,GAAYG,MAAc;AAEpC,gBAAIH,KAAU;AACZ,qBAAO,CAAC,WAAWG,CAAI;AAEzB,gBAAIA,MAAS;AAEX,qBAAO,CAACF,EAAgBD,GAAOlC,CAAe,GAAG,cAAc;AAGjE,gBAAImB,KAA2B,OAAOe,KAAU;AAC9C,qBAAO,CAAC,IAAIA,IAAQ,KAAK,QAAQ,CAAC,CAAC,KAAKG,CAAI;AAG9C,kBAAMC,IAAgB3B,EAAiB0B,CAAI,GAErCE,KADSD,KAAiB5B,EAAgB4B,CAAa,MAAM,UAAU,UAAU,YACvD,UAAUrC,IAAmBD;AAC7D,mBAAO,CAACmC,EAAgBD,GAAOK,CAAY,GAAGF,CAAI;AAAA,UACpD;AAAA,QAAA;AAAA,MAAA;AAAA,MAGHjB,KACC,gBAAAlB;AAAA,QAACsC;AAAA,QAAA;AAAA,UACC,cAAc,EAAE,UAAU,QAAQ,YAAY,OAAA;AAAA,UAC9C,UAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAO;AAAA,UACP,OAAM;AAAA,UACN,eAAc;AAAA,UACd,cAAc,CAACC,MAAMlD,EAAiB,OAAOkD,EAAE,WAAW,EAAE,CAAC;AAAA,UAC7D,cAAc,MAAMlD,EAAiB,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAG5CiB,EAAW,IAAI,CAACkC,GAAWf,MAAU;AAEpC,cAAMW,IAAgB3B,EAAiB+B,CAAS,GAC1CC,IAASL,KAAiB5B,EAAgB4B,CAAa,MAAM,UAAU,UAAU;AACvF,eACE,gBAAApC;AAAA,UAAC0C;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAASF;AAAA,YACT,SAASC;AAAA,YACT,SAASzB,IAAuB,UAAU;AAAA,YAC1C,QACG7B,GAAc,UAAUA,EAAa,OAAOsC,IAAQtC,EAAa,OAAO,MAAM,KAC/EwD,EAAalB,IAAQkB,EAAa,MAAM;AAAA,YAE1C,MACGxD,GAAc,UAAUA,EAAa,OAAOsC,IAAQtC,EAAa,OAAO,MAAM,KAC/EwD,EAAalB,IAAQkB,EAAa,MAAM;AAAA,YAE1C,aAAavD,IAAiBA,MAAkBoD,IAAY,MAAM,MAAO;AAAA,YACzE,aAAa;AAAA,YACb,eAAepD,IAAiBA,MAAkBoD,IAAY,IAAI,MAAO;AAAA,YACzE,cAAc3C,EAAkB;AAAA,UAAA;AAAA,UAhB3B2C;AAAA,QAAA;AAAA,MAmBX,CAAC;AAAA,MACAlB,EAAc,SAAS,KACtB,gBAAArB,EAAA2C,GAAA,EAEE,UAAA;AAAA,QAAA,gBAAA5C;AAAA,UAAC6C;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,QAAO;AAAA,YACP,aAAa;AAAA,YACb,KAAK;AAAA,YACL,WAAW;AAAA,YACX,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,gBAAA7C;AAAA,UAAC6C;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAa;AAAA,YACb,iBAAgB;AAAA,YAChB,KAAK;AAAA,YACL,WAAW;AAAA,YACX,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAChB,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF;AAAA,EAEJ,SAASjF,GAAO;AAEd,WACE,gBAAAoC,EAAC,OAAA,EAAI,WAAU,qEAAoE,OAAO,EAAE,QAAAd,EAAA,GAC1F,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,oBAAgB;AAAA,MAC5D,gBAAAA,EAAC,SAAI,WAAU,gBAAgB,uBAAiB,QAAQpC,EAAM,UAAU,0BAAA,CAA0B;AAAA,MAClG,gBAAAoC,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,mCAAA,CAAgC;AAAA,IAAA,EAAA,CAC9E,EAAA,CACF;AAAA,EAEJ;AACF;;;;;"}
|
|
1
|
+
{"version":3,"file":"chart-areachart-B4tknnsY.js","sources":["../../../src/client/utils/targetUtils.ts","../../../src/client/components/charts/AreaChart.tsx"],"sourcesContent":["/**\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}","import { useState } from 'react'\nimport { ComposedChart, Area, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function AreaChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap, getFieldLabel } = useCubeContext()\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"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=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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 labelMap\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"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}>\n {safeDisplayConfig.showGrid && <CartesianGrid strokeDasharray=\"3 3\" />}\n <XAxis dataKey=\"name\" tick={{ fontSize: 12 }} angle={-45} textAnchor=\"end\" 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 return (\n <Area\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fill={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\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 />\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=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Area Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["parseTargetValues","targetString","trimmed","values","val","num","error","spreadTargetValues","targets","dataLength","result","baseGroupSize","remainder","currentIndex","i","groupSize","j","calculateVariance","actual","target","formatVariance","variance","decimals","AreaChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","getFieldLabel","useCubeContext","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","spreadTargets","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","value","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Area","CHART_COLORS","Fragment","Line"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as e, jsxs as c } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo as n } from "react";
|
|
3
|
-
import { f as
|
|
4
|
-
function
|
|
5
|
-
return /* @__PURE__ */ e("h3", { className: `text-sm font-semibold text-dc-primary uppercase tracking-wide ${
|
|
3
|
+
import { f as m } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
4
|
+
function b({ children: a, className: d = "" }) {
|
|
5
|
+
return /* @__PURE__ */ e("h3", { className: `text-sm font-semibold text-dc-primary uppercase tracking-wide ${d}`, children: a });
|
|
6
6
|
}
|
|
7
7
|
function p() {
|
|
8
8
|
const a = typeof navigator < "u" ? navigator.language : "en-US";
|
|
@@ -13,7 +13,7 @@ function p() {
|
|
|
13
13
|
}).format(0).replace(/[\d.,\s]/g, "").trim() || "$";
|
|
14
14
|
}
|
|
15
15
|
function f(a) {
|
|
16
|
-
const
|
|
16
|
+
const o = a.split("-")[1]?.toUpperCase();
|
|
17
17
|
return {
|
|
18
18
|
US: "USD",
|
|
19
19
|
CA: "CAD",
|
|
@@ -57,24 +57,24 @@ function f(a) {
|
|
|
57
57
|
SA: "SAR",
|
|
58
58
|
IL: "ILS",
|
|
59
59
|
TR: "TRY"
|
|
60
|
-
}[
|
|
60
|
+
}[o] || "USD";
|
|
61
61
|
}
|
|
62
62
|
function N({
|
|
63
63
|
value: a,
|
|
64
|
-
onChange:
|
|
65
|
-
axisLabel:
|
|
66
|
-
previewValue:
|
|
64
|
+
onChange: d,
|
|
65
|
+
axisLabel: o,
|
|
66
|
+
previewValue: l = 125e4
|
|
67
67
|
}) {
|
|
68
|
-
const r = a || {}, i = n(() => p(), []), u = n(() =>
|
|
69
|
-
|
|
70
|
-
},
|
|
68
|
+
const r = a || {}, i = n(() => p(), []), u = n(() => m(l, r), [l, r]), s = (t) => {
|
|
69
|
+
d({ ...r, ...t });
|
|
70
|
+
}, x = [
|
|
71
71
|
{ value: "currency", label: i },
|
|
72
72
|
{ value: "percent", label: "%" },
|
|
73
73
|
{ value: "number", label: "#" },
|
|
74
74
|
{ value: "custom", label: "Custom" }
|
|
75
75
|
];
|
|
76
76
|
return /* @__PURE__ */ c("div", { className: "space-y-3 pb-4", children: [
|
|
77
|
-
/* @__PURE__ */ e(
|
|
77
|
+
/* @__PURE__ */ e(b, { children: o }),
|
|
78
78
|
/* @__PURE__ */ c("div", { className: "space-y-1", children: [
|
|
79
79
|
/* @__PURE__ */ e("label", { className: "text-xs text-dc-text-secondary", children: "Label" }),
|
|
80
80
|
/* @__PURE__ */ e(
|
|
@@ -84,13 +84,13 @@ function N({
|
|
|
84
84
|
value: r.label || "",
|
|
85
85
|
onChange: (t) => s({ label: t.target.value || void 0 }),
|
|
86
86
|
placeholder: "Auto-generated label",
|
|
87
|
-
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-
|
|
87
|
+
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
88
88
|
}
|
|
89
89
|
)
|
|
90
90
|
] }),
|
|
91
91
|
/* @__PURE__ */ c("div", { className: "space-y-1", children: [
|
|
92
92
|
/* @__PURE__ */ e("label", { className: "text-xs text-dc-text-secondary", children: "Unit" }),
|
|
93
|
-
/* @__PURE__ */ e("div", { className: "flex border border-dc-border rounded-sm overflow-hidden", children:
|
|
93
|
+
/* @__PURE__ */ e("div", { className: "flex border border-dc-border rounded-sm overflow-hidden", children: x.map((t) => /* @__PURE__ */ e(
|
|
94
94
|
"button",
|
|
95
95
|
{
|
|
96
96
|
type: "button",
|
|
@@ -111,7 +111,7 @@ function N({
|
|
|
111
111
|
value: r.customPrefix || "",
|
|
112
112
|
onChange: (t) => s({ customPrefix: t.target.value || void 0 }),
|
|
113
113
|
placeholder: "e.g., $",
|
|
114
|
-
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-
|
|
114
|
+
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
115
115
|
}
|
|
116
116
|
)
|
|
117
117
|
] }),
|
|
@@ -124,7 +124,7 @@ function N({
|
|
|
124
124
|
value: r.customSuffix || "",
|
|
125
125
|
onChange: (t) => s({ customSuffix: t.target.value || void 0 }),
|
|
126
126
|
placeholder: "e.g., units",
|
|
127
|
-
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-
|
|
127
|
+
className: "w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
|
|
128
128
|
}
|
|
129
129
|
)
|
|
130
130
|
] })
|
|
@@ -191,6 +191,6 @@ function N({
|
|
|
191
191
|
}
|
|
192
192
|
export {
|
|
193
193
|
N as A,
|
|
194
|
-
|
|
194
|
+
b as S
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=chart-axisformatcontrols-
|
|
196
|
+
//# sourceMappingURL=chart-axisformatcontrols-Ch_IYF94.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-axisformatcontrols-Ch_IYF94.js","sources":["../../../src/client/components/AnalysisBuilder/SectionHeading.tsx","../../../src/client/components/charts/AxisFormatControls.tsx"],"sourcesContent":["/**\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={`text-sm font-semibold text-dc-primary uppercase tracking-wide ${className}`}>\n {children}\n </h3>\n )\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 = 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=\"space-y-3 pb-4\">\n {/* Axis Header */}\n <SectionHeading>{axisLabel}</SectionHeading>\n\n {/* Label Input */}\n <div className=\"space-y-1\">\n <label className=\"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=\"w-full px-2 py-1 text-sm border border-dc-border 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=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Unit</label>\n <div className=\"flex border border-dc-border rounded-sm overflow-hidden\">\n {unitButtons.map((btn) => (\n <button\n key={btn.value}\n type=\"button\"\n onClick={() => handleChange({ unit: btn.value })}\n className={`flex-1 px-2 py-1.5 text-sm font-medium 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=\"flex gap-2\">\n <div className=\"flex-1 space-y-1\">\n <label className=\"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=\"w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n <div className=\"flex-1 space-y-1\">\n <label className=\"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=\"w-full px-2 py-1 text-sm border border-dc-border 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=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Abbreviation</label>\n <div className=\"flex border border-dc-border rounded-sm overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: true })}\n className={`flex-1 px-3 py-1.5 text-sm font-medium 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={`flex-1 px-3 py-1.5 text-sm font-medium 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=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Decimals</label>\n <div className=\"flex 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=\"flex-1 px-3 py-2 text-sm border border-dc-border rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border disabled:opacity-40 disabled:cursor-not-allowed 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=\"flex-1 px-3 py-2 text-sm border border-dc-border rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n .00 →\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Preview</label>\n <div className=\"text-sm 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=\"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"],"names":["SectionHeading","children","className","getLocaleCurrencySymbol","locale","getCurrencyCodeForLocale","region","AxisFormatControls","value","onChange","axisLabel","previewValue","config","currencySymbol","useMemo","preview","formatAxisValue","handleChange","updates","unitButtons","jsxs","jsx","e","btn","current"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsx as t, jsxs as o, Fragment as ee } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as te, useMemo as C } from "react";
|
|
3
3
|
import { ComposedChart as se, CartesianGrid as re, XAxis as ie, YAxis as H, Legend as ae, Bar as ne, Cell as le, Line as K } from "recharts";
|
|
4
4
|
import { C as oe } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as ce } from "./chart-charttooltip-
|
|
6
|
-
import { u as de, t as xe, i as me, C as fe, f as S, N as he, P, a as W } from "./chart-activitygridchart-
|
|
7
|
-
import { p as ue, s as ge } from "./chart-areachart-
|
|
5
|
+
import { C as ce } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { u as de, t as xe, i as me, C as fe, f as S, N as he, P, a as W } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
|
+
import { p as ue, s as ge } from "./chart-areachart-B4tknnsY.js";
|
|
8
8
|
function Fe({
|
|
9
9
|
data: x,
|
|
10
10
|
chartConfig: s,
|
|
@@ -46,7 +46,7 @@ function Fe({
|
|
|
46
46
|
/* @__PURE__ */ t("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display in bar chart" })
|
|
47
47
|
] }) });
|
|
48
48
|
if (c)
|
|
49
|
-
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-
|
|
49
|
+
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: h }, children: /* @__PURE__ */ o("div", { className: "text-center", children: [
|
|
50
50
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
51
51
|
/* @__PURE__ */ t("div", { className: "text-xs", children: c })
|
|
52
52
|
] }) });
|
|
@@ -203,7 +203,7 @@ function Fe({
|
|
|
203
203
|
] })
|
|
204
204
|
] });
|
|
205
205
|
} catch (r) {
|
|
206
|
-
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
206
|
+
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: h }, children: /* @__PURE__ */ o("div", { className: "text-center", children: [
|
|
207
207
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Bar Chart Error" }),
|
|
208
208
|
/* @__PURE__ */ t("div", { className: "text-xs mb-2", children: r instanceof Error ? r.message : "Unknown rendering error" }),
|
|
209
209
|
/* @__PURE__ */ t("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -213,4 +213,4 @@ function Fe({
|
|
|
213
213
|
export {
|
|
214
214
|
Fe as default
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=chart-barchart-
|
|
216
|
+
//# sourceMappingURL=chart-barchart-D_op06r-.js.map
|
package/dist/client/chunks/{chart-barchart-CDIpqCKS.js.map → chart-barchart-D_op06r-.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-barchart-CDIpqCKS.js","sources":["../../../src/client/components/charts/BarChart.tsx"],"sourcesContent":["import { useState, useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\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 { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function BarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap, getFieldLabel: contextGetFieldLabel } = useCubeContext()\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 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 // 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 labelMap\n )\n }, [data, xAxisField, yAxisFields, queryObject, seriesFields, labelMap, configError])\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> = useMemo(() => {\n const mapping: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = contextGetFieldLabel(field)\n mapping[label] = field\n })\n return mapping\n }, [yAxisFields, contextGetFieldLabel])\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"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=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"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=\"relative w-full\" style={{ height }}>\n <ChartContainer height={skippedCount > 0 ? `calc(100% - 20px)` : \"100%\"}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\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 || contextGetFieldLabel(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 || contextGetFieldLabel(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 >\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=\"text-xs text-dc-text-muted text-center 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=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["BarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","contextGetFieldLabel","useCubeContext","stackType","shouldStack","isPercentStack","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","xAxisField","yAxisFields","seriesFields","configError","transformedData","seriesKeys","useMemo","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","mapping","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","chartData","skippedCount","filtered","row","key","isValidNumericValue","skipped","jsx","jsxs","effectiveShouldStack","effectiveIsPercentStack","stackOffset","usePositiveNegativeColoring","value","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Bar","POSITIVE_COLOR","CHART_COLORS","entry","entryIndex","fillColor","NEGATIVE_COLOR","Cell","Fragment","Line","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-barchart-D_op06r-.js","sources":["../../../src/client/components/charts/BarChart.tsx"],"sourcesContent":["import { useState, useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\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 { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function BarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap, getFieldLabel: contextGetFieldLabel } = useCubeContext()\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 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 // 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 labelMap\n )\n }, [data, xAxisField, yAxisFields, queryObject, seriesFields, labelMap, configError])\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> = useMemo(() => {\n const mapping: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = contextGetFieldLabel(field)\n mapping[label] = field\n })\n return mapping\n }, [yAxisFields, contextGetFieldLabel])\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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"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=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"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=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"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=\"relative w-full\" style={{ height }}>\n <ChartContainer height={skippedCount > 0 ? `calc(100% - 20px)` : \"100%\"}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\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 || contextGetFieldLabel(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 || contextGetFieldLabel(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 >\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=\"text-xs text-dc-text-muted text-center 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=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["BarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","contextGetFieldLabel","useCubeContext","stackType","shouldStack","isPercentStack","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","xAxisField","yAxisFields","seriesFields","configError","transformedData","seriesKeys","useMemo","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","mapping","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","chartData","skippedCount","filtered","row","key","isValidNumericValue","skipped","jsx","jsxs","effectiveShouldStack","effectiveIsPercentStack","stackOffset","usePositiveNegativeColoring","value","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Bar","POSITIVE_COLOR","CHART_COLORS","entry","entryIndex","fillColor","NEGATIVE_COLOR","Cell","Fragment","Line","error"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as y, jsxs as ee } from "react/jsx-runtime";
|
|
2
2
|
import { useRef as ce, useState as C, useEffect as te, useLayoutEffect as be } from "react";
|
|
3
|
-
import { u as Ae, g as Fe, w as we, s as D, b as Se, c as de, i as ve, p as ue, C as me, l as xe, e as ye, d as ze, m as Te, q as $e, h as fe, o as pe, a as se, j as he, k as ge, f as T } from "./chart-activitygridchart-
|
|
3
|
+
import { u as Ae, g as Fe, w as we, s as D, b as Se, c as de, i as ve, p as ue, C as me, l as xe, e as ye, d as ze, m as Te, q as $e, h as fe, o as pe, a as se, j as he, k as ge, f as T } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
4
4
|
function Re({
|
|
5
5
|
data: $,
|
|
6
6
|
chartConfig: r,
|
|
@@ -202,7 +202,7 @@ function Re({
|
|
|
202
202
|
] }) }) : r?.xAxis && r?.yAxis && r?.series ? /* @__PURE__ */ y("div", { className: "w-full flex-1 flex flex-col relative", style: { height: q, minHeight: "250px", overflow: "hidden" }, children: /* @__PURE__ */ ee("div", { ref: A, className: "w-full h-full relative", children: [
|
|
203
203
|
/* @__PURE__ */ y("svg", { ref: U, className: "w-full h-full" }),
|
|
204
204
|
!k && /* @__PURE__ */ y("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ y("div", { className: "text-dc-text-muted text-sm", children: "Measuring chart dimensions..." }) })
|
|
205
|
-
] }) }) : /* @__PURE__ */ y("div", { className: "flex items-center justify-center w-full text-
|
|
205
|
+
] }) }) : /* @__PURE__ */ y("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: q }, children: /* @__PURE__ */ ee("div", { className: "text-center", children: [
|
|
206
206
|
/* @__PURE__ */ y("div", { className: "text-sm font-semibold mb-1", children: "Configuration Required" }),
|
|
207
207
|
/* @__PURE__ */ y("div", { className: "text-xs", children: "Bubble chart requires xAxis, yAxis, series, and sizeField dimensions" }),
|
|
208
208
|
/* @__PURE__ */ y("div", { className: "text-xs mt-1", children: "Optional: colorField for bubble coloring" })
|
|
@@ -211,4 +211,4 @@ function Re({
|
|
|
211
211
|
export {
|
|
212
212
|
Re as default
|
|
213
213
|
};
|
|
214
|
-
//# sourceMappingURL=chart-bubblechart-
|
|
214
|
+
//# sourceMappingURL=chart-bubblechart-BsaIXUbS.js.map
|