drizzle-cube 0.5.8 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/adapters/adapters/hono/agent-handler.d.ts +9 -0
- package/dist/adapters/adapters/hono/mcp-handler.d.ts +37 -0
- package/dist/adapters/adapters/mcp-tools-handlers.d.ts +18 -0
- package/dist/adapters/adapters/nextjs/mcp-handler.d.ts +36 -0
- package/dist/adapters/adapters/utils.d.ts +6 -81
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +50 -50
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +78 -78
- package/dist/adapters/google-BOnRIN1w.cjs +2 -0
- package/dist/adapters/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
- package/dist/adapters/{handler-Cx8QYLk6.js → handler-CfgE0JSL.js} +499 -576
- package/dist/adapters/handler-Cn0dOctE.cjs +25 -0
- package/dist/adapters/hono/index.cjs +2 -2
- package/dist/adapters/hono/index.js +205 -175
- package/dist/adapters/locale-DDvZDFVn.js +8114 -0
- package/dist/adapters/locale-ZLUUNUxr.cjs +166 -0
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +49 -38
- package/dist/adapters/mcp-transport-Chiaj4ll.cjs +40 -0
- package/dist/adapters/mcp-transport-H96VG3WY.js +591 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +190 -197
- package/dist/adapters/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
- package/dist/adapters/openai-vXvLni8v.cjs +1 -0
- package/dist/adapters/{utils-D9JPLmfl.js → utils-BPWZsX7k.js} +1271 -1218
- package/dist/adapters/utils-_whV4fXL.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.js +2 -2
- package/dist/client/charts/ChartLoader.d.ts +2 -16
- package/dist/client/charts/chartComponentRegistry.d.ts +46 -0
- package/dist/client/charts/chartConfigHelpers.d.ts +38 -0
- package/dist/client/charts.js +14 -13
- package/dist/client/chunks/{DashboardEditModal-CjCIAT-J.js → DashboardEditModal-okVfH8ZK.js} +5296 -4544
- package/dist/client/chunks/DashboardEditModal-okVfH8ZK.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js → RetentionCombinedChart-BgbDhsPz.js} +10 -10
- package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js.map → RetentionCombinedChart-BgbDhsPz.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js → RetentionHeatmap-DjXZaTPq.js} +5 -5
- package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js.map → RetentionHeatmap-DjXZaTPq.js.map} +1 -1
- package/dist/client/chunks/analysis-builder-DB88FojM.js +5674 -0
- package/dist/client/chunks/analysis-builder-DB88FojM.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-shared-CYVwSPqt.js → analysis-builder-shared-BVK4TYfR.js} +1578 -1292
- package/dist/client/chunks/analysis-builder-shared-BVK4TYfR.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-DmruKPab.js → chart-activity-grid-DX0SJbxs.js} +635 -492
- package/dist/client/chunks/chart-activity-grid-DX0SJbxs.js.map +1 -0
- package/dist/client/chunks/chart-area-of01_62R.js +775 -0
- package/dist/client/chunks/chart-area-of01_62R.js.map +1 -0
- package/dist/client/chunks/chart-bar-BqelQE_I.js +194 -0
- package/dist/client/chunks/chart-bar-BqelQE_I.js.map +1 -0
- package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js → chart-box-plot-kkBixZ27.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js.map → chart-box-plot-kkBixZ27.js.map} +1 -1
- package/dist/client/chunks/chart-bubble-B2he1--4.js +221 -0
- package/dist/client/chunks/chart-bubble-B2he1--4.js.map +1 -0
- package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js → chart-candlestick-DZp19Tzh.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js.map → chart-candlestick-DZp19Tzh.js.map} +1 -1
- package/dist/client/chunks/chart-config-area-BNigHUy8.js +124 -0
- package/dist/client/chunks/chart-config-area-BNigHUy8.js.map +1 -0
- package/dist/client/chunks/chart-config-bar-DSO_LRTx.js +54 -0
- package/dist/client/chunks/chart-config-bar-DSO_LRTx.js.map +1 -0
- package/dist/client/chunks/{chart-config-box-plot-DJ-dWWXA.js → chart-config-box-plot-oW8axV2q.js} +5 -10
- package/dist/client/chunks/chart-config-box-plot-oW8axV2q.js.map +1 -0
- package/dist/client/chunks/{chart-config-gauge-DSwC04l0.js → chart-config-gauge-Dq-_H9UN.js} +5 -7
- package/dist/client/chunks/chart-config-gauge-Dq-_H9UN.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-delta-D6BIkHL3.js → chart-config-kpi-delta-DSQbvqu_.js} +5 -10
- package/dist/client/chunks/chart-config-kpi-delta-DSQbvqu_.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-number-Bx-V9a62.js → chart-config-kpi-number-EFSWY1We.js} +5 -7
- package/dist/client/chunks/chart-config-kpi-number-EFSWY1We.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-text-CcqC1u-8.js → chart-config-kpi-text-KM3V5X2u.js} +5 -7
- package/dist/client/chunks/chart-config-kpi-text-KM3V5X2u.js.map +1 -0
- package/dist/client/chunks/{chart-config-line-Db3jDsWc.js → chart-config-line-D6jG8PCH.js} +9 -36
- package/dist/client/chunks/chart-config-line-D6jG8PCH.js.map +1 -0
- package/dist/client/chunks/{chart-config-pie-DD4SmRTF.js → chart-config-pie-BhzW-fdn.js} +6 -16
- package/dist/client/chunks/chart-config-pie-BhzW-fdn.js.map +1 -0
- package/dist/client/chunks/{chart-config-radar-CC2XAaGr.js → chart-config-radar-D7REP1q_.js} +6 -16
- package/dist/client/chunks/chart-config-radar-D7REP1q_.js.map +1 -0
- package/dist/client/chunks/{chart-config-radial-bar-DmxKx1R0.js → chart-config-radial-bar-Byx6qOPU.js} +6 -16
- package/dist/client/chunks/chart-config-radial-bar-Byx6qOPU.js.map +1 -0
- package/dist/client/chunks/{chart-config-tree-map-BI-oQStO.js → chart-config-tree-map-DVrvf3yQ.js} +6 -16
- package/dist/client/chunks/chart-config-tree-map-DVrvf3yQ.js.map +1 -0
- package/dist/client/chunks/{chart-config-waterfall-DSnyixbI.js → chart-config-waterfall-DmFeQdIk.js} +5 -10
- package/dist/client/chunks/chart-config-waterfall-DmFeQdIk.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-BO4sXsim.js → chart-data-table-CKauQXme.js} +1046 -1121
- package/dist/client/chunks/chart-data-table-CKauQXme.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-DnWRsmnS.js → chart-funnel-CToKSBaL.js} +184 -222
- package/dist/client/chunks/chart-funnel-CToKSBaL.js.map +1 -0
- package/dist/client/chunks/chart-gauge-DTVezSk7.js +403 -0
- package/dist/client/chunks/chart-gauge-DTVezSk7.js.map +1 -0
- package/dist/client/chunks/chart-heat-map-DTuUl0BR.js +236 -0
- package/dist/client/chunks/chart-heat-map-DTuUl0BR.js.map +1 -0
- package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js +408 -0
- package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js.map +1 -0
- package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js +244 -0
- package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js.map +1 -0
- package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js +185 -0
- package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js.map +1 -0
- package/dist/client/chunks/chart-line-DKgrQA6c.js +101 -0
- package/dist/client/chunks/chart-line-DKgrQA6c.js.map +1 -0
- package/dist/client/chunks/{chart-markdown-dgUetjyM.js → chart-markdown-CV75S_zL.js} +2 -2
- package/dist/client/chunks/{chart-markdown-dgUetjyM.js.map → chart-markdown-CV75S_zL.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js → chart-measure-profile-Ket8fJyf.js} +7 -7
- package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js.map → chart-measure-profile-Ket8fJyf.js.map} +1 -1
- package/dist/client/chunks/chart-pie-ByieAX5H.js +119 -0
- package/dist/client/chunks/chart-pie-ByieAX5H.js.map +1 -0
- package/dist/client/chunks/chart-radar-CiSwHWp4.js +138 -0
- package/dist/client/chunks/chart-radar-CiSwHWp4.js.map +1 -0
- package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js +122 -0
- package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js.map +1 -0
- package/dist/client/chunks/{chart-sankey-M3XpO_ah.js → chart-sankey-DjrvKw6K.js} +36 -39
- package/dist/client/chunks/{chart-sankey-M3XpO_ah.js.map → chart-sankey-DjrvKw6K.js.map} +1 -1
- package/dist/client/chunks/chart-scatter-Dd9WFqnS.js +258 -0
- package/dist/client/chunks/chart-scatter-Dd9WFqnS.js.map +1 -0
- package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js → chart-sunburst-leGpuDj7.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js.map → chart-sunburst-leGpuDj7.js.map} +1 -1
- package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js +323 -0
- package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js.map +1 -0
- package/dist/client/chunks/{chart-waterfall-BuhMoagf.js → chart-waterfall-DyvQReN5.js} +7 -7
- package/dist/client/chunks/{chart-waterfall-BuhMoagf.js.map → chart-waterfall-DyvQReN5.js.map} +1 -1
- package/dist/client/chunks/{charts-core-jRtb0S2M.js → charts-core-DaXSt1Dd.js} +2 -2
- package/dist/client/chunks/{charts-core-jRtb0S2M.js.map → charts-core-DaXSt1Dd.js.map} +1 -1
- package/dist/client/chunks/charts-loader-DdTeCeNo.js +84 -0
- package/dist/client/chunks/charts-loader-DdTeCeNo.js.map +1 -0
- package/dist/client/chunks/{nl-NL-CpVs7ox3.js → nl-NL-2zTAWTej.js} +2 -1
- package/dist/client/chunks/{nl-NL-CpVs7ox3.js.map → nl-NL-2zTAWTej.js.map} +1 -1
- package/dist/client/chunks/retention-ChW9jYdy.js.map +1 -1
- package/dist/client/chunks/{schema-visualization-DE09kQE3.js → schema-visualization-Cb_E9_Gd.js} +12 -12
- package/dist/client/chunks/{schema-visualization-DE09kQE3.js.map → schema-visualization-Cb_E9_Gd.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-CoeQbprt.js → useDirtyStateTracking-MbpxH_v6.js} +95 -84
- package/dist/client/chunks/useDirtyStateTracking-MbpxH_v6.js.map +1 -0
- package/dist/client/chunks/{useExplainAI-DlnXWdmz.js → useExplainAI-evnZkjCY.js} +14 -14
- package/dist/client/chunks/{useExplainAI-DlnXWdmz.js.map → useExplainAI-evnZkjCY.js.map} +1 -1
- package/dist/client/chunks/{utils-CTKNaXS8.js → utils-3P6z1vz5.js} +2 -2
- package/dist/client/chunks/{utils-CTKNaXS8.js.map → utils-3P6z1vz5.js.map} +1 -1
- package/dist/client/chunks/{vendor-CPIYyeuD.js → vendor-DSpR0IW6.js} +43 -43
- package/dist/client/chunks/{vendor-CPIYyeuD.js.map → vendor-DSpR0IW6.js.map} +1 -1
- package/dist/client/components/AgenticNotebook/agentChatParts.d.ts +34 -0
- package/dist/client/components/AgenticNotebook/chatMessageParts.d.ts +39 -0
- package/dist/client/components/AgenticNotebook/useAgentChatController.d.ts +25 -0
- package/dist/client/components/AgenticNotebook/useNotebookAutosave.d.ts +12 -0
- package/dist/client/components/AnalysisBuilder/AnalysisQueryPanelParts.d.ts +64 -0
- package/dist/client/components/AnalysisBuilder/AnalysisResultsHeader.d.ts +67 -0
- package/dist/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/BreakdownRow.d.ts +26 -0
- package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/ExecutionPlanPanelParts.d.ts +22 -0
- package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +16 -0
- package/dist/client/components/AnalysisBuilder/FilterValueInput.d.ts +63 -0
- package/dist/client/components/AnalysisBuilder/FlowDepthControls.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +7 -0
- package/dist/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +8 -0
- package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +23 -0
- package/dist/client/components/AnalysisBuilder/SortToggleButton.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/StringArrayInput.d.ts +17 -0
- package/dist/client/components/AnalysisBuilder/filterConfigModalUtils.d.ts +30 -0
- package/dist/client/components/AnalysisBuilder/hooks/useAnalysisBuilderImperativeHandle.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/hooks/useDragReorder.d.ts +25 -0
- package/dist/client/components/AnalysisBuilder/hooks/useFieldSearchKeyboard.d.ts +11 -0
- package/dist/client/components/AnalysisBuilder/utils/axisConfigUtils.d.ts +23 -0
- package/dist/client/components/AnalysisBuilder/utils/executionPlanMarkdown.d.ts +8 -0
- package/dist/client/components/AnalysisBuilder/utils/fieldUtils.d.ts +5 -0
- package/dist/client/components/AnalysisBuilder/utils/resultsPanelDerive.d.ts +68 -0
- package/dist/client/components/AnalysisBuilder/utils/shareStateUtils.d.ts +68 -0
- package/dist/client/components/AnalysisBuilder/utils/sortUtils.d.ts +7 -0
- package/dist/client/components/DashboardFilters/CompactFilterBarParts.d.ts +26 -0
- package/dist/client/components/DashboardFilters/DashboardFilterConfigModalParts.d.ts +27 -0
- package/dist/client/components/DashboardFilters/DashboardFilterValueInput.d.ts +39 -0
- package/dist/client/components/DashboardFilters/dashboardFilterConfigModalUtils.d.ts +21 -0
- package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +19 -0
- package/dist/client/components/DashboardFilters/useDashboardFilterConfigModal.d.ts +69 -0
- package/dist/client/components/DashboardFilters/useDateRangeState.d.ts +19 -0
- package/dist/client/components/DashboardFilters/useFilterDropdowns.d.ts +21 -0
- package/dist/client/components/DashboardFilters/useFilterValueFetch.d.ts +23 -0
- package/dist/client/components/DashboardPortletCard.d.ts +2 -57
- package/dist/client/components/analyticsPortlet/PortletChart.d.ts +31 -0
- package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +35 -0
- package/dist/client/components/analyticsPortlet/PortletStates.d.ts +65 -0
- package/dist/client/components/analyticsPortlet/parsePortletQuery.d.ts +22 -0
- package/dist/client/components/analyticsPortlet/portletRenderState.d.ts +31 -0
- package/dist/client/components/analyticsPortlet/usePortletDebugData.d.ts +37 -0
- package/dist/client/components/analyticsPortlet/usePortletDrillState.d.ts +17 -0
- package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +37 -0
- package/dist/client/components/charts/ActivityGridChart.helpers.d.ts +33 -0
- package/dist/client/components/charts/ActivityGridChart.render.d.ts +31 -0
- package/dist/client/components/charts/AxisFormatControls.d.ts +3 -1
- package/dist/client/components/charts/BarChart.helpers.d.ts +23 -0
- package/dist/client/components/charts/BarSeries.d.ts +29 -0
- package/dist/client/components/charts/BubbleChart.helpers.d.ts +43 -0
- package/dist/client/components/charts/BubbleChart.render.d.ts +21 -0
- package/dist/client/components/charts/ChartStates.d.ts +38 -0
- package/dist/client/components/charts/FunnelChart.helpers.d.ts +25 -0
- package/dist/client/components/charts/FunnelViews.d.ts +16 -0
- package/dist/client/components/charts/HeatMapCanvas.d.ts +25 -0
- package/dist/client/components/charts/HeatMapChart.helpers.d.ts +64 -0
- package/dist/client/components/charts/KpiDelta.helpers.d.ts +20 -0
- package/dist/client/components/charts/KpiNumber.helpers.d.ts +30 -0
- package/dist/client/components/charts/KpiStates.d.ts +19 -0
- package/dist/client/components/charts/ScatterChart.helpers.d.ts +43 -0
- package/dist/client/components/charts/ScatterSeries.d.ts +17 -0
- package/dist/client/components/charts/ScatterTooltip.d.ts +21 -0
- package/dist/client/components/charts/TreeMapChart.helpers.d.ts +37 -0
- package/dist/client/components/charts/TreeMapContent.d.ts +24 -0
- package/dist/client/components/charts/TreeMapLegend.d.ts +13 -0
- package/dist/client/components/charts/cartesianChartHelpers.d.ts +126 -0
- package/dist/client/components/charts/chartAxisResolution.d.ts +32 -0
- package/dist/client/components/charts/chartScaffolding.d.ts +77 -0
- package/dist/client/components/charts/gaugeChartHelpers.d.ts +36 -0
- package/dist/client/components/charts/kpiTextHelpers.d.ts +46 -0
- package/dist/client/components/charts/radarChartHelpers.d.ts +14 -0
- package/dist/client/components/charts/radialBarChartHelpers.d.ts +22 -0
- package/dist/client/components/charts/useChartDimensions.d.ts +20 -0
- package/dist/client/components/charts/useKpiDimensions.d.ts +30 -0
- package/dist/client/components/dashboard/DashboardEditBar.d.ts +5 -0
- package/dist/client/components/dashboard/LayoutModeToggle.d.ts +10 -0
- package/dist/client/components/dashboardPortletCard/FilterFieldChip.d.ts +12 -0
- package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +43 -0
- package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +33 -0
- package/dist/client/components/dashboardPortletCard/filterField.d.ts +12 -0
- package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +55 -0
- package/dist/client/components/dashboardPortletCard/usePortletCardActions.d.ts +16 -0
- package/dist/client/components/portletAnalysisModal/saveValidation.d.ts +8 -0
- package/dist/client/components/shared/dateRangeUtils.d.ts +40 -0
- package/dist/client/components/shared/filterDisplayUtils.d.ts +10 -0
- package/dist/client/components/shared/filterItem/FilterDateRangeSelector.d.ts +17 -0
- package/dist/client/components/shared/filterItem/FilterFieldDropdown.d.ts +16 -0
- package/dist/client/components/shared/filterItem/dateRangeSync.d.ts +14 -0
- package/dist/client/components/shared/filterItem/fieldVisuals.d.ts +5 -0
- package/dist/client/components/shared/filterValueSelector/FilterValueInputs.d.ts +55 -0
- package/dist/client/components/shared/filterValueSelector/useFilterValueSelectorState.d.ts +25 -0
- package/dist/client/components/shared/queryFieldUtils.d.ts +21 -0
- package/dist/client/components/shared/utils.d.ts +4 -43
- package/dist/client/components.js +3 -3
- package/dist/client/hooks/agentChatStream.d.ts +39 -0
- package/dist/client/hooks/analysisQueryExecutionModes.d.ts +133 -0
- package/dist/client/hooks/drillNavigation.d.ts +25 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +2 -2
- package/dist/client/index.js +816 -669
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +3 -3
- package/dist/client/schema.js +1 -1
- package/dist/client/shared/chartConfigBuilders.d.ts +18 -0
- package/dist/client/shared/components/QueryAnalysisPanel.sections.d.ts +41 -0
- package/dist/client/shared/queryTransforms.d.ts +20 -0
- package/dist/client/shared/utils.d.ts +2 -4
- package/dist/client/stores/optionsToAnalysisConfig.d.ts +17 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/utils/axisValueFormatting.d.ts +32 -0
- package/dist/client/utils/timeValueFormatting.d.ts +32 -0
- package/dist/client/utils.js +6 -6
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +55 -55
- package/dist/server/google-BOnRIN1w.cjs +2 -0
- package/dist/server/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
- package/dist/server/index.cjs +179 -211
- package/dist/server/index.js +6330 -6458
- package/dist/server/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
- package/dist/server/openai-vXvLni8v.cjs +1 -0
- package/dist/server/server/adapters/base-adapter.d.ts +80 -35
- package/dist/server/server/adapters/databend-adapter.d.ts +8 -59
- package/dist/server/server/adapters/duckdb-adapter.d.ts +5 -59
- package/dist/server/server/adapters/mysql-adapter.d.ts +13 -70
- package/dist/server/server/adapters/postgres-adapter.d.ts +1 -65
- package/dist/server/server/adapters/snowflake-adapter.d.ts +5 -68
- package/dist/server/server/adapters/sqlite-adapter.d.ts +12 -32
- package/dist/server/server/adapters/window-function-builder.d.ts +11 -0
- package/dist/server/server/agent/chart-validation.d.ts +0 -5
- package/dist/server/server/agent/handler-steps.d.ts +37 -0
- package/dist/server/server/ai/discovery-helpers.d.ts +29 -0
- package/dist/server/server/ai/discovery.d.ts +4 -0
- package/dist/server/server/ai/suggestion-helpers.d.ts +33 -0
- package/dist/server/server/ai/suggestion.d.ts +0 -3
- package/dist/server/server/ai/validation-helpers.d.ts +21 -0
- package/dist/server/server/ai/validation.d.ts +0 -3
- package/dist/server/server/builders/analysis-utils.d.ts +106 -0
- package/dist/server/server/builders/cte-builder.d.ts +46 -0
- package/dist/server/server/builders/date-time-builder.d.ts +5 -0
- package/dist/server/server/builders/date-time-helpers.d.ts +34 -0
- package/dist/server/server/builders/filter-builder.d.ts +2 -0
- package/dist/server/server/builders/filter-operators.d.ts +23 -0
- package/dist/server/server/builders/flow-query-builder.d.ts +46 -19
- package/dist/server/server/builders/funnel-query-builder.d.ts +16 -5
- package/dist/server/server/builders/group-by-builder.d.ts +11 -0
- package/dist/server/server/builders/measure-builder.d.ts +43 -0
- package/dist/server/server/builders/retention-query-builder.d.ts +12 -14
- package/dist/server/server/cache-utils.d.ts +25 -5
- package/dist/server/server/compiler-metadata.d.ts +11 -0
- package/dist/server/server/compiler.d.ts +8 -14
- package/dist/server/server/cube-utils.d.ts +29 -4
- package/dist/server/server/execution/annotation-builder.d.ts +12 -0
- package/dist/server/server/execution/filter-cache-preloader.d.ts +19 -0
- package/dist/server/server/execution/mode-router.d.ts +25 -0
- package/dist/server/server/execution/query-result-cache.d.ts +21 -0
- package/dist/server/server/execution/result-post-processor.d.ts +10 -0
- package/dist/server/server/executor.d.ts +33 -30
- package/dist/server/server/executors/explain-utils.d.ts +28 -0
- package/dist/server/server/explain/explain-tree.d.ts +20 -0
- package/dist/server/server/filter-cache.d.ts +2 -2
- package/dist/server/server/gap-filler.d.ts +6 -0
- package/dist/server/server/index.d.ts +3 -1
- package/dist/server/server/logical-plan/cte-planner-helpers.d.ts +37 -0
- package/dist/server/server/logical-plan/cte-planner.d.ts +104 -0
- package/dist/server/server/logical-plan/filter-propagation.d.ts +44 -0
- package/dist/server/server/logical-plan/index.d.ts +6 -1
- package/dist/server/server/logical-plan/join-planner.d.ts +27 -0
- package/dist/server/server/logical-plan/logical-planner.d.ts +7 -200
- package/dist/server/server/logical-plan/optimiser.d.ts +3 -1
- package/dist/server/server/logical-plan/plan-analysis-reporter.d.ts +59 -0
- package/dist/server/server/logical-plan/planner-utils.d.ts +20 -0
- package/dist/server/server/logical-plan/types.d.ts +17 -9
- package/dist/server/server/measure-classification.d.ts +40 -0
- package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +21 -21
- package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +11 -0
- package/dist/server/server/physical-plan/processors/index.d.ts +2 -0
- package/dist/server/server/physical-plan/processors/keys-dedup-processor.d.ts +13 -0
- package/dist/server/server/physical-plan/processors/multi-fact-processor.d.ts +13 -0
- package/dist/server/server/physical-plan/processors/shared.d.ts +5 -0
- package/dist/server/server/query-handlers.d.ts +79 -0
- package/dist/server/server/query-modes.d.ts +28 -0
- package/dist/server/server/query-validator.d.ts +9 -0
- package/dist/server/server/resolvers/calculated-measure-resolver.d.ts +5 -0
- package/dist/server/server/resolvers/join-path-resolver.d.ts +6 -0
- package/dist/server/server/sql-format.d.ts +11 -0
- package/dist/server/server/types/cube.d.ts +18 -4
- package/dist/server/server/types/flow.d.ts +6 -5
- package/dist/server/server/types/index.d.ts +1 -1
- package/dist/server/server/types/validation.d.ts +14 -0
- package/package.json +11 -4
- package/dist/adapters/google-DUlXeeDA.cjs +0 -2
- package/dist/adapters/handler-CzbCuS6_.cjs +0 -25
- package/dist/adapters/locale-BPB7flIG.js +0 -8249
- package/dist/adapters/locale-tIMrNcCr.cjs +0 -198
- package/dist/adapters/mcp-transport-C2QzXm6h.cjs +0 -40
- package/dist/adapters/mcp-transport-D0B3S1tB.js +0 -579
- package/dist/adapters/openai-D_U4V0kT.cjs +0 -1
- package/dist/adapters/utils-KV37IBIv.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-CjCIAT-J.js.map +0 -1
- package/dist/client/chunks/analysis-builder-MuMIzoRq.js +0 -5367
- package/dist/client/chunks/analysis-builder-MuMIzoRq.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-CYVwSPqt.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-DmruKPab.js.map +0 -1
- package/dist/client/chunks/chart-area-DHCPM4Em.js +0 -450
- package/dist/client/chunks/chart-area-DHCPM4Em.js.map +0 -1
- package/dist/client/chunks/chart-bar-KddciGDv.js +0 -271
- package/dist/client/chunks/chart-bar-KddciGDv.js.map +0 -1
- package/dist/client/chunks/chart-bubble-CfqiB538.js +0 -273
- package/dist/client/chunks/chart-bubble-CfqiB538.js.map +0 -1
- package/dist/client/chunks/chart-config-area-Bq_UsW3x.js +0 -101
- package/dist/client/chunks/chart-config-area-Bq_UsW3x.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-_JEGZnAu.js +0 -95
- package/dist/client/chunks/chart-config-bar-_JEGZnAu.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-DJ-dWWXA.js.map +0 -1
- package/dist/client/chunks/chart-config-gauge-DSwC04l0.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-delta-D6BIkHL3.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-number-Bx-V9a62.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-text-CcqC1u-8.js.map +0 -1
- package/dist/client/chunks/chart-config-line-Db3jDsWc.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-DD4SmRTF.js.map +0 -1
- package/dist/client/chunks/chart-config-radar-CC2XAaGr.js.map +0 -1
- package/dist/client/chunks/chart-config-radial-bar-DmxKx1R0.js.map +0 -1
- package/dist/client/chunks/chart-config-tree-map-BI-oQStO.js.map +0 -1
- package/dist/client/chunks/chart-config-waterfall-DSnyixbI.js.map +0 -1
- package/dist/client/chunks/chart-data-table-BO4sXsim.js.map +0 -1
- package/dist/client/chunks/chart-funnel-DnWRsmnS.js.map +0 -1
- package/dist/client/chunks/chart-gauge-CgMeqeGb.js +0 -424
- package/dist/client/chunks/chart-gauge-CgMeqeGb.js.map +0 -1
- package/dist/client/chunks/chart-heat-map-DcGm9SWK.js +0 -231
- package/dist/client/chunks/chart-heat-map-DcGm9SWK.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js +0 -343
- package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-gWYF44ol.js +0 -322
- package/dist/client/chunks/chart-kpi-number-gWYF44ol.js.map +0 -1
- package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js +0 -149
- package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js.map +0 -1
- package/dist/client/chunks/chart-line-9BEGN5Ti.js +0 -433
- package/dist/client/chunks/chart-line-9BEGN5Ti.js.map +0 -1
- package/dist/client/chunks/chart-pie-BjAIhyOi.js +0 -172
- package/dist/client/chunks/chart-pie-BjAIhyOi.js.map +0 -1
- package/dist/client/chunks/chart-radar-Dgkcl2bN.js +0 -154
- package/dist/client/chunks/chart-radar-Dgkcl2bN.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js +0 -148
- package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js.map +0 -1
- package/dist/client/chunks/chart-scatter-DaHYP_OL.js +0 -255
- package/dist/client/chunks/chart-scatter-DaHYP_OL.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-uiwUU4nb.js +0 -298
- package/dist/client/chunks/chart-tree-map-uiwUU4nb.js.map +0 -1
- package/dist/client/chunks/useDirtyStateTracking-CoeQbprt.js.map +0 -1
- package/dist/server/google-DUlXeeDA.cjs +0 -2
- package/dist/server/openai-D_U4V0kT.cjs +0 -1
package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js.map → chart-sunburst-leGpuDj7.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-sunburst-A_u6lqlS.js","names":[],"sources":["../../../src/client/components/charts/SunburstChart.tsx"],"sourcesContent":["/**\n * SunburstChart Component\n *\n * Visualizes flow data using a radial sunburst diagram showing paths from a starting step.\n * Works with the same data as SankeyChart but displays it as hierarchical rings.\n *\n * The chart displays:\n * - Center: Starting step (layer 0)\n * - Outward rings: Steps after the starting step (layers 1, 2, 3...)\n * - Values indicating count of entities following each path\n *\n * Note: Unlike Sankey, Sunburst only shows \"after\" steps for cleaner visualization.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { SunburstChart as RechartsSunburst, ResponsiveContainer, Tooltip } from 'recharts'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport type { ChartProps } from '../../types'\nimport type { FlowChartData, SankeyNode, SankeyLink } from '../../types/flow'\nimport { isSankeyData } from '../../types/flow'\n\n/**\n * Hierarchical data structure for Recharts Sunburst\n */\ninterface SunburstNode {\n name: string\n value?: number\n fill?: string\n children?: SunburstNode[]\n /** Original event name (before path prefix was added) */\n originalName?: string\n}\n\n\n/**\n * Extract FlowChartData from various data formats\n */\nfunction extractFlowData(data: unknown[]): FlowChartData | null {\n if (!data || data.length === 0) return null\n\n // If first element is already FlowChartData (server returns as single-row array)\n if (isSankeyData(data[0])) {\n return data[0] as FlowChartData\n }\n\n // If data itself is FlowChartData shape\n if (isSankeyData(data)) {\n return data as unknown as FlowChartData\n }\n\n // Check if data is an array with nodes and links at top level\n const asAny = data as unknown as Record<string, unknown>\n if (asAny.nodes && asAny.links) {\n return asAny as unknown as FlowChartData\n }\n\n return null\n}\n\n/**\n * Transform FlowChartData (nodes + links) into hierarchical Sunburst format\n * Only includes layer 0 (starting) and positive layers (after steps)\n *\n * The transformation builds a tree where:\n * - Root = starting event(s) at layer 0\n * - Children = events linked from parent, following the flow\n * - Each path in the tree represents a unique user journey\n */\nfunction transformToSunburstFormat(\n data: FlowChartData,\n colorPalette?: string[]\n): SunburstNode | null {\n const { nodes, links } = data\n\n if (!nodes || nodes.length === 0) return null\n\n // Filter to only include layer 0 and positive layers (after steps)\n const afterNodes = nodes.filter((n) => n.layer >= 0)\n if (afterNodes.length === 0) return null\n\n // Use theme colors - either from palette or default CHART_COLORS\n const colors = colorPalette || CHART_COLORS\n\n // Get unique event names and create a color map\n // This ensures each event type gets a consistent, distinct color\n const uniqueNames = [...new Set(afterNodes.map((n) => n.name))]\n const colorMap = new Map<string, string>()\n uniqueNames.forEach((name, index) => {\n colorMap.set(name, colors[index % colors.length])\n })\n\n // Create a map of node IDs for quick lookup\n const nodeMap = new Map<string, SankeyNode>()\n afterNodes.forEach((node) => nodeMap.set(node.id, node))\n\n // Create a map of links from source to targets\n // Key: source node ID, Value: array of links from that source\n const linksBySource = new Map<string, SankeyLink[]>()\n links.forEach((link) => {\n // Only include links where source is in our afterNodes set\n if (!nodeMap.has(link.source)) return\n const sourceLinks = linksBySource.get(link.source) || []\n sourceLinks.push(link)\n linksBySource.set(link.source, sourceLinks)\n })\n\n // Find max layer for determining depth\n const maxLayer = Math.max(...afterNodes.map((n) => n.layer))\n\n // Counter for generating unique IDs\n let nodeCounter = 0\n\n /**\n * Recursively build children for a node by following outgoing links\n * Each link becomes a child node in the tree\n *\n * @param nodeId - The source node ID to build children from\n * @param currentLayer - Current layer depth\n * @param pathPrefix - Path from root to this node (for unique naming)\n */\n function buildChildren(nodeId: string, currentLayer: number, pathPrefix: string): SunburstNode[] {\n if (currentLayer >= maxLayer) return []\n\n const outgoingLinks = linksBySource.get(nodeId) || []\n if (outgoingLinks.length === 0) return []\n\n // Filter and map links to children\n const children: SunburstNode[] = []\n\n for (const link of outgoingLinks) {\n const targetNode = nodeMap.get(link.target)\n\n // Only include links to nodes in the next layer\n if (!targetNode || targetNode.layer !== currentLayer + 1) continue\n\n // Generate a unique name by including counter to avoid React key collisions\n nodeCounter++\n const uniqueName = `${targetNode.name}_${nodeCounter}`\n\n // Recursively build grandchildren with updated path\n const newPath = pathPrefix ? `${pathPrefix}→${targetNode.name}` : targetNode.name\n const grandchildren = buildChildren(link.target, currentLayer + 1, newPath)\n\n const child: SunburstNode = {\n name: uniqueName,\n originalName: targetNode.name,\n value: link.value,\n fill: colorMap.get(targetNode.name) || colors[0],\n }\n\n if (grandchildren.length > 0) {\n child.children = grandchildren\n }\n\n children.push(child)\n }\n\n return children\n }\n\n // Get starting nodes (layer 0)\n const startingNodes = afterNodes.filter((n) => n.layer === 0)\n if (startingNodes.length === 0) return null\n\n // Build the tree starting from layer 0 nodes\n if (startingNodes.length === 1) {\n // Single starting node - use it as root\n const startNode = startingNodes[0]\n const children = buildChildren(startNode.id, 0, startNode.name)\n\n const result: SunburstNode = {\n name: startNode.name,\n originalName: startNode.name,\n value: startNode.value || children.reduce((sum, c) => sum + (c.value || 0), 0),\n fill: colorMap.get(startNode.name) || colors[0],\n }\n\n if (children.length > 0) {\n result.children = children\n }\n\n return result\n }\n\n // Multiple starting nodes - create a virtual root\n const rootChildren = startingNodes.map((startNode, index) => {\n nodeCounter++\n const children = buildChildren(startNode.id, 0, startNode.name)\n\n const child: SunburstNode = {\n name: `${startNode.name}_root_${index}`,\n originalName: startNode.name,\n value: startNode.value || children.reduce((sum, c) => sum + (c.value || 0), 0),\n fill: colorMap.get(startNode.name) || colors[0],\n }\n\n if (children.length > 0) {\n child.children = children\n }\n\n return child\n })\n\n return {\n name: 'Start',\n originalName: 'Start',\n children: rootChildren,\n }\n}\n\n/**\n * Custom tooltip for Sunburst chart\n * Shows the original event name (not the unique key used internally)\n */\nfunction SunburstTooltip({\n active,\n payload,\n}: {\n active?: boolean\n payload?: Array<{ payload: SunburstNode }>\n}) {\n if (!active || !payload || payload.length === 0) return null\n\n const data = payload[0].payload\n // Use originalName if available, otherwise fall back to name\n const displayName = data.originalName || data.name\n\n return (\n <div className=\"bg-dc-surface dc:border border-dc-border dc:rounded-md dc:px-3 dc:py-2 dc:shadow-lg dc:text-sm\">\n <div className=\"dc:font-medium text-dc-text\">{displayName}</div>\n {data.value !== undefined && (\n <div className=\"text-dc-text-secondary dc:mt-1\">\n <span className=\"dc:font-medium\">{data.value.toLocaleString()}</span> entities\n </div>\n )}\n </div>\n )\n}\n\n/**\n * SunburstChart Component\n *\n * Renders a sunburst diagram visualization from FlowChartData.\n * Shows hierarchical flow paths radiating from a central starting step.\n */\nconst SunburstChart = React.memo(function SunburstChart({\n data,\n height = '100%',\n colorPalette,\n displayConfig,\n}: ChartProps) {\n const { t } = useTranslation()\n // Track chart area dimensions (not the full container which includes footer)\n const chartAreaRef = useRef<HTMLDivElement>(null)\n const [chartSize, setChartSize] = useState({ width: 400, height: 400 })\n\n useEffect(() => {\n const updateSize = () => {\n if (chartAreaRef.current) {\n setChartSize({\n width: chartAreaRef.current.offsetWidth,\n height: chartAreaRef.current.offsetHeight,\n })\n }\n }\n updateSize()\n window.addEventListener('resize', updateSize)\n\n // Use ResizeObserver for more accurate size tracking\n const resizeObserver = new ResizeObserver(updateSize)\n if (chartAreaRef.current) {\n resizeObserver.observe(chartAreaRef.current)\n }\n\n return () => {\n window.removeEventListener('resize', updateSize)\n resizeObserver.disconnect()\n }\n }, [])\n\n // Get display config options\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const innerRadius = (displayConfigAny?.innerRadius as number) ?? 40\n\n // Extract and transform data\n const sunburstData = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n return transformToSunburstFormat(extracted, colorPalette?.colors || CHART_COLORS)\n }, [data, colorPalette])\n\n // Calculate summary stats from original flow data\n const summaryStats = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n // Only count after nodes (layer >= 0)\n const afterNodes = extracted.nodes.filter((n) => n.layer >= 0)\n const afterLinks = extracted.links.filter((link) => {\n const sourceNode = extracted.nodes.find((n) => n.id === link.source)\n return sourceNode && sourceNode.layer >= 0\n })\n\n const totalEntities = extracted.nodes\n .filter((n) => n.layer === 0)\n .reduce((sum, n) => sum + (n.value || 0), 0)\n\n return {\n nodeCount: afterNodes.length,\n linkCount: afterLinks.length,\n totalEntities,\n }\n }, [data])\n\n // Handle no data\n if (!data || data.length === 0 || !sunburstData) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.flow.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {t('chart.runtime.noDataHint.flow')}\n </div>\n </div>\n </div>\n )\n }\n\n // Calculate outer radius based on chart area size\n const minDimension = Math.min(chartSize.width, chartSize.height)\n const outerRadius = Math.max(minDimension / 2 - 40, 100)\n\n // Get root node info for center label\n const rootName = sunburstData.originalName || sunburstData.name\n const rootValue = sunburstData.value\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full dc:flex dc:flex-col\" style={{ height }}>\n {/* Sunburst Diagram */}\n <div ref={chartAreaRef} className=\"dc:flex-1 dc:min-h-0 dc:relative\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsSunburst\n data={sunburstData}\n dataKey=\"value\"\n innerRadius={innerRadius}\n outerRadius={outerRadius}\n stroke=\"var(--dc-bg)\"\n >\n <Tooltip content={<SunburstTooltip />} />\n </RechartsSunburst>\n </ResponsiveContainer>\n\n {/* Center label showing the root node (starting event) */}\n {innerRadius > 0 && (\n <div\n className=\"dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center dc:pointer-events-none\"\n style={{ zIndex: 10 }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold text-dc-text\">{rootName}</div>\n {rootValue !== undefined && (\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {rootValue.toLocaleString()}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Summary Footer */}\n {!displayConfigAny?.hideSummaryFooter && summaryStats && (\n <div className=\"dc:flex-shrink-0 dc:px-4 dc:py-2 dc:border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"dc:flex dc:items-center dc:justify-between dc:text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.nodeCount}</span> events (after)\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">{t('chart.runtime.flow.paths')}</span>{' '}\n <span className=\"dc:font-medium\">{summaryStats.linkCount}</span>\n </div>\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.totalEntities.toLocaleString()}</span>{' '}\n starting entities\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default SunburstChart\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-sunburst-leGpuDj7.js","names":[],"sources":["../../../src/client/components/charts/SunburstChart.tsx"],"sourcesContent":["/**\n * SunburstChart Component\n *\n * Visualizes flow data using a radial sunburst diagram showing paths from a starting step.\n * Works with the same data as SankeyChart but displays it as hierarchical rings.\n *\n * The chart displays:\n * - Center: Starting step (layer 0)\n * - Outward rings: Steps after the starting step (layers 1, 2, 3...)\n * - Values indicating count of entities following each path\n *\n * Note: Unlike Sankey, Sunburst only shows \"after\" steps for cleaner visualization.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { SunburstChart as RechartsSunburst, ResponsiveContainer, Tooltip } from 'recharts'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport type { ChartProps } from '../../types'\nimport type { FlowChartData, SankeyNode, SankeyLink } from '../../types/flow'\nimport { isSankeyData } from '../../types/flow'\n\n/**\n * Hierarchical data structure for Recharts Sunburst\n */\ninterface SunburstNode {\n name: string\n value?: number\n fill?: string\n children?: SunburstNode[]\n /** Original event name (before path prefix was added) */\n originalName?: string\n}\n\n\n/**\n * Extract FlowChartData from various data formats\n */\nfunction extractFlowData(data: unknown[]): FlowChartData | null {\n if (!data || data.length === 0) return null\n\n // If first element is already FlowChartData (server returns as single-row array)\n if (isSankeyData(data[0])) {\n return data[0] as FlowChartData\n }\n\n // If data itself is FlowChartData shape\n if (isSankeyData(data)) {\n return data as unknown as FlowChartData\n }\n\n // Check if data is an array with nodes and links at top level\n const asAny = data as unknown as Record<string, unknown>\n if (asAny.nodes && asAny.links) {\n return asAny as unknown as FlowChartData\n }\n\n return null\n}\n\n/**\n * Transform FlowChartData (nodes + links) into hierarchical Sunburst format\n * Only includes layer 0 (starting) and positive layers (after steps)\n *\n * The transformation builds a tree where:\n * - Root = starting event(s) at layer 0\n * - Children = events linked from parent, following the flow\n * - Each path in the tree represents a unique user journey\n */\nfunction transformToSunburstFormat(\n data: FlowChartData,\n colorPalette?: string[]\n): SunburstNode | null {\n const { nodes, links } = data\n\n if (!nodes || nodes.length === 0) return null\n\n // Filter to only include layer 0 and positive layers (after steps)\n const afterNodes = nodes.filter((n) => n.layer >= 0)\n if (afterNodes.length === 0) return null\n\n // Use theme colors - either from palette or default CHART_COLORS\n const colors = colorPalette || CHART_COLORS\n\n // Get unique event names and create a color map\n // This ensures each event type gets a consistent, distinct color\n const uniqueNames = [...new Set(afterNodes.map((n) => n.name))]\n const colorMap = new Map<string, string>()\n uniqueNames.forEach((name, index) => {\n colorMap.set(name, colors[index % colors.length])\n })\n\n // Create a map of node IDs for quick lookup\n const nodeMap = new Map<string, SankeyNode>()\n afterNodes.forEach((node) => nodeMap.set(node.id, node))\n\n // Create a map of links from source to targets\n // Key: source node ID, Value: array of links from that source\n const linksBySource = new Map<string, SankeyLink[]>()\n links.forEach((link) => {\n // Only include links where source is in our afterNodes set\n if (!nodeMap.has(link.source)) return\n const sourceLinks = linksBySource.get(link.source) || []\n sourceLinks.push(link)\n linksBySource.set(link.source, sourceLinks)\n })\n\n // Find max layer for determining depth\n const maxLayer = Math.max(...afterNodes.map((n) => n.layer))\n\n // Counter for generating unique IDs\n let nodeCounter = 0\n\n /**\n * Recursively build children for a node by following outgoing links\n * Each link becomes a child node in the tree\n *\n * @param nodeId - The source node ID to build children from\n * @param currentLayer - Current layer depth\n * @param pathPrefix - Path from root to this node (for unique naming)\n */\n function buildChildren(nodeId: string, currentLayer: number, pathPrefix: string): SunburstNode[] {\n if (currentLayer >= maxLayer) return []\n\n const outgoingLinks = linksBySource.get(nodeId) || []\n if (outgoingLinks.length === 0) return []\n\n // Filter and map links to children\n const children: SunburstNode[] = []\n\n for (const link of outgoingLinks) {\n const targetNode = nodeMap.get(link.target)\n\n // Only include links to nodes in the next layer\n if (!targetNode || targetNode.layer !== currentLayer + 1) continue\n\n // Generate a unique name by including counter to avoid React key collisions\n nodeCounter++\n const uniqueName = `${targetNode.name}_${nodeCounter}`\n\n // Recursively build grandchildren with updated path\n const newPath = pathPrefix ? `${pathPrefix}→${targetNode.name}` : targetNode.name\n const grandchildren = buildChildren(link.target, currentLayer + 1, newPath)\n\n const child: SunburstNode = {\n name: uniqueName,\n originalName: targetNode.name,\n value: link.value,\n fill: colorMap.get(targetNode.name) || colors[0],\n }\n\n if (grandchildren.length > 0) {\n child.children = grandchildren\n }\n\n children.push(child)\n }\n\n return children\n }\n\n // Get starting nodes (layer 0)\n const startingNodes = afterNodes.filter((n) => n.layer === 0)\n if (startingNodes.length === 0) return null\n\n // Build the tree starting from layer 0 nodes\n if (startingNodes.length === 1) {\n // Single starting node - use it as root\n const startNode = startingNodes[0]\n const children = buildChildren(startNode.id, 0, startNode.name)\n\n const result: SunburstNode = {\n name: startNode.name,\n originalName: startNode.name,\n value: startNode.value || children.reduce((sum, c) => sum + (c.value || 0), 0),\n fill: colorMap.get(startNode.name) || colors[0],\n }\n\n if (children.length > 0) {\n result.children = children\n }\n\n return result\n }\n\n // Multiple starting nodes - create a virtual root\n const rootChildren = startingNodes.map((startNode, index) => {\n nodeCounter++\n const children = buildChildren(startNode.id, 0, startNode.name)\n\n const child: SunburstNode = {\n name: `${startNode.name}_root_${index}`,\n originalName: startNode.name,\n value: startNode.value || children.reduce((sum, c) => sum + (c.value || 0), 0),\n fill: colorMap.get(startNode.name) || colors[0],\n }\n\n if (children.length > 0) {\n child.children = children\n }\n\n return child\n })\n\n return {\n name: 'Start',\n originalName: 'Start',\n children: rootChildren,\n }\n}\n\n/**\n * Custom tooltip for Sunburst chart\n * Shows the original event name (not the unique key used internally)\n */\nfunction SunburstTooltip({\n active,\n payload,\n}: {\n active?: boolean\n payload?: Array<{ payload: SunburstNode }>\n}) {\n if (!active || !payload || payload.length === 0) return null\n\n const data = payload[0].payload\n // Use originalName if available, otherwise fall back to name\n const displayName = data.originalName || data.name\n\n return (\n <div className=\"bg-dc-surface dc:border border-dc-border dc:rounded-md dc:px-3 dc:py-2 dc:shadow-lg dc:text-sm\">\n <div className=\"dc:font-medium text-dc-text\">{displayName}</div>\n {data.value !== undefined && (\n <div className=\"text-dc-text-secondary dc:mt-1\">\n <span className=\"dc:font-medium\">{data.value.toLocaleString()}</span> entities\n </div>\n )}\n </div>\n )\n}\n\n/**\n * SunburstChart Component\n *\n * Renders a sunburst diagram visualization from FlowChartData.\n * Shows hierarchical flow paths radiating from a central starting step.\n */\nconst SunburstChart = React.memo(function SunburstChart({\n data,\n height = '100%',\n colorPalette,\n displayConfig,\n}: ChartProps) {\n const { t } = useTranslation()\n // Track chart area dimensions (not the full container which includes footer)\n const chartAreaRef = useRef<HTMLDivElement>(null)\n const [chartSize, setChartSize] = useState({ width: 400, height: 400 })\n\n useEffect(() => {\n const updateSize = () => {\n if (chartAreaRef.current) {\n setChartSize({\n width: chartAreaRef.current.offsetWidth,\n height: chartAreaRef.current.offsetHeight,\n })\n }\n }\n updateSize()\n window.addEventListener('resize', updateSize)\n\n // Use ResizeObserver for more accurate size tracking\n const resizeObserver = new ResizeObserver(updateSize)\n if (chartAreaRef.current) {\n resizeObserver.observe(chartAreaRef.current)\n }\n\n return () => {\n window.removeEventListener('resize', updateSize)\n resizeObserver.disconnect()\n }\n }, [])\n\n // Get display config options\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const innerRadius = (displayConfigAny?.innerRadius as number) ?? 40\n\n // Extract and transform data\n const sunburstData = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n return transformToSunburstFormat(extracted, colorPalette?.colors || CHART_COLORS)\n }, [data, colorPalette])\n\n // Calculate summary stats from original flow data\n const summaryStats = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n // Only count after nodes (layer >= 0)\n const afterNodes = extracted.nodes.filter((n) => n.layer >= 0)\n const afterLinks = extracted.links.filter((link) => {\n const sourceNode = extracted.nodes.find((n) => n.id === link.source)\n return sourceNode && sourceNode.layer >= 0\n })\n\n const totalEntities = extracted.nodes\n .filter((n) => n.layer === 0)\n .reduce((sum, n) => sum + (n.value || 0), 0)\n\n return {\n nodeCount: afterNodes.length,\n linkCount: afterLinks.length,\n totalEntities,\n }\n }, [data])\n\n // Handle no data\n if (!data || data.length === 0 || !sunburstData) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.flow.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {t('chart.runtime.noDataHint.flow')}\n </div>\n </div>\n </div>\n )\n }\n\n // Calculate outer radius based on chart area size\n const minDimension = Math.min(chartSize.width, chartSize.height)\n const outerRadius = Math.max(minDimension / 2 - 40, 100)\n\n // Get root node info for center label\n const rootName = sunburstData.originalName || sunburstData.name\n const rootValue = sunburstData.value\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full dc:flex dc:flex-col\" style={{ height }}>\n {/* Sunburst Diagram */}\n <div ref={chartAreaRef} className=\"dc:flex-1 dc:min-h-0 dc:relative\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsSunburst\n data={sunburstData}\n dataKey=\"value\"\n innerRadius={innerRadius}\n outerRadius={outerRadius}\n stroke=\"var(--dc-bg)\"\n >\n <Tooltip content={<SunburstTooltip />} />\n </RechartsSunburst>\n </ResponsiveContainer>\n\n {/* Center label showing the root node (starting event) */}\n {innerRadius > 0 && (\n <div\n className=\"dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center dc:pointer-events-none\"\n style={{ zIndex: 10 }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold text-dc-text\">{rootName}</div>\n {rootValue !== undefined && (\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {rootValue.toLocaleString()}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Summary Footer */}\n {!displayConfigAny?.hideSummaryFooter && summaryStats && (\n <div className=\"dc:flex-shrink-0 dc:px-4 dc:py-2 dc:border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"dc:flex dc:items-center dc:justify-between dc:text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.nodeCount}</span> events (after)\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">{t('chart.runtime.flow.paths')}</span>{' '}\n <span className=\"dc:font-medium\">{summaryStats.linkCount}</span>\n </div>\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.totalEntities.toLocaleString()}</span>{' '}\n starting entities\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default SunburstChart\n"],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
+
import { D as t, E as n, P as r, S as i, c as a, s as o, w as s } from "./chart-activity-grid-DX0SJbxs.js";
|
|
3
|
+
import { S as c, T as l, b as u, w as d, x as f } from "./chart-area-of01_62R.js";
|
|
4
|
+
import p, { useState as m } from "react";
|
|
5
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
6
|
+
import { Treemap as _ } from "recharts";
|
|
7
|
+
import { scaleOrdinal as v, scaleQuantize as y } from "d3";
|
|
8
|
+
//#region src/client/components/charts/TreeMapChart.helpers.ts
|
|
9
|
+
function b(e) {
|
|
10
|
+
return e ? Array.isArray(e) ? e[0] : e : "";
|
|
11
|
+
}
|
|
12
|
+
function x(e) {
|
|
13
|
+
return typeof e == "string" ? parseFloat(e) : e || 0;
|
|
14
|
+
}
|
|
15
|
+
function S(e) {
|
|
16
|
+
return typeof e == "string" ? parseFloat(e) : e;
|
|
17
|
+
}
|
|
18
|
+
function C(e, r, i, s) {
|
|
19
|
+
let c = b(r.xAxis), l = b(r.yAxis), u = Array.isArray(r.series) ? r.series[0] : r.series, d = t(i, c), f = (e) => n(e[c], d) || String(e[c]) || "Unknown";
|
|
20
|
+
if (!u) return {
|
|
21
|
+
treemapData: e.map((e, t) => ({
|
|
22
|
+
name: f(e),
|
|
23
|
+
size: x(e[l]),
|
|
24
|
+
fill: s?.colors && s.colors[t % s.colors.length] || o[t % o.length]
|
|
25
|
+
})),
|
|
26
|
+
isNumericSeries: !1,
|
|
27
|
+
seriesField: u
|
|
28
|
+
};
|
|
29
|
+
let p = e.map((e) => S(e[u])).filter((e) => !isNaN(e)), m = p.length === e.length && p.every((e) => typeof e == "number");
|
|
30
|
+
if (m) {
|
|
31
|
+
let t = y().domain([Math.min(...p), Math.max(...p)]).range(a);
|
|
32
|
+
return {
|
|
33
|
+
treemapData: e.map((e) => ({
|
|
34
|
+
name: f(e),
|
|
35
|
+
size: x(e[l]),
|
|
36
|
+
fill: t(S(e[u])),
|
|
37
|
+
series: String(e[u])
|
|
38
|
+
})),
|
|
39
|
+
isNumericSeries: m,
|
|
40
|
+
seriesField: u
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let h = [...new Set(e.map((e) => String(e[u])))], g = v().domain(h).range(s?.colors || o);
|
|
44
|
+
return {
|
|
45
|
+
treemapData: e.map((e) => ({
|
|
46
|
+
name: f(e),
|
|
47
|
+
size: x(e[l]),
|
|
48
|
+
fill: g(String(e[u])),
|
|
49
|
+
series: String(e[u])
|
|
50
|
+
})),
|
|
51
|
+
isNumericSeries: m,
|
|
52
|
+
seriesField: u
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function w(e) {
|
|
56
|
+
return typeof e == "boolean" ? e ? "Active" : "Inactive" : e === "true" || e === "false" ? e === "true" ? "Active" : "Inactive" : String(e);
|
|
57
|
+
}
|
|
58
|
+
function T(e, t) {
|
|
59
|
+
let n = e[0], r = Object.keys(n), i = r.find((e) => typeof n[e] == "string" || e.toLowerCase().includes("name") || e.toLowerCase().includes("label") || e.toLowerCase().includes("category")) || r[0], a = r.find((e) => e.toLowerCase().includes("size")) || r.find((e) => typeof n[e] == "number" && e !== i) || r[1];
|
|
60
|
+
return a ? {
|
|
61
|
+
treemapData: e.map((e, n) => ({
|
|
62
|
+
name: w(e[i]),
|
|
63
|
+
size: x(e[a]),
|
|
64
|
+
fill: t?.colors && t.colors[n % t.colors.length] || o[n % o.length]
|
|
65
|
+
})),
|
|
66
|
+
isNumericSeries: !1,
|
|
67
|
+
seriesField: void 0
|
|
68
|
+
} : null;
|
|
69
|
+
}
|
|
70
|
+
function E(e, t, n, r) {
|
|
71
|
+
let i = t?.xAxis && t?.yAxis ? C(e, t, n, r) : T(e, r);
|
|
72
|
+
return i ? {
|
|
73
|
+
...i,
|
|
74
|
+
treemapData: i.treemapData.filter((e) => e.size != null && e.size > 0)
|
|
75
|
+
} : null;
|
|
76
|
+
}
|
|
77
|
+
function D(e, t) {
|
|
78
|
+
let n = e.map((e) => S(e[t]));
|
|
79
|
+
return {
|
|
80
|
+
min: Math.min(...n),
|
|
81
|
+
max: Math.max(...n)
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function O(e, t) {
|
|
85
|
+
return t ? s(e, t) : e.toFixed(2);
|
|
86
|
+
}
|
|
87
|
+
function k(e, t, n, r, i, s) {
|
|
88
|
+
if (!n || !r) return [];
|
|
89
|
+
if (i) {
|
|
90
|
+
let { min: t, max: n } = D(e, r);
|
|
91
|
+
return a.map((e, r) => {
|
|
92
|
+
let i = r / (a.length - 1);
|
|
93
|
+
return {
|
|
94
|
+
value: O(t + (n - t) * i, s),
|
|
95
|
+
type: "rect",
|
|
96
|
+
color: e
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
let c = [...new Set(t.map((e) => e.series).filter(Boolean))];
|
|
101
|
+
return c.length > 1 ? c.map((e, t) => ({
|
|
102
|
+
value: e,
|
|
103
|
+
type: "rect",
|
|
104
|
+
color: o[t % o.length]
|
|
105
|
+
})) : [];
|
|
106
|
+
}
|
|
107
|
+
function A(e, t) {
|
|
108
|
+
return !t || typeof e == "string" && e.includes("%") ? e : typeof e == "number" ? e + 60 : `calc(${e} + 60px)`;
|
|
109
|
+
}
|
|
110
|
+
//#endregion
|
|
111
|
+
//#region src/client/components/charts/TreeMapContent.tsx
|
|
112
|
+
function j(e, t) {
|
|
113
|
+
return e === null ? .8 : e === t ? 1 : .6;
|
|
114
|
+
}
|
|
115
|
+
function M(e, t) {
|
|
116
|
+
return t ? s(e, t) : typeof e == "number" ? e.toLocaleString() : String(e);
|
|
117
|
+
}
|
|
118
|
+
function N({ treemapData: e, colorPalette: t, hoveredIndex: n, setHoveredIndex: r, leftYAxisFormat: i, drillEnabled: a, onDataPointClick: s, queryObject: c, chartConfig: l }) {
|
|
119
|
+
return function(u) {
|
|
120
|
+
let { x: d, y: f, width: p, height: m, index: _, name: v, size: y } = u;
|
|
121
|
+
return p < 20 || m < 20 ? null : /* @__PURE__ */ g("g", { children: [/* @__PURE__ */ h("rect", {
|
|
122
|
+
x: d,
|
|
123
|
+
y: f,
|
|
124
|
+
width: p,
|
|
125
|
+
height: m,
|
|
126
|
+
style: {
|
|
127
|
+
fill: e[_]?.fill || t?.colors && t.colors[_ % t.colors.length] || o[_ % o.length],
|
|
128
|
+
fillOpacity: j(n, _),
|
|
129
|
+
stroke: "#fff",
|
|
130
|
+
strokeWidth: 2,
|
|
131
|
+
cursor: a ? "pointer" : "default",
|
|
132
|
+
pointerEvents: "all"
|
|
133
|
+
},
|
|
134
|
+
onMouseEnter: () => r(_),
|
|
135
|
+
onMouseLeave: () => r(null),
|
|
136
|
+
onClick: a && s ? (t) => {
|
|
137
|
+
t.stopPropagation();
|
|
138
|
+
let n = e[_];
|
|
139
|
+
n && s && s({
|
|
140
|
+
dataPoint: n,
|
|
141
|
+
clickedField: c?.measures?.[0] || l?.yAxis?.[0] || "",
|
|
142
|
+
xValue: v,
|
|
143
|
+
position: {
|
|
144
|
+
x: t.clientX,
|
|
145
|
+
y: t.clientY
|
|
146
|
+
},
|
|
147
|
+
nativeEvent: t
|
|
148
|
+
});
|
|
149
|
+
} : void 0
|
|
150
|
+
}), /* @__PURE__ */ h("foreignObject", {
|
|
151
|
+
x: d,
|
|
152
|
+
y: f,
|
|
153
|
+
width: p,
|
|
154
|
+
height: m,
|
|
155
|
+
style: {
|
|
156
|
+
pointerEvents: "none",
|
|
157
|
+
overflow: "visible"
|
|
158
|
+
},
|
|
159
|
+
children: /* @__PURE__ */ g("div", {
|
|
160
|
+
style: {
|
|
161
|
+
width: "100%",
|
|
162
|
+
height: "100%",
|
|
163
|
+
display: "flex",
|
|
164
|
+
flexDirection: "column",
|
|
165
|
+
alignItems: "center",
|
|
166
|
+
justifyContent: "center",
|
|
167
|
+
padding: "4px",
|
|
168
|
+
boxSizing: "border-box",
|
|
169
|
+
color: "#ffffff",
|
|
170
|
+
textShadow: "0 1px 2px rgba(0,0,0,0.8)",
|
|
171
|
+
fontFamily: "system-ui, -apple-system, sans-serif",
|
|
172
|
+
overflow: "hidden"
|
|
173
|
+
},
|
|
174
|
+
children: [p > 40 && m > 30 && /* @__PURE__ */ h("div", {
|
|
175
|
+
style: {
|
|
176
|
+
fontSize: `${Math.max(10, Math.min(p / 8, m / 8, 16))}px`,
|
|
177
|
+
fontWeight: "600",
|
|
178
|
+
textAlign: "center",
|
|
179
|
+
lineHeight: "1.2",
|
|
180
|
+
marginBottom: p > 60 && m > 45 ? "4px" : "0",
|
|
181
|
+
wordBreak: "break-word",
|
|
182
|
+
hyphens: "auto"
|
|
183
|
+
},
|
|
184
|
+
children: v
|
|
185
|
+
}), p > 60 && m > 45 && /* @__PURE__ */ h("div", {
|
|
186
|
+
style: {
|
|
187
|
+
fontSize: `${Math.max(8, Math.min(p / 10, m / 10, 14))}px`,
|
|
188
|
+
textAlign: "center",
|
|
189
|
+
opacity: .9
|
|
190
|
+
},
|
|
191
|
+
children: M(y, i)
|
|
192
|
+
})]
|
|
193
|
+
})
|
|
194
|
+
})] });
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//#endregion
|
|
198
|
+
//#region src/client/components/charts/TreeMapLegend.tsx
|
|
199
|
+
function P({ seriesLabel: e, data: t, seriesField: n, leftYAxisFormat: r }) {
|
|
200
|
+
let { min: i, max: o } = D(t, n);
|
|
201
|
+
return /* @__PURE__ */ g("div", {
|
|
202
|
+
className: "dc:flex dc:flex-col dc:items-center",
|
|
203
|
+
children: [/* @__PURE__ */ h("div", {
|
|
204
|
+
className: "dc:text-xs dc:font-semibold text-dc-text-primary dc:mb-2",
|
|
205
|
+
children: e
|
|
206
|
+
}), /* @__PURE__ */ g("div", {
|
|
207
|
+
className: "dc:flex dc:items-center dc:gap-2",
|
|
208
|
+
children: [
|
|
209
|
+
/* @__PURE__ */ h("span", {
|
|
210
|
+
className: "dc:text-xs text-dc-text-muted",
|
|
211
|
+
children: O(i, r)
|
|
212
|
+
}),
|
|
213
|
+
/* @__PURE__ */ h("div", {
|
|
214
|
+
className: "dc:h-4 dc:rounded-sm",
|
|
215
|
+
style: {
|
|
216
|
+
width: "200px",
|
|
217
|
+
background: `linear-gradient(to right, ${a.join(", ")})`
|
|
218
|
+
}
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ h("span", {
|
|
221
|
+
className: "dc:text-xs text-dc-text-muted",
|
|
222
|
+
children: O(o, r)
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
})]
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function F({ legendPayload: e }) {
|
|
229
|
+
return /* @__PURE__ */ h("div", {
|
|
230
|
+
className: "dc:flex dc:flex-wrap dc:justify-center dc:gap-4",
|
|
231
|
+
children: e.map((e, t) => /* @__PURE__ */ g("div", {
|
|
232
|
+
className: "dc:flex dc:items-center dc:gap-2",
|
|
233
|
+
children: [/* @__PURE__ */ h("div", {
|
|
234
|
+
className: "dc:w-3 dc:h-3 rounded-xs",
|
|
235
|
+
style: { backgroundColor: e.color }
|
|
236
|
+
}), /* @__PURE__ */ h("span", {
|
|
237
|
+
className: "dc:text-xs text-dc-text-muted",
|
|
238
|
+
children: e.value
|
|
239
|
+
})]
|
|
240
|
+
}, t))
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
function I({ isNumericSeries: e, seriesField: t, seriesLabel: n, legendPayload: r, data: i, leftYAxisFormat: a }) {
|
|
244
|
+
return /* @__PURE__ */ h("div", {
|
|
245
|
+
className: "dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2",
|
|
246
|
+
children: e && t ? /* @__PURE__ */ h(P, {
|
|
247
|
+
seriesLabel: n,
|
|
248
|
+
data: i,
|
|
249
|
+
seriesField: t,
|
|
250
|
+
leftYAxisFormat: a
|
|
251
|
+
}) : /* @__PURE__ */ h(F, { legendPayload: r })
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/client/components/charts/TreeMapChart.tsx
|
|
256
|
+
var L = /* @__PURE__ */ e({ default: () => R }), R = p.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: a, height: o = "100%", colorPalette: p, onDataPointClick: v, drillEnabled: y }) {
|
|
257
|
+
let { t: b } = r(), [x, S] = m(null), C = i();
|
|
258
|
+
try {
|
|
259
|
+
let r = {
|
|
260
|
+
showTooltip: n?.showTooltip ?? !0,
|
|
261
|
+
showLegend: n?.showLegend ?? !0,
|
|
262
|
+
leftYAxisFormat: n?.leftYAxisFormat
|
|
263
|
+
};
|
|
264
|
+
if (!e || e.length === 0) return /* @__PURE__ */ h(f, {
|
|
265
|
+
height: o,
|
|
266
|
+
hint: b("chart.runtime.noDataHint.treemap")
|
|
267
|
+
});
|
|
268
|
+
let i = E(e, t, a, p);
|
|
269
|
+
if (!i) return /* @__PURE__ */ h(u, {
|
|
270
|
+
height: o,
|
|
271
|
+
hint: b("chart.runtime.configErrorHint.treemapNumeric")
|
|
272
|
+
});
|
|
273
|
+
let { treemapData: c, isNumericSeries: m, seriesField: w } = i;
|
|
274
|
+
if (c.length === 0) return /* @__PURE__ */ h(f, {
|
|
275
|
+
height: o,
|
|
276
|
+
titleKey: "chart.runtime.noValidData",
|
|
277
|
+
hint: "No valid data points for treemap chart after transformation"
|
|
278
|
+
});
|
|
279
|
+
let T = N({
|
|
280
|
+
treemapData: c,
|
|
281
|
+
colorPalette: p,
|
|
282
|
+
hoveredIndex: x,
|
|
283
|
+
setHoveredIndex: S,
|
|
284
|
+
leftYAxisFormat: r.leftYAxisFormat,
|
|
285
|
+
drillEnabled: y,
|
|
286
|
+
onDataPointClick: v,
|
|
287
|
+
queryObject: a,
|
|
288
|
+
chartConfig: t
|
|
289
|
+
}), D = k(e, c, r.showLegend, w, m, r.leftYAxisFormat), O = r.showLegend && D.length > 0;
|
|
290
|
+
return /* @__PURE__ */ g("div", {
|
|
291
|
+
className: "dc:w-full",
|
|
292
|
+
style: { height: A(o, O) },
|
|
293
|
+
children: [/* @__PURE__ */ h(l, {
|
|
294
|
+
height: O ? "calc(100% - 50px)" : "100%",
|
|
295
|
+
children: /* @__PURE__ */ h(_, {
|
|
296
|
+
data: c,
|
|
297
|
+
dataKey: "size",
|
|
298
|
+
aspectRatio: 4 / 3,
|
|
299
|
+
stroke: "#fff",
|
|
300
|
+
content: /* @__PURE__ */ h(T, {}),
|
|
301
|
+
children: r.showTooltip && /* @__PURE__ */ h(d, { formatter: r.leftYAxisFormat ? (e, t) => [s(e, r.leftYAxisFormat), t] : void 0 })
|
|
302
|
+
})
|
|
303
|
+
}), O && /* @__PURE__ */ h(I, {
|
|
304
|
+
isNumericSeries: m,
|
|
305
|
+
seriesField: w,
|
|
306
|
+
seriesLabel: w ? C(w) : "",
|
|
307
|
+
legendPayload: D,
|
|
308
|
+
data: e,
|
|
309
|
+
leftYAxisFormat: r.leftYAxisFormat
|
|
310
|
+
})]
|
|
311
|
+
});
|
|
312
|
+
} catch (e) {
|
|
313
|
+
return /* @__PURE__ */ h(c, {
|
|
314
|
+
height: o,
|
|
315
|
+
chartType: "TreeMap Chart",
|
|
316
|
+
error: e
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
//#endregion
|
|
321
|
+
export { L as n, R as t };
|
|
322
|
+
|
|
323
|
+
//# sourceMappingURL=chart-tree-map-Ceq5sLZA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-tree-map-Ceq5sLZA.js","names":[],"sources":["../../../src/client/components/charts/TreeMapChart.helpers.ts","../../../src/client/components/charts/TreeMapContent.tsx","../../../src/client/components/charts/TreeMapLegend.tsx","../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["/**\n * Co-located helpers for TreeMapChart.\n *\n * Pure data-shaping + legend computation extracted from the component. No\n * behaviour change — mirrors the original inline logic exactly.\n */\nimport { scaleQuantize, scaleOrdinal } from 'd3'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig, ChartAxisConfig, ColorPalette, CubeQuery } from '../../types'\n\nexport interface TreemapDatum {\n name: string\n size: number\n fill?: string\n series?: string\n // Index signature so the rows satisfy recharts' Treemap data + drill payloads\n [key: string]: unknown\n}\n\n/** First element of a config field that may be a string, string[] or undefined. */\nfunction pickField(value: string | string[] | undefined): string {\n if (!value) return ''\n return Array.isArray(value) ? value[0] : value\n}\n\n/** Coerce a possibly-string numeric cell to a number (NaN-safe via fallback). */\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\n/** Numeric value of a series cell (string or number), used for colour scaling. */\nfunction seriesNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : (value as number)\n}\n\nexport interface TreemapBuildResult {\n treemapData: TreemapDatum[]\n isNumericSeries: boolean\n seriesField?: string\n}\n\n/** Build treemap rows from the new (configured) chart config format. */\nfunction buildFromConfig(\n data: Record<string, any>[],\n chartConfig: ChartAxisConfig,\n queryObject: CubeQuery | undefined,\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult {\n const xAxisField = pickField(chartConfig.xAxis)\n const yAxisField = pickField(chartConfig.yAxis)\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const granularity = getFieldGranularity(queryObject, xAxisField)\n\n const nameOf = (item: Record<string, any>) =>\n formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n\n if (!seriesField) {\n // No series grouping - use index-based colors\n const treemapData = data.map((item, index) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }))\n return { treemapData, isNumericSeries: false, seriesField }\n }\n\n // Check if series field is numeric for color scaling\n const seriesValues = data\n .map((item) => seriesNumber(item[seriesField]))\n .filter((val) => !isNaN(val))\n const isNumericSeries =\n seriesValues.length === data.length && seriesValues.every((val) => typeof val === 'number')\n\n if (isNumericSeries) {\n const colorScale = scaleQuantize<string>()\n .domain([Math.min(...seriesValues), Math.max(...seriesValues)])\n .range(CHART_COLORS_GRADIENT)\n const treemapData = data.map((item) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: colorScale(seriesNumber(item[seriesField])),\n series: String(item[seriesField])\n }))\n return { treemapData, isNumericSeries, seriesField }\n }\n\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 const treemapData = data.map((item) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: colorScale(String(item[seriesField])),\n series: String(item[seriesField])\n }))\n return { treemapData, isNumericSeries, seriesField }\n}\n\n/** Resolve a friendly name for a legacy/auto-detected row. */\nfunction legacyName(value: unknown): string {\n if (typeof value === 'boolean') return value ? 'Active' : 'Inactive'\n if (value === 'true' || value === 'false') return value === 'true' ? 'Active' : 'Inactive'\n return String(value)\n}\n\n/** Build treemap rows by auto-detecting name/size fields (legacy format). */\nfunction buildFromAutoDetect(\n data: Record<string, any>[],\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult | null {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const nameField =\n keys.find(\n (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 const sizeField =\n keys.find((key) => key.toLowerCase().includes('size')) ||\n keys.find((key) => typeof firstRow[key] === 'number' && key !== nameField) ||\n keys[1]\n\n if (!sizeField) return null\n\n const treemapData = data.map((item, index) => ({\n name: legacyName(item[nameField]),\n size: toNumber(item[sizeField]),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }))\n return { treemapData, isNumericSeries: false, seriesField: undefined }\n}\n\n/**\n * Build treemap data (config or auto-detect), then drop non-positive sizes.\n * Returns `null` when the legacy path can't find a usable size field.\n */\nexport function buildTreemapData(\n data: Record<string, any>[],\n chartConfig: ChartAxisConfig | undefined,\n queryObject: CubeQuery | undefined,\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult | null {\n const result =\n chartConfig?.xAxis && chartConfig?.yAxis\n ? buildFromConfig(data, chartConfig, queryObject, colorPalette)\n : buildFromAutoDetect(data, colorPalette)\n\n if (!result) return null\n\n return {\n ...result,\n treemapData: result.treemapData.filter((item) => item.size != null && item.size > 0)\n }\n}\n\n/** Min/max of the (numeric) series field across the raw rows. */\nexport function seriesMinMax(\n data: Record<string, any>[],\n seriesField: string\n): { min: number; max: number } {\n const values = data.map((item) => seriesNumber(item[seriesField]))\n return { min: Math.min(...values), max: Math.max(...values) }\n}\n\n/** Format a numeric value with the optional axis format (or `.toFixed(2)`). */\nexport function formatSeriesValue(value: number, format: AxisFormatConfig | undefined): string {\n return format ? formatAxisValue(value, format) : value.toFixed(2)\n}\n\nexport interface LegendEntry {\n value: string\n type: 'rect'\n color: string\n}\n\n/**\n * Build the legend entries for the treemap: a gradient ramp for numeric series,\n * or discrete swatches for categorical series. Empty when not applicable.\n */\nexport function buildTreemapLegend(\n data: Record<string, any>[],\n treemapData: TreemapDatum[],\n showLegend: boolean,\n seriesField: string | undefined,\n isNumericSeries: boolean,\n leftYAxisFormat: AxisFormatConfig | undefined\n): LegendEntry[] {\n if (!showLegend || !seriesField) return []\n\n if (isNumericSeries) {\n const { min, max } = seriesMinMax(data, seriesField)\n return CHART_COLORS_GRADIENT.map((color, index) => {\n const ratio = index / (CHART_COLORS_GRADIENT.length - 1)\n const value = min + (max - min) * ratio\n return { value: formatSeriesValue(value, leftYAxisFormat), type: 'rect' as const, color }\n })\n }\n\n const uniqueSeries = [...new Set(treemapData.map((item) => item.series).filter(Boolean))]\n if (uniqueSeries.length > 1) {\n return uniqueSeries.map((series, index) => ({\n value: series as string,\n type: 'rect' as const,\n color: CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n return []\n}\n\n/** Adjust the outer container height to make room for a legend, if present. */\nexport function adjustHeightForLegend(\n height: string | number,\n hasLegend: boolean\n): string | number {\n if (!hasLegend) return height\n if (typeof height === 'string' && height.includes('%')) return height\n if (typeof height === 'number') return height + 60\n return `calc(${height} + 60px)`\n}\n","import React from 'react'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig, ChartAxisConfig, ColorPalette, CubeQuery } from '../../types'\nimport type { ChartDataPointClickEvent } from '../../types/drill'\nimport type { TreemapDatum } from './TreeMapChart.helpers'\n\ninterface TreeMapContentOptions {\n treemapData: TreemapDatum[]\n colorPalette?: ColorPalette\n hoveredIndex: number | null\n setHoveredIndex: (index: number | null) => void\n leftYAxisFormat?: AxisFormatConfig\n drillEnabled?: boolean\n onDataPointClick?: (event: ChartDataPointClickEvent) => void\n queryObject?: CubeQuery\n chartConfig?: ChartAxisConfig\n}\n\n/** Fill opacity for a treemap cell given the currently hovered index. */\nfunction cellOpacity(hoveredIndex: number | null, index: number): number {\n if (hoveredIndex === null) return 0.8\n return hoveredIndex === index ? 1 : 0.6\n}\n\n/** Format the size label shown inside a treemap cell. */\nfunction formatSize(size: unknown, format: AxisFormatConfig | undefined): string {\n if (format) return formatAxisValue(size as number, format)\n return typeof size === 'number' ? size.toLocaleString() : String(size)\n}\n\n/**\n * Build the Recharts `content` renderer for treemap cells.\n *\n * Encapsulates the per-cell rect + foreignObject overlay, hover state and drill\n * click handler that previously lived inline in TreeMapChart (the highest-\n * complexity hot spots). Behaviour is identical to the original.\n */\nexport function makeTreeMapContent({\n treemapData,\n colorPalette,\n hoveredIndex,\n setHoveredIndex,\n leftYAxisFormat,\n drillEnabled,\n onDataPointClick,\n queryObject,\n chartConfig,\n}: TreeMapContentOptions) {\n return function CustomizedContent(props: any) {\n const { x, y, width, height, index, name, size } = props\n\n if (width < 20 || height < 20) return null // Skip 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 hold 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 const fill =\n treemapData[index]?.fill ||\n ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length])\n\n return (\n <g>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n style={{\n fill,\n fillOpacity: cellOpacity(hoveredIndex, index),\n stroke: '#fff',\n strokeWidth: 2,\n cursor: drillEnabled ? 'pointer' : 'default',\n pointerEvents: 'all'\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 {formatSize(size, leftYAxisFormat)}\n </div>\n )}\n </div>\n </foreignObject>\n </g>\n )\n }\n}\n","import { CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport type { AxisFormatConfig } from '../../types'\nimport {\n seriesMinMax,\n formatSeriesValue,\n type LegendEntry\n} from './TreeMapChart.helpers'\n\ninterface TreeMapLegendProps {\n isNumericSeries: boolean\n seriesField?: string\n seriesLabel: string\n legendPayload: LegendEntry[]\n data: Record<string, any>[]\n leftYAxisFormat?: AxisFormatConfig\n}\n\n/** Gradient ramp legend for a numeric series field. */\nfunction NumericLegend({\n seriesLabel,\n data,\n seriesField,\n leftYAxisFormat,\n}: {\n seriesLabel: string\n data: Record<string, any>[]\n seriesField: string\n leftYAxisFormat?: AxisFormatConfig\n}) {\n const { min, max } = seriesMinMax(data, seriesField)\n return (\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 {seriesLabel}\n </div>\n <div className=\"dc:flex dc:items-center dc:gap-2\">\n <span className=\"dc:text-xs text-dc-text-muted\">\n {formatSeriesValue(min, leftYAxisFormat)}\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 {formatSeriesValue(max, leftYAxisFormat)}\n </span>\n </div>\n </div>\n )\n}\n\n/** Discrete swatch legend for a categorical series field. */\nfunction CategoricalLegend({ legendPayload }: { legendPayload: LegendEntry[] }) {\n return (\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 className=\"dc:w-3 dc:h-3 rounded-xs\" style={{ backgroundColor: item.color }} />\n <span className=\"dc:text-xs text-dc-text-muted\">{item.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** Treemap legend wrapper — gradient for numeric series, swatches otherwise. */\nexport function TreeMapLegend({\n isNumericSeries,\n seriesField,\n seriesLabel,\n legendPayload,\n data,\n leftYAxisFormat,\n}: TreeMapLegendProps) {\n return (\n <div className=\"dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2\">\n {isNumericSeries && seriesField ? (\n <NumericLegend\n seriesLabel={seriesLabel}\n data={data}\n seriesField={seriesField}\n leftYAxisFormat={leftYAxisFormat}\n />\n ) : (\n <CategoricalLegend legendPayload={legendPayload} />\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { Treemap } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport {\n buildTreemapData,\n buildTreemapLegend,\n adjustHeightForLegend\n} from './TreeMapChart.helpers'\nimport { makeTreeMapContent } from './TreeMapContent'\nimport { TreeMapLegend } from './TreeMapLegend'\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 { t } = useTranslation()\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 <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.treemap')} />\n }\n\n // Build treemap rows (config or auto-detect) — null means no usable size field\n const built = buildTreemapData(data, chartConfig, queryObject, colorPalette)\n if (!built) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.treemapNumeric')} />\n }\n\n const { treemapData, isNumericSeries, seriesField } = built\n\n if (treemapData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for treemap chart after transformation\"\n />\n )\n }\n\n // Custom content renderer for treemap cells with HTML overlays\n const CustomizedContent = makeTreeMapContent({\n treemapData,\n colorPalette,\n hoveredIndex,\n setHoveredIndex,\n leftYAxisFormat: safeDisplayConfig.leftYAxisFormat,\n drillEnabled,\n onDataPointClick,\n queryObject,\n chartConfig\n })\n\n // Build legend payload (gradient for numeric series, swatches otherwise)\n const legendPayload = buildTreemapLegend(\n data,\n treemapData,\n safeDisplayConfig.showLegend,\n seriesField,\n isNumericSeries,\n safeDisplayConfig.leftYAxisFormat\n )\n\n const hasLegend = safeDisplayConfig.showLegend && legendPayload.length > 0\n const adjustedHeight = adjustHeightForLegend(height, hasLegend)\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 <TreeMapLegend\n isNumericSeries={isNumericSeries}\n seriesField={seriesField}\n seriesLabel={seriesField ? getFieldLabel(seriesField) : ''}\n legendPayload={legendPayload}\n data={data}\n leftYAxisFormat={safeDisplayConfig.leftYAxisFormat}\n />\n )}\n </div>\n )\n } catch (error) {\n // 'TreeMapChart rendering error\n return <ChartRenderError height={height} chartType=\"TreeMap Chart\" error={error} />\n }\n})\n\nexport default TreeMapChart\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { P as t, S as n, l as r, w as i } from "./chart-activity-grid-DX0SJbxs.js";
|
|
3
|
+
import { C as a, T as o, w as s } from "./chart-area-of01_62R.js";
|
|
4
4
|
import c, { useMemo as l } from "react";
|
|
5
5
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
6
|
import { Bar as f, CartesianGrid as p, Cell as m, ComposedChart as h, LabelList as g, Legend as _, Line as v, XAxis as y, YAxis as b } from "recharts";
|
|
@@ -47,7 +47,7 @@ function D(e) {
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height: O = "100%", onDataPointClick: k, drillEnabled: A }) {
|
|
50
|
-
let { t: j } =
|
|
50
|
+
let { t: j } = t(), M = n(), N = x?.showTotal ?? !0, P = x?.showConnectorLine ?? !0, F = x?.showDataLabels ?? !1, I = x?.leftYAxisFormat, { xAxisField: L, yAxisField: R, configError: z } = l(() => {
|
|
51
51
|
let e = Array.isArray(c?.xAxis) ? c.xAxis[0] : c?.x, t = Array.isArray(c?.yAxis) ? c.yAxis[0] : c?.y?.[0];
|
|
52
52
|
return {
|
|
53
53
|
xAxisField: e,
|
|
@@ -106,7 +106,7 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
|
|
|
106
106
|
children: /* @__PURE__ */ d(h, {
|
|
107
107
|
data: H,
|
|
108
108
|
margin: {
|
|
109
|
-
...
|
|
109
|
+
...r,
|
|
110
110
|
left: 40
|
|
111
111
|
},
|
|
112
112
|
accessibilityLayer: !1,
|
|
@@ -118,14 +118,14 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
|
|
|
118
118
|
/* @__PURE__ */ u(y, {
|
|
119
119
|
dataKey: "label",
|
|
120
120
|
type: "category",
|
|
121
|
-
tick: /* @__PURE__ */ u(
|
|
121
|
+
tick: /* @__PURE__ */ u(a, {}),
|
|
122
122
|
height: 60
|
|
123
123
|
}),
|
|
124
124
|
/* @__PURE__ */ u(b, {
|
|
125
125
|
tick: { fontSize: 12 },
|
|
126
126
|
tickFormatter: I ? (e) => i(e, I) : void 0
|
|
127
127
|
}),
|
|
128
|
-
/* @__PURE__ */ u(
|
|
128
|
+
/* @__PURE__ */ u(s, {
|
|
129
129
|
formatter: (e, t, n) => {
|
|
130
130
|
if (t === "_connector") return ["", ""];
|
|
131
131
|
let r = n?.payload;
|
|
@@ -234,4 +234,4 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
|
|
|
234
234
|
//#endregion
|
|
235
235
|
export { x as t };
|
|
236
236
|
|
|
237
|
-
//# sourceMappingURL=chart-waterfall-
|
|
237
|
+
//# sourceMappingURL=chart-waterfall-DyvQReN5.js.map
|
package/dist/client/chunks/{chart-waterfall-BuhMoagf.js.map → chart-waterfall-DyvQReN5.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-waterfall-BuhMoagf.js","names":[],"sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\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 { t } = useTranslation()\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\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.waterfall')}</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\">{t('chart.runtime.configError')}</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\">{t('chart.runtime.chartError', { chartType: 'Waterfall Chart' })}</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : t('chart.runtime.unknownError')}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">{t('chart.runtime.checkConfig')}</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-waterfall-DyvQReN5.js","names":[],"sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\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 { t } = useTranslation()\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\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.waterfall')}</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\">{t('chart.runtime.configError')}</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\">{t('chart.runtime.chartError', { chartType: 'Waterfall Chart' })}</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : t('chart.runtime.unknownError')}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">{t('chart.runtime.checkConfig')}</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as e, w as t } from "./chart-activity-grid-DX0SJbxs.js";
|
|
2
2
|
import { useMemo as n } from "react";
|
|
3
3
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
4
|
//#region src/client/components/AnalysisBuilder/SectionHeading.tsx
|
|
@@ -212,4 +212,4 @@ function c({ value: s, onChange: c, axisLabel: l, previewValue: u = 125e4 }) {
|
|
|
212
212
|
//#endregion
|
|
213
213
|
export { a as n, c as t };
|
|
214
214
|
|
|
215
|
-
//# sourceMappingURL=charts-core-
|
|
215
|
+
//# sourceMappingURL=charts-core-DaXSt1Dd.js.map
|