drizzle-cube 0.2.10 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/compiler-CMwSRhTS.cjs +22 -0
- package/dist/adapters/{compiler-gcKytLwd.js → compiler-DrkCCzf0.js} +16 -11
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +8 -8
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +9 -9
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +11 -11
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +59 -59
- package/dist/client/charts/chartConfigs.d.ts +3 -1
- package/dist/client/charts.js +11 -11
- package/dist/client/chunks/{chart-activitygridchart-C1ts13cL.js → chart-activitygridchart-CUGN9Xq9.js} +848 -738
- package/dist/client/chunks/chart-activitygridchart-CUGN9Xq9.js.map +1 -0
- package/dist/client/chunks/chart-areachart-B4tknnsY.js +239 -0
- package/dist/client/chunks/chart-areachart-B4tknnsY.js.map +1 -0
- package/dist/client/chunks/{chart-areachart-config-0ICuIaRP.js → chart-areachart-config-D9pPUKHZ.js} +15 -2
- package/dist/client/chunks/chart-areachart-config-D9pPUKHZ.js.map +1 -0
- package/dist/client/chunks/chart-axisformatcontrols-Ch_IYF94.js +196 -0
- package/dist/client/chunks/chart-axisformatcontrols-Ch_IYF94.js.map +1 -0
- package/dist/client/chunks/chart-barchart-D_op06r-.js +216 -0
- package/dist/client/chunks/chart-barchart-D_op06r-.js.map +1 -0
- package/dist/client/chunks/{chart-barchart-config-DalFHdmP.js → chart-barchart-config-iniz62ni.js} +15 -2
- package/dist/client/chunks/chart-barchart-config-iniz62ni.js.map +1 -0
- package/dist/client/chunks/chart-bubblechart-BsaIXUbS.js +214 -0
- package/dist/client/chunks/chart-bubblechart-BsaIXUbS.js.map +1 -0
- package/dist/client/chunks/{chart-bubblechart-config-WjiDlqnP.js → chart-bubblechart-config-yLq2oyR3.js} +18 -4
- package/dist/client/chunks/{chart-bubblechart-config-WjiDlqnP.js.map → chart-bubblechart-config-yLq2oyR3.js.map} +1 -1
- package/dist/client/chunks/{chart-charttooltip-5tzcFRt0.js → chart-charttooltip-Bx3I8jQv.js} +4 -4
- package/dist/client/chunks/{chart-charttooltip-5tzcFRt0.js.map → chart-charttooltip-Bx3I8jQv.js.map} +1 -1
- package/dist/client/chunks/chart-datatable-C7MS9q4Y.js +283 -0
- package/dist/client/chunks/chart-datatable-C7MS9q4Y.js.map +1 -0
- package/dist/client/chunks/{chart-datatable-config-C7TgMD3u.js → chart-datatable-config-DmEA3A-7.js} +10 -2
- package/dist/client/chunks/{chart-datatable-config-C7TgMD3u.js.map → chart-datatable-config-DmEA3A-7.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-D_VuZaVL.js → chart-kpidelta-7-KOmb3w.js} +62 -60
- package/dist/client/chunks/chart-kpidelta-7-KOmb3w.js.map +1 -0
- package/dist/client/chunks/{chart-kpinumber-DeCkVi2e.js → chart-kpinumber-HOPfcK2N.js} +4 -4
- package/dist/client/chunks/{chart-kpinumber-DeCkVi2e.js.map → chart-kpinumber-HOPfcK2N.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-D8OpA0CY.js → chart-kpitext-BZkC9u3A.js} +24 -24
- package/dist/client/chunks/{chart-kpitext-D8OpA0CY.js.map → chart-kpitext-BZkC9u3A.js.map} +1 -1
- package/dist/client/chunks/chart-linechart-DqFmLbRe.js +198 -0
- package/dist/client/chunks/chart-linechart-DqFmLbRe.js.map +1 -0
- package/dist/client/chunks/{chart-linechart-config-C5tpU_2u.js → chart-linechart-config-DLVS2Zxc.js} +17 -4
- package/dist/client/chunks/chart-linechart-config-DLVS2Zxc.js.map +1 -0
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js +256 -0
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js.map +1 -0
- package/dist/client/chunks/{chart-piechart-CiFJQtC8.js → chart-piechart-CrXFd9pE.js} +61 -55
- package/dist/client/chunks/chart-piechart-CrXFd9pE.js.map +1 -0
- package/dist/client/chunks/{chart-piechart-config-CtP_JkGm.js → chart-piechart-config-DgwOeKHr.js} +12 -4
- package/dist/client/chunks/{chart-piechart-config-CtP_JkGm.js.map → chart-piechart-config-DgwOeKHr.js.map} +1 -1
- package/dist/client/chunks/{chart-radarchart-config-BkD_6Khq.js → chart-radarchart-config-BAV8D5PR.js} +12 -4
- package/dist/client/chunks/{chart-radarchart-config-BkD_6Khq.js.map → chart-radarchart-config-BAV8D5PR.js.map} +1 -1
- package/dist/client/chunks/chart-radarchart-tar2GBkO.js +131 -0
- package/dist/client/chunks/chart-radarchart-tar2GBkO.js.map +1 -0
- package/dist/client/chunks/chart-radialbarchart-ab8Swtal.js +120 -0
- package/dist/client/chunks/chart-radialbarchart-ab8Swtal.js.map +1 -0
- package/dist/client/chunks/{chart-radialbarchart-config-CBZDlB2k.js → chart-radialbarchart-config-CKozBBEC.js} +10 -2
- package/dist/client/chunks/{chart-radialbarchart-config-CBZDlB2k.js.map → chart-radialbarchart-config-CKozBBEC.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-DeGqPbYm.js → chart-scatterchart-BP06BeU5.js} +89 -87
- package/dist/client/chunks/chart-scatterchart-BP06BeU5.js.map +1 -0
- package/dist/client/chunks/{chart-scatterchart-config-DsdmlpHr.js → chart-scatterchart-config-UdHmbZ3s.js} +18 -4
- package/dist/client/chunks/{chart-scatterchart-config-DsdmlpHr.js.map → chart-scatterchart-config-UdHmbZ3s.js.map} +1 -1
- package/dist/client/chunks/chart-treemapchart-DAiixITm.js +265 -0
- package/dist/client/chunks/chart-treemapchart-DAiixITm.js.map +1 -0
- package/dist/client/chunks/{chart-treemapchart-config-CdF9NvPP.js → chart-treemapchart-config-D17VOwTM.js} +12 -4
- package/dist/client/chunks/{chart-treemapchart-config-CdF9NvPP.js.map → chart-treemapchart-config-D17VOwTM.js.map} +1 -1
- package/dist/client/chunks/{charts-DY7pF_-4.js → charts-CHzWeaY1.js} +36 -36
- package/dist/client/chunks/charts-CHzWeaY1.js.map +1 -0
- package/dist/client/chunks/components-DnM9CCUS.js +13931 -0
- package/dist/client/chunks/components-DnM9CCUS.js.map +1 -0
- package/dist/client/chunks/{index-DH5abYWH.js → index-DlsvcKXf.js} +135 -135
- package/dist/client/chunks/index-DlsvcKXf.js.map +1 -0
- package/dist/client/components/AnalysisBuilder/AnalysisAIPanel.d.ts +25 -0
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +8 -6
- package/dist/client/components/AnalysisBuilder/AnalysisChartConfigPanel.d.ts +2 -5
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +9 -0
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +12 -0
- package/dist/client/components/AnalysisBuilder/types.d.ts +38 -9
- package/dist/client/components/charts/AxisFormatControls.d.ts +35 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/useResponsiveDashboard.d.ts +2 -8
- package/dist/client/hooks.js +10 -10
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/icons/types.d.ts +2 -2
- package/dist/client/index.js +4 -4
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +12 -0
- package/dist/client/utils/chartUtils.d.ts +20 -0
- package/dist/client/utils/pivotUtils.d.ts +11 -1
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +16 -11
- package/package.json +4 -3
- package/dist/adapters/compiler-DP1pPIcg.cjs +0 -22
- package/dist/client/chunks/chart-activitygridchart-C1ts13cL.js.map +0 -1
- package/dist/client/chunks/chart-areachart-config-0ICuIaRP.js.map +0 -1
- package/dist/client/chunks/chart-areachart-fOi6lwUq.js +0 -204
- package/dist/client/chunks/chart-areachart-fOi6lwUq.js.map +0 -1
- package/dist/client/chunks/chart-barchart-CJfPZQin.js +0 -171
- package/dist/client/chunks/chart-barchart-CJfPZQin.js.map +0 -1
- package/dist/client/chunks/chart-barchart-config-DalFHdmP.js.map +0 -1
- package/dist/client/chunks/chart-bubblechart-BVk_qFly.js +0 -210
- package/dist/client/chunks/chart-bubblechart-BVk_qFly.js.map +0 -1
- package/dist/client/chunks/chart-datatable-BW_dWRbb.js +0 -249
- package/dist/client/chunks/chart-datatable-BW_dWRbb.js.map +0 -1
- package/dist/client/chunks/chart-kpidelta-D_VuZaVL.js.map +0 -1
- package/dist/client/chunks/chart-linechart-BdfBVl3m.js +0 -155
- package/dist/client/chunks/chart-linechart-BdfBVl3m.js.map +0 -1
- package/dist/client/chunks/chart-linechart-config-C5tpU_2u.js.map +0 -1
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js +0 -254
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js.map +0 -1
- package/dist/client/chunks/chart-piechart-CiFJQtC8.js.map +0 -1
- package/dist/client/chunks/chart-radarchart-CJ4kpk5J.js +0 -124
- package/dist/client/chunks/chart-radarchart-CJ4kpk5J.js.map +0 -1
- package/dist/client/chunks/chart-radialbarchart-DLQqN_1Z.js +0 -109
- package/dist/client/chunks/chart-radialbarchart-DLQqN_1Z.js.map +0 -1
- package/dist/client/chunks/chart-scatterchart-DeGqPbYm.js.map +0 -1
- package/dist/client/chunks/chart-treemapchart-ClXsAOjr.js +0 -253
- package/dist/client/chunks/chart-treemapchart-ClXsAOjr.js.map +0 -1
- package/dist/client/chunks/charts-DY7pF_-4.js.map +0 -1
- package/dist/client/chunks/components-DAOVOiM_.js +0 -13429
- package/dist/client/chunks/components-DAOVOiM_.js.map +0 -1
- package/dist/client/chunks/index-DH5abYWH.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-kpidelta-D_VuZaVL.js","sources":["../../../src/client/utils/periodUtils.ts","../../../src/client/components/charts/KpiDelta.tsx"],"sourcesContent":["/**\n * Utility functions for detecting incomplete time periods in KPI charts\n */\n\n/**\n * Get the end date of a period based on granularity\n * @param date - The date within the period\n * @param granularity - The time granularity (day, week, month, quarter, year)\n * @returns The end date of the period (end of day)\n */\nexport function getPeriodEndDate(date: Date, granularity: string): Date {\n const endDate = new Date(date)\n\n switch (granularity.toLowerCase()) {\n case 'day':\n // End of the same day\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'week':\n // End of the week (Saturday, assuming week starts Sunday)\n const dayOfWeek = endDate.getDay()\n const daysUntilSaturday = 6 - dayOfWeek\n endDate.setDate(endDate.getDate() + daysUntilSaturday)\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'month':\n // Last day of the month\n endDate.setMonth(endDate.getMonth() + 1, 0) // Set to day 0 of next month = last day of current month\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'quarter':\n // Last day of the quarter\n const currentMonth = endDate.getMonth()\n const quarterEndMonth = Math.floor(currentMonth / 3) * 3 + 2 // 0->2, 3->5, 6->8, 9->11\n endDate.setMonth(quarterEndMonth + 1, 0) // Last day of quarter end month\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'year':\n // December 31st\n endDate.setMonth(11, 31) // December 31\n endDate.setHours(23, 59, 59, 999)\n break\n\n default:\n // Unknown granularity - treat as complete\n endDate.setHours(23, 59, 59, 999)\n }\n\n return endDate\n}\n\n/**\n * Check if the last period in the data is complete based on granularity\n * @param lastDataPoint - The last data point in the sorted dataset\n * @param timeDimensionField - The field name containing the time value\n * @param granularity - The time granularity\n * @returns true if the period is complete, false if it's incomplete\n */\nexport function isLastPeriodComplete(\n lastDataPoint: any,\n timeDimensionField: string,\n granularity: string\n): boolean {\n if (!lastDataPoint || !timeDimensionField || !granularity) {\n return true // Assume complete if we can't determine\n }\n\n const timeValue = lastDataPoint[timeDimensionField]\n if (!timeValue) {\n return true // Assume complete if no time value\n }\n\n // Parse the time value\n const date = new Date(timeValue)\n if (isNaN(date.getTime())) {\n return true // Assume complete if invalid date\n }\n\n // Get the end of this period\n const periodEnd = getPeriodEndDate(date, granularity)\n\n // Compare with current time\n const now = new Date()\n\n // If the period end is in the future, the period is incomplete\n return periodEnd <= now\n}\n\n/**\n * Extract granularity from a query object\n * @param queryObject - The CubeQuery object\n * @param dimensionField - Optional specific dimension field to match\n * @returns The granularity string or null if not found\n */\nexport function getQueryGranularity(\n queryObject: any,\n dimensionField?: string\n): string | null {\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n return null\n }\n\n // If a specific dimension field is provided, try to find its granularity\n if (dimensionField) {\n const matchingDim = queryObject.timeDimensions.find((td: any) =>\n td.dimension === dimensionField ||\n td.dimension?.includes(dimensionField) ||\n dimensionField?.includes(td.dimension)\n )\n if (matchingDim?.granularity) {\n return matchingDim.granularity\n }\n }\n\n // Fallback to first time dimension's granularity\n const firstTimeDim = queryObject.timeDimensions[0]\n return firstTimeDim?.granularity || null\n}\n\n/**\n * Filter data to exclude incomplete or last period\n * @param data - The data array sorted by time\n * @param timeDimensionField - The field containing time values\n * @param queryObject - The query object containing timeDimensions\n * @param useLastCompletePeriod - Whether to check for incomplete periods\n * @param skipLastPeriod - Whether to always skip the last period (overrides useLastCompletePeriod)\n * @returns Object with filtered data and whether filtering was applied\n */\nexport function filterIncompletePeriod(\n data: any[],\n timeDimensionField: string | undefined,\n queryObject: any,\n useLastCompletePeriod: boolean,\n skipLastPeriod: boolean = false\n): { filteredData: any[]; excludedIncompletePeriod: boolean; skippedLastPeriod: boolean; granularity: string | null } {\n // Default return - no filtering\n const noFilter = {\n filteredData: data,\n excludedIncompletePeriod: false,\n skippedLastPeriod: false,\n granularity: null\n }\n\n // Need at least 2 data points to filter\n if (data.length < 2) {\n return noFilter\n }\n\n const granularity = getQueryGranularity(queryObject, timeDimensionField)\n\n // If skipLastPeriod is enabled, always skip the last period\n if (skipLastPeriod) {\n return {\n filteredData: data.slice(0, -1),\n excludedIncompletePeriod: false,\n skippedLastPeriod: true,\n granularity\n }\n }\n\n // Skip incomplete period check if feature is disabled\n if (!useLastCompletePeriod) {\n return { ...noFilter, granularity }\n }\n\n // Skip if no time dimension field\n if (!timeDimensionField) {\n return { ...noFilter, granularity }\n }\n\n // Skip if no time dimensions in query\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n return { ...noFilter, granularity }\n }\n\n if (!granularity) {\n return noFilter\n }\n\n // Check if last period is incomplete\n const lastRow = data[data.length - 1]\n if (!isLastPeriodComplete(lastRow, timeDimensionField, granularity)) {\n return {\n filteredData: data.slice(0, -1),\n excludedIncompletePeriod: true,\n skippedLastPeriod: false,\n granularity\n }\n }\n\n return { ...noFilter, granularity }\n}\n","import { useState, useRef, useEffect } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport infoCircleIcon from \"@iconify-icons/tabler/info-circle\";\nimport { useCubeContext } from \"../../providers/CubeProvider\";\nimport { filterIncompletePeriod } from \"../../utils/periodUtils\";\nimport type { ChartProps } from \"../../types\";\n\ninterface VarianceHistogramProps {\n values: number[];\n lastValue: number;\n positiveColor: string;\n negativeColor: string;\n formatValue: (value: number) => string;\n width: number;\n height: number;\n}\n\nfunction VarianceHistogram({\n values,\n lastValue,\n positiveColor,\n negativeColor,\n formatValue,\n width,\n height,\n}: VarianceHistogramProps) {\n // Limit to most recent N values to fit in the histogram\n // Calculate max bars based on width (minimum 8px per bar including gap)\n const maxBars = Math.max(10, Math.floor(width / 10));\n const limitedValues =\n values.length > maxBars\n ? values.slice(-maxBars) // Take the most recent values\n : values;\n\n // Calculate variance (difference) from current/last value for each point\n const variances = limitedValues.map((value) => value - lastValue);\n\n // Find min/max variance for scaling (include 0 as baseline)\n const minVariance = Math.min(...variances, 0);\n const maxVariance = Math.max(...variances, 0);\n const range = Math.max(Math.abs(minVariance), Math.abs(maxVariance));\n\n if (range === 0 || variances.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center bg-gray-50 rounded-sm border\"\n style={{ width: `${width}px`, height: `${height}px` }}\n >\n <span className=\"text-xs text-gray-500\">No variance data</span>\n </div>\n );\n }\n\n // Calculate bar dimensions\n const barGap = 2;\n const availableWidth = width - (limitedValues.length - 1) * barGap;\n const barWidth = Math.max(4, availableWidth / limitedValues.length);\n\n // Calculate where zero line should be positioned (as percentage from top)\n // If maxVariance = 67 and minVariance = -24, total range = 91\n // Zero should be at 67/91 = 73.6% from top\n const totalRange = maxVariance - minVariance;\n const zeroLinePercent =\n totalRange > 0 ? (maxVariance / totalRange) * 100 : 50;\n\n return (\n <div className=\"flex items-center space-x-2\">\n {/* Histogram bars */}\n <div\n className=\"relative\"\n style={{\n width: `${width}px`,\n height: `${height}px`,\n }}\n >\n {/* Zero line (represents current value) */}\n <div\n className=\"absolute left-0 right-0\"\n style={{\n height: \"1px\",\n top: `${zeroLinePercent}%`,\n backgroundColor: \"var(--dc-border)\",\n zIndex: 1,\n }}\n />\n\n {/* Variance bars - oldest to newest (left to right) */}\n {variances.map((variance, index) => {\n // Calculate bar height as proportion of total range\n const normalizedHeight = Math.abs(variance) / totalRange;\n const barHeight = Math.max(2, normalizedHeight * (height - 4));\n const isPositive = variance >= 0;\n const isLastValue = index === limitedValues.length - 1;\n const color = isPositive ? positiveColor : negativeColor;\n const xPosition = index * (barWidth + barGap);\n\n return (\n <div\n key={index}\n className=\"absolute rounded-xs\"\n style={{\n left: `${xPosition}px`,\n width: `${barWidth}px`,\n height: `${barHeight}px`,\n backgroundColor: color,\n opacity: isLastValue ? 1 : 0.6,\n // Position bar relative to zero line\n ...(isPositive\n ? { bottom: `${100 - zeroLinePercent}%` }\n : { top: `${zeroLinePercent}%` }),\n zIndex: 2,\n }}\n title={`${formatValue(limitedValues[index])}: ${variance >= 0 ? \"+\" : \"\"}${formatValue(variance)} vs current`}\n />\n );\n })}\n </div>\n\n {/* Variance labels on the right - show actual value difference */}\n <div\n className=\"flex flex-col justify-between text-xs text-dc-text-muted\"\n style={{ height: `${height}px` }}\n >\n <span>+{formatValue(maxVariance)}</span>\n <span>\n {minVariance < 0 ? \"\" : \"\"}\n {formatValue(minVariance)}\n </span>\n </div>\n </div>\n );\n}\n\nexport default function KpiDelta({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32);\n const [textWidth, setTextWidth] = useState(250);\n const containerRef = useRef<HTMLDivElement>(null);\n const valueRef = useRef<HTMLDivElement>(null);\n const { getFieldLabel } = useCubeContext();\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n const containerWidth = rect.width;\n const containerHeight = rect.height;\n\n if (containerWidth > 0 && containerHeight > 0) {\n const widthBasedSize = containerWidth / 4;\n const heightBasedSize = containerHeight / 4;\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize);\n const clampedFontSize = Math.max(28, Math.min(baseFontSize, 140));\n setFontSize(clampedFontSize);\n\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect();\n const measuredWidth = textRect.width;\n // Scale histogram width with container, accounting for labels on the right (~60px)\n const maxHistogramWidth = containerWidth - 100; // Leave room for padding and labels\n const effectiveWidth = Math.max(\n measuredWidth,\n Math.min(maxHistogramWidth, containerWidth * 0.7),\n );\n setTextWidth(Math.max(100, effectiveWidth)); // Minimum 100px\n }\n }, 10);\n }\n }\n };\n\n const timer = setTimeout(updateDimensions, 50);\n\n const resizeObserver = new ResizeObserver(() => {\n setTimeout(updateDimensions, 10);\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n clearTimeout(timer);\n resizeObserver.disconnect();\n };\n }, [data, chartConfig]);\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">\n No data points to display\n </div>\n </div>\n </div>\n );\n }\n\n // Extract value and dimension fields from chart config\n let valueFields: string[] = [];\n let dimensionFields: string[] = [];\n\n if (chartConfig?.yAxis) {\n valueFields = Array.isArray(chartConfig.yAxis)\n ? chartConfig.yAxis\n : [chartConfig.yAxis];\n }\n\n if (chartConfig?.xAxis) {\n dimensionFields = Array.isArray(chartConfig.xAxis)\n ? chartConfig.xAxis\n : [chartConfig.xAxis];\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n backgroundColor: \"var(--dc-danger-bg)\",\n color: \"var(--dc-danger)\",\n borderColor: \"var(--dc-danger-border)\",\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure field configured</div>\n </div>\n </div>\n );\n }\n\n const valueField = valueFields[0];\n const dimensionField = dimensionFields[0]; // Optional\n\n // Sort data by dimension if available (for time series)\n let sortedData = [...data];\n if (dimensionField) {\n sortedData = sortedData.sort((a, b) => {\n const aVal = a[dimensionField];\n const bVal = b[dimensionField];\n if (aVal < bVal) return -1;\n if (aVal > bVal) return 1;\n return 0;\n });\n }\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } =\n displayConfig;\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity,\n } = filterIncompletePeriod(\n sortedData,\n dimensionField,\n queryObject,\n useLastCompletePeriod,\n skipLastPeriod,\n );\n\n // Use filtered data for calculations\n const dataToUse = filteredData;\n\n // Extract values from filtered data\n const values = dataToUse\n .map((row) => row[valueField])\n .filter((val) => val !== null && val !== undefined && !isNaN(Number(val)))\n .map((val) => Number(val));\n\n if (values.length < 2) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n backgroundColor: \"var(--dc-warning-bg)\",\n color: \"var(--dc-warning)\",\n borderColor: \"var(--dc-warning-border)\",\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Insufficient Data</div>\n <div className=\"text-xs\">\n Delta calculation requires at least 2 data points\n </div>\n <div className=\"text-xs\">Current data points: {values.length}</div>\n </div>\n </div>\n );\n }\n\n // Calculate delta between last and second-last values\n const lastValue = values[values.length - 1];\n const secondLastValue = values[values.length - 2];\n const absoluteChange = lastValue - secondLastValue;\n const percentageChange =\n secondLastValue !== 0\n ? (absoluteChange / Math.abs(secondLastValue)) * 100\n : 0;\n\n const isPositiveChange = absoluteChange >= 0;\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value);\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return \"—\";\n }\n\n const decimals = displayConfig.decimals ?? 0;\n const prefix = displayConfig.prefix ?? \"\";\n\n let formattedValue: string;\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + \"B\";\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + \"M\";\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + \"K\";\n } else {\n formattedValue = value.toFixed(decimals);\n }\n\n return prefix + formattedValue;\n };\n\n // Get colors from palette\n const getPositiveColor = (): string => {\n if (\n displayConfig.positiveColorIndex !== undefined &&\n colorPalette?.colors\n ) {\n const colorIndex = displayConfig.positiveColorIndex;\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex];\n }\n }\n return \"#10b981\"; // Default green\n };\n\n const getNegativeColor = (): string => {\n if (\n displayConfig.negativeColorIndex !== undefined &&\n colorPalette?.colors\n ) {\n const colorIndex = displayConfig.negativeColorIndex;\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex];\n }\n }\n return \"#ef4444\"; // Default red\n };\n\n const positiveColor = getPositiveColor();\n const negativeColor = getNegativeColor();\n const currentColor = isPositiveChange ? positiveColor : negativeColor;\n\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-2 flex items-center justify-center gap-1\"\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.2\",\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField);\n return label && label.length > 1 ? label : valueField;\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={\n skippedLastPeriod\n ? `Excludes last ${granularity || \"period\"}`\n : `Excludes current incomplete ${granularity}`\n }\n className=\"cursor-help\"\n >\n <Icon\n icon={infoCircleIcon}\n className=\"w-4 h-4 text-dc-text-muted opacity-70\"\n />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Delta */}\n <div className=\"flex items-center justify-center space-x-4 mb-2\">\n {/* Main KPI Value */}\n <div\n ref={valueRef}\n className=\"font-bold leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: \"var(--dc-text)\", // Keep main value neutral\n }}\n >\n {formatNumber(lastValue)}\n </div>\n\n {/* Delta Information */}\n <div className=\"flex items-center space-x-1\">\n {/* Arrow */}\n <div\n className=\"font-bold\"\n style={{\n color: currentColor,\n fontSize: `${fontSize * 0.35}px`,\n }}\n >\n {isPositiveChange ? \"▲\" : \"▼\"}\n </div>\n\n {/* Delta Values */}\n <div className=\"text-left\">\n <div\n className=\"font-bold leading-tight\"\n style={{\n fontSize: `${fontSize * 0.35}px`,\n color: currentColor,\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {formatNumber(absoluteChange)}\n </div>\n <div\n className=\"font-semibold leading-tight\"\n style={{\n fontSize: `${fontSize * 0.28}px`,\n color: currentColor,\n opacity: 0.8,\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {percentageChange.toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n\n {/* Unit/Suffix (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted text-center mb-3\"\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.2\",\n opacity: 0.8,\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Variance Histogram */}\n {displayConfig.showHistogram !== false && values.length > 2 && (\n <div className=\"mt-2 w-full flex justify-center overflow-hidden\">\n <VarianceHistogram\n values={values}\n lastValue={lastValue}\n positiveColor={positiveColor}\n negativeColor={negativeColor}\n formatValue={formatNumber}\n width={textWidth}\n height={64}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["getPeriodEndDate","date","granularity","endDate","daysUntilSaturday","currentMonth","quarterEndMonth","isLastPeriodComplete","lastDataPoint","timeDimensionField","timeValue","getQueryGranularity","queryObject","dimensionField","matchingDim","td","filterIncompletePeriod","data","useLastCompletePeriod","skipLastPeriod","noFilter","lastRow","VarianceHistogram","values","lastValue","positiveColor","negativeColor","formatValue","width","height","maxBars","limitedValues","variances","value","minVariance","maxVariance","jsx","barGap","availableWidth","barWidth","totalRange","zeroLinePercent","jsxs","variance","index","normalizedHeight","barHeight","isPositive","isLastValue","color","xPosition","KpiDelta","chartConfig","displayConfig","colorPalette","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","valueRef","getFieldLabel","useCubeContext","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","baseFontSize","clampedFontSize","measuredWidth","maxHistogramWidth","effectiveWidth","timer","resizeObserver","valueFields","dimensionFields","valueField","sortedData","a","b","aVal","bVal","filteredData","excludedIncompletePeriod","skippedLastPeriod","row","val","secondLastValue","absoluteChange","percentageChange","isPositiveChange","formatNumber","decimals","prefix","formattedValue","getPositiveColor","colorIndex","getNegativeColor","currentColor","label","Icon","infoCircleIcon"],"mappings":"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"}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { jsx as e, jsxs as l, Fragment as D } from "react/jsx-runtime";
|
|
2
|
-
import { useState as _ } from "react";
|
|
3
|
-
import { LineChart as j, CartesianGrid as z, XAxis as F, YAxis as M, Legend as C, Line as u } from "recharts";
|
|
4
|
-
import { C as E } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as G } from "./chart-charttooltip-5tzcFRt0.js";
|
|
6
|
-
import { u as V, t as K, C as R, f as v, a as A } from "./chart-activitygridchart-C1ts13cL.js";
|
|
7
|
-
import { p as W, s as H } from "./chart-areachart-fOi6lwUq.js";
|
|
8
|
-
function $({
|
|
9
|
-
data: m,
|
|
10
|
-
chartConfig: t,
|
|
11
|
-
displayConfig: o = {},
|
|
12
|
-
queryObject: g,
|
|
13
|
-
height: i = "100%",
|
|
14
|
-
colorPalette: x
|
|
15
|
-
}) {
|
|
16
|
-
const [h, y] = _(null), { labelMap: w, getFieldLabel: b } = V();
|
|
17
|
-
try {
|
|
18
|
-
const a = {
|
|
19
|
-
showLegend: o?.showLegend ?? !0,
|
|
20
|
-
showGrid: o?.showGrid ?? !0,
|
|
21
|
-
showTooltip: o?.showTooltip ?? !0,
|
|
22
|
-
connectNulls: o?.connectNulls ?? !1
|
|
23
|
-
};
|
|
24
|
-
if (!m || m.length === 0)
|
|
25
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: i }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
26
|
-
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
|
|
27
|
-
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display in line chart" })
|
|
28
|
-
] }) });
|
|
29
|
-
let c, n, N = [];
|
|
30
|
-
if (t?.xAxis && t?.yAxis)
|
|
31
|
-
c = Array.isArray(t.xAxis) ? t.xAxis[0] : t.xAxis, n = Array.isArray(t.yAxis) ? t.yAxis : [t.yAxis], N = t.series || [];
|
|
32
|
-
else if (t?.x && t?.y)
|
|
33
|
-
c = t.x, n = Array.isArray(t.y) ? t.y : [t.y];
|
|
34
|
-
else
|
|
35
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: i }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
36
|
-
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
37
|
-
/* @__PURE__ */ e("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
|
|
38
|
-
] }) });
|
|
39
|
-
if (!c || !n || n.length === 0)
|
|
40
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-yellow-600", style: { height: i }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
41
|
-
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
42
|
-
/* @__PURE__ */ e("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
43
|
-
] }) });
|
|
44
|
-
const { data: d, seriesKeys: L } = K(
|
|
45
|
-
m,
|
|
46
|
-
c,
|
|
47
|
-
n,
|
|
48
|
-
g,
|
|
49
|
-
N,
|
|
50
|
-
w
|
|
51
|
-
), T = a.showLegend, k = {
|
|
52
|
-
...R,
|
|
53
|
-
left: 40
|
|
54
|
-
// Increased from 20 to 40 for Y-axis label space
|
|
55
|
-
}, S = W(o?.target || ""), f = H(S, d.length);
|
|
56
|
-
let p = d;
|
|
57
|
-
return f.length > 0 && (p = d.map((s, r) => ({
|
|
58
|
-
...s,
|
|
59
|
-
__target: f[r] || null
|
|
60
|
-
}))), !d || d.length === 0 ? /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-text-muted", style: { height: i }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
61
|
-
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "No valid data" }),
|
|
62
|
-
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-secondary", children: "No valid data points for line chart after transformation" })
|
|
63
|
-
] }) }) : /* @__PURE__ */ e(E, { height: i, children: /* @__PURE__ */ l(j, { data: p, margin: k, children: [
|
|
64
|
-
a.showGrid && /* @__PURE__ */ e(z, { strokeDasharray: "3 3" }),
|
|
65
|
-
/* @__PURE__ */ e(
|
|
66
|
-
F,
|
|
67
|
-
{
|
|
68
|
-
dataKey: "name",
|
|
69
|
-
tick: { fontSize: 12 },
|
|
70
|
-
angle: -45,
|
|
71
|
-
textAnchor: "end",
|
|
72
|
-
height: 60
|
|
73
|
-
}
|
|
74
|
-
),
|
|
75
|
-
/* @__PURE__ */ e(
|
|
76
|
-
M,
|
|
77
|
-
{
|
|
78
|
-
tick: { fontSize: 12 },
|
|
79
|
-
label: { value: b(n[0]), angle: -90, position: "left", style: { textAnchor: "middle", fontSize: "12px" } }
|
|
80
|
-
}
|
|
81
|
-
),
|
|
82
|
-
a.showTooltip && /* @__PURE__ */ e(
|
|
83
|
-
G,
|
|
84
|
-
{
|
|
85
|
-
formatter: (s, r) => s == null ? ["No data", r] : r === "Target" ? [v(s), "Target Value"] : [v(s), r]
|
|
86
|
-
}
|
|
87
|
-
),
|
|
88
|
-
T && /* @__PURE__ */ e(
|
|
89
|
-
C,
|
|
90
|
-
{
|
|
91
|
-
wrapperStyle: { fontSize: "12px", paddingTop: "25px" },
|
|
92
|
-
iconType: "line",
|
|
93
|
-
iconSize: 8,
|
|
94
|
-
layout: "horizontal",
|
|
95
|
-
align: "center",
|
|
96
|
-
verticalAlign: "bottom",
|
|
97
|
-
onMouseEnter: (s) => y(String(s.dataKey || "")),
|
|
98
|
-
onMouseLeave: () => y(null)
|
|
99
|
-
}
|
|
100
|
-
),
|
|
101
|
-
L.map((s, r) => /* @__PURE__ */ e(
|
|
102
|
-
u,
|
|
103
|
-
{
|
|
104
|
-
type: "monotone",
|
|
105
|
-
dataKey: s,
|
|
106
|
-
stroke: x?.colors && x.colors[r % x.colors.length] || A[r % A.length],
|
|
107
|
-
strokeWidth: 2,
|
|
108
|
-
dot: { r: 3 },
|
|
109
|
-
activeDot: { r: 5 },
|
|
110
|
-
strokeOpacity: h ? h === s ? 1 : 0.3 : 1,
|
|
111
|
-
connectNulls: a.connectNulls
|
|
112
|
-
},
|
|
113
|
-
s
|
|
114
|
-
)),
|
|
115
|
-
f.length > 0 && /* @__PURE__ */ l(D, { children: [
|
|
116
|
-
/* @__PURE__ */ e(
|
|
117
|
-
u,
|
|
118
|
-
{
|
|
119
|
-
type: "monotone",
|
|
120
|
-
dataKey: "__target",
|
|
121
|
-
stroke: "#ffffff",
|
|
122
|
-
strokeWidth: 2,
|
|
123
|
-
dot: !1,
|
|
124
|
-
activeDot: !1,
|
|
125
|
-
connectNulls: !1
|
|
126
|
-
}
|
|
127
|
-
),
|
|
128
|
-
/* @__PURE__ */ e(
|
|
129
|
-
u,
|
|
130
|
-
{
|
|
131
|
-
type: "monotone",
|
|
132
|
-
dataKey: "__target",
|
|
133
|
-
name: "Target",
|
|
134
|
-
stroke: "#8B5CF6",
|
|
135
|
-
strokeWidth: 2,
|
|
136
|
-
strokeDasharray: "2 3",
|
|
137
|
-
dot: !1,
|
|
138
|
-
activeDot: !1,
|
|
139
|
-
connectNulls: !1
|
|
140
|
-
}
|
|
141
|
-
)
|
|
142
|
-
] })
|
|
143
|
-
] }) });
|
|
144
|
-
} catch (a) {
|
|
145
|
-
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-red-500 p-4", style: { height: i }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
146
|
-
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Line Chart Error" }),
|
|
147
|
-
/* @__PURE__ */ e("div", { className: "text-xs mb-2", children: a instanceof Error ? a.message : "Unknown rendering error" }),
|
|
148
|
-
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
149
|
-
] }) });
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
export {
|
|
153
|
-
$ as default
|
|
154
|
-
};
|
|
155
|
-
//# sourceMappingURL=chart-linechart-BdfBVl3m.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-linechart-BdfBVl3m.js","sources":["../../../src/client/components/charts/LineChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { LineChart as RechartsLineChart, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatNumericValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function LineChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap, getFieldLabel } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in line chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields,\n labelMap\n )\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n \n // Use custom chart margins with extra left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\n }\n \n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n \n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n \n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for line chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis \n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis \n tick={{ fontSize: 12 }} \n label={{ value: getFieldLabel(yAxisFields[0]), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n return [formatNumericValue(value), 'Target Value']\n }\n return [formatNumericValue(value), name]\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '25px' }}\n iconType=\"line\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n stroke={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n strokeWidth={2}\n dot={{ r: 3 }}\n activeDot={{ r: 5 }}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n connectNulls={safeDisplayConfig.connectNulls}\n />\n ))}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </RechartsLineChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'LineChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Line Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["LineChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","getFieldLabel","useCubeContext","safeDisplayConfig","jsx","jsxs","xAxisField","yAxisFields","seriesFields","chartData","seriesKeys","transformChartDataWithSeries","showLegend","chartMargins","CHART_MARGINS","targetValues","parseTargetValues","spreadTargets","spreadTargetValues","enhancedChartData","dataPoint","index","ChartContainer","RechartsLineChart","CartesianGrid","XAxis","YAxis","ChartTooltip","value","name","formatNumericValue","Legend","o","seriesKey","Line","CHART_COLORS","Fragment","error"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-linechart-config-C5tpU_2u.js","sources":["../../../src/client/components/charts/LineChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the line chart type\n */\nexport const lineChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('line'),\n description: 'Show trends and changes over time',\n useCase: 'Best for continuous data, trends, time series, and showing relationships between multiple series',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for line values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Multiple Lines)',\n description: 'Dimensions to create separate lines',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for multiple lines'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n }\n ]\n}"],"names":["lineChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,MAAM;AAAA,EAC7B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
import { jsx as c, jsxs as m } from "react/jsx-runtime";
|
|
2
|
-
function H({
|
|
3
|
-
displayConfig: p = {},
|
|
4
|
-
height: x = "100%",
|
|
5
|
-
colorPalette: g
|
|
6
|
-
}) {
|
|
7
|
-
const k = p.content || "", w = p.accentColorIndex ?? 0, N = p.fontSize || "medium", u = p.alignment || "left", h = g?.colors && w < g.colors.length ? g.colors[w] : "#8884d8", y = {
|
|
8
|
-
small: "text-sm",
|
|
9
|
-
medium: "text-lg",
|
|
10
|
-
large: "text-xl"
|
|
11
|
-
}, v = {
|
|
12
|
-
left: "text-left",
|
|
13
|
-
center: "text-center",
|
|
14
|
-
right: "text-right"
|
|
15
|
-
}, M = (n) => {
|
|
16
|
-
const e = n.split(`
|
|
17
|
-
`), l = [];
|
|
18
|
-
let t = null;
|
|
19
|
-
for (let o = 0; o < e.length; o++) {
|
|
20
|
-
const i = e[o].trim();
|
|
21
|
-
if (!i) {
|
|
22
|
-
t && (l.push(t), t = null), l.push({ type: "break" });
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
const a = i.match(/^(#{1,3})\s+(.*)$/);
|
|
26
|
-
if (a) {
|
|
27
|
-
t && (l.push(t), t = null), l.push({
|
|
28
|
-
type: "header",
|
|
29
|
-
level: a[1].length,
|
|
30
|
-
content: a[2]
|
|
31
|
-
});
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
const s = i.match(/^[-*+]\s+(.*)$/);
|
|
35
|
-
if (s) {
|
|
36
|
-
(!t || t.ordered) && (t && l.push(t), t = { type: "list", ordered: !1, children: [] }), t.children.push({
|
|
37
|
-
type: "listItem",
|
|
38
|
-
children: $(s[1]),
|
|
39
|
-
parentOrdered: !1
|
|
40
|
-
});
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const r = i.match(/^\d+\.\s+(.*)$/);
|
|
44
|
-
if (r) {
|
|
45
|
-
(!t || !t.ordered) && (t && l.push(t), t = { type: "list", ordered: !0, children: [] }), t.children.push({
|
|
46
|
-
type: "listItem",
|
|
47
|
-
children: $(r[1]),
|
|
48
|
-
parentOrdered: !0
|
|
49
|
-
});
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
t && (l.push(t), t = null), l.push({
|
|
53
|
-
type: "paragraph",
|
|
54
|
-
children: $(i)
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
return t && l.push(t), l;
|
|
58
|
-
}, $ = (n) => {
|
|
59
|
-
const e = [];
|
|
60
|
-
let l = n;
|
|
61
|
-
for (; l; ) {
|
|
62
|
-
const t = l.match(/^(.*?)\[([^\]]+)\]\(([^)]+)\)(.*)$/);
|
|
63
|
-
if (t) {
|
|
64
|
-
const [, o, i, a, s] = t;
|
|
65
|
-
o && e.push(...C(o)), e.push({
|
|
66
|
-
type: "link",
|
|
67
|
-
content: i,
|
|
68
|
-
url: a
|
|
69
|
-
}), l = s;
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
e.push(...C(l));
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
return e;
|
|
76
|
-
}, C = (n) => {
|
|
77
|
-
const e = [];
|
|
78
|
-
let l = n;
|
|
79
|
-
for (; l; ) {
|
|
80
|
-
const t = l.match(/^(.*?)\*\*([^*]+)\*\*(.*)$/);
|
|
81
|
-
if (t) {
|
|
82
|
-
const [, i, a, s] = t;
|
|
83
|
-
i && e.push({ type: "text", content: i }), e.push({ type: "bold", content: a }), l = s;
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
const o = l.match(/^(.*?)\*([^*]+)\*(.*)$/);
|
|
87
|
-
if (o) {
|
|
88
|
-
const [, i, a, s] = o;
|
|
89
|
-
i && e.push({ type: "text", content: i }), e.push({ type: "italic", content: a }), l = s;
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
e.push({ type: "text", content: l });
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
return e;
|
|
96
|
-
}, d = (n, e, l) => {
|
|
97
|
-
switch (n.type) {
|
|
98
|
-
case "text":
|
|
99
|
-
return /* @__PURE__ */ c("span", { className: "text-dc-text", children: n.content }, e);
|
|
100
|
-
case "bold":
|
|
101
|
-
return /* @__PURE__ */ c("strong", { className: "font-bold text-dc-text", children: n.content }, e);
|
|
102
|
-
case "italic":
|
|
103
|
-
return /* @__PURE__ */ c("em", { className: "italic text-dc-text", children: n.content }, e);
|
|
104
|
-
case "link":
|
|
105
|
-
return /* @__PURE__ */ c(
|
|
106
|
-
"a",
|
|
107
|
-
{
|
|
108
|
-
href: n.url,
|
|
109
|
-
target: "_blank",
|
|
110
|
-
rel: "nofollow noopener noreferrer",
|
|
111
|
-
className: "hover:underline transition-colors",
|
|
112
|
-
style: { color: h },
|
|
113
|
-
children: n.content
|
|
114
|
-
},
|
|
115
|
-
e
|
|
116
|
-
);
|
|
117
|
-
case "header":
|
|
118
|
-
const t = (s, r) => {
|
|
119
|
-
const f = "font-bold", I = {
|
|
120
|
-
1: "mb-4",
|
|
121
|
-
2: "mb-3",
|
|
122
|
-
3: "mb-2"
|
|
123
|
-
};
|
|
124
|
-
let b = "";
|
|
125
|
-
return r === "small" ? b = { 1: "text-lg", 2: "text-base", 3: "text-sm" }[s] || "text-sm" : r === "large" ? b = { 1: "text-5xl", 2: "text-4xl", 3: "text-3xl" }[s] || "text-3xl" : b = { 1: "text-3xl", 2: "text-2xl", 3: "text-xl" }[s] || "text-xl", `${f} ${b} ${I[s]}`;
|
|
126
|
-
}, o = `h${n.level}`;
|
|
127
|
-
return /* @__PURE__ */ c(
|
|
128
|
-
o,
|
|
129
|
-
{
|
|
130
|
-
className: t(n.level, N),
|
|
131
|
-
style: { color: h },
|
|
132
|
-
children: n.content
|
|
133
|
-
},
|
|
134
|
-
e
|
|
135
|
-
);
|
|
136
|
-
case "paragraph":
|
|
137
|
-
return /* @__PURE__ */ c("p", { className: "mb-3 leading-relaxed", children: n.children?.map((s, r) => d(s, r)) }, e);
|
|
138
|
-
case "list":
|
|
139
|
-
const i = n.ordered ? "ol" : "ul";
|
|
140
|
-
let a = "mb-3";
|
|
141
|
-
return u === "center" ? a += " list-none flex flex-col items-center" : u === "right" ? a += " list-none ml-auto max-w-max" : a += " list-none ml-6", /* @__PURE__ */ c(i, { className: a, children: n.children?.map((s, r) => d(s, r, n.ordered ? r + 1 : void 0)) }, e);
|
|
142
|
-
case "listItem":
|
|
143
|
-
if (n.children) {
|
|
144
|
-
if (n.parentOrdered && l !== void 0) {
|
|
145
|
-
const s = y[N];
|
|
146
|
-
return u === "center" ? /* @__PURE__ */ m("li", { className: "mb-1 flex items-center justify-center", children: [
|
|
147
|
-
/* @__PURE__ */ m(
|
|
148
|
-
"span",
|
|
149
|
-
{
|
|
150
|
-
className: `inline-block mr-2 shrink-0 ${s} font-medium`,
|
|
151
|
-
style: { color: h },
|
|
152
|
-
children: [
|
|
153
|
-
l,
|
|
154
|
-
"."
|
|
155
|
-
]
|
|
156
|
-
}
|
|
157
|
-
),
|
|
158
|
-
/* @__PURE__ */ c("span", { className: "text-center", children: n.children.map((r, f) => d(r, f)) })
|
|
159
|
-
] }, e) : u === "right" ? /* @__PURE__ */ m("li", { className: "mb-1 flex items-start justify-end", children: [
|
|
160
|
-
/* @__PURE__ */ c("span", { className: "text-right", children: n.children.map((r, f) => d(r, f)) }),
|
|
161
|
-
/* @__PURE__ */ m(
|
|
162
|
-
"span",
|
|
163
|
-
{
|
|
164
|
-
className: `inline-block ml-2 shrink-0 ${s} font-medium`,
|
|
165
|
-
style: { color: h },
|
|
166
|
-
children: [
|
|
167
|
-
l,
|
|
168
|
-
"."
|
|
169
|
-
]
|
|
170
|
-
}
|
|
171
|
-
)
|
|
172
|
-
] }, e) : /* @__PURE__ */ m("li", { className: "mb-1 flex items-start", children: [
|
|
173
|
-
/* @__PURE__ */ m(
|
|
174
|
-
"span",
|
|
175
|
-
{
|
|
176
|
-
className: `inline-block mr-3 shrink-0 ${s} font-medium`,
|
|
177
|
-
style: { color: h },
|
|
178
|
-
children: [
|
|
179
|
-
l,
|
|
180
|
-
"."
|
|
181
|
-
]
|
|
182
|
-
}
|
|
183
|
-
),
|
|
184
|
-
/* @__PURE__ */ c("span", { className: "flex-1", children: n.children.map((r, f) => d(r, f)) })
|
|
185
|
-
] }, e);
|
|
186
|
-
}
|
|
187
|
-
return u === "center" ? /* @__PURE__ */ m("li", { className: "mb-1 flex items-center justify-center", children: [
|
|
188
|
-
/* @__PURE__ */ c(
|
|
189
|
-
"span",
|
|
190
|
-
{
|
|
191
|
-
className: "inline-block w-2 h-2 rounded-full mr-2 shrink-0",
|
|
192
|
-
style: { backgroundColor: h }
|
|
193
|
-
}
|
|
194
|
-
),
|
|
195
|
-
/* @__PURE__ */ c("span", { className: "text-center", children: n.children.map((s, r) => d(s, r)) })
|
|
196
|
-
] }, e) : u === "right" ? /* @__PURE__ */ m("li", { className: "mb-1 flex items-start justify-end", children: [
|
|
197
|
-
/* @__PURE__ */ c("span", { className: "text-right", children: n.children.map((s, r) => d(s, r)) }),
|
|
198
|
-
/* @__PURE__ */ c(
|
|
199
|
-
"span",
|
|
200
|
-
{
|
|
201
|
-
className: "inline-block w-2 h-2 rounded-full ml-2 mt-2 shrink-0",
|
|
202
|
-
style: { backgroundColor: h }
|
|
203
|
-
}
|
|
204
|
-
)
|
|
205
|
-
] }, e) : /* @__PURE__ */ m("li", { className: "mb-1 flex items-start", children: [
|
|
206
|
-
/* @__PURE__ */ c(
|
|
207
|
-
"span",
|
|
208
|
-
{
|
|
209
|
-
className: "inline-block w-2 h-2 rounded-full mr-3 mt-2 shrink-0",
|
|
210
|
-
style: { backgroundColor: h }
|
|
211
|
-
}
|
|
212
|
-
),
|
|
213
|
-
/* @__PURE__ */ c("span", { className: "flex-1", children: n.children.map((s, r) => d(s, r)) })
|
|
214
|
-
] }, e);
|
|
215
|
-
}
|
|
216
|
-
return null;
|
|
217
|
-
case "break":
|
|
218
|
-
return /* @__PURE__ */ c("br", {}, e);
|
|
219
|
-
default:
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
if (!k.trim())
|
|
224
|
-
return /* @__PURE__ */ c(
|
|
225
|
-
"div",
|
|
226
|
-
{
|
|
227
|
-
className: "flex items-center justify-center w-full h-full",
|
|
228
|
-
style: {
|
|
229
|
-
height: x === "100%" ? "100%" : x,
|
|
230
|
-
minHeight: x === "100%" ? "200px" : void 0
|
|
231
|
-
},
|
|
232
|
-
children: /* @__PURE__ */ m("div", { className: "text-center text-dc-text-muted", children: [
|
|
233
|
-
/* @__PURE__ */ c("div", { className: "text-sm font-semibold mb-1", children: "No content" }),
|
|
234
|
-
/* @__PURE__ */ c("div", { className: "text-xs text-dc-text-secondary", children: "Add markdown content in the chart configuration" })
|
|
235
|
-
] })
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
const j = M(k);
|
|
239
|
-
return /* @__PURE__ */ c(
|
|
240
|
-
"div",
|
|
241
|
-
{
|
|
242
|
-
className: `p-4 w-full h-full overflow-auto ${y[N]} ${v[u]}`,
|
|
243
|
-
style: {
|
|
244
|
-
height: x === "100%" ? "100%" : x,
|
|
245
|
-
minHeight: x === "100%" ? "200px" : void 0
|
|
246
|
-
},
|
|
247
|
-
children: j.map((n, e) => d(n, e))
|
|
248
|
-
}
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
export {
|
|
252
|
-
H as default
|
|
253
|
-
};
|
|
254
|
-
//# sourceMappingURL=chart-markdownchart-C3FAQFuO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-markdownchart-C3FAQFuO.js","sources":["../../../src/client/components/charts/MarkdownChart.tsx"],"sourcesContent":["import React from 'react'\nimport type { ChartProps } from '../../types'\n\ninterface MarkdownNode {\n type: 'text' | 'bold' | 'italic' | 'link' | 'header' | 'list' | 'listItem' | 'paragraph' | 'break'\n content?: string\n url?: string\n level?: number\n ordered?: boolean\n children?: MarkdownNode[]\n parentOrdered?: boolean // For list items to know if parent list is ordered\n}\n\nexport default function MarkdownChart({ \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const content = displayConfig.content || ''\n const accentColorIndex = displayConfig.accentColorIndex ?? 0\n const fontSize = displayConfig.fontSize || 'medium'\n const alignment = displayConfig.alignment || 'left'\n\n // Get accent color from palette\n const getAccentColor = (): string => {\n if (colorPalette?.colors && accentColorIndex < colorPalette.colors.length) {\n return colorPalette.colors[accentColorIndex]\n }\n return '#8884d8' // Default color\n }\n\n const accentColor = getAccentColor()\n\n // Font size mapping\n const fontSizeClasses = {\n small: 'text-sm',\n medium: 'text-lg', \n large: 'text-xl'\n }\n\n // Alignment mapping\n const alignmentClasses = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right'\n }\n\n // Simple markdown parser\n const parseMarkdown = (text: string): MarkdownNode[] => {\n const lines = text.split('\\n')\n const nodes: MarkdownNode[] = []\n let currentList: MarkdownNode | null = null\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim()\n \n if (!line) {\n // Empty line - end current list and add line break\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({ type: 'break' })\n continue\n }\n\n // Headers\n const headerMatch = line.match(/^(#{1,3})\\s+(.*)$/)\n if (headerMatch) {\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({\n type: 'header',\n level: headerMatch[1].length,\n content: headerMatch[2]\n })\n continue\n }\n\n // Unordered list\n const unorderedMatch = line.match(/^[-*+]\\s+(.*)$/)\n if (unorderedMatch) {\n if (!currentList || currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: false, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(unorderedMatch[1]),\n parentOrdered: false\n })\n continue\n }\n\n // Ordered list\n const orderedMatch = line.match(/^\\d+\\.\\s+(.*)$/)\n if (orderedMatch) {\n if (!currentList || !currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: true, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(orderedMatch[1]),\n parentOrdered: true\n })\n continue\n }\n\n // Regular paragraph\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n \n nodes.push({\n type: 'paragraph',\n children: parseInline(line)\n })\n }\n\n // Add any remaining list\n if (currentList) {\n nodes.push(currentList)\n }\n\n return nodes\n }\n\n // Parse inline elements (bold, italic, links)\n const parseInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n \n while (remaining) {\n // Try to match link first [text](url)\n const linkMatch = remaining.match(/^(.*?)\\[([^\\]]+)\\]\\(([^)]+)\\)(.*)$/)\n if (linkMatch) {\n const [, before, linkText, url, after] = linkMatch\n if (before) {\n nodes.push(...parseSimpleInline(before))\n }\n nodes.push({\n type: 'link',\n content: linkText,\n url: url\n })\n remaining = after\n continue\n }\n\n // No more special formatting, parse remaining as simple inline\n nodes.push(...parseSimpleInline(remaining))\n break\n }\n\n return nodes\n }\n\n // Parse bold and italic\n const parseSimpleInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n\n while (remaining) {\n // Try bold first **text**\n const boldMatch = remaining.match(/^(.*?)\\*\\*([^*]+)\\*\\*(.*)$/)\n if (boldMatch) {\n const [, before, boldText, after] = boldMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'bold', content: boldText })\n remaining = after\n continue\n }\n\n // Try italic *text*\n const italicMatch = remaining.match(/^(.*?)\\*([^*]+)\\*(.*)$/)\n if (italicMatch) {\n const [, before, italicText, after] = italicMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'italic', content: italicText })\n remaining = after\n continue\n }\n\n // No more formatting, add as text\n nodes.push({ type: 'text', content: remaining })\n break\n }\n\n return nodes\n }\n\n // Render markdown nodes to React elements\n const renderNode = (node: MarkdownNode, key: number, listNumber?: number): React.ReactNode => {\n switch (node.type) {\n case 'text':\n return <span key={key} className=\"text-dc-text\">{node.content}</span>\n\n case 'bold':\n return <strong key={key} className=\"font-bold text-dc-text\">{node.content}</strong>\n\n case 'italic':\n return <em key={key} className=\"italic text-dc-text\">{node.content}</em>\n\n case 'link':\n return (\n <a \n key={key}\n href={node.url}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n className=\"hover:underline transition-colors\"\n style={{ color: accentColor }}\n >\n {node.content}\n </a>\n )\n\n case 'header':\n // Header classes that scale with fontSize setting\n const getHeaderClasses = (level: number, fontSize: string) => {\n const baseClasses = 'font-bold'\n const marginClasses = {\n 1: 'mb-4',\n 2: 'mb-3', \n 3: 'mb-2'\n }\n \n let sizeClasses = ''\n if (fontSize === 'small') {\n sizeClasses = { 1: 'text-lg', 2: 'text-base', 3: 'text-sm' }[level] || 'text-sm'\n } else if (fontSize === 'large') {\n sizeClasses = { 1: 'text-5xl', 2: 'text-4xl', 3: 'text-3xl' }[level] || 'text-3xl'\n } else { // medium (default)\n sizeClasses = { 1: 'text-3xl', 2: 'text-2xl', 3: 'text-xl' }[level] || 'text-xl'\n }\n \n return `${baseClasses} ${sizeClasses} ${marginClasses[level as keyof typeof marginClasses]}`\n }\n \n const HeaderTag = `h${node.level}` as keyof JSX.IntrinsicElements\n return (\n <HeaderTag \n key={key} \n className={getHeaderClasses(node.level as number, fontSize)}\n style={{ color: accentColor }}\n >\n {node.content}\n </HeaderTag>\n )\n\n case 'paragraph':\n return (\n <p key={key} className=\"mb-3 leading-relaxed\">\n {node.children?.map((child, i) => renderNode(child, i))}\n </p>\n )\n\n case 'list':\n const ListTag = node.ordered ? 'ol' : 'ul'\n let listClasses = 'mb-3'\n \n if (alignment === 'center') {\n listClasses += ' list-none flex flex-col items-center'\n } else if (alignment === 'right') {\n listClasses += ' list-none ml-auto max-w-max'\n } else {\n listClasses += ' list-none ml-6'\n }\n \n return (\n <ListTag key={key} className={listClasses}>\n {node.children?.map((child, i) => renderNode(child, i, node.ordered ? i + 1 : undefined))}\n </ListTag>\n )\n\n case 'listItem':\n if (node.children) {\n // For ordered lists, use custom colored numbers\n if (node.parentOrdered && listNumber !== undefined) {\n const numberSizeClass = fontSizeClasses[fontSize as keyof typeof fontSizeClasses]\n \n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className={`inline-block mr-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className={`inline-block ml-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className={`inline-block mr-3 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n \n // For unordered lists, use custom bullets with alignment\n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className=\"inline-block w-2 h-2 rounded-full ml-2 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-3 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n return null\n\n case 'break':\n return <br key={key} />\n\n default:\n return null\n }\n }\n\n if (!content.trim()) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No content</div>\n <div className=\"text-xs text-dc-text-secondary\">Add markdown content in the chart configuration</div>\n </div>\n </div>\n )\n }\n\n const parsedNodes = parseMarkdown(content)\n\n return (\n <div \n className={`p-4 w-full h-full overflow-auto ${fontSizeClasses[fontSize as keyof typeof fontSizeClasses]} ${alignmentClasses[alignment as keyof typeof alignmentClasses]}`}\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {parsedNodes.map((node, index) => renderNode(node, index))}\n </div>\n )\n}"],"names":["MarkdownChart","displayConfig","height","colorPalette","content","accentColorIndex","fontSize","alignment","accentColor","fontSizeClasses","alignmentClasses","parseMarkdown","text","lines","nodes","currentList","i","line","headerMatch","unorderedMatch","parseInline","orderedMatch","remaining","linkMatch","before","linkText","url","after","parseSimpleInline","boldMatch","boldText","italicMatch","italicText","renderNode","node","key","listNumber","jsx","getHeaderClasses","level","baseClasses","marginClasses","sizeClasses","HeaderTag","child","ListTag","listClasses","numberSizeClass","jsxs","parsedNodes","index"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-piechart-CiFJQtC8.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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"}
|