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
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as r, jsxs as N } from "react/jsx-runtime";
|
|
2
2
|
import { useState as M, useRef as V, useEffect as O } from "react";
|
|
3
|
-
import { u as W } from "./chart-activitygridchart-
|
|
4
|
-
import { D as E } from "./chart-kpinumber-
|
|
3
|
+
import { u as W } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
4
|
+
import { D as E } from "./chart-kpinumber-HOPfcK2N.js";
|
|
5
5
|
function U({
|
|
6
6
|
data: x,
|
|
7
7
|
chartConfig: s,
|
|
8
8
|
displayConfig: o = {},
|
|
9
|
-
height:
|
|
9
|
+
height: n = "100%",
|
|
10
10
|
colorPalette: h
|
|
11
11
|
}) {
|
|
12
12
|
const [j, A] = M(28), [T, R] = M(0), a = V(null), y = V(null), { getFieldLabel: H } = W();
|
|
@@ -30,36 +30,36 @@ function U({
|
|
|
30
30
|
clearTimeout(t), l.disconnect();
|
|
31
31
|
};
|
|
32
32
|
}, [x, s]), !x || x.length === 0)
|
|
33
|
-
return /* @__PURE__ */
|
|
33
|
+
return /* @__PURE__ */ r(
|
|
34
34
|
"div",
|
|
35
35
|
{
|
|
36
36
|
className: "flex items-center justify-center w-full h-full",
|
|
37
37
|
style: {
|
|
38
|
-
height:
|
|
39
|
-
minHeight:
|
|
38
|
+
height: n === "100%" ? "100%" : n,
|
|
39
|
+
minHeight: n === "100%" ? "200px" : void 0
|
|
40
40
|
},
|
|
41
41
|
children: /* @__PURE__ */ N("div", { className: "text-center text-dc-text-muted", children: [
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
/* @__PURE__ */
|
|
42
|
+
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
|
|
43
|
+
/* @__PURE__ */ r("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display" })
|
|
44
44
|
] })
|
|
45
45
|
}
|
|
46
46
|
);
|
|
47
47
|
let v = [];
|
|
48
48
|
if (s?.yAxis && (typeof s.yAxis == "string" ? v = [s.yAxis] : Array.isArray(s.yAxis) && (v = s.yAxis)), v.length === 0)
|
|
49
|
-
return /* @__PURE__ */
|
|
49
|
+
return /* @__PURE__ */ r(
|
|
50
50
|
"div",
|
|
51
51
|
{
|
|
52
52
|
className: "flex items-center justify-center w-full h-full",
|
|
53
53
|
style: {
|
|
54
|
-
height:
|
|
55
|
-
minHeight:
|
|
54
|
+
height: n === "100%" ? "100%" : n,
|
|
55
|
+
minHeight: n === "100%" ? "200px" : void 0,
|
|
56
56
|
backgroundColor: "var(--dc-danger-bg)",
|
|
57
57
|
color: "var(--dc-danger)",
|
|
58
58
|
borderColor: "var(--dc-danger-border)"
|
|
59
59
|
},
|
|
60
60
|
children: /* @__PURE__ */ N("div", { className: "text-center", children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
62
|
+
/* @__PURE__ */ r("div", { className: "text-xs", children: "No measure fields configured" })
|
|
63
63
|
] })
|
|
64
64
|
}
|
|
65
65
|
);
|
|
@@ -71,20 +71,20 @@ function U({
|
|
|
71
71
|
return e[t[0]];
|
|
72
72
|
}).filter((e) => e != null);
|
|
73
73
|
if (i.length === 0)
|
|
74
|
-
return /* @__PURE__ */
|
|
74
|
+
return /* @__PURE__ */ r(
|
|
75
75
|
"div",
|
|
76
76
|
{
|
|
77
77
|
className: "flex items-center justify-center w-full h-full",
|
|
78
78
|
style: {
|
|
79
|
-
height:
|
|
80
|
-
minHeight:
|
|
79
|
+
height: n === "100%" ? "100%" : n,
|
|
80
|
+
minHeight: n === "100%" ? "200px" : void 0,
|
|
81
81
|
backgroundColor: "var(--dc-warning-bg)",
|
|
82
82
|
color: "var(--dc-warning)",
|
|
83
83
|
borderColor: "var(--dc-warning-border)"
|
|
84
84
|
},
|
|
85
85
|
children: /* @__PURE__ */ N("div", { className: "text-center", children: [
|
|
86
|
-
/* @__PURE__ */
|
|
87
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ r("div", { className: "text-sm font-semibold mb-1", children: "No valid data" }),
|
|
87
|
+
/* @__PURE__ */ r("div", { className: "text-xs", children: "All values are null or invalid" })
|
|
88
88
|
] })
|
|
89
89
|
}
|
|
90
90
|
);
|
|
@@ -127,11 +127,11 @@ function U({
|
|
|
127
127
|
ref: a,
|
|
128
128
|
className: "flex flex-col items-center justify-center w-full h-full p-4",
|
|
129
129
|
style: {
|
|
130
|
-
height:
|
|
131
|
-
minHeight:
|
|
130
|
+
height: n === "100%" ? "100%" : n,
|
|
131
|
+
minHeight: n === "100%" ? "200px" : void 0
|
|
132
132
|
},
|
|
133
133
|
children: [
|
|
134
|
-
/* @__PURE__ */
|
|
134
|
+
/* @__PURE__ */ r(
|
|
135
135
|
"div",
|
|
136
136
|
{
|
|
137
137
|
ref: y,
|
|
@@ -143,7 +143,7 @@ function U({
|
|
|
143
143
|
children: $
|
|
144
144
|
}
|
|
145
145
|
),
|
|
146
|
-
w && u !== null && m !== null && /* @__PURE__ */
|
|
146
|
+
w && u !== null && m !== null && /* @__PURE__ */ r("div", { className: "mt-4", children: /* @__PURE__ */ r(
|
|
147
147
|
E,
|
|
148
148
|
{
|
|
149
149
|
values: i,
|
|
@@ -162,4 +162,4 @@ function U({
|
|
|
162
162
|
export {
|
|
163
163
|
U as default
|
|
164
164
|
};
|
|
165
|
-
//# sourceMappingURL=chart-kpitext-
|
|
165
|
+
//# sourceMappingURL=chart-kpitext-BZkC9u3A.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-kpitext-Z9oh0bJq.js","sources":["../../../src/client/components/charts/KpiText.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport DataHistogram from '../DataHistogram'\nimport type { ChartProps } from '../../types'\n\nexport default function KpiText({ \n data, \n chartConfig, \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(28)\n const [textWidth, setTextWidth] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const textRef = useRef<HTMLDivElement>(null)\n const { getFieldLabel } = useCubeContext()\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n \n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI Text displays, text might be longer so use more conservative sizing\n // Also reserve space for potential statistics display\n const widthBasedSize = containerWidth / 8\n const heightBasedSize = containerHeight / 5\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(18, Math.min(baseFontSize, 80))\n setFontSize(clampedFontSize)\n }\n }\n \n // Measure the text width after font size is set\n if (textRef.current) {\n const textRect = textRef.current.getBoundingClientRect()\n setTextWidth(textRect.width)\n }\n }\n\n // Initial calculation after a short delay to ensure the container is fully rendered\n const timer = setTimeout(updateDimensions, 100)\n \n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n clearTimeout(timer)\n setTimeout(updateDimensions, 50)\n })\n \n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\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</div>\n </div>\n </div>\n )\n }\n\n // Extract value field from chart config - handle both string and array formats\n let valueFields: string[] = []\n if (chartConfig?.yAxis) {\n // Handle both string and array formats\n if (typeof chartConfig.yAxis === 'string') {\n valueFields = [chartConfig.yAxis]\n } else if (Array.isArray(chartConfig.yAxis)) {\n valueFields = chartConfig.yAxis\n }\n }\n \n \n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n const valueField = valueFields[0] // Use first measure field\n \n // Debug logging (remove in production)\n \n // Extract values for the selected field\n const values = data\n .map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n \n // If not found, try finding the first available field as fallback\n const availableFields = Object.keys(row)\n if (availableFields.length > 0) {\n // Field not found, using fallback\n return row[availableFields[0]]\n }\n \n return undefined\n })\n .filter(val => val !== null && val !== undefined)\n \n\n if (values.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-warning-bg)',\n color: 'var(--dc-warning)',\n borderColor: 'var(--dc-warning-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs\">All values are null or invalid</div>\n </div>\n </div>\n )\n }\n\n // Calculate statistics for numeric values\n const numericValues = values\n .map(val => Number(val))\n .filter(val => !isNaN(val))\n\n let mainValue: any\n let min: number | null = null\n let max: number | null = null\n let showStats = false\n\n if (numericValues.length > 0) {\n if (values.length === 1) {\n mainValue = values[0]\n } else {\n // Calculate average for multiple numeric values\n const sum = numericValues.reduce((acc, val) => acc + val, 0)\n const avg = sum / numericValues.length\n mainValue = avg\n min = Math.min(...numericValues)\n max = Math.max(...numericValues)\n showStats = true\n }\n } else {\n // Non-numeric values - just use the first one or concatenate if multiple\n mainValue = values.length === 1 ? values[0] : values.join(', ')\n }\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 2\n\n if (Math.abs(value) >= 1e9) {\n return (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n return (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n return (value / 1e3).toFixed(decimals) + 'K'\n } else {\n return value.toFixed(decimals)\n }\n }\n\n // Process template string\n const processTemplate = (template: string, value: any): string => {\n try {\n // Create template variables\n const templateVars = {\n value: typeof value === 'number' ? formatNumber(value) : String(value),\n rawValue: value,\n field: valueField,\n fieldLabel: getFieldLabel(valueField),\n min: min !== null ? formatNumber(min) : '',\n max: max !== null ? formatNumber(max) : '',\n count: values.length\n }\n\n // Simple template replacement using ${variable} syntax\n return template.replace(/\\$\\{(\\w+)\\}/g, (match, varName) => {\n if (varName in templateVars) {\n return String(templateVars[varName as keyof typeof templateVars])\n }\n return match\n })\n } catch (error) {\n // Error processing template\n return String(value)\n }\n }\n\n const template = displayConfig.template || '${fieldLabel}: ${value}'\n const displayText = processTemplate(template, mainValue)\n\n // Get color from palette by index, default to first color in palette\n const getValueColor = (): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }\n\n const valueColor = getValueColor()\n\n return (\n <div \n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Main KPI Text */}\n <div \n ref={textRef}\n className=\"font-bold leading-tight text-center\"\n style={{ \n fontSize: `${fontSize}px`,\n color: valueColor \n }}\n >\n {displayText}\n </div>\n\n {/* Data Histogram for multiple values */}\n {showStats && min !== null && max !== null && (\n <div className=\"mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth || 200}\n />\n </div>\n )}\n </div>\n )\n}"],"names":["KpiText","data","chartConfig","displayConfig","height","colorPalette","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","textRef","getFieldLabel","useCubeContext","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","baseFontSize","clampedFontSize","textRect","timer","resizeObserver","jsx","jsxs","valueFields","valueField","values","row","availableFields","val","numericValues","mainValue","min","max","showStats","acc","formatNumber","value","decimals","processTemplate","template","templateVars","match","varName","displayText","valueColor","colorIndex","DataHistogram"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-kpitext-BZkC9u3A.js","sources":["../../../src/client/components/charts/KpiText.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport DataHistogram from '../DataHistogram'\nimport type { ChartProps } from '../../types'\n\nexport default function KpiText({ \n data, \n chartConfig, \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(28)\n const [textWidth, setTextWidth] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const textRef = useRef<HTMLDivElement>(null)\n const { getFieldLabel } = useCubeContext()\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n \n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI Text displays, text might be longer so use more conservative sizing\n // Also reserve space for potential statistics display\n const widthBasedSize = containerWidth / 8\n const heightBasedSize = containerHeight / 5\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(18, Math.min(baseFontSize, 80))\n setFontSize(clampedFontSize)\n }\n }\n \n // Measure the text width after font size is set\n if (textRef.current) {\n const textRect = textRef.current.getBoundingClientRect()\n setTextWidth(textRect.width)\n }\n }\n\n // Initial calculation after a short delay to ensure the container is fully rendered\n const timer = setTimeout(updateDimensions, 100)\n \n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n clearTimeout(timer)\n setTimeout(updateDimensions, 50)\n })\n \n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\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</div>\n </div>\n </div>\n )\n }\n\n // Extract value field from chart config - handle both string and array formats\n let valueFields: string[] = []\n if (chartConfig?.yAxis) {\n // Handle both string and array formats\n if (typeof chartConfig.yAxis === 'string') {\n valueFields = [chartConfig.yAxis]\n } else if (Array.isArray(chartConfig.yAxis)) {\n valueFields = chartConfig.yAxis\n }\n }\n \n \n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n const valueField = valueFields[0] // Use first measure field\n \n // Debug logging (remove in production)\n \n // Extract values for the selected field\n const values = data\n .map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n \n // If not found, try finding the first available field as fallback\n const availableFields = Object.keys(row)\n if (availableFields.length > 0) {\n // Field not found, using fallback\n return row[availableFields[0]]\n }\n \n return undefined\n })\n .filter(val => val !== null && val !== undefined)\n \n\n if (values.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-warning-bg)',\n color: 'var(--dc-warning)',\n borderColor: 'var(--dc-warning-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs\">All values are null or invalid</div>\n </div>\n </div>\n )\n }\n\n // Calculate statistics for numeric values\n const numericValues = values\n .map(val => Number(val))\n .filter(val => !isNaN(val))\n\n let mainValue: any\n let min: number | null = null\n let max: number | null = null\n let showStats = false\n\n if (numericValues.length > 0) {\n if (values.length === 1) {\n mainValue = values[0]\n } else {\n // Calculate average for multiple numeric values\n const sum = numericValues.reduce((acc, val) => acc + val, 0)\n const avg = sum / numericValues.length\n mainValue = avg\n min = Math.min(...numericValues)\n max = Math.max(...numericValues)\n showStats = true\n }\n } else {\n // Non-numeric values - just use the first one or concatenate if multiple\n mainValue = values.length === 1 ? values[0] : values.join(', ')\n }\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 2\n\n if (Math.abs(value) >= 1e9) {\n return (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n return (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n return (value / 1e3).toFixed(decimals) + 'K'\n } else {\n return value.toFixed(decimals)\n }\n }\n\n // Process template string\n const processTemplate = (template: string, value: any): string => {\n try {\n // Create template variables\n const templateVars = {\n value: typeof value === 'number' ? formatNumber(value) : String(value),\n rawValue: value,\n field: valueField,\n fieldLabel: getFieldLabel(valueField),\n min: min !== null ? formatNumber(min) : '',\n max: max !== null ? formatNumber(max) : '',\n count: values.length\n }\n\n // Simple template replacement using ${variable} syntax\n return template.replace(/\\$\\{(\\w+)\\}/g, (match, varName) => {\n if (varName in templateVars) {\n return String(templateVars[varName as keyof typeof templateVars])\n }\n return match\n })\n } catch {\n // Error processing template\n return String(value)\n }\n }\n\n const template = displayConfig.template || '${fieldLabel}: ${value}'\n const displayText = processTemplate(template, mainValue)\n\n // Get color from palette by index, default to first color in palette\n const getValueColor = (): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }\n\n const valueColor = getValueColor()\n\n return (\n <div \n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Main KPI Text */}\n <div \n ref={textRef}\n className=\"font-bold leading-tight text-center\"\n style={{ \n fontSize: `${fontSize}px`,\n color: valueColor \n }}\n >\n {displayText}\n </div>\n\n {/* Data Histogram for multiple values */}\n {showStats && min !== null && max !== null && (\n <div className=\"mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth || 200}\n />\n </div>\n )}\n </div>\n )\n}"],"names":["KpiText","data","chartConfig","displayConfig","height","colorPalette","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","textRef","getFieldLabel","useCubeContext","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","baseFontSize","clampedFontSize","textRect","timer","resizeObserver","jsx","jsxs","valueFields","valueField","values","row","availableFields","val","numericValues","mainValue","min","max","showStats","acc","formatNumber","value","decimals","processTemplate","template","templateVars","match","varName","displayText","valueColor","colorIndex","DataHistogram"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsx as t, jsxs as n, Fragment as V } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as K } from "react";
|
|
3
3
|
import { LineChart as W, CartesianGrid as C, XAxis as H, YAxis as D, Legend as O, Line as N } from "recharts";
|
|
4
4
|
import { C as X } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as q } from "./chart-charttooltip-
|
|
6
|
-
import { u as B, t as U, C as $, f as u, a as z } from "./chart-activitygridchart-
|
|
7
|
-
import { p as J, s as Q } from "./chart-areachart-
|
|
5
|
+
import { C as q } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { u as B, t as U, C as $, f as u, a as z } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
|
+
import { p as J, s as Q } from "./chart-areachart-B4tknnsY.js";
|
|
8
8
|
function ae({
|
|
9
9
|
data: y,
|
|
10
10
|
chartConfig: s,
|
|
@@ -32,12 +32,12 @@ function ae({
|
|
|
32
32
|
else if (s?.x && s?.y)
|
|
33
33
|
h = s.x, i = Array.isArray(s.y) ? s.y : [s.y];
|
|
34
34
|
else
|
|
35
|
-
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-
|
|
35
|
+
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: o }, children: /* @__PURE__ */ n("div", { className: "text-center", children: [
|
|
36
36
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
37
37
|
/* @__PURE__ */ t("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
|
|
38
38
|
] }) });
|
|
39
39
|
if (!h || !i || i.length === 0)
|
|
40
|
-
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-
|
|
40
|
+
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: o }, children: /* @__PURE__ */ n("div", { className: "text-center", children: [
|
|
41
41
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
42
42
|
/* @__PURE__ */ t("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
43
43
|
] }) });
|
|
@@ -185,7 +185,7 @@ function ae({
|
|
|
185
185
|
] })
|
|
186
186
|
] }) });
|
|
187
187
|
} catch (l) {
|
|
188
|
-
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
188
|
+
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: o }, children: /* @__PURE__ */ n("div", { className: "text-center", children: [
|
|
189
189
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Line Chart Error" }),
|
|
190
190
|
/* @__PURE__ */ t("div", { className: "text-xs mb-2", children: l instanceof Error ? l.message : "Unknown rendering error" }),
|
|
191
191
|
/* @__PURE__ */ t("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -195,4 +195,4 @@ function ae({
|
|
|
195
195
|
export {
|
|
196
196
|
ae as default
|
|
197
197
|
};
|
|
198
|
-
//# sourceMappingURL=chart-linechart-
|
|
198
|
+
//# sourceMappingURL=chart-linechart-DqFmLbRe.js.map
|
package/dist/client/chunks/{chart-linechart-D4r0uD1j.js.map → chart-linechart-DqFmLbRe.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-linechart-D4r0uD1j.js","sources":["../../../src/client/components/charts/LineChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { LineChart as RechartsLineChart, 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 LineChart({ \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 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 line 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 // This is needed because seriesKeys use display labels, not field names\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 // 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 line chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins}>\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={leftYAxisFormat ? (value) => formatAxisValue(value, leftYAxisFormat) : undefined}\n label={\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 // 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=\"line\"\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 <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={{ r: 3 }}\n activeDot={{ r: 5 }}\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 </RechartsLineChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'LineChart 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\">Line 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":["LineChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","getFieldLabel","useCubeContext","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","jsx","jsxs","xAxisField","yAxisFields","seriesFields","chartData","seriesKeys","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","RechartsLineChart","CartesianGrid","XAxis","YAxis","value","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Line","CHART_COLORS","Fragment","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-linechart-DqFmLbRe.js","sources":["../../../src/client/components/charts/LineChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { LineChart as RechartsLineChart, 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 LineChart({ \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 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 line 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 // This is needed because seriesKeys use display labels, not field names\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 // 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 line chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins}>\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={leftYAxisFormat ? (value) => formatAxisValue(value, leftYAxisFormat) : undefined}\n label={\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 // 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=\"line\"\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 <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={{ r: 3 }}\n activeDot={{ r: 5 }}\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 </RechartsLineChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'LineChart 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\">Line 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":["LineChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","getFieldLabel","useCubeContext","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","jsx","jsxs","xAxisField","yAxisFields","seriesFields","chartData","seriesKeys","transformChartDataWithSeries","yAxisAssignment","seriesKeyToField","field","label","hasRightAxis","leftAxisFields","f","rightAxisFields","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","RechartsLineChart","CartesianGrid","XAxis","YAxis","value","formatAxisValue","ChartTooltip","name","originalField","formatConfig","Legend","o","seriesKey","axisId","Line","CHART_COLORS","Fragment","error"],"mappings":"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"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { jsx as c, jsxs as o } from "react/jsx-runtime";
|
|
2
|
+
function T({
|
|
3
|
+
displayConfig: f = {},
|
|
4
|
+
height: u = "100%",
|
|
5
|
+
colorPalette: b
|
|
6
|
+
}) {
|
|
7
|
+
const $ = f.content || "", k = f.accentColorIndex ?? 0, g = f.fontSize || "medium", h = f.alignment || "left", d = b?.colors && k < b.colors.length ? b.colors[k] : "#8884d8", w = {
|
|
8
|
+
small: "text-sm",
|
|
9
|
+
medium: "text-lg",
|
|
10
|
+
large: "text-xl"
|
|
11
|
+
}, C = {
|
|
12
|
+
left: "text-left",
|
|
13
|
+
center: "text-center",
|
|
14
|
+
right: "text-right"
|
|
15
|
+
}, v = (l) => {
|
|
16
|
+
const t = l.split(`
|
|
17
|
+
`), s = [];
|
|
18
|
+
let e = null;
|
|
19
|
+
for (let n = 0; n < t.length; n++) {
|
|
20
|
+
const r = t[n].trim();
|
|
21
|
+
if (!r) {
|
|
22
|
+
e && (s.push(e), e = null), s.push({ type: "break" });
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const i = r.match(/^(#{1,3})\s+(.*)$/);
|
|
26
|
+
if (i) {
|
|
27
|
+
e && (s.push(e), e = null), s.push({
|
|
28
|
+
type: "header",
|
|
29
|
+
level: i[1].length,
|
|
30
|
+
content: i[2]
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const a = r.match(/^[-*+]\s+(.*)$/);
|
|
35
|
+
if (a) {
|
|
36
|
+
(!e || e.ordered) && (e && s.push(e), e = { type: "list", ordered: !1, children: [] }), e.children.push({
|
|
37
|
+
type: "listItem",
|
|
38
|
+
children: N(a[1]),
|
|
39
|
+
parentOrdered: !1
|
|
40
|
+
});
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const x = r.match(/^\d+\.\s+(.*)$/);
|
|
44
|
+
if (x) {
|
|
45
|
+
(!e || !e.ordered) && (e && s.push(e), e = { type: "list", ordered: !0, children: [] }), e.children.push({
|
|
46
|
+
type: "listItem",
|
|
47
|
+
children: N(x[1]),
|
|
48
|
+
parentOrdered: !0
|
|
49
|
+
});
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
e && (s.push(e), e = null), s.push({
|
|
53
|
+
type: "paragraph",
|
|
54
|
+
children: N(r)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return e && s.push(e), s;
|
|
58
|
+
}, N = (l) => {
|
|
59
|
+
const t = [];
|
|
60
|
+
let s = l;
|
|
61
|
+
for (; s; ) {
|
|
62
|
+
const e = s.match(/^(.*?)\[([^\]]+)\]\(([^)]+)\)(.*)$/);
|
|
63
|
+
if (e) {
|
|
64
|
+
const [, n, r, i, a] = e;
|
|
65
|
+
n && t.push(...y(n)), t.push({
|
|
66
|
+
type: "link",
|
|
67
|
+
content: r,
|
|
68
|
+
url: i
|
|
69
|
+
}), s = a;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
t.push(...y(s));
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
return t;
|
|
76
|
+
}, y = (l) => {
|
|
77
|
+
const t = [];
|
|
78
|
+
let s = l;
|
|
79
|
+
for (; s; ) {
|
|
80
|
+
const e = s.match(/^(.*?)\*\*([^*]+)\*\*(.*)$/);
|
|
81
|
+
if (e) {
|
|
82
|
+
const [, r, i, a] = e;
|
|
83
|
+
r && t.push({ type: "text", content: r }), t.push({ type: "bold", content: i }), s = a;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const n = s.match(/^(.*?)\*([^*]+)\*(.*)$/);
|
|
87
|
+
if (n) {
|
|
88
|
+
const [, r, i, a] = n;
|
|
89
|
+
r && t.push({ type: "text", content: r }), t.push({ type: "italic", content: i }), s = a;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
t.push({ type: "text", content: s });
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return t;
|
|
96
|
+
}, m = (l, t, s) => {
|
|
97
|
+
switch (l.type) {
|
|
98
|
+
case "text":
|
|
99
|
+
return /* @__PURE__ */ c("span", { className: "text-dc-text", children: l.content }, t);
|
|
100
|
+
case "bold":
|
|
101
|
+
return /* @__PURE__ */ c("strong", { className: "font-bold text-dc-text", children: l.content }, t);
|
|
102
|
+
case "italic":
|
|
103
|
+
return /* @__PURE__ */ c("em", { className: "italic text-dc-text", children: l.content }, t);
|
|
104
|
+
case "link":
|
|
105
|
+
return /* @__PURE__ */ c(
|
|
106
|
+
"a",
|
|
107
|
+
{
|
|
108
|
+
href: l.url,
|
|
109
|
+
target: "_blank",
|
|
110
|
+
rel: "nofollow noopener noreferrer",
|
|
111
|
+
className: "hover:underline transition-colors",
|
|
112
|
+
style: { color: d },
|
|
113
|
+
children: l.content
|
|
114
|
+
},
|
|
115
|
+
t
|
|
116
|
+
);
|
|
117
|
+
case "header": {
|
|
118
|
+
const e = (r, i) => {
|
|
119
|
+
const a = "font-bold", x = {
|
|
120
|
+
1: "mb-4",
|
|
121
|
+
2: "mb-3",
|
|
122
|
+
3: "mb-2"
|
|
123
|
+
};
|
|
124
|
+
let p = "";
|
|
125
|
+
return i === "small" ? p = { 1: "text-lg", 2: "text-base", 3: "text-sm" }[r] || "text-sm" : i === "large" ? p = { 1: "text-5xl", 2: "text-4xl", 3: "text-3xl" }[r] || "text-3xl" : p = { 1: "text-3xl", 2: "text-2xl", 3: "text-xl" }[r] || "text-xl", `${a} ${p} ${x[r]}`;
|
|
126
|
+
}, n = `h${l.level}`;
|
|
127
|
+
return /* @__PURE__ */ c(
|
|
128
|
+
n,
|
|
129
|
+
{
|
|
130
|
+
className: e(l.level, g),
|
|
131
|
+
style: { color: d },
|
|
132
|
+
children: l.content
|
|
133
|
+
},
|
|
134
|
+
t
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
case "paragraph":
|
|
138
|
+
return /* @__PURE__ */ c("p", { className: "mb-3 leading-relaxed", children: l.children?.map((e, n) => m(e, n)) }, t);
|
|
139
|
+
case "list": {
|
|
140
|
+
const e = l.ordered ? "ol" : "ul";
|
|
141
|
+
let n = "mb-3";
|
|
142
|
+
return h === "center" ? n += " list-none flex flex-col items-center" : h === "right" ? n += " list-none ml-auto max-w-max" : n += " list-none ml-6", /* @__PURE__ */ c(e, { className: n, children: l.children?.map((r, i) => m(r, i, l.ordered ? i + 1 : void 0)) }, t);
|
|
143
|
+
}
|
|
144
|
+
case "listItem":
|
|
145
|
+
if (l.children) {
|
|
146
|
+
if (l.parentOrdered && s !== void 0) {
|
|
147
|
+
const e = w[g];
|
|
148
|
+
return h === "center" ? /* @__PURE__ */ o("li", { className: "mb-1 flex items-center justify-center", children: [
|
|
149
|
+
/* @__PURE__ */ o(
|
|
150
|
+
"span",
|
|
151
|
+
{
|
|
152
|
+
className: `inline-block mr-2 shrink-0 ${e} font-medium`,
|
|
153
|
+
style: { color: d },
|
|
154
|
+
children: [
|
|
155
|
+
s,
|
|
156
|
+
"."
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
),
|
|
160
|
+
/* @__PURE__ */ c("span", { className: "text-center", children: l.children.map((n, r) => m(n, r)) })
|
|
161
|
+
] }, t) : h === "right" ? /* @__PURE__ */ o("li", { className: "mb-1 flex items-start justify-end", children: [
|
|
162
|
+
/* @__PURE__ */ c("span", { className: "text-right", children: l.children.map((n, r) => m(n, r)) }),
|
|
163
|
+
/* @__PURE__ */ o(
|
|
164
|
+
"span",
|
|
165
|
+
{
|
|
166
|
+
className: `inline-block ml-2 shrink-0 ${e} font-medium`,
|
|
167
|
+
style: { color: d },
|
|
168
|
+
children: [
|
|
169
|
+
s,
|
|
170
|
+
"."
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
] }, t) : /* @__PURE__ */ o("li", { className: "mb-1 flex items-start", children: [
|
|
175
|
+
/* @__PURE__ */ o(
|
|
176
|
+
"span",
|
|
177
|
+
{
|
|
178
|
+
className: `inline-block mr-3 shrink-0 ${e} font-medium`,
|
|
179
|
+
style: { color: d },
|
|
180
|
+
children: [
|
|
181
|
+
s,
|
|
182
|
+
"."
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
),
|
|
186
|
+
/* @__PURE__ */ c("span", { className: "flex-1", children: l.children.map((n, r) => m(n, r)) })
|
|
187
|
+
] }, t);
|
|
188
|
+
}
|
|
189
|
+
return h === "center" ? /* @__PURE__ */ o("li", { className: "mb-1 flex items-center justify-center", children: [
|
|
190
|
+
/* @__PURE__ */ c(
|
|
191
|
+
"span",
|
|
192
|
+
{
|
|
193
|
+
className: "inline-block w-2 h-2 rounded-full mr-2 shrink-0",
|
|
194
|
+
style: { backgroundColor: d }
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
/* @__PURE__ */ c("span", { className: "text-center", children: l.children.map((e, n) => m(e, n)) })
|
|
198
|
+
] }, t) : h === "right" ? /* @__PURE__ */ o("li", { className: "mb-1 flex items-start justify-end", children: [
|
|
199
|
+
/* @__PURE__ */ c("span", { className: "text-right", children: l.children.map((e, n) => m(e, n)) }),
|
|
200
|
+
/* @__PURE__ */ c(
|
|
201
|
+
"span",
|
|
202
|
+
{
|
|
203
|
+
className: "inline-block w-2 h-2 rounded-full ml-2 mt-2 shrink-0",
|
|
204
|
+
style: { backgroundColor: d }
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
] }, t) : /* @__PURE__ */ o("li", { className: "mb-1 flex items-start", children: [
|
|
208
|
+
/* @__PURE__ */ c(
|
|
209
|
+
"span",
|
|
210
|
+
{
|
|
211
|
+
className: "inline-block w-2 h-2 rounded-full mr-3 mt-2 shrink-0",
|
|
212
|
+
style: { backgroundColor: d }
|
|
213
|
+
}
|
|
214
|
+
),
|
|
215
|
+
/* @__PURE__ */ c("span", { className: "flex-1", children: l.children.map((e, n) => m(e, n)) })
|
|
216
|
+
] }, t);
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
case "break":
|
|
220
|
+
return /* @__PURE__ */ c("br", {}, t);
|
|
221
|
+
default:
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
if (!$.trim())
|
|
226
|
+
return /* @__PURE__ */ c(
|
|
227
|
+
"div",
|
|
228
|
+
{
|
|
229
|
+
className: "flex items-center justify-center w-full h-full",
|
|
230
|
+
style: {
|
|
231
|
+
height: u === "100%" ? "100%" : u,
|
|
232
|
+
minHeight: u === "100%" ? "200px" : void 0
|
|
233
|
+
},
|
|
234
|
+
children: /* @__PURE__ */ o("div", { className: "text-center text-dc-text-muted", children: [
|
|
235
|
+
/* @__PURE__ */ c("div", { className: "text-sm font-semibold mb-1", children: "No content" }),
|
|
236
|
+
/* @__PURE__ */ c("div", { className: "text-xs text-dc-text-secondary", children: "Add markdown content in the chart configuration" })
|
|
237
|
+
] })
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
const M = v($);
|
|
241
|
+
return /* @__PURE__ */ c(
|
|
242
|
+
"div",
|
|
243
|
+
{
|
|
244
|
+
className: `p-4 w-full h-full overflow-auto ${w[g]} ${C[h]}`,
|
|
245
|
+
style: {
|
|
246
|
+
height: u === "100%" ? "100%" : u,
|
|
247
|
+
minHeight: u === "100%" ? "200px" : void 0
|
|
248
|
+
},
|
|
249
|
+
children: M.map((l, t) => m(l, t))
|
|
250
|
+
}
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
export {
|
|
254
|
+
T as default
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=chart-markdownchart-9n_TemoB.js.map
|