drizzle-cube 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/adapters/hono/agent-handler.d.ts +9 -0
  3. package/dist/adapters/adapters/hono/mcp-handler.d.ts +37 -0
  4. package/dist/adapters/adapters/mcp-tools-handlers.d.ts +18 -0
  5. package/dist/adapters/adapters/nextjs/mcp-handler.d.ts +36 -0
  6. package/dist/adapters/adapters/utils.d.ts +6 -81
  7. package/dist/adapters/express/index.cjs +1 -1
  8. package/dist/adapters/express/index.js +50 -50
  9. package/dist/adapters/fastify/index.cjs +1 -1
  10. package/dist/adapters/fastify/index.js +78 -78
  11. package/dist/adapters/google-BOnRIN1w.cjs +2 -0
  12. package/dist/adapters/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
  13. package/dist/adapters/{handler-Cx8QYLk6.js → handler-CfgE0JSL.js} +499 -576
  14. package/dist/adapters/handler-Cn0dOctE.cjs +25 -0
  15. package/dist/adapters/hono/index.cjs +2 -2
  16. package/dist/adapters/hono/index.js +205 -175
  17. package/dist/adapters/locale-DDvZDFVn.js +8114 -0
  18. package/dist/adapters/locale-ZLUUNUxr.cjs +166 -0
  19. package/dist/adapters/mcp-tools.cjs +1 -1
  20. package/dist/adapters/mcp-tools.js +49 -38
  21. package/dist/adapters/mcp-transport-Chiaj4ll.cjs +40 -0
  22. package/dist/adapters/mcp-transport-H96VG3WY.js +591 -0
  23. package/dist/adapters/nextjs/index.cjs +1 -1
  24. package/dist/adapters/nextjs/index.js +190 -197
  25. package/dist/adapters/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
  26. package/dist/adapters/openai-vXvLni8v.cjs +1 -0
  27. package/dist/adapters/{utils-D9JPLmfl.js → utils-BPWZsX7k.js} +1271 -1218
  28. package/dist/adapters/utils-_whV4fXL.cjs +128 -0
  29. package/dist/adapters/utils.cjs +1 -1
  30. package/dist/adapters/utils.js +2 -2
  31. package/dist/client/charts/ChartLoader.d.ts +2 -16
  32. package/dist/client/charts/chartComponentRegistry.d.ts +46 -0
  33. package/dist/client/charts/chartConfigHelpers.d.ts +38 -0
  34. package/dist/client/charts.js +14 -13
  35. package/dist/client/chunks/{DashboardEditModal-CjCIAT-J.js → DashboardEditModal-okVfH8ZK.js} +5296 -4544
  36. package/dist/client/chunks/DashboardEditModal-okVfH8ZK.js.map +1 -0
  37. package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js → RetentionCombinedChart-BgbDhsPz.js} +10 -10
  38. package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js.map → RetentionCombinedChart-BgbDhsPz.js.map} +1 -1
  39. package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js → RetentionHeatmap-DjXZaTPq.js} +5 -5
  40. package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js.map → RetentionHeatmap-DjXZaTPq.js.map} +1 -1
  41. package/dist/client/chunks/analysis-builder-DB88FojM.js +5674 -0
  42. package/dist/client/chunks/analysis-builder-DB88FojM.js.map +1 -0
  43. package/dist/client/chunks/{analysis-builder-shared-CYVwSPqt.js → analysis-builder-shared-BVK4TYfR.js} +1578 -1292
  44. package/dist/client/chunks/analysis-builder-shared-BVK4TYfR.js.map +1 -0
  45. package/dist/client/chunks/{chart-activity-grid-DmruKPab.js → chart-activity-grid-DX0SJbxs.js} +635 -492
  46. package/dist/client/chunks/chart-activity-grid-DX0SJbxs.js.map +1 -0
  47. package/dist/client/chunks/chart-area-of01_62R.js +775 -0
  48. package/dist/client/chunks/chart-area-of01_62R.js.map +1 -0
  49. package/dist/client/chunks/chart-bar-BqelQE_I.js +194 -0
  50. package/dist/client/chunks/chart-bar-BqelQE_I.js.map +1 -0
  51. package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js → chart-box-plot-kkBixZ27.js} +2 -2
  52. package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js.map → chart-box-plot-kkBixZ27.js.map} +1 -1
  53. package/dist/client/chunks/chart-bubble-B2he1--4.js +221 -0
  54. package/dist/client/chunks/chart-bubble-B2he1--4.js.map +1 -0
  55. package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js → chart-candlestick-DZp19Tzh.js} +2 -2
  56. package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js.map → chart-candlestick-DZp19Tzh.js.map} +1 -1
  57. package/dist/client/chunks/chart-config-area-BNigHUy8.js +124 -0
  58. package/dist/client/chunks/chart-config-area-BNigHUy8.js.map +1 -0
  59. package/dist/client/chunks/chart-config-bar-DSO_LRTx.js +54 -0
  60. package/dist/client/chunks/chart-config-bar-DSO_LRTx.js.map +1 -0
  61. package/dist/client/chunks/{chart-config-box-plot-DJ-dWWXA.js → chart-config-box-plot-oW8axV2q.js} +5 -10
  62. package/dist/client/chunks/chart-config-box-plot-oW8axV2q.js.map +1 -0
  63. package/dist/client/chunks/{chart-config-gauge-DSwC04l0.js → chart-config-gauge-Dq-_H9UN.js} +5 -7
  64. package/dist/client/chunks/chart-config-gauge-Dq-_H9UN.js.map +1 -0
  65. package/dist/client/chunks/{chart-config-kpi-delta-D6BIkHL3.js → chart-config-kpi-delta-DSQbvqu_.js} +5 -10
  66. package/dist/client/chunks/chart-config-kpi-delta-DSQbvqu_.js.map +1 -0
  67. package/dist/client/chunks/{chart-config-kpi-number-Bx-V9a62.js → chart-config-kpi-number-EFSWY1We.js} +5 -7
  68. package/dist/client/chunks/chart-config-kpi-number-EFSWY1We.js.map +1 -0
  69. package/dist/client/chunks/{chart-config-kpi-text-CcqC1u-8.js → chart-config-kpi-text-KM3V5X2u.js} +5 -7
  70. package/dist/client/chunks/chart-config-kpi-text-KM3V5X2u.js.map +1 -0
  71. package/dist/client/chunks/{chart-config-line-Db3jDsWc.js → chart-config-line-D6jG8PCH.js} +9 -36
  72. package/dist/client/chunks/chart-config-line-D6jG8PCH.js.map +1 -0
  73. package/dist/client/chunks/{chart-config-pie-DD4SmRTF.js → chart-config-pie-BhzW-fdn.js} +6 -16
  74. package/dist/client/chunks/chart-config-pie-BhzW-fdn.js.map +1 -0
  75. package/dist/client/chunks/{chart-config-radar-CC2XAaGr.js → chart-config-radar-D7REP1q_.js} +6 -16
  76. package/dist/client/chunks/chart-config-radar-D7REP1q_.js.map +1 -0
  77. package/dist/client/chunks/{chart-config-radial-bar-DmxKx1R0.js → chart-config-radial-bar-Byx6qOPU.js} +6 -16
  78. package/dist/client/chunks/chart-config-radial-bar-Byx6qOPU.js.map +1 -0
  79. package/dist/client/chunks/{chart-config-tree-map-BI-oQStO.js → chart-config-tree-map-DVrvf3yQ.js} +6 -16
  80. package/dist/client/chunks/chart-config-tree-map-DVrvf3yQ.js.map +1 -0
  81. package/dist/client/chunks/{chart-config-waterfall-DSnyixbI.js → chart-config-waterfall-DmFeQdIk.js} +5 -10
  82. package/dist/client/chunks/chart-config-waterfall-DmFeQdIk.js.map +1 -0
  83. package/dist/client/chunks/{chart-data-table-BO4sXsim.js → chart-data-table-CKauQXme.js} +1046 -1121
  84. package/dist/client/chunks/chart-data-table-CKauQXme.js.map +1 -0
  85. package/dist/client/chunks/{chart-funnel-DnWRsmnS.js → chart-funnel-CToKSBaL.js} +184 -222
  86. package/dist/client/chunks/chart-funnel-CToKSBaL.js.map +1 -0
  87. package/dist/client/chunks/chart-gauge-DTVezSk7.js +403 -0
  88. package/dist/client/chunks/chart-gauge-DTVezSk7.js.map +1 -0
  89. package/dist/client/chunks/chart-heat-map-DTuUl0BR.js +236 -0
  90. package/dist/client/chunks/chart-heat-map-DTuUl0BR.js.map +1 -0
  91. package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js +408 -0
  92. package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js.map +1 -0
  93. package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js +244 -0
  94. package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js.map +1 -0
  95. package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js +185 -0
  96. package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js.map +1 -0
  97. package/dist/client/chunks/chart-line-DKgrQA6c.js +101 -0
  98. package/dist/client/chunks/chart-line-DKgrQA6c.js.map +1 -0
  99. package/dist/client/chunks/{chart-markdown-dgUetjyM.js → chart-markdown-CV75S_zL.js} +2 -2
  100. package/dist/client/chunks/{chart-markdown-dgUetjyM.js.map → chart-markdown-CV75S_zL.js.map} +1 -1
  101. package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js → chart-measure-profile-Ket8fJyf.js} +7 -7
  102. package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js.map → chart-measure-profile-Ket8fJyf.js.map} +1 -1
  103. package/dist/client/chunks/chart-pie-ByieAX5H.js +119 -0
  104. package/dist/client/chunks/chart-pie-ByieAX5H.js.map +1 -0
  105. package/dist/client/chunks/chart-radar-CiSwHWp4.js +138 -0
  106. package/dist/client/chunks/chart-radar-CiSwHWp4.js.map +1 -0
  107. package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js +122 -0
  108. package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js.map +1 -0
  109. package/dist/client/chunks/{chart-sankey-M3XpO_ah.js → chart-sankey-DjrvKw6K.js} +36 -39
  110. package/dist/client/chunks/{chart-sankey-M3XpO_ah.js.map → chart-sankey-DjrvKw6K.js.map} +1 -1
  111. package/dist/client/chunks/chart-scatter-Dd9WFqnS.js +258 -0
  112. package/dist/client/chunks/chart-scatter-Dd9WFqnS.js.map +1 -0
  113. package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js → chart-sunburst-leGpuDj7.js} +3 -3
  114. package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js.map → chart-sunburst-leGpuDj7.js.map} +1 -1
  115. package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js +323 -0
  116. package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js.map +1 -0
  117. package/dist/client/chunks/{chart-waterfall-BuhMoagf.js → chart-waterfall-DyvQReN5.js} +7 -7
  118. package/dist/client/chunks/{chart-waterfall-BuhMoagf.js.map → chart-waterfall-DyvQReN5.js.map} +1 -1
  119. package/dist/client/chunks/{charts-core-jRtb0S2M.js → charts-core-DaXSt1Dd.js} +2 -2
  120. package/dist/client/chunks/{charts-core-jRtb0S2M.js.map → charts-core-DaXSt1Dd.js.map} +1 -1
  121. package/dist/client/chunks/charts-loader-DdTeCeNo.js +84 -0
  122. package/dist/client/chunks/charts-loader-DdTeCeNo.js.map +1 -0
  123. package/dist/client/chunks/{nl-NL-CpVs7ox3.js → nl-NL-2zTAWTej.js} +2 -1
  124. package/dist/client/chunks/{nl-NL-CpVs7ox3.js.map → nl-NL-2zTAWTej.js.map} +1 -1
  125. package/dist/client/chunks/retention-ChW9jYdy.js.map +1 -1
  126. package/dist/client/chunks/{schema-visualization-DE09kQE3.js → schema-visualization-Cb_E9_Gd.js} +12 -12
  127. package/dist/client/chunks/{schema-visualization-DE09kQE3.js.map → schema-visualization-Cb_E9_Gd.js.map} +1 -1
  128. package/dist/client/chunks/{useDirtyStateTracking-CoeQbprt.js → useDirtyStateTracking-MbpxH_v6.js} +95 -84
  129. package/dist/client/chunks/useDirtyStateTracking-MbpxH_v6.js.map +1 -0
  130. package/dist/client/chunks/{useExplainAI-DlnXWdmz.js → useExplainAI-evnZkjCY.js} +14 -14
  131. package/dist/client/chunks/{useExplainAI-DlnXWdmz.js.map → useExplainAI-evnZkjCY.js.map} +1 -1
  132. package/dist/client/chunks/{utils-CTKNaXS8.js → utils-3P6z1vz5.js} +2 -2
  133. package/dist/client/chunks/{utils-CTKNaXS8.js.map → utils-3P6z1vz5.js.map} +1 -1
  134. package/dist/client/chunks/{vendor-CPIYyeuD.js → vendor-DSpR0IW6.js} +43 -43
  135. package/dist/client/chunks/{vendor-CPIYyeuD.js.map → vendor-DSpR0IW6.js.map} +1 -1
  136. package/dist/client/components/AgenticNotebook/agentChatParts.d.ts +34 -0
  137. package/dist/client/components/AgenticNotebook/chatMessageParts.d.ts +39 -0
  138. package/dist/client/components/AgenticNotebook/useAgentChatController.d.ts +25 -0
  139. package/dist/client/components/AgenticNotebook/useNotebookAutosave.d.ts +12 -0
  140. package/dist/client/components/AnalysisBuilder/AnalysisQueryPanelParts.d.ts +64 -0
  141. package/dist/client/components/AnalysisBuilder/AnalysisResultsHeader.d.ts +67 -0
  142. package/dist/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +13 -0
  143. package/dist/client/components/AnalysisBuilder/BreakdownRow.d.ts +26 -0
  144. package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +10 -0
  145. package/dist/client/components/AnalysisBuilder/ExecutionPlanPanelParts.d.ts +22 -0
  146. package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +16 -0
  147. package/dist/client/components/AnalysisBuilder/FilterValueInput.d.ts +63 -0
  148. package/dist/client/components/AnalysisBuilder/FlowDepthControls.d.ts +10 -0
  149. package/dist/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +7 -0
  150. package/dist/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +8 -0
  151. package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +23 -0
  152. package/dist/client/components/AnalysisBuilder/SortToggleButton.d.ts +13 -0
  153. package/dist/client/components/AnalysisBuilder/StringArrayInput.d.ts +17 -0
  154. package/dist/client/components/AnalysisBuilder/filterConfigModalUtils.d.ts +30 -0
  155. package/dist/client/components/AnalysisBuilder/hooks/useAnalysisBuilderImperativeHandle.d.ts +13 -0
  156. package/dist/client/components/AnalysisBuilder/hooks/useDragReorder.d.ts +25 -0
  157. package/dist/client/components/AnalysisBuilder/hooks/useFieldSearchKeyboard.d.ts +11 -0
  158. package/dist/client/components/AnalysisBuilder/utils/axisConfigUtils.d.ts +23 -0
  159. package/dist/client/components/AnalysisBuilder/utils/executionPlanMarkdown.d.ts +8 -0
  160. package/dist/client/components/AnalysisBuilder/utils/fieldUtils.d.ts +5 -0
  161. package/dist/client/components/AnalysisBuilder/utils/resultsPanelDerive.d.ts +68 -0
  162. package/dist/client/components/AnalysisBuilder/utils/shareStateUtils.d.ts +68 -0
  163. package/dist/client/components/AnalysisBuilder/utils/sortUtils.d.ts +7 -0
  164. package/dist/client/components/DashboardFilters/CompactFilterBarParts.d.ts +26 -0
  165. package/dist/client/components/DashboardFilters/DashboardFilterConfigModalParts.d.ts +27 -0
  166. package/dist/client/components/DashboardFilters/DashboardFilterValueInput.d.ts +39 -0
  167. package/dist/client/components/DashboardFilters/dashboardFilterConfigModalUtils.d.ts +21 -0
  168. package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +19 -0
  169. package/dist/client/components/DashboardFilters/useDashboardFilterConfigModal.d.ts +69 -0
  170. package/dist/client/components/DashboardFilters/useDateRangeState.d.ts +19 -0
  171. package/dist/client/components/DashboardFilters/useFilterDropdowns.d.ts +21 -0
  172. package/dist/client/components/DashboardFilters/useFilterValueFetch.d.ts +23 -0
  173. package/dist/client/components/DashboardPortletCard.d.ts +2 -57
  174. package/dist/client/components/analyticsPortlet/PortletChart.d.ts +31 -0
  175. package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +35 -0
  176. package/dist/client/components/analyticsPortlet/PortletStates.d.ts +65 -0
  177. package/dist/client/components/analyticsPortlet/parsePortletQuery.d.ts +22 -0
  178. package/dist/client/components/analyticsPortlet/portletRenderState.d.ts +31 -0
  179. package/dist/client/components/analyticsPortlet/usePortletDebugData.d.ts +37 -0
  180. package/dist/client/components/analyticsPortlet/usePortletDrillState.d.ts +17 -0
  181. package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +37 -0
  182. package/dist/client/components/charts/ActivityGridChart.helpers.d.ts +33 -0
  183. package/dist/client/components/charts/ActivityGridChart.render.d.ts +31 -0
  184. package/dist/client/components/charts/AxisFormatControls.d.ts +3 -1
  185. package/dist/client/components/charts/BarChart.helpers.d.ts +23 -0
  186. package/dist/client/components/charts/BarSeries.d.ts +29 -0
  187. package/dist/client/components/charts/BubbleChart.helpers.d.ts +43 -0
  188. package/dist/client/components/charts/BubbleChart.render.d.ts +21 -0
  189. package/dist/client/components/charts/ChartStates.d.ts +38 -0
  190. package/dist/client/components/charts/FunnelChart.helpers.d.ts +25 -0
  191. package/dist/client/components/charts/FunnelViews.d.ts +16 -0
  192. package/dist/client/components/charts/HeatMapCanvas.d.ts +25 -0
  193. package/dist/client/components/charts/HeatMapChart.helpers.d.ts +64 -0
  194. package/dist/client/components/charts/KpiDelta.helpers.d.ts +20 -0
  195. package/dist/client/components/charts/KpiNumber.helpers.d.ts +30 -0
  196. package/dist/client/components/charts/KpiStates.d.ts +19 -0
  197. package/dist/client/components/charts/ScatterChart.helpers.d.ts +43 -0
  198. package/dist/client/components/charts/ScatterSeries.d.ts +17 -0
  199. package/dist/client/components/charts/ScatterTooltip.d.ts +21 -0
  200. package/dist/client/components/charts/TreeMapChart.helpers.d.ts +37 -0
  201. package/dist/client/components/charts/TreeMapContent.d.ts +24 -0
  202. package/dist/client/components/charts/TreeMapLegend.d.ts +13 -0
  203. package/dist/client/components/charts/cartesianChartHelpers.d.ts +126 -0
  204. package/dist/client/components/charts/chartAxisResolution.d.ts +32 -0
  205. package/dist/client/components/charts/chartScaffolding.d.ts +77 -0
  206. package/dist/client/components/charts/gaugeChartHelpers.d.ts +36 -0
  207. package/dist/client/components/charts/kpiTextHelpers.d.ts +46 -0
  208. package/dist/client/components/charts/radarChartHelpers.d.ts +14 -0
  209. package/dist/client/components/charts/radialBarChartHelpers.d.ts +22 -0
  210. package/dist/client/components/charts/useChartDimensions.d.ts +20 -0
  211. package/dist/client/components/charts/useKpiDimensions.d.ts +30 -0
  212. package/dist/client/components/dashboard/DashboardEditBar.d.ts +5 -0
  213. package/dist/client/components/dashboard/LayoutModeToggle.d.ts +10 -0
  214. package/dist/client/components/dashboardPortletCard/FilterFieldChip.d.ts +12 -0
  215. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +43 -0
  216. package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +33 -0
  217. package/dist/client/components/dashboardPortletCard/filterField.d.ts +12 -0
  218. package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +55 -0
  219. package/dist/client/components/dashboardPortletCard/usePortletCardActions.d.ts +16 -0
  220. package/dist/client/components/portletAnalysisModal/saveValidation.d.ts +8 -0
  221. package/dist/client/components/shared/dateRangeUtils.d.ts +40 -0
  222. package/dist/client/components/shared/filterDisplayUtils.d.ts +10 -0
  223. package/dist/client/components/shared/filterItem/FilterDateRangeSelector.d.ts +17 -0
  224. package/dist/client/components/shared/filterItem/FilterFieldDropdown.d.ts +16 -0
  225. package/dist/client/components/shared/filterItem/dateRangeSync.d.ts +14 -0
  226. package/dist/client/components/shared/filterItem/fieldVisuals.d.ts +5 -0
  227. package/dist/client/components/shared/filterValueSelector/FilterValueInputs.d.ts +55 -0
  228. package/dist/client/components/shared/filterValueSelector/useFilterValueSelectorState.d.ts +25 -0
  229. package/dist/client/components/shared/queryFieldUtils.d.ts +21 -0
  230. package/dist/client/components/shared/utils.d.ts +4 -43
  231. package/dist/client/components.js +3 -3
  232. package/dist/client/hooks/agentChatStream.d.ts +39 -0
  233. package/dist/client/hooks/analysisQueryExecutionModes.d.ts +133 -0
  234. package/dist/client/hooks/drillNavigation.d.ts +25 -0
  235. package/dist/client/hooks.js +3 -3
  236. package/dist/client/icons.js +2 -2
  237. package/dist/client/index.js +816 -669
  238. package/dist/client/index.js.map +1 -1
  239. package/dist/client/providers.js +3 -3
  240. package/dist/client/schema.js +1 -1
  241. package/dist/client/shared/chartConfigBuilders.d.ts +18 -0
  242. package/dist/client/shared/components/QueryAnalysisPanel.sections.d.ts +41 -0
  243. package/dist/client/shared/queryTransforms.d.ts +20 -0
  244. package/dist/client/shared/utils.d.ts +2 -4
  245. package/dist/client/stores/optionsToAnalysisConfig.d.ts +17 -0
  246. package/dist/client/styles.css +1 -1
  247. package/dist/client/utils/axisValueFormatting.d.ts +32 -0
  248. package/dist/client/utils/timeValueFormatting.d.ts +32 -0
  249. package/dist/client/utils.js +6 -6
  250. package/dist/client-bundle-stats.html +1 -1
  251. package/dist/mcp-app/mcp-app.html +55 -55
  252. package/dist/server/google-BOnRIN1w.cjs +2 -0
  253. package/dist/server/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
  254. package/dist/server/index.cjs +179 -211
  255. package/dist/server/index.js +6330 -6458
  256. package/dist/server/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
  257. package/dist/server/openai-vXvLni8v.cjs +1 -0
  258. package/dist/server/server/adapters/base-adapter.d.ts +80 -35
  259. package/dist/server/server/adapters/databend-adapter.d.ts +8 -59
  260. package/dist/server/server/adapters/duckdb-adapter.d.ts +5 -59
  261. package/dist/server/server/adapters/mysql-adapter.d.ts +13 -70
  262. package/dist/server/server/adapters/postgres-adapter.d.ts +1 -65
  263. package/dist/server/server/adapters/snowflake-adapter.d.ts +5 -68
  264. package/dist/server/server/adapters/sqlite-adapter.d.ts +12 -32
  265. package/dist/server/server/adapters/window-function-builder.d.ts +11 -0
  266. package/dist/server/server/agent/chart-validation.d.ts +0 -5
  267. package/dist/server/server/agent/handler-steps.d.ts +37 -0
  268. package/dist/server/server/ai/discovery-helpers.d.ts +29 -0
  269. package/dist/server/server/ai/discovery.d.ts +4 -0
  270. package/dist/server/server/ai/suggestion-helpers.d.ts +33 -0
  271. package/dist/server/server/ai/suggestion.d.ts +0 -3
  272. package/dist/server/server/ai/validation-helpers.d.ts +21 -0
  273. package/dist/server/server/ai/validation.d.ts +0 -3
  274. package/dist/server/server/builders/analysis-utils.d.ts +106 -0
  275. package/dist/server/server/builders/cte-builder.d.ts +46 -0
  276. package/dist/server/server/builders/date-time-builder.d.ts +5 -0
  277. package/dist/server/server/builders/date-time-helpers.d.ts +34 -0
  278. package/dist/server/server/builders/filter-builder.d.ts +2 -0
  279. package/dist/server/server/builders/filter-operators.d.ts +23 -0
  280. package/dist/server/server/builders/flow-query-builder.d.ts +46 -19
  281. package/dist/server/server/builders/funnel-query-builder.d.ts +16 -5
  282. package/dist/server/server/builders/group-by-builder.d.ts +11 -0
  283. package/dist/server/server/builders/measure-builder.d.ts +43 -0
  284. package/dist/server/server/builders/retention-query-builder.d.ts +12 -14
  285. package/dist/server/server/cache-utils.d.ts +25 -5
  286. package/dist/server/server/compiler-metadata.d.ts +11 -0
  287. package/dist/server/server/compiler.d.ts +8 -14
  288. package/dist/server/server/cube-utils.d.ts +29 -4
  289. package/dist/server/server/execution/annotation-builder.d.ts +12 -0
  290. package/dist/server/server/execution/filter-cache-preloader.d.ts +19 -0
  291. package/dist/server/server/execution/mode-router.d.ts +25 -0
  292. package/dist/server/server/execution/query-result-cache.d.ts +21 -0
  293. package/dist/server/server/execution/result-post-processor.d.ts +10 -0
  294. package/dist/server/server/executor.d.ts +33 -30
  295. package/dist/server/server/executors/explain-utils.d.ts +28 -0
  296. package/dist/server/server/explain/explain-tree.d.ts +20 -0
  297. package/dist/server/server/filter-cache.d.ts +2 -2
  298. package/dist/server/server/gap-filler.d.ts +6 -0
  299. package/dist/server/server/index.d.ts +3 -1
  300. package/dist/server/server/logical-plan/cte-planner-helpers.d.ts +37 -0
  301. package/dist/server/server/logical-plan/cte-planner.d.ts +104 -0
  302. package/dist/server/server/logical-plan/filter-propagation.d.ts +44 -0
  303. package/dist/server/server/logical-plan/index.d.ts +6 -1
  304. package/dist/server/server/logical-plan/join-planner.d.ts +27 -0
  305. package/dist/server/server/logical-plan/logical-planner.d.ts +7 -200
  306. package/dist/server/server/logical-plan/optimiser.d.ts +3 -1
  307. package/dist/server/server/logical-plan/plan-analysis-reporter.d.ts +59 -0
  308. package/dist/server/server/logical-plan/planner-utils.d.ts +20 -0
  309. package/dist/server/server/logical-plan/types.d.ts +17 -9
  310. package/dist/server/server/measure-classification.d.ts +40 -0
  311. package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +21 -21
  312. package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +11 -0
  313. package/dist/server/server/physical-plan/processors/index.d.ts +2 -0
  314. package/dist/server/server/physical-plan/processors/keys-dedup-processor.d.ts +13 -0
  315. package/dist/server/server/physical-plan/processors/multi-fact-processor.d.ts +13 -0
  316. package/dist/server/server/physical-plan/processors/shared.d.ts +5 -0
  317. package/dist/server/server/query-handlers.d.ts +79 -0
  318. package/dist/server/server/query-modes.d.ts +28 -0
  319. package/dist/server/server/query-validator.d.ts +9 -0
  320. package/dist/server/server/resolvers/calculated-measure-resolver.d.ts +5 -0
  321. package/dist/server/server/resolvers/join-path-resolver.d.ts +6 -0
  322. package/dist/server/server/sql-format.d.ts +11 -0
  323. package/dist/server/server/types/cube.d.ts +18 -4
  324. package/dist/server/server/types/flow.d.ts +6 -5
  325. package/dist/server/server/types/index.d.ts +1 -1
  326. package/dist/server/server/types/validation.d.ts +14 -0
  327. package/package.json +11 -4
  328. package/dist/adapters/google-DUlXeeDA.cjs +0 -2
  329. package/dist/adapters/handler-CzbCuS6_.cjs +0 -25
  330. package/dist/adapters/locale-BPB7flIG.js +0 -8249
  331. package/dist/adapters/locale-tIMrNcCr.cjs +0 -198
  332. package/dist/adapters/mcp-transport-C2QzXm6h.cjs +0 -40
  333. package/dist/adapters/mcp-transport-D0B3S1tB.js +0 -579
  334. package/dist/adapters/openai-D_U4V0kT.cjs +0 -1
  335. package/dist/adapters/utils-KV37IBIv.cjs +0 -128
  336. package/dist/client/chunks/DashboardEditModal-CjCIAT-J.js.map +0 -1
  337. package/dist/client/chunks/analysis-builder-MuMIzoRq.js +0 -5367
  338. package/dist/client/chunks/analysis-builder-MuMIzoRq.js.map +0 -1
  339. package/dist/client/chunks/analysis-builder-shared-CYVwSPqt.js.map +0 -1
  340. package/dist/client/chunks/chart-activity-grid-DmruKPab.js.map +0 -1
  341. package/dist/client/chunks/chart-area-DHCPM4Em.js +0 -450
  342. package/dist/client/chunks/chart-area-DHCPM4Em.js.map +0 -1
  343. package/dist/client/chunks/chart-bar-KddciGDv.js +0 -271
  344. package/dist/client/chunks/chart-bar-KddciGDv.js.map +0 -1
  345. package/dist/client/chunks/chart-bubble-CfqiB538.js +0 -273
  346. package/dist/client/chunks/chart-bubble-CfqiB538.js.map +0 -1
  347. package/dist/client/chunks/chart-config-area-Bq_UsW3x.js +0 -101
  348. package/dist/client/chunks/chart-config-area-Bq_UsW3x.js.map +0 -1
  349. package/dist/client/chunks/chart-config-bar-_JEGZnAu.js +0 -95
  350. package/dist/client/chunks/chart-config-bar-_JEGZnAu.js.map +0 -1
  351. package/dist/client/chunks/chart-config-box-plot-DJ-dWWXA.js.map +0 -1
  352. package/dist/client/chunks/chart-config-gauge-DSwC04l0.js.map +0 -1
  353. package/dist/client/chunks/chart-config-kpi-delta-D6BIkHL3.js.map +0 -1
  354. package/dist/client/chunks/chart-config-kpi-number-Bx-V9a62.js.map +0 -1
  355. package/dist/client/chunks/chart-config-kpi-text-CcqC1u-8.js.map +0 -1
  356. package/dist/client/chunks/chart-config-line-Db3jDsWc.js.map +0 -1
  357. package/dist/client/chunks/chart-config-pie-DD4SmRTF.js.map +0 -1
  358. package/dist/client/chunks/chart-config-radar-CC2XAaGr.js.map +0 -1
  359. package/dist/client/chunks/chart-config-radial-bar-DmxKx1R0.js.map +0 -1
  360. package/dist/client/chunks/chart-config-tree-map-BI-oQStO.js.map +0 -1
  361. package/dist/client/chunks/chart-config-waterfall-DSnyixbI.js.map +0 -1
  362. package/dist/client/chunks/chart-data-table-BO4sXsim.js.map +0 -1
  363. package/dist/client/chunks/chart-funnel-DnWRsmnS.js.map +0 -1
  364. package/dist/client/chunks/chart-gauge-CgMeqeGb.js +0 -424
  365. package/dist/client/chunks/chart-gauge-CgMeqeGb.js.map +0 -1
  366. package/dist/client/chunks/chart-heat-map-DcGm9SWK.js +0 -231
  367. package/dist/client/chunks/chart-heat-map-DcGm9SWK.js.map +0 -1
  368. package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js +0 -343
  369. package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js.map +0 -1
  370. package/dist/client/chunks/chart-kpi-number-gWYF44ol.js +0 -322
  371. package/dist/client/chunks/chart-kpi-number-gWYF44ol.js.map +0 -1
  372. package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js +0 -149
  373. package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js.map +0 -1
  374. package/dist/client/chunks/chart-line-9BEGN5Ti.js +0 -433
  375. package/dist/client/chunks/chart-line-9BEGN5Ti.js.map +0 -1
  376. package/dist/client/chunks/chart-pie-BjAIhyOi.js +0 -172
  377. package/dist/client/chunks/chart-pie-BjAIhyOi.js.map +0 -1
  378. package/dist/client/chunks/chart-radar-Dgkcl2bN.js +0 -154
  379. package/dist/client/chunks/chart-radar-Dgkcl2bN.js.map +0 -1
  380. package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js +0 -148
  381. package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js.map +0 -1
  382. package/dist/client/chunks/chart-scatter-DaHYP_OL.js +0 -255
  383. package/dist/client/chunks/chart-scatter-DaHYP_OL.js.map +0 -1
  384. package/dist/client/chunks/chart-tree-map-uiwUU4nb.js +0 -298
  385. package/dist/client/chunks/chart-tree-map-uiwUU4nb.js.map +0 -1
  386. package/dist/client/chunks/useDirtyStateTracking-CoeQbprt.js.map +0 -1
  387. package/dist/server/google-DUlXeeDA.cjs +0 -2
  388. package/dist/server/openai-D_U4V0kT.cjs +0 -1
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { _ as t, i as n, k as r, n as i, y as a } from "./chart-activity-grid-DmruKPab.js";
3
- import { c as o, l as s, s as c } from "./chart-area-DHCPM4Em.js";
2
+ import { P as t, S as n, l as r, s as i, w as a } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { C as o, T as s, w as c } from "./chart-area-of01_62R.js";
4
4
  import l, { useMemo as u } from "react";
