drizzle-cube 0.5.7 → 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/{utils.d.ts → 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/{server/google-CFYljAOF.js → adapters/google-CvKM9yVM.js} +83 -71
- package/dist/adapters/{handler-Dz1F4iwf.js → handler-CfgE0JSL.js} +515 -578
- package/dist/adapters/handler-Cn0dOctE.cjs +25 -0
- package/dist/adapters/hono/index.cjs +2 -2
- package/dist/adapters/hono/index.js +208 -178
- 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/{server/openai-y7GhJNdn.js → adapters/openai-B5jEiqiB.js} +776 -719
- package/dist/adapters/openai-D0musiYP.cjs +17 -0
- package/dist/{server/openai-DiVskd89.js → adapters/openai-cDlFSTk6.js} +61 -59
- package/dist/adapters/openai-vXvLni8v.cjs +1 -0
- package/dist/adapters/{utils-DosuoabY.js → utils-BPWZsX7k.js} +1285 -1220
- 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 +3 -17
- 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-6KRE36mm.js → DashboardEditModal-okVfH8ZK.js} +5446 -4486
- package/dist/client/chunks/DashboardEditModal-okVfH8ZK.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js → RetentionCombinedChart-BgbDhsPz.js} +10 -10
- package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js.map → RetentionCombinedChart-BgbDhsPz.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.js → RetentionHeatmap-DjXZaTPq.js} +5 -5
- package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.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-x576-O5p.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-CiHrLH6Y.js → chart-activity-grid-DX0SJbxs.js} +642 -494
- 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-Bu9hy-17.js → chart-box-plot-kkBixZ27.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-Bu9hy-17.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-Dau5AF4E.js → chart-candlestick-DZp19Tzh.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-Dau5AF4E.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-Cm5jrpaw.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-Eke8IPtG.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-BPW-EAm9.js → chart-markdown-CV75S_zL.js} +1359 -1240
- package/dist/client/chunks/chart-markdown-CV75S_zL.js.map +1 -0
- package/dist/client/chunks/{chart-measure-profile-BI3kADCp.js → chart-measure-profile-Ket8fJyf.js} +7 -7
- package/dist/client/chunks/{chart-measure-profile-BI3kADCp.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-CFzjGvZX.js → chart-sankey-DjrvKw6K.js} +36 -39
- package/dist/client/chunks/{chart-sankey-CFzjGvZX.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-91Q2tzaB.js → chart-sunburst-leGpuDj7.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-91Q2tzaB.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-DcHbbPaG.js → chart-waterfall-DyvQReN5.js} +7 -7
- package/dist/client/chunks/{chart-waterfall-DcHbbPaG.js.map → chart-waterfall-DyvQReN5.js.map} +1 -1
- package/dist/client/chunks/{charts-core-CrBDYN6N.js → charts-core-DaXSt1Dd.js} +2 -2
- package/dist/client/chunks/{charts-core-CrBDYN6N.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/{core-DsAWNRRv.js → core-D7vPfUIe.js} +2 -2
- package/dist/client/chunks/{core-DsAWNRRv.js.map → core-D7vPfUIe.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-oyr2wENY.js → nl-NL-2zTAWTej.js} +8 -2
- package/dist/client/chunks/{nl-NL-oyr2wENY.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-BszcrmZX.js → schema-visualization-Cb_E9_Gd.js} +12 -12
- package/dist/client/chunks/{schema-visualization-BszcrmZX.js.map → schema-visualization-Cb_E9_Gd.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-B5wCDJSj.js → useDirtyStateTracking-MbpxH_v6.js} +95 -84
- package/dist/client/chunks/useDirtyStateTracking-MbpxH_v6.js.map +1 -0
- package/dist/client/chunks/{useExplainAI-CCeCYzDm.js → useExplainAI-evnZkjCY.js} +14 -14
- package/dist/client/chunks/{useExplainAI-CCeCYzDm.js.map → useExplainAI-evnZkjCY.js.map} +1 -1
- package/dist/client/chunks/{utils-kqa-JIMg.js → utils-3P6z1vz5.js} +3 -3
- package/dist/client/chunks/{utils-kqa-JIMg.js.map → utils-3P6z1vz5.js.map} +1 -1
- package/dist/client/chunks/{vendor-0hJNlZXQ.js → vendor-DSpR0IW6.js} +43 -43
- package/dist/client/chunks/{vendor-0hJNlZXQ.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/AnalysisAIPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisChartConfigPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterGroup.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterItem.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterSection.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisModeErrorBoundary.d.ts +1 -1
- 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/ExplainAIPanel.d.ts +2 -1
- package/dist/client/components/AnalysisBuilder/FieldDetailPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FieldSearchItem.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FieldSearchModal.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +16 -0
- package/dist/client/components/AnalysisBuilder/FilterConfigModal.d.ts +2 -1
- 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/LimitSection.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +23 -0
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +1 -1
- 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/AnalyticsDashboard.d.ts +1 -1
- package/dist/client/components/AnalyticsPage.d.ts +1 -1
- package/dist/client/components/ChartErrorBoundary.d.ts +1 -1
- package/dist/client/components/ChartTypeSelector.d.ts +1 -1
- package/dist/client/components/ColorPaletteSelector.d.ts +1 -1
- package/dist/client/components/DashboardEditModal.d.ts +2 -1
- package/dist/client/components/DashboardFilters/CompactFilterBarParts.d.ts +26 -0
- package/dist/client/components/DashboardFilters/DashboardFilterConfigModal.d.ts +1 -1
- package/dist/client/components/DashboardFilters/DashboardFilterConfigModalParts.d.ts +27 -0
- package/dist/client/components/DashboardFilters/DashboardFilterItem.d.ts +1 -1
- 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/DashboardGrid.d.ts +1 -1
- package/dist/client/components/DashboardPortletCard.d.ts +2 -57
- package/dist/client/components/DashboardThumbnailPlaceholder.d.ts +1 -1
- package/dist/client/components/DataBrowser/DataBrowserSidebar.d.ts +1 -1
- package/dist/client/components/DataBrowser/DataBrowserToolbar.d.ts +1 -1
- package/dist/client/components/DataBrowser/index.d.ts +1 -1
- package/dist/client/components/DataHistogram.d.ts +1 -1
- package/dist/client/components/DebugModal.d.ts +1 -1
- package/dist/client/components/DrillBreadcrumb.d.ts +2 -1
- package/dist/client/components/LoadingIndicator.d.ts +1 -1
- package/dist/client/components/MobileStackedLayout.d.ts +1 -1
- package/dist/client/components/PortletAnalysisModal.d.ts +1 -1
- package/dist/client/components/PortletContainer.d.ts +1 -1
- package/dist/client/components/PortletFilterConfigModal.d.ts +6 -4
- package/dist/client/components/RowManagedLayout.d.ts +1 -1
- package/dist/client/components/ScaledGridWrapper.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/CubeNode.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/FieldDetailPanel.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/RelationshipEdge.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/SchemaVisualizationLazy.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/index.d.ts +1 -1
- package/dist/client/components/TextPortletModal.d.ts +1 -1
- 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 +5 -3
- 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/ChartContainer.d.ts +1 -1
- package/dist/client/components/charts/ChartLegend.d.ts +1 -1
- package/dist/client/components/charts/ChartStates.d.ts +38 -0
- package/dist/client/components/charts/ChartTooltip.d.ts +1 -1
- 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/MissingDependencyFallback.d.ts +1 -1
- 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/DashboardContext.d.ts +2 -2
- package/dist/client/components/dashboard/DashboardCoordinator.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardEditBar.d.ts +5 -0
- package/dist/client/components/dashboard/DashboardFilterBar.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardGridSurface.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardModals.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardProvider.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardToolbar.d.ts +1 -1
- package/dist/client/components/dashboard/LayoutModeToggle.d.ts +10 -0
- package/dist/client/components/dashboard/dashboardGridUtils.d.ts +1 -1
- 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/dashboard/useDashboardController.d.ts +2 -2
- package/dist/client/hooks/drillNavigation.d.ts +25 -0
- package/dist/client/hooks/useDashboardHook.d.ts +2 -2
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.d.ts +1 -1
- 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/CubeApiProvider.d.ts +1 -1
- package/dist/client/providers/CubeFeaturesProvider.d.ts +1 -1
- package/dist/client/providers/CubeMetaProvider.d.ts +1 -1
- package/dist/client/providers/CubeProvider.d.ts +1 -1
- package/dist/client/providers/I18nProvider.d.ts +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/analysisBuilderStore.d.ts +1 -1
- package/dist/client/stores/dashboardStore.d.ts +1 -1
- package/dist/client/stores/dataBrowserStore.d.ts +1 -1
- package/dist/client/stores/notebookStore.d.ts +1 -1
- package/dist/client/stores/optionsToAnalysisConfig.d.ts +17 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/types/drill.d.ts +1 -1
- package/dist/client/types.d.ts +7 -2
- package/dist/client/utils/axisValueFormatting.d.ts +32 -0
- package/dist/client/utils/drillQueryBuilder.d.ts +2 -2
- package/dist/client/utils/filterUtils.d.ts +33 -5
- package/dist/client/utils/joinReachability.d.ts +27 -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/{adapters/google-CFYljAOF.js → server/google-CvKM9yVM.js} +83 -71
- package/dist/server/index.cjs +179 -211
- package/dist/server/index.d.ts +2 -5050
- package/dist/server/index.js +6360 -6462
- package/dist/{adapters/openai-y7GhJNdn.js → server/openai-B5jEiqiB.js} +776 -719
- package/dist/server/openai-D0musiYP.cjs +17 -0
- package/dist/{adapters/openai-DiVskd89.js → server/openai-cDlFSTk6.js} +61 -59
- package/dist/server/openai-vXvLni8v.cjs +1 -0
- package/dist/server/server/adapters/base-adapter.d.ts +332 -0
- package/dist/server/server/adapters/databend-adapter.d.ts +63 -0
- package/dist/server/server/adapters/duckdb-adapter.d.ts +68 -0
- package/dist/server/server/adapters/mysql-adapter.d.ts +65 -0
- package/dist/server/server/adapters/postgres-adapter.d.ts +55 -0
- package/dist/server/server/adapters/singlestore-adapter.d.ts +4 -0
- package/dist/server/server/adapters/snowflake-adapter.d.ts +53 -0
- package/dist/server/server/adapters/sqlite-adapter.d.ts +120 -0
- package/dist/server/server/adapters/window-function-builder.d.ts +11 -0
- package/dist/server/server/agent/chart-validation.d.ts +22 -0
- package/dist/server/server/agent/handler-steps.d.ts +37 -0
- package/dist/server/server/agent/handler.d.ts +25 -0
- package/dist/server/server/agent/index.d.ts +11 -0
- package/dist/server/server/agent/providers/anthropic.d.ts +24 -0
- package/dist/server/server/agent/providers/factory.d.ts +12 -0
- package/dist/server/server/agent/providers/google.d.ts +23 -0
- package/dist/server/server/agent/providers/index.d.ts +6 -0
- package/dist/server/server/agent/providers/openai.d.ts +26 -0
- package/dist/server/server/agent/providers/types.d.ts +95 -0
- package/dist/server/server/agent/system-prompt.d.ts +5 -0
- package/dist/server/server/agent/tools.d.ts +28 -0
- package/dist/server/server/agent/types.d.ts +192 -0
- package/dist/server/server/ai/discovery-helpers.d.ts +29 -0
- package/dist/server/server/ai/discovery.d.ts +66 -0
- package/dist/server/server/ai/index.d.ts +10 -0
- package/dist/server/server/ai/mcp-prompts.d.ts +83 -0
- package/dist/server/server/ai/query-schema.d.ts +258 -0
- package/dist/server/server/ai/schemas.d.ts +63 -0
- package/dist/server/server/ai/suggestion-helpers.d.ts +33 -0
- package/dist/server/server/ai/suggestion.d.ts +16 -0
- package/dist/server/server/ai/validation-helpers.d.ts +21 -0
- package/dist/server/server/ai/validation.d.ts +31 -0
- package/dist/server/server/builders/analysis-utils.d.ts +106 -0
- package/dist/server/server/builders/comparison-query-builder.d.ts +70 -0
- package/dist/server/server/builders/cte-builder.d.ts +108 -0
- package/dist/server/server/builders/date-time-builder.d.ts +34 -0
- package/dist/server/server/builders/date-time-helpers.d.ts +34 -0
- package/dist/server/server/builders/filter-builder.d.ts +25 -0
- package/dist/server/server/builders/filter-operators.d.ts +23 -0
- package/dist/server/server/builders/flow-query-builder.d.ts +136 -0
- package/dist/server/server/builders/funnel-query-builder.d.ts +145 -0
- package/dist/server/server/builders/group-by-builder.d.ts +38 -0
- package/dist/server/server/builders/index.d.ts +13 -0
- package/dist/server/server/builders/measure-builder.d.ts +185 -0
- package/dist/server/server/builders/retention-query-builder.d.ts +98 -0
- package/dist/server/server/cache-providers/index.d.ts +5 -0
- package/dist/server/server/cache-providers/memory.d.ts +105 -0
- package/dist/server/server/cache-utils.d.ts +85 -0
- package/dist/server/server/compiler-metadata.d.ts +11 -0
- package/dist/server/server/compiler.d.ts +212 -0
- package/dist/server/server/cube-utils.d.ts +158 -0
- package/dist/server/server/database-utils.d.ts +18 -0
- 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 +186 -0
- package/dist/server/server/executors/base-executor.d.ts +16 -0
- package/dist/server/server/executors/databend-executor.d.ts +33 -0
- package/dist/server/server/executors/duckdb-executor.d.ts +33 -0
- package/dist/server/server/executors/explain-utils.d.ts +28 -0
- package/dist/server/server/executors/index.d.ts +21 -0
- package/dist/server/server/executors/mysql-executor.d.ts +27 -0
- package/dist/server/server/executors/postgres-executor.d.ts +27 -0
- package/dist/server/server/executors/singlestore-executor.d.ts +9 -0
- package/dist/server/server/executors/snowflake-executor.d.ts +33 -0
- package/dist/server/server/executors/sqlite-executor.d.ts +28 -0
- package/dist/server/server/explain/databend-parser.d.ts +16 -0
- package/dist/server/server/explain/duckdb-parser.d.ts +28 -0
- package/dist/server/server/explain/explain-tree.d.ts +20 -0
- package/dist/server/server/explain/index.d.ts +9 -0
- package/dist/server/server/explain/mysql-parser.d.ts +38 -0
- package/dist/server/server/explain/postgres-parser.d.ts +18 -0
- package/dist/server/server/explain/snowflake-parser.d.ts +17 -0
- package/dist/server/server/explain/sqlite-parser.d.ts +23 -0
- package/dist/server/server/filter-cache.d.ts +73 -0
- package/dist/server/server/gap-filler.d.ts +48 -0
- package/dist/server/server/index.d.ts +38 -0
- 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 +19 -0
- package/dist/server/server/logical-plan/join-planner.d.ts +27 -0
- package/dist/server/server/logical-plan/logical-plan-builder.d.ts +58 -0
- package/dist/server/server/logical-plan/logical-planner.d.ts +39 -0
- package/dist/server/server/logical-plan/optimiser.d.ts +34 -0
- 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 +199 -0
- package/dist/server/server/measure-classification.d.ts +40 -0
- package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +50 -0
- package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +118 -0
- package/dist/server/server/physical-plan/index.d.ts +2 -0
- package/dist/server/server/physical-plan/processors/cte-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/index.d.ts +8 -0
- package/dist/server/server/physical-plan/processors/joins-processor.d.ts +6 -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/predicates-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/selection-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/shared.d.ts +38 -0
- package/dist/server/server/physical-plan/processors/window-processor.d.ts +6 -0
- package/dist/server/server/prompts/explain-analysis-prompt.d.ts +47 -0
- package/dist/server/server/prompts/index.d.ts +27 -0
- package/dist/server/server/prompts/single-step-prompt.d.ts +31 -0
- package/dist/server/server/prompts/step0-validation-prompt.d.ts +39 -0
- package/dist/server/server/prompts/step1-shape-prompt.d.ts +29 -0
- package/dist/server/server/prompts/step2-complete-prompt.d.ts +19 -0
- package/dist/server/server/prompts/types.d.ts +37 -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 +98 -0
- package/dist/server/server/resolvers/index.d.ts +6 -0
- package/dist/server/server/resolvers/join-path-resolver.d.ts +158 -0
- package/dist/server/server/sql-format.d.ts +11 -0
- package/dist/server/server/template-substitution.d.ts +57 -0
- package/dist/server/server/types/analysis.d.ts +189 -0
- package/dist/server/server/types/cache.d.ts +132 -0
- package/dist/server/server/types/core.d.ts +164 -0
- package/dist/server/server/types/cube.d.ts +544 -0
- package/dist/server/server/types/executor.d.ts +156 -0
- package/dist/server/server/types/flow.d.ts +144 -0
- package/dist/server/server/types/funnel.d.ts +118 -0
- package/dist/server/server/types/index.d.ts +11 -0
- package/dist/server/server/types/metadata.d.ts +113 -0
- package/dist/server/server/types/query.d.ts +153 -0
- package/dist/server/server/types/retention.d.ts +141 -0
- package/dist/server/server/types/utils.d.ts +11 -0
- package/dist/server/server/types/validation.d.ts +14 -0
- package/package.json +15 -8
- package/dist/adapters/google-DUlXeeDA.cjs +0 -2
- package/dist/adapters/handler-C63rJUUK.cjs +0 -25
- package/dist/adapters/locale-CTNwPVZI.cjs +0 -198
- package/dist/adapters/locale-gU_d1Wja.js +0 -8249
- package/dist/adapters/mcp-transport-C4J4SAcn.cjs +0 -40
- package/dist/adapters/mcp-transport-CVUiifEc.js +0 -579
- package/dist/adapters/openai-6wrBvAnv.cjs +0 -1
- package/dist/adapters/openai-BDwb2u7y.cjs +0 -17
- package/dist/adapters/utils-CkEkU8Bo.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-6KRE36mm.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-x576-O5p.js.map +0 -1
- package/dist/client/chunks/analysis-builder-zd48FVJO.js +0 -5367
- package/dist/client/chunks/analysis-builder-zd48FVJO.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-CiHrLH6Y.js.map +0 -1
- package/dist/client/chunks/chart-area-CXFK-Grv.js +0 -450
- package/dist/client/chunks/chart-area-CXFK-Grv.js.map +0 -1
- package/dist/client/chunks/chart-bar-DKXfLoGG.js +0 -271
- package/dist/client/chunks/chart-bar-DKXfLoGG.js.map +0 -1
- package/dist/client/chunks/chart-bubble-DGkTQlxM.js +0 -273
- package/dist/client/chunks/chart-bubble-DGkTQlxM.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-Cm5jrpaw.js.map +0 -1
- package/dist/client/chunks/chart-funnel-Eke8IPtG.js.map +0 -1
- package/dist/client/chunks/chart-gauge-DeRZNsyl.js +0 -424
- package/dist/client/chunks/chart-gauge-DeRZNsyl.js.map +0 -1
- package/dist/client/chunks/chart-heat-map-C86thSJ4.js +0 -231
- package/dist/client/chunks/chart-heat-map-C86thSJ4.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-CxOYD2f1.js +0 -343
- package/dist/client/chunks/chart-kpi-delta-CxOYD2f1.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-C6gWz-x4.js +0 -322
- package/dist/client/chunks/chart-kpi-number-C6gWz-x4.js.map +0 -1
- package/dist/client/chunks/chart-kpi-text-dDONrhS-.js +0 -149
- package/dist/client/chunks/chart-kpi-text-dDONrhS-.js.map +0 -1
- package/dist/client/chunks/chart-line-r4iWevKZ.js +0 -433
- package/dist/client/chunks/chart-line-r4iWevKZ.js.map +0 -1
- package/dist/client/chunks/chart-markdown-BPW-EAm9.js.map +0 -1
- package/dist/client/chunks/chart-pie-yqH2YVEI.js +0 -172
- package/dist/client/chunks/chart-pie-yqH2YVEI.js.map +0 -1
- package/dist/client/chunks/chart-radar-B-_3v-rE.js +0 -154
- package/dist/client/chunks/chart-radar-B-_3v-rE.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-C0EgzfAF.js +0 -148
- package/dist/client/chunks/chart-radial-bar-C0EgzfAF.js.map +0 -1
- package/dist/client/chunks/chart-scatter-DZPirzwX.js +0 -255
- package/dist/client/chunks/chart-scatter-DZPirzwX.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-Bi4axCvh.js +0 -298
- package/dist/client/chunks/chart-tree-map-Bi4axCvh.js.map +0 -1
- package/dist/client/chunks/useDirtyStateTracking-B5wCDJSj.js.map +0 -1
- package/dist/server/google-DUlXeeDA.cjs +0 -2
- package/dist/server/openai-6wrBvAnv.cjs +0 -1
- package/dist/server/openai-BDwb2u7y.cjs +0 -17
- /package/dist/adapters/{express → adapters/express}/index.d.ts +0 -0
- /package/dist/adapters/{fastify → adapters/fastify}/index.d.ts +0 -0
- /package/dist/adapters/{hono → adapters/hono}/index.d.ts +0 -0
- /package/dist/adapters/{locale.d.ts → adapters/locale.d.ts} +0 -0
- /package/dist/adapters/{mcp-tools.d.ts → adapters/mcp-tools.d.ts} +0 -0
- /package/dist/adapters/{mcp-transport.d.ts → adapters/mcp-transport.d.ts} +0 -0
- /package/dist/adapters/{nextjs → adapters/nextjs}/index.d.ts +0 -0
- /package/dist/adapters/{types.d.ts → adapters/types.d.ts} +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
+
import { P as t, S as n, a as r, c as i, h as a, i as o, l as s, n as c, o as l, r as u, s as d, w as f, x as p, y as m } from "./chart-activity-grid-DX0SJbxs.js";
|
|
3
|
+
import h, { useCallback as g, useEffect as _, useMemo as v, useSyncExternalStore as y } from "react";
|
|
4
|
+
import { jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
5
|
+
import { axisBottom as S, axisLeft as C, extent as w, max as T, scaleLinear as E, scaleOrdinal as D, scaleQuantize as O, scaleSqrt as k, select as A } from "d3";
|
|
6
|
+
//#region src/client/hooks/useTheme.ts
|
|
7
|
+
var j = {
|
|
8
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
9
|
+
subscribe(e) {
|
|
10
|
+
return this.listeners.add(e), () => this.listeners.delete(e);
|
|
11
|
+
},
|
|
12
|
+
notify() {
|
|
13
|
+
this.listeners.forEach((e) => e());
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
p(() => {
|
|
17
|
+
j.notify();
|
|
18
|
+
});
|
|
19
|
+
function M() {
|
|
20
|
+
return {
|
|
21
|
+
theme: y(j.subscribe.bind(j), a, a),
|
|
22
|
+
setTheme: g((e) => {
|
|
23
|
+
m(e), j.notify();
|
|
24
|
+
}, [])
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/client/components/charts/BubbleChart.render.ts
|
|
29
|
+
function N(e, t, n) {
|
|
30
|
+
if (t && e.length > 0) {
|
|
31
|
+
let t = e.map((e) => typeof e.color == "string" ? parseFloat(e.color) : e.color).filter((e) => !isNaN(e)), r = t.length === e.length && t.every((e) => typeof e == "number");
|
|
32
|
+
if (r) return {
|
|
33
|
+
colorScale: O().domain([Math.min(...t), Math.max(...t)]).range(n?.gradient || i),
|
|
34
|
+
isNumericColorField: r,
|
|
35
|
+
uniqueColors: []
|
|
36
|
+
};
|
|
37
|
+
let a = [...new Set(e.map((e) => String(e.color)))];
|
|
38
|
+
return {
|
|
39
|
+
colorScale: D().domain(a).range(n?.colors || d),
|
|
40
|
+
isNumericColorField: r,
|
|
41
|
+
uniqueColors: a
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
colorScale: D().domain(["default"]).range([d[0]]),
|
|
46
|
+
isNumericColorField: !1,
|
|
47
|
+
uniqueColors: []
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function P(e, t) {
|
|
51
|
+
let n = new Date(e);
|
|
52
|
+
if (isNaN(n.getTime())) return String(e);
|
|
53
|
+
let r = n.getUTCFullYear(), i = String(n.getUTCMonth() + 1).padStart(2, "0"), a = String(n.getUTCDate()).padStart(2, "0");
|
|
54
|
+
switch (t?.toLowerCase()) {
|
|
55
|
+
case "year": return String(r);
|
|
56
|
+
case "quarter": return `${r}-Q${Math.floor(n.getUTCMonth() / 3) + 1}`;
|
|
57
|
+
case "month": return `${r}-${i}`;
|
|
58
|
+
case "week":
|
|
59
|
+
case "day": return `${r}-${i}-${a}`;
|
|
60
|
+
case "hour": return `${i}-${a} ${String(n.getUTCHours()).padStart(2, "0")}:00`;
|
|
61
|
+
default: return `${r}-${i}`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function F(e, t, n, r, i, a) {
|
|
65
|
+
let o = (e) => {
|
|
66
|
+
e.selectAll("line").style("stroke", a).style("stroke-dasharray", "3,3").style("opacity", .3), e.select(".domain").style("stroke", "none");
|
|
67
|
+
};
|
|
68
|
+
o(e.append("g").attr("transform", `translate(0,${i})`).call(S(t).tickSize(-i).tickFormat(() => ""))), o(e.append("g").call(C(n).tickSize(-r).tickFormat(() => "")));
|
|
69
|
+
}
|
|
70
|
+
function I(e, t, n, r, i, a, o, s) {
|
|
71
|
+
let { fields: c, options: l, queryObject: u, getFieldLabel: d } = e, p = u?.timeDimensions?.some((e) => e.dimension === c.xAxisField) || !1, m = u?.timeDimensions?.find((e) => e.dimension === c.xAxisField)?.granularity, h = S(n);
|
|
72
|
+
p ? h.tickFormat((e) => P(e, m)) : l.xAxisFormat && h.tickFormat((e) => f(e, l.xAxisFormat));
|
|
73
|
+
let g = t.append("g").attr("transform", `translate(0,${a})`).call(h);
|
|
74
|
+
g.selectAll("text").style("fill", o), g.selectAll("line, path").style("stroke", s), g.append("text").attr("x", i / 2).attr("y", 35).attr("fill", o).style("text-anchor", "middle").style("font-size", "12px").text(l.xAxisFormat?.label || d(c.xAxisField));
|
|
75
|
+
let _ = C(r);
|
|
76
|
+
l.leftYAxisFormat && _.tickFormat((e) => f(e, l.leftYAxisFormat));
|
|
77
|
+
let v = t.append("g").call(_);
|
|
78
|
+
v.selectAll("text").style("fill", o), v.selectAll("line, path").style("stroke", s), v.append("text").attr("transform", "rotate(-90)").attr("y", -35).attr("x", -a / 2).attr("fill", o).style("text-anchor", "middle").style("font-size", "12px").text(l.leftYAxisFormat?.label || d(c.yAxisField));
|
|
79
|
+
}
|
|
80
|
+
function L() {
|
|
81
|
+
return A("body").append("div").attr("class", "bubble-chart-tooltip").style("position", "absolute").style("padding", "8px").style("background", "rgba(0, 0, 0, 0.8)").style("color", "white").style("border-radius", "4px").style("font-size", "12px").style("pointer-events", "none").style("opacity", 0).style("z-index", 1e3);
|
|
82
|
+
}
|
|
83
|
+
function R(e, t) {
|
|
84
|
+
let { fields: n, options: r, getFieldLabel: i } = e, a = (e) => r.leftYAxisFormat ? f(e, r.leftYAxisFormat) : e;
|
|
85
|
+
return [
|
|
86
|
+
`<strong>${t.series || "Unknown"}</strong>`,
|
|
87
|
+
`${i(n.xAxisField)}: ${t.xLabel || (r.xAxisFormat ? f(t.x, r.xAxisFormat) : t.x)}`,
|
|
88
|
+
`${i(n.yAxisField)}: ${a(t.y)}`,
|
|
89
|
+
`${i(n.sizeFieldName)}: ${a(t.size)}`,
|
|
90
|
+
n.colorFieldName && t.color ? `${i(n.colorFieldName)}: ${t.color}` : ""
|
|
91
|
+
].filter(Boolean).join("<br>");
|
|
92
|
+
}
|
|
93
|
+
function z(e, t, n, r) {
|
|
94
|
+
t.on("mouseover", function(t, i) {
|
|
95
|
+
A(this).transition().duration(200).style("opacity", 1).attr("r", r(i.size) * 1.1), n.html(R(e, i)).style("left", t.pageX + 10 + "px").style("top", t.pageY - 10 + "px").transition().duration(200).style("opacity", 1);
|
|
96
|
+
}).on("mousemove", function(e) {
|
|
97
|
+
n.style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px");
|
|
98
|
+
}).on("mouseout", function(t, i) {
|
|
99
|
+
A(this).transition().duration(200).style("opacity", e.options.bubbleOpacity).attr("r", r(i.size)), n.transition().duration(200).style("opacity", 0);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function B(e, t, n, r, a, o) {
|
|
103
|
+
let { bubbleData: s, fields: c, options: l, colorPalette: u, getFieldLabel: d } = e, p = Math.min(...s.map((e) => e.color)), m = Math.max(...s.map((e) => e.color)), h = (e) => l.leftYAxisFormat ? f(e, l.leftYAxisFormat) : e.toFixed(2), g = n.append("g").attr("class", "color-legend").attr("transform", `translate(${r / 2 - 200 / 2}, ${a + 60})`), _ = t.append("defs").append("linearGradient").attr("id", "color-scale-gradient").attr("x1", "0%").attr("y1", "0%").attr("x2", "100%").attr("y2", "0%"), v = u?.gradient || i;
|
|
104
|
+
v.forEach((e, t) => {
|
|
105
|
+
_.append("stop").attr("offset", `${t / (v.length - 1) * 100}%`).attr("stop-color", e);
|
|
106
|
+
}), g.append("rect").attr("width", 200).attr("height", 20).style("fill", "url(#color-scale-gradient)").style("stroke", "#ccc").style("stroke-width", 1), g.append("text").attr("x", 0).attr("y", 35).attr("text-anchor", "start").style("font-size", "11px").style("fill", o).text(h(p)), g.append("text").attr("x", 200).attr("y", 35).attr("text-anchor", "end").style("font-size", "11px").style("fill", o).text(h(m)), g.append("text").attr("x", 200 / 2).attr("y", -5).attr("text-anchor", "middle").style("font-size", "12px").style("font-weight", "bold").style("fill", o).text(d(c.colorFieldName));
|
|
107
|
+
}
|
|
108
|
+
function V(e, t, n, r, i, a, o, s) {
|
|
109
|
+
let { fields: c, options: l } = e;
|
|
110
|
+
if (a.length === 0) return;
|
|
111
|
+
let u = t.append("g").attr("class", "legend").attr("transform", `translate(${n / 2 - a.length * 80 / 2}, ${r + 60})`).selectAll(".legend-item").data(a).enter().append("g").attr("class", "legend-item").attr("transform", (e, t) => `translate(${t * 80}, 0)`).style("cursor", "pointer");
|
|
112
|
+
u.append("circle").attr("cx", 5).attr("cy", 5).attr("r", 5).style("fill", (e) => o(e)).style("opacity", l.bubbleOpacity), u.append("text").attr("x", 15).attr("y", 5).attr("dy", ".35em").style("font-size", "11px").style("fill", i).text((e) => String(e)), u.on("mouseover", function(e, t) {
|
|
113
|
+
s.transition().duration(200).style("opacity", (e) => c.colorFieldName && String(e.color) === t ? 1 : .2);
|
|
114
|
+
}).on("mouseout", function() {
|
|
115
|
+
s.transition().duration(200).style("opacity", l.bubbleOpacity);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function H(e) {
|
|
119
|
+
let { svgEl: t, bubbleData: n, fields: r, options: i, dimensions: a, colorPalette: c, isDark: l } = e;
|
|
120
|
+
if (A(t).selectAll("*").remove(), n.length === 0) return;
|
|
121
|
+
let u = {
|
|
122
|
+
...s,
|
|
123
|
+
left: s.left + 30,
|
|
124
|
+
bottom: i.showLegend && r.colorFieldName ? 100 : 40
|
|
125
|
+
}, f = a.width - u.left - u.right, p = a.height - u.top - u.bottom, m = A(t).attr("width", a.width).attr("height", a.height), h = m.append("g").attr("transform", `translate(${u.left},${u.top})`), g = E().domain(w(n, (e) => e.x)).range([0, f]).nice(), _ = E().domain(w(n, (e) => e.y)).range([p, 0]).nice(), v = k().domain([0, T(n, (e) => e.size)]).range([i.minBubbleSize, i.maxBubbleSize]), { colorScale: y, isNumericColorField: b, uniqueColors: x } = N(n, r.colorFieldName, c), { textColor: S, gridColor: C } = o(l);
|
|
126
|
+
i.showGrid && F(h, g, _, f, p, C), I(e, h, g, _, f, p, S, C);
|
|
127
|
+
let D = L(), O = h.selectAll(".bubble").data(n).enter().append("circle").attr("class", "bubble").attr("cx", (e) => g(e.x)).attr("cy", (e) => _(e.y)).attr("r", (e) => v(e.size)).style("fill", (e) => r.colorFieldName && e.color !== void 0 ? y(b ? e.color : String(e.color)) : d[0]).style("opacity", i.bubbleOpacity).style("stroke", "#fff").style("stroke-width", 1).style("cursor", "pointer");
|
|
128
|
+
return i.showTooltip && z(e, O, D, v), i.showLegend && r.colorFieldName && (b ? B(e, m, h, f, p, S) : V(e, h, f, p, S, x, y, O)), () => {
|
|
129
|
+
D.remove();
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/client/components/charts/BubbleChart.tsx
|
|
134
|
+
var U = /* @__PURE__ */ e({ default: () => W }), W = h.memo(function({ data: e, chartConfig: i, displayConfig: a = {}, queryObject: o, height: s = "100%", colorPalette: d }) {
|
|
135
|
+
let { t: f } = t(), p = h.useRef(null), { containerRef: m, dimensions: g, dimensionsReady: y } = l(), { theme: S } = M(), C = n(), w = v(() => c(a), [a]);
|
|
136
|
+
return _(() => {
|
|
137
|
+
if (!e || e.length === 0 || !p.current || !y || g.width === 0) return;
|
|
138
|
+
let t = u(i);
|
|
139
|
+
if (!t) return;
|
|
140
|
+
let n = r(e, t, o);
|
|
141
|
+
return H({
|
|
142
|
+
svgEl: p.current,
|
|
143
|
+
bubbleData: n,
|
|
144
|
+
fields: t,
|
|
145
|
+
options: w,
|
|
146
|
+
dimensions: g,
|
|
147
|
+
queryObject: o,
|
|
148
|
+
colorPalette: d,
|
|
149
|
+
isDark: S !== "light",
|
|
150
|
+
getFieldLabel: C
|
|
151
|
+
});
|
|
152
|
+
}, [
|
|
153
|
+
e,
|
|
154
|
+
i,
|
|
155
|
+
w,
|
|
156
|
+
o,
|
|
157
|
+
g,
|
|
158
|
+
y,
|
|
159
|
+
d,
|
|
160
|
+
S,
|
|
161
|
+
C
|
|
162
|
+
]), !e || e.length === 0 ? /* @__PURE__ */ b("div", {
|
|
163
|
+
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted",
|
|
164
|
+
style: { height: s },
|
|
165
|
+
children: /* @__PURE__ */ x("div", {
|
|
166
|
+
className: "dc:text-center",
|
|
167
|
+
children: [/* @__PURE__ */ b("div", {
|
|
168
|
+
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
169
|
+
children: f("chart.runtime.noData")
|
|
170
|
+
}), /* @__PURE__ */ b("div", {
|
|
171
|
+
className: "dc:text-xs text-dc-text-secondary",
|
|
172
|
+
children: f("chart.runtime.noDataHint.bubble")
|
|
173
|
+
})]
|
|
174
|
+
})
|
|
175
|
+
}) : i?.xAxis && i?.yAxis && i?.series ? /* @__PURE__ */ b("div", {
|
|
176
|
+
className: "dc:w-full dc:flex-1 dc:flex dc:flex-col dc:relative",
|
|
177
|
+
style: {
|
|
178
|
+
height: s,
|
|
179
|
+
minHeight: "250px",
|
|
180
|
+
overflow: "hidden"
|
|
181
|
+
},
|
|
182
|
+
children: /* @__PURE__ */ x("div", {
|
|
183
|
+
ref: m,
|
|
184
|
+
className: "dc:w-full dc:h-full dc:relative",
|
|
185
|
+
children: [/* @__PURE__ */ b("svg", {
|
|
186
|
+
ref: p,
|
|
187
|
+
className: "dc:w-full dc:h-full"
|
|
188
|
+
}), !y && /* @__PURE__ */ b("div", {
|
|
189
|
+
className: "dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center",
|
|
190
|
+
children: /* @__PURE__ */ b("div", {
|
|
191
|
+
className: "text-dc-text-muted dc:text-sm",
|
|
192
|
+
children: f("chart.runtime.measuringDimensions")
|
|
193
|
+
})
|
|
194
|
+
})]
|
|
195
|
+
})
|
|
196
|
+
}) : /* @__PURE__ */ b("div", {
|
|
197
|
+
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning",
|
|
198
|
+
style: { height: s },
|
|
199
|
+
children: /* @__PURE__ */ x("div", {
|
|
200
|
+
className: "dc:text-center",
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ b("div", {
|
|
203
|
+
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
204
|
+
children: f("chart.runtime.activityGridConfigRequired")
|
|
205
|
+
}),
|
|
206
|
+
/* @__PURE__ */ b("div", {
|
|
207
|
+
className: "dc:text-xs",
|
|
208
|
+
children: f("chart.runtime.configErrorHint.bubbleRequired")
|
|
209
|
+
}),
|
|
210
|
+
/* @__PURE__ */ b("div", {
|
|
211
|
+
className: "dc:text-xs dc:mt-1",
|
|
212
|
+
children: f("chart.runtime.configErrorHint.bubbleOptional")
|
|
213
|
+
})
|
|
214
|
+
]
|
|
215
|
+
})
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//#endregion
|
|
219
|
+
export { M as n, U as t };
|
|
220
|
+
|
|
221
|
+
//# sourceMappingURL=chart-bubble-B2he1--4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-bubble-B2he1--4.js","names":[],"sources":["../../../src/client/hooks/useTheme.ts","../../../src/client/components/charts/BubbleChart.render.ts","../../../src/client/components/charts/BubbleChart.tsx"],"sourcesContent":["/**\n * useTheme - External Theme State Hook\n *\n * Uses React 18's useSyncExternalStore to prevent parent component re-renders.\n * The theme state is stored externally and changes are propagated through\n * a subscribe/notify pattern.\n *\n * This prevents the ThemeToggle component from causing Layout re-renders.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react'\nimport { getTheme, setTheme as setThemeUtil, watchThemeChanges, type Theme } from '../theme'\n\n// External store for theme state\nconst themeStore = {\n listeners: new Set<() => void>(),\n\n subscribe(listener: () => void) {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n },\n\n notify() {\n this.listeners.forEach(listener => listener())\n }\n}\n\n// Watch theme changes from DOM/system and notify subscribers\nwatchThemeChanges(() => {\n themeStore.notify()\n})\n\n/**\n * Hook to access and update theme\n *\n * Returns current theme and a setter function.\n * Only components using this hook will re-render on theme changes.\n */\nexport function useTheme() {\n // Subscribe to external theme store\n const theme = useSyncExternalStore(\n themeStore.subscribe.bind(themeStore),\n getTheme, // Client-side snapshot\n getTheme // Server-side snapshot (SSR)\n )\n\n // Stable setter function\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeUtil(newTheme)\n themeStore.notify()\n }, [])\n\n return { theme, setTheme }\n}\n","/**\n * D3 rendering for BubbleChart, extracted from the component's render effect.\n *\n * The effect orchestrates these pure-ish drawing helpers. Behaviour matches the\n * original inline D3 exactly; only the structure changed (one function per\n * concern) to keep each helper's complexity low.\n */\nimport {\n select,\n scaleLinear,\n scaleSqrt,\n scaleOrdinal,\n scaleQuantize,\n extent,\n max,\n axisBottom,\n axisLeft,\n type Selection,\n type ScaleLinear,\n type ScalePower,\n type ScaleOrdinal,\n type ScaleQuantize\n} from 'd3'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { resolveThemeColors } from './BubbleChart.helpers'\nimport type { BubbleData, BubbleDisplayOptions, BubbleFields } from './BubbleChart.helpers'\nimport type { ColorPalette, CubeQuery } from '../../types'\n\ntype ColorScale = ScaleOrdinal<string, string> | ScaleQuantize<string>\ntype G = Selection<SVGGElement, unknown, null, undefined>\n\nexport interface BubbleRenderContext {\n svgEl: SVGSVGElement\n bubbleData: BubbleData[]\n fields: BubbleFields\n options: BubbleDisplayOptions\n dimensions: { width: number; height: number }\n queryObject: CubeQuery | undefined\n colorPalette?: ColorPalette\n isDark: boolean\n getFieldLabel: (field: string) => string\n}\n\ninterface ColorScaleResult {\n colorScale: ColorScale\n isNumericColorField: boolean\n uniqueColors: string[]\n}\n\n/** Build the bubble fill colour scale (numeric → quantize, categorical → ordinal). */\nfunction buildColorScale(\n bubbleData: BubbleData[],\n colorFieldName: string | undefined,\n colorPalette: ColorPalette | undefined\n): ColorScaleResult {\n if (colorFieldName && bubbleData.length > 0) {\n const colorValues = bubbleData\n .map((item) => (typeof item.color === 'string' ? parseFloat(item.color) : item.color))\n .filter((val): val is number => !isNaN(val as number))\n const isNumericColorField =\n colorValues.length === bubbleData.length && colorValues.every((val) => typeof val === 'number')\n\n if (isNumericColorField) {\n const colorScale = scaleQuantize<string>()\n .domain([Math.min(...colorValues), Math.max(...colorValues)])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n return { colorScale, isNumericColorField, uniqueColors: [] }\n }\n\n const uniqueColors = [...new Set(bubbleData.map((d) => String(d.color)))]\n const colorScale = scaleOrdinal<string>().domain(uniqueColors).range(colorPalette?.colors || CHART_COLORS)\n return { colorScale, isNumericColorField, uniqueColors }\n }\n\n const colorScale = scaleOrdinal<string>().domain(['default']).range([CHART_COLORS[0]])\n return { colorScale, isNumericColorField: false, uniqueColors: [] }\n}\n\n/** Format an x-axis tick for a time dimension based on its granularity. */\nfunction formatTimeTick(value: number | { valueOf(): number }, granularity: string | undefined): string {\n const date = new Date(value as number)\n if (isNaN(date.getTime())) return String(value)\n const yr = date.getUTCFullYear()\n const mo = String(date.getUTCMonth() + 1).padStart(2, '0')\n const dy = String(date.getUTCDate()).padStart(2, '0')\n switch (granularity?.toLowerCase()) {\n case 'year':\n return String(yr)\n case 'quarter':\n return `${yr}-Q${Math.floor(date.getUTCMonth() / 3) + 1}`\n case 'month':\n return `${yr}-${mo}`\n case 'week':\n case 'day':\n return `${yr}-${mo}-${dy}`\n case 'hour':\n return `${mo}-${dy} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${yr}-${mo}`\n }\n}\n\n/** Draw the dashed background grid. */\nfunction drawGrid(\n g: G,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleLinear<number, number>,\n width: number,\n chartHeight: number,\n gridColor: string\n) {\n const styleGrid = (grid: G) => {\n grid.selectAll('line').style('stroke', gridColor).style('stroke-dasharray', '3,3').style('opacity', 0.3)\n grid.select('.domain').style('stroke', 'none')\n }\n const xGrid = g\n .append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale).tickSize(-chartHeight).tickFormat(() => '')) as unknown as G\n styleGrid(xGrid)\n const yGrid = g.append('g').call(axisLeft(yScale).tickSize(-width).tickFormat(() => '')) as unknown as G\n styleGrid(yGrid)\n}\n\n/** Draw X and Y axes with labels and theme-aware styling. */\nfunction drawAxes(\n ctx: BubbleRenderContext,\n g: G,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleLinear<number, number>,\n width: number,\n chartHeight: number,\n textColor: string,\n gridColor: string\n) {\n const { fields, options, queryObject, getFieldLabel } = ctx\n const isTimeDimension =\n queryObject?.timeDimensions?.some((td: { dimension: string }) => td.dimension === fields.xAxisField) || false\n const xGranularity = queryObject?.timeDimensions?.find(\n (td: { dimension: string; granularity?: string }) => td.dimension === fields.xAxisField\n )?.granularity\n\n const xAxisGenerator = axisBottom(xScale)\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => formatTimeTick(d as number, xGranularity))\n } else if (options.xAxisFormat) {\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, options.xAxisFormat))\n }\n\n const xAxis = g.append('g').attr('transform', `translate(0,${chartHeight})`).call(xAxisGenerator)\n xAxis.selectAll('text').style('fill', textColor)\n xAxis.selectAll('line, path').style('stroke', gridColor)\n xAxis\n .append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(options.xAxisFormat?.label || getFieldLabel(fields.xAxisField))\n\n const yAxisGenerator = axisLeft(yScale)\n if (options.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, options.leftYAxisFormat))\n }\n const yAxis = g.append('g').call(yAxisGenerator)\n yAxis.selectAll('text').style('fill', textColor)\n yAxis.selectAll('line, path').style('stroke', gridColor)\n yAxis\n .append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(options.leftYAxisFormat?.label || getFieldLabel(fields.yAxisField))\n}\n\n/** Create the floating HTML tooltip element. */\nfunction createTooltip() {\n return select('body')\n .append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n}\n\ntype Tooltip = ReturnType<typeof createTooltip>\ntype Bubbles = Selection<SVGCircleElement, BubbleData, SVGGElement, unknown>\n\n/** Compose the multi-line tooltip HTML for a bubble. */\nfunction bubbleTooltipHtml(ctx: BubbleRenderContext, d: BubbleData): string {\n const { fields, options, getFieldLabel } = ctx\n const fmt = (v: number) => (options.leftYAxisFormat ? formatAxisValue(v, options.leftYAxisFormat) : v)\n return [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(fields.xAxisField)}: ${d.xLabel || (options.xAxisFormat ? formatAxisValue(d.x, options.xAxisFormat) : d.x)}`,\n `${getFieldLabel(fields.yAxisField)}: ${fmt(d.y)}`,\n `${getFieldLabel(fields.sizeFieldName)}: ${fmt(d.size)}`,\n fields.colorFieldName && d.color ? `${getFieldLabel(fields.colorFieldName)}: ${d.color}` : ''\n ]\n .filter(Boolean)\n .join('<br>')\n}\n\n/** Attach hover handlers showing/hiding the tooltip and growing the bubble. */\nfunction attachBubbleHover(\n ctx: BubbleRenderContext,\n bubbles: Bubbles,\n tooltip: Tooltip,\n sizeScale: ScalePower<number, number>\n) {\n bubbles\n .on('mouseover', function (event, d) {\n select(this).transition().duration(200).style('opacity', 1).attr('r', sizeScale(d.size) * 1.1)\n tooltip\n .html(bubbleTooltipHtml(ctx, d))\n .style('left', event.pageX + 10 + 'px')\n .style('top', event.pageY - 10 + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n })\n .on('mousemove', function (event) {\n tooltip.style('left', event.pageX + 10 + 'px').style('top', event.pageY - 10 + 'px')\n })\n .on('mouseout', function (_event, d) {\n select(this).transition().duration(200).style('opacity', ctx.options.bubbleOpacity).attr('r', sizeScale(d.size))\n tooltip.transition().duration(200).style('opacity', 0)\n })\n}\n\n/** Draw the gradient legend for a numeric colour field. */\nfunction drawNumericLegend(\n ctx: BubbleRenderContext,\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n g: G,\n width: number,\n chartHeight: number,\n textColor: string\n) {\n const { bubbleData, fields, options, colorPalette, getFieldLabel } = ctx\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map((d) => d.color as number))\n const maxValue = Math.max(...bubbleData.map((d) => d.color as number))\n const fmt = (v: number) => (options.leftYAxisFormat ? formatAxisValue(v, options.leftYAxisFormat) : v.toFixed(2))\n\n const legend = g\n .append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n const gradient = svg\n .append('defs')\n .append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%').attr('y1', '0%').attr('x2', '100%').attr('y2', '0%')\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop').attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`).attr('stop-color', color)\n })\n\n legend.append('rect')\n .attr('width', legendWidth).attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)').style('stroke', '#ccc').style('stroke-width', 1)\n legend.append('text')\n .attr('x', 0).attr('y', legendHeight + 15).attr('text-anchor', 'start')\n .style('font-size', '11px').style('fill', textColor).text(fmt(minValue))\n legend.append('text')\n .attr('x', legendWidth).attr('y', legendHeight + 15).attr('text-anchor', 'end')\n .style('font-size', '11px').style('fill', textColor).text(fmt(maxValue))\n legend.append('text')\n .attr('x', legendWidth / 2).attr('y', -5).attr('text-anchor', 'middle')\n .style('font-size', '12px').style('font-weight', 'bold').style('fill', textColor)\n .text(getFieldLabel(fields.colorFieldName!))\n}\n\n/** Draw the categorical legend (one swatch per series) with hover highlighting. */\nfunction drawCategoricalLegend(\n ctx: BubbleRenderContext,\n g: G,\n width: number,\n chartHeight: number,\n textColor: string,\n uniqueColors: string[],\n colorScale: ScaleOrdinal<string, string>,\n bubbles: Bubbles\n) {\n const { fields, options } = ctx\n if (uniqueColors.length === 0) return\n\n const legend = g\n .append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (uniqueColors.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend\n .selectAll('.legend-item')\n .data(uniqueColors)\n .enter()\n .append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5).attr('cy', 5).attr('r', 5)\n .style('fill', (d) => colorScale(d as string)).style('opacity', options.bubbleOpacity)\n legendItem.append('text')\n .attr('x', 15).attr('y', 5).attr('dy', '.35em')\n .style('font-size', '11px').style('fill', textColor).text((d) => String(d))\n\n legendItem\n .on('mouseover', function (_event, legendKey) {\n bubbles.transition().duration(200).style('opacity', (d) =>\n fields.colorFieldName && String(d.color) === legendKey ? 1 : 0.2\n )\n })\n .on('mouseout', function () {\n bubbles.transition().duration(200).style('opacity', options.bubbleOpacity)\n })\n}\n\n/**\n * Render the bubble chart into the given SVG element. Returns a cleanup function\n * that removes the floating tooltip. Returns undefined when there is nothing to draw.\n */\nexport function renderBubbleChart(ctx: BubbleRenderContext): (() => void) | undefined {\n const { svgEl, bubbleData, fields, options, dimensions, colorPalette, isDark } = ctx\n\n select(svgEl).selectAll('*').remove()\n if (bubbleData.length === 0) return undefined\n\n const margin = {\n ...CHART_MARGINS,\n left: CHART_MARGINS.left + 30,\n bottom: options.showLegend && fields.colorFieldName ? 100 : 40\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgEl).attr('width', dimensions.width).attr('height', dimensions.height)\n const g = svg.append('g').attr('transform', `translate(${margin.left},${margin.top})`)\n\n const xScale = scaleLinear().domain(extent(bubbleData, (d) => d.x) as [number, number]).range([0, width]).nice()\n const yScale = scaleLinear().domain(extent(bubbleData, (d) => d.y) as [number, number]).range([chartHeight, 0]).nice()\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, (d) => d.size) as number])\n .range([options.minBubbleSize, options.maxBubbleSize])\n\n const { colorScale, isNumericColorField, uniqueColors } = buildColorScale(\n bubbleData,\n fields.colorFieldName,\n colorPalette\n )\n const { textColor, gridColor } = resolveThemeColors(isDark)\n\n if (options.showGrid) {\n drawGrid(g, xScale, yScale, width, chartHeight, gridColor)\n }\n drawAxes(ctx, g, xScale, yScale, width, chartHeight, textColor, gridColor)\n\n const tooltip = createTooltip()\n\n const bubbles = g\n .selectAll('.bubble')\n .data(bubbleData)\n .enter()\n .append('circle')\n .attr('class', 'bubble')\n .attr('cx', (d) => xScale(d.x))\n .attr('cy', (d) => yScale(d.y))\n .attr('r', (d) => sizeScale(d.size))\n .style('fill', (d) => {\n if (fields.colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', options.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer') as Bubbles\n\n if (options.showTooltip) {\n attachBubbleHover(ctx, bubbles, tooltip, sizeScale)\n }\n\n if (options.showLegend && fields.colorFieldName) {\n if (isNumericColorField) {\n drawNumericLegend(ctx, svg, g, width, chartHeight, textColor)\n } else {\n drawCategoricalLegend(ctx, g, width, chartHeight, textColor, uniqueColors, colorScale as ScaleOrdinal<string, string>, bubbles)\n }\n }\n\n return () => {\n tooltip.remove()\n }\n}\n","import React, { useEffect, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { transition as _transition } from 'd3'\n// _transition import is for side effects only - it extends Selection.prototype with .transition()\nvoid _transition\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { useTheme } from '../../hooks/useTheme'\nimport { useChartDimensions } from './useChartDimensions'\nimport {\n resolveBubbleDisplayOptions,\n resolveBubbleFields,\n transformBubbleData\n} from './BubbleChart.helpers'\nimport { renderBubbleChart } from './BubbleChart.render'\nimport type { ChartProps } from '../../types'\n\nconst BubbleChart = React.memo(function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const svgRef = React.useRef<SVGSVGElement | null>(null)\n const { containerRef, dimensions, dimensionsReady } = useChartDimensions()\n const { theme } = useTheme()\n const getFieldLabel = useCubeFieldLabel()\n\n // Memoize display options to keep the render effect dependencies stable\n const options = useMemo(() => resolveBubbleDisplayOptions(displayConfig), [displayConfig])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n const fields = resolveBubbleFields(chartConfig)\n if (!fields) return\n\n const bubbleData = transformBubbleData(data as Record<string, any>[], fields, queryObject)\n\n return renderBubbleChart({\n svgEl: svgRef.current,\n bubbleData,\n fields,\n options,\n dimensions,\n queryObject,\n colorPalette,\n isDark: theme !== 'light',\n getFieldLabel\n })\n }, [data, chartConfig, options, queryObject, dimensions, dimensionsReady, colorPalette, theme, getFieldLabel])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.bubble')}</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\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.activityGridConfigRequired')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.configErrorHint.bubbleRequired')}</div>\n <div className=\"dc:text-xs dc:mt-1\">{t('chart.runtime.configErrorHint.bubbleOptional')}</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"dc:w-full dc:flex-1 dc:flex dc:flex-col dc:relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"dc:w-full dc:h-full dc:relative\">\n <svg ref={svgRef} className=\"dc:w-full dc:h-full\" />\n {!dimensionsReady && (\n <div className=\"dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center\">\n <div className=\"text-dc-text-muted dc:text-sm\">{t('chart.runtime.measuringDimensions')}</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
-
import {
|
|
2
|
+
import { P as t, w as n } from "./chart-activity-grid-DX0SJbxs.js";
|
|
3
3
|
import r, { useLayoutEffect as i, useMemo as a, useRef as o, useState as s } from "react";
|
|
4
4
|
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
5
|
//#region src/client/components/charts/CandlestickChart.tsx
|
|
@@ -300,4 +300,4 @@ var y = r.memo(function({ data: e, chartConfig: r, displayConfig: c = {}, height
|
|
|
300
300
|
//#endregion
|
|
301
301
|
export { d as t };
|
|
302
302
|
|
|
303
|
-
//# sourceMappingURL=chart-candlestick-
|
|
303
|
+
//# sourceMappingURL=chart-candlestick-DZp19Tzh.js.map
|
package/dist/client/chunks/{chart-candlestick-Dau5AF4E.js.map → chart-candlestick-DZp19Tzh.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-candlestick-Dau5AF4E.js","names":[],"sources":["../../../src/client/components/charts/CandlestickChart.tsx"],"sourcesContent":["import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst BULL_COLOR_DEFAULT = '#22c55e'\nconst BEAR_COLOR_DEFAULT = '#ef4444'\nconst WICK_COLOR = '#94a3b8'\nconst MAX_CANDLES = 200\n\ninterface CandleData {\n label: string\n open: number\n close: number\n high: number\n low: number\n isBullish: boolean\n originalIndex: number\n}\n\nfunction parseNum(v: unknown): number | null {\n if (v === undefined || v === null) return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return isNaN(n) ? null : n\n}\n\nfunction Candle({\n x,\n candleWidth,\n openY,\n closeY,\n highY,\n lowY,\n isBullish,\n bullColor,\n bearColor,\n showWicks,\n label,\n}: {\n x: number\n candleWidth: number\n openY: number\n closeY: number\n highY: number\n lowY: number\n isBullish: boolean\n bullColor: string\n bearColor: string\n showWicks: boolean\n label: string\n}) {\n const fill = isBullish ? bullColor : bearColor\n const bodyTop = Math.min(openY, closeY)\n const bodyBottom = Math.max(openY, closeY)\n const bodyHeight = Math.max(bodyBottom - bodyTop, 1)\n const halfWidth = candleWidth / 2\n\n return (\n <g data-testid={`candle-${label}`}>\n <rect\n x={x - halfWidth}\n y={bodyTop}\n width={candleWidth}\n height={bodyHeight}\n fill={fill}\n data-testid={`candle-body-${label}`}\n data-bullish={isBullish}\n />\n {showWicks && (\n <>\n <line\n x1={x}\n y1={highY}\n x2={x}\n y2={bodyTop}\n stroke={WICK_COLOR}\n strokeWidth={1}\n data-testid={`wick-high-${label}`}\n />\n <line\n x1={x}\n y1={bodyBottom}\n x2={x}\n y2={lowY}\n stroke={WICK_COLOR}\n strokeWidth={1}\n data-testid={`wick-low-${label}`}\n />\n </>\n )}\n </g>\n )\n}\n\nfunction YAxisTicks({\n domainMin,\n domainMax,\n innerHeight,\n tickCount,\n format,\n}: {\n domainMin: number\n domainMax: number\n innerHeight: number\n tickCount: number\n format?: (v: number) => string\n}) {\n const ticks = useMemo(() => {\n const step = (domainMax - domainMin) / (tickCount - 1)\n return Array.from({ length: tickCount }, (_, i) => domainMin + i * step)\n }, [domainMin, domainMax, tickCount])\n\n const yScale = (v: number) => innerHeight - ((v - domainMin) / (domainMax - domainMin)) * innerHeight\n\n return (\n <g data-testid=\"y-axis\">\n <line y1={0} y2={innerHeight} stroke=\"currentColor\" strokeWidth={1} />\n {ticks.map((tick, i) => (\n <g key={i} transform={`translate(0, ${yScale(tick)})`}>\n <line x1={0} x2={-6} stroke=\"currentColor\" strokeWidth={1} />\n <text\n x={-10}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n >\n {format ? format(tick) : tick.toLocaleString()}\n </text>\n <line x1={0} x2=\"100%\" stroke=\"currentColor\" strokeOpacity={0.1} strokeWidth={1} />\n </g>\n ))}\n </g>\n )\n}\n\nconst CandlestickChart = React.memo(function CandlestickChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const containerRef = useRef<HTMLDivElement>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: h } = entry.contentRect\n if (width > 0 && h > 0) setDimensions({ width, height: h })\n }\n })\n observer.observe(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) setDimensions({ width: rect.width, height: rect.height })\n return () => observer.disconnect()\n }, [])\n\n const bullColor = displayConfig?.bullColor ?? BULL_COLOR_DEFAULT\n const bearColor = displayConfig?.bearColor ?? BEAR_COLOR_DEFAULT\n const showWicks = displayConfig?.showWicks ?? true\n const rangeMode = displayConfig?.rangeMode ?? 'ohlc'\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xField, openField, closeField, highField, lowField, configError } = useMemo(() => {\n const xField = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.xAxis ?? chartConfig?.x\n\n const yAxisFields: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n\n const openField = yAxisFields[0] ?? ''\n const closeField = (rangeMode === 'range' ? yAxisFields[0] : yAxisFields[1]) ?? ''\n const highField = (rangeMode === 'range' ? yAxisFields[0] : yAxisFields[2]) ?? ''\n const lowField = (rangeMode === 'range' ? yAxisFields[1] : yAxisFields[3]) ?? ''\n\n if (!xField) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'Candlestick chart requires an X-Axis (time or category dimension)',\n }\n }\n\n if (rangeMode === 'range' && (!highField || !lowField)) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'Range mode requires at least 2 measures (high, low) in Y-Axis',\n }\n }\n\n if (rangeMode === 'ohlc' && (!openField || !closeField)) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'OHLC mode requires at least 2 measures (open, close) in Y-Axis',\n }\n }\n\n return { xField, openField, closeField, highField, lowField, configError: null }\n }, [chartConfig, rangeMode])\n\n const candles: CandleData[] = useMemo(() => {\n if (configError || !data || data.length === 0) return []\n const rows = (data as Record<string, unknown>[]).slice(0, MAX_CANDLES)\n const result: CandleData[] = []\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const label = String(row[xField!] ?? `Bar ${i + 1}`)\n const rawOpen = parseNum(row[openField])\n const rawClose = parseNum(row[closeField])\n if (rawOpen === null || rawClose === null) continue\n\n let open = rawOpen\n let close = rawClose\n const high = highField ? (parseNum(row[highField]) ?? Math.max(open, close)) : Math.max(open, close)\n const low = lowField ? (parseNum(row[lowField]) ?? Math.min(open, close)) : Math.min(open, close)\n\n if (rangeMode === 'range') {\n open = low\n close = high\n }\n\n result.push({\n label,\n open,\n close,\n high: Math.max(open, close, high),\n low: Math.min(open, close, low),\n isBullish: close >= open,\n originalIndex: i,\n })\n }\n return result\n }, [data, xField, openField, closeField, highField, lowField, rangeMode, configError])\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.candlestick')}</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 const margin = { top: 20, right: 20, bottom: 60, left: 70 }\n const containerWidth = dimensions.width || 600\n const containerHeight =\n typeof height === 'number' ? height : dimensions.height || 400\n const innerWidth = Math.max(containerWidth - margin.left - margin.right, 50)\n const innerHeight = Math.max(\n (typeof containerHeight === 'number' ? containerHeight : parseInt(String(containerHeight)) || 400) -\n margin.top -\n margin.bottom,\n 50\n )\n\n const allValues = candles.flatMap((c) => [c.low, c.high])\n const rawMin = Math.min(...allValues)\n const rawMax = Math.max(...allValues)\n const pad = (rawMax - rawMin) * 0.05 || 1\n const domainMin = rawMin - pad\n const domainMax = rawMax + pad\n\n const yScale = (v: number) =>\n innerHeight - ((v - domainMin) / (domainMax - domainMin)) * innerHeight\n\n const candleSpacing = innerWidth / candles.length\n const candleWidth = Math.min(candleSpacing * 0.7, 20)\n\n const isTruncated = (data as unknown[]).length > MAX_CANDLES\n\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full\" style={{ height }}>\n <svg\n width=\"100%\"\n height={isTruncated ? 'calc(100% - 20px)' : '100%'}\n viewBox={`0 0 ${containerWidth} ${typeof containerHeight === 'number' ? containerHeight : 400}`}\n data-testid=\"candlestick-svg\"\n >\n <g transform={`translate(${margin.left}, ${margin.top})`}>\n <YAxisTicks\n domainMin={domainMin}\n domainMax={domainMax}\n innerHeight={innerHeight}\n tickCount={5}\n format={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n\n {candles.map((candle, i) => {\n const cx = candleSpacing * i + candleSpacing / 2\n return (\n <g\n key={candle.label + i}\n onClick={(event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled) {\n onDataPointClick({\n dataPoint: { ...candle },\n clickedField: xField ?? '',\n xValue: candle.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n cursor={drillEnabled ? 'pointer' : undefined}\n >\n <title>{`${candle.label}: O=${candle.open} H=${candle.high} L=${candle.low} C=${candle.close}`}</title>\n <Candle\n x={cx}\n candleWidth={candleWidth}\n openY={yScale(candle.open)}\n closeY={yScale(candle.close)}\n highY={yScale(candle.high)}\n lowY={yScale(candle.low)}\n isBullish={candle.isBullish}\n bullColor={bullColor}\n bearColor={bearColor}\n showWicks={showWicks}\n label={candle.label}\n />\n <text\n x={cx}\n y={innerHeight + 20}\n textAnchor=\"middle\"\n fontSize={10}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid={`x-label-${candle.label}`}\n >\n {candle.label}\n </text>\n </g>\n )\n })}\n </g>\n </svg>\n {isTruncated && (\n <div className=\"dc:text-xs text-dc-warning dc:text-center dc:mt-1\">\n {t('chart.runtime.candlestick.truncated', {\n max: MAX_CANDLES,\n total: (data as unknown[]).length\n })}\n </div>\n )}\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: 'Candlestick 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 CandlestickChart\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-candlestick-DZp19Tzh.js","names":[],"sources":["../../../src/client/components/charts/CandlestickChart.tsx"],"sourcesContent":["import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst BULL_COLOR_DEFAULT = '#22c55e'\nconst BEAR_COLOR_DEFAULT = '#ef4444'\nconst WICK_COLOR = '#94a3b8'\nconst MAX_CANDLES = 200\n\ninterface CandleData {\n label: string\n open: number\n close: number\n high: number\n low: number\n isBullish: boolean\n originalIndex: number\n}\n\nfunction parseNum(v: unknown): number | null {\n if (v === undefined || v === null) return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return isNaN(n) ? null : n\n}\n\nfunction Candle({\n x,\n candleWidth,\n openY,\n closeY,\n highY,\n lowY,\n isBullish,\n bullColor,\n bearColor,\n showWicks,\n label,\n}: {\n x: number\n candleWidth: number\n openY: number\n closeY: number\n highY: number\n lowY: number\n isBullish: boolean\n bullColor: string\n bearColor: string\n showWicks: boolean\n label: string\n}) {\n const fill = isBullish ? bullColor : bearColor\n const bodyTop = Math.min(openY, closeY)\n const bodyBottom = Math.max(openY, closeY)\n const bodyHeight = Math.max(bodyBottom - bodyTop, 1)\n const halfWidth = candleWidth / 2\n\n return (\n <g data-testid={`candle-${label}`}>\n <rect\n x={x - halfWidth}\n y={bodyTop}\n width={candleWidth}\n height={bodyHeight}\n fill={fill}\n data-testid={`candle-body-${label}`}\n data-bullish={isBullish}\n />\n {showWicks && (\n <>\n <line\n x1={x}\n y1={highY}\n x2={x}\n y2={bodyTop}\n stroke={WICK_COLOR}\n strokeWidth={1}\n data-testid={`wick-high-${label}`}\n />\n <line\n x1={x}\n y1={bodyBottom}\n x2={x}\n y2={lowY}\n stroke={WICK_COLOR}\n strokeWidth={1}\n data-testid={`wick-low-${label}`}\n />\n </>\n )}\n </g>\n )\n}\n\nfunction YAxisTicks({\n domainMin,\n domainMax,\n innerHeight,\n tickCount,\n format,\n}: {\n domainMin: number\n domainMax: number\n innerHeight: number\n tickCount: number\n format?: (v: number) => string\n}) {\n const ticks = useMemo(() => {\n const step = (domainMax - domainMin) / (tickCount - 1)\n return Array.from({ length: tickCount }, (_, i) => domainMin + i * step)\n }, [domainMin, domainMax, tickCount])\n\n const yScale = (v: number) => innerHeight - ((v - domainMin) / (domainMax - domainMin)) * innerHeight\n\n return (\n <g data-testid=\"y-axis\">\n <line y1={0} y2={innerHeight} stroke=\"currentColor\" strokeWidth={1} />\n {ticks.map((tick, i) => (\n <g key={i} transform={`translate(0, ${yScale(tick)})`}>\n <line x1={0} x2={-6} stroke=\"currentColor\" strokeWidth={1} />\n <text\n x={-10}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n >\n {format ? format(tick) : tick.toLocaleString()}\n </text>\n <line x1={0} x2=\"100%\" stroke=\"currentColor\" strokeOpacity={0.1} strokeWidth={1} />\n </g>\n ))}\n </g>\n )\n}\n\nconst CandlestickChart = React.memo(function CandlestickChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const containerRef = useRef<HTMLDivElement>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: h } = entry.contentRect\n if (width > 0 && h > 0) setDimensions({ width, height: h })\n }\n })\n observer.observe(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) setDimensions({ width: rect.width, height: rect.height })\n return () => observer.disconnect()\n }, [])\n\n const bullColor = displayConfig?.bullColor ?? BULL_COLOR_DEFAULT\n const bearColor = displayConfig?.bearColor ?? BEAR_COLOR_DEFAULT\n const showWicks = displayConfig?.showWicks ?? true\n const rangeMode = displayConfig?.rangeMode ?? 'ohlc'\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xField, openField, closeField, highField, lowField, configError } = useMemo(() => {\n const xField = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.xAxis ?? chartConfig?.x\n\n const yAxisFields: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n\n const openField = yAxisFields[0] ?? ''\n const closeField = (rangeMode === 'range' ? yAxisFields[0] : yAxisFields[1]) ?? ''\n const highField = (rangeMode === 'range' ? yAxisFields[0] : yAxisFields[2]) ?? ''\n const lowField = (rangeMode === 'range' ? yAxisFields[1] : yAxisFields[3]) ?? ''\n\n if (!xField) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'Candlestick chart requires an X-Axis (time or category dimension)',\n }\n }\n\n if (rangeMode === 'range' && (!highField || !lowField)) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'Range mode requires at least 2 measures (high, low) in Y-Axis',\n }\n }\n\n if (rangeMode === 'ohlc' && (!openField || !closeField)) {\n return {\n xField,\n openField,\n closeField,\n highField,\n lowField,\n configError: 'OHLC mode requires at least 2 measures (open, close) in Y-Axis',\n }\n }\n\n return { xField, openField, closeField, highField, lowField, configError: null }\n }, [chartConfig, rangeMode])\n\n const candles: CandleData[] = useMemo(() => {\n if (configError || !data || data.length === 0) return []\n const rows = (data as Record<string, unknown>[]).slice(0, MAX_CANDLES)\n const result: CandleData[] = []\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const label = String(row[xField!] ?? `Bar ${i + 1}`)\n const rawOpen = parseNum(row[openField])\n const rawClose = parseNum(row[closeField])\n if (rawOpen === null || rawClose === null) continue\n\n let open = rawOpen\n let close = rawClose\n const high = highField ? (parseNum(row[highField]) ?? Math.max(open, close)) : Math.max(open, close)\n const low = lowField ? (parseNum(row[lowField]) ?? Math.min(open, close)) : Math.min(open, close)\n\n if (rangeMode === 'range') {\n open = low\n close = high\n }\n\n result.push({\n label,\n open,\n close,\n high: Math.max(open, close, high),\n low: Math.min(open, close, low),\n isBullish: close >= open,\n originalIndex: i,\n })\n }\n return result\n }, [data, xField, openField, closeField, highField, lowField, rangeMode, configError])\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.candlestick')}</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 const margin = { top: 20, right: 20, bottom: 60, left: 70 }\n const containerWidth = dimensions.width || 600\n const containerHeight =\n typeof height === 'number' ? height : dimensions.height || 400\n const innerWidth = Math.max(containerWidth - margin.left - margin.right, 50)\n const innerHeight = Math.max(\n (typeof containerHeight === 'number' ? containerHeight : parseInt(String(containerHeight)) || 400) -\n margin.top -\n margin.bottom,\n 50\n )\n\n const allValues = candles.flatMap((c) => [c.low, c.high])\n const rawMin = Math.min(...allValues)\n const rawMax = Math.max(...allValues)\n const pad = (rawMax - rawMin) * 0.05 || 1\n const domainMin = rawMin - pad\n const domainMax = rawMax + pad\n\n const yScale = (v: number) =>\n innerHeight - ((v - domainMin) / (domainMax - domainMin)) * innerHeight\n\n const candleSpacing = innerWidth / candles.length\n const candleWidth = Math.min(candleSpacing * 0.7, 20)\n\n const isTruncated = (data as unknown[]).length > MAX_CANDLES\n\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full\" style={{ height }}>\n <svg\n width=\"100%\"\n height={isTruncated ? 'calc(100% - 20px)' : '100%'}\n viewBox={`0 0 ${containerWidth} ${typeof containerHeight === 'number' ? containerHeight : 400}`}\n data-testid=\"candlestick-svg\"\n >\n <g transform={`translate(${margin.left}, ${margin.top})`}>\n <YAxisTicks\n domainMin={domainMin}\n domainMax={domainMax}\n innerHeight={innerHeight}\n tickCount={5}\n format={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n\n {candles.map((candle, i) => {\n const cx = candleSpacing * i + candleSpacing / 2\n return (\n <g\n key={candle.label + i}\n onClick={(event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled) {\n onDataPointClick({\n dataPoint: { ...candle },\n clickedField: xField ?? '',\n xValue: candle.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n cursor={drillEnabled ? 'pointer' : undefined}\n >\n <title>{`${candle.label}: O=${candle.open} H=${candle.high} L=${candle.low} C=${candle.close}`}</title>\n <Candle\n x={cx}\n candleWidth={candleWidth}\n openY={yScale(candle.open)}\n closeY={yScale(candle.close)}\n highY={yScale(candle.high)}\n lowY={yScale(candle.low)}\n isBullish={candle.isBullish}\n bullColor={bullColor}\n bearColor={bearColor}\n showWicks={showWicks}\n label={candle.label}\n />\n <text\n x={cx}\n y={innerHeight + 20}\n textAnchor=\"middle\"\n fontSize={10}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid={`x-label-${candle.label}`}\n >\n {candle.label}\n </text>\n </g>\n )\n })}\n </g>\n </svg>\n {isTruncated && (\n <div className=\"dc:text-xs text-dc-warning dc:text-center dc:mt-1\">\n {t('chart.runtime.candlestick.truncated', {\n max: MAX_CANDLES,\n total: (data as unknown[]).length\n })}\n </div>\n )}\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: 'Candlestick 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 CandlestickChart\n"],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
+
//#region src/client/charts/chartConfigHelpers.ts
|
|
3
|
+
function t({ measureCount: e, dimensionCount: t }) {
|
|
4
|
+
return e < 1 ? {
|
|
5
|
+
available: !1,
|
|
6
|
+
reason: "chart.availability.requiresMeasure"
|
|
7
|
+
} : t < 1 ? {
|
|
8
|
+
available: !1,
|
|
9
|
+
reason: "chart.availability.requiresDimension"
|
|
10
|
+
} : { available: !0 };
|
|
11
|
+
}
|
|
12
|
+
function n({ measureCount: e }) {
|
|
13
|
+
return e < 1 ? {
|
|
14
|
+
available: !1,
|
|
15
|
+
reason: "chart.availability.requiresMeasure"
|
|
16
|
+
} : { available: !0 };
|
|
17
|
+
}
|
|
18
|
+
var r = {
|
|
19
|
+
key: "target",
|
|
20
|
+
label: "chart.option.target.label",
|
|
21
|
+
type: "string",
|
|
22
|
+
placeholder: "e.g., 100 or 50,75 for spread",
|
|
23
|
+
description: "chart.option.target.description"
|
|
24
|
+
}, i = {
|
|
25
|
+
key: "connectNulls",
|
|
26
|
+
label: "chart.option.connectNulls.label",
|
|
27
|
+
type: "boolean",
|
|
28
|
+
defaultValue: !1,
|
|
29
|
+
description: "chart.option.connectNulls.description"
|
|
30
|
+
}, a = {
|
|
31
|
+
key: "leftYAxisFormat",
|
|
32
|
+
label: "chart.option.leftYAxisFormat.label",
|
|
33
|
+
type: "axisFormat",
|
|
34
|
+
description: "chart.option.leftYAxisFormat.description"
|
|
35
|
+
}, o = {
|
|
36
|
+
key: "rightYAxisFormat",
|
|
37
|
+
label: "chart.option.rightYAxisFormat.label",
|
|
38
|
+
type: "axisFormat",
|
|
39
|
+
description: "chart.option.rightYAxisFormat.description"
|
|
40
|
+
};
|
|
41
|
+
function s(e = "chart.option.valueFormat.description") {
|
|
42
|
+
return {
|
|
43
|
+
key: "leftYAxisFormat",
|
|
44
|
+
label: "chart.option.valueFormat.label",
|
|
45
|
+
type: "axisFormat",
|
|
46
|
+
description: e
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function c(e) {
|
|
50
|
+
return {
|
|
51
|
+
key: "stackType",
|
|
52
|
+
label: "chart.option.stacking.label",
|
|
53
|
+
type: "select",
|
|
54
|
+
defaultValue: "none",
|
|
55
|
+
options: [
|
|
56
|
+
{
|
|
57
|
+
value: "none",
|
|
58
|
+
label: "chart.option.accentBorder.none"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
value: "normal",
|
|
62
|
+
label: "chart.option.stacking.stacked"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
value: "percent",
|
|
66
|
+
label: "chart.option.stacking.percent"
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
description: e
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/client/components/charts/AreaChart.config.ts
|
|
74
|
+
var l = /* @__PURE__ */ e({ areaChartConfig: () => u }), u = {
|
|
75
|
+
label: "chart.area.label",
|
|
76
|
+
description: "chart.area.description",
|
|
77
|
+
useCase: "chart.area.useCase",
|
|
78
|
+
isAvailable: t,
|
|
79
|
+
dropZones: [
|
|
80
|
+
{
|
|
81
|
+
key: "xAxis",
|
|
82
|
+
label: "chart.configText.x_axis_time_categories",
|
|
83
|
+
description: "chart.configText.time_dimensions_or_dimensions_for_x_axis",
|
|
84
|
+
mandatory: !0,
|
|
85
|
+
acceptTypes: ["dimension", "timeDimension"],
|
|
86
|
+
emptyText: "chart.area.dropZone.xAxis.empty"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
key: "yAxis",
|
|
90
|
+
label: "chart.dropZone.yAxis.label",
|
|
91
|
+
description: "chart.configText.measures_for_area_values",
|
|
92
|
+
mandatory: !0,
|
|
93
|
+
acceptTypes: ["measure"],
|
|
94
|
+
emptyText: "chart.area.dropZone.yAxis.empty",
|
|
95
|
+
enableDualAxis: !0
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
key: "series",
|
|
99
|
+
label: "chart.configText.series_stack_areas",
|
|
100
|
+
description: "chart.configText.dimensions_to_create_stacked_areas",
|
|
101
|
+
mandatory: !1,
|
|
102
|
+
acceptTypes: ["dimension"],
|
|
103
|
+
emptyText: "chart.area.dropZone.series.empty"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
displayOptions: [
|
|
107
|
+
"showLegend",
|
|
108
|
+
"showGrid",
|
|
109
|
+
"showTooltip",
|
|
110
|
+
"showAllXLabels",
|
|
111
|
+
"hideHeader"
|
|
112
|
+
],
|
|
113
|
+
displayOptionsConfig: [
|
|
114
|
+
c("chart.configText.how_to_stack_multiple_area_series"),
|
|
115
|
+
i,
|
|
116
|
+
r,
|
|
117
|
+
a,
|
|
118
|
+
o
|
|
119
|
+
]
|
|
120
|
+
};
|
|
121
|
+
//#endregion
|
|
122
|
+
export { n as a, c, a as i, r as l, u as n, t as o, i as r, o as s, l as t, s as u };
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=chart-config-area-BNigHUy8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-config-area-BNigHUy8.js","names":[],"sources":["../../../src/client/charts/chartConfigHelpers.ts","../../../src/client/components/charts/AreaChart.config.ts"],"sourcesContent":["import type { ChartAvailabilityContext, ChartAvailability, DisplayOptionConfig } from './chartConfigs'\n\n/**\n * Shared building blocks for chart `*.config.ts` files.\n *\n * Most chart configs repeated the same `isAvailable` guard and the same\n * display-option definitions (target line, Y-axis format, stacking, …).\n * These factories centralise that boilerplate so each chart config only\n * declares what is genuinely unique to it.\n */\n\n/**\n * Standard availability rule shared by most chart types: at least one measure\n * and at least one dimension (regular or time) must be selected.\n */\nexport function requiresMeasureAndDimension({\n measureCount,\n dimensionCount\n}: ChartAvailabilityContext): ChartAvailability {\n if (measureCount < 1) return { available: false, reason: 'chart.availability.requiresMeasure' }\n if (dimensionCount < 1) return { available: false, reason: 'chart.availability.requiresDimension' }\n return { available: true }\n}\n\n/**\n * Availability rule for charts that only need a single measure (KPI-style\n * charts and gauges): at least one measure, no dimension requirement.\n */\nexport function requiresMeasure({ measureCount }: ChartAvailabilityContext): ChartAvailability {\n if (measureCount < 1) return { available: false, reason: 'chart.availability.requiresMeasure' }\n return { available: true }\n}\n\n/** Target-line display option (single value or comma-separated spread). */\nexport const targetDisplayOption: DisplayOptionConfig = {\n key: 'target',\n label: 'chart.option.target.label',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'chart.option.target.description'\n}\n\n/** Connect-nulls toggle for line/area charts. */\nexport const connectNullsDisplayOption: DisplayOptionConfig = {\n key: 'connectNulls',\n label: 'chart.option.connectNulls.label',\n type: 'boolean',\n defaultValue: false,\n description: 'chart.option.connectNulls.description'\n}\n\n/** Left Y-axis numeric format control (dual-axis charts). */\nexport const leftYAxisFormatDisplayOption: DisplayOptionConfig = {\n key: 'leftYAxisFormat',\n label: 'chart.option.leftYAxisFormat.label',\n type: 'axisFormat',\n description: 'chart.option.leftYAxisFormat.description'\n}\n\n/** Right Y-axis numeric format control (dual-axis charts). */\nexport const rightYAxisFormatDisplayOption: DisplayOptionConfig = {\n key: 'rightYAxisFormat',\n label: 'chart.option.rightYAxisFormat.label',\n type: 'axisFormat',\n description: 'chart.option.rightYAxisFormat.description'\n}\n\n/**\n * Single value-format control used by charts that only have one numeric scale\n * (pie, radar, radial bar, treemap). Stored under `leftYAxisFormat` for\n * backward compatibility with existing saved configs.\n */\nexport function valueFormatDisplayOption(\n description = 'chart.option.valueFormat.description'\n): DisplayOptionConfig {\n return {\n key: 'leftYAxisFormat',\n label: 'chart.option.valueFormat.label',\n type: 'axisFormat',\n description\n }\n}\n\n/**\n * Stacking-mode select shared by bar and area charts. `description` differs\n * per chart (bar vs area series wording).\n */\nexport function stackTypeDisplayOption(description: string): DisplayOptionConfig {\n return {\n key: 'stackType',\n label: 'chart.option.stacking.label',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'chart.option.accentBorder.none' },\n { value: 'normal', label: 'chart.option.stacking.stacked' },\n { value: 'percent', label: 'chart.option.stacking.percent' }\n ],\n description\n }\n}\n","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport {\n requiresMeasureAndDimension,\n stackTypeDisplayOption,\n connectNullsDisplayOption,\n targetDisplayOption,\n leftYAxisFormatDisplayOption,\n rightYAxisFormatDisplayOption\n} from '../../charts/chartConfigHelpers'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n label: 'chart.area.label',\n description: 'chart.area.description',\n useCase: 'chart.area.useCase',\n isAvailable: requiresMeasureAndDimension,\n dropZones: [\n {\n key: 'xAxis',\n label: 'chart.configText.x_axis_time_categories',\n description: 'chart.configText.time_dimensions_or_dimensions_for_x_axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'chart.area.dropZone.xAxis.empty'\n },\n {\n key: 'yAxis',\n label: 'chart.dropZone.yAxis.label',\n description: 'chart.configText.measures_for_area_values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'chart.area.dropZone.yAxis.empty',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'chart.configText.series_stack_areas',\n description: 'chart.configText.dimensions_to_create_stacked_areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'chart.area.dropZone.series.empty'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'showAllXLabels', 'hideHeader'],\n displayOptionsConfig: [\n stackTypeDisplayOption('chart.configText.how_to_stack_multiple_area_series'),\n connectNullsDisplayOption,\n targetDisplayOption,\n leftYAxisFormatDisplayOption,\n rightYAxisFormatDisplayOption\n ]\n}"],"mappings":";;AAeA,SAAgB,EAA4B,EAC1C,iBACA,qBAC8C;CAG9C,OAFI,IAAe,IAAU;EAAE,WAAW;EAAO,QAAQ;CAAqC,IAC1F,IAAiB,IAAU;EAAE,WAAW;EAAO,QAAQ;CAAuC,IAC3F,EAAE,WAAW,GAAK;AAC3B;AAMA,SAAgB,EAAgB,EAAE,mBAA6D;CAE7F,OADI,IAAe,IAAU;EAAE,WAAW;EAAO,QAAQ;CAAqC,IACvF,EAAE,WAAW,GAAK;AAC3B;AAGA,IAAa,IAA2C;CACtD,KAAK;CACL,OAAO;CACP,MAAM;CACN,aAAa;CACb,aAAa;AACf,GAGa,IAAiD;CAC5D,KAAK;CACL,OAAO;CACP,MAAM;CACN,cAAc;CACd,aAAa;AACf,GAGa,IAAoD;CAC/D,KAAK;CACL,OAAO;CACP,MAAM;CACN,aAAa;AACf,GAGa,IAAqD;CAChE,KAAK;CACL,OAAO;CACP,MAAM;CACN,aAAa;AACf;AAOA,SAAgB,EACd,IAAc,wCACO;CACrB,OAAO;EACL,KAAK;EACL,OAAO;EACP,MAAM;EACN;CACF;AACF;AAMA,SAAgB,EAAuB,GAA0C;CAC/E,OAAO;EACL,KAAK;EACL,OAAO;EACP,MAAM;EACN,cAAc;EACd,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;GAAiC;GACzD;IAAE,OAAO;IAAU,OAAO;GAAgC;GAC1D;IAAE,OAAO;IAAW,OAAO;GAAgC;EAC7D;EACA;CACF;AACF;;;yDCvFa,IAAmC;CAC9C,OAAO;CACP,aAAa;CACb,SAAS;CACT,aAAa;CACb,WAAW;EACT;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,aAAa,eAAe;GAC1C,WAAW;EACb;EACA;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,SAAS;GACvB,WAAW;GACX,gBAAgB;EAClB;EACA;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,WAAW;GACzB,WAAW;EACb;CACF;CACA,gBAAgB;EAAC;EAAc;EAAY;EAAe;EAAkB;CAAY;CACxF,sBAAsB;EACpB,EAAuB,oDAAoD;EAC3E;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
+
import { c as t, i as n, l as r, o as i, s as a } from "./chart-config-area-BNigHUy8.js";
|
|
3
|
+
//#region src/client/components/charts/BarChart.config.ts
|
|
4
|
+
var o = /* @__PURE__ */ e({ barChartConfig: () => s }), s = {
|
|
5
|
+
label: "chart.bar.label",
|
|
6
|
+
description: "chart.bar.description",
|
|
7
|
+
useCase: "chart.bar.useCase",
|
|
8
|
+
clickableElements: { bar: !0 },
|
|
9
|
+
isAvailable: i,
|
|
10
|
+
dropZones: [
|
|
11
|
+
{
|
|
12
|
+
key: "xAxis",
|
|
13
|
+
label: "chart.dropZone.xAxis.label",
|
|
14
|
+
description: "chart.dropZone.xAxis.description",
|
|
15
|
+
mandatory: !1,
|
|
16
|
+
acceptTypes: ["dimension", "timeDimension"],
|
|
17
|
+
emptyText: "chart.bar.dropZone.xAxis.empty"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: "yAxis",
|
|
21
|
+
label: "chart.dropZone.yAxis.label",
|
|
22
|
+
description: "chart.configText.measures_for_bar_heights",
|
|
23
|
+
mandatory: !0,
|
|
24
|
+
acceptTypes: ["measure"],
|
|
25
|
+
emptyText: "chart.bar.dropZone.yAxis.empty",
|
|
26
|
+
enableDualAxis: !0
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: "series",
|
|
30
|
+
label: "chart.dropZone.series.label",
|
|
31
|
+
description: "chart.dropZone.series.description",
|
|
32
|
+
mandatory: !1,
|
|
33
|
+
acceptTypes: ["dimension"],
|
|
34
|
+
emptyText: "chart.bar.dropZone.series.empty"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
displayOptions: [
|
|
38
|
+
"showLegend",
|
|
39
|
+
"showGrid",
|
|
40
|
+
"showTooltip",
|
|
41
|
+
"showAllXLabels",
|
|
42
|
+
"hideHeader"
|
|
43
|
+
],
|
|
44
|
+
displayOptionsConfig: [
|
|
45
|
+
t("chart.configText.how_to_stack_multiple_bar_series"),
|
|
46
|
+
r,
|
|
47
|
+
n,
|
|
48
|
+
a
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { s as n, o as t };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=chart-config-bar-DSO_LRTx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-config-bar-DSO_LRTx.js","names":[],"sources":["../../../src/client/components/charts/BarChart.config.ts"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport {\n requiresMeasureAndDimension,\n stackTypeDisplayOption,\n targetDisplayOption,\n leftYAxisFormatDisplayOption,\n rightYAxisFormatDisplayOption\n} from '../../charts/chartConfigHelpers'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n label: 'chart.bar.label',\n description: 'chart.bar.description',\n useCase: 'chart.bar.useCase',\n clickableElements: { bar: true },\n isAvailable: requiresMeasureAndDimension,\n dropZones: [\n {\n key: 'xAxis',\n label: 'chart.dropZone.xAxis.label',\n description: 'chart.dropZone.xAxis.description',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'chart.bar.dropZone.xAxis.empty'\n },\n {\n key: 'yAxis',\n label: 'chart.dropZone.yAxis.label',\n description: 'chart.configText.measures_for_bar_heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'chart.bar.dropZone.yAxis.empty',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'chart.dropZone.series.label',\n description: 'chart.dropZone.series.description',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'chart.bar.dropZone.series.empty'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'showAllXLabels', 'hideHeader'],\n displayOptionsConfig: [\n stackTypeDisplayOption('chart.configText.how_to_stack_multiple_bar_series'),\n targetDisplayOption,\n leftYAxisFormatDisplayOption,\n rightYAxisFormatDisplayOption\n ]\n}"],"mappings":";;;wDAYa,IAAkC;CAC7C,OAAO;CACP,aAAa;CACb,SAAS;CACT,mBAAmB,EAAE,KAAK,GAAK;CAC/B,aAAa;CACb,WAAW;EACT;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,aAAa,eAAe;GAC1C,WAAW;EACb;EACA;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,SAAS;GACvB,WAAW;GACX,gBAAgB;EAClB;EACA;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,WAAW;GACX,aAAa,CAAC,WAAW;GACzB,WAAW;EACb;CACF;CACA,gBAAgB;EAAC;EAAc;EAAY;EAAe;EAAkB;CAAY;CACxF,sBAAsB;EACpB,EAAuB,mDAAmD;EAC1E;EACA;EACA;CACF;AACF"}
|