drizzle-cube 0.2.0 → 0.2.2
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/client/charts.js +15 -15
- package/dist/client/chunks/{chart-activitygridchart-BRk9BNnp.js → chart-activitygridchart--4a5X5eV.js} +12 -12
- package/dist/client/chunks/{chart-activitygridchart-BRk9BNnp.js.map → chart-activitygridchart--4a5X5eV.js.map} +1 -1
- package/dist/client/chunks/{chart-areachart-Beu8sO9v.js → chart-areachart-C_luzpU9.js} +3 -3
- package/dist/client/chunks/{chart-areachart-Beu8sO9v.js.map → chart-areachart-C_luzpU9.js.map} +1 -1
- package/dist/client/chunks/{chart-barchart-BzoejYkT.js → chart-barchart-CJzMunji.js} +4 -4
- package/dist/client/chunks/{chart-barchart-BzoejYkT.js.map → chart-barchart-CJzMunji.js.map} +1 -1
- package/dist/client/chunks/{chart-bubblechart-Dg7sT_Mm.js → chart-bubblechart-DPyYu4B-.js} +2 -2
- package/dist/client/chunks/{chart-bubblechart-Dg7sT_Mm.js.map → chart-bubblechart-DPyYu4B-.js.map} +1 -1
- package/dist/client/chunks/{chart-charttooltip-NrFVM1cJ.js → chart-charttooltip-CyhJAnW_.js} +2 -2
- package/dist/client/chunks/{chart-charttooltip-NrFVM1cJ.js.map → chart-charttooltip-CyhJAnW_.js.map} +1 -1
- package/dist/client/chunks/{chart-datatable-BvV7gLPZ.js → chart-datatable-xonQ9udl.js} +2 -2
- package/dist/client/chunks/{chart-datatable-BvV7gLPZ.js.map → chart-datatable-xonQ9udl.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-p1lVVG5v.js → chart-kpidelta-DTq92DyT.js} +2 -2
- package/dist/client/chunks/{chart-kpidelta-p1lVVG5v.js.map → chart-kpidelta-DTq92DyT.js.map} +1 -1
- package/dist/client/chunks/{chart-kpinumber-BFtxFeqq.js → chart-kpinumber-CiOvJAlz.js} +4 -4
- package/dist/client/chunks/{chart-kpinumber-BFtxFeqq.js.map → chart-kpinumber-CiOvJAlz.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-CX1s1u8B.js → chart-kpitext-D5kNrcSl.js} +3 -3
- package/dist/client/chunks/{chart-kpitext-CX1s1u8B.js.map → chart-kpitext-D5kNrcSl.js.map} +1 -1
- package/dist/client/chunks/{chart-linechart-Dgb10zbj.js → chart-linechart-4AF7Q_zF.js} +4 -4
- package/dist/client/chunks/{chart-linechart-Dgb10zbj.js.map → chart-linechart-4AF7Q_zF.js.map} +1 -1
- package/dist/client/chunks/{chart-piechart-B-0BQh-d.js → chart-piechart-Bf4TMIJP.js} +3 -3
- package/dist/client/chunks/{chart-piechart-B-0BQh-d.js.map → chart-piechart-Bf4TMIJP.js.map} +1 -1
- package/dist/client/chunks/{chart-radarchart-BwZM1yTd.js → chart-radarchart-DYar9VDH.js} +3 -3
- package/dist/client/chunks/{chart-radarchart-BwZM1yTd.js.map → chart-radarchart-DYar9VDH.js.map} +1 -1
- package/dist/client/chunks/{chart-radialbarchart-CythI1zx.js → chart-radialbarchart-BzRlxNfh.js} +3 -3
- package/dist/client/chunks/{chart-radialbarchart-CythI1zx.js.map → chart-radialbarchart-BzRlxNfh.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-om9-qmtE.js → chart-scatterchart-DNVKc7nQ.js} +2 -2
- package/dist/client/chunks/{chart-scatterchart-om9-qmtE.js.map → chart-scatterchart-DNVKc7nQ.js.map} +1 -1
- package/dist/client/chunks/{chart-treemapchart-Dc35Miif.js → chart-treemapchart-CworQneQ.js} +3 -3
- package/dist/client/chunks/{chart-treemapchart-Dc35Miif.js.map → chart-treemapchart-CworQneQ.js.map} +1 -1
- package/dist/client/chunks/{charts-DL9XOlaK.js → charts-Cjl5gNIQ.js} +27 -27
- package/dist/client/chunks/{charts-DL9XOlaK.js.map → charts-Cjl5gNIQ.js.map} +1 -1
- package/dist/client/chunks/{index-DpEuGmcW.js → index-Cn50vSlx.js} +236 -236
- package/dist/client/chunks/{index-DpEuGmcW.js.map → index-Cn50vSlx.js.map} +1 -1
- package/dist/client/components.js +9117 -16
- package/dist/client/components.js.map +1 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/index.d.ts +0 -16
- package/dist/client/index.js +37 -9135
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.d.ts +1 -0
- package/dist/client/providers.js +8 -4
- package/dist/client/providers.js.map +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +1 -1
package/dist/client/chunks/{chart-piechart-B-0BQh-d.js.map → chart-piechart-Bf4TMIJP.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-piechart-B-0BQh-d.js","sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function PieChart({ \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 } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? 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 pie chart</div>\n </div>\n </div>\n )\n }\n\n let pieData: Array<{name: string, value: number}>\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\">chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart</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 if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields,\n labelMap\n )\n \n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({\n name: String(key),\n value: firstRow[key]\n })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xAxisField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xAxisField] === 'boolean') {\n name = item[xAxisField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string' \n ? parseFloat(item[yAxisFields[0]]) \n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or zero)\n const originalLength = pieData.length\n pieData = pieData.filter(item => \n item.value != null && \n !isNaN(item.value) && \n item.value !== 0 && \n item.value > 0\n )\n \n if (pieData.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\">\n {originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n </div>\n </div>\n </div>\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) => \n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n >\n {pieData.map((_entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'PieChart 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\">Pie 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":["PieChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","useCubeContext","safeDisplayConfig","jsx","jsxs","pieData","xAxisField","yAxisFields","seriesFields","chartData","transformChartDataWithSeries","firstRow","key","granularity","getFieldGranularity","item","name","formatTimeValue","originalLength","ChartContainer","RechartsPieChart","Pie","percent","_entry","index","Cell","CHART_COLORS","ChartTooltip","Legend","o","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-piechart-Bf4TMIJP.js","sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function PieChart({ \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 } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? 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 pie chart</div>\n </div>\n </div>\n )\n }\n\n let pieData: Array<{name: string, value: number}>\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\">chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart</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 if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields,\n labelMap\n )\n \n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({\n name: String(key),\n value: firstRow[key]\n })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xAxisField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xAxisField] === 'boolean') {\n name = item[xAxisField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string' \n ? parseFloat(item[yAxisFields[0]]) \n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or zero)\n const originalLength = pieData.length\n pieData = pieData.filter(item => \n item.value != null && \n !isNaN(item.value) && \n item.value !== 0 && \n item.value > 0\n )\n \n if (pieData.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\">\n {originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n </div>\n </div>\n </div>\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) => \n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n >\n {pieData.map((_entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'PieChart 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\">Pie 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":["PieChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","useCubeContext","safeDisplayConfig","jsx","jsxs","pieData","xAxisField","yAxisFields","seriesFields","chartData","transformChartDataWithSeries","firstRow","key","granularity","getFieldGranularity","item","name","formatTimeValue","originalLength","ChartContainer","RechartsPieChart","Pie","percent","_entry","index","Cell","CHART_COLORS","ChartTooltip","Legend","o","error"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { jsx as e, jsxs as p } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as b } from "react";
|
|
3
3
|
import { RadarChart as S, PolarGrid as L, PolarAngleAxis as R, PolarRadiusAxis as j, Legend as C, Radar as F } from "recharts";
|
|
4
4
|
import { C as T } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as k } from "./chart-charttooltip-
|
|
6
|
-
import { t as z, b as E, c as G, a as y } from "./chart-activitygridchart
|
|
5
|
+
import { C as k } from "./chart-charttooltip-CyhJAnW_.js";
|
|
6
|
+
import { t as z, b as E, c as G, a as y } from "./chart-activitygridchart--4a5X5eV.js";
|
|
7
7
|
function W({
|
|
8
8
|
data: l,
|
|
9
9
|
chartConfig: a,
|
|
@@ -121,4 +121,4 @@ function W({
|
|
|
121
121
|
export {
|
|
122
122
|
W as default
|
|
123
123
|
};
|
|
124
|
-
//# sourceMappingURL=chart-radarchart-
|
|
124
|
+
//# sourceMappingURL=chart-radarchart-DYar9VDH.js.map
|
package/dist/client/chunks/{chart-radarchart-BwZM1yTd.js.map → chart-radarchart-DYar9VDH.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-radarchart-BwZM1yTd.js","sources":["../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? 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 radar chart</div>\n </div>\n </div>\n )\n }\n\n let radarData: any[]\n let seriesKeys: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Subject/category field\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis] // Value fields\n const seriesFields = chartConfig.series || []\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys: transformedSeriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields\n )\n \n radarData = chartData\n seriesKeys = transformedSeriesKeys\n } else {\n // Legacy format or auto-detection - try to find suitable fields\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find subject/category field\n const subjectField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find numeric fields for values\n const valueFields = keys.filter(key => \n typeof firstRow[key] === 'number' && key !== subjectField\n )\n\n if (valueFields.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\">No numeric fields found for radar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radar chart\n if (subjectField) {\n // Use subject field for radar categories\n const granularity = getFieldGranularity(queryObject, subjectField)\n radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n \n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = typeof item[field] === 'string' \n ? parseFloat(item[field]) \n : (item[field] || 0)\n })\n \n return transformedItem\n })\n \n seriesKeys = valueFields.map(field => field.split('.').pop() || field)\n } else {\n // Fallback - use first value field only\n radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: typeof item[valueFields[0]] === 'string' \n ? parseFloat(item[valueFields[0]]) \n : (item[valueFields[0]] || 0)\n }))\n seriesKeys = ['value']\n }\n }\n \n // Validate transformed data\n if (!radarData || radarData.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 radar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\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 <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\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 strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n ))}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadarChart 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\">Radar 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":["RadarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radarData","seriesKeys","xAxisField","yAxisFields","seriesFields","chartData","transformedSeriesKeys","transformChartDataWithSeries","firstRow","keys","subjectField","key","valueFields","granularity","getFieldGranularity","item","transformedItem","formatTimeValue","field","displayName","ChartContainer","RechartsRadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","ChartTooltip","Legend","o","seriesKey","index","Radar","CHART_COLORS","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-radarchart-DYar9VDH.js","sources":["../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? 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 radar chart</div>\n </div>\n </div>\n )\n }\n\n let radarData: any[]\n let seriesKeys: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Subject/category field\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis] // Value fields\n const seriesFields = chartConfig.series || []\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys: transformedSeriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields\n )\n \n radarData = chartData\n seriesKeys = transformedSeriesKeys\n } else {\n // Legacy format or auto-detection - try to find suitable fields\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find subject/category field\n const subjectField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find numeric fields for values\n const valueFields = keys.filter(key => \n typeof firstRow[key] === 'number' && key !== subjectField\n )\n\n if (valueFields.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\">No numeric fields found for radar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radar chart\n if (subjectField) {\n // Use subject field for radar categories\n const granularity = getFieldGranularity(queryObject, subjectField)\n radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n \n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = typeof item[field] === 'string' \n ? parseFloat(item[field]) \n : (item[field] || 0)\n })\n \n return transformedItem\n })\n \n seriesKeys = valueFields.map(field => field.split('.').pop() || field)\n } else {\n // Fallback - use first value field only\n radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: typeof item[valueFields[0]] === 'string' \n ? parseFloat(item[valueFields[0]]) \n : (item[valueFields[0]] || 0)\n }))\n seriesKeys = ['value']\n }\n }\n \n // Validate transformed data\n if (!radarData || radarData.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 radar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\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 <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\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 strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n ))}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadarChart 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\">Radar 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":["RadarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radarData","seriesKeys","xAxisField","yAxisFields","seriesFields","chartData","transformedSeriesKeys","transformChartDataWithSeries","firstRow","keys","subjectField","key","valueFields","granularity","getFieldGranularity","item","transformedItem","formatTimeValue","field","displayName","ChartContainer","RechartsRadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","ChartTooltip","Legend","o","seriesKey","index","Radar","CHART_COLORS","error"],"mappings":"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"}
|
package/dist/client/chunks/{chart-radialbarchart-CythI1zx.js → chart-radialbarchart-BzRlxNfh.js}
RENAMED
|
@@ -2,8 +2,8 @@ import { jsx as e, jsxs as f } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as b } from "react";
|
|
3
3
|
import { RadialBarChart as g, Legend as w, RadialBar as A, Cell as L } from "recharts";
|
|
4
4
|
import { C as R } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C } from "./chart-charttooltip-
|
|
6
|
-
import { b as S, a as x, c as T } from "./chart-activitygridchart
|
|
5
|
+
import { C } from "./chart-charttooltip-CyhJAnW_.js";
|
|
6
|
+
import { b as S, a as x, c as T } from "./chart-activitygridchart--4a5X5eV.js";
|
|
7
7
|
function D({
|
|
8
8
|
data: d,
|
|
9
9
|
chartConfig: i,
|
|
@@ -106,4 +106,4 @@ function D({
|
|
|
106
106
|
export {
|
|
107
107
|
D as default
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chart-radialbarchart-
|
|
109
|
+
//# sourceMappingURL=chart-radialbarchart-BzRlxNfh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-radialbarchart-CythI1zx.js","sources":["../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadialBarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? 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 radial bar chart</div>\n </div>\n </div>\n )\n }\n\n let radialData: Array<{name: string, value: number, fill?: string}>\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Value field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for values\n const valueField = keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!valueField) {\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\">No numeric field found for radial bar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radial bar chart\n radialData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n value: typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values\n radialData = radialData.filter(item => item.value != null && item.value !== 0)\n \n if (radialData.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 radial bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart \n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar \n dataKey=\"value\" \n cornerRadius={4}\n label={{ position: 'insideStart', fill: '#fff', fontSize: 12 }}\n >\n {radialData.map((entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadialBarChart 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\">Radial 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":["RadialBarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radialData","xAxisField","yAxisField","granularity","getFieldGranularity","item","index","formatTimeValue","CHART_COLORS","firstRow","keys","nameField","key","valueField","name","ChartContainer","RechartsRadialBarChart","ChartTooltip","Legend","o","RadialBar","entry","Cell","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-radialbarchart-BzRlxNfh.js","sources":["../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadialBarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? 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 radial bar chart</div>\n </div>\n </div>\n )\n }\n\n let radialData: Array<{name: string, value: number, fill?: string}>\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Value field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for values\n const valueField = keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!valueField) {\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\">No numeric field found for radial bar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radial bar chart\n radialData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n value: typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values\n radialData = radialData.filter(item => item.value != null && item.value !== 0)\n \n if (radialData.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 radial bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart \n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar \n dataKey=\"value\" \n cornerRadius={4}\n label={{ position: 'insideStart', fill: '#fff', fontSize: 12 }}\n >\n {radialData.map((entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadialBarChart 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\">Radial 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":["RadialBarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radialData","xAxisField","yAxisField","granularity","getFieldGranularity","item","index","formatTimeValue","CHART_COLORS","firstRow","keys","nameField","key","valueField","name","ChartContainer","RechartsRadialBarChart","ChartTooltip","Legend","o","RadialBar","entry","Cell","error"],"mappings":"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"}
|
package/dist/client/chunks/{chart-scatterchart-om9-qmtE.js → chart-scatterchart-DNVKc7nQ.js}
RENAMED
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as l } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as _ } from "react";
|
|
3
3
|
import { ScatterChart as H, CartesianGrid as K, XAxis as O, YAxis as B, Tooltip as Y, Legend as U, Scatter as M } from "recharts";
|
|
4
4
|
import { C as W } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { u as $, b, c as S, p as j, i as z, C as J, f as R, a as k } from "./chart-activitygridchart
|
|
5
|
+
import { u as $, b, c as S, p as j, i as z, C as J, f as R, a as k } from "./chart-activitygridchart--4a5X5eV.js";
|
|
6
6
|
function re({
|
|
7
7
|
data: N,
|
|
8
8
|
chartConfig: i,
|
|
@@ -198,4 +198,4 @@ function re({
|
|
|
198
198
|
export {
|
|
199
199
|
re as default
|
|
200
200
|
};
|
|
201
|
-
//# sourceMappingURL=chart-scatterchart-
|
|
201
|
+
//# sourceMappingURL=chart-scatterchart-DNVKc7nQ.js.map
|
package/dist/client/chunks/{chart-scatterchart-om9-qmtE.js.map → chart-scatterchart-DNVKc7nQ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-scatterchart-om9-qmtE.js","sources":["../../../src/client/components/charts/ScatterChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { ScatterChart as RechartsScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Legend, Tooltip } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatNumericValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function ScatterChart({ \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 { getFieldLabel } = useCubeContext()\n \n try {\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 scatter chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisField: string\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - handle both string and array values\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n // Normalize series to array\n const seriesConfig = chartConfig.series\n seriesFields = seriesConfig ? (Array.isArray(seriesConfig) ? seriesConfig : [seriesConfig]) : []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format (adapt for scatter chart)\n xAxisField = chartConfig.x\n yAxisField = Array.isArray(chartConfig.y) ? chartConfig.y[0] : 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 || !yAxisField) {\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 // Extract time dimensions from query for tooltip display\n const timeDimensions = queryObject?.timeDimensions || []\n const timeDimensionFields = timeDimensions.map((td: any) => td.dimension)\n\n // Transform data for scatter plot\n // Null handling: Filter out data points where x or y coordinates are null\n let scatterData: any[]\n let seriesGroups: { [key: string]: any[] } = {}\n\n if (seriesFields.length > 0) {\n // Group data by series field\n const seriesField = seriesFields[0]\n data.forEach(item => {\n const seriesValue = String(item[seriesField] || 'Default')\n if (!seriesGroups[seriesValue]) {\n seriesGroups[seriesValue] = []\n }\n\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n\n // Only add point if both x and y are valid numbers\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n if (isValidNumericValue(xNum) && yValue !== null) {\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n seriesGroups[seriesValue].push({\n x: xNum,\n y: yValue,\n name: seriesValue,\n timeValues,\n originalItem: item\n })\n }\n })\n\n // Collect all valid points from all series for validation\n // (The actual rendering uses seriesGroups with series separated)\n const seriesKeys = Object.keys(seriesGroups)\n scatterData = seriesKeys.flatMap(key => seriesGroups[key])\n } else {\n // Single series scatter plot\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n scatterData = data\n .map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n return {\n x: xNum,\n y: yValue,\n name: `Point`,\n timeValues,\n originalItem: item,\n isValid: isValidNumericValue(xNum) && yValue !== null\n }\n })\n .filter(point => point.isValid)\n }\n \n // Validate transformed data\n if (!scatterData || scatterData.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 scatter chart after transformation</div>\n </div>\n </div>\n )\n }\n\n const seriesKeys = Object.keys(seriesGroups)\n // Limit series to prevent performance issues with high-cardinality fields (e.g., dates)\n // If more than 20 unique series, fall back to single-series mode\n const MAX_SERIES = 20\n const hasSeries = seriesKeys.length > 1 && seriesKeys.length <= MAX_SERIES\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend && hasSeries\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 return (\n <ChartContainer height={height}>\n <RechartsScatterChart margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis \n type=\"number\"\n dataKey=\"x\"\n name={getFieldLabel(xAxisField)}\n tick={{ fontSize: 12 }}\n />\n <YAxis \n type=\"number\"\n dataKey=\"y\"\n name={getFieldLabel(yAxisField)}\n tick={{ fontSize: 12 }}\n label={{ value: getFieldLabel(yAxisField), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <Tooltip\n cursor={{ strokeDasharray: '3 3' }}\n content={({ active, payload }) => {\n if (!active || !payload || payload.length === 0) return null\n // Only show the first (active) point\n const point = payload[0]?.payload\n if (!point) return null\n\n return (\n <div style={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px'\n }}>\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>{point.name}</div>\n {/* Show time dimension values if present */}\n {point.timeValues && Object.keys(point.timeValues).length > 0 && (\n <div style={{ marginBottom: '4px', color: '#6b7280' }}>\n {Object.entries(point.timeValues).map(([field, value]) => (\n <div key={field}>{getFieldLabel(field)}: {value as string}</div>\n ))}\n </div>\n )}\n <div>{getFieldLabel(xAxisField)}: {formatNumericValue(point.x)}</div>\n <div>{getFieldLabel(yAxisField)}: {formatNumericValue(point.y)}</div>\n </div>\n )\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\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 {hasSeries ? (\n // Multiple series\n seriesKeys.map((seriesKey, index) => (\n <Scatter\n key={seriesKey}\n name={seriesKey}\n data={seriesGroups[seriesKey]}\n fill={(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 ))\n ) : (\n // Single series\n <Scatter\n name=\"Data\"\n data={scatterData}\n fill={(colorPalette?.colors && colorPalette.colors[0]) || CHART_COLORS[0]}\n />\n )}\n </RechartsScatterChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'ScatterChart 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\">Scatter 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":["ScatterChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeContext","safeDisplayConfig","jsx","jsxs","xAxisField","yAxisField","seriesFields","seriesConfig","timeDimensionFields","td","scatterData","seriesGroups","seriesField","item","seriesValue","xGranularity","getFieldGranularity","xValue","formatTimeValue","yValue","parseNumericValue","xNum","isValidNumericValue","timeValues","field","granularity","key","point","seriesKeys","hasSeries","showLegend","chartMargins","CHART_MARGINS","ChartContainer","RechartsScatterChart","CartesianGrid","XAxis","YAxis","Tooltip","active","payload","value","formatNumericValue","Legend","o","seriesKey","index","Scatter","CHART_COLORS","error"],"mappings":";;;;;AAQA,SAAwBA,GAAa;AAAA,EACnC,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,eAAAC,EAAA,IAAkBC,EAAA;AAE1B,MAAI;AACF,UAAMC,IAAoB;AAAA,MACxB,YAAYT,GAAe,cAAc;AAAA,MACzC,UAAUA,GAAe,YAAY;AAAA,MACrC,aAAaA,GAAe,eAAe;AAAA,IAAA;AAG7C,QAAI,CAACF,KAAQA,EAAK,WAAW;AAC3B,aACE,gBAAAY,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAR,EAAA,GACnF,UAAA,gBAAAS,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,6CAAA,CAA0C;AAAA,MAAA,EAAA,CAC5F,EAAA,CACF;AAKJ,QAAIE,GACAC,GACAC,IAAyB,CAAA;AAE7B,QAAIf,GAAa,SAASA,GAAa,OAAO;AAE5C,MAAAa,IAAa,MAAM,QAAQb,EAAY,KAAK,IAAIA,EAAY,MAAM,CAAC,IAAIA,EAAY,OACnFc,IAAa,MAAM,QAAQd,EAAY,KAAK,IAAIA,EAAY,MAAM,CAAC,IAAIA,EAAY;AAEnF,YAAMgB,IAAehB,EAAY;AACjC,MAAAe,IAAeC,IAAgB,MAAM,QAAQA,CAAY,IAAIA,IAAe,CAACA,CAAY,IAAK,CAAA;AAAA,IAChG,WAAWhB,GAAa,KAAKA,GAAa;AAExC,MAAAa,IAAab,EAAY,GACzBc,IAAa,MAAM,QAAQd,EAAY,CAAC,IAAIA,EAAY,EAAE,CAAC,IAAIA,EAAY;AAAA;AAE3E,aACE,gBAAAW,EAAC,OAAA,EAAI,WAAU,2DAA0D,OAAO,EAAE,QAAAR,EAAA,GAChF,UAAA,gBAAAS,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;AAClB,aACE,gBAAAH,EAAC,OAAA,EAAI,WAAU,2DAA0D,OAAO,EAAE,QAAAR,EAAA,GAChF,UAAA,gBAAAS,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;AAMJ,UAAMM,KADiBf,GAAa,kBAAkB,CAAA,GACX,IAAI,CAACgB,MAAYA,EAAG,SAAS;AAIxE,QAAIC,GACAC,IAAyC,CAAA;AAE7C,QAAIL,EAAa,SAAS,GAAG;AAE3B,YAAMM,IAAcN,EAAa,CAAC;AAClC,MAAAhB,EAAK,QAAQ,CAAAuB,MAAQ;AACnB,cAAMC,IAAc,OAAOD,EAAKD,CAAW,KAAK,SAAS;AACzD,QAAKD,EAAaG,CAAW,MAC3BH,EAAaG,CAAW,IAAI,CAAA;AAG9B,cAAMC,IAAeC,EAAoBvB,GAAaW,CAAU,GAC1Da,IAASC,EAAgBL,EAAKT,CAAU,GAAGW,CAAY,KAAKF,EAAKT,CAAU,GAC3Ee,IAASC,EAAkBP,EAAKR,CAAU,CAAC,GAG3CgB,IAAO,OAAOJ,KAAW,WAAW,WAAWA,CAAM,IAAIA;AAC/D,YAAIK,EAAoBD,CAAI,KAAKF,MAAW,MAAM;AAEhD,gBAAMI,IAAwC,CAAA;AAC9C,UAAAf,EAAoB,QAAQ,CAACgB,MAAkB;AAC7C,gBAAIX,EAAKW,CAAK,GAAG;AACf,oBAAMC,IAAcT,EAAoBvB,GAAa+B,CAAK;AAC1D,cAAAD,EAAWC,CAAK,IAAIN,EAAgBL,EAAKW,CAAK,GAAGC,CAAW;AAAA,YAC9D;AAAA,UACF,CAAC,GAEDd,EAAaG,CAAW,EAAE,KAAK;AAAA,YAC7B,GAAGO;AAAA,YACH,GAAGF;AAAA,YACH,MAAML;AAAA,YACN,YAAAS;AAAA,YACA,cAAcV;AAAA,UAAA,CACf;AAAA,QACH;AAAA,MACF,CAAC,GAKDH,IADmB,OAAO,KAAKC,CAAY,EAClB,QAAQ,CAAAe,MAAOf,EAAae,CAAG,CAAC;AAAA,IAC3D,OAAO;AAEL,YAAMX,IAAeC,EAAoBvB,GAAaW,CAAU;AAChE,MAAAM,IAAcpB,EACX,IAAI,CAAAuB,MAAQ;AACX,cAAMI,IAASC,EAAgBL,EAAKT,CAAU,GAAGW,CAAY,KAAKF,EAAKT,CAAU,GAC3Ee,IAASC,EAAkBP,EAAKR,CAAU,CAAC,GAC3CgB,IAAO,OAAOJ,KAAW,WAAW,WAAWA,CAAM,IAAIA,GAGzDM,IAAwC,CAAA;AAC9C,eAAAf,EAAoB,QAAQ,CAACgB,MAAkB;AAC7C,cAAIX,EAAKW,CAAK,GAAG;AACf,kBAAMC,IAAcT,EAAoBvB,GAAa+B,CAAK;AAC1D,YAAAD,EAAWC,CAAK,IAAIN,EAAgBL,EAAKW,CAAK,GAAGC,CAAW;AAAA,UAC9D;AAAA,QACF,CAAC,GAEM;AAAA,UACL,GAAGJ;AAAA,UACH,GAAGF;AAAA,UACH,MAAM;AAAA,UACN,YAAAI;AAAA,UACA,cAAcV;AAAA,UACd,SAASS,EAAoBD,CAAI,KAAKF,MAAW;AAAA,QAAA;AAAA,MAErD,CAAC,EACA,OAAO,CAAAQ,MAASA,EAAM,OAAO;AAAA,IAClC;AAGA,QAAI,CAACjB,KAAeA,EAAY,WAAW;AACzC,aACE,gBAAAR,EAAC,OAAA,EAAI,WAAU,8DAA6D,OAAO,EAAE,QAAAR,EAAA,GACnF,UAAA,gBAAAS,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,iBAAa;AAAA,QACzD,gBAAAA,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,8DAAA,CAA2D;AAAA,MAAA,EAAA,CAC7G,EAAA,CACF;AAIJ,UAAM0B,IAAa,OAAO,KAAKjB,CAAY,GAIrCkB,IAAYD,EAAW,SAAS,KAAKA,EAAW,UADnC,IAIbE,IAAa7B,EAAkB,cAAc4B,GAG7CE,IAAe;AAAA,MACnB,GAAGC;AAAA,MACH,MAAM;AAAA;AAAA,IAAA;AAGR,6BACGC,GAAA,EAAe,QAAAvC,GACd,UAAA,gBAAAS,EAAC+B,GAAA,EAAqB,QAAQH,GAC3B,UAAA;AAAA,MAAA9B,EAAkB,YACjB,gBAAAC,EAACiC,GAAA,EAAc,iBAAgB,OAAM;AAAA,MAEvC,gBAAAjC;AAAA,QAACkC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAMrC,EAAcK,CAAU;AAAA,UAC9B,MAAM,EAAE,UAAU,GAAA;AAAA,QAAG;AAAA,MAAA;AAAA,MAEvB,gBAAAF;AAAA,QAACmC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAMtC,EAAcM,CAAU;AAAA,UAC9B,MAAM,EAAE,UAAU,GAAA;AAAA,UAClB,OAAO,EAAE,OAAON,EAAcM,CAAU,GAAG,OAAO,KAAK,UAAU,QAAQ,OAAO,EAAE,YAAY,UAAU,UAAU,SAAO;AAAA,QAAE;AAAA,MAAA;AAAA,MAE5HJ,EAAkB,eACjB,gBAAAC;AAAA,QAACoC;AAAA,QAAA;AAAA,UACC,QAAQ,EAAE,iBAAiB,MAAA;AAAA,UAC3B,SAAS,CAAC,EAAE,QAAAC,GAAQ,SAAAC,QAAc;AAChC,gBAAI,CAACD,KAAU,CAACC,KAAWA,EAAQ,WAAW,EAAG,QAAO;AAExD,kBAAMb,IAAQa,EAAQ,CAAC,GAAG;AAC1B,mBAAKb,IAGH,gBAAAxB,EAAC,SAAI,OAAO;AAAA,cACV,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,OAAO;AAAA,cACP,WAAW;AAAA,cACX,SAAS;AAAA,YAAA,GAET,UAAA;AAAA,cAAA,gBAAAD,EAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,cAAc,MAAA,GAAU,UAAAyB,EAAM,KAAA,CAAK;AAAA,cAEjEA,EAAM,cAAc,OAAO,KAAKA,EAAM,UAAU,EAAE,SAAS,KAC1D,gBAAAzB,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,OAAO,OAAO,UAAA,GACvC,UAAA,OAAO,QAAQyB,EAAM,UAAU,EAAE,IAAI,CAAC,CAACH,GAAOiB,CAAK,wBACjD,OAAA,EAAiB,UAAA;AAAA,gBAAA1C,EAAcyB,CAAK;AAAA,gBAAE;AAAA,gBAAGiB;AAAA,cAAA,KAAhCjB,CAAgD,CAC3D,GACH;AAAA,gCAED,OAAA,EAAK,UAAA;AAAA,gBAAAzB,EAAcK,CAAU;AAAA,gBAAE;AAAA,gBAAGsC,EAAmBf,EAAM,CAAC;AAAA,cAAA,GAAE;AAAA,gCAC9D,OAAA,EAAK,UAAA;AAAA,gBAAA5B,EAAcM,CAAU;AAAA,gBAAE;AAAA,gBAAGqC,EAAmBf,EAAM,CAAC;AAAA,cAAA,EAAA,CAAE;AAAA,YAAA,GACjE,IAvBiB;AAAA,UAyBrB;AAAA,QAAA;AAAA,MAAA;AAAA,MAGHG,KACC,gBAAA5B;AAAA,QAACyC;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,MAAM/C,EAAiB,OAAO+C,EAAE,WAAW,EAAE,CAAC;AAAA,UAC7D,cAAc,MAAM/C,EAAiB,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAG5CgC;AAAA;AAAA,QAECD,EAAW,IAAI,CAACiB,GAAWC,MACzB,gBAAA5C;AAAA,UAAC6C;AAAA,UAAA;AAAA,YAEC,MAAMF;AAAA,YACN,MAAMlC,EAAakC,CAAS;AAAA,YAC5B,MAAOlD,GAAc,UAAUA,EAAa,OAAOmD,IAAQnD,EAAa,OAAO,MAAM,KAAMqD,EAAaF,IAAQE,EAAa,MAAM;AAAA,YACnI,aAAapD,IAAiBA,MAAkBiD,IAAY,IAAI,MAAO;AAAA,UAAA;AAAA,UAJlEA;AAAA,QAAA,CAMR;AAAA;AAAA;AAAA,QAGD,gBAAA3C;AAAA,UAAC6C;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAMrC;AAAA,YACN,MAAOf,GAAc,UAAUA,EAAa,OAAO,CAAC,KAAMqD,EAAa,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA;AAAA,IAC1E,EAAA,CAEJ,EAAA,CACF;AAAA,EAEJ,SAASC,GAAO;AAEd,WACE,gBAAA/C,EAAC,OAAA,EAAI,WAAU,qEAAoE,OAAO,EAAE,QAAAR,EAAA,GAC1F,UAAA,gBAAAS,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,uBAAmB;AAAA,MAC/D,gBAAAA,EAAC,SAAI,WAAU,gBAAgB,uBAAiB,QAAQ+C,EAAM,UAAU,0BAAA,CAA0B;AAAA,MAClG,gBAAA/C,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,mCAAA,CAAgC;AAAA,IAAA,EAAA,CAC9E,EAAA,CACF;AAAA,EAEJ;AACF;"}
|
|
1
|
+
{"version":3,"file":"chart-scatterchart-DNVKc7nQ.js","sources":["../../../src/client/components/charts/ScatterChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { ScatterChart as RechartsScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Legend, Tooltip } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatNumericValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function ScatterChart({ \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 { getFieldLabel } = useCubeContext()\n \n try {\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 scatter chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisField: string\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - handle both string and array values\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n // Normalize series to array\n const seriesConfig = chartConfig.series\n seriesFields = seriesConfig ? (Array.isArray(seriesConfig) ? seriesConfig : [seriesConfig]) : []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format (adapt for scatter chart)\n xAxisField = chartConfig.x\n yAxisField = Array.isArray(chartConfig.y) ? chartConfig.y[0] : 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 || !yAxisField) {\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 // Extract time dimensions from query for tooltip display\n const timeDimensions = queryObject?.timeDimensions || []\n const timeDimensionFields = timeDimensions.map((td: any) => td.dimension)\n\n // Transform data for scatter plot\n // Null handling: Filter out data points where x or y coordinates are null\n let scatterData: any[]\n let seriesGroups: { [key: string]: any[] } = {}\n\n if (seriesFields.length > 0) {\n // Group data by series field\n const seriesField = seriesFields[0]\n data.forEach(item => {\n const seriesValue = String(item[seriesField] || 'Default')\n if (!seriesGroups[seriesValue]) {\n seriesGroups[seriesValue] = []\n }\n\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n\n // Only add point if both x and y are valid numbers\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n if (isValidNumericValue(xNum) && yValue !== null) {\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n seriesGroups[seriesValue].push({\n x: xNum,\n y: yValue,\n name: seriesValue,\n timeValues,\n originalItem: item\n })\n }\n })\n\n // Collect all valid points from all series for validation\n // (The actual rendering uses seriesGroups with series separated)\n const seriesKeys = Object.keys(seriesGroups)\n scatterData = seriesKeys.flatMap(key => seriesGroups[key])\n } else {\n // Single series scatter plot\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n scatterData = data\n .map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n return {\n x: xNum,\n y: yValue,\n name: `Point`,\n timeValues,\n originalItem: item,\n isValid: isValidNumericValue(xNum) && yValue !== null\n }\n })\n .filter(point => point.isValid)\n }\n \n // Validate transformed data\n if (!scatterData || scatterData.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 scatter chart after transformation</div>\n </div>\n </div>\n )\n }\n\n const seriesKeys = Object.keys(seriesGroups)\n // Limit series to prevent performance issues with high-cardinality fields (e.g., dates)\n // If more than 20 unique series, fall back to single-series mode\n const MAX_SERIES = 20\n const hasSeries = seriesKeys.length > 1 && seriesKeys.length <= MAX_SERIES\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend && hasSeries\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 return (\n <ChartContainer height={height}>\n <RechartsScatterChart margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis \n type=\"number\"\n dataKey=\"x\"\n name={getFieldLabel(xAxisField)}\n tick={{ fontSize: 12 }}\n />\n <YAxis \n type=\"number\"\n dataKey=\"y\"\n name={getFieldLabel(yAxisField)}\n tick={{ fontSize: 12 }}\n label={{ value: getFieldLabel(yAxisField), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <Tooltip\n cursor={{ strokeDasharray: '3 3' }}\n content={({ active, payload }) => {\n if (!active || !payload || payload.length === 0) return null\n // Only show the first (active) point\n const point = payload[0]?.payload\n if (!point) return null\n\n return (\n <div style={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px'\n }}>\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>{point.name}</div>\n {/* Show time dimension values if present */}\n {point.timeValues && Object.keys(point.timeValues).length > 0 && (\n <div style={{ marginBottom: '4px', color: '#6b7280' }}>\n {Object.entries(point.timeValues).map(([field, value]) => (\n <div key={field}>{getFieldLabel(field)}: {value as string}</div>\n ))}\n </div>\n )}\n <div>{getFieldLabel(xAxisField)}: {formatNumericValue(point.x)}</div>\n <div>{getFieldLabel(yAxisField)}: {formatNumericValue(point.y)}</div>\n </div>\n )\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\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 {hasSeries ? (\n // Multiple series\n seriesKeys.map((seriesKey, index) => (\n <Scatter\n key={seriesKey}\n name={seriesKey}\n data={seriesGroups[seriesKey]}\n fill={(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 ))\n ) : (\n // Single series\n <Scatter\n name=\"Data\"\n data={scatterData}\n fill={(colorPalette?.colors && colorPalette.colors[0]) || CHART_COLORS[0]}\n />\n )}\n </RechartsScatterChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'ScatterChart 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\">Scatter 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":["ScatterChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeContext","safeDisplayConfig","jsx","jsxs","xAxisField","yAxisField","seriesFields","seriesConfig","timeDimensionFields","td","scatterData","seriesGroups","seriesField","item","seriesValue","xGranularity","getFieldGranularity","xValue","formatTimeValue","yValue","parseNumericValue","xNum","isValidNumericValue","timeValues","field","granularity","key","point","seriesKeys","hasSeries","showLegend","chartMargins","CHART_MARGINS","ChartContainer","RechartsScatterChart","CartesianGrid","XAxis","YAxis","Tooltip","active","payload","value","formatNumericValue","Legend","o","seriesKey","index","Scatter","CHART_COLORS","error"],"mappings":"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"}
|
package/dist/client/chunks/{chart-treemapchart-Dc35Miif.js → chart-treemapchart-CworQneQ.js}
RENAMED
|
@@ -2,8 +2,8 @@ import { jsx as r, jsxs as p } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as V } from "react";
|
|
3
3
|
import { Treemap as O } from "recharts";
|
|
4
4
|
import { C as R } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as D } from "./chart-charttooltip-
|
|
6
|
-
import { u as E, b as I, q as H, h as N, c as b, o as q, a as h } from "./chart-activitygridchart
|
|
5
|
+
import { C as D } from "./chart-charttooltip-CyhJAnW_.js";
|
|
6
|
+
import { u as E, b as I, q as H, h as N, c as b, o as q, a as h } from "./chart-activitygridchart--4a5X5eV.js";
|
|
7
7
|
function J({
|
|
8
8
|
data: c,
|
|
9
9
|
chartConfig: m,
|
|
@@ -250,4 +250,4 @@ function J({
|
|
|
250
250
|
export {
|
|
251
251
|
J as default
|
|
252
252
|
};
|
|
253
|
-
//# sourceMappingURL=chart-treemapchart-
|
|
253
|
+
//# sourceMappingURL=chart-treemapchart-CworQneQ.js.map
|
package/dist/client/chunks/{chart-treemapchart-Dc35Miif.js.map → chart-treemapchart-CworQneQ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-treemapchart-Dc35Miif.js","sources":["../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { Treemap } from 'recharts'\nimport { scaleQuantize, scaleOrdinal } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function TreeMapChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const { getFieldLabel } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? 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 treemap chart</div>\n </div>\n </div>\n )\n }\n\n let treemapData: Array<{name: string, size: number, fill?: string, series?: string}>\n let isNumericSeries = false\n let seriesField: string | undefined\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Size field\n seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series // Color grouping field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n \n if (seriesField) {\n // Check if series field is numeric for color scaling\n const seriesValues = data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter(val => !isNaN(val))\n \n isNumericSeries = seriesValues.length === data.length && seriesValues.every(val => typeof val === 'number')\n \n \n if (isNumericSeries) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...seriesValues)\n const maxValue = Math.max(...seriesValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n const colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n \n treemapData = data.map((item) => {\n const seriesValue = typeof item[seriesField!] === 'string' \n ? parseFloat(item[seriesField!]) \n : item[seriesField!]\n \n const color = colorScale(seriesValue)\n \n return {\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: color,\n series: String(item[seriesField!])\n }\n })\n } else {\n // Use D3 ordinal color scale for categorical series\n const uniqueSeriesValues = [...new Set(data.map(item => String(item[seriesField!])))]\n const colorScale = scaleOrdinal<string>()\n .domain(uniqueSeriesValues)\n .range(colorPalette?.colors || CHART_COLORS)\n \n treemapData = data.map((item) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: colorScale(String(item[seriesField!])),\n series: String(item[seriesField!])\n }))\n }\n } else {\n // No series grouping - use index-based colors\n treemapData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for size - look for 'size' field first, then any numeric\n const sizeField = keys.find(key => key.toLowerCase().includes('size')) ||\n keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!sizeField) {\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\">No numeric field found for treemap chart size</div>\n </div>\n </div>\n )\n }\n\n // Transform data for treemap chart\n treemapData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n size: typeof item[sizeField] === 'string' \n ? parseFloat(item[sizeField]) \n : (item[sizeField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values and ensure positive sizes\n treemapData = treemapData.filter(item => item.size != null && item.size > 0)\n \n if (treemapData.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 treemap chart after transformation</div>\n </div>\n </div>\n )\n }\n\n // Custom content renderer for treemap cells with HTML overlays\n const CustomizedContent = (props: any) => {\n const { x, y, width, height, index, name, size } = props\n \n if (width < 20 || height < 20) return null // Don't render content for very small cells\n \n return (\n <g>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n style={{\n fill: treemapData[index]?.fill || ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]),\n fillOpacity: hoveredIndex !== null ? (hoveredIndex === index ? 1 : 0.6) : 0.8,\n stroke: '#fff',\n strokeWidth: 2,\n cursor: 'pointer'\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n />\n <foreignObject \n x={x} \n y={y} \n width={width} \n height={height}\n style={{ pointerEvents: 'none', overflow: 'visible' }}\n >\n <div \n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n boxSizing: 'border-box',\n color: '#ffffff',\n textShadow: '0 1px 2px rgba(0,0,0,0.8)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden'\n }}\n >\n {width > 40 && height > 30 && (\n <div \n style={{\n fontSize: `${Math.max(10, Math.min(width / 8, height / 8, 16))}px`,\n fontWeight: '600',\n textAlign: 'center',\n lineHeight: '1.2',\n marginBottom: width > 60 && height > 45 ? '4px' : '0',\n wordBreak: 'break-word',\n hyphens: 'auto'\n }}\n >\n {name}\n </div>\n )}\n {width > 60 && height > 45 && (\n <div \n style={{\n fontSize: `${Math.max(8, Math.min(width / 10, height / 10, 14))}px`,\n textAlign: 'center',\n opacity: 0.9\n }}\n >\n {typeof size === 'number' ? size.toLocaleString() : size}\n </div>\n )}\n </div>\n </foreignObject>\n </g>\n )\n }\n\n // Check if we have series data for legend\n const hasSeriesData = treemapData.some(item => 'series' in item)\n const uniqueSeries = hasSeriesData \n ? [...new Set(treemapData.map(item => item.series).filter(Boolean))]\n : []\n \n // For numeric series, create a legend showing the color scale\n let legendPayload: any[] = []\n if (safeDisplayConfig.showLegend && seriesField) {\n \n if (isNumericSeries) {\n // Create color scale legend for numeric values\n const minValue = Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n const maxValue = Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n \n \n // Create legend entries showing color scale\n legendPayload = CHART_COLORS_GRADIENT.map((color, index) => {\n const ratio = index / (CHART_COLORS_GRADIENT.length - 1)\n const value = minValue + (maxValue - minValue) * ratio\n return {\n value: value.toFixed(2),\n type: 'rect',\n color: color\n }\n })\n } else if (uniqueSeries.length > 1) {\n // Use categorical legend for non-numeric series\n legendPayload = uniqueSeries.map((series, index) => ({\n value: series,\n type: 'rect',\n color: CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n \n }\n\n // Calculate height adjustment for legend\n const hasLegend = safeDisplayConfig.showLegend && legendPayload.length > 0\n const adjustedHeight = hasLegend \n ? (typeof height === 'string' && height.includes('%') \n ? height \n : typeof height === 'number' \n ? height + 60 \n : `calc(${height} + 60px)`)\n : height\n\n return (\n <div className=\"w-full\" style={{ height: adjustedHeight }}>\n <ChartContainer height={hasLegend ? `calc(100% - 50px)` : \"100%\"}>\n <Treemap\n data={treemapData}\n dataKey=\"size\"\n aspectRatio={4/3}\n stroke=\"#fff\"\n content={<CustomizedContent />}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n </Treemap>\n </ChartContainer>\n \n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <div className=\"flex justify-center items-center mt-4 pb-2\">\n {isNumericSeries ? (\n // Gradient legend for numeric series\n <div className=\"flex flex-col items-center\">\n <div className=\"text-xs font-semibold text-dc-text-primary mb-2\">\n {seriesField ? getFieldLabel(seriesField) : ''}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-dc-text-muted\">\n {Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)}\n </span>\n <div\n className=\"h-4 rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)}\n </span>\n </div>\n </div>\n ) : (\n // Discrete legend for categorical series\n <div className=\"flex flex-wrap justify-center gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-xs\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n } catch (error) {\n // 'TreeMapChart 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\">TreeMap 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":["TreeMapChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredIndex","setHoveredIndex","useState","getFieldLabel","useCubeContext","safeDisplayConfig","jsx","jsxs","treemapData","isNumericSeries","seriesField","xAxisField","yAxisField","granularity","getFieldGranularity","seriesValues","item","value","val","minValue","maxValue","colorScale","scaleQuantize","CHART_COLORS_GRADIENT","seriesValue","color","formatTimeValue","uniqueSeriesValues","scaleOrdinal","CHART_COLORS","index","firstRow","keys","nameField","key","sizeField","name","CustomizedContent","props","x","y","width","size","uniqueSeries","legendPayload","ratio","series","hasLegend","adjustedHeight","ChartContainer","Treemap","ChartTooltip","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-treemapchart-CworQneQ.js","sources":["../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { Treemap } from 'recharts'\nimport { scaleQuantize, scaleOrdinal } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function TreeMapChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const { getFieldLabel } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? 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 treemap chart</div>\n </div>\n </div>\n )\n }\n\n let treemapData: Array<{name: string, size: number, fill?: string, series?: string}>\n let isNumericSeries = false\n let seriesField: string | undefined\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Size field\n seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series // Color grouping field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n \n if (seriesField) {\n // Check if series field is numeric for color scaling\n const seriesValues = data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter(val => !isNaN(val))\n \n isNumericSeries = seriesValues.length === data.length && seriesValues.every(val => typeof val === 'number')\n \n \n if (isNumericSeries) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...seriesValues)\n const maxValue = Math.max(...seriesValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n const colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n \n treemapData = data.map((item) => {\n const seriesValue = typeof item[seriesField!] === 'string' \n ? parseFloat(item[seriesField!]) \n : item[seriesField!]\n \n const color = colorScale(seriesValue)\n \n return {\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: color,\n series: String(item[seriesField!])\n }\n })\n } else {\n // Use D3 ordinal color scale for categorical series\n const uniqueSeriesValues = [...new Set(data.map(item => String(item[seriesField!])))]\n const colorScale = scaleOrdinal<string>()\n .domain(uniqueSeriesValues)\n .range(colorPalette?.colors || CHART_COLORS)\n \n treemapData = data.map((item) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: colorScale(String(item[seriesField!])),\n series: String(item[seriesField!])\n }))\n }\n } else {\n // No series grouping - use index-based colors\n treemapData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for size - look for 'size' field first, then any numeric\n const sizeField = keys.find(key => key.toLowerCase().includes('size')) ||\n keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!sizeField) {\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\">No numeric field found for treemap chart size</div>\n </div>\n </div>\n )\n }\n\n // Transform data for treemap chart\n treemapData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n size: typeof item[sizeField] === 'string' \n ? parseFloat(item[sizeField]) \n : (item[sizeField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values and ensure positive sizes\n treemapData = treemapData.filter(item => item.size != null && item.size > 0)\n \n if (treemapData.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 treemap chart after transformation</div>\n </div>\n </div>\n )\n }\n\n // Custom content renderer for treemap cells with HTML overlays\n const CustomizedContent = (props: any) => {\n const { x, y, width, height, index, name, size } = props\n \n if (width < 20 || height < 20) return null // Don't render content for very small cells\n \n return (\n <g>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n style={{\n fill: treemapData[index]?.fill || ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]),\n fillOpacity: hoveredIndex !== null ? (hoveredIndex === index ? 1 : 0.6) : 0.8,\n stroke: '#fff',\n strokeWidth: 2,\n cursor: 'pointer'\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n />\n <foreignObject \n x={x} \n y={y} \n width={width} \n height={height}\n style={{ pointerEvents: 'none', overflow: 'visible' }}\n >\n <div \n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n boxSizing: 'border-box',\n color: '#ffffff',\n textShadow: '0 1px 2px rgba(0,0,0,0.8)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden'\n }}\n >\n {width > 40 && height > 30 && (\n <div \n style={{\n fontSize: `${Math.max(10, Math.min(width / 8, height / 8, 16))}px`,\n fontWeight: '600',\n textAlign: 'center',\n lineHeight: '1.2',\n marginBottom: width > 60 && height > 45 ? '4px' : '0',\n wordBreak: 'break-word',\n hyphens: 'auto'\n }}\n >\n {name}\n </div>\n )}\n {width > 60 && height > 45 && (\n <div \n style={{\n fontSize: `${Math.max(8, Math.min(width / 10, height / 10, 14))}px`,\n textAlign: 'center',\n opacity: 0.9\n }}\n >\n {typeof size === 'number' ? size.toLocaleString() : size}\n </div>\n )}\n </div>\n </foreignObject>\n </g>\n )\n }\n\n // Check if we have series data for legend\n const hasSeriesData = treemapData.some(item => 'series' in item)\n const uniqueSeries = hasSeriesData \n ? [...new Set(treemapData.map(item => item.series).filter(Boolean))]\n : []\n \n // For numeric series, create a legend showing the color scale\n let legendPayload: any[] = []\n if (safeDisplayConfig.showLegend && seriesField) {\n \n if (isNumericSeries) {\n // Create color scale legend for numeric values\n const minValue = Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n const maxValue = Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n \n \n // Create legend entries showing color scale\n legendPayload = CHART_COLORS_GRADIENT.map((color, index) => {\n const ratio = index / (CHART_COLORS_GRADIENT.length - 1)\n const value = minValue + (maxValue - minValue) * ratio\n return {\n value: value.toFixed(2),\n type: 'rect',\n color: color\n }\n })\n } else if (uniqueSeries.length > 1) {\n // Use categorical legend for non-numeric series\n legendPayload = uniqueSeries.map((series, index) => ({\n value: series,\n type: 'rect',\n color: CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n \n }\n\n // Calculate height adjustment for legend\n const hasLegend = safeDisplayConfig.showLegend && legendPayload.length > 0\n const adjustedHeight = hasLegend \n ? (typeof height === 'string' && height.includes('%') \n ? height \n : typeof height === 'number' \n ? height + 60 \n : `calc(${height} + 60px)`)\n : height\n\n return (\n <div className=\"w-full\" style={{ height: adjustedHeight }}>\n <ChartContainer height={hasLegend ? `calc(100% - 50px)` : \"100%\"}>\n <Treemap\n data={treemapData}\n dataKey=\"size\"\n aspectRatio={4/3}\n stroke=\"#fff\"\n content={<CustomizedContent />}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip />\n )}\n </Treemap>\n </ChartContainer>\n \n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <div className=\"flex justify-center items-center mt-4 pb-2\">\n {isNumericSeries ? (\n // Gradient legend for numeric series\n <div className=\"flex flex-col items-center\">\n <div className=\"text-xs font-semibold text-dc-text-primary mb-2\">\n {seriesField ? getFieldLabel(seriesField) : ''}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-dc-text-muted\">\n {Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)}\n </span>\n <div\n className=\"h-4 rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)}\n </span>\n </div>\n </div>\n ) : (\n // Discrete legend for categorical series\n <div className=\"flex flex-wrap justify-center gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-xs\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n } catch (error) {\n // 'TreeMapChart 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\">TreeMap 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":["TreeMapChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredIndex","setHoveredIndex","useState","getFieldLabel","useCubeContext","safeDisplayConfig","jsx","jsxs","treemapData","isNumericSeries","seriesField","xAxisField","yAxisField","granularity","getFieldGranularity","seriesValues","item","value","val","minValue","maxValue","colorScale","scaleQuantize","CHART_COLORS_GRADIENT","seriesValue","color","formatTimeValue","uniqueSeriesValues","scaleOrdinal","CHART_COLORS","index","firstRow","keys","nameField","key","sizeField","name","CustomizedContent","props","x","y","width","size","uniqueSeries","legendPayload","ratio","series","hasLegend","adjustedHeight","ChartContainer","Treemap","ChartTooltip","error"],"mappings":"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"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { jsx as u } from "react/jsx-runtime";
|
|
2
2
|
import { Suspense as h, lazy as g, useState as l, useEffect as y } from "react";
|
|
3
|
-
import "./chart-activitygridchart
|
|
4
|
-
import "./chart-barchart-
|
|
5
|
-
import "./chart-linechart-
|
|
6
|
-
import "./chart-areachart-
|
|
7
|
-
import "./chart-piechart-
|
|
8
|
-
import "./chart-scatterchart-
|
|
9
|
-
import "./chart-radarchart-
|
|
10
|
-
import "./chart-radialbarchart-
|
|
11
|
-
import "./chart-treemapchart-
|
|
12
|
-
import "./chart-datatable-
|
|
3
|
+
import "./chart-activitygridchart--4a5X5eV.js";
|
|
4
|
+
import "./chart-barchart-CJzMunji.js";
|
|
5
|
+
import "./chart-linechart-4AF7Q_zF.js";
|
|
6
|
+
import "./chart-areachart-C_luzpU9.js";
|
|
7
|
+
import "./chart-piechart-Bf4TMIJP.js";
|
|
8
|
+
import "./chart-scatterchart-DNVKc7nQ.js";
|
|
9
|
+
import "./chart-radarchart-DYar9VDH.js";
|
|
10
|
+
import "./chart-radialbarchart-BzRlxNfh.js";
|
|
11
|
+
import "./chart-treemapchart-CworQneQ.js";
|
|
12
|
+
import "./chart-datatable-xonQ9udl.js";
|
|
13
13
|
const c = /* @__PURE__ */ new Map(), p = {
|
|
14
|
-
bar: () => import("./chart-barchart-
|
|
15
|
-
line: () => import("./chart-linechart-
|
|
16
|
-
area: () => import("./chart-areachart-
|
|
17
|
-
pie: () => import("./chart-piechart-
|
|
18
|
-
scatter: () => import("./chart-scatterchart-
|
|
19
|
-
radar: () => import("./chart-radarchart-
|
|
20
|
-
radialBar: () => import("./chart-radialbarchart-
|
|
21
|
-
treemap: () => import("./chart-treemapchart-
|
|
22
|
-
bubble: () => import("./chart-bubblechart-
|
|
23
|
-
table: () => import("./chart-datatable-
|
|
24
|
-
activityGrid: () => import("./chart-activitygridchart
|
|
25
|
-
kpiNumber: () => import("./chart-kpinumber-
|
|
26
|
-
kpiDelta: () => import("./chart-kpidelta-
|
|
27
|
-
kpiText: () => import("./chart-kpitext-
|
|
14
|
+
bar: () => import("./chart-barchart-CJzMunji.js"),
|
|
15
|
+
line: () => import("./chart-linechart-4AF7Q_zF.js"),
|
|
16
|
+
area: () => import("./chart-areachart-C_luzpU9.js").then((t) => t.a),
|
|
17
|
+
pie: () => import("./chart-piechart-Bf4TMIJP.js"),
|
|
18
|
+
scatter: () => import("./chart-scatterchart-DNVKc7nQ.js"),
|
|
19
|
+
radar: () => import("./chart-radarchart-DYar9VDH.js"),
|
|
20
|
+
radialBar: () => import("./chart-radialbarchart-BzRlxNfh.js"),
|
|
21
|
+
treemap: () => import("./chart-treemapchart-CworQneQ.js"),
|
|
22
|
+
bubble: () => import("./chart-bubblechart-DPyYu4B-.js"),
|
|
23
|
+
table: () => import("./chart-datatable-xonQ9udl.js"),
|
|
24
|
+
activityGrid: () => import("./chart-activitygridchart--4a5X5eV.js").then((t) => t.I),
|
|
25
|
+
kpiNumber: () => import("./chart-kpinumber-CiOvJAlz.js").then((t) => t.K),
|
|
26
|
+
kpiDelta: () => import("./chart-kpidelta-DTq92DyT.js").then((t) => t.K),
|
|
27
|
+
kpiText: () => import("./chart-kpitext-D5kNrcSl.js"),
|
|
28
28
|
markdown: () => import("./chart-markdownchart-C3FAQFuO.js")
|
|
29
29
|
};
|
|
30
30
|
function b(t) {
|
|
@@ -263,12 +263,12 @@ function Z() {
|
|
|
263
263
|
export {
|
|
264
264
|
P as L,
|
|
265
265
|
q as a,
|
|
266
|
-
|
|
266
|
+
Q as b,
|
|
267
267
|
_ as c,
|
|
268
268
|
D as d,
|
|
269
269
|
U as e,
|
|
270
270
|
H as f,
|
|
271
|
-
|
|
271
|
+
z as g,
|
|
272
272
|
W as h,
|
|
273
273
|
J as i,
|
|
274
274
|
Z as j,
|
|
@@ -283,4 +283,4 @@ export {
|
|
|
283
283
|
K as u,
|
|
284
284
|
X as v
|
|
285
285
|
};
|
|
286
|
-
//# sourceMappingURL=charts-
|
|
286
|
+
//# sourceMappingURL=charts-Cjl5gNIQ.js.map
|