drizzle-cube 0.1.69 → 0.2.0

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.
Files changed (104) hide show
  1. package/dist/adapters/{compiler-CghsDLXl.cjs → compiler-DP1pPIcg.cjs} +9 -9
  2. package/dist/adapters/{compiler-BnHK-nxh.js → compiler-gcKytLwd.js} +12 -13
  3. package/dist/adapters/express/index.cjs +1 -1
  4. package/dist/adapters/express/index.js +1 -1
  5. package/dist/adapters/fastify/index.cjs +1 -1
  6. package/dist/adapters/fastify/index.js +1 -1
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +1 -1
  9. package/dist/adapters/nextjs/index.cjs +1 -1
  10. package/dist/adapters/nextjs/index.js +1 -1
  11. package/dist/client/charts/ChartLoader.d.ts +56 -0
  12. package/dist/client/charts/lazyChartConfigRegistry.d.ts +90 -0
  13. package/dist/client/charts.d.ts +6 -0
  14. package/dist/client/charts.js +38 -15
  15. package/dist/client/charts.js.map +1 -1
  16. package/dist/client/chunks/chart-activitygridchart-BRk9BNnp.js +3713 -0
  17. package/dist/client/chunks/chart-activitygridchart-BRk9BNnp.js.map +1 -0
  18. package/dist/client/chunks/chart-activitygridchart-config-D9CgNH02.js +51 -0
  19. package/dist/client/chunks/chart-activitygridchart-config-D9CgNH02.js.map +1 -0
  20. package/dist/client/chunks/chart-areachart-Beu8sO9v.js +204 -0
  21. package/dist/client/chunks/chart-areachart-Beu8sO9v.js.map +1 -0
  22. package/dist/client/chunks/chart-areachart-config-InZgxubz.js +66 -0
  23. package/dist/client/chunks/chart-areachart-config-InZgxubz.js.map +1 -0
  24. package/dist/client/chunks/chart-barchart-BzoejYkT.js +177 -0
  25. package/dist/client/chunks/chart-barchart-BzoejYkT.js.map +1 -0
  26. package/dist/client/chunks/chart-barchart-config-DxatOnVV.js +59 -0
  27. package/dist/client/chunks/chart-barchart-config-DxatOnVV.js.map +1 -0
  28. package/dist/client/chunks/chart-bubblechart-Dg7sT_Mm.js +210 -0
  29. package/dist/client/chunks/chart-bubblechart-Dg7sT_Mm.js.map +1 -0
  30. package/dist/client/chunks/chart-bubblechart-config-CcZTMTCx.js +59 -0
  31. package/dist/client/chunks/chart-bubblechart-config-CcZTMTCx.js.map +1 -0
  32. package/dist/client/chunks/chart-chartcontainer-CdwzIKP1.js +103 -0
  33. package/dist/client/chunks/chart-chartcontainer-CdwzIKP1.js.map +1 -0
  34. package/dist/client/chunks/chart-charttooltip-NrFVM1cJ.js +26 -0
  35. package/dist/client/chunks/chart-charttooltip-NrFVM1cJ.js.map +1 -0
  36. package/dist/client/chunks/chart-datatable-BvV7gLPZ.js +57 -0
  37. package/dist/client/chunks/chart-datatable-BvV7gLPZ.js.map +1 -0
  38. package/dist/client/chunks/chart-datatable-config-D7mojhYA.js +22 -0
  39. package/dist/client/chunks/chart-datatable-config-D7mojhYA.js.map +1 -0
  40. package/dist/client/chunks/chart-kpidelta-config-icJXuFxe.js +99 -0
  41. package/dist/client/chunks/chart-kpidelta-config-icJXuFxe.js.map +1 -0
  42. package/dist/client/chunks/chart-kpidelta-p1lVVG5v.js +434 -0
  43. package/dist/client/chunks/chart-kpidelta-p1lVVG5v.js.map +1 -0
  44. package/dist/client/chunks/chart-kpinumber-BFtxFeqq.js +398 -0
  45. package/dist/client/chunks/chart-kpinumber-BFtxFeqq.js.map +1 -0
  46. package/dist/client/chunks/chart-kpinumber-config-T39g03ud.js +77 -0
  47. package/dist/client/chunks/chart-kpinumber-config-T39g03ud.js.map +1 -0
  48. package/dist/client/chunks/chart-kpitext-CX1s1u8B.js +165 -0
  49. package/dist/client/chunks/chart-kpitext-CX1s1u8B.js.map +1 -0
  50. package/dist/client/chunks/chart-kpitext-config-BbJGXAVk.js +49 -0
  51. package/dist/client/chunks/chart-kpitext-config-BbJGXAVk.js.map +1 -0
  52. package/dist/client/chunks/chart-linechart-Dgb10zbj.js +155 -0
  53. package/dist/client/chunks/chart-linechart-Dgb10zbj.js.map +1 -0
  54. package/dist/client/chunks/chart-linechart-config-BS1qVC8K.js +54 -0
  55. package/dist/client/chunks/chart-linechart-config-BS1qVC8K.js.map +1 -0
  56. package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js +254 -0
  57. package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js.map +1 -0
  58. package/dist/client/chunks/chart-markdownchart-config-DMCD8phf.js +62 -0
  59. package/dist/client/chunks/chart-markdownchart-config-DMCD8phf.js.map +1 -0
  60. package/dist/client/chunks/chart-piechart-B-0BQh-d.js +121 -0
  61. package/dist/client/chunks/chart-piechart-B-0BQh-d.js.map +1 -0
  62. package/dist/client/chunks/chart-piechart-config-6ZK8XaSX.js +32 -0
  63. package/dist/client/chunks/chart-piechart-config-6ZK8XaSX.js.map +1 -0
  64. package/dist/client/chunks/chart-radarchart-BwZM1yTd.js +124 -0
  65. package/dist/client/chunks/chart-radarchart-BwZM1yTd.js.map +1 -0
  66. package/dist/client/chunks/chart-radarchart-config-CCWOkkwO.js +38 -0
  67. package/dist/client/chunks/chart-radarchart-config-CCWOkkwO.js.map +1 -0
  68. package/dist/client/chunks/chart-radialbarchart-CythI1zx.js +109 -0
  69. package/dist/client/chunks/chart-radialbarchart-CythI1zx.js.map +1 -0
  70. package/dist/client/chunks/chart-radialbarchart-config-DicXYrMW.js +31 -0
  71. package/dist/client/chunks/chart-radialbarchart-config-DicXYrMW.js.map +1 -0
  72. package/dist/client/chunks/chart-scatterchart-config-DgYa-5vm.js +41 -0
  73. package/dist/client/chunks/chart-scatterchart-config-DgYa-5vm.js.map +1 -0
  74. package/dist/client/chunks/chart-scatterchart-om9-qmtE.js +201 -0
  75. package/dist/client/chunks/chart-scatterchart-om9-qmtE.js.map +1 -0
  76. package/dist/client/chunks/chart-treemapchart-Dc35Miif.js +253 -0
  77. package/dist/client/chunks/chart-treemapchart-Dc35Miif.js.map +1 -0
  78. package/dist/client/chunks/chart-treemapchart-config-DGhteyBe.js +40 -0
  79. package/dist/client/chunks/chart-treemapchart-config-DGhteyBe.js.map +1 -0
  80. package/dist/client/chunks/charts-DL9XOlaK.js +286 -0
  81. package/dist/client/chunks/charts-DL9XOlaK.js.map +1 -0
  82. package/dist/client/chunks/{icons-BWMWCuY7.js → icons-D-n_woAP.js} +614 -614
  83. package/dist/client/chunks/icons-D-n_woAP.js.map +1 -0
  84. package/dist/client/chunks/index-DpEuGmcW.js +8707 -0
  85. package/dist/client/chunks/index-DpEuGmcW.js.map +1 -0
  86. package/dist/client/components.js +11 -11
  87. package/dist/client/hooks.js +3 -3
  88. package/dist/client/index.d.ts +18 -1
  89. package/dist/client/index.js +9135 -39
  90. package/dist/client/index.js.map +1 -1
  91. package/dist/client/providers.js +4 -4
  92. package/dist/client/styles.css +1 -1
  93. package/dist/client-bundle-stats.html +1 -1
  94. package/dist/server/index.cjs +16 -16
  95. package/dist/server/index.d.ts +0 -286
  96. package/dist/server/index.js +767 -881
  97. package/package.json +7 -2
  98. package/dist/client/chunks/charts-jwgcWeFt.js +0 -2580
  99. package/dist/client/chunks/charts-jwgcWeFt.js.map +0 -1
  100. package/dist/client/chunks/components-DALzorPs.js +0 -22432
  101. package/dist/client/chunks/components-DALzorPs.js.map +0 -1
  102. package/dist/client/chunks/icons-BWMWCuY7.js.map +0 -1
  103. package/dist/client/chunks/providers-D7zRgZrO.js +0 -308
  104. package/dist/client/chunks/providers-D7zRgZrO.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { I as r, d as s } from "./icons-D-n_woAP.js";