5
5
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
6
  import { CartesianGrid as p, Legend as m, Line as h, LineChart as g, ReferenceLine as _, XAxis as v, YAxis as y } from "recharts";
@@ -49,7 +49,7 @@ function x(e, t, n, r) {
49
49
  }
50
50
  }
51
51
  var S = l.memo(function({ data: e, chartConfig: l, displayConfig: b = {}, height: S = "100%", colorPalette: C, drillEnabled: w }) {
52
- let { t: T } = r(), E = t(), D = b?.showReferenceLineAtZero ?? !0, O = b?.showDataLabels ?? !1, k = b?.lineType ?? "monotone", A = b?.leftYAxisFormat, { yAxisFields: j, seriesField: M, configError: N } = u(() => {
52
+ let { t: T } = t(), E = n(), D = b?.showReferenceLineAtZero ?? !0, O = b?.showDataLabels ?? !1, k = b?.lineType ?? "monotone", A = b?.leftYAxisFormat, { yAxisFields: j, seriesField: M, configError: N } = u(() => {
53
53
  let e = Array.isArray(l?.yAxis) ? l.yAxis : [];
54
54
  return {
55
55
  yAxisFields: e,
@@ -101,7 +101,7 @@ var S = l.memo(function({ data: e, chartConfig: l, displayConfig: b = {}, height
101
101
  children: /* @__PURE__ */ f(g, {
102
102
  data: P,
103
103
  margin: {
104
- ...n,
104
+ ...r,
105
105
  left: 40
106
106
  },
107
107
  accessibilityLayer: !1,
@@ -113,14 +113,14 @@ var S = l.memo(function({ data: e, chartConfig: l, displayConfig: b = {}, height
113
113
  /* @__PURE__ */ d(v, {
114
114
  dataKey: "measureLabel",
115
115
  type: "category",
116
- tick: /* @__PURE__ */ d(c, {}),
116
+ tick: /* @__PURE__ */ d(o, {}),
117
117
  height: 60
118
118
  }),
119
119
  /* @__PURE__ */ d(y, {
120
120
  tick: { fontSize: 12 },
121
121
  tickFormatter: A ? (e) => a(e, A) : void 0
122
122
  }),
123
- /* @__PURE__ */ d(o, { formatter: (e, t) => e == null ? ["No data", t] : [A ? a(e, A) : e?.toLocaleString?.() ?? e, t === "_value" ? E(j[0]?.split(".")[0]) || "Value" : t] }),
123
+ /* @__PURE__ */ d(c, { formatter: (e, t) => e == null ? ["No data", t] : [A ? a(e, A) : e?.toLocaleString?.() ?? e, t === "_value" ? E(j[0]?.split(".")[0]) || "Value" : t] }),
124
124
  D && /* @__PURE__ */ d(_, {
125
125
  y: 0,
126
126
  stroke: "var(--dc-border, #94a3b8)",
@@ -176,4 +176,4 @@ var S = l.memo(function({ data: e, chartConfig: l, displayConfig: b = {}, height
176
176
  //#endregion
177
177
  export { b as t };
178
178
 
179
- //# sourceMappingURL=chart-measure-profile-ClfpLs4q.js.map
179
+ //# sourceMappingURL=chart-measure-profile-Ket8fJyf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-measure-profile-ClfpLs4q.js","names":[],"sources":["../../../src/client/components/charts/MeasureProfileChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, ReferenceLine, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\n/**\n * Pivots N measures from chartConfig.yAxis[] into sequential X-axis points.\n * Each measure becomes one X-axis category; its numeric value is Y.\n * When a series dimension is provided, values are averaged across all rows\n * that share the same series value.\n *\n * Input (normal cube rows):\n * [{ 'Markouts.avgMinus2m': 10, 'Markouts.avgAtEvent': 0, 'Trades.symbol': 'AAPL' },\n * { 'Markouts.avgMinus2m': 12, 'Markouts.avgAtEvent': 1, 'Trades.symbol': 'AAPL' }]\n *\n * Output (one row per measure, values averaged per series):\n * [{ measureKey: 'Markouts.avgMinus2m', measureLabel: <getFieldLabel result>, AAPL: 11 },\n * { measureKey: 'Markouts.avgAtEvent', measureLabel: <getFieldLabel result>, AAPL: 0.5 }]\n */\nfunction pivotMeasuresToProfile(\n data: Record<string, unknown>[],\n yAxisFields: string[],\n seriesField: string | undefined,\n getFieldLabel: (field: string) => string\n): { profileData: Record<string, unknown>[]; seriesKeys: string[] } {\n if (!data || data.length === 0 || yAxisFields.length === 0) {\n return { profileData: [], seriesKeys: [] }\n }\n\n if (seriesField) {\n const seriesValues = Array.from(new Set(data.map((row) => String(row[seriesField] ?? 'Unknown'))))\n const profileData = yAxisFields.map((field) => {\n const base: Record<string, unknown> = {\n measureKey: field,\n measureLabel: getFieldLabel(field),\n }\n for (const seriesVal of seriesValues) {\n const matchingRows = data.filter((row) => String(row[seriesField] ?? 'Unknown') === seriesVal)\n const values = matchingRows\n .map((r) => {\n const v = r[field]\n return typeof v === 'number' ? v : parseFloat(String(v ?? ''))\n })\n .filter((v) => !isNaN(v))\n base[seriesVal] = values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null\n }\n return base\n })\n return { profileData, seriesKeys: seriesValues }\n } else {\n const VALUE_KEY = '_value'\n const profileData = yAxisFields.map((field) => {\n const values = data\n .map((r) => {\n const v = r[field]\n return typeof v === 'number' ? v : parseFloat(String(v ?? ''))\n })\n .filter((v) => !isNaN(v))\n return {\n measureKey: field,\n measureLabel: getFieldLabel(field),\n [VALUE_KEY]: values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null,\n }\n })\n return { profileData, seriesKeys: [VALUE_KEY] }\n }\n}\n\nconst MeasureProfileChart = React.memo(function MeasureProfileChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n colorPalette,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n\n const showReferenceLineAtZero = displayConfig?.showReferenceLineAtZero ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const lineType = displayConfig?.lineType ?? 'monotone'\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { yAxisFields, seriesField, configError } = useMemo(() => {\n const yAxisFields: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n const seriesField = Array.isArray(chartConfig?.series)\n ? chartConfig.series[0]\n : chartConfig?.series ?? undefined\n const configError =\n yAxisFields.length < 2 ? 'Measure Profile chart requires at least 2 measures in Y-Axis' : null\n return { yAxisFields, seriesField, configError }\n }, [chartConfig])\n\n const { profileData, seriesKeys } = useMemo(() => {\n if (configError || !data || data.length === 0) return { profileData: [], seriesKeys: [] }\n return pivotMeasuresToProfile(\n data as Record<string, unknown>[],\n yAxisFields,\n seriesField,\n getFieldLabel\n )\n }, [data, yAxisFields, seriesField, getFieldLabel, configError])\n\n const showLegend = (displayConfig?.showLegend ?? true) && seriesKeys.length > 1\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.measureProfile')}</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <LineChart data={profileData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"measureLabel\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any) => {\n if (value === null || value === undefined) return ['No data', name]\n const formatted = yAxisFormat ? formatAxisValue(value, yAxisFormat) : value?.toLocaleString?.() ?? value\n const displayName = name === '_value' ? (getFieldLabel(yAxisFields[0]?.split('.')[0]) || 'Value') : name\n return [formatted, displayName]\n }}\n />\n {showReferenceLineAtZero && (\n <ReferenceLine y={0} stroke=\"var(--dc-border, #94a3b8)\" strokeDasharray=\"4 2\" />\n )}\n {showLegend && (\n <Legend wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }} />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Line\n key={seriesKey}\n type={lineType}\n dataKey={seriesKey}\n name={seriesKey === '_value' ? (getFieldLabel(yAxisFields[0]?.split('.')[0]) || 'Value') : seriesKey}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={showDataLabels ? { r: 4 } : { r: 3 }}\n activeDot={{ r: 5 }}\n label={showDataLabels ? { position: 'top', fontSize: 10 } : undefined}\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n />\n ))}\n </LineChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.chartError', { chartType: 'Measure Profile 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 MeasureProfileChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-measure-profile-Ket8fJyf.js","names":[],"sources":["../../../src/client/components/charts/MeasureProfileChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, ReferenceLine, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\n/**\n * Pivots N measures from chartConfig.yAxis[] into sequential X-axis points.\n * Each measure becomes one X-axis category; its numeric value is Y.\n * When a series dimension is provided, values are averaged across all rows\n * that share the same series value.\n *\n * Input (normal cube rows):\n * [{ 'Markouts.avgMinus2m': 10, 'Markouts.avgAtEvent': 0, 'Trades.symbol': 'AAPL' },\n * { 'Markouts.avgMinus2m': 12, 'Markouts.avgAtEvent': 1, 'Trades.symbol': 'AAPL' }]\n *\n * Output (one row per measure, values averaged per series):\n * [{ measureKey: 'Markouts.avgMinus2m', measureLabel: <getFieldLabel result>, AAPL: 11 },\n * { measureKey: 'Markouts.avgAtEvent', measureLabel: <getFieldLabel result>, AAPL: 0.5 }]\n */\nfunction pivotMeasuresToProfile(\n data: Record<string, unknown>[],\n yAxisFields: string[],\n seriesField: string | undefined,\n getFieldLabel: (field: string) => string\n): { profileData: Record<string, unknown>[]; seriesKeys: string[] } {\n if (!data || data.length === 0 || yAxisFields.length === 0) {\n return { profileData: [], seriesKeys: [] }\n }\n\n if (seriesField) {\n const seriesValues = Array.from(new Set(data.map((row) => String(row[seriesField] ?? 'Unknown'))))\n const profileData = yAxisFields.map((field) => {\n const base: Record<string, unknown> = {\n measureKey: field,\n measureLabel: getFieldLabel(field),\n }\n for (const seriesVal of seriesValues) {\n const matchingRows = data.filter((row) => String(row[seriesField] ?? 'Unknown') === seriesVal)\n const values = matchingRows\n .map((r) => {\n const v = r[field]\n return typeof v === 'number' ? v : parseFloat(String(v ?? ''))\n })\n .filter((v) => !isNaN(v))\n base[seriesVal] = values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null\n }\n return base\n })\n return { profileData, seriesKeys: seriesValues }\n } else {\n const VALUE_KEY = '_value'\n const profileData = yAxisFields.map((field) => {\n const values = data\n .map((r) => {\n const v = r[field]\n return typeof v === 'number' ? v : parseFloat(String(v ?? ''))\n })\n .filter((v) => !isNaN(v))\n return {\n measureKey: field,\n measureLabel: getFieldLabel(field),\n [VALUE_KEY]: values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null,\n }\n })\n return { profileData, seriesKeys: [VALUE_KEY] }\n }\n}\n\nconst MeasureProfileChart = React.memo(function MeasureProfileChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n colorPalette,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n\n const showReferenceLineAtZero = displayConfig?.showReferenceLineAtZero ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const lineType = displayConfig?.lineType ?? 'monotone'\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { yAxisFields, seriesField, configError } = useMemo(() => {\n const yAxisFields: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n const seriesField = Array.isArray(chartConfig?.series)\n ? chartConfig.series[0]\n : chartConfig?.series ?? undefined\n const configError =\n yAxisFields.length < 2 ? 'Measure Profile chart requires at least 2 measures in Y-Axis' : null\n return { yAxisFields, seriesField, configError }\n }, [chartConfig])\n\n const { profileData, seriesKeys } = useMemo(() => {\n if (configError || !data || data.length === 0) return { profileData: [], seriesKeys: [] }\n return pivotMeasuresToProfile(\n data as Record<string, unknown>[],\n yAxisFields,\n seriesField,\n getFieldLabel\n )\n }, [data, yAxisFields, seriesField, getFieldLabel, configError])\n\n const showLegend = (displayConfig?.showLegend ?? true) && seriesKeys.length > 1\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.measureProfile')}</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <LineChart data={profileData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"measureLabel\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any) => {\n if (value === null || value === undefined) return ['No data', name]\n const formatted = yAxisFormat ? formatAxisValue(value, yAxisFormat) : value?.toLocaleString?.() ?? value\n const displayName = name === '_value' ? (getFieldLabel(yAxisFields[0]?.split('.')[0]) || 'Value') : name\n return [formatted, displayName]\n }}\n />\n {showReferenceLineAtZero && (\n <ReferenceLine y={0} stroke=\"var(--dc-border, #94a3b8)\" strokeDasharray=\"4 2\" />\n )}\n {showLegend && (\n <Legend wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }} />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Line\n key={seriesKey}\n type={lineType}\n dataKey={seriesKey}\n name={seriesKey === '_value' ? (getFieldLabel(yAxisFields[0]?.split('.')[0]) || 'Value') : seriesKey}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={showDataLabels ? { r: 4 } : { r: 3 }}\n activeDot={{ r: 5 }}\n label={showDataLabels ? { position: 'top', fontSize: 10 } : undefined}\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n />\n ))}\n </LineChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.chartError', { chartType: 'Measure Profile 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 MeasureProfileChart\n"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
+ import { D as t, E as n, M as r, P as i, S as a, s as o, w as s } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { S as c, T as l, b as u, w as d, x as f, y as p } from "./chart-area-of01_62R.js";
4
+ import m, { useMemo as h, useState as g } from "react";
5
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
6
+ import { Cell as y, Legend as b, Pie as x, PieChart as S } from "recharts";
7
+ //#region src/client/components/charts/PieChart.tsx
8
+ var C = /* @__PURE__ */ e({ default: () => T });
9
+ function w(e, i, a, o, s, c) {
10
+ let l;
11
+ if (o.length > 0) {
12
+ let { data: t } = r(e, i, a, s, o, c);
13
+ if (l = [], t.length > 0) {
14
+ let e = t[0];
15
+ Object.keys(e).forEach((t) => {
16
+ t !== "name" && typeof e[t] == "number" && l.push({
17
+ name: String(t),
18
+ value: e[t]
19
+ });
20
+ });
21
+ }
22
+ } else {
23
+ let r = t(s, i);
24
+ l = e.map((e) => {
25
+ let t = n(e[i], r) || String(e[i]) || "Unknown";
26
+ return typeof e[i] == "boolean" ? t = e[i] ? "Active" : "Inactive" : (t === "true" || t === "false") && (t = t === "true" ? "Active" : "Inactive"), {
27
+ name: t,
28
+ value: typeof e[a[0]] == "string" ? parseFloat(e[a[0]]) : e[a[0]] || 0
29
+ };
30
+ });
31
+ }
32
+ let u = l.length;
33
+ return l = l.filter((e) => e.value != null && !isNaN(e.value) && e.value !== 0 && e.value > 0), {
34
+ pieData: l,
35
+ originalLength: u
36
+ };
37
+ }
38
+ var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: r, height: m = "100%", colorPalette: C, onDataPointClick: T, drillEnabled: E }) {
39
+ let { t: D } = i(), [O, k] = g(null), A = a(), { xAxisField: j, yAxisFields: M, seriesFields: N, errorCode: P } = h(() => p(t), [t]);
40
+ try {
41
+ let t = {
42
+ showLegend: n?.showLegend ?? !0,
43
+ showTooltip: n?.showTooltip ?? !0,
44
+ leftYAxisFormat: n?.leftYAxisFormat,
45
+ innerRadius: n?.innerRadius || "0%"
46
+ };
47
+ if (!e || e.length === 0) return /* @__PURE__ */ _(f, {
48
+ height: m,
49
+ hint: D("chart.runtime.noDataHint.pie")
50
+ });
51
+ if (P) return /* @__PURE__ */ _(u, {
52
+ height: m,
53
+ hint: D(P === "axisInvalid" ? "chart.runtime.configErrorHint.pieAxis" : "chart.runtime.configErrorHint.axisFields")
54
+ });
55
+ let { pieData: i, originalLength: a } = w(e, j, M, N, r, A);
56
+ return i.length === 0 ? /* @__PURE__ */ _(f, {
57
+ height: m,
58
+ titleKey: "chart.runtime.noValidData",
59
+ hint: a > 0 ? `Filtered out ${a} data points (zero or invalid values)` : "No data points to display in pie chart"
60
+ }) : /* @__PURE__ */ _(l, {
61
+ height: m,
62
+ children: /* @__PURE__ */ v(S, {
63
+ accessibilityLayer: !1,
64
+ children: [
65
+ /* @__PURE__ */ _(x, {
66
+ data: i,
67
+ cx: "50%",
68
+ cy: "50%",
69
+ innerRadius: t.innerRadius === "0%" ? void 0 : t.innerRadius,
70
+ outerRadius: "70%",
71
+ dataKey: "value",
72
+ label: t.showLegend ? void 0 : ({ name: e, percent: t }) => `${e} ${((t || 0) * 100).toFixed(0)}%`,
73
+ cursor: E ? "pointer" : void 0,
74
+ onClick: (e, t, n) => {
75
+ T && E && e && T({
76
+ dataPoint: e,
77
+ clickedField: M[0],
78
+ xValue: e.name,
79
+ position: {
80
+ x: n.clientX,
81
+ y: n.clientY
82
+ },
83
+ nativeEvent: n
84
+ });
85
+ },
86
+ children: i.map((e, t) => /* @__PURE__ */ _(y, {
87
+ fill: C?.colors && C.colors[t % C.colors.length] || o[t % o.length],
88
+ fillOpacity: O ? O === i[t].name ? 1 : .3 : 1
89
+ }, `cell-${t}`))
90
+ }),
91
+ t.showTooltip && /* @__PURE__ */ _(d, { formatter: t.leftYAxisFormat ? (e, n) => [s(e, t.leftYAxisFormat), n] : void 0 }),
92
+ t.showLegend && /* @__PURE__ */ _(b, {
93
+ wrapperStyle: {
94
+ fontSize: "12px",
95
+ paddingTop: "10px"
96
+ },
97
+ iconType: "circle",
98
+ iconSize: 8,
99
+ layout: "horizontal",
100
+ align: "center",
101
+ verticalAlign: "bottom",
102
+ onMouseEnter: (e) => k(String(e.value || "")),
103
+ onMouseLeave: () => k(null)
104
+ })
105
+ ]
106
+ })
107
+ });
108
+ } catch (e) {
109
+ return /* @__PURE__ */ _(c, {
110
+ height: m,
111
+ chartType: "Pie Chart",
112
+ error: e
113
+ });
114
+ }
115
+ });
116
+ //#endregion
117
+ export { C as n, T as t };
118
+
119
+ //# sourceMappingURL=chart-pie-ByieAX5H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-pie-ByieAX5H.js","names":[],"sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates'\nimport { resolveChartAxisFields } from './chartAxisResolution'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps, CubeQuery } from '../../types'\n\ninterface PieSlice {\n name: string\n value: number\n}\n\n/**\n * Build pie slices from query data, supporting both series-based (dimension\n * slices) and standard measure-based pies. Returns the slices that survive\n * value filtering plus the pre-filter count (so the caller can explain how\n * many points were dropped). Pure — extracted to keep `PieChart` simple.\n */\nfunction buildPieData(\n data: any[],\n xField: string,\n yAxisFields: string[],\n seriesFields: string[],\n queryObject: CubeQuery | undefined,\n getFieldLabel: (field: string) => string\n): { pieData: PieSlice[]; originalLength: number } {\n let pieData: PieSlice[]\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data,\n xField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n\n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({ name: String(key), value: firstRow[key] })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xField], granularity) || String(item[xField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xField] === 'boolean') {\n name = item[xField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string'\n ? parseFloat(item[yAxisFields[0]])\n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or non-positive)\n const originalLength = pieData.length\n pieData = pieData.filter(item =>\n item.value != null &&\n !isNaN(item.value) &&\n item.value !== 0 &&\n item.value > 0\n )\n\n return { pieData, originalLength }\n}\n\nconst PieChart = React.memo(function PieChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Resolve + validate axis fields (hooks-first to satisfy React rules)\n const { xAxisField, yAxisFields, seriesFields, errorCode } = useMemo(\n () => resolveChartAxisFields(chartConfig),\n [chartConfig]\n )\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat,\n innerRadius: displayConfig?.innerRadius || '0%'\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.pie')} />\n }\n\n if (errorCode) {\n // Pie surfaces a pie-specific message for the \"invalid config\" case\n const hintKey = errorCode === 'axisInvalid'\n ? 'chart.runtime.configErrorHint.pieAxis'\n : 'chart.runtime.configErrorHint.axisFields'\n return <ChartConfigError height={height} hint={t(hintKey)} />\n }\n\n // The errorCode guard above guarantees xAxisField is defined here\n const xField = xAxisField as string\n\n const { pieData, originalLength } = buildPieData(\n data,\n xField,\n yAxisFields,\n seriesFields,\n queryObject,\n getFieldLabel\n )\n\n if (pieData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={\n originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n />\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart accessibilityLayer={false}>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={safeDisplayConfig.innerRadius !== '0%' ? safeDisplayConfig.innerRadius : undefined}\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) =>\n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(sliceData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && sliceData) {\n onDataPointClick({\n dataPoint: sliceData,\n clickedField: yAxisFields[0],\n xValue: sliceData.name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }}\n >\n {pieData.map((_entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Pie Chart\" error={error} />\n }\n})\n\nexport default PieChart"],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
+ import { D as t, E as n, M as r, P as i, s as a, w as o } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { S as s, T as c, b as l, w as u, x as d } from "./chart-area-of01_62R.js";
4
+ import f, { useState as p } from "react";
5
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
6
+ import { Legend as g, PolarAngleAxis as _, PolarGrid as v, PolarRadiusAxis as y, Radar as b, RadarChart as x } from "recharts";
7
+ //#region src/client/components/charts/radarChartHelpers.ts
8
+ function S(e, t, n) {
9
+ let { data: i, seriesKeys: a } = r(e, Array.isArray(t.xAxis) ? t.xAxis[0] : t.xAxis, Array.isArray(t.yAxis) ? t.yAxis : [t.yAxis], n, t.series || []);
10
+ return {
11
+ radarData: i,
12
+ seriesKeys: a
13
+ };
14
+ }
15
+ function C(e) {
16
+ return typeof e == "string" ? parseFloat(e) : e || 0;
17
+ }
18
+ function w(e, r) {
19
+ let i = e[0], a = Object.keys(i), o = a.find((e) => typeof i[e] == "string" || e.toLowerCase().includes("subject") || e.toLowerCase().includes("name") || e.toLowerCase().includes("category")) || a[0], s = a.filter((e) => typeof i[e] == "number" && e !== o);
20
+ if (s.length === 0) return {
21
+ radarData: [],
22
+ seriesKeys: [],
23
+ noNumericFields: !0
24
+ };
25
+ if (o) {
26
+ let i = t(r, o);
27
+ return {
28
+ radarData: e.map((e) => {
29
+ let t = { name: n(e[o], i) || String(e[o]) || "Unknown" };
30
+ return s.forEach((n) => {
31
+ let r = n.split(".").pop() || n;
32
+ t[r] = C(e[n]);
33
+ }), t;
34
+ }),
35
+ seriesKeys: s.map((e) => e.split(".").pop() || e)
36
+ };
37
+ }
38
+ return {
39
+ radarData: e.map((e) => ({
40
+ name: String(e[a[0]] || "Unknown"),
41
+ value: C(e[s[0]])
42
+ })),
43
+ seriesKeys: ["value"]
44
+ };
45
+ }
46
+ function T(e, t, n) {
47
+ return t?.xAxis && t?.yAxis ? S(e, t, n) : w(e, n);
48
+ }
49
+ //#endregion
50
+ //#region src/client/components/charts/RadarChart.tsx
51
+ var E = /* @__PURE__ */ e({ default: () => D }), D = f.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: r, height: f = "100%", colorPalette: S }) {
52
+ let { t: C } = i(), [w, E] = p(null);
53
+ try {
54
+ let i = {
55
+ showLegend: n?.showLegend ?? !0,
56
+ showTooltip: n?.showTooltip ?? !0,
57
+ showGrid: n?.showGrid ?? !0,
58
+ leftYAxisFormat: n?.leftYAxisFormat
59
+ };
60
+ if (!e || e.length === 0) return /* @__PURE__ */ m(d, {
61
+ height: f,
62
+ hint: C("chart.runtime.noDataHint.radar")
63
+ });
64
+ let { radarData: s, seriesKeys: p, noNumericFields: D } = T(e, t, r);
65
+ if (D) return /* @__PURE__ */ m(l, {
66
+ height: f,
67
+ hint: C("chart.runtime.configErrorHint.radarNumeric")
68
+ });
69
+ if (!s || s.length === 0) return /* @__PURE__ */ m(d, {
70
+ height: f,
71
+ titleKey: "chart.runtime.noValidData",
72
+ hint: "No valid data points for radar chart after transformation"
73
+ });
74
+ let { leftYAxisFormat: O } = i;
75
+ return /* @__PURE__ */ m(c, {
76
+ height: f,
77
+ children: /* @__PURE__ */ h(x, {
78
+ data: s,
79
+ margin: {
80
+ top: 20,
81
+ right: 80,
82
+ bottom: 20,
83
+ left: 80
84
+ },
85
+ accessibilityLayer: !1,
86
+ children: [
87
+ i.showGrid && /* @__PURE__ */ m(v, {}),
88
+ /* @__PURE__ */ m(_, {
89
+ dataKey: "name",
90
+ tick: { fontSize: 12 },
91
+ className: "text-dc-text-muted"
92
+ }),
93
+ /* @__PURE__ */ m(y, {
94
+ tick: { fontSize: 10 },
95
+ className: "text-dc-text-muted",
96
+ tickFormatter: O ? (e) => o(e, O) : void 0
97
+ }),
98
+ i.showTooltip && /* @__PURE__ */ m(u, { formatter: O ? (e, t) => [o(e, O), t] : void 0 }),
99
+ i.showLegend && p.length > 1 && /* @__PURE__ */ m(g, {
100
+ wrapperStyle: {
101
+ fontSize: "12px",
102
+ paddingTop: "10px"
103
+ },
104
+ iconType: "rect",
105
+ iconSize: 8,
106
+ layout: "horizontal",
107
+ align: "center",
108
+ verticalAlign: "bottom",
109
+ onMouseEnter: (e) => E(String(e.dataKey || "")),
110
+ onMouseLeave: () => E(null)
111
+ }),
112
+ p.map((e, t) => {
113
+ let n = S?.colors && S.colors[t % S.colors.length] || a[t % a.length];
114
+ return /* @__PURE__ */ m(b, {
115
+ name: e,
116
+ dataKey: e,
117
+ stroke: n,
118
+ fill: n,
119
+ fillOpacity: w ? w === e ? .6 : .1 : .3,
120
+ strokeOpacity: w ? w === e ? 1 : .3 : 1,
121
+ strokeWidth: 2
122
+ }, e);
123
+ })
124
+ ]
125
+ })
126
+ });
127
+ } catch (e) {
128
+ return /* @__PURE__ */ m(s, {
129
+ height: f,
130
+ chartType: "Radar Chart",
131
+ error: e
132
+ });
133
+ }
134
+ });
135
+ //#endregion
136
+ export { E as n, D as t };
137
+
138
+ //# sourceMappingURL=chart-radar-CiSwHWp4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-radar-CiSwHWp4.js","names":[],"sources":["../../../src/client/components/charts/radarChartHelpers.ts","../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\n\n/**\n * Co-located data-shaping helpers for RadarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadarShape {\n radarData: any[]\n seriesKeys: string[]\n /** True when no numeric value fields could be found (legacy auto-detect). */\n noNumericFields?: boolean\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any\n): RadarShape {\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n const seriesFields = chartConfig.series || []\n\n const { data: radarData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields\n )\n return { radarData, seriesKeys }\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromLegacy(data: any[], queryObject: any): RadarShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const subjectField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueFields = keys.filter(key => typeof firstRow[key] === 'number' && key !== subjectField)\n\n if (valueFields.length === 0) {\n return { radarData: [], seriesKeys: [], noNumericFields: true }\n }\n\n if (subjectField) {\n const granularity = getFieldGranularity(queryObject, subjectField)\n const radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = toNumber(item[field])\n })\n return transformedItem\n })\n return { radarData, seriesKeys: valueFields.map(field => field.split('.').pop() || field) }\n }\n\n const radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: toNumber(item[valueFields[0]])\n }))\n return { radarData, seriesKeys: ['value'] }\n}\n\n/** Shape rows for the radar chart via config-driven or legacy auto-detection. */\nexport function buildRadarData(data: any[], chartConfig: any, queryObject: any): RadarShape {\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n return shapeFromChartConfig(data, chartConfig, queryObject)\n }\n return shapeFromLegacy(data, queryObject)\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates'\nimport { buildRadarData } from './radarChartHelpers'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst RadarChart = React.memo(function RadarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radar')} />\n }\n\n const { radarData, seriesKeys, noNumericFields } = buildRadarData(data, chartConfig, queryObject)\n\n if (noNumericFields) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radarNumeric')} />\n }\n\n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n const color = (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n return (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={color}\n fill={color}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n )\n })}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radar Chart\" error={error} />\n }\n})\n\nexport default RadarChart\n"],"mappings":";;;;;;;AAgBA,SAAS,EACP,GACA,GACA,GACY;CAKZ,IAAM,EAAE,MAAM,GAAW,kBAAe,EACtC,GALiB,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,MAAM,KAAK,EAAY,OACrE,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,QAAQ,CAAC,EAAY,KAAK,GAO3F,GANmB,EAAY,UAAU,CAAC,CAQ5C;CACA,OAAO;EAAE;EAAW;CAAW;AACjC;AAEA,SAAS,EAAS,GAAwB;CACxC,OAAO,OAAO,KAAU,WAAW,WAAW,CAAK,IAAM,KAAoB;AAC/E;AAEA,SAAS,EAAgB,GAAa,GAA8B;CAClE,IAAM,IAAW,EAAK,IAChB,IAAO,OAAO,KAAK,CAAQ,GAE3B,IAAe,EAAK,MAAK,MAC7B,OAAO,EAAS,MAAS,YACzB,EAAI,YAAY,EAAE,SAAS,SAAS,KACpC,EAAI,YAAY,EAAE,SAAS,MAAM,KACjC,EAAI,YAAY,EAAE,SAAS,UAAU,CACvC,KAAK,EAAK,IAEJ,IAAc,EAAK,QAAO,MAAO,OAAO,EAAS,MAAS,YAAY,MAAQ,CAAY;CAEhG,IAAI,EAAY,WAAW,GACzB,OAAO;EAAE,WAAW,CAAC;EAAG,YAAY,CAAC;EAAG,iBAAiB;CAAK;CAGhE,IAAI,GAAc;EAChB,IAAM,IAAc,EAAoB,GAAa,CAAY;EAWjE,OAAO;GAAE,WAVS,EAAK,KAAI,MAAQ;IACjC,IAAM,IAAuB,EAC3B,MAAM,EAAgB,EAAK,IAAe,CAAW,KAAK,OAAO,EAAK,EAAa,KAAK,UAC1F;IAKA,OAJA,EAAY,SAAQ,MAAS;KAC3B,IAAM,IAAc,EAAM,MAAM,GAAG,EAAE,IAAI,KAAK;KAC9C,EAAgB,KAAe,EAAS,EAAK,EAAM;IACrD,CAAC,GACM;GACT,CACS;GAAW,YAAY,EAAY,KAAI,MAAS,EAAM,MAAM,GAAG,EAAE,IAAI,KAAK,CAAK;EAAE;CAC5F;CAMA,OAAO;EAAE,WAJS,EAAK,KAAI,OAAS;GAClC,MAAM,OAAO,EAAK,EAAK,OAAO,SAAS;GACvC,OAAO,EAAS,EAAK,EAAY,GAAG;EACtC,EACS;EAAW,YAAY,CAAC,OAAO;CAAE;AAC5C;AAGA,SAAgB,EAAe,GAAa,GAAkB,GAA8B;CAI1F,OAHI,GAAa,SAAS,GAAa,QAC9B,EAAqB,GAAM,GAAa,CAAW,IAErD,EAAgB,GAAM,CAAW;AAC1C;;;iDCzEM,IAAa,EAAM,KAAK,SAAoB,EAChD,SACA,gBACA,mBAAgB,CAAC,GACjB,gBACA,YAAS,QACT,mBACa;CACb,IAAM,EAAE,SAAM,EAAe,GACvB,CAAC,GAAe,KAAoB,EAAwB,IAAI;CAEtE,IAAI;EACF,IAAM,IAAoB;GACxB,YAAY,GAAe,cAAc;GACzC,aAAa,GAAe,eAAe;GAC3C,UAAU,GAAe,YAAY;GACrC,iBAAiB,GAAe;EAClC;EAEA,IAAI,CAAC,KAAQ,EAAK,WAAW,GAC3B,OAAO,kBAAC,GAAD;GAAyB;GAAQ,MAAM,EAAE,gCAAgC;EAAI,CAAA;EAGtF,IAAM,EAAE,cAAW,eAAY,uBAAoB,EAAe,GAAM,GAAa,CAAW;EAEhG,IAAI,GACF,OAAO,kBAAC,GAAD;GAA0B;GAAQ,MAAM,EAAE,4CAA4C;EAAI,CAAA;EAInG,IAAI,CAAC,KAAa,EAAU,WAAW,GACrC,OACE,kBAAC,GAAD;GACU;GACR,UAAS;GACT,MAAK;EACN,CAAA;EAIL,IAAM,EAAE,uBAAoB;EAC5B,OACE,kBAAC,GAAD;GAAwB;aACtB,kBAAC,GAAD;IAAoB,MAAM;IAAW,QAAQ;KAAE,KAAK;KAAI,OAAO;KAAI,QAAQ;KAAI,MAAM;IAAG;IAAG,oBAAoB;cAA/G;KACG,EAAkB,YACjB,kBAAC,GAAD,CAAY,CAAA;KAEd,kBAAC,GAAD;MACE,SAAQ;MACR,MAAM,EAAE,UAAU,GAAG;MACrB,WAAU;KACX,CAAA;KACD,kBAAC,GAAD;MACE,MAAM,EAAE,UAAU,GAAG;MACrB,WAAU;MACV,eAAe,KACV,MAAe,EAAgB,GAAO,CAAe,IACtD,KAAA;KAEL,CAAA;KACA,EAAkB,eACjB,kBAAC,GAAD,EACE,WAAW,KACN,GAAY,MAAiB,CAAC,EAAgB,GAAO,CAAe,GAAG,CAAI,IAC5E,KAAA,EAEL,CAAA;KAED,EAAkB,cAAc,EAAW,SAAS,KACpD,kBAAC,GAAD;MACE,cAAc;OAAE,UAAU;OAAQ,YAAY;MAAO;MACrD,UAAS;MACT,UAAU;MACV,QAAO;MACP,OAAM;MACN,eAAc;MACd,eAAe,MAAM,EAAiB,OAAO,EAAE,WAAW,EAAE,CAAC;MAC7D,oBAAoB,EAAiB,IAAI;KAC1C,CAAA;KAEF,EAAW,KAAK,GAAW,MAAU;MACpC,IAAM,IAAS,GAAc,UAAU,EAAa,OAAO,IAAQ,EAAa,OAAO,WAAY,EAAa,IAAQ,EAAa;MACrI,OACE,kBAAC,GAAD;OAEE,MAAM;OACN,SAAS;OACT,QAAQ;OACR,MAAM;OACN,aAAa,IAAiB,MAAkB,IAAY,KAAM,KAAO;OACzE,eAAe,IAAiB,MAAkB,IAAY,IAAI,KAAO;OACzE,aAAa;MACd,GARM,CAQN;KAEL,CAAC;IACiB;;EACN,CAAA;CAEpB,SAAS,GAAO;EACd,OAAO,kBAAC,GAAD;GAA0B;GAAQ,WAAU;GAAqB;EAAQ,CAAA;CAClF;AACF,CAAC"}
@@ -0,0 +1,122 @@
1
+ import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
+ import { D as t, E as n, P as r, s as i, w as a } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { S as o, T as s, b as c, w as l, x as u } from "./chart-area-of01_62R.js";
4
+ import d, { useState as f } from "react";
5
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
6
+ import { Cell as h, Legend as g, RadialBar as _, RadialBarChart as v } from "recharts";
7
+ //#region src/client/components/charts/radialBarChartHelpers.ts
8
+ function y(e, t) {
9
+ let n = e?.colors;
10
+ return n && n[t % n.length] || i[t % i.length];
11
+ }
12
+ function b(e) {
13
+ return typeof e == "string" ? parseFloat(e) : e || 0;
14
+ }
15
+ function x(e, r, i, a) {
16
+ let o = Array.isArray(r.xAxis) ? r.xAxis[0] : r.xAxis, s = Array.isArray(r.yAxis) ? r.yAxis[0] : r.yAxis, c = t(i, o);
17
+ return { radialData: e.map((e, t) => ({
18
+ name: n(e[o], c) || String(e[o]) || "Unknown",
19
+ value: b(e[s]),
20
+ fill: y(a, t)
21
+ })) };
22
+ }
23
+ function S(e) {
24
+ return typeof e == "boolean" ? e ? "Active" : "Inactive" : e === "true" || e === "false" ? e === "true" ? "Active" : "Inactive" : String(e);
25
+ }
26
+ function C(e, t) {
27
+ let n = e[0], r = Object.keys(n), i = r.find((e) => typeof n[e] == "string" || e.toLowerCase().includes("name") || e.toLowerCase().includes("label") || e.toLowerCase().includes("category")) || r[0], a = r.find((e) => typeof n[e] == "number" && e !== i) || r[1];
28
+ return a ? { radialData: e.map((e, n) => ({
29
+ name: S(e[i]),
30
+ value: b(e[a]),
31
+ fill: y(t, n)
32
+ })) } : {
33
+ radialData: [],
34
+ noValueField: !0
35
+ };
36
+ }
37
+ function w(e, t, n, r) {
38
+ let i = t?.xAxis && t?.yAxis ? x(e, t, n, r) : C(e, r);
39
+ return i.noValueField ? i : { radialData: i.radialData.filter((e) => e.value != null && e.value !== 0) };
40
+ }
41
+ //#endregion
42
+ //#region src/client/components/charts/RadialBarChart.tsx
43
+ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: i, height: d = "100%", colorPalette: y }) {
44
+ let { t: b } = r(), [x, S] = f(null);
45
+ try {
46
+ let r = {
47
+ showLegend: n?.showLegend ?? !0,
48
+ showTooltip: n?.showTooltip ?? !0,
49
+ leftYAxisFormat: n?.leftYAxisFormat
50
+ };
51
+ if (!e || e.length === 0) return /* @__PURE__ */ p(u, {
52
+ height: d,
53
+ hint: b("chart.runtime.noDataHint.radialBar")
54
+ });
55
+ let { radialData: o, noValueField: f } = w(e, t, i, y);
56
+ if (f) return /* @__PURE__ */ p(c, {
57
+ height: d,
58
+ hint: b("chart.runtime.configErrorHint.radialBarNumeric")
59
+ });
60
+ if (o.length === 0) return /* @__PURE__ */ p(u, {
61
+ height: d,
62
+ titleKey: "chart.runtime.noValidData",
63
+ hint: "No valid data points for radial bar chart after transformation"
64
+ });
65
+ let { leftYAxisFormat: C } = r;
66
+ return /* @__PURE__ */ p(s, {
67
+ height: d,
68
+ children: /* @__PURE__ */ m(v, {
69
+ data: o,
70
+ innerRadius: "10%",
71
+ outerRadius: "80%",
72
+ margin: {
73
+ top: 20,
74
+ right: 30,
75
+ bottom: 20,
76
+ left: 30
77
+ },
78
+ accessibilityLayer: !1,
79
+ children: [
80
+ r.showTooltip && /* @__PURE__ */ p(l, { formatter: C ? (e, t) => [a(e, C), t] : void 0 }),
81
+ r.showLegend && /* @__PURE__ */ p(g, {
82
+ wrapperStyle: {
83
+ fontSize: "12px",
84
+ paddingTop: "10px"
85
+ },
86
+ iconType: "circle",
87
+ iconSize: 8,
88
+ layout: "horizontal",
89
+ align: "center",
90
+ verticalAlign: "bottom",
91
+ onMouseEnter: (e) => S(String(e.value || "")),
92
+ onMouseLeave: () => S(null)
93
+ }),
94
+ /* @__PURE__ */ p(_, {
95
+ dataKey: "value",
96
+ cornerRadius: 4,
97
+ label: {
98
+ position: "insideStart",
99
+ fill: "#fff",
100
+ fontSize: 12,
101
+ formatter: C ? (e) => a(e, C) : void 0
102
+ },
103
+ children: o.map((e, t) => /* @__PURE__ */ p(h, {
104
+ fill: e.fill,
105
+ fillOpacity: x ? x === e.name ? 1 : .3 : 1
106
+ }, `cell-${t}`))
107
+ })
108
+ ]
109
+ })
110
+ });
111
+ } catch (e) {
112
+ return /* @__PURE__ */ p(o, {
113
+ height: d,
114
+ chartType: "Radial Bar Chart",
115
+ error: e
116
+ });
117
+ }
118
+ });
119
+ //#endregion
120
+ export { T as n, E as t };
121
+
122
+ //# sourceMappingURL=chart-radial-bar-BF6Mhl6f.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-radial-bar-BF6Mhl6f.js","names":[],"sources":["../../../src/client/components/charts/radialBarChartHelpers.ts","../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport type { ColorPalette } from '../../types'\n\n/**\n * Co-located data-shaping helpers for RadialBarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadialDatum {\n name: string\n value: number\n fill?: string\n}\n\nexport interface RadialShape {\n radialData: RadialDatum[]\n /** True when the legacy auto-detect found no usable value field. */\n noValueField?: boolean\n}\n\nfunction colorAt(colorPalette: ColorPalette | undefined, index: number): string {\n const colors = colorPalette?.colors\n return (colors && colors[index % colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const granularity = getFieldGranularity(queryObject, xAxisField)\n\n const radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: toNumber(item[yAxisField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/** Coerce a name value to a display label, mapping booleans to Active/Inactive. */\nfunction toRadialName(name: unknown): string {\n if (typeof name === 'boolean') return name ? 'Active' : 'Inactive'\n if (name === 'true' || name === 'false') return name === 'true' ? 'Active' : 'Inactive'\n return String(name)\n}\n\nfunction shapeFromLegacy(\n data: any[],\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const nameField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueField = keys.find(key => typeof firstRow[key] === 'number' && key !== nameField) || keys[1]\n\n if (!valueField) {\n return { radialData: [], noValueField: true }\n }\n\n const radialData = data.map((item, index) => ({\n name: toRadialName(item[nameField]),\n value: toNumber(item[valueField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/**\n * Shape rows for the radial bar chart (config-driven or legacy auto-detect),\n * filtering out null/zero values.\n */\nexport function buildRadialData(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const shaped = chartConfig?.xAxis && chartConfig?.yAxis\n ? shapeFromChartConfig(data, chartConfig, queryObject, colorPalette)\n : shapeFromLegacy(data, colorPalette)\n\n if (shaped.noValueField) return shaped\n\n return { radialData: shaped.radialData.filter(item => item.value != null && item.value !== 0) }\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates'\nimport { buildRadialData } from './radialBarChartHelpers'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst RadialBarChart = React.memo(function RadialBarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radialBar')} />\n }\n\n const { radialData, noValueField } = buildRadialData(data, chartConfig, queryObject, colorPalette)\n\n if (noValueField) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radialBarNumeric')} />\n }\n\n if (radialData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radial bar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart\n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n accessibilityLayer={false}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radial Bar Chart\" error={error} />\n }\n})\n\nexport default RadialBarChart\n"],"mappings":";;;;;;;AAuBA,SAAS,EAAQ,GAAwC,GAAuB;CAC9E,IAAM,IAAS,GAAc;CAC7B,OAAQ,KAAU,EAAO,IAAQ,EAAO,WAAY,EAAa,IAAQ,EAAa;AACxF;AAEA,SAAS,EAAS,GAAwB;CACxC,OAAO,OAAO,KAAU,WAAW,WAAW,CAAK,IAAM,KAAoB;AAC/E;AAEA,SAAS,EACP,GACA,GACA,GACA,GACa;CACb,IAAM,IAAa,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,MAAM,KAAK,EAAY,OACnF,IAAa,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,MAAM,KAAK,EAAY,OACnF,IAAc,EAAoB,GAAa,CAAU;CAO/D,OAAO,EAAE,YALU,EAAK,KAAK,GAAM,OAAW;EAC5C,MAAM,EAAgB,EAAK,IAAa,CAAW,KAAK,OAAO,EAAK,EAAW,KAAK;EACpF,OAAO,EAAS,EAAK,EAAW;EAChC,MAAM,EAAQ,GAAc,CAAK;CACnC,EACS,EAAW;AACtB;AAGA,SAAS,EAAa,GAAuB;CAG3C,OAFI,OAAO,KAAS,YAAkB,IAAO,WAAW,aACpD,MAAS,UAAU,MAAS,UAAgB,MAAS,SAAS,WAAW,aACtE,OAAO,CAAI;AACpB;AAEA,SAAS,EACP,GACA,GACa;CACb,IAAM,IAAW,EAAK,IAChB,IAAO,OAAO,KAAK,CAAQ,GAE3B,IAAY,EAAK,MAAK,MAC1B,OAAO,EAAS,MAAS,YACzB,EAAI,YAAY,EAAE,SAAS,MAAM,KACjC,EAAI,YAAY,EAAE,SAAS,OAAO,KAClC,EAAI,YAAY,EAAE,SAAS,UAAU,CACvC,KAAK,EAAK,IAEJ,IAAa,EAAK,MAAK,MAAO,OAAO,EAAS,MAAS,YAAY,MAAQ,CAAS,KAAK,EAAK;CAWpG,OATK,IASE,EAAE,YALU,EAAK,KAAK,GAAM,OAAW;EAC5C,MAAM,EAAa,EAAK,EAAU;EAClC,OAAO,EAAS,EAAK,EAAW;EAChC,MAAM,EAAQ,GAAc,CAAK;CACnC,EACS,EAAW,IARX;EAAE,YAAY,CAAC;EAAG,cAAc;CAAK;AAShD;AAMA,SAAgB,EACd,GACA,GACA,GACA,GACa;CACb,IAAM,IAAS,GAAa,SAAS,GAAa,QAC9C,EAAqB,GAAM,GAAa,GAAa,CAAY,IACjE,EAAgB,GAAM,CAAY;CAItC,OAFI,EAAO,eAAqB,IAEzB,EAAE,YAAY,EAAO,WAAW,QAAO,MAAQ,EAAK,SAAS,QAAQ,EAAK,UAAU,CAAC,EAAE;AAChG;;;iDC5FM,IAAiB,EAAM,KAAK,SAAwB,EACxD,SACA,gBACA,mBAAgB,CAAC,GACjB,gBACA,YAAS,QACT,mBACa;CACb,IAAM,EAAE,SAAM,EAAe,GACvB,CAAC,GAAe,KAAoB,EAAwB,IAAI;CAEtE,IAAI;EACF,IAAM,IAAoB;GACxB,YAAY,GAAe,cAAc;GACzC,aAAa,GAAe,eAAe;GAC3C,iBAAiB,GAAe;EAClC;EAEA,IAAI,CAAC,KAAQ,EAAK,WAAW,GAC3B,OAAO,kBAAC,GAAD;GAAyB;GAAQ,MAAM,EAAE,oCAAoC;EAAI,CAAA;EAG1F,IAAM,EAAE,eAAY,oBAAiB,EAAgB,GAAM,GAAa,GAAa,CAAY;EAEjG,IAAI,GACF,OAAO,kBAAC,GAAD;GAA0B;GAAQ,MAAM,EAAE,gDAAgD;EAAI,CAAA;EAGvG,IAAI,EAAW,WAAW,GACxB,OACE,kBAAC,GAAD;GACU;GACR,UAAS;GACT,MAAK;EACN,CAAA;EAIL,IAAM,EAAE,uBAAoB;EAC5B,OACE,kBAAC,GAAD;GAAwB;aACtB,kBAAC,GAAD;IACE,MAAM;IACN,aAAY;IACZ,aAAY;IACZ,QAAQ;KAAE,KAAK;KAAI,OAAO;KAAI,QAAQ;KAAI,MAAM;IAAG;IACnD,oBAAoB;cALtB;KAOG,EAAkB,eACjB,kBAAC,GAAD,EACE,WAAW,KACN,GAAY,MAAiB,CAAC,EAAgB,GAAO,CAAe,GAAG,CAAI,IAC5E,KAAA,EAEL,CAAA;KAEF,EAAkB,cACjB,kBAAC,GAAD;MACE,cAAc;OAAE,UAAU;OAAQ,YAAY;MAAO;MACrD,UAAS;MACT,UAAU;MACV,QAAO;MACP,OAAM;MACN,eAAc;MACd,eAAe,MAAM,EAAiB,OAAO,EAAE,SAAS,EAAE,CAAC;MAC3D,oBAAoB,EAAiB,IAAI;KAC1C,CAAA;KAEH,kBAAC,GAAD;MACE,SAAQ;MACR,cAAc;MACd,OAAO;OACL,UAAU;OACV,MAAM;OACN,UAAU;OACV,WAAW,KACN,MAAe,EAAgB,GAAO,CAAe,IACtD,KAAA;MACN;gBAEC,EAAW,KAAK,GAAO,MACtB,kBAAC,GAAD;OAEE,MAAM,EAAM;OACZ,aAAa,IAAiB,MAAkB,EAAM,OAAO,IAAI,KAAO;MACzE,GAHM,QAAQ,GAGd,CACF;KACQ,CAAA;IACW;;EACV,CAAA;CAEpB,SAAS,GAAO;EACd,OAAO,kBAAC,GAAD;GAA0B;GAAQ,WAAU;GAA0B;EAAQ,CAAA;CACvF;AACF,CAAC"}