drizzle-cube 0.10.0 → 0.11.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 (334) hide show
  1. package/dist/adapters/ActivityGridChart.config-XMtoteb6.js +2 -0
  2. package/dist/adapters/ActivityGridChart.config-h1AXPvn0.cjs +1 -0
  3. package/dist/adapters/AreaChart.config-DYf9wufo.cjs +1 -0
  4. package/dist/adapters/AreaChart.config-We6b53aT.js +2 -0
  5. package/dist/adapters/BarChart.config-4SX44IYv.cjs +1 -0
  6. package/dist/adapters/BarChart.config-CwBnyptL.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-BzNe-FlW.cjs +1 -0
  8. package/dist/adapters/BoxPlotChart.config-mfAHqmcp.js +2 -0
  9. package/dist/adapters/BubbleChart.config-CBT5jMdc.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-DxG_Umal.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-Cqw3XP1h.js +2 -0
  12. package/dist/adapters/CandlestickChart.config-DPSSlzUD.cjs +1 -0
  13. package/dist/adapters/DataTable.config-DS1bvaDu.js +2 -0
  14. package/dist/adapters/DataTable.config-D_NsMeyz.cjs +1 -0
  15. package/dist/adapters/DotStripChart.config-BApWn6QV.cjs +1 -0
  16. package/dist/adapters/DotStripChart.config-Bdk5-YfB.js +2 -0
  17. package/dist/adapters/FunnelChart.config-BT5up_Bg.cjs +1 -0
  18. package/dist/adapters/FunnelChart.config-ISZiz9fn.js +2 -0
  19. package/dist/adapters/GaugeChart.config-Biaq1cKc.cjs +1 -0
  20. package/dist/adapters/GaugeChart.config-BjGfB84t.js +2 -0
  21. package/dist/adapters/HeatMapChart.config-Bmca8KiH.cjs +1 -0
  22. package/dist/adapters/HeatMapChart.config-uWvR0B-N.js +2 -0
  23. package/dist/adapters/KpiDelta.config-CJeDdj_1.js +2 -0
  24. package/dist/adapters/KpiDelta.config-CKr9pAxL.cjs +1 -0
  25. package/dist/adapters/KpiNumber.config-6YLEF2fy.cjs +1 -0
  26. package/dist/adapters/KpiNumber.config-C00M46GA.js +2 -0
  27. package/dist/adapters/KpiText.config-C8Av_D2W.cjs +1 -0
  28. package/dist/adapters/KpiText.config-bKTHob0C.js +2 -0
  29. package/dist/adapters/LineChart.config-DH68HT_B.js +2 -0
  30. package/dist/adapters/LineChart.config-DPq7GvL9.cjs +1 -0
  31. package/dist/adapters/MarkdownChart.config-CaaJPO3c.js +2 -0
  32. package/dist/adapters/MarkdownChart.config-ca_UyhWJ.cjs +1 -0
  33. package/dist/adapters/MeasureProfileChart.config-C1Il0IqL.cjs +1 -0
  34. package/dist/adapters/MeasureProfileChart.config-DMOnkmb6.js +2 -0
  35. package/dist/adapters/PieChart.config-Bg-8cxWK.js +2 -0
  36. package/dist/adapters/PieChart.config-joJcF--K.cjs +1 -0
  37. package/dist/adapters/ProportionBarChart.config-B2sltKsI.cjs +1 -0
  38. package/dist/adapters/ProportionBarChart.config-BlCedy1v.js +2 -0
  39. package/dist/adapters/RadarChart.config-DD1pX6FZ.js +2 -0
  40. package/dist/adapters/RadarChart.config-DVCCLSVw.cjs +1 -0
  41. package/dist/adapters/RadialBarChart.config--VIE2jMM.js +2 -0
  42. package/dist/adapters/RadialBarChart.config-BZwyWhTg.cjs +1 -0
  43. package/dist/adapters/RecordsTable.config-CTBQc-2r.js +2 -0
  44. package/dist/adapters/RecordsTable.config-DPdO0DL5.cjs +1 -0
  45. package/dist/adapters/RetentionCombinedChart.config-PGVxnkRL.js +2 -0
  46. package/dist/adapters/RetentionCombinedChart.config-mX5PMh82.cjs +1 -0
  47. package/dist/adapters/RetentionHeatmap.config-Co-JMzBm.js +2 -0
  48. package/dist/adapters/RetentionHeatmap.config-Cub3-ksy.cjs +1 -0
  49. package/dist/adapters/SankeyChart.config-BkIyUcAE.cjs +1 -0
  50. package/dist/adapters/SankeyChart.config-DGTnRmYg.js +2 -0
  51. package/dist/adapters/ScatterChart.config-CdZrBorg.js +2 -0
  52. package/dist/adapters/ScatterChart.config-CwN9niUL.cjs +1 -0
  53. package/dist/adapters/SunburstChart.config-D0ZkRSJv.cjs +1 -0
  54. package/dist/adapters/SunburstChart.config-RF3uu5Sa.js +2 -0
  55. package/dist/adapters/TreeMapChart.config-B2Yn_V7p.cjs +1 -0
  56. package/dist/adapters/TreeMapChart.config-diJtcs4D.js +2 -0
  57. package/dist/adapters/WaterfallChart.config-B10PxftT.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-BImlkLmR.js +2 -0
  59. package/dist/adapters/chartConfigHelpers-BhME7ow_.cjs +1 -0
  60. package/dist/adapters/{chartConfigHelpers-BsnbxA2c.js → chartConfigHelpers-BsviVhEw.js} +27 -7
  61. package/dist/adapters/compiler-B-yljK02.cjs +166 -0
  62. package/dist/adapters/{compiler-BKg3j2mm.js → compiler-BhityGUO.js} +1146 -1108
  63. package/dist/adapters/core/index.cjs +1 -1
  64. package/dist/adapters/core/index.js +1 -1
  65. package/dist/adapters/{core-JgUTMhxl.cjs → core-CQOrzBNh.cjs} +1 -1
  66. package/dist/adapters/{core-Bmb7XMBz.js → core-xZE0miIu.js} +2 -2
  67. package/dist/adapters/express/index.cjs +1 -1
  68. package/dist/adapters/express/index.js +5 -5
  69. package/dist/adapters/fastify/index.cjs +1 -1
  70. package/dist/adapters/fastify/index.js +23 -23
  71. package/dist/adapters/{handler-B1_zd-qo.js → handler-ByeQ0-1r.js} +238 -234
  72. package/dist/adapters/handler-DSNmfv1R.cjs +16 -0
  73. package/dist/adapters/hono/index.cjs +1 -1
  74. package/dist/adapters/hono/index.js +4 -4
  75. package/dist/adapters/mcp-app-html-CNp0VqS_.cjs +1 -0
  76. package/dist/adapters/mcp-app-html-CvWoYMO3.js +5 -0
  77. package/dist/adapters/mcp-app-html.cjs +1 -1
  78. package/dist/adapters/mcp-app-html.js +1 -1
  79. package/dist/adapters/mcp-tools.cjs +1 -1
  80. package/dist/adapters/mcp-tools.js +3 -3
  81. package/dist/adapters/{mcp-transport-BTmAXLo8.js → mcp-transport-Cy6n4uj1.js} +1 -1
  82. package/dist/adapters/{mcp-transport-DzxluRyH.cjs → mcp-transport-DnLP5FPL.cjs} +1 -1
  83. package/dist/adapters/nextjs/index.cjs +1 -1
  84. package/dist/adapters/nextjs/index.js +5 -5
  85. package/dist/adapters/{openai-Br__Bn2t.cjs → openai-BQl0yJCS.cjs} +2 -2
  86. package/dist/adapters/{openai-BpcMIv4e.js → openai-C4HrjyJj.js} +1 -1
  87. package/dist/adapters/{openai-yfJF-3Rv.js → openai-D3Nt6Bj7.js} +3 -3
  88. package/dist/adapters/{openai-C32tey5N.cjs → openai-z1ai-G4Q.cjs} +1 -1
  89. package/dist/adapters/{utils-i2h5cwI3.js → utils-BaxFceDq.js} +1070 -937
  90. package/dist/adapters/utils-a2p2B6x8.cjs +141 -0
  91. package/dist/adapters/utils.cjs +1 -1
  92. package/dist/adapters/utils.js +1 -1
  93. package/dist/cjs/client/charts/chartConfigHelpers.d.ts +5 -0
  94. package/dist/cjs/client/components/DashboardFilters/useCompactFilterBar.d.ts +5 -0
  95. package/dist/cjs/client/components/analyticsPortlet/usePortletQueryResults.d.ts +3 -1
  96. package/dist/cjs/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -0
  97. package/dist/cjs/client/hooks/queries/useCubeLoadQuery.d.ts +7 -0
  98. package/dist/cjs/client/hooks/queries/useMultiCubeLoadQuery.d.ts +7 -0
  99. package/dist/cjs/client/hooks/useAnalysisQuery.d.ts +6 -1
  100. package/dist/cjs/client/index.d.ts +2 -0
  101. package/dist/cjs/client/types.d.ts +3 -0
  102. package/dist/cjs/client/utils/filterUtils.d.ts +30 -0
  103. package/dist/cjs/client/utils/gapFilling.d.ts +52 -0
  104. package/dist/cjs/client/utils/index.d.ts +1 -0
  105. package/dist/cjs/client/utils/joinReachability.d.ts +1 -0
  106. package/dist/cjs/server/ai/query-schema.d.ts +8 -3
  107. package/dist/cjs/server/builders/date-time-builder.d.ts +1 -1
  108. package/dist/cjs/server/builders/date-time-helpers.d.ts +2 -0
  109. package/dist/cjs/server/builders/filter-builder.d.ts +1 -1
  110. package/dist/cjs/server/builders/in-date-range-validation.d.ts +25 -0
  111. package/dist/cjs/server/execution/result-post-processor.d.ts +4 -2
  112. package/dist/cjs/server/executor.d.ts +2 -0
  113. package/dist/cjs/server/gap-filler.d.ts +8 -43
  114. package/dist/cjs/server/types/core.d.ts +2 -0
  115. package/dist/cjs/server/types/cube.d.ts +12 -0
  116. package/dist/cjs/server/types/metadata.d.ts +5 -0
  117. package/dist/cjs/server/types/query.d.ts +2 -1
  118. package/dist/client/charts/chartConfigHelpers.d.ts +5 -0
  119. package/dist/client/charts.js +12 -12
  120. package/dist/client/chunks/{DashboardEditModal-P-HUNrcp.js → DashboardEditModal-CIR4aqr7.js} +2424 -2559
  121. package/dist/client/chunks/DashboardEditModal-CIR4aqr7.js.map +1 -0
  122. package/dist/client/chunks/{DotStripChart-in6QHc0b.js → DotStripChart-B9IVCFPO.js} +3 -3
  123. package/dist/client/chunks/{DotStripChart-in6QHc0b.js.map → DotStripChart-B9IVCFPO.js.map} +1 -1
  124. package/dist/client/chunks/{ProportionBarChart-CjuOm7NT.js → ProportionBarChart-DieF9AzP.js} +3 -3
  125. package/dist/client/chunks/{ProportionBarChart-CjuOm7NT.js.map → ProportionBarChart-DieF9AzP.js.map} +1 -1
  126. package/dist/client/chunks/{RecordsTable-CXXsiaV1.js → RecordsTable-Mo3ai5_M.js} +4 -4
  127. package/dist/client/chunks/{RecordsTable-CXXsiaV1.js.map → RecordsTable-Mo3ai5_M.js.map} +1 -1
  128. package/dist/client/chunks/{RetentionCombinedChart-DFCeEFkx.js → RetentionCombinedChart-Bie4ADyA.js} +3 -3
  129. package/dist/client/chunks/{RetentionCombinedChart-DFCeEFkx.js.map → RetentionCombinedChart-Bie4ADyA.js.map} +1 -1
  130. package/dist/client/chunks/{RetentionHeatmap-jpshJ2Af.js → RetentionHeatmap-qstIAx5B.js} +2 -2
  131. package/dist/client/chunks/{RetentionHeatmap-jpshJ2Af.js.map → RetentionHeatmap-qstIAx5B.js.map} +1 -1
  132. package/dist/client/chunks/{af-ZA-C0dGb_53.js → af-ZA-BglLInx4.js} +13 -1
  133. package/dist/client/chunks/{af-ZA-C0dGb_53.js.map → af-ZA-BglLInx4.js.map} +1 -1
  134. package/dist/client/chunks/{analysis-builder-CRghdHVl.js → analysis-builder-DJNYt7CF.js} +41 -41
  135. package/dist/client/chunks/{analysis-builder-CRghdHVl.js.map → analysis-builder-DJNYt7CF.js.map} +1 -1
  136. package/dist/client/chunks/{analysis-builder-shared-DBSxWIj8.js → analysis-builder-shared-DPLR8upd.js} +487 -483
  137. package/dist/client/chunks/analysis-builder-shared-DPLR8upd.js.map +1 -0
  138. package/dist/client/chunks/{chart-activity-grid-DGazwi4C.js → chart-activity-grid-Ly_-2B-f.js} +22 -4
  139. package/dist/client/chunks/chart-activity-grid-Ly_-2B-f.js.map +1 -0
  140. package/dist/client/chunks/{chart-area-zyLGD-ym.js → chart-area-D3l-71Wy.js} +2 -2
  141. package/dist/client/chunks/{chart-area-zyLGD-ym.js.map → chart-area-D3l-71Wy.js.map} +1 -1
  142. package/dist/client/chunks/{chart-bar-DMCBq8qJ.js → chart-bar-BaTyQOqs.js} +3 -3
  143. package/dist/client/chunks/{chart-bar-DMCBq8qJ.js.map → chart-bar-BaTyQOqs.js.map} +1 -1
  144. package/dist/client/chunks/{chart-box-plot-5Z55A-it.js → chart-box-plot-Cem6PHjz.js} +2 -2
  145. package/dist/client/chunks/{chart-box-plot-5Z55A-it.js.map → chart-box-plot-Cem6PHjz.js.map} +1 -1
  146. package/dist/client/chunks/{chart-bubble-YD28dX8w.js → chart-bubble-DFlfqCDG.js} +2 -2
  147. package/dist/client/chunks/{chart-bubble-YD28dX8w.js.map → chart-bubble-DFlfqCDG.js.map} +1 -1
  148. package/dist/client/chunks/{chart-candlestick-BUMpBI08.js → chart-candlestick-BkAFBXtZ.js} +2 -2
  149. package/dist/client/chunks/{chart-candlestick-BUMpBI08.js.map → chart-candlestick-BkAFBXtZ.js.map} +1 -1
  150. package/dist/client/chunks/{chart-config-area-DsrZCIwF.js → chart-config-area-BnsRQ-MY.js} +35 -14
  151. package/dist/client/chunks/chart-config-area-BnsRQ-MY.js.map +1 -0
  152. package/dist/client/chunks/{chart-config-bar-BixSs43E.js → chart-config-bar-G2HJJBVV.js} +8 -7
  153. package/dist/client/chunks/chart-config-bar-G2HJJBVV.js.map +1 -0
  154. package/dist/client/chunks/{chart-config-kpi-delta-Cl7k6jTj.js → chart-config-kpi-delta-BIAq1Ftg.js} +2 -2
  155. package/dist/client/chunks/{chart-config-kpi-delta-Cl7k6jTj.js.map → chart-config-kpi-delta-BIAq1Ftg.js.map} +1 -1
  156. package/dist/client/chunks/{chart-config-kpi-number-DCcnANWC.js → chart-config-kpi-number-Dgc4gIYu.js} +2 -2
  157. package/dist/client/chunks/{chart-config-kpi-number-DCcnANWC.js.map → chart-config-kpi-number-Dgc4gIYu.js.map} +1 -1
  158. package/dist/client/chunks/{chart-config-line-CBF9Px9b.js → chart-config-line-DLkRs1Zr.js} +9 -8
  159. package/dist/client/chunks/chart-config-line-DLkRs1Zr.js.map +1 -0
  160. package/dist/client/chunks/{chart-config-pie-DZLa6Eqm.js → chart-config-pie-XrHim0C8.js} +2 -2
  161. package/dist/client/chunks/{chart-config-pie-DZLa6Eqm.js.map → chart-config-pie-XrHim0C8.js.map} +1 -1
  162. package/dist/client/chunks/{chart-config-radar-DR6vHHyd.js → chart-config-radar-xNS6Juqc.js} +2 -2
  163. package/dist/client/chunks/{chart-config-radar-DR6vHHyd.js.map → chart-config-radar-xNS6Juqc.js.map} +1 -1
  164. package/dist/client/chunks/{chart-config-radial-bar-DVFou4fB.js → chart-config-radial-bar-ChUChsEe.js} +2 -2
  165. package/dist/client/chunks/{chart-config-radial-bar-DVFou4fB.js.map → chart-config-radial-bar-ChUChsEe.js.map} +1 -1
  166. package/dist/client/chunks/{chart-config-tree-map-Uhise6Bx.js → chart-config-tree-map-CnrJ7OC1.js} +2 -2
  167. package/dist/client/chunks/{chart-config-tree-map-Uhise6Bx.js.map → chart-config-tree-map-CnrJ7OC1.js.map} +1 -1
  168. package/dist/client/chunks/{chart-data-table-BdMo3zVh.js → chart-data-table-Cxd0cdAl.js} +36 -36
  169. package/dist/client/chunks/{chart-data-table-BdMo3zVh.js.map → chart-data-table-Cxd0cdAl.js.map} +1 -1
  170. package/dist/client/chunks/{chart-funnel-BRyZS6ie.js → chart-funnel-71Kn4eeF.js} +2 -2
  171. package/dist/client/chunks/{chart-funnel-BRyZS6ie.js.map → chart-funnel-71Kn4eeF.js.map} +1 -1
  172. package/dist/client/chunks/{chart-gauge-DxgHlZKp.js → chart-gauge-BddS_9oS.js} +3 -3
  173. package/dist/client/chunks/{chart-gauge-DxgHlZKp.js.map → chart-gauge-BddS_9oS.js.map} +1 -1
  174. package/dist/client/chunks/{chart-heat-map-5jHm3f-V.js → chart-heat-map-BQIsrn8m.js} +3 -3
  175. package/dist/client/chunks/{chart-heat-map-5jHm3f-V.js.map → chart-heat-map-BQIsrn8m.js.map} +1 -1
  176. package/dist/client/chunks/{chart-kpi-delta-C84P-mwu.js → chart-kpi-delta-DndbqdZT.js} +3 -3
  177. package/dist/client/chunks/{chart-kpi-delta-C84P-mwu.js.map → chart-kpi-delta-DndbqdZT.js.map} +1 -1
  178. package/dist/client/chunks/{chart-kpi-number-D9GqtBWw.js → chart-kpi-number-DAbfoHMt.js} +5 -5
  179. package/dist/client/chunks/{chart-kpi-number-D9GqtBWw.js.map → chart-kpi-number-DAbfoHMt.js.map} +1 -1
  180. package/dist/client/chunks/{chart-kpi-text-D3HqxXzU.js → chart-kpi-text-D8oQgpxL.js} +3 -3
  181. package/dist/client/chunks/{chart-kpi-text-D3HqxXzU.js.map → chart-kpi-text-D8oQgpxL.js.map} +1 -1
  182. package/dist/client/chunks/{chart-line-IEgiF8Nv.js → chart-line-BNqjUowg.js} +3 -3
  183. package/dist/client/chunks/{chart-line-IEgiF8Nv.js.map → chart-line-BNqjUowg.js.map} +1 -1
  184. package/dist/client/chunks/{chart-markdown-B_2Ed7FJ.js → chart-markdown-DtgpU3xd.js} +2 -2
  185. package/dist/client/chunks/{chart-markdown-B_2Ed7FJ.js.map → chart-markdown-DtgpU3xd.js.map} +1 -1
  186. package/dist/client/chunks/{chart-measure-profile-CWsPrQhH.js → chart-measure-profile-D5nZMWlI.js} +3 -3
  187. package/dist/client/chunks/{chart-measure-profile-CWsPrQhH.js.map → chart-measure-profile-D5nZMWlI.js.map} +1 -1
  188. package/dist/client/chunks/{chart-pie-BEB2sCXF.js → chart-pie-D8r9HCZ4.js} +3 -3
  189. package/dist/client/chunks/{chart-pie-BEB2sCXF.js.map → chart-pie-D8r9HCZ4.js.map} +1 -1
  190. package/dist/client/chunks/{chart-radar-BbSbXKbP.js → chart-radar-R4PuCIWp.js} +3 -3
  191. package/dist/client/chunks/{chart-radar-BbSbXKbP.js.map → chart-radar-R4PuCIWp.js.map} +1 -1
  192. package/dist/client/chunks/{chart-radial-bar-CNYD7tkM.js → chart-radial-bar-hmrSFa6O.js} +3 -3
  193. package/dist/client/chunks/{chart-radial-bar-CNYD7tkM.js.map → chart-radial-bar-hmrSFa6O.js.map} +1 -1
  194. package/dist/client/chunks/{chart-sankey-DKnTIvSr.js → chart-sankey-CFXPybny.js} +2 -2
  195. package/dist/client/chunks/{chart-sankey-DKnTIvSr.js.map → chart-sankey-CFXPybny.js.map} +1 -1
  196. package/dist/client/chunks/{chart-scatter-CSWF6-lx.js → chart-scatter-CH82md0L.js} +3 -3
  197. package/dist/client/chunks/{chart-scatter-CSWF6-lx.js.map → chart-scatter-CH82md0L.js.map} +1 -1
  198. package/dist/client/chunks/{chart-sunburst-CdGzCq7q.js → chart-sunburst-CTj95eEC.js} +3 -3
  199. package/dist/client/chunks/{chart-sunburst-CdGzCq7q.js.map → chart-sunburst-CTj95eEC.js.map} +1 -1
  200. package/dist/client/chunks/{chart-tree-map-BiXB7EiM.js → chart-tree-map-CmysE4bF.js} +3 -3
  201. package/dist/client/chunks/{chart-tree-map-BiXB7EiM.js.map → chart-tree-map-CmysE4bF.js.map} +1 -1
  202. package/dist/client/chunks/{chart-waterfall-5rSDeLEZ.js → chart-waterfall-Bv1mPvlB.js} +3 -3
  203. package/dist/client/chunks/{chart-waterfall-5rSDeLEZ.js.map → chart-waterfall-Bv1mPvlB.js.map} +1 -1
  204. package/dist/client/chunks/{charts-core-CKpkoMCa.js → charts-core-BdEQgbqN.js} +2 -2
  205. package/dist/client/chunks/{charts-core-CKpkoMCa.js.map → charts-core-BdEQgbqN.js.map} +1 -1
  206. package/dist/client/chunks/charts-loader-DoLQqFXg.js +87 -0
  207. package/dist/client/chunks/{charts-loader-BTI0UPK4.js.map → charts-loader-DoLQqFXg.js.map} +1 -1
  208. package/dist/client/chunks/gapFilling-DKBRHcQL.js +391 -0
  209. package/dist/client/chunks/gapFilling-DKBRHcQL.js.map +1 -0
  210. package/dist/client/chunks/{nl-NL-kRjxedTf.js → nl-NL-DVZXf8U7.js} +20 -2
  211. package/dist/client/chunks/nl-NL-DVZXf8U7.js.map +1 -0
  212. package/dist/client/chunks/{schema-visualization-BbvL74Sf.js → schema-visualization-MlRrcJQH.js} +3 -3
  213. package/dist/client/chunks/{schema-visualization-BbvL74Sf.js.map → schema-visualization-MlRrcJQH.js.map} +1 -1
  214. package/dist/client/chunks/{useDirtyStateTracking-BfG1lX_3.js → useDirtyStateTracking-DSkxAJ29.js} +317 -292
  215. package/dist/client/chunks/useDirtyStateTracking-DSkxAJ29.js.map +1 -0
  216. package/dist/client/chunks/{useExplainAI-CDFhgmpE.js → useExplainAI-DRCIVcbu.js} +4 -4
  217. package/dist/client/chunks/{useExplainAI-CDFhgmpE.js.map → useExplainAI-DRCIVcbu.js.map} +1 -1
  218. package/dist/client/chunks/utils-CToHkuhU.js.map +1 -1
  219. package/dist/client/chunks/{vendor-DeckzF1j.js → vendor-BfBpNmMa.js} +2 -2
  220. package/dist/client/chunks/{vendor-DeckzF1j.js.map → vendor-BfBpNmMa.js.map} +1 -1
  221. package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +5 -0
  222. package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +3 -1
  223. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -0
  224. package/dist/client/components.js +2 -2
  225. package/dist/client/hooks/queries/useCubeLoadQuery.d.ts +7 -0
  226. package/dist/client/hooks/queries/useMultiCubeLoadQuery.d.ts +7 -0
  227. package/dist/client/hooks/useAnalysisQuery.d.ts +6 -1
  228. package/dist/client/hooks.js +3 -3
  229. package/dist/client/icons.js +1 -1
  230. package/dist/client/index.d.ts +2 -0
  231. package/dist/client/index.js +193 -192
  232. package/dist/client/index.js.map +1 -1
  233. package/dist/client/providers.js +1 -1
  234. package/dist/client/schema.js +1 -1
  235. package/dist/client/types.d.ts +3 -0
  236. package/dist/client/utils/filterUtils.d.ts +30 -0
  237. package/dist/client/utils/gapFilling.d.ts +52 -0
  238. package/dist/client/utils/index.d.ts +1 -0
  239. package/dist/client/utils/joinReachability.d.ts +1 -0
  240. package/dist/client/utils.js +9 -8
  241. package/dist/client/utils.js.map +1 -1
  242. package/dist/client-bundle-stats.html +1 -1
  243. package/dist/mcp-app/mcp-app.html +103 -103
  244. package/dist/server/ai/query-schema.d.ts +8 -3
  245. package/dist/server/builders/date-time-builder.d.ts +1 -1
  246. package/dist/server/builders/date-time-helpers.d.ts +2 -0
  247. package/dist/server/builders/filter-builder.d.ts +1 -1
  248. package/dist/server/builders/in-date-range-validation.d.ts +25 -0
  249. package/dist/server/chartConfigHelpers-BhME7ow_.cjs +1 -0
  250. package/dist/server/{chartConfigHelpers-BsnbxA2c.js → chartConfigHelpers-BsviVhEw.js} +27 -7
  251. package/dist/server/execution/result-post-processor.d.ts +4 -2
  252. package/dist/server/executor.d.ts +2 -0
  253. package/dist/server/gap-filler.d.ts +8 -43
  254. package/dist/server/index.cjs +49 -47
  255. package/dist/server/index.js +2114 -1955
  256. package/dist/server/types/core.d.ts +2 -0
  257. package/dist/server/types/cube.d.ts +12 -0
  258. package/dist/server/types/metadata.d.ts +5 -0
  259. package/dist/server/types/query.d.ts +2 -1
  260. package/package.json +2 -1
  261. package/dist/adapters/ActivityGridChart.config-BW77mjsu.cjs +0 -1
  262. package/dist/adapters/ActivityGridChart.config-DQRnTU6e.js +0 -2
  263. package/dist/adapters/AreaChart.config-DbvLVr-Y.cjs +0 -1
  264. package/dist/adapters/AreaChart.config-JbVNmary.js +0 -2
  265. package/dist/adapters/BarChart.config-Bkpwgqbk.js +0 -2
  266. package/dist/adapters/BarChart.config-jgDE3NUv.cjs +0 -1
  267. package/dist/adapters/BoxPlotChart.config-9wKKOZfN.cjs +0 -1
  268. package/dist/adapters/BoxPlotChart.config-Di99sPNJ.js +0 -2
  269. package/dist/adapters/BubbleChart.config-Cdg9nPFz.js +0 -2
  270. package/dist/adapters/BubbleChart.config-CwDXzdxC.cjs +0 -1
  271. package/dist/adapters/CandlestickChart.config-B45GmJYV.js +0 -2
  272. package/dist/adapters/CandlestickChart.config-C8BXzmbD.cjs +0 -1
  273. package/dist/adapters/DataTable.config-c-24M_qU.cjs +0 -1
  274. package/dist/adapters/DataTable.config-fic2OroS.js +0 -2
  275. package/dist/adapters/DotStripChart.config-BcNT3Les.cjs +0 -1
  276. package/dist/adapters/DotStripChart.config-Cqmgw5_z.js +0 -2
  277. package/dist/adapters/FunnelChart.config-D1E5zSay.cjs +0 -1
  278. package/dist/adapters/FunnelChart.config-DPjSoYex.js +0 -2
  279. package/dist/adapters/GaugeChart.config-BDcvnYln.js +0 -2
  280. package/dist/adapters/GaugeChart.config-DQnx37Jf.cjs +0 -1
  281. package/dist/adapters/HeatMapChart.config-BWd863ik.js +0 -2
  282. package/dist/adapters/HeatMapChart.config-HEbSm_Zt.cjs +0 -1
  283. package/dist/adapters/KpiDelta.config-Bj3kfmWv.js +0 -2
  284. package/dist/adapters/KpiDelta.config-CaLnl2w_.cjs +0 -1
  285. package/dist/adapters/KpiNumber.config-Da9HxGT8.cjs +0 -1
  286. package/dist/adapters/KpiNumber.config-n4SwHHlD.js +0 -2
  287. package/dist/adapters/KpiText.config-8VzcnlPF.cjs +0 -1
  288. package/dist/adapters/KpiText.config-CItv_gG6.js +0 -2
  289. package/dist/adapters/LineChart.config-DQ7nHYrr.js +0 -2
  290. package/dist/adapters/LineChart.config-_98RmRA_.cjs +0 -1
  291. package/dist/adapters/MarkdownChart.config-BpbqJDoz.cjs +0 -1
  292. package/dist/adapters/MarkdownChart.config-Dz7KZ621.js +0 -2
  293. package/dist/adapters/MeasureProfileChart.config-BTCTP7L0.js +0 -2
  294. package/dist/adapters/MeasureProfileChart.config-DzPxIxB5.cjs +0 -1
  295. package/dist/adapters/PieChart.config-BhjlnVFv.js +0 -2
  296. package/dist/adapters/PieChart.config-DJlGNsBY.cjs +0 -1
  297. package/dist/adapters/ProportionBarChart.config-Byp_8diR.cjs +0 -1
  298. package/dist/adapters/ProportionBarChart.config-RyjNhw3T.js +0 -2
  299. package/dist/adapters/RadarChart.config-BWdv4uyp.js +0 -2
  300. package/dist/adapters/RadarChart.config-kW4oIVi4.cjs +0 -1
  301. package/dist/adapters/RadialBarChart.config-CFYPoRQY.cjs +0 -1
  302. package/dist/adapters/RadialBarChart.config-D2-_-Z64.js +0 -2
  303. package/dist/adapters/RecordsTable.config-B7KFt3kd.cjs +0 -1
  304. package/dist/adapters/RecordsTable.config-S_aiXGKe.js +0 -2
  305. package/dist/adapters/RetentionCombinedChart.config-CVGWozL3.js +0 -2
  306. package/dist/adapters/RetentionCombinedChart.config-Cd0pTdHY.cjs +0 -1
  307. package/dist/adapters/RetentionHeatmap.config-BNqtWFjQ.js +0 -2
  308. package/dist/adapters/RetentionHeatmap.config-CMi1h_5M.cjs +0 -1
  309. package/dist/adapters/SankeyChart.config-COIfx3Ua.cjs +0 -1
  310. package/dist/adapters/SankeyChart.config-DIh4nEk2.js +0 -2
  311. package/dist/adapters/ScatterChart.config-CrSQhlT4.js +0 -2
  312. package/dist/adapters/ScatterChart.config-DRgg-HAm.cjs +0 -1
  313. package/dist/adapters/SunburstChart.config-08-ufQaK.cjs +0 -1
  314. package/dist/adapters/SunburstChart.config-DmNgAJrO.js +0 -2
  315. package/dist/adapters/TreeMapChart.config-7k2repRB.cjs +0 -1
  316. package/dist/adapters/TreeMapChart.config-C3vzB2dD.js +0 -2
  317. package/dist/adapters/WaterfallChart.config-AV2pHgrb.js +0 -2
  318. package/dist/adapters/WaterfallChart.config-USpcvapo.cjs +0 -1
  319. package/dist/adapters/chartConfigHelpers-BZMu_1EP.cjs +0 -1
  320. package/dist/adapters/compiler-BX6Ug_Uq.cjs +0 -166
  321. package/dist/adapters/handler-CfZt5W8b.cjs +0 -16
  322. package/dist/adapters/mcp-app-html-BNg78ecJ.js +0 -5
  323. package/dist/adapters/mcp-app-html-N18EJEvv.cjs +0 -1
  324. package/dist/adapters/utils-Du_UZbn5.cjs +0 -139
  325. package/dist/client/chunks/DashboardEditModal-P-HUNrcp.js.map +0 -1
  326. package/dist/client/chunks/analysis-builder-shared-DBSxWIj8.js.map +0 -1
  327. package/dist/client/chunks/chart-activity-grid-DGazwi4C.js.map +0 -1
  328. package/dist/client/chunks/chart-config-area-DsrZCIwF.js.map +0 -1
  329. package/dist/client/chunks/chart-config-bar-BixSs43E.js.map +0 -1
  330. package/dist/client/chunks/chart-config-line-CBF9Px9b.js.map +0 -1
  331. package/dist/client/chunks/charts-loader-BTI0UPK4.js +0 -87
  332. package/dist/client/chunks/nl-NL-kRjxedTf.js.map +0 -1
  333. package/dist/client/chunks/useDirtyStateTracking-BfG1lX_3.js.map +0 -1
  334. package/dist/server/chartConfigHelpers-BZMu_1EP.cjs +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart-kpi-text-D3HqxXzU.js","names":["__exportAll","useTranslation","useCubeFieldLabel","DataHistogram","React","extractValueFields","yAxis","extractValues","data","row","valueField","availableFields","val","computeKpiStats","numericValues","values","acc","formatKpiNumber","options","value","decimals","abs","processKpiTemplate","ctx","templateVars","formatNumber","min","max","template","varName","match","resolveValueColor","valueColorIndex","colorPalette","KpiText_exports","KpiText","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","textRef","getFieldLabel","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","textRect","timer","resizeObserver","chartConfig","height","t","valueFields","displayConfig","displayText","mainValue","valueColor","showStats"],"sources":["../../../src/client/components/charts/kpiTextHelpers.ts","../../../src/client/components/charts/KpiText.tsx"],"sourcesContent":["import type { ColorPalette } from '../../types.js'\n\n/**\n * Co-located pure helpers for KpiText: value extraction, statistics, number\n * formatting, template processing, and colour resolution. Extracted so the\n * component body stays focused on dimensioning + render. Pure extraction — no\n * behaviour change.\n */\n\n/** Extract the configured measure fields from a chart config (string or array). */\nexport function extractValueFields(yAxis: string | string[] | undefined): string[] {\n if (!yAxis) return []\n if (typeof yAxis === 'string') return [yAxis]\n if (Array.isArray(yAxis)) return yAxis\n return []\n}\n\n/**\n * Extract the values for a field from each row, falling back to the first\n * available field when the configured field is absent. Null/undefined dropped.\n */\nexport function extractValues(data: Record<string, any>[], valueField: string): any[] {\n return data\n .map(row => {\n if (row[valueField] !== undefined) return row[valueField]\n const availableFields = Object.keys(row)\n if (availableFields.length > 0) return row[availableFields[0]]\n return undefined\n })\n .filter(val => val !== null && val !== undefined)\n}\n\nexport interface KpiStats {\n mainValue: any\n min: number | null\n max: number | null\n showStats: boolean\n}\n\n/**\n * Reduce extracted values to the displayed main value plus optional min/max\n * statistics. Numeric multi-value sets average and expose min/max; non-numeric\n * sets concatenate.\n */\nexport function computeKpiStats(values: any[]): KpiStats {\n const numericValues = values.map(val => Number(val)).filter(val => !isNaN(val))\n\n if (numericValues.length > 0) {\n if (values.length === 1) {\n return { mainValue: values[0], min: null, max: null, showStats: false }\n }\n const sum = numericValues.reduce((acc, val) => acc + val, 0)\n return {\n mainValue: sum / numericValues.length,\n min: Math.min(...numericValues),\n max: Math.max(...numericValues),\n showStats: true\n }\n }\n\n return {\n mainValue: values.length === 1 ? values[0] : values.join(', '),\n min: null,\n max: null,\n showStats: false\n }\n}\n\ninterface NumberFormatOptions {\n formatValue?: (value: any) => string\n decimals?: number\n}\n\n/** Format a number with K/M/B abbreviation, honouring a custom formatter. */\nexport function formatKpiNumber(value: number | null | undefined, options: NumberFormatOptions): string {\n if (options.formatValue) {\n return options.formatValue(value)\n }\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = options.decimals ?? 2\n const abs = Math.abs(value)\n if (abs >= 1e9) return (value / 1e9).toFixed(decimals) + 'B'\n if (abs >= 1e6) return (value / 1e6).toFixed(decimals) + 'M'\n if (abs >= 1e3) return (value / 1e3).toFixed(decimals) + 'K'\n return value.toFixed(decimals)\n}\n\ninterface TemplateContext {\n value: any\n valueField: string\n fieldLabel: string\n min: number | null\n max: number | null\n count: number\n formatNumber: (value: number | null | undefined) => string\n}\n\n/** Replace `${var}` tokens in a KPI template, falling back to the raw value. */\nexport function processKpiTemplate(template: string, ctx: TemplateContext): string {\n const { value, valueField, fieldLabel, min, max, count, formatNumber } = ctx\n try {\n const templateVars = {\n value: typeof value === 'number' ? formatNumber(value) : String(value),\n rawValue: value,\n field: valueField,\n fieldLabel,\n min: min !== null ? formatNumber(min) : '',\n max: max !== null ? formatNumber(max) : '',\n count\n }\n return template.replace(/\\$\\{(\\w+)\\}/g, (match, varName) => {\n if (varName in templateVars) {\n return String(templateVars[varName as keyof typeof templateVars])\n }\n return match\n })\n } catch {\n return String(value)\n }\n}\n\n/** Resolve the KPI text colour from the palette by index, with a fallback. */\nexport function resolveValueColor(\n valueColorIndex: number | undefined,\n colorPalette: ColorPalette | undefined\n): string {\n if (valueColorIndex !== undefined && colorPalette?.colors) {\n if (valueColorIndex >= 0 && valueColorIndex < colorPalette.colors.length) {\n return colorPalette.colors[valueColorIndex]\n }\n }\n return colorPalette?.colors?.[0] || '#1f2937'\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport DataHistogram from '../DataHistogram.js'\nimport {\n extractValueFields,\n extractValues,\n computeKpiStats,\n formatKpiNumber,\n processKpiTemplate,\n resolveValueColor\n} from './kpiTextHelpers.js'\nimport type { ChartProps } from '../../types.js'\n\nconst KpiText = React.memo(function KpiText({\n data,\n chartConfig,\n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [fontSize, setFontSize] = useState(28)\n const [textWidth, setTextWidth] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const textRef = useRef<HTMLDivElement>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n \n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI Text displays, text might be longer so use more conservative sizing\n // Also reserve space for potential statistics display\n const widthBasedSize = containerWidth / 8\n const heightBasedSize = containerHeight / 5\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(18, Math.min(baseFontSize, 80))\n setFontSize(clampedFontSize)\n }\n }\n \n // Measure the text width after font size is set\n if (textRef.current) {\n const textRect = textRef.current.getBoundingClientRect()\n setTextWidth(textRect.width)\n }\n }\n\n // Initial calculation after a short delay to ensure the container is fully rendered\n const timer = setTimeout(updateDimensions, 100)\n \n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n clearTimeout(timer)\n setTimeout(updateDimensions, 50)\n })\n \n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\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.kpi')}</div>\n </div>\n </div>\n )\n }\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = extractValueFields(chartConfig?.yAxis)\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"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\">{t('chart.runtime.configErrorHint.noMeasures')}</div>\n </div>\n </div>\n )\n }\n\n const valueField = valueFields[0] // Use first measure field\n\n // Extract values for the selected field\n const values = extractValues(data as Record<string, any>[], valueField)\n\n if (values.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-warning-bg)',\n color: 'var(--dc-warning)',\n borderColor: 'var(--dc-warning-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noValidData')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.noValidDataHint.kpiText')}</div>\n </div>\n </div>\n )\n }\n\n // Calculate statistics for numeric values\n const { mainValue, min, max, showStats } = computeKpiStats(values)\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string =>\n formatKpiNumber(value, { formatValue: displayConfig.formatValue, decimals: displayConfig.decimals })\n\n const template = displayConfig.template || '${fieldLabel}: ${value}'\n const displayText = processKpiTemplate(template, {\n value: mainValue,\n valueField,\n fieldLabel: getFieldLabel(valueField),\n min,\n max,\n count: values.length,\n formatNumber\n })\n\n // Get color from palette by index, default to first color in palette\n const valueColor = resolveValueColor(displayConfig.valueColorIndex, colorPalette)\n\n return (\n <div \n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Main KPI Text */}\n <div \n ref={textRef}\n className=\"dc:font-bold dc:leading-tight dc:text-center\"\n style={{ \n fontSize: `${fontSize}px`,\n color: valueColor \n }}\n >\n {displayText}\n </div>\n\n {/* Data Histogram for multiple values */}\n {showStats && min !== null && max !== null && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth || 200}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiText"],"mappings":"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"}
1
+ {"version":3,"file":"chart-kpi-text-D8oQgpxL.js","names":["__exportAll","useTranslation","useCubeFieldLabel","DataHistogram","React","extractValueFields","yAxis","extractValues","data","row","valueField","availableFields","val","computeKpiStats","numericValues","values","acc","formatKpiNumber","options","value","decimals","abs","processKpiTemplate","ctx","templateVars","formatNumber","min","max","template","varName","match","resolveValueColor","valueColorIndex","colorPalette","KpiText_exports","KpiText","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","textRef","getFieldLabel","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","textRect","timer","resizeObserver","chartConfig","height","t","valueFields","displayConfig","displayText","mainValue","valueColor","showStats"],"sources":["../../../src/client/components/charts/kpiTextHelpers.ts","../../../src/client/components/charts/KpiText.tsx"],"sourcesContent":["import type { ColorPalette } from '../../types.js'\n\n/**\n * Co-located pure helpers for KpiText: value extraction, statistics, number\n * formatting, template processing, and colour resolution. Extracted so the\n * component body stays focused on dimensioning + render. Pure extraction — no\n * behaviour change.\n */\n\n/** Extract the configured measure fields from a chart config (string or array). */\nexport function extractValueFields(yAxis: string | string[] | undefined): string[] {\n if (!yAxis) return []\n if (typeof yAxis === 'string') return [yAxis]\n if (Array.isArray(yAxis)) return yAxis\n return []\n}\n\n/**\n * Extract the values for a field from each row, falling back to the first\n * available field when the configured field is absent. Null/undefined dropped.\n */\nexport function extractValues(data: Record<string, any>[], valueField: string): any[] {\n return data\n .map(row => {\n if (row[valueField] !== undefined) return row[valueField]\n const availableFields = Object.keys(row)\n if (availableFields.length > 0) return row[availableFields[0]]\n return undefined\n })\n .filter(val => val !== null && val !== undefined)\n}\n\nexport interface KpiStats {\n mainValue: any\n min: number | null\n max: number | null\n showStats: boolean\n}\n\n/**\n * Reduce extracted values to the displayed main value plus optional min/max\n * statistics. Numeric multi-value sets average and expose min/max; non-numeric\n * sets concatenate.\n */\nexport function computeKpiStats(values: any[]): KpiStats {\n const numericValues = values.map(val => Number(val)).filter(val => !isNaN(val))\n\n if (numericValues.length > 0) {\n if (values.length === 1) {\n return { mainValue: values[0], min: null, max: null, showStats: false }\n }\n const sum = numericValues.reduce((acc, val) => acc + val, 0)\n return {\n mainValue: sum / numericValues.length,\n min: Math.min(...numericValues),\n max: Math.max(...numericValues),\n showStats: true\n }\n }\n\n return {\n mainValue: values.length === 1 ? values[0] : values.join(', '),\n min: null,\n max: null,\n showStats: false\n }\n}\n\ninterface NumberFormatOptions {\n formatValue?: (value: any) => string\n decimals?: number\n}\n\n/** Format a number with K/M/B abbreviation, honouring a custom formatter. */\nexport function formatKpiNumber(value: number | null | undefined, options: NumberFormatOptions): string {\n if (options.formatValue) {\n return options.formatValue(value)\n }\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = options.decimals ?? 2\n const abs = Math.abs(value)\n if (abs >= 1e9) return (value / 1e9).toFixed(decimals) + 'B'\n if (abs >= 1e6) return (value / 1e6).toFixed(decimals) + 'M'\n if (abs >= 1e3) return (value / 1e3).toFixed(decimals) + 'K'\n return value.toFixed(decimals)\n}\n\ninterface TemplateContext {\n value: any\n valueField: string\n fieldLabel: string\n min: number | null\n max: number | null\n count: number\n formatNumber: (value: number | null | undefined) => string\n}\n\n/** Replace `${var}` tokens in a KPI template, falling back to the raw value. */\nexport function processKpiTemplate(template: string, ctx: TemplateContext): string {\n const { value, valueField, fieldLabel, min, max, count, formatNumber } = ctx\n try {\n const templateVars = {\n value: typeof value === 'number' ? formatNumber(value) : String(value),\n rawValue: value,\n field: valueField,\n fieldLabel,\n min: min !== null ? formatNumber(min) : '',\n max: max !== null ? formatNumber(max) : '',\n count\n }\n return template.replace(/\\$\\{(\\w+)\\}/g, (match, varName) => {\n if (varName in templateVars) {\n return String(templateVars[varName as keyof typeof templateVars])\n }\n return match\n })\n } catch {\n return String(value)\n }\n}\n\n/** Resolve the KPI text colour from the palette by index, with a fallback. */\nexport function resolveValueColor(\n valueColorIndex: number | undefined,\n colorPalette: ColorPalette | undefined\n): string {\n if (valueColorIndex !== undefined && colorPalette?.colors) {\n if (valueColorIndex >= 0 && valueColorIndex < colorPalette.colors.length) {\n return colorPalette.colors[valueColorIndex]\n }\n }\n return colorPalette?.colors?.[0] || '#1f2937'\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport DataHistogram from '../DataHistogram.js'\nimport {\n extractValueFields,\n extractValues,\n computeKpiStats,\n formatKpiNumber,\n processKpiTemplate,\n resolveValueColor\n} from './kpiTextHelpers.js'\nimport type { ChartProps } from '../../types.js'\n\nconst KpiText = React.memo(function KpiText({\n data,\n chartConfig,\n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [fontSize, setFontSize] = useState(28)\n const [textWidth, setTextWidth] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const textRef = useRef<HTMLDivElement>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n \n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI Text displays, text might be longer so use more conservative sizing\n // Also reserve space for potential statistics display\n const widthBasedSize = containerWidth / 8\n const heightBasedSize = containerHeight / 5\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(18, Math.min(baseFontSize, 80))\n setFontSize(clampedFontSize)\n }\n }\n \n // Measure the text width after font size is set\n if (textRef.current) {\n const textRect = textRef.current.getBoundingClientRect()\n setTextWidth(textRect.width)\n }\n }\n\n // Initial calculation after a short delay to ensure the container is fully rendered\n const timer = setTimeout(updateDimensions, 100)\n \n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n clearTimeout(timer)\n setTimeout(updateDimensions, 50)\n })\n \n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\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.kpi')}</div>\n </div>\n </div>\n )\n }\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = extractValueFields(chartConfig?.yAxis)\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"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\">{t('chart.runtime.configErrorHint.noMeasures')}</div>\n </div>\n </div>\n )\n }\n\n const valueField = valueFields[0] // Use first measure field\n\n // Extract values for the selected field\n const values = extractValues(data as Record<string, any>[], valueField)\n\n if (values.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-warning-bg)',\n color: 'var(--dc-warning)',\n borderColor: 'var(--dc-warning-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noValidData')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.noValidDataHint.kpiText')}</div>\n </div>\n </div>\n )\n }\n\n // Calculate statistics for numeric values\n const { mainValue, min, max, showStats } = computeKpiStats(values)\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string =>\n formatKpiNumber(value, { formatValue: displayConfig.formatValue, decimals: displayConfig.decimals })\n\n const template = displayConfig.template || '${fieldLabel}: ${value}'\n const displayText = processKpiTemplate(template, {\n value: mainValue,\n valueField,\n fieldLabel: getFieldLabel(valueField),\n min,\n max,\n count: values.length,\n formatNumber\n })\n\n // Get color from palette by index, default to first color in palette\n const valueColor = resolveValueColor(displayConfig.valueColorIndex, colorPalette)\n\n return (\n <div \n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Main KPI Text */}\n <div \n ref={textRef}\n className=\"dc:font-bold dc:leading-tight dc:text-center\"\n style={{ \n fontSize: `${fontSize}px`,\n color: valueColor \n }}\n >\n {displayText}\n </div>\n\n {/* Data Histogram for multiple values */}\n {showStats && min !== null && max !== null && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth || 200}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiText"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
- import { F as t, S as n } from "./chart-activity-grid-DGazwi4C.js";
3
- import { A as ee, D as r, E as i, M as te, O as a, S as ne, _ as o, a as s, b as c, c as l, d as u, f as d, g as f, h as p, i as m, j as re, k as h, l as ie, m as g, o as _, p as v, r as y, u as b, v as x, x as S, y as ae } from "./chart-area-zyLGD-ym.js";
2
+ import { F as t, S as n } from "./chart-activity-grid-Ly_-2B-f.js";
3
+ import { A as ee, D as r, E as i, M as te, O as a, S as ne, _ as o, a as s, b as c, c as l, d as u, f as d, g as f, h as p, i as m, j as re, k as h, l as ie, m as g, o as _, p as v, r as y, u as b, v as x, x as S, y as ae } from "./chart-area-D3l-71Wy.js";
4
4
  import C, { useMemo as w, useState as T } from "react";
5
5
  import { jsx as E, jsxs as D } from "react/jsx-runtime";
6
6
  import { CartesianGrid as O, LineChart as k, XAxis as A } from "recharts";
@@ -114,4 +114,4 @@ var j = /* @__PURE__ */ e({ default: () => M }), M = C.memo(function({ data: e,
114
114
  //#endregion
115
115
  export { j as n, M as t };
116
116
 
117
- //# sourceMappingURL=chart-line-IEgiF8Nv.js.map
117
+ //# sourceMappingURL=chart-line-BNqjUowg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-line-IEgiF8Nv.js","names":["LineChart","RechartsLineChart","__exportAll","useTranslation","useCubeFieldLabel","AngledXAxisTick","ChartConfigError","resolveChartAxisFields","ChartContainer","ChartEmptyState","withTargetData","makeCartesianTooltipFormatter","buildTimeSeriesData","renderHoverLegend","isTimeOrderedXAxis","makeComparisonTickFormatter","makeSeriesKeyResolver","getYAxisChartMargins","getPlotLeftOffset","buildSeriesKeyToFieldMap","ChartTooltip","ChartRenderError","makeAxisResolver","getDualAxisInfo","computeSeriesSummaries","renderLineSeries","ChartSummaryHeader","makeComparisonLabelFormatter","renderChartTargetLines","resolveAngledAxisHeight","renderDualYAxes","React","LineChart_exports","LineChart$1","hoveredLegend","setHoveredLegend","useState","getFieldLabel","resolvedXAxisField","useMemo","chartConfig","yAxisAssignment","seriesKeyToField","yAxisFields","safeDisplayConfig","displayConfig","showAllXLabels","leftYAxisFormat","rightYAxisFormat","data","t","errorCode","xAxisField","priorPeriodStyle","priorPeriodOpacity","findFieldFromSeriesKey","axisInfo","showSummary","seriesKeys","summaries","chartData","colorPalette","hasComparisonData","effectiveXAxisKey","showLegend","chartMargins","hasRightAxis","seriesKey","queryObject","height","LineChart","enhancedChartData","CartesianGrid","XAxis","row","spreadTargets","error"],"sources":["../../../src/client/components/charts/LineChart.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { LineChart as RechartsLineChart, XAxis, CartesianGrid } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport AngledXAxisTick from './AngledXAxisTick.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { resolveChartAxisFields } from './chartAxisResolution.js'\nimport {\n getDualAxisInfo,\n getYAxisChartMargins,\n resolveAngledAxisHeight,\n getPlotLeftOffset,\n withTargetData,\n renderDualYAxes,\n renderChartTargetLines,\n makeCartesianTooltipFormatter,\n renderHoverLegend\n} from './chartScaffolding.js'\nimport {\n makeComparisonTickFormatter,\n makeComparisonLabelFormatter,\n buildSeriesKeyToFieldMap,\n makeSeriesKeyResolver,\n buildTimeSeriesData,\n computeSeriesSummaries,\n makeAxisResolver,\n isTimeOrderedXAxis,\n renderLineSeries\n} from './cartesianChartHelpers.js'\nimport ChartSummaryHeader from './ChartSummaryHeader.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps } from '../../types.js'\n\nconst LineChart = React.memo(function LineChart({\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 // xAxisField is aliased; it is narrowed to a definite string after the\n // errorCode guard inside the render body below.\n const { xAxisField: resolvedXAxisField, yAxisFields, seriesFields, errorCode } = useMemo(\n () => resolveChartAxisFields(chartConfig),\n [chartConfig]\n )\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig (memoized to prevent object recreation)\n // MUST be called before any early returns to satisfy React hooks rules\n const yAxisAssignment = useMemo(() =>\n chartConfig?.yAxisAssignment || {},\n [chartConfig?.yAxisAssignment]\n )\n\n // Build mapping from series key (label) to original field name (memoized to prevent object recreation)\n // This is needed because seriesKeys use display labels, not field names\n // MUST be called before any early returns to satisfy React hooks rules\n const seriesKeyToField = useMemo(\n () => buildSeriesKeyToFieldMap(yAxisFields, getFieldLabel),\n [yAxisFields, getFieldLabel]\n )\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n const showAllXLabels = displayConfig?.showAllXLabels ?? false\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.line')} />\n }\n\n if (errorCode) {\n return <ChartConfigError height={height} hint={t(`chart.runtime.configErrorHint.${errorCode}`)} />\n }\n\n // The errorCode guard above guarantees xAxisField is defined here\n const xAxisField = resolvedXAxisField as string\n\n const priorPeriodStyle = displayConfig?.priorPeriodStyle || 'dashed'\n const priorPeriodOpacity = displayConfig?.priorPeriodOpacity ?? 0.5\n\n // Shape data (comparison overlay vs standard transform) via shared helper.\n const { chartData, seriesKeys, effectiveXAxisKey, hasComparisonData, periodLabels } =\n buildTimeSeriesData({ data, xAxisField, yAxisFields, seriesFields, queryObject, getFieldLabel })\n\n // Resolve series key → measure field, handling comparison suffixes\n // (\"(Current)\"/\"(Prior)\") and dimension prefixes (\"DimValue - Label\").\n const findFieldFromSeriesKey = makeSeriesKeyResolver(seriesKeyToField)\n\n // Dual Y-axis derivation + margins (shared scaffolding)\n const axisInfo = getDualAxisInfo(yAxisFields, yAxisAssignment)\n const { hasRightAxis } = axisInfo\n\n // Summary header: per-series current value + change since the start of the\n // window, derived from the data already fetched for the plot.\n const showSummary = displayConfig?.showSummary === true && seriesKeys.length > 0\n const summaries = showSummary\n ? computeSeriesSummaries(\n chartData,\n seriesKeys,\n colorPalette,\n makeAxisResolver(findFieldFromSeriesKey, yAxisAssignment),\n // In comparison mode the x key is a day index, which would read as\n // \"since 0\"; fall back to the generic wording there.\n hasComparisonData ? undefined : effectiveXAxisKey\n )\n : []\n\n // The summary carries the colour dots, so the bottom legend becomes redundant.\n const showLegend = safeDisplayConfig.showLegend && !showSummary\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = getYAxisChartMargins(hasRightAxis)\n\n // Process target values and add to chart data\n const { spreadTargets, enhancedChartData } = withTargetData(chartData, displayConfig?.target)\n\n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for line chart after transformation\"\n />\n )\n }\n\n return (\n <div className=\"dc:relative dc:w-full dc:flex dc:flex-col\" style={{ height }}>\n {showSummary && (\n <ChartSummaryHeader\n summaries={summaries}\n getSeriesLabel={(seriesKey) => seriesKey}\n valueFormat={leftYAxisFormat}\n rightValueFormat={rightYAxisFormat}\n showChange={isTimeOrderedXAxis(queryObject, xAxisField)}\n leftOffset={getPlotLeftOffset(hasRightAxis)}\n />\n )}\n {/* The header wraps, so its height is not knowable up front. Give the\n plot the remaining flex space rather than subtracting a constant\n that silently drifts out of sync once the header wraps. */}\n <div className={showSummary ? 'dc:flex-1 dc:min-h-0' : 'dc:contents'}>\n <ChartContainer height={showSummary ? '100%' : height} minHeight={showSummary ? 0 : undefined}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n )}\n <XAxis\n dataKey={effectiveXAxisKey}\n type=\"category\"\n tick={<AngledXAxisTick tickFormatter={\n makeComparisonTickFormatter(hasComparisonData, chartData, queryObject, xAxisField)\n } />}\n height={resolveAngledAxisHeight(enhancedChartData.map((row: any) => row?.[effectiveXAxisKey]))}\n interval={showAllXLabels ? 0 : undefined}\n />\n {renderDualYAxes(axisInfo, getFieldLabel, leftYAxisFormat, rightYAxisFormat)}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={makeCartesianTooltipFormatter({\n leftYAxisFormat,\n rightYAxisFormat,\n yAxisAssignment,\n resolveField: findFieldFromSeriesKey\n })}\n labelFormatter={\n makeComparisonLabelFormatter(hasComparisonData, queryObject, xAxisField)\n }\n />\n )}\n {renderHoverLegend({\n show: showLegend,\n iconType: 'line',\n paddingTop: 25,\n onHover: setHoveredLegend,\n onLeave: () => setHoveredLegend(null)\n })}\n {renderLineSeries({\n seriesKeys,\n colorPalette,\n resolveField: findFieldFromSeriesKey,\n yAxisAssignment,\n hoveredLegend,\n connectNulls: safeDisplayConfig.connectNulls,\n showPoints: displayConfig?.showPoints ?? true,\n drillEnabled,\n onDataPointClick,\n hasComparisonData,\n periodLabels,\n priorPeriodStyle,\n priorPeriodOpacity\n })}\n {renderChartTargetLines(spreadTargets)}\n </RechartsLineChart>\n </ChartContainer>\n </div>\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Line Chart\" error={error} />\n }\n})\n\nexport default LineChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-line-BNqjUowg.js","names":["LineChart","RechartsLineChart","__exportAll","useTranslation","useCubeFieldLabel","AngledXAxisTick","ChartConfigError","resolveChartAxisFields","ChartContainer","ChartEmptyState","withTargetData","makeCartesianTooltipFormatter","buildTimeSeriesData","renderHoverLegend","isTimeOrderedXAxis","makeComparisonTickFormatter","makeSeriesKeyResolver","getYAxisChartMargins","getPlotLeftOffset","buildSeriesKeyToFieldMap","ChartTooltip","ChartRenderError","makeAxisResolver","getDualAxisInfo","computeSeriesSummaries","renderLineSeries","ChartSummaryHeader","makeComparisonLabelFormatter","renderChartTargetLines","resolveAngledAxisHeight","renderDualYAxes","React","LineChart_exports","LineChart$1","hoveredLegend","setHoveredLegend","useState","getFieldLabel","resolvedXAxisField","useMemo","chartConfig","yAxisAssignment","seriesKeyToField","yAxisFields","safeDisplayConfig","displayConfig","showAllXLabels","leftYAxisFormat","rightYAxisFormat","data","t","errorCode","xAxisField","priorPeriodStyle","priorPeriodOpacity","findFieldFromSeriesKey","axisInfo","showSummary","seriesKeys","summaries","chartData","colorPalette","hasComparisonData","effectiveXAxisKey","showLegend","chartMargins","hasRightAxis","seriesKey","queryObject","height","LineChart","enhancedChartData","CartesianGrid","XAxis","row","spreadTargets","error"],"sources":["../../../src/client/components/charts/LineChart.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { LineChart as RechartsLineChart, XAxis, CartesianGrid } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport AngledXAxisTick from './AngledXAxisTick.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { resolveChartAxisFields } from './chartAxisResolution.js'\nimport {\n getDualAxisInfo,\n getYAxisChartMargins,\n resolveAngledAxisHeight,\n getPlotLeftOffset,\n withTargetData,\n renderDualYAxes,\n renderChartTargetLines,\n makeCartesianTooltipFormatter,\n renderHoverLegend\n} from './chartScaffolding.js'\nimport {\n makeComparisonTickFormatter,\n makeComparisonLabelFormatter,\n buildSeriesKeyToFieldMap,\n makeSeriesKeyResolver,\n buildTimeSeriesData,\n computeSeriesSummaries,\n makeAxisResolver,\n isTimeOrderedXAxis,\n renderLineSeries\n} from './cartesianChartHelpers.js'\nimport ChartSummaryHeader from './ChartSummaryHeader.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps } from '../../types.js'\n\nconst LineChart = React.memo(function LineChart({\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 // xAxisField is aliased; it is narrowed to a definite string after the\n // errorCode guard inside the render body below.\n const { xAxisField: resolvedXAxisField, yAxisFields, seriesFields, errorCode } = useMemo(\n () => resolveChartAxisFields(chartConfig),\n [chartConfig]\n )\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig (memoized to prevent object recreation)\n // MUST be called before any early returns to satisfy React hooks rules\n const yAxisAssignment = useMemo(() =>\n chartConfig?.yAxisAssignment || {},\n [chartConfig?.yAxisAssignment]\n )\n\n // Build mapping from series key (label) to original field name (memoized to prevent object recreation)\n // This is needed because seriesKeys use display labels, not field names\n // MUST be called before any early returns to satisfy React hooks rules\n const seriesKeyToField = useMemo(\n () => buildSeriesKeyToFieldMap(yAxisFields, getFieldLabel),\n [yAxisFields, getFieldLabel]\n )\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n const showAllXLabels = displayConfig?.showAllXLabels ?? false\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.line')} />\n }\n\n if (errorCode) {\n return <ChartConfigError height={height} hint={t(`chart.runtime.configErrorHint.${errorCode}`)} />\n }\n\n // The errorCode guard above guarantees xAxisField is defined here\n const xAxisField = resolvedXAxisField as string\n\n const priorPeriodStyle = displayConfig?.priorPeriodStyle || 'dashed'\n const priorPeriodOpacity = displayConfig?.priorPeriodOpacity ?? 0.5\n\n // Shape data (comparison overlay vs standard transform) via shared helper.\n const { chartData, seriesKeys, effectiveXAxisKey, hasComparisonData, periodLabels } =\n buildTimeSeriesData({ data, xAxisField, yAxisFields, seriesFields, queryObject, getFieldLabel })\n\n // Resolve series key → measure field, handling comparison suffixes\n // (\"(Current)\"/\"(Prior)\") and dimension prefixes (\"DimValue - Label\").\n const findFieldFromSeriesKey = makeSeriesKeyResolver(seriesKeyToField)\n\n // Dual Y-axis derivation + margins (shared scaffolding)\n const axisInfo = getDualAxisInfo(yAxisFields, yAxisAssignment)\n const { hasRightAxis } = axisInfo\n\n // Summary header: per-series current value + change since the start of the\n // window, derived from the data already fetched for the plot.\n const showSummary = displayConfig?.showSummary === true && seriesKeys.length > 0\n const summaries = showSummary\n ? computeSeriesSummaries(\n chartData,\n seriesKeys,\n colorPalette,\n makeAxisResolver(findFieldFromSeriesKey, yAxisAssignment),\n // In comparison mode the x key is a day index, which would read as\n // \"since 0\"; fall back to the generic wording there.\n hasComparisonData ? undefined : effectiveXAxisKey\n )\n : []\n\n // The summary carries the colour dots, so the bottom legend becomes redundant.\n const showLegend = safeDisplayConfig.showLegend && !showSummary\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = getYAxisChartMargins(hasRightAxis)\n\n // Process target values and add to chart data\n const { spreadTargets, enhancedChartData } = withTargetData(chartData, displayConfig?.target)\n\n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for line chart after transformation\"\n />\n )\n }\n\n return (\n <div className=\"dc:relative dc:w-full dc:flex dc:flex-col\" style={{ height }}>\n {showSummary && (\n <ChartSummaryHeader\n summaries={summaries}\n getSeriesLabel={(seriesKey) => seriesKey}\n valueFormat={leftYAxisFormat}\n rightValueFormat={rightYAxisFormat}\n showChange={isTimeOrderedXAxis(queryObject, xAxisField)}\n leftOffset={getPlotLeftOffset(hasRightAxis)}\n />\n )}\n {/* The header wraps, so its height is not knowable up front. Give the\n plot the remaining flex space rather than subtracting a constant\n that silently drifts out of sync once the header wraps. */}\n <div className={showSummary ? 'dc:flex-1 dc:min-h-0' : 'dc:contents'}>\n <ChartContainer height={showSummary ? '100%' : height} minHeight={showSummary ? 0 : undefined}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n )}\n <XAxis\n dataKey={effectiveXAxisKey}\n type=\"category\"\n tick={<AngledXAxisTick tickFormatter={\n makeComparisonTickFormatter(hasComparisonData, chartData, queryObject, xAxisField)\n } />}\n height={resolveAngledAxisHeight(enhancedChartData.map((row: any) => row?.[effectiveXAxisKey]))}\n interval={showAllXLabels ? 0 : undefined}\n />\n {renderDualYAxes(axisInfo, getFieldLabel, leftYAxisFormat, rightYAxisFormat)}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={makeCartesianTooltipFormatter({\n leftYAxisFormat,\n rightYAxisFormat,\n yAxisAssignment,\n resolveField: findFieldFromSeriesKey\n })}\n labelFormatter={\n makeComparisonLabelFormatter(hasComparisonData, queryObject, xAxisField)\n }\n />\n )}\n {renderHoverLegend({\n show: showLegend,\n iconType: 'line',\n paddingTop: 25,\n onHover: setHoveredLegend,\n onLeave: () => setHoveredLegend(null)\n })}\n {renderLineSeries({\n seriesKeys,\n colorPalette,\n resolveField: findFieldFromSeriesKey,\n yAxisAssignment,\n hoveredLegend,\n connectNulls: safeDisplayConfig.connectNulls,\n showPoints: displayConfig?.showPoints ?? true,\n drillEnabled,\n onDataPointClick,\n hasComparisonData,\n periodLabels,\n priorPeriodStyle,\n priorPeriodOpacity\n })}\n {renderChartTargetLines(spreadTargets)}\n </RechartsLineChart>\n </ChartContainer>\n </div>\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Line Chart\" error={error} />\n }\n})\n\nexport default LineChart\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { i as e, n as t, t as n } from "./rolldown-runtime-DArdT4gl.js";
2
- import { F as r, z as i } from "./chart-activity-grid-DGazwi4C.js";
2
+ import { F as r, z as i } from "./chart-activity-grid-Ly_-2B-f.js";
3
3
  import * as a from "react";
4
4
  import o, { useContext as s, useEffect as c, useMemo as l, useState as u } from "react";
5
5
  import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
@@ -8699,4 +8699,4 @@ var hu = o.memo(function({ data: e, displayConfig: t = {}, queryObject: n, heigh
8699
8699
  //#endregion
8700
8700
  export { m as i, pu as n, Gr as r, hu as t };
8701
8701
 
8702
- //# sourceMappingURL=chart-markdown-B_2Ed7FJ.js.map
8702
+ //# sourceMappingURL=chart-markdown-DtgpU3xd.js.map