3
+ const d = {
4
+ icon: ({ className: e }) => /* @__PURE__ */ a(r, { icon: s, className: e }),
5
+ description: "GitHub-style activity grid showing temporal patterns across different time scales",
6
+ useCase: "Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities",
7
+ dropZones: [
8
+ {
9
+ key: "dateField",
10
+ label: "Time Dimension",
11
+ description: "Time field that determines grid structure (granularity affects layout)",
12
+ mandatory: !0,
13
+ maxItems: 1,
14
+ acceptTypes: ["timeDimension"],
15
+ emptyText: "Drop a time dimension (granularity affects grid structure)"
16
+ },
17
+ {
18
+ key: "valueField",
19
+ label: "Activity Measure",
20
+ description: "Measure used for activity intensity (color coding)",
21
+ mandatory: !0,
22
+ maxItems: 1,
23
+ acceptTypes: ["measure"],
24
+ emptyText: "Drop a measure for activity intensity"
25
+ }
26
+ ],
27
+ displayOptions: ["showLabels", "showTooltip", "hideHeader"],
28
+ displayOptionsConfig: [
29
+ {
30
+ key: "fitToWidth",
31
+ label: "Fit to Width",
32
+ type: "boolean",
33
+ defaultValue: !1,
34
+ description: "Automatically size blocks to fill portlet width and height while maintaining aspect ratio"
35
+ }
36
+ ],
37
+ validate: (e) => {
38
+ const { dateField: i, valueField: t } = e;
39
+ return !i || Array.isArray(i) && i.length === 0 ? {
40
+ isValid: !1,
41
+ message: "Time dimension is required for activity grid"
42
+ } : !t || Array.isArray(t) && t.length === 0 ? {
43
+ isValid: !1,
44
+ message: "Activity measure is required for intensity mapping"
45
+ } : { isValid: !0 };
46
+ }
47
+ };
48
+ export {
49
+ d as activityGridChartConfig
50
+ };
51
+ //# sourceMappingURL=chart-activitygridchart-config-D9CgNH02.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-activitygridchart-config-D9CgNH02.js","sources":["../../../src/client/components/charts/ActivityGridChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport calendarIcon from '@iconify-icons/tabler/calendar-stats'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={calendarIcon} className={className} />,\n description: 'GitHub-style activity grid showing temporal patterns across different time scales',\n useCase: 'Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'fitToWidth',\n label: 'Fit to Width',\n type: 'boolean',\n defaultValue: false,\n description: 'Automatically size blocks to fill portlet width and height while maintaining aspect ratio'\n }\n ],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["activityGridChartConfig","className","jsx","Icon","calendarIcon","config","dateField","valueField"],"mappings":";;AAOO,MAAMA,IAA2C;AAAA,EACtD,MAAM,CAAC,EAAE,WAAAC,EAAA,MAAgB,gBAAAC,EAACC,GAAA,EAAK,MAAMC,GAAc,WAAAH,GAAsB;AAAA,EACzE,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,eAAe;AAAA,MAC7B,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,eAAe,YAAY;AAAA,EAC1D,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,UAAU,CAACI,MAAW;AACpB,UAAM,EAAE,WAAAC,GAAW,YAAAC,EAAA,IAAeF;AAElC,WAAI,CAACC,KAAc,MAAM,QAAQA,CAAS,KAAKA,EAAU,WAAW,IAC3D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIT,CAACC,KAAe,MAAM,QAAQA,CAAU,KAAKA,EAAW,WAAW,IAC9D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIN,EAAE,SAAS,GAAA;AAAA,EACpB;AACF;"}
@@ -0,0 +1,204 @@
1
+ import { jsx as t, jsxs as d, Fragment as D } from "react/jsx-runtime";
2
+ import { useState as L } from "react";
3
+ import { ComposedChart as M, CartesianGrid as O, XAxis as V, YAxis as E, Legend as G, Area as $, Line as b } from "recharts";
4
+ import { C as I } from "./chart-chartcontainer-CdwzIKP1.js";
5
+ import { C } from "./chart-charttooltip-NrFVM1cJ.js";
6
+ import { u as R, t as W, C as H, f as g, a as N } from "./chart-activitygridchart-BRk9BNnp.js";
7
+ function K(r) {
8
+ if (!r || typeof r != "string")
9
+ return [];
10
+ const e = r.trim();
11
+ if (!e)
12
+ return [];
13
+ try {
14
+ const n = e.split(",").map((l) => l.trim()).filter((l) => l !== "").map((l) => {
15
+ const a = parseFloat(l);
16
+ if (isNaN(a))
17
+ throw new Error(`Invalid numeric value: ${l}`);
18
+ return a;
19
+ });
20
+ return n.length > 0 ? n : [];
21
+ } catch (n) {
22
+ return console.warn("Failed to parse target values:", n), [];
23
+ }
24
+ }
25
+ function X(r, e) {
26
+ if (r.length === 0 || e <= 0)
27
+ return [];
28
+ if (r.length === 1)
29
+ return new Array(e).fill(r[0]);
30
+ const n = [], l = Math.floor(e / r.length), a = e % r.length;
31
+ let c = 0;
32
+ for (let i = 0; i < r.length; i++) {
33
+ const h = l + (i < a ? 1 : 0);
34
+ for (let y = 0; y < h; y++)
35
+ n[c++] = r[i];
36
+ }
37
+ return n;
38
+ }
39
+ function ee(r, e) {
40
+ return e === 0 ? r === 0 ? 0 : r > 0 ? 100 : -100 : (r - e) / e * 100;
41
+ }
42
+ function te(r, e = 1) {
43
+ return `${r >= 0 ? "+" : ""}${r.toFixed(e)}%`;
44
+ }
45
+ function Y({
46
+ data: r,
47
+ chartConfig: e,
48
+ displayConfig: n = {},
49
+ queryObject: l,
50
+ height: a = "100%",
51
+ colorPalette: c
52
+ }) {
53
+ const [i, h] = L(null), { labelMap: y, getFieldLabel: T } = R();
54
+ try {
55
+ const u = n?.stackType ?? (n?.stacked ? "normal" : "none"), S = u !== "none", f = u === "percent", p = {
56
+ showLegend: n?.showLegend ?? !0,
57
+ showGrid: n?.showGrid ?? !0,
58
+ showTooltip: n?.showTooltip ?? !0,
59
+ connectNulls: n?.connectNulls ?? !1
60
+ };
61
+ if (!r || r.length === 0)
62
+ return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: a }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
63
+ /* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
64
+ /* @__PURE__ */ t("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display in area chart" })
65
+ ] }) });
66
+ let v, m, k = [];
67
+ if (e?.xAxis && e?.yAxis)
68
+ v = Array.isArray(e.xAxis) ? e.xAxis[0] : e.xAxis, m = Array.isArray(e.yAxis) ? e.yAxis : [e.yAxis], k = e.series || [];
69
+ else if (e?.x && e?.y)
70
+ v = e.x, m = Array.isArray(e.y) ? e.y : [e.y];
71
+ else
72
+ return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: a }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
73
+ /* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
74
+ /* @__PURE__ */ t("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
75
+ ] }) });
76
+ if (!v || !m || m.length === 0)
77
+ return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: a }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
78
+ /* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
79
+ /* @__PURE__ */ t("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
80
+ ] }) });
81
+ const { data: x, seriesKeys: F } = W(
82
+ r,
83
+ v,
84
+ m,
85
+ l,
86
+ k,
87
+ y
88
+ ), _ = p.showLegend, j = {
89
+ ...H,
90
+ left: 40
91
+ // Increased from 20 to 40 for Y-axis label space
92
+ }, z = K(n?.target || ""), A = X(z, x.length);
93
+ let w = x;
94
+ return A.length > 0 && (w = x.map((s, o) => ({
95
+ ...s,
96
+ __target: A[o] || null
97
+ }))), !x || x.length === 0 ? /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: a }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
98
+ /* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "No valid data" }),
99
+ /* @__PURE__ */ t("div", { className: "text-xs text-dc-text-secondary", children: "No valid data points for area chart after transformation" })
100
+ ] }) }) : /* @__PURE__ */ t(I, { height: a, children: /* @__PURE__ */ d(M, { data: w, margin: j, stackOffset: f ? "expand" : void 0, children: [
101
+ p.showGrid && /* @__PURE__ */ t(O, { strokeDasharray: "3 3" }),
102
+ /* @__PURE__ */ t(
103
+ V,
104
+ {
105
+ dataKey: "name",
106
+ tick: { fontSize: 12 },
107
+ angle: -45,
108
+ textAnchor: "end",
109
+ height: 60
110
+ }
111
+ ),
112
+ /* @__PURE__ */ t(
113
+ E,
114
+ {
115
+ tick: { fontSize: 12 },
116
+ tickFormatter: f ? (s) => `${(s * 100).toFixed(0)}%` : void 0,
117
+ domain: f ? [0, 1] : void 0,
118
+ label: f ? void 0 : { value: T(m[0]), angle: -90, position: "left", style: { textAnchor: "middle", fontSize: "12px" } }
119
+ }
120
+ ),
121
+ p.showTooltip && /* @__PURE__ */ t(
122
+ C,
123
+ {
124
+ formatter: (s, o) => s == null ? ["No data", o] : o === "Target" ? [g(s), "Target Value"] : f && typeof s == "number" ? [`${(s * 100).toFixed(1)}%`, o] : [g(s), o]
125
+ }
126
+ ),
127
+ _ && /* @__PURE__ */ t(
128
+ G,
129
+ {
130
+ wrapperStyle: { fontSize: "12px", paddingTop: "10px" },
131
+ iconType: "rect",
132
+ iconSize: 8,
133
+ layout: "horizontal",
134
+ align: "center",
135
+ verticalAlign: "bottom",
136
+ onMouseEnter: (s) => h(String(s.dataKey || "")),
137
+ onMouseLeave: () => h(null)
138
+ }
139
+ ),
140
+ F.map((s, o) => /* @__PURE__ */ t(
141
+ $,
142
+ {
143
+ type: "monotone",
144
+ dataKey: s,
145
+ stackId: S ? "stack" : void 0,
146
+ stroke: c?.colors && c.colors[o % c.colors.length] || N[o % N.length],
147
+ fill: c?.colors && c.colors[o % c.colors.length] || N[o % N.length],
148
+ fillOpacity: i ? i === s ? 0.6 : 0.1 : 0.3,
149
+ strokeWidth: 2,
150
+ strokeOpacity: i ? i === s ? 1 : 0.3 : 1,
151
+ connectNulls: p.connectNulls
152
+ },
153
+ s
154
+ )),
155
+ A.length > 0 && /* @__PURE__ */ d(D, { children: [
156
+ /* @__PURE__ */ t(
157
+ b,
158
+ {
159
+ type: "monotone",
160
+ dataKey: "__target",
161
+ stroke: "#ffffff",
162
+ strokeWidth: 2,
163
+ dot: !1,
164
+ activeDot: !1,
165
+ connectNulls: !1
166
+ }
167
+ ),
168
+ /* @__PURE__ */ t(
169
+ b,
170
+ {
171
+ type: "monotone",
172
+ dataKey: "__target",
173
+ name: "Target",
174
+ stroke: "#8B5CF6",
175
+ strokeWidth: 2,
176
+ strokeDasharray: "2 3",
177
+ dot: !1,
178
+ activeDot: !1,
179
+ connectNulls: !1
180
+ }
181
+ )
182
+ ] })
183
+ ] }) });
184
+ } catch (u) {
185
+ return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-red-500 p-4", style: { height: a }, children: /* @__PURE__ */ d("div", { className: "text-center", children: [
186
+ /* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Area Chart Error" }),
187
+ /* @__PURE__ */ t("div", { className: "text-xs mb-2", children: u instanceof Error ? u.message : "Unknown rendering error" }),
188
+ /* @__PURE__ */ t("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
189
+ ] }) });
190
+ }
191
+ }
192
+ const re = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
193
+ __proto__: null,
194
+ default: Y
195
+ }, Symbol.toStringTag, { value: "Module" }));
196
+ export {
197
+ Y as A,
198
+ re as a,
199
+ ee as c,
200
+ te as f,
201
+ K as p,
202
+ X as s
203
+ };
204
+ //# sourceMappingURL=chart-areachart-Beu8sO9v.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-areachart-Beu8sO9v.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, formatNumericValue } 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 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 // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n \n // Use custom chart margins with extra left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\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 = isPercentStack ? 'expand' as const : undefined\n\n return (\n <ChartContainer height={height}>\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 tick={{ fontSize: 12 }}\n tickFormatter={isPercentStack ? (v) => `${(v * 100).toFixed(0)}%` : undefined}\n domain={isPercentStack ? [0, 1] : undefined}\n label={isPercentStack ? undefined : { value: getFieldLabel(yAxisFields[0]), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\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 return [formatNumericValue(value), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (isPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n return [formatNumericValue(value), 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 <Area\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n stackId={shouldStack ? \"stack\" : undefined}\n stroke={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\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 {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\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 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","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","jsx","jsxs","xAxisField","yAxisFields","seriesFields","chartData","seriesKeys","transformChartDataWithSeries","showLegend","chartMargins","CHART_MARGINS","targetValues","spreadTargets","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","ChartTooltip","value","name","formatNumericValue","Legend","o","seriesKey","Area","CHART_COLORS","Fragment","Line"],"mappings":";;;;;;AASO,SAASA,EAAkBC,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,EAAmBC,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,WAAS,IAAI,GAAG,IAAIL,EAAQ,QAAQ,KAAK;AAGvC,UAAMM,IAAYH,KAAiB,IAAIC,IAAY,IAAI;AAGvD,aAASG,IAAI,GAAGA,IAAID,GAAWC;AAC7B,MAAAL,EAAOG,GAAc,IAAIL,EAAQ,CAAC;AAAA,EAEtC;AAEA,SAAOE;AACT;AAQO,SAASM,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,EAAU;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;AAG/C,QAAI,CAACF,KAAQA,EAAK,WAAW;AAC3B,aACE,gBAAAgB,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAZ,EAAA,GACnF,UAAA,gBAAAa,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,QAAInB,GAAa,SAASA,GAAa;AAErC,MAAAiB,IAAa,MAAM,QAAQjB,EAAY,KAAK,IAAIA,EAAY,MAAM,CAAC,IAAIA,EAAY,OACnFkB,IAAc,MAAM,QAAQlB,EAAY,KAAK,IAAIA,EAAY,QAAQ,CAACA,EAAY,KAAK,GACvFmB,IAAenB,EAAY,UAAU,CAAA;AAAA,aAC5BA,GAAa,KAAKA,GAAa;AAExC,MAAAiB,IAAajB,EAAY,GACzBkB,IAAc,MAAM,QAAQlB,EAAY,CAAC,IAAIA,EAAY,IAAI,CAACA,EAAY,CAAC;AAAA;AAE3E,aACE,gBAAAe,EAAC,OAAA,EAAI,WAAU,2DAA0D,OAAO,EAAE,QAAAZ,EAAA,GAChF,UAAA,gBAAAa,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,QAAAZ,EAAA,GAChF,UAAA,gBAAAa,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,MACtCvB;AAAA,MACAkB;AAAA,MACAC;AAAA,MACAhB;AAAA,MACAiB;AAAA,MACAX;AAAA,IAAA,GAIIe,IAAaT,EAAkB,YAG/BU,IAAe;AAAA,MACnB,GAAGC;AAAA,MACH,MAAM;AAAA;AAAA,IAAA,GAIFC,IAAelD,EAAkByB,GAAe,UAAU,EAAE,GAC5D0B,IAAgB5C,EAAmB2C,GAAcN,EAAU,MAAM;AAGvE,QAAIQ,IAAoBR;AASxB,WARIO,EAAc,SAAS,MACzBC,IAAoBR,EAAU,IAAI,CAACS,GAAWC,OAAW;AAAA,MACvD,GAAGD;AAAA,MACH,UAAUF,EAAcG,CAAK,KAAK;AAAA,IAAA,EAClC,IAIA,CAACV,KAAaA,EAAU,WAAW,IAEnC,gBAAAL,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAZ,EAAA,GACnF,UAAA,gBAAAa,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,EAACgB,KAAe,QAAA5B,GACd,UAAA,gBAAAa,EAACgB,KAAc,MAAMJ,GAAmB,QAAQJ,GAAc,aAJ9CX,IAAiB,WAAoB,QAKlD,UAAA;AAAA,MAAAC,EAAkB,YACjB,gBAAAC,EAACkB,GAAA,EAAc,iBAAgB,OAAM;AAAA,MAEvC,gBAAAlB;AAAA,QAACmB;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAM,EAAE,UAAU,GAAA;AAAA,UAClB,OAAO;AAAA,UACP,YAAW;AAAA,UACX,QAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEV,gBAAAnB;AAAA,QAACoB;AAAA,QAAA;AAAA,UACC,MAAM,EAAE,UAAU,GAAA;AAAA,UAClB,eAAetB,IAAiB,CAACuB,MAAM,IAAIA,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM;AAAA,UACpE,QAAQvB,IAAiB,CAAC,GAAG,CAAC,IAAI;AAAA,UAClC,OAAOA,IAAiB,SAAY,EAAE,OAAOJ,EAAcS,EAAY,CAAC,CAAC,GAAG,OAAO,KAAK,UAAU,QAAQ,OAAO,EAAE,YAAY,UAAU,UAAU,SAAO;AAAA,QAAE;AAAA,MAAA;AAAA,MAE7JJ,EAAkB,eACjB,gBAAAC;AAAA,QAACsB;AAAA,QAAA;AAAA,UACC,WAAW,CAACC,GAAYC,MAElBD,KAAU,OACL,CAAC,WAAWC,CAAI,IAErBA,MAAS,WACJ,CAACC,EAAmBF,CAAK,GAAG,cAAc,IAG/CzB,KAAkB,OAAOyB,KAAU,WAC9B,CAAC,IAAIA,IAAQ,KAAK,QAAQ,CAAC,CAAC,KAAKC,CAAI,IAEvC,CAACC,EAAmBF,CAAK,GAAGC,CAAI;AAAA,QACzC;AAAA,MAAA;AAAA,MAGHhB,KACC,gBAAAR;AAAA,QAAC0B;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,MAAMpC,EAAiB,OAAOoC,EAAE,WAAW,EAAE,CAAC;AAAA,UAC7D,cAAc,MAAMpC,EAAiB,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAG5Ce,EAAW,IAAI,CAACsB,GAAWb,MAC1B,gBAAAf;AAAA,QAAC6B;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAASD;AAAA,UACT,SAAS/B,IAAc,UAAU;AAAA,UACjC,QAASR,GAAc,UAAUA,EAAa,OAAO0B,IAAQ1B,EAAa,OAAO,MAAM,KAAMyC,EAAaf,IAAQe,EAAa,MAAM;AAAA,UACrI,MAAOzC,GAAc,UAAUA,EAAa,OAAO0B,IAAQ1B,EAAa,OAAO,MAAM,KAAMyC,EAAaf,IAAQe,EAAa,MAAM;AAAA,UACnI,aAAaxC,IAAiBA,MAAkBsC,IAAY,MAAM,MAAO;AAAA,UACzE,aAAa;AAAA,UACb,eAAetC,IAAiBA,MAAkBsC,IAAY,IAAI,MAAO;AAAA,UACzE,cAAc7B,EAAkB;AAAA,QAAA;AAAA,QAT3B6B;AAAA,MAAA,CAWR;AAAA,MACAhB,EAAc,SAAS,KACtB,gBAAAX,EAAA8B,GAAA,EAEE,UAAA;AAAA,QAAA,gBAAA/B;AAAA,UAACgC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,QAAO;AAAA,YACP,aAAa;AAAA,YACb,KAAK;AAAA,YACL,WAAW;AAAA,YACX,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,gBAAAhC;AAAA,UAACgC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,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,SAASjE,GAAO;AAEd,WACE,gBAAAiC,EAAC,OAAA,EAAI,WAAU,qEAAoE,OAAO,EAAE,QAAAZ,EAAA,GAC1F,UAAA,gBAAAa,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,oBAAgB;AAAA,MAC5D,gBAAAA,EAAC,SAAI,WAAU,gBAAgB,uBAAiB,QAAQjC,EAAM,UAAU,0BAAA,CAA0B;AAAA,MAClG,gBAAAiC,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,mCAAA,CAAgC;AAAA,IAAA,EAAA,CAC9E,EAAA,CACF;AAAA,EAEJ;AACF;;;;;"}
@@ -0,0 +1,66 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import { I as a, a as o } from "./icons-D-n_woAP.js";
3
+ const r = {
4
+ icon: ({ className: e }) => /* @__PURE__ */ s(a, { icon: o, className: e }),
5
+ description: "Emphasize magnitude of change over time",
6
+ useCase: "Best for showing cumulative totals, volume changes, or stacked comparisons over time",
7
+ dropZones: [
8
+ {
9
+ key: "xAxis",
10
+ label: "X-Axis (Time/Categories)",
11
+ description: "Time dimensions or dimensions for X-axis",
12
+ mandatory: !0,
13
+ acceptTypes: ["dimension", "timeDimension"],
14
+ emptyText: "Drop time dimensions or dimensions here"
15
+ },
16
+ {
17
+ key: "yAxis",
18
+ label: "Y-Axis (Values)",
19
+ description: "Measures for area values",
20
+ mandatory: !0,
21
+ acceptTypes: ["measure"],
22
+ emptyText: "Drop measures here"
23
+ },
24
+ {
25
+ key: "series",
26
+ label: "Series (Stack Areas)",
27
+ description: "Dimensions to create stacked areas",
28
+ mandatory: !1,
29
+ acceptTypes: ["dimension"],
30
+ emptyText: "Drop dimensions here for stacked areas"
31
+ }
32
+ ],
33
+ displayOptions: ["showLegend", "showGrid", "showTooltip", "hideHeader"],
34
+ displayOptionsConfig: [
35
+ {
36
+ key: "stackType",
37
+ label: "Stacking",
38
+ type: "select",
39
+ defaultValue: "none",
40
+ options: [
41
+ { value: "none", label: "None" },
42
+ { value: "normal", label: "Stacked" },
43
+ { value: "percent", label: "Stacked 100%" }
44
+ ],
45
+ description: "How to stack multiple area series"
46
+ },
47
+ {
48
+ key: "connectNulls",
49
+ label: "Connect Nulls",
50
+ type: "boolean",
51
+ defaultValue: !1,
52
+ description: "Draw continuous line through missing data points"
53
+ },
54
+ {
55
+ key: "target",
56
+ label: "Target Values",
57
+ type: "string",
58
+ placeholder: "e.g., 100 or 50,75 for spread",
59
+ description: "Single value or comma-separated values to spread across X-axis"
60
+ }
61
+ ]
62
+ };
63
+ export {
64
+ r as areaChartConfig
65
+ };
66
+ //# sourceMappingURL=chart-areachart-config-InZgxubz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-areachart-config-InZgxubz.js","sources":["../../../src/client/components/charts/AreaChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartAreaLineIcon from '@iconify-icons/tabler/chart-area-line'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartAreaLineIcon} className={className} />,\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple area series'\n },\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n }\n ]\n}"],"names":["areaChartConfig","className","jsx","Icon","chartAreaLineIcon"],"mappings":";;AAOO,MAAMA,IAAmC;AAAA,EAC9C,MAAM,CAAC,EAAE,WAAAC,EAAA,MAAgB,gBAAAC,EAACC,GAAA,EAAK,MAAMC,GAAmB,WAAAH,GAAsB;AAAA,EAC9E,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -0,0 +1,177 @@
1
+ import { jsx as e, jsxs as a, Fragment as R } from "react/jsx-runtime";
2
+ import { useState as B, useMemo as H } from "react";
3
+ import { ComposedChart as W, CartesianGrid as $, XAxis as K, YAxis as P, Legend as X, Bar as Y, Cell as q, Line as S } from "recharts";
4
+ import { C as U } from "./chart-chartcontainer-CdwzIKP1.js";
5
+ import { C as J } from "./chart-charttooltip-NrFVM1cJ.js";
6
+ import { u as Q, t as Z, i as ee, C as te, f as C, N as se, P as D, a as F } from "./chart-activitygridchart-BRk9BNnp.js";
7
+ import { p as re, s as ae } from "./chart-areachart-Beu8sO9v.js";
8
+ function xe({
9
+ data: h,
10
+ chartConfig: s,
11
+ displayConfig: i = {},
12
+ queryObject: O,
13
+ height: n = "100%",
14
+ colorPalette: p
15
+ }) {
16
+ const [x, b] = B(null), { labelMap: _, getFieldLabel: V } = Q();
17
+ try {
18
+ const d = i?.stackType ?? (i?.stacked ? "normal" : "none"), E = d !== "none", c = d === "percent", y = {
19
+ showLegend: i?.showLegend ?? !0,
20
+ showGrid: i?.showGrid ?? !0,
21
+ showTooltip: i?.showTooltip ?? !0
22
+ };
23
+ if (!h || h.length === 0)
24
+ return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: n }, children: /* @__PURE__ */ a("div", { className: "text-center", children: [
25
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
26
+ /* @__PURE__ */ e("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display in bar chart" })
27
+ ] }) });
28
+ let f, o, k = [];
29
+ if (s?.xAxis && s?.yAxis)
30
+ f = Array.isArray(s.xAxis) ? s.xAxis[0] : s.xAxis, o = Array.isArray(s.yAxis) ? s.yAxis : [s.yAxis], k = s.series || [];
31
+ else if (s?.x && s?.y)
32
+ f = s.x, o = Array.isArray(s.y) ? s.y : [s.y];
33
+ else
34
+ return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: n }, children: /* @__PURE__ */ a("div", { className: "text-center", children: [
35
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
36
+ /* @__PURE__ */ e("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
37
+ ] }) });
38
+ if (!f || !o || o.length === 0)
39
+ return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: n }, children: /* @__PURE__ */ a("div", { className: "text-center", children: [
40
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
41
+ /* @__PURE__ */ e("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
42
+ ] }) });
43
+ const { data: v, seriesKeys: m } = Z(
44
+ h,
45
+ f,
46
+ o,
47
+ O,
48
+ k,
49
+ _
50
+ ), { chartData: l, skippedCount: u } = H(() => {
51
+ const t = v.filter((g) => m.some((A) => ee(g[A]))), r = v.length - t.length;
52
+ return { chartData: t, skippedCount: r };
53
+ }, [v, m]), j = c ? "expand" : void 0, w = m.length === 1 && l.some((t) => {
54
+ const r = t[m[0]];
55
+ return typeof r == "number" && r < 0;
56
+ }), G = y.showLegend, M = {
57
+ ...te,
58
+ left: 40
59
+ // Increased from 20 to 40 for Y-axis label space
60
+ }, z = re(i?.target || ""), N = ae(z, l.length);
61
+ let T = l;
62
+ return N.length > 0 && (T = l.map((t, r) => ({
63
+ ...t,
64
+ __target: N[r] || null
65
+ }))), !l || l.length === 0 ? /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: n }, children: /* @__PURE__ */ a("div", { className: "text-center", children: [
66
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "No valid data" }),
67
+ /* @__PURE__ */ e("div", { className: "text-xs text-dc-text-secondary", children: "No valid data points for bar chart after transformation" })
68
+ ] }) }) : /* @__PURE__ */ a("div", { className: "relative w-full", style: { height: n }, children: [
69
+ /* @__PURE__ */ e(U, { height: u > 0 ? "calc(100% - 20px)" : "100%", children: /* @__PURE__ */ a(W, { data: T, margin: M, stackOffset: j, children: [
70
+ y.showGrid && /* @__PURE__ */ e($, { strokeDasharray: "3 3" }),
71
+ /* @__PURE__ */ e(
72
+ K,
73
+ {
74
+ dataKey: "name",
75
+ tick: { fontSize: 12 },
76
+ angle: -45,
77
+ textAnchor: "end",
78
+ height: 60
79
+ }
80
+ ),
81
+ /* @__PURE__ */ e(
82
+ P,
83
+ {
84
+ tick: { fontSize: 12 },
85
+ tickFormatter: c ? (t) => `${(t * 100).toFixed(0)}%` : void 0,
86
+ domain: c ? [0, 1] : void 0,
87
+ label: c ? void 0 : { value: V(o[0]), angle: -90, position: "left", style: { textAnchor: "middle", fontSize: "12px" } }
88
+ }
89
+ ),
90
+ y.showTooltip && /* @__PURE__ */ e(
91
+ J,
92
+ {
93
+ formatter: (t, r) => t == null ? ["No data", r] : r === "Target" ? [C(t), "Target Value"] : c && typeof t == "number" ? [`${(t * 100).toFixed(1)}%`, r] : [C(t), r]
94
+ }
95
+ ),
96
+ G && /* @__PURE__ */ e(
97
+ X,
98
+ {
99
+ wrapperStyle: { fontSize: "12px", paddingTop: "25px" },
100
+ iconType: "rect",
101
+ iconSize: 8,
102
+ layout: "horizontal",
103
+ align: "center",
104
+ verticalAlign: "bottom",
105
+ onMouseEnter: (t) => b(String(t.dataKey || "")),
106
+ onMouseLeave: () => b(null)
107
+ }
108
+ ),
109
+ m.map((t, r) => /* @__PURE__ */ e(
110
+ Y,
111
+ {
112
+ dataKey: t,
113
+ stackId: E ? "stack" : void 0,
114
+ fill: w ? D : p?.colors && p.colors[r % p.colors.length] || F[r % F.length],
115
+ fillOpacity: x ? x === t ? 1 : 0.3 : 1,
116
+ children: w && l.map((g, A) => {
117
+ const L = g[t], I = typeof L == "number" && L < 0 ? se : D;
118
+ return /* @__PURE__ */ e(
119
+ q,
120
+ {
121
+ fill: I,
122
+ fillOpacity: x ? x === t ? 1 : 0.3 : 1
123
+ },
124
+ `cell-${A}`
125
+ );
126
+ })
127
+ },
128
+ t
129
+ )),
130
+ N.length > 0 && /* @__PURE__ */ a(R, { children: [
131
+ /* @__PURE__ */ e(
132
+ S,
133
+ {
134
+ type: "monotone",
135
+ dataKey: "__target",
136
+ stroke: "#ffffff",
137
+ strokeWidth: 2,
138
+ dot: !1,
139
+ activeDot: !1,
140
+ connectNulls: !1
141
+ }
142
+ ),
143
+ /* @__PURE__ */ e(
144
+ S,
145
+ {
146
+ type: "monotone",
147
+ dataKey: "__target",
148
+ name: "Target",
149
+ stroke: "#8B5CF6",
150
+ strokeWidth: 2,
151
+ strokeDasharray: "2 3",
152
+ dot: !1,
153
+ activeDot: !1,
154
+ connectNulls: !1
155
+ }
156
+ )
157
+ ] })
158
+ ] }) }),
159
+ u > 0 && /* @__PURE__ */ a("div", { className: "text-xs text-dc-text-muted text-center mt-1", children: [
160
+ u,
161
+ " data point",
162
+ u !== 1 ? "s" : "",
163
+ " with no values hidden"
164
+ ] })
165
+ ] });
166
+ } catch (d) {
167
+ return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-red-500 p-4", style: { height: n }, children: /* @__PURE__ */ a("div", { className: "text-center", children: [
168
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Bar Chart Error" }),
169
+ /* @__PURE__ */ e("div", { className: "text-xs mb-2", children: d instanceof Error ? d.message : "Unknown rendering error" }),
170
+ /* @__PURE__ */ e("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
171
+ ] }) });
172
+ }
173
+ }
174
+ export {
175
+ xe as default
176
+ };
177
+ //# sourceMappingURL=chart-barchart-BzoejYkT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-barchart-BzoejYkT.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, formatNumericValue } 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 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 }\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 bar 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: transformedData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n labelMap\n )\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 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 // Determine stack offset for percentage stacking\n const stackOffset = isPercentStack ? '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 left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\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 tick={{ fontSize: 12 }}\n tickFormatter={isPercentStack ? (v) => `${(v * 100).toFixed(0)}%` : undefined}\n domain={isPercentStack ? [0, 1] : undefined}\n label={isPercentStack ? undefined : { value: contextGetFieldLabel(yAxisFields[0]), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\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 return [formatNumericValue(value), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (isPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n return [formatNumericValue(value), 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 <Bar\n key={seriesKey}\n dataKey={seriesKey}\n stackId={shouldStack ? \"stack\" : undefined}\n fill={usePositiveNegativeColoring ? POSITIVE_COLOR : ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length])}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n >\n {usePositiveNegativeColoring && 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 {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\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 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","jsx","jsxs","xAxisField","yAxisFields","seriesFields","transformedData","seriesKeys","transformChartDataWithSeries","chartData","skippedCount","useMemo","filtered","row","key","isValidNumericValue","skipped","stackOffset","usePositiveNegativeColoring","value","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","v","ChartTooltip","name","formatNumericValue","Legend","o","seriesKey","Bar","POSITIVE_COLOR","CHART_COLORS","entry","entryIndex","fillColor","NEGATIVE_COLOR","Cell","Fragment","Line","error"],"mappings":"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"}