drizzle-cube 0.4.21 → 0.4.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +2 -2
- package/dist/adapters/{handler-B-tEntiU.cjs → handler-C3hT7g2W.cjs} +1 -1
- package/dist/adapters/{handler-9Rdn7zM2.js → handler-t7Qd1IYi.js} +1 -1
- package/dist/adapters/hono/index.cjs +6 -6
- package/dist/adapters/hono/index.d.ts +13 -6
- package/dist/adapters/hono/index.js +65 -65
- package/dist/adapters/{mcp-transport-m1X1GtwG.js → mcp-transport-B6ZudTSk.js} +7 -0
- package/dist/adapters/{mcp-transport-8u9G5oNa.cjs → mcp-transport-DCiSGtp1.cjs} +1 -1
- package/dist/adapters/nextjs/index.cjs +2 -2
- package/dist/adapters/nextjs/index.js +2 -2
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{RetentionCombinedChart-CLq89aOJ.js → RetentionCombinedChart-BK3NPsHP.js} +2 -2
- package/dist/client/chunks/{RetentionCombinedChart-CLq89aOJ.js.map → RetentionCombinedChart-BK3NPsHP.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-3z9fHE2F.js → analysis-builder-DVrv9Q4n.js} +9 -9
- package/dist/client/chunks/{analysis-builder-3z9fHE2F.js.map → analysis-builder-DVrv9Q4n.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-Da-vlQa_.js → analysis-builder-shared-CrENEvEk.js} +6 -6
- package/dist/client/chunks/{analysis-builder-shared-Da-vlQa_.js.map → analysis-builder-shared-CrENEvEk.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-CPGcTSuh.js → chart-activity-grid-OG6he4YS.js} +2 -2
- package/dist/client/chunks/{chart-activity-grid-CPGcTSuh.js.map → chart-activity-grid-OG6he4YS.js.map} +1 -1
- package/dist/client/chunks/{chart-area-ByJQ7NZd.js → chart-area-TawAd2k9.js} +3 -3
- package/dist/client/chunks/{chart-area-ByJQ7NZd.js.map → chart-area-TawAd2k9.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-dj14frMt.js → chart-bar-D3vtCNQG.js} +2 -2
- package/dist/client/chunks/{chart-bar-dj14frMt.js.map → chart-bar-D3vtCNQG.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-ZatBpatq.js → chart-box-plot-BXwN2rO5.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-ZatBpatq.js.map → chart-box-plot-BXwN2rO5.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-CemotLx-.js → chart-bubble-ZfNe8t5k.js} +2 -2
- package/dist/client/chunks/{chart-bubble-CemotLx-.js.map → chart-bubble-ZfNe8t5k.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-BIR4uGGt.js → chart-candlestick-DmF3haFu.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-BIR4uGGt.js.map → chart-candlestick-DmF3haFu.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-BsAjHe7o.js → chart-data-table-DJZPkArt.js} +4 -4
- package/dist/client/chunks/{chart-data-table-BsAjHe7o.js.map → chart-data-table-DJZPkArt.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-dofnhD24.js → chart-funnel-CE9x0Io9.js} +2 -2
- package/dist/client/chunks/{chart-funnel-dofnhD24.js.map → chart-funnel-CE9x0Io9.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-CKJJ8m3b.js → chart-gauge-Djs5FWxB.js} +2 -2
- package/dist/client/chunks/{chart-gauge-CKJJ8m3b.js.map → chart-gauge-Djs5FWxB.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-BVuPUKHT.js → chart-heat-map-CqtMkdxd.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-BVuPUKHT.js.map → chart-heat-map-CqtMkdxd.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-DUD3f8vL.js → chart-kpi-delta-DEzA74cL.js} +4 -4
- package/dist/client/chunks/{chart-kpi-delta-DUD3f8vL.js.map → chart-kpi-delta-DEzA74cL.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-iJh-PzsM.js → chart-kpi-number-Bab-BZtX.js} +3 -3
- package/dist/client/chunks/{chart-kpi-number-iJh-PzsM.js.map → chart-kpi-number-Bab-BZtX.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-x6pV9v9Q.js → chart-kpi-text-BkTgckDJ.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-x6pV9v9Q.js.map → chart-kpi-text-BkTgckDJ.js.map} +1 -1
- package/dist/client/chunks/{chart-line-DzyZkugh.js → chart-line-DhM-Hvu0.js} +3 -3
- package/dist/client/chunks/{chart-line-DzyZkugh.js.map → chart-line-DhM-Hvu0.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-C2IkBG3V.js → chart-measure-profile-4vQxFm69.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-C2IkBG3V.js.map → chart-measure-profile-4vQxFm69.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-akbfRfb9.js → chart-pie-B86KRcHI.js} +2 -2
- package/dist/client/chunks/{chart-pie-akbfRfb9.js.map → chart-pie-B86KRcHI.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-BaN-Kjww.js → chart-radar-BhDBmJRh.js} +2 -2
- package/dist/client/chunks/{chart-radar-BaN-Kjww.js.map → chart-radar-BhDBmJRh.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-DpptEL3s.js → chart-radial-bar-Brugya8X.js} +2 -2
- package/dist/client/chunks/{chart-radial-bar-DpptEL3s.js.map → chart-radial-bar-Brugya8X.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-CG-3hHmX.js → chart-sankey-D2L8ympI.js} +2 -2
- package/dist/client/chunks/{chart-sankey-CG-3hHmX.js.map → chart-sankey-D2L8ympI.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-l_yTVxF3.js → chart-scatter-CAkbBDkK.js} +2 -2
- package/dist/client/chunks/{chart-scatter-l_yTVxF3.js.map → chart-scatter-CAkbBDkK.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-KhDcKhmZ.js → chart-sunburst-DaxJ-cob.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-KhDcKhmZ.js.map → chart-sunburst-DaxJ-cob.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-CBbiaBXV.js → chart-tree-map-CrDJAvZU.js} +2 -2
- package/dist/client/chunks/{chart-tree-map-CBbiaBXV.js.map → chart-tree-map-CrDJAvZU.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-CX3vx_lI.js → chart-waterfall-BBwSfEKT.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-CX3vx_lI.js.map → chart-waterfall-BBwSfEKT.js.map} +1 -1
- package/dist/client/chunks/{charts-core-CU9u_HtL.js → charts-core-B4Rbfdcn.js} +2 -2
- package/dist/client/chunks/{charts-core-CU9u_HtL.js.map → charts-core-B4Rbfdcn.js.map} +1 -1
- package/dist/client/chunks/{charts-loader-B3tt5oKG.js → charts-loader-DbrwgvCK.js} +25 -25
- package/dist/client/chunks/{charts-loader-B3tt5oKG.js.map → charts-loader-DbrwgvCK.js.map} +1 -1
- package/dist/client/chunks/{components-CMGGxqOB.js → components-GzooQM5J.js} +9 -9
- package/dist/client/chunks/{components-CMGGxqOB.js.map → components-GzooQM5J.js.map} +1 -1
- package/dist/client/chunks/{core-D_8mkGpQ.js → core-Y9e-sNfb.js} +2 -2
- package/dist/client/chunks/{core-D_8mkGpQ.js.map → core-Y9e-sNfb.js.map} +1 -1
- package/dist/client/chunks/{icons-M7shurcH.js → icons-DFJw-2HU.js} +6 -6
- package/dist/client/chunks/{icons-M7shurcH.js.map → icons-DFJw-2HU.js.map} +1 -1
- package/dist/client/chunks/{providers-CgxXm6Ll.js → providers-CCw8Kjlc.js} +2 -2
- package/dist/client/chunks/{providers-CgxXm6Ll.js.map → providers-CCw8Kjlc.js.map} +1 -1
- package/dist/client/chunks/{syntaxHighlighting-BQfjio-i.js → syntaxHighlighting-DAMSW_A6.js} +2 -2
- package/dist/client/chunks/{syntaxHighlighting-BQfjio-i.js.map → syntaxHighlighting-DAMSW_A6.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-Cu1HSjmo.js → useDirtyStateTracking-CjhwBXRw.js} +20 -20
- package/dist/client/chunks/{useDirtyStateTracking-Cu1HSjmo.js.map → useDirtyStateTracking-CjhwBXRw.js.map} +1 -1
- package/dist/client/chunks/useExplainAI-IiW55BaQ.js +182 -0
- package/dist/client/chunks/useExplainAI-IiW55BaQ.js.map +1 -0
- package/dist/client/chunks/{vendor-AVsJ2ni0.js → vendor-B2EH3V58.js} +7 -7
- package/dist/client/chunks/{vendor-AVsJ2ni0.js.map → vendor-B2EH3V58.js.map} +1 -1
- package/dist/client/components.js +1 -1
- package/dist/client/hooks/useNotebookLayout.d.ts +8 -0
- package/dist/client/hooks.d.ts +2 -0
- package/dist/client/hooks.js +51 -190
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +871 -742
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/utils.js +7 -7
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.js +7 -0
- package/package.json +1 -1
package/dist/client/chunks/{chart-tree-map-CBbiaBXV.js.map → chart-tree-map-CrDJAvZU.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-tree-map-CBbiaBXV.js","sources":["../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["import React, { 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, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst TreeMapChart = React.memo(function TreeMapChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in 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=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc: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=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No valid data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No valid data points for 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 const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation()\n const cellData = treemapData[index]\n if (cellData && onDataPointClick) {\n // Use query measures for proper field name (chartConfig.yAxis may contain display labels)\n const measureField = queryObject?.measures?.[0] || chartConfig?.yAxis?.[0] || ''\n onDataPointClick({\n dataPoint: cellData,\n clickedField: measureField,\n xValue: name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }\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: drillEnabled ? 'pointer' : 'default',\n pointerEvents: 'all' // Ensure rect captures click events\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={drillEnabled && onDataPointClick ? handleClick : undefined}\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 {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(size, safeDisplayConfig.leftYAxisFormat)\n : (typeof size === 'number' ? size.toLocaleString() : size)\n }\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: safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : 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=\"dc: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 formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n </Treemap>\n </ChartContainer>\n \n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <div className=\"dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2\">\n {isNumericSeries ? (\n // Gradient legend for numeric series\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n <div className=\"dc:text-xs dc:font-semibold text-dc-text-primary dc:mb-2\">\n {seriesField ? getFieldLabel(seriesField) : ''}\n </div>\n <div className=\"dc:flex dc:items-center dc:gap-2\">\n <span className=\"dc:text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n <div\n className=\"dc:h-4 dc:rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"dc:text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n </div>\n </div>\n ) : (\n // Discrete legend for categorical series\n <div className=\"dc:flex dc:flex-wrap dc:justify-center dc:gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"dc:flex dc:items-center dc:gap-2\">\n <div\n className=\"dc:w-3 dc:h-3 rounded-xs\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"dc: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=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">TreeMap Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default TreeMapChart"],"names":["TreeMapChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","onDataPointClick","drillEnabled","hoveredIndex","setHoveredIndex","useState","getFieldLabel","useCubeFieldLabel","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","handleClick","event","cellData","measureField","formatAxisValue","uniqueSeries","legendPayload","ratio","series","hasLegend","adjustedHeight","ChartContainer","Treemap","ChartTooltip","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-tree-map-CrDJAvZU.js","sources":["../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["import React, { 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, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst TreeMapChart = React.memo(function TreeMapChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in 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=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc: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=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No valid data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No valid data points for 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 const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation()\n const cellData = treemapData[index]\n if (cellData && onDataPointClick) {\n // Use query measures for proper field name (chartConfig.yAxis may contain display labels)\n const measureField = queryObject?.measures?.[0] || chartConfig?.yAxis?.[0] || ''\n onDataPointClick({\n dataPoint: cellData,\n clickedField: measureField,\n xValue: name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }\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: drillEnabled ? 'pointer' : 'default',\n pointerEvents: 'all' // Ensure rect captures click events\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={drillEnabled && onDataPointClick ? handleClick : undefined}\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 {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(size, safeDisplayConfig.leftYAxisFormat)\n : (typeof size === 'number' ? size.toLocaleString() : size)\n }\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: safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : 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=\"dc: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 formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n </Treemap>\n </ChartContainer>\n \n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <div className=\"dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2\">\n {isNumericSeries ? (\n // Gradient legend for numeric series\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n <div className=\"dc:text-xs dc:font-semibold text-dc-text-primary dc:mb-2\">\n {seriesField ? getFieldLabel(seriesField) : ''}\n </div>\n <div className=\"dc:flex dc:items-center dc:gap-2\">\n <span className=\"dc:text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n <div\n className=\"dc:h-4 dc:rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"dc:text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n </div>\n </div>\n ) : (\n // Discrete legend for categorical series\n <div className=\"dc:flex dc:flex-wrap dc:justify-center dc:gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"dc:flex dc:items-center dc:gap-2\">\n <div\n className=\"dc:w-3 dc:h-3 rounded-xs\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"dc: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=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">TreeMap Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default TreeMapChart"],"names":["TreeMapChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","onDataPointClick","drillEnabled","hoveredIndex","setHoveredIndex","useState","getFieldLabel","useCubeFieldLabel","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","handleClick","event","cellData","measureField","formatAxisValue","uniqueSeries","legendPayload","ratio","series","hasLegend","adjustedHeight","ChartContainer","Treemap","ChartTooltip","error"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as t, jsxs as p } from "react/jsx-runtime";
|
|
2
2
|
import E, { useMemo as T } from "react";
|
|
3
3
|
import { ComposedChart as O, CartesianGrid as I, XAxis as S, YAxis as R, Legend as B, Bar as C, LabelList as D, Cell as W, Line as j } from "recharts";
|
|
4
|
-
import { u as K, a as Y, f as V, b as M, C as X } from "./charts-core-
|
|
5
|
-
import { A as z } from "./chart-bar-
|
|
4
|
+
import { u as K, a as Y, f as V, b as M, C as X } from "./charts-core-B4Rbfdcn.js";
|
|
5
|
+
import { A as z } from "./chart-bar-D3vtCNQG.js";
|
|
6
6
|
const k = "#22c55e", F = "#ef4444", _ = "#6366f1", G = "#94a3b8";
|
|
7
7
|
function P(N, i, a, o, d) {
|
|
8
8
|
let n = 0;
|
|
@@ -188,4 +188,4 @@ const Z = E.memo(function({
|
|
|
188
188
|
export {
|
|
189
189
|
Z as default
|
|
190
190
|
};
|
|
191
|
-
//# sourceMappingURL=chart-waterfall-
|
|
191
|
+
//# sourceMappingURL=chart-waterfall-BBwSfEKT.js.map
|
package/dist/client/chunks/{chart-waterfall-CX3vx_lI.js.map → chart-waterfall-BBwSfEKT.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-waterfall-CX3vx_lI.js","sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, LabelList, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst POSITIVE_COLOR = '#22c55e'\nconst NEGATIVE_COLOR = '#ef4444'\nconst TOTAL_COLOR = '#6366f1'\nconst CONNECTOR_COLOR = '#94a3b8'\n\ninterface WaterfallDataPoint {\n label: string\n value: number\n runningBase: number\n isTotal: boolean\n isNegative: boolean\n displayValue: number\n originalIndex: number\n}\n\nfunction transformToWaterfall(\n data: Record<string, unknown>[],\n xField: string,\n yField: string,\n showTotal: boolean,\n getFieldLabel: (field: string) => string\n): WaterfallDataPoint[] {\n let running = 0\n const result: WaterfallDataPoint[] = data.map((row, i) => {\n const label = String(row[xField] ?? `Row ${i + 1}`)\n const rawValue = row[yField]\n const parsed = typeof rawValue === 'number' ? rawValue : parseFloat(String(rawValue ?? ''))\n const value = isNaN(parsed) ? 0 : parsed\n const isNegative = value < 0\n const base = isNegative ? running + value : running\n const point: WaterfallDataPoint = {\n label,\n value: Math.abs(value),\n runningBase: base,\n isTotal: false,\n isNegative,\n displayValue: value,\n originalIndex: i,\n }\n running += value\n return point\n })\n\n if (showTotal) {\n const totalLabel = getFieldLabel(yField) || 'Total'\n result.push({\n label: totalLabel,\n value: Math.abs(running),\n runningBase: running >= 0 ? 0 : running,\n isTotal: true,\n isNegative: running < 0,\n displayValue: running,\n originalIndex: result.length,\n })\n }\n\n return result\n}\n\ninterface ValueLabelProps {\n x?: number\n y?: number\n width?: number\n value?: number\n isNegative?: boolean\n displayValue?: number\n}\n\nfunction ValueLabel(props: ValueLabelProps) {\n const { x = 0, y = 0, width = 0, value = 0, isNegative, displayValue } = props\n if (displayValue === undefined || displayValue === null) return null\n const numericValue = Number(displayValue)\n const isNeg = isNegative || numericValue < 0\n const yPos = isNeg ? y + value + 14 : y - 6\n return (\n <text\n x={x + width / 2}\n y={yPos}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n fontSize={11}\n >\n {numericValue >= 0 ? '+' : ''}{numericValue.toLocaleString()}\n </text>\n )\n}\n\nconst WaterfallChart = React.memo(function WaterfallChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const getFieldLabel = useCubeFieldLabel()\n\n const showTotal = displayConfig?.showTotal ?? true\n const showConnectorLine = displayConfig?.showConnectorLine ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xAxisField, yAxisField, configError } = useMemo(() => {\n const xAxisField: string | undefined = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.x\n const yAxisField: string | undefined = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis[0]\n : chartConfig?.y?.[0]\n const configError =\n !xAxisField || !yAxisField\n ? 'Waterfall chart requires an X-axis dimension and a Y-axis measure'\n : null\n return { xAxisField, yAxisField, configError }\n }, [chartConfig])\n\n const waterfallData = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField || !yAxisField) return []\n return transformToWaterfall(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n showTotal,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisField, showTotal, getFieldLabel, configError])\n\n const connectorData = useMemo(() => {\n if (!showConnectorLine || waterfallData.length === 0) return []\n return waterfallData.map((d) => {\n const connectorY = d.isNegative ? d.runningBase : d.runningBase + d.value\n return { label: d.label, _connector: connectorY }\n })\n }, [waterfallData, showConnectorLine])\n\n const chartData = useMemo(() => {\n return waterfallData.map((d, i) => ({\n ...d,\n _connector: connectorData[i]?._connector,\n }))\n }, [waterfallData, connectorData])\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in waterfall chart</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <ComposedChart data={chartData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"label\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any, props: any) => {\n if (name === '_connector') return ['', '']\n const entry = props?.payload\n if (!entry) return [value, name]\n const displayValue = entry.displayValue ?? value\n return [\n yAxisFormat ? formatAxisValue(displayValue, yAxisFormat) : displayValue?.toLocaleString?.() ?? displayValue,\n entry.isTotal ? 'Total' : entry.isNegative ? 'Decrease' : 'Increase',\n ]\n }}\n labelFormatter={(label: string) => label}\n />\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }}\n {...{\n payload: [\n { value: 'Increase', type: 'rect' as const, color: POSITIVE_COLOR },\n { value: 'Decrease', type: 'rect' as const, color: NEGATIVE_COLOR },\n ...(showTotal ? [{ value: 'Total', type: 'rect' as const, color: TOTAL_COLOR }] : []),\n ],\n }}\n />\n <Bar dataKey=\"runningBase\" stackId=\"wf\" fill=\"transparent\" legendType=\"none\" isAnimationActive={false} />\n <Bar\n dataKey=\"value\"\n stackId=\"wf\"\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData && !barData.isTotal) {\n onDataPointClick({\n dataPoint: barData,\n clickedField: yAxisField!,\n xValue: barData.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n >\n {showDataLabels && (\n <LabelList\n dataKey=\"displayValue\"\n content={(props: any) => (\n <ValueLabel\n {...props}\n runningBase={chartData[props.index]?.runningBase}\n isNegative={chartData[props.index]?.isNegative}\n displayValue={chartData[props.index]?.displayValue}\n />\n )}\n />\n )}\n {chartData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.isTotal ? TOTAL_COLOR : entry.isNegative ? NEGATIVE_COLOR : POSITIVE_COLOR}\n />\n ))}\n </Bar>\n {showConnectorLine && (\n <Line\n type=\"stepAfter\"\n dataKey=\"_connector\"\n stroke={CONNECTOR_COLOR}\n strokeWidth={1.5}\n strokeDasharray=\"4 2\"\n dot={false}\n activeDot={false}\n legendType=\"none\"\n isAnimationActive={false}\n />\n )}\n </ComposedChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Waterfall Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"names":["POSITIVE_COLOR","NEGATIVE_COLOR","TOTAL_COLOR","CONNECTOR_COLOR","transformToWaterfall","data","xField","yField","showTotal","getFieldLabel","running","result","row","i","label","rawValue","parsed","value","isNegative","base","point","totalLabel","ValueLabel","props","x","y","width","displayValue","numericValue","yPos","jsxs","WaterfallChart","React","chartConfig","displayConfig","height","onDataPointClick","drillEnabled","useCubeFieldLabel","showConnectorLine","showDataLabels","yAxisFormat","xAxisField","yAxisField","configError","useMemo","waterfallData","connectorData","d","connectorY","chartData","jsx","ChartContainer","ComposedChart","CHART_MARGINS","CartesianGrid","XAxis","AngledXAxisTick","YAxis","v","formatAxisValue","ChartTooltip","name","entry","Legend","Bar","barData","_index","event","LabelList","index","Cell","Line","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-waterfall-BBwSfEKT.js","sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, LabelList, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst POSITIVE_COLOR = '#22c55e'\nconst NEGATIVE_COLOR = '#ef4444'\nconst TOTAL_COLOR = '#6366f1'\nconst CONNECTOR_COLOR = '#94a3b8'\n\ninterface WaterfallDataPoint {\n label: string\n value: number\n runningBase: number\n isTotal: boolean\n isNegative: boolean\n displayValue: number\n originalIndex: number\n}\n\nfunction transformToWaterfall(\n data: Record<string, unknown>[],\n xField: string,\n yField: string,\n showTotal: boolean,\n getFieldLabel: (field: string) => string\n): WaterfallDataPoint[] {\n let running = 0\n const result: WaterfallDataPoint[] = data.map((row, i) => {\n const label = String(row[xField] ?? `Row ${i + 1}`)\n const rawValue = row[yField]\n const parsed = typeof rawValue === 'number' ? rawValue : parseFloat(String(rawValue ?? ''))\n const value = isNaN(parsed) ? 0 : parsed\n const isNegative = value < 0\n const base = isNegative ? running + value : running\n const point: WaterfallDataPoint = {\n label,\n value: Math.abs(value),\n runningBase: base,\n isTotal: false,\n isNegative,\n displayValue: value,\n originalIndex: i,\n }\n running += value\n return point\n })\n\n if (showTotal) {\n const totalLabel = getFieldLabel(yField) || 'Total'\n result.push({\n label: totalLabel,\n value: Math.abs(running),\n runningBase: running >= 0 ? 0 : running,\n isTotal: true,\n isNegative: running < 0,\n displayValue: running,\n originalIndex: result.length,\n })\n }\n\n return result\n}\n\ninterface ValueLabelProps {\n x?: number\n y?: number\n width?: number\n value?: number\n isNegative?: boolean\n displayValue?: number\n}\n\nfunction ValueLabel(props: ValueLabelProps) {\n const { x = 0, y = 0, width = 0, value = 0, isNegative, displayValue } = props\n if (displayValue === undefined || displayValue === null) return null\n const numericValue = Number(displayValue)\n const isNeg = isNegative || numericValue < 0\n const yPos = isNeg ? y + value + 14 : y - 6\n return (\n <text\n x={x + width / 2}\n y={yPos}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n fontSize={11}\n >\n {numericValue >= 0 ? '+' : ''}{numericValue.toLocaleString()}\n </text>\n )\n}\n\nconst WaterfallChart = React.memo(function WaterfallChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const getFieldLabel = useCubeFieldLabel()\n\n const showTotal = displayConfig?.showTotal ?? true\n const showConnectorLine = displayConfig?.showConnectorLine ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xAxisField, yAxisField, configError } = useMemo(() => {\n const xAxisField: string | undefined = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.x\n const yAxisField: string | undefined = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis[0]\n : chartConfig?.y?.[0]\n const configError =\n !xAxisField || !yAxisField\n ? 'Waterfall chart requires an X-axis dimension and a Y-axis measure'\n : null\n return { xAxisField, yAxisField, configError }\n }, [chartConfig])\n\n const waterfallData = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField || !yAxisField) return []\n return transformToWaterfall(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n showTotal,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisField, showTotal, getFieldLabel, configError])\n\n const connectorData = useMemo(() => {\n if (!showConnectorLine || waterfallData.length === 0) return []\n return waterfallData.map((d) => {\n const connectorY = d.isNegative ? d.runningBase : d.runningBase + d.value\n return { label: d.label, _connector: connectorY }\n })\n }, [waterfallData, showConnectorLine])\n\n const chartData = useMemo(() => {\n return waterfallData.map((d, i) => ({\n ...d,\n _connector: connectorData[i]?._connector,\n }))\n }, [waterfallData, connectorData])\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in waterfall chart</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <ComposedChart data={chartData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"label\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any, props: any) => {\n if (name === '_connector') return ['', '']\n const entry = props?.payload\n if (!entry) return [value, name]\n const displayValue = entry.displayValue ?? value\n return [\n yAxisFormat ? formatAxisValue(displayValue, yAxisFormat) : displayValue?.toLocaleString?.() ?? displayValue,\n entry.isTotal ? 'Total' : entry.isNegative ? 'Decrease' : 'Increase',\n ]\n }}\n labelFormatter={(label: string) => label}\n />\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }}\n {...{\n payload: [\n { value: 'Increase', type: 'rect' as const, color: POSITIVE_COLOR },\n { value: 'Decrease', type: 'rect' as const, color: NEGATIVE_COLOR },\n ...(showTotal ? [{ value: 'Total', type: 'rect' as const, color: TOTAL_COLOR }] : []),\n ],\n }}\n />\n <Bar dataKey=\"runningBase\" stackId=\"wf\" fill=\"transparent\" legendType=\"none\" isAnimationActive={false} />\n <Bar\n dataKey=\"value\"\n stackId=\"wf\"\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData && !barData.isTotal) {\n onDataPointClick({\n dataPoint: barData,\n clickedField: yAxisField!,\n xValue: barData.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n >\n {showDataLabels && (\n <LabelList\n dataKey=\"displayValue\"\n content={(props: any) => (\n <ValueLabel\n {...props}\n runningBase={chartData[props.index]?.runningBase}\n isNegative={chartData[props.index]?.isNegative}\n displayValue={chartData[props.index]?.displayValue}\n />\n )}\n />\n )}\n {chartData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.isTotal ? TOTAL_COLOR : entry.isNegative ? NEGATIVE_COLOR : POSITIVE_COLOR}\n />\n ))}\n </Bar>\n {showConnectorLine && (\n <Line\n type=\"stepAfter\"\n dataKey=\"_connector\"\n stroke={CONNECTOR_COLOR}\n strokeWidth={1.5}\n strokeDasharray=\"4 2\"\n dot={false}\n activeDot={false}\n legendType=\"none\"\n isAnimationActive={false}\n />\n )}\n </ComposedChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Waterfall Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"names":["POSITIVE_COLOR","NEGATIVE_COLOR","TOTAL_COLOR","CONNECTOR_COLOR","transformToWaterfall","data","xField","yField","showTotal","getFieldLabel","running","result","row","i","label","rawValue","parsed","value","isNegative","base","point","totalLabel","ValueLabel","props","x","y","width","displayValue","numericValue","yPos","jsxs","WaterfallChart","React","chartConfig","displayConfig","height","onDataPointClick","drillEnabled","useCubeFieldLabel","showConnectorLine","showDataLabels","yAxisFormat","xAxisField","yAxisField","configError","useMemo","waterfallData","connectorData","d","connectorY","chartData","jsx","ChartContainer","ComposedChart","CHART_MARGINS","CartesianGrid","XAxis","AngledXAxisTick","YAxis","v","formatAxisValue","ChartTooltip","name","entry","Legend","Bar","barData","_index","event","LabelList","index","Cell","Line","error"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as l, jsxs as x } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo as U, useContext as H, useRef as D, useState as T, useLayoutEffect as K, startTransition as V } from "react";
|
|
3
|
-
import { C as B } from "./providers-
|
|
3
|
+
import { C as B } from "./providers-CCw8Kjlc.js";
|
|
4
4
|
import { ResponsiveContainer as I, Tooltip as z } from "recharts";
|
|
5
5
|
const G = {
|
|
6
6
|
xs: "dc:h-3 dc:w-3",
|
|
@@ -689,4 +689,4 @@ export {
|
|
|
689
689
|
ne as t,
|
|
690
690
|
se as u
|
|
691
691
|
};
|
|
692
|
-
//# sourceMappingURL=charts-core-
|
|
692
|
+
//# sourceMappingURL=charts-core-B4Rbfdcn.js.map
|