drizzle-cube 0.6.4 → 0.6.5

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 (255) hide show
  1. package/dist/adapters/ActivityGridChart.config-Bvi50jl_.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-BwswifOD.js +2 -0
  3. package/dist/adapters/AreaChart.config-Cehf1Kjo.cjs +1 -0
  4. package/dist/adapters/AreaChart.config-DC-gnmli.js +2 -0
  5. package/dist/adapters/BarChart.config-BY53r96T.cjs +1 -0
  6. package/dist/adapters/BarChart.config-DJN5Oqmw.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-9hLT3yMs.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-D9P4PMTf.cjs +1 -0
  9. package/dist/adapters/BubbleChart.config-CEVSsy7u.js +2 -0
  10. package/dist/adapters/BubbleChart.config-Cji0z0Tb.cjs +1 -0
  11. package/dist/adapters/CandlestickChart.config-DPv76FmM.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-tcHTorLu.js +2 -0
  13. package/dist/adapters/DataTable.config-D4txBrlQ.cjs +1 -0
  14. package/dist/adapters/DataTable.config-DrObkanI.js +2 -0
  15. package/dist/adapters/FunnelChart.config-BFYSkibE.js +2 -0
  16. package/dist/adapters/FunnelChart.config-BTSFeha-.cjs +1 -0
  17. package/dist/adapters/GaugeChart.config-BFz6NZfT.js +2 -0
  18. package/dist/adapters/GaugeChart.config-DJKD6oh8.cjs +1 -0
  19. package/dist/adapters/HeatMapChart.config-C3EZl9Sy.cjs +1 -0
  20. package/dist/adapters/HeatMapChart.config-jUCb5NAE.js +2 -0
  21. package/dist/adapters/KpiDelta.config-DhuealNk.js +2 -0
  22. package/dist/adapters/KpiDelta.config-m6FEIeWo.cjs +1 -0
  23. package/dist/adapters/KpiNumber.config-Cmd7eHmg.cjs +1 -0
  24. package/dist/adapters/KpiNumber.config-KQdKrkK-.js +2 -0
  25. package/dist/adapters/KpiText.config-D_pU4jH3.cjs +1 -0
  26. package/dist/adapters/KpiText.config-V8SvhllA.js +2 -0
  27. package/dist/adapters/LineChart.config-BuWM0TJx.js +2 -0
  28. package/dist/adapters/LineChart.config-CsxJ3f5A.cjs +1 -0
  29. package/dist/adapters/MarkdownChart.config-CJdjenj7.cjs +1 -0
  30. package/dist/adapters/MarkdownChart.config-oCWrAuom.js +2 -0
  31. package/dist/adapters/MeasureProfileChart.config-DBLnhtOk.cjs +1 -0
  32. package/dist/adapters/MeasureProfileChart.config-DWg0jzxA.js +2 -0
  33. package/dist/adapters/PieChart.config-D3qI6nbM.cjs +1 -0
  34. package/dist/adapters/PieChart.config-R2rcul2D.js +2 -0
  35. package/dist/adapters/RadarChart.config-BlK8QuDi.js +2 -0
  36. package/dist/adapters/RadarChart.config-fH3ce10I.cjs +1 -0
  37. package/dist/adapters/RadialBarChart.config-CqCnb27I.js +2 -0
  38. package/dist/adapters/RadialBarChart.config-DQQHJOCs.cjs +1 -0
  39. package/dist/adapters/RetentionCombinedChart.config-BFJ8i-kp.js +2 -0
  40. package/dist/adapters/RetentionCombinedChart.config-B_Wd_YjX.cjs +1 -0
  41. package/dist/adapters/RetentionHeatmap.config-BLqu9-Ft.js +2 -0
  42. package/dist/adapters/RetentionHeatmap.config-MvOPw_Dd.cjs +1 -0
  43. package/dist/adapters/SankeyChart.config-C_4u9Xiq.js +2 -0
  44. package/dist/adapters/SankeyChart.config-EH6wsjPr.cjs +1 -0
  45. package/dist/adapters/ScatterChart.config-D-MlQ7mP.js +2 -0
  46. package/dist/adapters/ScatterChart.config-DmwiEBN-.cjs +1 -0
  47. package/dist/adapters/SunburstChart.config-BRr_as_L.js +2 -0
  48. package/dist/adapters/SunburstChart.config-CptDj8e4.cjs +1 -0
  49. package/dist/adapters/TreeMapChart.config-D5wX2xaT.cjs +1 -0
  50. package/dist/adapters/TreeMapChart.config-Dyhwpwq3.js +2 -0
  51. package/dist/adapters/WaterfallChart.config-B_LGJIov.js +2 -0
  52. package/dist/adapters/WaterfallChart.config-Q4Fv196W.cjs +1 -0
  53. package/dist/adapters/{compiler-DyyBaLry.cjs → compiler-D0v5KJhv.cjs} +2 -2
  54. package/dist/adapters/{compiler-lG6eNsoI.js → compiler-ZruQ85ff.js} +35 -30
  55. package/dist/adapters/core/index.cjs +1 -1
  56. package/dist/adapters/core/index.js +1 -1
  57. package/dist/adapters/{core-F1pCQPde.cjs → core-CVqTwOR3.cjs} +1 -1
  58. package/dist/adapters/{core-Bbchr0ui.js → core-DoSUiMmv.js} +60 -60
  59. package/dist/adapters/express/index.cjs +2 -2
  60. package/dist/adapters/express/index.js +80 -75
  61. package/dist/adapters/fastify/index.cjs +2 -2
  62. package/dist/adapters/fastify/index.js +63 -58
  63. package/dist/adapters/{handler-DRZb2ip6.cjs → handler-DyIyrFFp.cjs} +3 -3
  64. package/dist/adapters/{handler-u8FyzPBT.js → handler-j74EJDdo.js} +28 -28
  65. package/dist/adapters/hono/index.cjs +2 -2
  66. package/dist/adapters/hono/index.js +57 -52
  67. package/dist/adapters/mcp-tools.cjs +1 -1
  68. package/dist/adapters/mcp-tools.js +2 -2
  69. package/dist/adapters/mcp-transport-BuU5CrKL.cjs +40 -0
  70. package/dist/adapters/mcp-transport-l8DhKzR5.js +601 -0
  71. package/dist/adapters/mcp-transport.d.ts +21 -3
  72. package/dist/adapters/nextjs/index.cjs +1 -1
  73. package/dist/adapters/nextjs/index.js +110 -105
  74. package/dist/adapters/{openai-CmMzrs1Y.js → openai-BCSKRcbD.js} +10 -10
  75. package/dist/{server/openai-DhzGY9R4.js → adapters/openai-BjR3ohaS.js} +1 -1
  76. package/dist/{server/openai-B4kAJTSD.cjs → adapters/openai-ClVVLjNl.cjs} +2 -2
  77. package/dist/adapters/{openai-Cdf2wWZA.cjs → openai-CsVXOcJZ.cjs} +1 -1
  78. package/dist/adapters/utils-CBR-9AMD.cjs +128 -0
  79. package/dist/adapters/{utils-BPWZsX7k.js → utils-U7gV5wQL.js} +789 -788
  80. package/dist/adapters/utils.cjs +1 -1
  81. package/dist/adapters/utils.d.ts +16 -4
  82. package/dist/adapters/utils.js +1 -1
  83. package/dist/cjs/adapters/mcp-transport.d.ts +21 -3
  84. package/dist/cjs/adapters/utils.d.ts +16 -4
  85. package/dist/cjs/server/executors/sqlite-executor.d.ts +8 -2
  86. package/dist/client/charts.js +13 -13
  87. package/dist/client/chunks/ConfirmModal-D6eLc9NO.js +3283 -0
  88. package/dist/client/chunks/ConfirmModal-D6eLc9NO.js.map +1 -0
  89. package/dist/client/chunks/{DashboardEditModal-Cs1ig1_V.js → DashboardEditModal-DFQSxR_C.js} +1134 -4389
  90. package/dist/client/chunks/DashboardEditModal-DFQSxR_C.js.map +1 -0
  91. package/dist/client/chunks/{RetentionCombinedChart-BgbDhsPz.js → RetentionCombinedChart-DY7wKLs5.js} +3 -3
  92. package/dist/client/chunks/{RetentionCombinedChart-BgbDhsPz.js.map → RetentionCombinedChart-DY7wKLs5.js.map} +1 -1
  93. package/dist/client/chunks/{RetentionHeatmap-DjXZaTPq.js → RetentionHeatmap-iNCG-dLd.js} +2 -2
  94. package/dist/client/chunks/{RetentionHeatmap-DjXZaTPq.js.map → RetentionHeatmap-iNCG-dLd.js.map} +1 -1
  95. package/dist/client/chunks/{analysis-builder-B64yaeDe.js → analysis-builder-CBZ7lOC-.js} +311 -311
  96. package/dist/client/chunks/{analysis-builder-B64yaeDe.js.map → analysis-builder-CBZ7lOC-.js.map} +1 -1
  97. package/dist/client/chunks/{analysis-builder-shared-CD0n2Nb8.js → analysis-builder-shared-8alCn-zw.js} +411 -411
  98. package/dist/client/chunks/{analysis-builder-shared-CD0n2Nb8.js.map → analysis-builder-shared-8alCn-zw.js.map} +1 -1
  99. package/dist/client/chunks/{chart-activity-grid-DX0SJbxs.js → chart-activity-grid-DDqFVWoa.js} +5 -2
  100. package/dist/client/chunks/{chart-activity-grid-DX0SJbxs.js.map → chart-activity-grid-DDqFVWoa.js.map} +1 -1
  101. package/dist/client/chunks/{chart-area-of01_62R.js → chart-area-BHxPNsmc.js} +2 -2
  102. package/dist/client/chunks/{chart-area-of01_62R.js.map → chart-area-BHxPNsmc.js.map} +1 -1
  103. package/dist/client/chunks/{chart-bar-BqelQE_I.js → chart-bar-DAO3PPcE.js} +3 -3
  104. package/dist/client/chunks/{chart-bar-BqelQE_I.js.map → chart-bar-DAO3PPcE.js.map} +1 -1
  105. package/dist/client/chunks/{chart-box-plot-kkBixZ27.js → chart-box-plot-CUpFyQQk.js} +2 -2
  106. package/dist/client/chunks/{chart-box-plot-kkBixZ27.js.map → chart-box-plot-CUpFyQQk.js.map} +1 -1
  107. package/dist/client/chunks/{chart-bubble-B2he1--4.js → chart-bubble-DvP_6_n9.js} +2 -2
  108. package/dist/client/chunks/{chart-bubble-B2he1--4.js.map → chart-bubble-DvP_6_n9.js.map} +1 -1
  109. package/dist/client/chunks/{chart-candlestick-DZp19Tzh.js → chart-candlestick-Dx8ZCMzl.js} +2 -2
  110. package/dist/client/chunks/{chart-candlestick-DZp19Tzh.js.map → chart-candlestick-Dx8ZCMzl.js.map} +1 -1
  111. package/dist/client/chunks/{chart-data-table-D4g5_jfF.js → chart-data-table-BP6DMdom.js} +32 -16
  112. package/dist/client/chunks/chart-data-table-BP6DMdom.js.map +1 -0
  113. package/dist/client/chunks/{chart-funnel-CToKSBaL.js → chart-funnel-xeVGBy-p.js} +2 -2
  114. package/dist/client/chunks/{chart-funnel-CToKSBaL.js.map → chart-funnel-xeVGBy-p.js.map} +1 -1
  115. package/dist/client/chunks/{chart-gauge-DTVezSk7.js → chart-gauge-DXQ4r3cb.js} +3 -3
  116. package/dist/client/chunks/{chart-gauge-DTVezSk7.js.map → chart-gauge-DXQ4r3cb.js.map} +1 -1
  117. package/dist/client/chunks/{chart-heat-map-DTuUl0BR.js → chart-heat-map-Pnk6rhqQ.js} +3 -3
  118. package/dist/client/chunks/{chart-heat-map-DTuUl0BR.js.map → chart-heat-map-Pnk6rhqQ.js.map} +1 -1
  119. package/dist/client/chunks/{chart-kpi-delta-BvWOt8-D.js → chart-kpi-delta-nXQnRRBr.js} +3 -3
  120. package/dist/client/chunks/{chart-kpi-delta-BvWOt8-D.js.map → chart-kpi-delta-nXQnRRBr.js.map} +1 -1
  121. package/dist/client/chunks/{chart-kpi-number-xgZmMiQY.js → chart-kpi-number-m8UGJfBr.js} +5 -5
  122. package/dist/client/chunks/{chart-kpi-number-xgZmMiQY.js.map → chart-kpi-number-m8UGJfBr.js.map} +1 -1
  123. package/dist/client/chunks/{chart-kpi-text-ZO3eFi7t.js → chart-kpi-text-CurpqmaD.js} +7 -4
  124. package/dist/client/chunks/{chart-kpi-text-ZO3eFi7t.js.map → chart-kpi-text-CurpqmaD.js.map} +1 -1
  125. package/dist/client/chunks/{chart-line-DKgrQA6c.js → chart-line-sJK-cJc0.js} +3 -3
  126. package/dist/client/chunks/{chart-line-DKgrQA6c.js.map → chart-line-sJK-cJc0.js.map} +1 -1
  127. package/dist/client/chunks/{chart-markdown-CV75S_zL.js → chart-markdown-BVrqqygz.js} +1263 -1192
  128. package/dist/client/chunks/chart-markdown-BVrqqygz.js.map +1 -0
  129. package/dist/client/chunks/{chart-measure-profile-Ket8fJyf.js → chart-measure-profile-k9_QDQbB.js} +3 -3
  130. package/dist/client/chunks/{chart-measure-profile-Ket8fJyf.js.map → chart-measure-profile-k9_QDQbB.js.map} +1 -1
  131. package/dist/client/chunks/{chart-pie-ByieAX5H.js → chart-pie-BDaaYt7a.js} +3 -3
  132. package/dist/client/chunks/{chart-pie-ByieAX5H.js.map → chart-pie-BDaaYt7a.js.map} +1 -1
  133. package/dist/client/chunks/{chart-radar-CiSwHWp4.js → chart-radar-Bz07PIVe.js} +3 -3
  134. package/dist/client/chunks/{chart-radar-CiSwHWp4.js.map → chart-radar-Bz07PIVe.js.map} +1 -1
  135. package/dist/client/chunks/{chart-radial-bar-BF6Mhl6f.js → chart-radial-bar-DpyxKQMj.js} +3 -3
  136. package/dist/client/chunks/{chart-radial-bar-BF6Mhl6f.js.map → chart-radial-bar-DpyxKQMj.js.map} +1 -1
  137. package/dist/client/chunks/{chart-sankey-DjrvKw6K.js → chart-sankey-BAeNbI-p.js} +2 -2
  138. package/dist/client/chunks/{chart-sankey-DjrvKw6K.js.map → chart-sankey-BAeNbI-p.js.map} +1 -1
  139. package/dist/client/chunks/{chart-scatter-Dd9WFqnS.js → chart-scatter-CRhGLCcy.js} +3 -3
  140. package/dist/client/chunks/{chart-scatter-Dd9WFqnS.js.map → chart-scatter-CRhGLCcy.js.map} +1 -1
  141. package/dist/client/chunks/{chart-sunburst-leGpuDj7.js → chart-sunburst-D3wV5OrK.js} +3 -3
  142. package/dist/client/chunks/{chart-sunburst-leGpuDj7.js.map → chart-sunburst-D3wV5OrK.js.map} +1 -1
  143. package/dist/client/chunks/{chart-tree-map-Ceq5sLZA.js → chart-tree-map-iI3ewOKY.js} +3 -3
  144. package/dist/client/chunks/{chart-tree-map-Ceq5sLZA.js.map → chart-tree-map-iI3ewOKY.js.map} +1 -1
  145. package/dist/client/chunks/{chart-waterfall-DyvQReN5.js → chart-waterfall-BrrYTZfs.js} +3 -3
  146. package/dist/client/chunks/{chart-waterfall-DyvQReN5.js.map → chart-waterfall-BrrYTZfs.js.map} +1 -1
  147. package/dist/client/chunks/{charts-core-DaXSt1Dd.js → charts-core-Cs-UIsQa.js} +2 -2
  148. package/dist/client/chunks/{charts-core-DaXSt1Dd.js.map → charts-core-Cs-UIsQa.js.map} +1 -1
  149. package/dist/client/chunks/charts-loader-DAJbAD7a.js +84 -0
  150. package/dist/client/chunks/{charts-loader-B0DOQMFH.js.map → charts-loader-DAJbAD7a.js.map} +1 -1
  151. package/dist/client/chunks/core-D7vPfUIe.js.map +1 -1
  152. package/dist/client/chunks/{dist-zPWyTBdU.js → dist-BwQr11Fz.js} +251 -252
  153. package/dist/client/chunks/{dist-zPWyTBdU.js.map → dist-BwQr11Fz.js.map} +1 -1
  154. package/dist/client/chunks/{exceljs.min-CIqBqwTW.js → exceljs.min-Dey-qIFL.js} +16 -16
  155. package/dist/client/chunks/{exceljs.min-CIqBqwTW.js.map → exceljs.min-Dey-qIFL.js.map} +1 -1
  156. package/dist/client/chunks/javascript-DFnKaHmQ.js.map +1 -1
  157. package/dist/client/chunks/retention-ChW9jYdy.js.map +1 -1
  158. package/dist/client/chunks/{schema-visualization-DJPTktM6.js → schema-visualization-BGT_cNon.js} +12 -12
  159. package/dist/client/chunks/{schema-visualization-DJPTktM6.js.map → schema-visualization-BGT_cNon.js.map} +1 -1
  160. package/dist/client/chunks/sql-CmVzGP4w.js.map +1 -1
  161. package/dist/client/chunks/syntaxHighlighting-Bq2Bj9Xt.js +30 -0
  162. package/dist/client/chunks/syntaxHighlighting-Bq2Bj9Xt.js.map +1 -0
  163. package/dist/client/chunks/{useDirtyStateTracking-BT6zqCFl.js → useDebounce-7suCFq9v.js} +47 -109
  164. package/dist/client/chunks/useDebounce-7suCFq9v.js.map +1 -0
  165. package/dist/client/chunks/useDirtyStateTracking-D2OiqKoQ.js +66 -0
  166. package/dist/client/chunks/useDirtyStateTracking-D2OiqKoQ.js.map +1 -0
  167. package/dist/client/chunks/{useExplainAI-Dq_meKNN.js → useExplainAI-CEf04DPE.js} +14 -14
  168. package/dist/client/chunks/{useExplainAI-Dq_meKNN.js.map → useExplainAI-CEf04DPE.js.map} +1 -1
  169. package/dist/client/chunks/useNotebookLayout-Ck3Z3uzg.js.map +1 -1
  170. package/dist/client/chunks/utils-DjLiJKS_.js +104 -0
  171. package/dist/client/chunks/utils-DjLiJKS_.js.map +1 -0
  172. package/dist/client/chunks/{vendor-D4jADu8t.js → vendor-DFAQ4Ucl.js} +5 -3
  173. package/dist/client/chunks/{vendor-D4jADu8t.js.map → vendor-DFAQ4Ucl.js.map} +1 -1
  174. package/dist/client/components.js +4 -3
  175. package/dist/client/hooks.js +5 -4
  176. package/dist/client/icons.js +1 -1
  177. package/dist/client/index.js +33 -29
  178. package/dist/client/index.js.map +1 -1
  179. package/dist/client/providers.js +1 -1
  180. package/dist/client/schema.js +1 -1
  181. package/dist/client/styles.css +1 -1
  182. package/dist/client/utils.js +32 -6
  183. package/dist/client/utils.js.map +1 -0
  184. package/dist/client-bundle-stats.html +1 -1
  185. package/dist/mcp-app/mcp-app.html +145 -50
  186. package/dist/server/executors/sqlite-executor.d.ts +8 -2
  187. package/dist/server/index.cjs +33 -33
  188. package/dist/server/index.js +1268 -1262
  189. package/dist/server/{openai-CmMzrs1Y.js → openai-BCSKRcbD.js} +10 -10
  190. package/dist/{adapters/openai-DhzGY9R4.js → server/openai-BjR3ohaS.js} +1 -1
  191. package/dist/{adapters/openai-B4kAJTSD.cjs → server/openai-ClVVLjNl.cjs} +2 -2
  192. package/dist/server/{openai-Cdf2wWZA.cjs → openai-CsVXOcJZ.cjs} +1 -1
  193. package/package.json +11 -7
  194. package/dist/adapters/ActivityGridChart.config-BtECymia.cjs +0 -1
  195. package/dist/adapters/ActivityGridChart.config-CTd5HYjI.js +0 -2
  196. package/dist/adapters/AreaChart.config-1B8iQnfn.js +0 -2
  197. package/dist/adapters/AreaChart.config-hnncyQL4.cjs +0 -1
  198. package/dist/adapters/BarChart.config-C-QCf1rL.cjs +0 -1
  199. package/dist/adapters/BarChart.config-CFelK1qP.js +0 -2
  200. package/dist/adapters/BoxPlotChart.config-CD9WEPyF.js +0 -2
  201. package/dist/adapters/BoxPlotChart.config-DEbLA0BX.cjs +0 -1
  202. package/dist/adapters/BubbleChart.config-B_M4hzzV.js +0 -2
  203. package/dist/adapters/BubbleChart.config-dRZZlAke.cjs +0 -1
  204. package/dist/adapters/CandlestickChart.config-Dsil2Fop.cjs +0 -1
  205. package/dist/adapters/CandlestickChart.config-fuhyFvob.js +0 -2
  206. package/dist/adapters/DataTable.config-q2gqBi6t.cjs +0 -1
  207. package/dist/adapters/DataTable.config-wIQnHX5R.js +0 -2
  208. package/dist/adapters/FunnelChart.config-Dz710ssx.js +0 -2
  209. package/dist/adapters/FunnelChart.config-YNP9CeS-.cjs +0 -1
  210. package/dist/adapters/GaugeChart.config-BG9FcMCn.cjs +0 -1
  211. package/dist/adapters/GaugeChart.config-CgwniXkd.js +0 -2
  212. package/dist/adapters/HeatMapChart.config-1zSMXXoN.cjs +0 -1
  213. package/dist/adapters/HeatMapChart.config-YVEWx6s5.js +0 -2
  214. package/dist/adapters/KpiDelta.config-BWvYXuFp.cjs +0 -1
  215. package/dist/adapters/KpiDelta.config-C_dYM64q.js +0 -2
  216. package/dist/adapters/KpiNumber.config-CXg6toZG.js +0 -2
  217. package/dist/adapters/KpiNumber.config-CZmV-yU1.cjs +0 -1
  218. package/dist/adapters/KpiText.config-BY-SJvAF.js +0 -2
  219. package/dist/adapters/KpiText.config-GSIxy0CE.cjs +0 -1
  220. package/dist/adapters/LineChart.config-CJtF8SOu.js +0 -2
  221. package/dist/adapters/LineChart.config-d0y60gw9.cjs +0 -1
  222. package/dist/adapters/MarkdownChart.config-B6w0spya.cjs +0 -1
  223. package/dist/adapters/MarkdownChart.config-BuIQcWOn.js +0 -2
  224. package/dist/adapters/MeasureProfileChart.config-Bo2n5Ae5.cjs +0 -1
  225. package/dist/adapters/MeasureProfileChart.config-C5d34lsc.js +0 -2
  226. package/dist/adapters/PieChart.config-CDxfXCIt.cjs +0 -1
  227. package/dist/adapters/PieChart.config-CuZxQc5m.js +0 -2
  228. package/dist/adapters/RadarChart.config-DpdVWyh5.cjs +0 -1
  229. package/dist/adapters/RadarChart.config-KrxwaaGu.js +0 -2
  230. package/dist/adapters/RadialBarChart.config-DpRZd0FW.js +0 -2
  231. package/dist/adapters/RadialBarChart.config-faIY4jpE.cjs +0 -1
  232. package/dist/adapters/RetentionCombinedChart.config-CUnScqnS.cjs +0 -1
  233. package/dist/adapters/RetentionCombinedChart.config-Dd8FuawP.js +0 -2
  234. package/dist/adapters/RetentionHeatmap.config-CPd6GeoQ.js +0 -2
  235. package/dist/adapters/RetentionHeatmap.config-CPlHbLom.cjs +0 -1
  236. package/dist/adapters/SankeyChart.config-DbIUqi-H.cjs +0 -1
  237. package/dist/adapters/SankeyChart.config-kzAnW0C7.js +0 -2
  238. package/dist/adapters/ScatterChart.config-4Okvn27v.js +0 -2
  239. package/dist/adapters/ScatterChart.config-4f9nNw3e.cjs +0 -1
  240. package/dist/adapters/SunburstChart.config-BsUQkIM_.js +0 -2
  241. package/dist/adapters/SunburstChart.config-lvnYkWs7.cjs +0 -1
  242. package/dist/adapters/TreeMapChart.config-S0qsgAFW.js +0 -2
  243. package/dist/adapters/TreeMapChart.config-jbwKsTYt.cjs +0 -1
  244. package/dist/adapters/WaterfallChart.config-CDQ74-pS.cjs +0 -1
  245. package/dist/adapters/WaterfallChart.config-XdtH-O5g.js +0 -2
  246. package/dist/adapters/mcp-transport-Bw_zqky2.js +0 -591
  247. package/dist/adapters/mcp-transport-CNIPoe1i.cjs +0 -40
  248. package/dist/adapters/utils-_whV4fXL.cjs +0 -128
  249. package/dist/client/chunks/DashboardEditModal-Cs1ig1_V.js.map +0 -1
  250. package/dist/client/chunks/chart-data-table-D4g5_jfF.js.map +0 -1
  251. package/dist/client/chunks/chart-markdown-CV75S_zL.js.map +0 -1
  252. package/dist/client/chunks/charts-loader-B0DOQMFH.js +0 -84
  253. package/dist/client/chunks/useDirtyStateTracking-BT6zqCFl.js.map +0 -1
  254. package/dist/client/chunks/utils-Cq-j5E5I.js +0 -155
  255. package/dist/client/chunks/utils-Cq-j5E5I.js.map +0 -1
@@ -0,0 +1,3283 @@
1
+ import { S as e, _ as t, mt as n, v as r } from "./chart-data-table-BP6DMdom.js";
2
+ import { a as i, l as a, s as o } from "./retention-ChW9jYdy.js";
3
+ import { C as s, F as c, O as l, T as u } from "./useDebounce-7suCFq9v.js";
4
+ import { P as d } from "./chart-activity-grid-DDqFVWoa.js";
5
+ import { a as f, t as p } from "./syntaxHighlighting-Bq2Bj9Xt.js";
6
+ import { n as m, t as h } from "./charts-core-Cs-UIsQa.js";
7
+ import g, { memo as _, useCallback as v, useEffect as y, useMemo as b, useRef as x, useState as S } from "react";
8
+ import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
9
+ //#region src/client/types/analysisConfig.ts
10
+ var E = (e) => e.analysisType === "query", D = (e) => e.analysisType === "funnel", O = (e) => e.analysisType === "flow", k = (e) => e.analysisType === "retention", A = (e) => "queries" in e.query && Array.isArray(e.query.queries), j = (e) => !A(e), M = (e) => {
11
+ if (!e || typeof e != "object") return !1;
12
+ let t = e;
13
+ return !(t.version !== 1 || t.analysisType !== "query" && t.analysisType !== "funnel" && t.analysisType !== "flow" && t.analysisType !== "retention" || !t.query || typeof t.query != "object" || t.activeView !== "table" && t.activeView !== "chart");
14
+ }, N = () => ({
15
+ version: 1,
16
+ analysisType: "query",
17
+ activeView: "chart",
18
+ charts: { query: {
19
+ chartType: "bar",
20
+ chartConfig: {},
21
+ displayConfig: {}
22
+ } },
23
+ query: {
24
+ measures: [],
25
+ dimensions: []
26
+ }
27
+ }), P = () => ({
28
+ version: 1,
29
+ analysisType: "funnel",
30
+ activeView: "chart",
31
+ charts: { funnel: {
32
+ chartType: "funnel",
33
+ chartConfig: {},
34
+ displayConfig: {}
35
+ } },
36
+ query: { funnel: {
37
+ bindingKey: "",
38
+ timeDimension: "",
39
+ steps: []
40
+ } }
41
+ }), F = () => ({
42
+ version: 1,
43
+ analysisType: "flow",
44
+ activeView: "chart",
45
+ charts: { flow: {
46
+ chartType: "sankey",
47
+ chartConfig: {},
48
+ displayConfig: {}
49
+ } },
50
+ query: { flow: {
51
+ bindingKey: "",
52
+ timeDimension: "",
53
+ eventDimension: "",
54
+ startingStep: {
55
+ name: "",
56
+ filter: void 0
57
+ },
58
+ stepsBefore: 3,
59
+ stepsAfter: 3,
60
+ joinStrategy: "auto"
61
+ } }
62
+ }), I = () => ({
63
+ version: 1,
64
+ analysisType: "retention",
65
+ activeView: "chart",
66
+ charts: { retention: {
67
+ chartType: "heatmap",
68
+ chartConfig: {},
69
+ displayConfig: {}
70
+ } },
71
+ query: { retention: {
72
+ timeDimension: "",
73
+ bindingKey: "",
74
+ dateRange: {
75
+ start: "",
76
+ end: ""
77
+ },
78
+ granularity: "week",
79
+ periods: 12,
80
+ retentionType: "classic"
81
+ } }
82
+ }), L = (e = "query") => {
83
+ switch (e) {
84
+ case "funnel": return P();
85
+ case "flow": return F();
86
+ case "retention": return I();
87
+ default: return N();
88
+ }
89
+ }, ee = (e) => {
90
+ if (!e || typeof e != "object") return !1;
91
+ let t = e;
92
+ return !(t.version !== 1 || t.activeType !== "query" && t.activeType !== "funnel" && t.activeType !== "flow" && t.activeType !== "retention" || !t.modes || typeof t.modes != "object");
93
+ }, R = () => ({
94
+ version: 1,
95
+ activeType: "query",
96
+ modes: {
97
+ query: N(),
98
+ funnel: P(),
99
+ flow: F(),
100
+ retention: I()
101
+ }
102
+ });
103
+ //#endregion
104
+ //#region src/client/utils/configMigration.ts
105
+ function z(e) {
106
+ return typeof e == "object" && !!e && "queries" in e && Array.isArray(e.queries);
107
+ }
108
+ function te(e) {
109
+ return typeof e == "object" && !!e && "queries" in e && Array.isArray(e.queries) && "mergeStrategy" in e && e.mergeStrategy === "funnel";
110
+ }
111
+ function B(e) {
112
+ return typeof e == "object" && !!e && "funnel" in e && typeof e.funnel == "object";
113
+ }
114
+ function ne(e) {
115
+ return typeof e == "object" && !!e && "flow" in e && typeof e.flow == "object";
116
+ }
117
+ function V(e, t) {
118
+ return t === "funnel" ? {
119
+ chartType: e.funnelChartType || e.chartType || "funnel",
120
+ chartConfig: e.funnelChartConfig || e.chartConfig || {},
121
+ displayConfig: e.funnelDisplayConfig || e.displayConfig || {}
122
+ } : t === "flow" ? {
123
+ chartType: e.chartType || "sankey",
124
+ chartConfig: e.chartConfig || {},
125
+ displayConfig: e.displayConfig || {}
126
+ } : t === "retention" ? {
127
+ chartType: e.chartType || "retentionCombined",
128
+ chartConfig: e.chartConfig || {},
129
+ displayConfig: e.displayConfig || {}
130
+ } : {
131
+ chartType: e.chartType || "bar",
132
+ chartConfig: e.chartConfig || {},
133
+ displayConfig: e.displayConfig || {}
134
+ };
135
+ }
136
+ function H(e) {
137
+ try {
138
+ let t = JSON.parse(e.query);
139
+ if (a(t)) return {
140
+ version: 1,
141
+ analysisType: "retention",
142
+ activeView: "chart",
143
+ charts: { retention: V(e, "retention") },
144
+ query: t
145
+ };
146
+ if (ne(t)) return {
147
+ version: 1,
148
+ analysisType: "flow",
149
+ activeView: "chart",
150
+ charts: { flow: V(e, "flow") },
151
+ query: t
152
+ };
153
+ if (B(t)) return {
154
+ version: 1,
155
+ analysisType: "funnel",
156
+ activeView: "chart",
157
+ charts: { funnel: V(e, "funnel") },
158
+ query: t
159
+ };
160
+ if (te(t)) return re(t, e);
161
+ if (e.analysisType === "funnel") return {
162
+ version: 1,
163
+ analysisType: "funnel",
164
+ activeView: "chart",
165
+ charts: { funnel: V(e, "funnel") },
166
+ query: B(t) ? t : { funnel: {
167
+ bindingKey: "",
168
+ timeDimension: "",
169
+ steps: []
170
+ } }
171
+ };
172
+ let n = V(e, "query");
173
+ return z(t) ? {
174
+ version: 1,
175
+ analysisType: "query",
176
+ activeView: "chart",
177
+ charts: { query: n },
178
+ query: {
179
+ queries: t.queries,
180
+ mergeStrategy: t.mergeStrategy === "funnel" ? "concat" : t.mergeStrategy,
181
+ mergeKeys: t.mergeKeys,
182
+ queryLabels: t.queryLabels
183
+ }
184
+ } : {
185
+ version: 1,
186
+ analysisType: "query",
187
+ activeView: "chart",
188
+ charts: { query: n },
189
+ query: t
190
+ };
191
+ } catch (e) {
192
+ return console.warn("[configMigration] Failed to parse legacy portlet:", e), N();
193
+ }
194
+ }
195
+ function re(e, t) {
196
+ let n = "";
197
+ e.funnelBindingKey?.dimension && (typeof e.funnelBindingKey.dimension == "string" ? n = e.funnelBindingKey.dimension : Array.isArray(e.funnelBindingKey.dimension) && (n = e.funnelBindingKey.dimension.map((e) => ({
198
+ cube: e.cube,
199
+ dimension: e.dimension
200
+ }))));
201
+ let r = "";
202
+ e.queries.length > 0 && e.queries[0].timeDimensions?.length && (r = e.queries[0].timeDimensions[0].dimension);
203
+ let i = e.queries.map((t, n) => {
204
+ let r = { name: e.queryLabels?.[n] || `Step ${n + 1}` };
205
+ return t.filters && t.filters.length > 0 && (r.filter = t.filters.length === 1 ? t.filters[0] : { and: t.filters }), e.stepTimeToConvert && e.stepTimeToConvert[n] && (r.timeToConvert = e.stepTimeToConvert[n]), r;
206
+ });
207
+ return {
208
+ version: 1,
209
+ analysisType: "funnel",
210
+ activeView: "chart",
211
+ charts: { funnel: t ? V(t, "funnel") : {
212
+ chartType: "funnel",
213
+ chartConfig: {},
214
+ displayConfig: {}
215
+ } },
216
+ query: { funnel: {
217
+ bindingKey: n,
218
+ timeDimension: r,
219
+ steps: i,
220
+ includeTimeMetrics: !0
221
+ } }
222
+ };
223
+ }
224
+ function ie(e) {
225
+ if (M(e)) return e;
226
+ if (e && typeof e == "object" && "query" in e && typeof e.query == "string") return H(e);
227
+ if (e && typeof e == "object") try {
228
+ return H({ query: JSON.stringify(e) });
229
+ } catch {}
230
+ return console.warn("[configMigration] Unknown config format, using defaults"), N();
231
+ }
232
+ function ae(e) {
233
+ return typeof e == "object" && !!e && "analysisConfig" in e && M(e.analysisConfig);
234
+ }
235
+ function U(e) {
236
+ if (ae(e)) return e;
237
+ let t = H({
238
+ query: e.query ?? "{}",
239
+ chartType: e.chartType,
240
+ chartConfig: e.chartConfig,
241
+ displayConfig: e.displayConfig,
242
+ analysisType: e.analysisType === "flow" || e.analysisType === "retention" ? void 0 : e.analysisType,
243
+ funnelChartType: e.funnelChartType,
244
+ funnelChartConfig: e.funnelChartConfig,
245
+ funnelDisplayConfig: e.funnelDisplayConfig
246
+ });
247
+ return {
248
+ ...e,
249
+ analysisConfig: t
250
+ };
251
+ }
252
+ //#endregion
253
+ //#region src/client/shared/filters/operators.ts
254
+ var W = {
255
+ equals: {
256
+ label: "filter.operator.equals.label",
257
+ description: "filter.operator.equals.description",
258
+ requiresValues: !0,
259
+ supportsMultipleValues: !0,
260
+ valueType: "any",
261
+ fieldTypes: [
262
+ "string",
263
+ "number",
264
+ "boolean",
265
+ "time"
266
+ ]
267
+ },
268
+ notEquals: {
269
+ label: "filter.operator.notEquals.label",
270
+ description: "filter.operator.notEquals.description",
271
+ requiresValues: !0,
272
+ supportsMultipleValues: !0,
273
+ valueType: "any",
274
+ fieldTypes: [
275
+ "string",
276
+ "number",
277
+ "boolean",
278
+ "time"
279
+ ]
280
+ },
281
+ contains: {
282
+ label: "filter.operator.contains.label",
283
+ description: "filter.operator.contains.description",
284
+ requiresValues: !0,
285
+ supportsMultipleValues: !1,
286
+ valueType: "string",
287
+ fieldTypes: ["string"]
288
+ },
289
+ notContains: {
290
+ label: "filter.operator.notContains.label",
291
+ description: "filter.operator.notContains.description",
292
+ requiresValues: !0,
293
+ supportsMultipleValues: !1,
294
+ valueType: "string",
295
+ fieldTypes: ["string"]
296
+ },
297
+ startsWith: {
298
+ label: "filter.operator.startsWith.label",
299
+ description: "filter.operator.startsWith.description",
300
+ requiresValues: !0,
301
+ supportsMultipleValues: !1,
302
+ valueType: "string",
303
+ fieldTypes: ["string"]
304
+ },
305
+ notStartsWith: {
306
+ label: "filter.operator.notStartsWith.label",
307
+ description: "filter.operator.notStartsWith.description",
308
+ requiresValues: !0,
309
+ supportsMultipleValues: !1,
310
+ valueType: "string",
311
+ fieldTypes: ["string"]
312
+ },
313
+ endsWith: {
314
+ label: "filter.operator.endsWith.label",
315
+ description: "filter.operator.endsWith.description",
316
+ requiresValues: !0,
317
+ supportsMultipleValues: !1,
318
+ valueType: "string",
319
+ fieldTypes: ["string"]
320
+ },
321
+ notEndsWith: {
322
+ label: "filter.operator.notEndsWith.label",
323
+ description: "filter.operator.notEndsWith.description",
324
+ requiresValues: !0,
325
+ supportsMultipleValues: !1,
326
+ valueType: "string",
327
+ fieldTypes: ["string"]
328
+ },
329
+ like: {
330
+ label: "filter.operator.like.label",
331
+ description: "filter.operator.like.description",
332
+ requiresValues: !0,
333
+ supportsMultipleValues: !1,
334
+ valueType: "string",
335
+ fieldTypes: ["string"]
336
+ },
337
+ notLike: {
338
+ label: "filter.operator.notLike.label",
339
+ description: "filter.operator.notLike.description",
340
+ requiresValues: !0,
341
+ supportsMultipleValues: !1,
342
+ valueType: "string",
343
+ fieldTypes: ["string"]
344
+ },
345
+ ilike: {
346
+ label: "filter.operator.ilike.label",
347
+ description: "filter.operator.ilike.description",
348
+ requiresValues: !0,
349
+ supportsMultipleValues: !1,
350
+ valueType: "string",
351
+ fieldTypes: ["string"]
352
+ },
353
+ gt: {
354
+ label: "filter.operator.gt.label",
355
+ description: "filter.operator.gt.description",
356
+ requiresValues: !0,
357
+ supportsMultipleValues: !1,
358
+ valueType: "number",
359
+ fieldTypes: [
360
+ "number",
361
+ "count",
362
+ "sum",
363
+ "avg",
364
+ "min",
365
+ "max"
366
+ ]
367
+ },
368
+ gte: {
369
+ label: "filter.operator.gte.label",
370
+ description: "filter.operator.gte.description",
371
+ requiresValues: !0,
372
+ supportsMultipleValues: !1,
373
+ valueType: "number",
374
+ fieldTypes: [
375
+ "number",
376
+ "count",
377
+ "sum",
378
+ "avg",
379
+ "min",
380
+ "max"
381
+ ]
382
+ },
383
+ lt: {
384
+ label: "filter.operator.lt.label",
385
+ description: "filter.operator.lt.description",
386
+ requiresValues: !0,
387
+ supportsMultipleValues: !1,
388
+ valueType: "number",
389
+ fieldTypes: [
390
+ "number",
391
+ "count",
392
+ "sum",
393
+ "avg",
394
+ "min",
395
+ "max"
396
+ ]
397
+ },
398
+ lte: {
399
+ label: "filter.operator.lte.label",
400
+ description: "filter.operator.lte.description",
401
+ requiresValues: !0,
402
+ supportsMultipleValues: !1,
403
+ valueType: "number",
404
+ fieldTypes: [
405
+ "number",
406
+ "count",
407
+ "sum",
408
+ "avg",
409
+ "min",
410
+ "max"
411
+ ]
412
+ },
413
+ between: {
414
+ label: "filter.operator.between.label",
415
+ description: "filter.operator.between.description",
416
+ requiresValues: !0,
417
+ supportsMultipleValues: !1,
418
+ valueType: "number",
419
+ fieldTypes: [
420
+ "number",
421
+ "count",
422
+ "sum",
423
+ "avg",
424
+ "min",
425
+ "max"
426
+ ]
427
+ },
428
+ notBetween: {
429
+ label: "filter.operator.notBetween.label",
430
+ description: "filter.operator.notBetween.description",
431
+ requiresValues: !0,
432
+ supportsMultipleValues: !1,
433
+ valueType: "number",
434
+ fieldTypes: [
435
+ "number",
436
+ "count",
437
+ "sum",
438
+ "avg",
439
+ "min",
440
+ "max"
441
+ ]
442
+ },
443
+ in: {
444
+ label: "filter.operator.in.label",
445
+ description: "filter.operator.in.description",
446
+ requiresValues: !0,
447
+ supportsMultipleValues: !0,
448
+ valueType: "any",
449
+ fieldTypes: [
450
+ "string",
451
+ "number",
452
+ "boolean"
453
+ ]
454
+ },
455
+ notIn: {
456
+ label: "filter.operator.notIn.label",
457
+ description: "filter.operator.notIn.description",
458
+ requiresValues: !0,
459
+ supportsMultipleValues: !0,
460
+ valueType: "any",
461
+ fieldTypes: [
462
+ "string",
463
+ "number",
464
+ "boolean"
465
+ ]
466
+ },
467
+ set: {
468
+ label: "filter.operator.set.label",
469
+ description: "filter.operator.set.description",
470
+ requiresValues: !1,
471
+ supportsMultipleValues: !1,
472
+ valueType: "any",
473
+ fieldTypes: [
474
+ "string",
475
+ "number",
476
+ "time",
477
+ "boolean"
478
+ ]
479
+ },
480
+ notSet: {
481
+ label: "filter.operator.notSet.label",
482
+ description: "filter.operator.notSet.description",
483
+ requiresValues: !1,
484
+ supportsMultipleValues: !1,
485
+ valueType: "any",
486
+ fieldTypes: [
487
+ "string",
488
+ "number",
489
+ "time",
490
+ "boolean"
491
+ ]
492
+ },
493
+ isEmpty: {
494
+ label: "filter.operator.isEmpty.label",
495
+ description: "filter.operator.isEmpty.description",
496
+ requiresValues: !1,
497
+ supportsMultipleValues: !1,
498
+ valueType: "string",
499
+ fieldTypes: ["string"]
500
+ },
501
+ isNotEmpty: {
502
+ label: "filter.operator.isNotEmpty.label",
503
+ description: "filter.operator.isNotEmpty.description",
504
+ requiresValues: !1,
505
+ supportsMultipleValues: !1,
506
+ valueType: "string",
507
+ fieldTypes: ["string"]
508
+ },
509
+ inDateRange: {
510
+ label: "filter.operator.inDateRange.label",
511
+ description: "filter.operator.inDateRange.description",
512
+ requiresValues: !0,
513
+ supportsMultipleValues: !1,
514
+ valueType: "date",
515
+ fieldTypes: ["time"]
516
+ },
517
+ beforeDate: {
518
+ label: "filter.operator.beforeDate.label",
519
+ description: "filter.operator.beforeDate.description",
520
+ requiresValues: !0,
521
+ supportsMultipleValues: !1,
522
+ valueType: "date",
523
+ fieldTypes: ["time"]
524
+ },
525
+ afterDate: {
526
+ label: "filter.operator.afterDate.label",
527
+ description: "filter.operator.afterDate.description",
528
+ requiresValues: !0,
529
+ supportsMultipleValues: !1,
530
+ valueType: "date",
531
+ fieldTypes: ["time"]
532
+ },
533
+ regex: {
534
+ label: "filter.operator.regex.label",
535
+ description: "filter.operator.regex.description",
536
+ requiresValues: !0,
537
+ supportsMultipleValues: !1,
538
+ valueType: "string",
539
+ fieldTypes: ["string"]
540
+ },
541
+ notRegex: {
542
+ label: "filter.operator.notRegex.label",
543
+ description: "filter.operator.notRegex.description",
544
+ requiresValues: !0,
545
+ supportsMultipleValues: !1,
546
+ valueType: "string",
547
+ fieldTypes: ["string"]
548
+ },
549
+ arrayContains: {
550
+ label: "filter.operator.arrayContains.label",
551
+ description: "filter.operator.arrayContains.description",
552
+ requiresValues: !0,
553
+ supportsMultipleValues: !0,
554
+ valueType: "string",
555
+ fieldTypes: ["string"]
556
+ },
557
+ arrayOverlaps: {
558
+ label: "filter.operator.arrayOverlaps.label",
559
+ description: "filter.operator.arrayOverlaps.description",
560
+ requiresValues: !0,
561
+ supportsMultipleValues: !0,
562
+ valueType: "string",
563
+ fieldTypes: ["string"]
564
+ },
565
+ arrayContained: {
566
+ label: "filter.operator.arrayContained.label",
567
+ description: "filter.operator.arrayContained.description",
568
+ requiresValues: !0,
569
+ supportsMultipleValues: !0,
570
+ valueType: "string",
571
+ fieldTypes: ["string"]
572
+ }
573
+ }, oe = /* @__PURE__ */ new Set([
574
+ "string",
575
+ "time",
576
+ "boolean"
577
+ ]);
578
+ function se(e) {
579
+ return oe.has(e) ? e : "number";
580
+ }
581
+ function ce(e) {
582
+ let t = se(e), n = [];
583
+ for (let [e, r] of Object.entries(W)) r.fieldTypes.includes(t) && n.push({
584
+ operator: e,
585
+ label: r.label
586
+ });
587
+ return n;
588
+ }
589
+ //#endregion
590
+ //#region src/client/utils/filterUtils.ts
591
+ function le(e) {
592
+ return e ? e.map((e) => typeof e == "string" ? { filterId: e } : e) : [];
593
+ }
594
+ function ue(e) {
595
+ return e.map((e) => e.member ? e : e.filterId);
596
+ }
597
+ function G(e, t) {
598
+ return e ? e.some((e) => typeof e == "string" ? e === t : e.filterId === t) : !1;
599
+ }
600
+ function K(e, t) {
601
+ if (!e) return;
602
+ let n = e.find((e) => typeof e == "string" ? e === t : e.filterId === t);
603
+ return typeof n == "object" ? n.member : void 0;
604
+ }
605
+ function de(e, t) {
606
+ return t && "member" in e && "operator" in e ? {
607
+ ...e,
608
+ member: t
609
+ } : e;
610
+ }
611
+ function q(e) {
612
+ if ("member" in e && "operator" in e) {
613
+ let t = e;
614
+ return [
615
+ "set",
616
+ "notSet",
617
+ "isEmpty",
618
+ "isNotEmpty"
619
+ ].includes(t.operator) || t.operator === "inDateRange" && t.dateRange ? !0 : !!(t.values && t.values.length > 0);
620
+ }
621
+ return "type" in e && "filters" in e && e.filters.filter((e) => q(e)).length > 0;
622
+ }
623
+ function fe(e, t) {
624
+ return !e || !e.length || !t || !t.length ? [] : e.filter((e) => G(t, e.id)).filter((e) => q(e.filter)).map((e) => de(e.filter, K(t, e.id)));
625
+ }
626
+ function pe(e, t, n = "server") {
627
+ return !e || e.length === 0 ? t : !t || t.length === 0 ? [...e] : n === "server" ? [{ and: c([...e, ...t]) }] : [{
628
+ type: "and",
629
+ filters: [...e, ...t]
630
+ }];
631
+ }
632
+ function me(e) {
633
+ let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set();
634
+ return e.portlets.forEach((e) => {
635
+ try {
636
+ let i = U(e).analysisConfig.query, a = (e) => {
637
+ e.measures && Array.isArray(e.measures) && e.measures.forEach((e) => t.add(e)), e.dimensions && Array.isArray(e.dimensions) && e.dimensions.forEach((e) => n.add(e)), e.timeDimensions && Array.isArray(e.timeDimensions) && e.timeDimensions.forEach((e) => {
638
+ e.dimension && r.add(e.dimension);
639
+ }), e.filters && l(e.filters).forEach((e) => {
640
+ n.add(e);
641
+ });
642
+ };
643
+ if ("funnel" in i) {
644
+ let e = i;
645
+ e.funnel?.timeDimension && r.add(e.funnel.timeDimension);
646
+ } else "queries" in i ? i.queries.forEach((e) => a(e)) : a(i);
647
+ } catch (t) {
648
+ console.warn("Failed to extract fields from portlet:", e.id, t);
649
+ }
650
+ }), {
651
+ measures: t,
652
+ dimensions: n,
653
+ timeDimensions: r
654
+ };
655
+ }
656
+ function J(e) {
657
+ if (e.dateRange) return e.dateRange;
658
+ if (e.values && e.values.length > 0) return e.values.length === 1 ? e.values[0] : e.values;
659
+ }
660
+ function he(e, t, n) {
661
+ if (!n || n.length === 0 || !t || t.length === 0) return n;
662
+ let r = e?.filter((e) => e.isUniversalTime && G(t, e.id))?.filter((e) => {
663
+ if (!("member" in e.filter)) return !1;
664
+ let t = e.filter;
665
+ return J(t) !== void 0;
666
+ });
667
+ if (!r || r.length === 0) return n;
668
+ let i = r[0].filter, a = J(i);
669
+ return n.map((e) => ({
670
+ ...e,
671
+ dateRange: a
672
+ }));
673
+ }
674
+ //#endregion
675
+ //#region src/client/shared/components/CodeBlock.tsx
676
+ var ge = ({ code: e, language: t, title: n, maxHeight: i = "16rem", height: a, className: o = "", headerRight: s }) => {
677
+ let { t: c } = d(), [l, u] = S(!1), m = x(null), h = r("copy"), g = r("check");
678
+ return y(() => {
679
+ if (!m.current) return;
680
+ let n = m.current, r = !0;
681
+ return n.textContent = e, f().then(() => {
682
+ if (!r) return;
683
+ let i = p();
684
+ i && (n.innerHTML = i.highlight(e, { language: t }).value);
685
+ }).catch(() => {
686
+ r && (n.textContent = e);
687
+ }), () => {
688
+ r = !1;
689
+ };
690
+ }, [e, t]), /* @__PURE__ */ T("div", {
691
+ className: `dc:relative ${o}`,
692
+ children: [/* @__PURE__ */ T("div", {
693
+ className: "dc:flex dc:items-center dc:justify-between dc:mb-2 dc:gap-2",
694
+ children: [n && /* @__PURE__ */ w("h4", {
695
+ className: "dc:text-sm dc:font-semibold text-dc-text",
696
+ children: n
697
+ }), /* @__PURE__ */ T("div", {
698
+ className: "dc:flex dc:items-center dc:gap-2 dc:ml-auto",
699
+ children: [s, /* @__PURE__ */ w("button", {
700
+ onClick: async () => {
701
+ try {
702
+ await navigator.clipboard.writeText(e), u(!0), setTimeout(() => u(!1), 2e3);
703
+ } catch {
704
+ let t = document.createElement("textarea");
705
+ t.value = e, t.style.position = "fixed", t.style.left = "-999999px", document.body.appendChild(t), t.select(), document.execCommand("copy"), document.body.removeChild(t), u(!0), setTimeout(() => u(!1), 2e3);
706
+ }
707
+ },
708
+ className: "dc:px-2 dc:py-1 dc:text-xs dc:rounded hover:bg-dc-surface-secondary dc:border border-dc-border dc:transition-colors dc:flex dc:items-center dc:gap-1.5",
709
+ title: l ? "Copied!" : "Copy to clipboard",
710
+ children: l ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(g, { className: "dc:w-3.5 dc:h-3.5 text-dc-success" }), /* @__PURE__ */ w("span", {
711
+ className: "text-dc-success",
712
+ children: c("common.actions.copied")
713
+ })] }) : /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(h, { className: "dc:w-3.5 dc:h-3.5 text-dc-text-secondary" }), /* @__PURE__ */ w("span", {
714
+ className: "text-dc-text-secondary",
715
+ children: c("common.actions.copy")
716
+ })] })
717
+ })]
718
+ })]
719
+ }), /* @__PURE__ */ w("div", {
720
+ className: "bg-dc-surface-secondary dc:border border-dc-border dc:rounded dc:overflow-auto",
721
+ style: a ? {
722
+ height: a,
723
+ minHeight: a,
724
+ maxHeight: a
725
+ } : { maxHeight: i },
726
+ children: /* @__PURE__ */ w("pre", {
727
+ className: "dc:p-3 dc:text-xs dc:m-0",
728
+ children: /* @__PURE__ */ w("code", {
729
+ ref: m,
730
+ className: `hljs language-${t}`,
731
+ children: e
732
+ })
733
+ })
734
+ })]
735
+ });
736
+ }, Y = [
737
+ {
738
+ name: "default",
739
+ label: "Default",
740
+ colors: [
741
+ "#3b82f6",
742
+ "#10b981",
743
+ "#f59e0b",
744
+ "#ef4444",
745
+ "#8b5cf6",
746
+ "#f97316",
747
+ "#06b6d4",
748
+ "#84cc16"
749
+ ],
750
+ gradient: [
751
+ "#fde725",
752
+ "#7ad151",
753
+ "#22a884",
754
+ "#2a788e",
755
+ "#414487",
756
+ "#440154"
757
+ ]
758
+ },
759
+ {
760
+ name: "ocean",
761
+ label: "Ocean",
762
+ colors: [
763
+ "#1e3a8a",
764
+ "#1e40af",
765
+ "#2563eb",
766
+ "#3b82f6",
767
+ "#06b6d4",
768
+ "#0891b2",
769
+ "#0e7490",
770
+ "#0f766e"
771
+ ],
772
+ gradient: [
773
+ "#38bdf8",
774
+ "#0ea5e9",
775
+ "#0284c7",
776
+ "#0369a1",
777
+ "#075985",
778
+ "#0c4a6e"
779
+ ]
780
+ },
781
+ {
782
+ name: "sunset",
783
+ label: "Sunset",
784
+ colors: [
785
+ "#dc2626",
786
+ "#ea580c",
787
+ "#f59e0b",
788
+ "#eab308",
789
+ "#d97706",
790
+ "#b45309",
791
+ "#92400e",
792
+ "#7c2d12"
793
+ ],
794
+ gradient: [
795
+ "#fbbf24",
796
+ "#f59e0b",
797
+ "#d97706",
798
+ "#b45309",
799
+ "#92400e",
800
+ "#7c2d12"
801
+ ]
802
+ },
803
+ {
804
+ name: "forest",
805
+ label: "Forest",
806
+ colors: [
807
+ "#166534",
808
+ "#15803d",
809
+ "#16a34a",
810
+ "#22c55e",
811
+ "#4ade80",
812
+ "#65a30d",
813
+ "#84cc16",
814
+ "#a3e635"
815
+ ],
816
+ gradient: [
817
+ "#4ade80",
818
+ "#22c55e",
819
+ "#16a34a",
820
+ "#15803d",
821
+ "#166534",
822
+ "#14532d"
823
+ ]
824
+ },
825
+ {
826
+ name: "purple",
827
+ label: "Purple",
828
+ colors: [
829
+ "#581c87",
830
+ "#7c3aed",
831
+ "#8b5cf6",
832
+ "#a855f7",
833
+ "#c084fc",
834
+ "#e879f9",
835
+ "#f0abfc",
836
+ "#fbbf24"
837
+ ],
838
+ gradient: [
839
+ "#a855f7",
840
+ "#8b5cf6",
841
+ "#7c3aed",
842
+ "#6d28d9",
843
+ "#581c87",
844
+ "#4c1d95"
845
+ ]
846
+ },
847
+ {
848
+ name: "monochrome",
849
+ label: "Monochrome",
850
+ colors: [
851
+ "#1f2937",
852
+ "#374151",
853
+ "#4b5563",
854
+ "#6b7280",
855
+ "#9ca3af",
856
+ "#d1d5db",
857
+ "#e5e7eb",
858
+ "#f3f4f6"
859
+ ],
860
+ gradient: [
861
+ "#9ca3af",
862
+ "#6b7280",
863
+ "#4b5563",
864
+ "#374151",
865
+ "#1f2937",
866
+ "#111827"
867
+ ]
868
+ },
869
+ {
870
+ name: "pastel",
871
+ label: "Pastel",
872
+ colors: [
873
+ "#93c5fd",
874
+ "#86efac",
875
+ "#fde047",
876
+ "#fca5a5",
877
+ "#c4b5fd",
878
+ "#fdba74",
879
+ "#67e8f9",
880
+ "#bef264"
881
+ ],
882
+ gradient: [
883
+ "#fed7aa",
884
+ "#ddd6fe",
885
+ "#fecaca",
886
+ "#fef08a",
887
+ "#a7f3d0",
888
+ "#bfdbfe"
889
+ ]
890
+ },
891
+ {
892
+ name: "vibrant",
893
+ label: "Vibrant",
894
+ colors: [
895
+ "#0000ff",
896
+ "#00ff00",
897
+ "#ffff00",
898
+ "#ff0000",
899
+ "#ff00ff",
900
+ "#ff8000",
901
+ "#00ffff",
902
+ "#8000ff"
903
+ ],
904
+ gradient: [
905
+ "#ffff00",
906
+ "#80ff00",
907
+ "#00ff80",
908
+ "#00ffff",
909
+ "#0080ff",
910
+ "#4000ff"
911
+ ]
912
+ },
913
+ {
914
+ name: "d3Category10",
915
+ label: "D3 Category 10",
916
+ colors: [
917
+ "#1f77b4",
918
+ "#ff7f0e",
919
+ "#2ca02c",
920
+ "#d62728",
921
+ "#9467bd",
922
+ "#8c564b",
923
+ "#e377c2",
924
+ "#7f7f7f",
925
+ "#bcbd22",
926
+ "#17becf"
927
+ ],
928
+ gradient: [
929
+ "#9467bd",
930
+ "#d62728",
931
+ "#ff7f0e",
932
+ "#bcbd22",
933
+ "#2ca02c",
934
+ "#1f77b4"
935
+ ]
936
+ },
937
+ {
938
+ name: "d3Tableau10",
939
+ label: "D3 Tableau 10",
940
+ colors: [
941
+ "#4e79a7",
942
+ "#f28e2c",
943
+ "#e15759",
944
+ "#76b7b2",
945
+ "#59a14f",
946
+ "#edc949",
947
+ "#af7aa1",
948
+ "#ff9da7",
949
+ "#9c755f",
950
+ "#bab0ab"
951
+ ],
952
+ gradient: [
953
+ "#e15759",
954
+ "#f28e2c",
955
+ "#edc949",
956
+ "#59a14f",
957
+ "#76b7b2",
958
+ "#4e79a7"
959
+ ]
960
+ },
961
+ {
962
+ name: "colorBrewerSet1",
963
+ label: "ColorBrewer Set 1",
964
+ colors: [
965
+ "#e41a1c",
966
+ "#377eb8",
967
+ "#4daf4a",
968
+ "#984ea3",
969
+ "#ff7f00",
970
+ "#ffff33",
971
+ "#a65628",
972
+ "#f781bf",
973
+ "#999999"
974
+ ],
975
+ gradient: [
976
+ "#984ea3",
977
+ "#e41a1c",
978
+ "#ff7f00",
979
+ "#ffff33",
980
+ "#4daf4a",
981
+ "#377eb8"
982
+ ]
983
+ },
984
+ {
985
+ name: "colorBrewerSet2",
986
+ label: "ColorBrewer Set 2",
987
+ colors: [
988
+ "#66c2a5",
989
+ "#fc8d62",
990
+ "#8da0cb",
991
+ "#e78ac3",
992
+ "#a6d854",
993
+ "#ffd92f",
994
+ "#e5c494",
995
+ "#b3b3b3"
996
+ ],
997
+ gradient: [
998
+ "#e78ac3",
999
+ "#fc8d62",
1000
+ "#ffd92f",
1001
+ "#a6d854",
1002
+ "#66c2a5",
1003
+ "#8da0cb"
1004
+ ]
1005
+ },
1006
+ {
1007
+ name: "colorBrewerDark2",
1008
+ label: "ColorBrewer Dark 2",
1009
+ colors: [
1010
+ "#1b9e77",
1011
+ "#d95f02",
1012
+ "#7570b3",
1013
+ "#e7298a",
1014
+ "#66a61e",
1015
+ "#e6ab02",
1016
+ "#a6761d",
1017
+ "#666666"
1018
+ ],
1019
+ gradient: [
1020
+ "#e7298a",
1021
+ "#d95f02",
1022
+ "#e6ab02",
1023
+ "#66a61e",
1024
+ "#1b9e77",
1025
+ "#7570b3"
1026
+ ]
1027
+ },
1028
+ {
1029
+ name: "colorBrewerPaired",
1030
+ label: "ColorBrewer Paired",
1031
+ colors: [
1032
+ "#a6cee3",
1033
+ "#1f78b4",
1034
+ "#b2df8a",
1035
+ "#33a02c",
1036
+ "#fb9a99",
1037
+ "#e31a1c",
1038
+ "#fdbf6f",
1039
+ "#ff7f00",
1040
+ "#cab2d6",
1041
+ "#6a3d9a",
1042
+ "#ffff99",
1043
+ "#b15928"
1044
+ ],
1045
+ gradient: [
1046
+ "#6a3d9a",
1047
+ "#e31a1c",
1048
+ "#ff7f00",
1049
+ "#ffff99",
1050
+ "#33a02c",
1051
+ "#1f78b4"
1052
+ ]
1053
+ },
1054
+ {
1055
+ name: "viridis",
1056
+ label: "Viridis",
1057
+ colors: [
1058
+ "#440154",
1059
+ "#482677",
1060
+ "#3f4a8a",
1061
+ "#31678e",
1062
+ "#26838f",
1063
+ "#1f9d8a",
1064
+ "#6cce5a",
1065
+ "#b6de2b"
1066
+ ],
1067
+ gradient: [
1068
+ "#b6de2b",
1069
+ "#6cce5a",
1070
+ "#1f9d8a",
1071
+ "#26838f",
1072
+ "#31678e",
1073
+ "#3f4a8a",
1074
+ "#482677",
1075
+ "#440154"
1076
+ ]
1077
+ },
1078
+ {
1079
+ name: "plasma",
1080
+ label: "Plasma",
1081
+ colors: [
1082
+ "#0c0786",
1083
+ "#5c01a6",
1084
+ "#900da4",
1085
+ "#bf3984",
1086
+ "#e16462",
1087
+ "#f99b45",
1088
+ "#fcce25",
1089
+ "#f0f921"
1090
+ ],
1091
+ gradient: [
1092
+ "#f0f921",
1093
+ "#fcce25",
1094
+ "#f99b45",
1095
+ "#e16462",
1096
+ "#bf3984",
1097
+ "#900da4",
1098
+ "#5c01a6",
1099
+ "#0c0786"
1100
+ ]
1101
+ },
1102
+ {
1103
+ name: "inferno",
1104
+ label: "Inferno",
1105
+ colors: [
1106
+ "#000003",
1107
+ "#1f0c47",
1108
+ "#550f6d",
1109
+ "#88226a",
1110
+ "#a83655",
1111
+ "#cc4f39",
1112
+ "#e6862a",
1113
+ "#fec228"
1114
+ ],
1115
+ gradient: [
1116
+ "#fec228",
1117
+ "#e6862a",
1118
+ "#cc4f39",
1119
+ "#a83655",
1120
+ "#88226a",
1121
+ "#550f6d",
1122
+ "#1f0c47",
1123
+ "#000003"
1124
+ ]
1125
+ },
1126
+ {
1127
+ name: "magma",
1128
+ label: "Magma",
1129
+ colors: [
1130
+ "#000003",
1131
+ "#140b34",
1132
+ "#3b0f6f",
1133
+ "#641a80",
1134
+ "#8b2981",
1135
+ "#b63679",
1136
+ "#de4968",
1137
+ "#fd9f6c"
1138
+ ],
1139
+ gradient: [
1140
+ "#fd9f6c",
1141
+ "#de4968",
1142
+ "#b63679",
1143
+ "#8b2981",
1144
+ "#641a80",
1145
+ "#3b0f6f",
1146
+ "#140b34",
1147
+ "#000003"
1148
+ ]
1149
+ },
1150
+ {
1151
+ name: "cividis",
1152
+ label: "Cividis",
1153
+ colors: [
1154
+ "#00204c",
1155
+ "#003f5c",
1156
+ "#2c4b7a",
1157
+ "#51576f",
1158
+ "#7f6874",
1159
+ "#a8786e",
1160
+ "#d2906d",
1161
+ "#ffb570"
1162
+ ],
1163
+ gradient: [
1164
+ "#ffb570",
1165
+ "#d2906d",
1166
+ "#a8786e",
1167
+ "#7f6874",
1168
+ "#51576f",
1169
+ "#2c4b7a",
1170
+ "#003f5c",
1171
+ "#00204c"
1172
+ ]
1173
+ },
1174
+ {
1175
+ name: "turbo",
1176
+ label: "Turbo",
1177
+ colors: [
1178
+ "#30123b",
1179
+ "#4454c4",
1180
+ "#1dd3c0",
1181
+ "#42f465",
1182
+ "#b2df22",
1183
+ "#faba39",
1184
+ "#f66c19",
1185
+ "#c42e02"
1186
+ ],
1187
+ gradient: [
1188
+ "#c42e02",
1189
+ "#f66c19",
1190
+ "#faba39",
1191
+ "#b2df22",
1192
+ "#42f465",
1193
+ "#1dd3c0",
1194
+ "#4454c4",
1195
+ "#30123b"
1196
+ ]
1197
+ },
1198
+ {
1199
+ name: "warm",
1200
+ label: "Warm",
1201
+ colors: [
1202
+ "#8b0000",
1203
+ "#b22222",
1204
+ "#cd5c5c",
1205
+ "#ff6347",
1206
+ "#ff8c00",
1207
+ "#ffa500",
1208
+ "#ffd700",
1209
+ "#ffff00"
1210
+ ],
1211
+ gradient: [
1212
+ "#ffd700",
1213
+ "#ffa500",
1214
+ "#ff8c00",
1215
+ "#ff6347",
1216
+ "#b22222",
1217
+ "#8b0000"
1218
+ ]
1219
+ },
1220
+ {
1221
+ name: "cool",
1222
+ label: "Cool",
1223
+ colors: [
1224
+ "#000080",
1225
+ "#0000ff",
1226
+ "#4169e1",
1227
+ "#00bfff",
1228
+ "#00ffff",
1229
+ "#40e0d0",
1230
+ "#20b2aa",
1231
+ "#008b8b"
1232
+ ],
1233
+ gradient: [
1234
+ "#40e0d0",
1235
+ "#00ffff",
1236
+ "#00bfff",
1237
+ "#4169e1",
1238
+ "#0000ff",
1239
+ "#000080"
1240
+ ]
1241
+ },
1242
+ {
1243
+ name: "earth",
1244
+ label: "Earth",
1245
+ colors: [
1246
+ "#8b4513",
1247
+ "#a0522d",
1248
+ "#cd853f",
1249
+ "#daa520",
1250
+ "#d2691e",
1251
+ "#bc8f8f",
1252
+ "#f4a460",
1253
+ "#deb887"
1254
+ ],
1255
+ gradient: [
1256
+ "#f4a460",
1257
+ "#d2691e",
1258
+ "#daa520",
1259
+ "#cd853f",
1260
+ "#a0522d",
1261
+ "#8b4513"
1262
+ ]
1263
+ },
1264
+ {
1265
+ name: "autumn",
1266
+ label: "Autumn",
1267
+ colors: [
1268
+ "#8b0000",
1269
+ "#a0522d",
1270
+ "#cd853f",
1271
+ "#daa520",
1272
+ "#ff8c00",
1273
+ "#ff4500",
1274
+ "#dc143c",
1275
+ "#b22222"
1276
+ ],
1277
+ gradient: [
1278
+ "#ff4500",
1279
+ "#ff8c00",
1280
+ "#daa520",
1281
+ "#cd853f",
1282
+ "#a0522d",
1283
+ "#8b0000"
1284
+ ]
1285
+ },
1286
+ {
1287
+ name: "spring",
1288
+ label: "Spring",
1289
+ colors: [
1290
+ "#32cd32",
1291
+ "#98fb98",
1292
+ "#90ee90",
1293
+ "#ffb6c1",
1294
+ "#ffc0cb",
1295
+ "#ffffe0",
1296
+ "#f0fff0",
1297
+ "#e0ffff"
1298
+ ],
1299
+ gradient: [
1300
+ "#e0ffff",
1301
+ "#ffc0cb",
1302
+ "#ffb6c1",
1303
+ "#ffffe0",
1304
+ "#98fb98",
1305
+ "#32cd32"
1306
+ ]
1307
+ },
1308
+ {
1309
+ name: "winter",
1310
+ label: "Winter",
1311
+ colors: [
1312
+ "#191970",
1313
+ "#4682b4",
1314
+ "#87ceeb",
1315
+ "#b0e0e6",
1316
+ "#e0ffff",
1317
+ "#f0f8ff",
1318
+ "#c0c0c0",
1319
+ "#708090"
1320
+ ],
1321
+ gradient: [
1322
+ "#f0f8ff",
1323
+ "#e0ffff",
1324
+ "#b0e0e6",
1325
+ "#87ceeb",
1326
+ "#4682b4",
1327
+ "#191970"
1328
+ ]
1329
+ },
1330
+ {
1331
+ name: "neon",
1332
+ label: "Neon",
1333
+ colors: [
1334
+ "#ff0080",
1335
+ "#00ff80",
1336
+ "#8000ff",
1337
+ "#ff8000",
1338
+ "#0080ff",
1339
+ "#80ff00",
1340
+ "#ff0040",
1341
+ "#40ff00"
1342
+ ],
1343
+ gradient: [
1344
+ "#ff0080",
1345
+ "#ff8000",
1346
+ "#80ff00",
1347
+ "#00ff80",
1348
+ "#0080ff",
1349
+ "#8000ff"
1350
+ ]
1351
+ },
1352
+ {
1353
+ name: "retro",
1354
+ label: "Retro",
1355
+ colors: [
1356
+ "#ff69b4",
1357
+ "#ffd700",
1358
+ "#32cd32",
1359
+ "#00ced1",
1360
+ "#ff6347",
1361
+ "#9370db",
1362
+ "#ffa500",
1363
+ "#20b2aa"
1364
+ ],
1365
+ gradient: [
1366
+ "#00ced1",
1367
+ "#32cd32",
1368
+ "#ffd700",
1369
+ "#ff6347",
1370
+ "#ff69b4",
1371
+ "#9370db"
1372
+ ]
1373
+ },
1374
+ {
1375
+ name: "corporate",
1376
+ label: "Corporate",
1377
+ colors: [
1378
+ "#003366",
1379
+ "#0066cc",
1380
+ "#336699",
1381
+ "#6699cc",
1382
+ "#4d4d4d",
1383
+ "#808080",
1384
+ "#b3b3b3",
1385
+ "#cccccc"
1386
+ ],
1387
+ gradient: [
1388
+ "#b3b3b3",
1389
+ "#808080",
1390
+ "#6699cc",
1391
+ "#336699",
1392
+ "#0066cc",
1393
+ "#003366"
1394
+ ]
1395
+ },
1396
+ {
1397
+ name: "material",
1398
+ label: "Material Design",
1399
+ colors: [
1400
+ "#f44336",
1401
+ "#e91e63",
1402
+ "#9c27b0",
1403
+ "#673ab7",
1404
+ "#3f51b5",
1405
+ "#2196f3",
1406
+ "#03a9f4",
1407
+ "#00bcd4"
1408
+ ],
1409
+ gradient: [
1410
+ "#e91e63",
1411
+ "#03a9f4",
1412
+ "#00bcd4",
1413
+ "#2196f3",
1414
+ "#3f51b5",
1415
+ "#673ab7"
1416
+ ]
1417
+ }
1418
+ ];
1419
+ function X(e) {
1420
+ return e && Y.find((t) => t.name === e) || Y[0];
1421
+ }
1422
+ //#endregion
1423
+ //#region src/client/components/ColorPaletteSelector.tsx
1424
+ var _e = r("chevronDown");
1425
+ function ve({ currentPalette: e = "default", onPaletteChange: t, className: n = "" }) {
1426
+ let [r, i] = S(!1), a = x(null), o = X(e);
1427
+ y(() => {
1428
+ function e(e) {
1429
+ a.current && !a.current.contains(e.target) && i(!1);
1430
+ }
1431
+ if (r) return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
1432
+ }, [r]);
1433
+ let s = (e) => {
1434
+ t(e), i(!1);
1435
+ };
1436
+ return /* @__PURE__ */ T("div", {
1437
+ className: `dc:relative ${n}`,
1438
+ ref: a,
1439
+ children: [/* @__PURE__ */ T("button", {
1440
+ type: "button",
1441
+ onClick: () => i(!r),
1442
+ className: "dc:inline-flex dc:items-center dc:gap-2 dc:px-3 dc:py-1.5 bg-dc-surface dc:border border-dc-border dc:rounded-md shadow-xs dc:text-sm dc:font-medium text-dc-text-secondary hover:bg-dc-surface-hover focus:outline-hidden dc:focus:ring-2 dc:focus:ring-offset-2 focus:ring-dc-accent",
1443
+ children: [
1444
+ /* @__PURE__ */ T("div", {
1445
+ className: "dc:hidden dc:md:flex dc:items-center dc:gap-1.5",
1446
+ children: [
1447
+ /* @__PURE__ */ w("div", {
1448
+ className: "dc:flex dc:gap-0.5",
1449
+ children: o.colors.slice(0, 4).map((e, t) => /* @__PURE__ */ w("div", {
1450
+ className: "dc:w-3 dc:h-3 rounded-xs dc:border border-dc-border",
1451
+ style: { backgroundColor: e },
1452
+ title: `Series Color ${t + 1}`
1453
+ }, t))
1454
+ }),
1455
+ /* @__PURE__ */ w("span", {
1456
+ className: "dc:text-xs text-dc-text-secondary",
1457
+ children: "|"
1458
+ }),
1459
+ /* @__PURE__ */ w("div", {
1460
+ className: "dc:flex dc:gap-0.5",
1461
+ children: o.gradient.slice(0, 3).map((e, t) => /* @__PURE__ */ w("div", {
1462
+ className: "dc:w-2 dc:h-3 dc:border-r dc:first:rounded-l-sm dc:last:rounded-r-sm dc:last:border-r-0",
1463
+ style: {
1464
+ backgroundColor: e,
1465
+ borderColor: "var(--dc-border)"
1466
+ },
1467
+ title: `Gradient Color ${t + 1}`
1468
+ }, t))
1469
+ })
1470
+ ]
1471
+ }),
1472
+ /* @__PURE__ */ w("span", { children: o.label }),
1473
+ /* @__PURE__ */ w(_e, { className: `dc:w-4 dc:h-4 dc:transition-transform ${r ? "dc:rotate-180" : ""}` })
1474
+ ]
1475
+ }), r && /* @__PURE__ */ w("div", {
1476
+ className: "dc:absolute dc:top-full dc:left-0 dc:mt-1 dc:w-72 dc:md:w-80 dc:lg:w-96 bg-dc-surface dc:border border-dc-border dc:rounded-md dc:shadow-lg dc:z-50 dc:max-h-80 dc:overflow-y-auto",
1477
+ children: /* @__PURE__ */ w("div", {
1478
+ className: "dc:py-1",
1479
+ children: Y.slice().sort((e, t) => e.label.localeCompare(t.label)).map((t) => /* @__PURE__ */ w("button", {
1480
+ type: "button",
1481
+ onClick: () => s(t.name),
1482
+ className: `dc:w-full dc:px-3 dc:py-2 dc:text-left dc:text-sm hover:bg-dc-surface-hover focus:outline-hidden focus:bg-dc-surface-hover ${t.name === e ? "bg-dc-surface-secondary" : "text-dc-text-secondary"}`,
1483
+ style: t.name === e ? { color: "var(--dc-primary)" } : void 0,
1484
+ children: /* @__PURE__ */ T("div", {
1485
+ className: "dc:flex dc:items-center dc:gap-3",
1486
+ children: [
1487
+ /* @__PURE__ */ T("div", {
1488
+ className: "dc:hidden dc:md:flex dc:items-center dc:gap-2",
1489
+ children: [
1490
+ /* @__PURE__ */ w("div", {
1491
+ className: "dc:flex dc:gap-0.5",
1492
+ children: t.colors.slice(0, 6).map((e, t) => /* @__PURE__ */ w("div", {
1493
+ className: "dc:w-3 dc:h-3 rounded-xs dc:border border-dc-border",
1494
+ style: { backgroundColor: e }
1495
+ }, `series-${t}`))
1496
+ }),
1497
+ /* @__PURE__ */ w("div", { className: "dc:w-px dc:h-4 bg-dc-border" }),
1498
+ /* @__PURE__ */ w("div", {
1499
+ className: "dc:flex",
1500
+ children: t.gradient.map((e, t) => /* @__PURE__ */ w("div", {
1501
+ className: "dc:w-2 dc:h-4 dc:first:rounded-l-sm dc:last:rounded-r-sm",
1502
+ style: { backgroundColor: e }
1503
+ }, `gradient-${t}`))
1504
+ })
1505
+ ]
1506
+ }),
1507
+ /* @__PURE__ */ w("span", {
1508
+ className: "dc:font-medium",
1509
+ children: t.label
1510
+ }),
1511
+ t.name === e && /* @__PURE__ */ w("div", {
1512
+ className: "dc:ml-auto",
1513
+ children: /* @__PURE__ */ w("div", {
1514
+ className: "dc:w-2 dc:h-2 dc:rounded-full",
1515
+ style: { backgroundColor: "var(--dc-primary)" }
1516
+ })
1517
+ })
1518
+ ]
1519
+ })
1520
+ }, t.name))
1521
+ })
1522
+ })]
1523
+ });
1524
+ }
1525
+ //#endregion
1526
+ //#region src/client/components/AnalysisBuilder/utils/idUtils.ts
1527
+ function Z() {
1528
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1529
+ }
1530
+ function ye(e) {
1531
+ let t = "", n = e;
1532
+ do
1533
+ t = String.fromCharCode(65 + n % 26) + t, n = Math.floor(n / 26) - 1;
1534
+ while (n >= 0);
1535
+ return t;
1536
+ }
1537
+ //#endregion
1538
+ //#region src/client/components/AnalysisBuilder/utils/fieldUtils.ts
1539
+ function be(e, t) {
1540
+ if (!t) return null;
1541
+ for (let n of t.cubes) {
1542
+ let t = n.measures.find((t) => t.name === e);
1543
+ if (t) return {
1544
+ field: t,
1545
+ cubeName: n.name,
1546
+ fieldType: "measure"
1547
+ };
1548
+ let r = n.dimensions.find((t) => t.name === e);
1549
+ if (r) return {
1550
+ field: r,
1551
+ cubeName: n.name,
1552
+ fieldType: r.type === "time" ? "timeDimension" : "dimension"
1553
+ };
1554
+ }
1555
+ return null;
1556
+ }
1557
+ function xe(e, t) {
1558
+ let n = be(e, t);
1559
+ return n && (n.field.title || n.field.shortTitle) || e;
1560
+ }
1561
+ function Se(e, t) {
1562
+ return {
1563
+ name: t.name,
1564
+ title: t.title || t.shortTitle || t.name,
1565
+ shortTitle: t.shortTitle || t.title || t.name,
1566
+ type: t.type,
1567
+ description: t.description,
1568
+ cubeName: e,
1569
+ fieldType: "measure"
1570
+ };
1571
+ }
1572
+ function Ce(e, t) {
1573
+ return {
1574
+ name: t.name,
1575
+ title: t.title || t.shortTitle || t.name,
1576
+ shortTitle: t.shortTitle || t.title || t.name,
1577
+ type: t.type,
1578
+ description: t.description,
1579
+ cubeName: e,
1580
+ fieldType: t.type === "time" ? "timeDimension" : "dimension"
1581
+ };
1582
+ }
1583
+ function we(e, t) {
1584
+ if (!e) return [];
1585
+ let n = t === "metrics" || t === "filter", r = t !== "metrics", i = [];
1586
+ for (let t of e.cubes) {
1587
+ if (n) for (let e of t.measures) i.push(Se(t.name, e));
1588
+ if (r) for (let e of t.dimensions) i.push(Ce(t.name, e));
1589
+ }
1590
+ return i;
1591
+ }
1592
+ function Te(e, t, n) {
1593
+ let r = e;
1594
+ if (n && n !== "all" && (r = r.filter((e) => e.cubeName === n)), t.trim()) {
1595
+ let e = t.toLowerCase();
1596
+ r = r.filter((t) => t.name.toLowerCase().includes(e) || t.title.toLowerCase().includes(e) || (t.description?.toLowerCase().includes(e) ?? !1));
1597
+ }
1598
+ return r;
1599
+ }
1600
+ function Ee(e) {
1601
+ let t = /* @__PURE__ */ new Map();
1602
+ for (let n of e) {
1603
+ let e = t.get(n.cubeName) || [];
1604
+ e.push(n), t.set(n.cubeName, e);
1605
+ }
1606
+ return t;
1607
+ }
1608
+ function De(e) {
1609
+ return e ? e.cubes.map((e) => e.name) : [];
1610
+ }
1611
+ function Q(e, t) {
1612
+ return t && t.cubes.find((t) => t.name === e)?.title || e;
1613
+ }
1614
+ function Oe(e, t) {
1615
+ let n = /* @__PURE__ */ new Set();
1616
+ if (!t) return n;
1617
+ n.add(e);
1618
+ let r = t.cubes.find((t) => t.name === e);
1619
+ if (!r || !r.relationships) return n;
1620
+ for (let e of r.relationships) n.add(e.targetCube);
1621
+ return n;
1622
+ }
1623
+ function ke(e, t) {
1624
+ if (!t) return null;
1625
+ let n = Oe(e, t);
1626
+ return { cubes: t.cubes.filter((e) => n.has(e.name)).map((e) => ({
1627
+ ...e,
1628
+ description: e.description || ""
1629
+ })) };
1630
+ }
1631
+ //#endregion
1632
+ //#region src/client/components/AnalysisBuilder/utils/recentFieldsUtils.ts
1633
+ var Ae = "drizzle-cube-recent-fields", je = 10;
1634
+ function Me() {
1635
+ try {
1636
+ let e = localStorage.getItem(Ae);
1637
+ if (e) return JSON.parse(e);
1638
+ } catch {}
1639
+ return {
1640
+ metrics: [],
1641
+ breakdowns: []
1642
+ };
1643
+ }
1644
+ function Ne(e, t) {
1645
+ try {
1646
+ let n = Me(), r = n[t].filter((t) => t !== e);
1647
+ r.unshift(e), n[t] = r.slice(0, je), localStorage.setItem(Ae, JSON.stringify(n));
1648
+ } catch {}
1649
+ }
1650
+ function Pe(e, t, n) {
1651
+ if (!e || n.length === 0) return [];
1652
+ let r = we(e, t), i = [];
1653
+ for (let e of n) {
1654
+ let t = r.find((t) => t.name === e);
1655
+ t && i.push(t);
1656
+ }
1657
+ return i;
1658
+ }
1659
+ //#endregion
1660
+ //#region src/client/components/AnalysisBuilder/FieldDetailPanel.tsx
1661
+ function Fe({ field: n }) {
1662
+ let { t: r } = d();
1663
+ return n ? /* @__PURE__ */ T("div", {
1664
+ className: "dc:p-4",
1665
+ children: [
1666
+ /* @__PURE__ */ T("div", {
1667
+ className: "dc:flex dc:items-start dc:gap-3 dc:mb-4",
1668
+ children: [/* @__PURE__ */ w("span", {
1669
+ className: `dc:shrink-0 dc:w-12 dc:h-12 dc:flex dc:items-center dc:justify-center dc:rounded-lg ${n.fieldType === "measure" ? "bg-dc-measure text-dc-measure-text" : n.fieldType === "timeDimension" ? "bg-dc-time-dimension text-dc-time-dimension-text" : "bg-dc-dimension text-dc-dimension-text"}`,
1670
+ children: (() => {
1671
+ if (n.fieldType === "measure") {
1672
+ let t = e(n.type);
1673
+ return t ? /* @__PURE__ */ w(t, { className: "dc:w-6 dc:h-6" }) : null;
1674
+ } else if (n.fieldType === "timeDimension") {
1675
+ let e = t("time");
1676
+ return e ? /* @__PURE__ */ w(e, { className: "dc:w-6 dc:h-6" }) : null;
1677
+ } else {
1678
+ let e = t("dimension");
1679
+ return e ? /* @__PURE__ */ w(e, { className: "dc:w-6 dc:h-6" }) : null;
1680
+ }
1681
+ })()
1682
+ }), /* @__PURE__ */ T("div", {
1683
+ className: "dc:flex-1 dc:min-w-0",
1684
+ children: [/* @__PURE__ */ w("h3", {
1685
+ className: "dc:text-base dc:font-semibold text-dc-text dc:leading-tight",
1686
+ children: n.title
1687
+ }), /* @__PURE__ */ w("p", {
1688
+ className: "dc:text-xs text-dc-text-muted dc:mt-0.5 dc:truncate",
1689
+ children: n.name
1690
+ })]
1691
+ })]
1692
+ }),
1693
+ n.description && /* @__PURE__ */ w("div", {
1694
+ className: "dc:mb-4",
1695
+ children: /* @__PURE__ */ w("p", {
1696
+ className: "dc:text-sm text-dc-text-secondary dc:leading-relaxed",
1697
+ children: n.description
1698
+ })
1699
+ }),
1700
+ /* @__PURE__ */ T("div", {
1701
+ className: "dc:space-y-3 dc:pt-4 dc:border-t border-dc-border",
1702
+ children: [
1703
+ /* @__PURE__ */ T("div", {
1704
+ className: "dc:flex dc:items-center dc:justify-between",
1705
+ children: [/* @__PURE__ */ w("span", {
1706
+ className: "dc:text-xs text-dc-text-muted",
1707
+ children: r("fieldPanel.labels.type")
1708
+ }), /* @__PURE__ */ w("span", {
1709
+ className: "dc:text-sm text-dc-text dc:font-medium",
1710
+ children: n.fieldType === "measure" ? {
1711
+ count: r("fieldTypes.count"),
1712
+ countDistinct: r("fieldTypes.countDistinct"),
1713
+ countDistinctApprox: r("fieldTypes.countDistinctApprox"),
1714
+ sum: r("fieldTypes.sum"),
1715
+ avg: r("fieldTypes.avg"),
1716
+ min: r("fieldTypes.min"),
1717
+ max: r("fieldTypes.max"),
1718
+ runningTotal: r("fieldTypes.runningTotal"),
1719
+ number: r("fieldTypes.number")
1720
+ }[n.type] || n.type : n.fieldType === "timeDimension" ? r("fieldTypes.time") : {
1721
+ string: r("fieldTypes.string"),
1722
+ number: r("fieldTypes.number"),
1723
+ boolean: r("fieldTypes.boolean"),
1724
+ geo: r("fieldTypes.geo")
1725
+ }[n.type] || r("fieldTypes.dimension")
1726
+ })]
1727
+ }),
1728
+ /* @__PURE__ */ T("div", {
1729
+ className: "dc:flex dc:items-center dc:justify-between",
1730
+ children: [/* @__PURE__ */ w("span", {
1731
+ className: "dc:text-xs text-dc-text-muted",
1732
+ children: r("fieldPanel.labels.cube")
1733
+ }), /* @__PURE__ */ w("span", {
1734
+ className: "dc:text-sm text-dc-text dc:font-medium",
1735
+ children: n.cubeName
1736
+ })]
1737
+ }),
1738
+ /* @__PURE__ */ T("div", {
1739
+ className: "dc:flex dc:items-center dc:justify-between",
1740
+ children: [/* @__PURE__ */ w("span", {
1741
+ className: "dc:text-xs text-dc-text-muted",
1742
+ children: r("fieldPanel.labels.category")
1743
+ }), /* @__PURE__ */ w("span", {
1744
+ className: `dc:text-xs dc:px-2 dc:py-0.5 dc:rounded dc:font-medium ${n.fieldType === "measure" ? "bg-dc-measure text-dc-measure-text" : n.fieldType === "timeDimension" ? "bg-dc-time-dimension text-dc-time-dimension-text" : "bg-dc-dimension text-dc-dimension-text"}`,
1745
+ children: r(n.fieldType === "measure" ? "fieldCategory.measure" : n.fieldType === "timeDimension" ? "fieldCategory.timeDimension" : "fieldCategory.dimension")
1746
+ })]
1747
+ })
1748
+ ]
1749
+ }),
1750
+ /* @__PURE__ */ w("div", {
1751
+ className: "dc:mt-6 dc:p-3 bg-dc-surface dc:rounded-lg",
1752
+ children: /* @__PURE__ */ w("p", {
1753
+ className: "dc:text-xs text-dc-text-muted",
1754
+ children: r("fieldPanel.usageHint")
1755
+ })
1756
+ })
1757
+ ]
1758
+ }) : /* @__PURE__ */ w("div", {
1759
+ className: "dc:p-6 dc:text-center text-dc-text-muted",
1760
+ children: /* @__PURE__ */ w("p", {
1761
+ className: "dc:text-sm",
1762
+ children: r("fieldPanel.emptyState")
1763
+ })
1764
+ });
1765
+ }
1766
+ var Ie = _(Fe), Le = r("check");
1767
+ function Re({ field: n, isSelected: r, isFocused: i, onClick: a, onMouseEnter: o, ...s }) {
1768
+ let c = () => {
1769
+ if (n.fieldType === "measure") {
1770
+ let t = e(n.type);
1771
+ return t ? /* @__PURE__ */ w(t, { className: "dc:w-4 dc:h-4" }) : null;
1772
+ } else if (n.fieldType === "timeDimension") {
1773
+ let e = t("time");
1774
+ return e ? /* @__PURE__ */ w(e, { className: "dc:w-4 dc:h-4" }) : null;
1775
+ } else {
1776
+ let e = t("dimension");
1777
+ return e ? /* @__PURE__ */ w(e, { className: "dc:w-4 dc:h-4" }) : null;
1778
+ }
1779
+ }, l = () => n.fieldType === "measure" ? "bg-dc-measure text-dc-measure-text" : n.fieldType === "timeDimension" ? "bg-dc-time-dimension text-dc-time-dimension-text" : "bg-dc-dimension text-dc-dimension-text", u = () => n.fieldType === "measure" ? n.type.charAt(0).toUpperCase() + n.type.slice(1) : n.fieldType === "timeDimension" ? "Time" : "Dim";
1780
+ return /* @__PURE__ */ T("button", {
1781
+ onClick: a,
1782
+ onMouseEnter: o,
1783
+ className: `dc:w-full dc:text-left dc:px-3 dc:py-2 dc:rounded-lg dc:flex dc:items-center dc:gap-3 dc:transition-colors dc:group ${i ? "bg-dc-primary/10 dc:ring-1 ring-dc-primary" : r ? "bg-dc-success/10" : "hover:bg-dc-surface-hover"}`,
1784
+ ...s,
1785
+ children: [
1786
+ /* @__PURE__ */ w("span", {
1787
+ className: `dc:shrink-0 dc:w-8 dc:h-8 dc:flex dc:items-center dc:justify-center dc:rounded-md ${n.fieldType === "measure" ? "bg-dc-measure text-dc-measure-text" : n.fieldType === "timeDimension" ? "bg-dc-time-dimension text-dc-time-dimension-text" : "bg-dc-dimension text-dc-dimension-text"}`,
1788
+ children: c()
1789
+ }),
1790
+ /* @__PURE__ */ T("div", {
1791
+ className: "dc:flex-1 dc:min-w-0",
1792
+ children: [/* @__PURE__ */ w("div", {
1793
+ className: "dc:text-sm dc:font-medium text-dc-text dc:truncate",
1794
+ children: n.title
1795
+ }), /* @__PURE__ */ w("div", {
1796
+ className: "dc:text-xs text-dc-text-muted dc:truncate",
1797
+ children: n.name
1798
+ })]
1799
+ }),
1800
+ /* @__PURE__ */ w("span", {
1801
+ className: `dc:shrink-0 dc:px-2 dc:py-0.5 dc:rounded dc:text-xs dc:font-medium ${l()}`,
1802
+ children: u()
1803
+ }),
1804
+ r && /* @__PURE__ */ w("span", {
1805
+ className: "dc:shrink-0 dc:w-5 dc:h-5 dc:flex dc:items-center dc:justify-center dc:rounded-full bg-dc-success text-white",
1806
+ children: /* @__PURE__ */ w(Le, { className: "dc:w-3 dc:h-3" })
1807
+ })
1808
+ ]
1809
+ });
1810
+ }
1811
+ var ze = _(Re);
1812
+ //#endregion
1813
+ //#region src/client/components/AnalysisBuilder/FieldSearchResults.tsx
1814
+ function Be(e, t, n, r, i) {
1815
+ let a = Array.from(e.entries()), o = Array.from(e.keys()).indexOf(n);
1816
+ return t + a.slice(0, o).reduce((e, [, t]) => e + t.length, 0) + r.indexOf(i);
1817
+ }
1818
+ var Ve = _(function({ mode: e, schema: t, searchTerm: n, recentOptions: r, groupedFields: i, filteredCount: a, selectedFields: o, focusedIndex: s, onSelectField: c, onFocusField: l }) {
1819
+ let { t: u } = d();
1820
+ if (a === 0 && r.length === 0) {
1821
+ let t;
1822
+ return t = n ? u(e === "metrics" ? "fieldSearch.empty.noMatchMetrics" : "fieldSearch.empty.noMatchDimensions", { searchTerm: n }) : u(e === "metrics" ? "fieldSearch.empty.noMetrics" : "fieldSearch.empty.noDimensions"), /* @__PURE__ */ T("div", {
1823
+ className: "dc:text-center dc:py-12 text-dc-text-muted",
1824
+ children: [/* @__PURE__ */ w("p", {
1825
+ className: "dc:text-lg dc:mb-2",
1826
+ children: u("fieldSearch.empty.heading")
1827
+ }), /* @__PURE__ */ w("p", {
1828
+ className: "dc:text-sm",
1829
+ children: t
1830
+ })]
1831
+ });
1832
+ }
1833
+ let f = (e, t, n = "") => /* @__PURE__ */ w(ze, {
1834
+ field: e,
1835
+ isSelected: o.includes(e.name),
1836
+ isFocused: s === t,
1837
+ onClick: (n) => c(e, t, n.shiftKey),
1838
+ onMouseEnter: () => l(e, t),
1839
+ "data-field-index": t
1840
+ }, `${n}${e.name}`);
1841
+ return /* @__PURE__ */ T("div", {
1842
+ className: "dc:space-y-6",
1843
+ children: [r.length > 0 && /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h3", {
1844
+ className: "dc:text-xs dc:font-semibold text-dc-text-muted dc:uppercase dc:tracking-wider dc:mb-2",
1845
+ children: u("fieldSearch.section.recents")
1846
+ }), /* @__PURE__ */ w("div", {
1847
+ className: "dc:space-y-1",
1848
+ children: r.map((e, t) => f(e, t, "recent-"))
1849
+ })] }), Array.from(i.entries()).map(([e, n]) => /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h3", {
1850
+ className: "dc:text-xs dc:font-semibold text-dc-text-muted dc:uppercase dc:tracking-wider dc:mb-2",
1851
+ children: Q(e, t)
1852
+ }), /* @__PURE__ */ w("div", {
1853
+ className: "dc:space-y-1",
1854
+ children: n.map((t) => f(t, Be(i, r.length, e, n, t)))
1855
+ })] }, e))]
1856
+ });
1857
+ });
1858
+ //#endregion
1859
+ //#region src/client/components/AnalysisBuilder/hooks/useFieldSearchKeyboard.ts
1860
+ function He(e, t, n) {
1861
+ let [r, i] = S(null), [a, o] = S(-1), s = x(null), c = v((t) => {
1862
+ o((n) => {
1863
+ let r = t > 0 ? Math.min(n + 1, e.length - 1) : Math.max(n - 1, 0);
1864
+ return i(e[r]), r;
1865
+ });
1866
+ }, [e]), l = v((r) => {
1867
+ if (e.length !== 0) switch (r.key) {
1868
+ case "ArrowDown":
1869
+ r.preventDefault(), c(1);
1870
+ break;
1871
+ case "ArrowUp":
1872
+ r.preventDefault(), c(-1);
1873
+ break;
1874
+ case "Enter":
1875
+ r.preventDefault(), a >= 0 && e[a] && t(e[a], a, r.shiftKey);
1876
+ break;
1877
+ case "Escape":
1878
+ r.preventDefault(), n();
1879
+ break;
1880
+ }
1881
+ }, [
1882
+ e,
1883
+ a,
1884
+ c,
1885
+ t,
1886
+ n
1887
+ ]);
1888
+ return y(() => {
1889
+ if (a >= 0 && s.current) {
1890
+ let e = s.current.querySelector(`[data-field-index="${a}"]`);
1891
+ e && e.scrollIntoView({
1892
+ block: "nearest",
1893
+ behavior: "smooth"
1894
+ });
1895
+ }
1896
+ }, [a]), {
1897
+ focusedField: r,
1898
+ setFocusedField: i,
1899
+ focusedIndex: a,
1900
+ setFocusedIndex: o,
1901
+ resultsContainerRef: s,
1902
+ handleKeyDown: l
1903
+ };
1904
+ }
1905
+ //#endregion
1906
+ //#region src/client/components/AnalysisBuilder/FieldSearchModal.tsx
1907
+ var Ue = r("search"), We = r("close");
1908
+ function Ge({ isOpen: e, onClose: t, onSelect: n, mode: r, schema: i, selectedFields: a, recentFields: o }) {
1909
+ let { t: s } = d(), [c, l] = S(""), [u, f] = S(null), [p, m] = S(null), h = x(null), g = b(() => {
1910
+ if (o) return o;
1911
+ let e = Me();
1912
+ return r === "metrics" ? e.metrics : e.breakdowns;
1913
+ }, [o, r]), _ = r, C = b(() => we(i, _), [i, _]), E = b(() => De(i), [i]), D = b(() => Te(C, c, u), [
1914
+ C,
1915
+ c,
1916
+ u
1917
+ ]), O = b(() => Ee(D), [D]), k = b(() => c.trim() ? [] : Pe(i, _, g).filter((e) => !u || e.cubeName === u), [
1918
+ i,
1919
+ _,
1920
+ g,
1921
+ c,
1922
+ u
1923
+ ]), A = b(() => {
1924
+ let e = [...k];
1925
+ return O.forEach((t) => {
1926
+ e.push(...t);
1927
+ }), e;
1928
+ }, [k, O]);
1929
+ y(() => {
1930
+ e && h.current && h.current.focus();
1931
+ }, [e]);
1932
+ let j = v((e, t = !1) => {
1933
+ Ne(e.name, r === "metrics" ? "metrics" : "breakdowns"), n({
1934
+ name: e.name,
1935
+ title: e.title,
1936
+ shortTitle: e.shortTitle,
1937
+ type: e.type,
1938
+ description: e.description
1939
+ }, e.fieldType, e.cubeName, t);
1940
+ }, [r, n]), M = v((e, t, n = !1) => {
1941
+ if (n && p !== null && p !== t) {
1942
+ let e = Math.min(p, t), n = Math.max(p, t);
1943
+ for (let t = e; t <= n; t++) {
1944
+ let e = A[t];
1945
+ e && !a.includes(e.name) && j(e, !0);
1946
+ }
1947
+ } else n ? j(e, !0) : j(e, !1);
1948
+ m(t);
1949
+ }, [
1950
+ A,
1951
+ p,
1952
+ j,
1953
+ a
1954
+ ]), { focusedField: N, setFocusedField: P, focusedIndex: F, setFocusedIndex: I, resultsContainerRef: L, handleKeyDown: ee } = He(A, M, t), R = v((e, t) => {
1955
+ P(e), I(t);
1956
+ }, [P, I]);
1957
+ if (y(() => {
1958
+ e || (l(""), f(null), P(null), I(-1), m(null));
1959
+ }, [
1960
+ e,
1961
+ P,
1962
+ I
1963
+ ]), !e) return null;
1964
+ let z = s(r === "metrics" ? "fieldSearch.placeholder.metrics" : r === "filter" ? "fieldSearch.placeholder.filter" : "fieldSearch.placeholder.dimensions"), te = s(r === "metrics" ? "fieldSearch.modal.title.metrics" : r === "filter" ? "fieldSearch.modal.title.filter" : "fieldSearch.modal.title.dimensions"), B = F >= 0 && A[F] ? `field-option-${A[F].name.replace(/\./g, "-")}` : void 0;
1965
+ return /* @__PURE__ */ w("div", {
1966
+ className: "dc:fixed dc:inset-0 dc:z-50 dc:flex dc:items-center dc:justify-center",
1967
+ style: { backgroundColor: "var(--dc-overlay)" },
1968
+ onClick: t,
1969
+ role: "presentation",
1970
+ children: /* @__PURE__ */ T("div", {
1971
+ role: "dialog",
1972
+ "aria-modal": "true",
1973
+ "aria-label": te,
1974
+ className: "bg-dc-surface dc:shadow-xl dc:w-full dc:h-full dc:md:rounded-lg dc:md:w-[900px] dc:md:max-w-[900px] dc:md:h-[80vh] dc:md:max-h-[700px] dc:flex dc:flex-col dc:overflow-hidden",
1975
+ onClick: (e) => e.stopPropagation(),
1976
+ onKeyDown: ee,
1977
+ children: [
1978
+ /* @__PURE__ */ T("div", {
1979
+ className: "dc:shrink-0 dc:border-b border-dc-border",
1980
+ children: [/* @__PURE__ */ T("div", {
1981
+ className: "dc:flex dc:items-center dc:px-4 dc:py-3 dc:gap-3",
1982
+ children: [
1983
+ /* @__PURE__ */ w(Ue, {
1984
+ className: "dc:w-5 dc:h-5 text-dc-text-muted",
1985
+ "aria-hidden": !0
1986
+ }),
1987
+ /* @__PURE__ */ w("input", {
1988
+ ref: h,
1989
+ type: "text",
1990
+ value: c,
1991
+ onChange: (e) => {
1992
+ l(e.target.value), I(-1);
1993
+ },
1994
+ placeholder: z,
1995
+ className: "dc:flex-1 bg-transparent dc:border-none dc:outline-none text-dc-text placeholder-dc-text-muted dc:text-lg",
1996
+ "aria-label": z,
1997
+ "aria-controls": "field-search-results",
1998
+ "aria-activedescendant": B,
1999
+ role: "combobox",
2000
+ "aria-expanded": "true",
2001
+ "aria-autocomplete": "list"
2002
+ }),
2003
+ /* @__PURE__ */ w("button", {
2004
+ onClick: t,
2005
+ className: "dc:p-1 text-dc-text-secondary hover:text-dc-text dc:rounded",
2006
+ "aria-label": "Close dialog",
2007
+ children: /* @__PURE__ */ w(We, {
2008
+ className: "dc:w-5 dc:h-5",
2009
+ "aria-hidden": !0
2010
+ })
2011
+ })
2012
+ ]
2013
+ }), E.length > 1 && /* @__PURE__ */ w("div", {
2014
+ className: "dc:md:hidden dc:px-4 dc:pb-3",
2015
+ children: /* @__PURE__ */ T("select", {
2016
+ value: u || "",
2017
+ onChange: (e) => f(e.target.value || null),
2018
+ className: "dc:w-full dc:px-3 dc:py-2 bg-dc-surface dc:border border-dc-border dc:rounded-lg dc:text-sm text-dc-text dc:focus:outline-none dc:focus:ring-1 focus:ring-dc-primary",
2019
+ "aria-label": "Filter by cube",
2020
+ children: [/* @__PURE__ */ w("option", {
2021
+ value: "",
2022
+ children: s("fieldSearch.filter.allCubes")
2023
+ }), E.map((e) => /* @__PURE__ */ w("option", {
2024
+ value: e,
2025
+ children: Q(e, i)
2026
+ }, e))]
2027
+ })
2028
+ })]
2029
+ }),
2030
+ /* @__PURE__ */ T("div", {
2031
+ className: "dc:flex-1 dc:flex dc:overflow-hidden",
2032
+ children: [
2033
+ /* @__PURE__ */ w("nav", {
2034
+ className: "dc:hidden dc:md:block dc:w-48 dc:shrink-0 dc:border-r border-dc-border dc:overflow-y-auto bg-dc-surface-secondary",
2035
+ "aria-label": "Filter by cube",
2036
+ children: /* @__PURE__ */ T("div", {
2037
+ className: "dc:p-2",
2038
+ role: "group",
2039
+ "aria-label": "Cube categories",
2040
+ children: [/* @__PURE__ */ w("button", {
2041
+ onClick: () => f(null),
2042
+ className: `dc:w-full dc:text-left dc:px-3 dc:py-2 dc:rounded-md dc:text-sm dc:transition-colors ${u === null ? "bg-dc-primary/10 text-dc-primary dc:font-medium" : "text-dc-text hover:bg-dc-surface-hover"}`,
2043
+ "aria-pressed": u === null,
2044
+ children: s("fieldSearch.categories.all")
2045
+ }), E.map((e) => /* @__PURE__ */ w("button", {
2046
+ onClick: () => f(e),
2047
+ className: `dc:w-full dc:text-left dc:px-3 dc:py-2 dc:rounded-md dc:text-sm dc:transition-colors dc:truncate ${u === e ? "bg-dc-primary/10 text-dc-primary dc:font-medium" : "text-dc-text hover:bg-dc-surface-hover"}`,
2048
+ title: Q(e, i),
2049
+ "aria-pressed": u === e,
2050
+ children: Q(e, i)
2051
+ }, e))]
2052
+ })
2053
+ }),
2054
+ /* @__PURE__ */ w("div", {
2055
+ id: "field-search-results",
2056
+ ref: L,
2057
+ className: "dc:flex-1 dc:overflow-y-auto dc:p-4",
2058
+ role: "listbox",
2059
+ "aria-label": "Available fields",
2060
+ children: /* @__PURE__ */ w(Ve, {
2061
+ mode: r,
2062
+ schema: i,
2063
+ searchTerm: c,
2064
+ recentOptions: k,
2065
+ groupedFields: O,
2066
+ filteredCount: D.length,
2067
+ selectedFields: a,
2068
+ focusedIndex: F,
2069
+ onSelectField: M,
2070
+ onFocusField: R
2071
+ })
2072
+ }),
2073
+ /* @__PURE__ */ w("div", {
2074
+ className: "dc:hidden dc:md:block dc:w-72 dc:shrink-0 dc:border-l border-dc-border bg-dc-surface-secondary dc:overflow-y-auto",
2075
+ children: /* @__PURE__ */ w(Ie, { field: N })
2076
+ })
2077
+ ]
2078
+ }),
2079
+ /* @__PURE__ */ T("div", {
2080
+ className: "dc:shrink-0 dc:border-t border-dc-border dc:px-4 dc:py-3 dc:flex dc:items-center dc:justify-between dc:text-sm text-dc-text-muted",
2081
+ children: [/* @__PURE__ */ T("div", { children: [
2082
+ /* @__PURE__ */ w("span", {
2083
+ className: "text-dc-text-secondary",
2084
+ children: D.length
2085
+ }),
2086
+ " ",
2087
+ s(r === "metrics" ? "fieldSearch.footer.metricsAvailable" : r === "filter" ? "fieldSearch.footer.fieldsAvailable" : "fieldSearch.footer.dimensionsAvailable")
2088
+ ] }), /* @__PURE__ */ T("div", {
2089
+ className: "dc:hidden dc:md:flex dc:items-center dc:gap-4",
2090
+ children: [
2091
+ /* @__PURE__ */ T("span", { children: [
2092
+ /* @__PURE__ */ w("kbd", {
2093
+ className: "dc:px-1.5 dc:py-0.5 bg-dc-surface-tertiary dc:rounded dc:text-xs",
2094
+ children: "↑↓"
2095
+ }),
2096
+ " ",
2097
+ s("fieldSearch.shortcut.navigate")
2098
+ ] }),
2099
+ /* @__PURE__ */ T("span", { children: [
2100
+ /* @__PURE__ */ w("kbd", {
2101
+ className: "dc:px-1.5 dc:py-0.5 bg-dc-surface-tertiary dc:rounded dc:text-xs",
2102
+ children: s("fieldSearch.shortcut.keyEnter")
2103
+ }),
2104
+ " ",
2105
+ s("fieldSearch.shortcut.select")
2106
+ ] }),
2107
+ /* @__PURE__ */ T("span", { children: [
2108
+ /* @__PURE__ */ w("kbd", {
2109
+ className: "dc:px-1.5 dc:py-0.5 bg-dc-surface-tertiary dc:rounded dc:text-xs",
2110
+ children: s("fieldSearch.shortcut.keyShift")
2111
+ }),
2112
+ s("fieldSearch.shortcut.plusClick"),
2113
+ " ",
2114
+ s("fieldSearch.shortcut.multiSelect")
2115
+ ] }),
2116
+ /* @__PURE__ */ T("span", { children: [
2117
+ /* @__PURE__ */ w("kbd", {
2118
+ className: "dc:px-1.5 dc:py-0.5 bg-dc-surface-tertiary dc:rounded dc:text-xs",
2119
+ children: s("fieldSearch.shortcut.keyEsc")
2120
+ }),
2121
+ " ",
2122
+ s("fieldSearch.shortcut.close")
2123
+ ] })
2124
+ ]
2125
+ })]
2126
+ })
2127
+ ]
2128
+ })
2129
+ });
2130
+ }
2131
+ //#endregion
2132
+ //#region src/client/shared/types.ts
2133
+ var Ke = [
2134
+ {
2135
+ value: "custom",
2136
+ label: "dateRange.custom"
2137
+ },
2138
+ {
2139
+ value: "today",
2140
+ label: "dateRange.today"
2141
+ },
2142
+ {
2143
+ value: "yesterday",
2144
+ label: "dateRange.yesterday"
2145
+ },
2146
+ {
2147
+ value: "this_week",
2148
+ label: "dateRange.thisWeek"
2149
+ },
2150
+ {
2151
+ value: "this_month",
2152
+ label: "dateRange.thisMonth"
2153
+ },
2154
+ {
2155
+ value: "this_quarter",
2156
+ label: "dateRange.thisQuarter"
2157
+ },
2158
+ {
2159
+ value: "this_year",
2160
+ label: "dateRange.thisYear"
2161
+ },
2162
+ {
2163
+ value: "last_7_days",
2164
+ label: "dateRange.last7Days"
2165
+ },
2166
+ {
2167
+ value: "last_30_days",
2168
+ label: "dateRange.last30Days"
2169
+ },
2170
+ {
2171
+ value: "last_n_days",
2172
+ label: "dateRange.lastNDays"
2173
+ },
2174
+ {
2175
+ value: "last_week",
2176
+ label: "dateRange.lastWeek"
2177
+ },
2178
+ {
2179
+ value: "last_n_weeks",
2180
+ label: "dateRange.lastNWeeks"
2181
+ },
2182
+ {
2183
+ value: "last_month",
2184
+ label: "dateRange.lastMonth"
2185
+ },
2186
+ {
2187
+ value: "last_12_months",
2188
+ label: "dateRange.last12Months"
2189
+ },
2190
+ {
2191
+ value: "last_n_months",
2192
+ label: "dateRange.lastNMonths"
2193
+ },
2194
+ {
2195
+ value: "last_quarter",
2196
+ label: "dateRange.lastQuarter"
2197
+ },
2198
+ {
2199
+ value: "last_n_quarters",
2200
+ label: "dateRange.lastNQuarters"
2201
+ },
2202
+ {
2203
+ value: "last_year",
2204
+ label: "dateRange.lastYear"
2205
+ },
2206
+ {
2207
+ value: "last_n_years",
2208
+ label: "dateRange.lastNYears"
2209
+ }
2210
+ ], qe = [
2211
+ {
2212
+ id: "today",
2213
+ label: "Today",
2214
+ value: "today"
2215
+ },
2216
+ {
2217
+ id: "yesterday",
2218
+ label: "Yesterday",
2219
+ value: "yesterday"
2220
+ },
2221
+ {
2222
+ id: "7d",
2223
+ label: "7D",
2224
+ value: "last 7 days"
2225
+ },
2226
+ {
2227
+ id: "30d",
2228
+ label: "30D",
2229
+ value: "last 30 days"
2230
+ },
2231
+ {
2232
+ id: "3m",
2233
+ label: "3M",
2234
+ value: "last 3 months"
2235
+ },
2236
+ {
2237
+ id: "6m",
2238
+ label: "6M",
2239
+ value: "last 6 months"
2240
+ },
2241
+ {
2242
+ id: "12m",
2243
+ label: "12M",
2244
+ value: "last 12 months"
2245
+ }
2246
+ ], Je = [
2247
+ {
2248
+ id: "wtd",
2249
+ label: "Week to Date",
2250
+ value: "this week"
2251
+ },
2252
+ {
2253
+ id: "mtd",
2254
+ label: "Month to Date",
2255
+ value: "this month"
2256
+ },
2257
+ {
2258
+ id: "qtd",
2259
+ label: "Quarter to Date",
2260
+ value: "this quarter"
2261
+ },
2262
+ {
2263
+ id: "ytd",
2264
+ label: "Year to Date",
2265
+ value: "this year"
2266
+ }
2267
+ ];
2268
+ function Ye(e) {
2269
+ let t = new Date(e), n = t.getDay(), r = n === 0 ? 6 : n - 1;
2270
+ return t.setDate(t.getDate() - r), t;
2271
+ }
2272
+ function Xe(e, t, n) {
2273
+ switch (e) {
2274
+ case "today": return {
2275
+ start: t,
2276
+ end: n
2277
+ };
2278
+ case "yesterday": {
2279
+ let e = new Date(t);
2280
+ e.setDate(e.getDate() - 1);
2281
+ let n = new Date(e);
2282
+ return n.setHours(23, 59, 59, 999), {
2283
+ start: e,
2284
+ end: n
2285
+ };
2286
+ }
2287
+ case "this week": return {
2288
+ start: Ye(t),
2289
+ end: n
2290
+ };
2291
+ case "this month": return {
2292
+ start: new Date(t.getFullYear(), t.getMonth(), 1),
2293
+ end: n
2294
+ };
2295
+ case "this quarter": {
2296
+ let e = Math.floor(t.getMonth() / 3);
2297
+ return {
2298
+ start: new Date(t.getFullYear(), e * 3, 1),
2299
+ end: n
2300
+ };
2301
+ }
2302
+ case "this year": return {
2303
+ start: new Date(t.getFullYear(), 0, 1),
2304
+ end: n
2305
+ };
2306
+ default: return null;
2307
+ }
2308
+ }
2309
+ function Ze(e, t, n) {
2310
+ let r = e.match(/^last\s+(\d+)\s+(day|days|week|weeks|month|months|quarter|quarters|year|years)$/i);
2311
+ if (!r) return null;
2312
+ let i = parseInt(r[1], 10), a = r[2].toLowerCase(), o = new Date(t);
2313
+ return a === "day" || a === "days" ? o.setDate(o.getDate() - i + 1) : a === "week" || a === "weeks" ? o.setDate(o.getDate() - i * 7 + 1) : a === "month" || a === "months" ? (o.setMonth(o.getMonth() - i), o.setDate(o.getDate() + 1)) : a === "quarter" || a === "quarters" ? (o.setMonth(o.getMonth() - i * 3), o.setDate(o.getDate() + 1)) : (a === "year" || a === "years") && (o.setFullYear(o.getFullYear() - i), o.setDate(o.getDate() + 1)), {
2314
+ start: o,
2315
+ end: n
2316
+ };
2317
+ }
2318
+ function Qe(e, t) {
2319
+ let n = e.match(/^last\s+(week|month|quarter|year)$/i);
2320
+ if (!n) return null;
2321
+ let r = n[1].toLowerCase();
2322
+ if (r === "week") {
2323
+ let e = new Date(t), n = e.getDay(), r = n === 0 ? 6 : n - 1;
2324
+ e.setDate(e.getDate() - r - 1), e.setHours(23, 59, 59, 999);
2325
+ let i = new Date(e);
2326
+ return i.setDate(i.getDate() - 6), i.setHours(0, 0, 0, 0), {
2327
+ start: i,
2328
+ end: e
2329
+ };
2330
+ }
2331
+ if (r === "month") {
2332
+ let e = new Date(t.getFullYear(), t.getMonth() - 1, 1), n = new Date(t.getFullYear(), t.getMonth(), 0);
2333
+ return n.setHours(23, 59, 59, 999), {
2334
+ start: e,
2335
+ end: n
2336
+ };
2337
+ }
2338
+ if (r === "quarter") {
2339
+ let e = Math.floor(t.getMonth() / 3), n = e === 0 ? 3 : e - 1, r = e === 0 ? t.getFullYear() - 1 : t.getFullYear(), i = new Date(r, n * 3, 1), a = new Date(r, n * 3 + 3, 0);
2340
+ return a.setHours(23, 59, 59, 999), {
2341
+ start: i,
2342
+ end: a
2343
+ };
2344
+ }
2345
+ let i = new Date(t.getFullYear() - 1, 0, 1), a = new Date(t.getFullYear() - 1, 11, 31);
2346
+ return a.setHours(23, 59, 59, 999), {
2347
+ start: i,
2348
+ end: a
2349
+ };
2350
+ }
2351
+ function $e(e) {
2352
+ let t = /* @__PURE__ */ new Date();
2353
+ t.setHours(0, 0, 0, 0);
2354
+ let n = new Date(t);
2355
+ return n.setHours(23, 59, 59, 999), Xe(e.toLowerCase(), t, n) ?? Ze(e, t, n) ?? Qe(e, t);
2356
+ }
2357
+ function et(e, t) {
2358
+ let n = {
2359
+ month: "short",
2360
+ day: "numeric",
2361
+ year: "numeric"
2362
+ }, r = e.toLocaleDateString("en-US", n), i = t.toLocaleDateString("en-US", n);
2363
+ return r === i ? r : e.getFullYear() === t.getFullYear() ? `${e.toLocaleDateString("en-US", {
2364
+ month: "short",
2365
+ day: "numeric"
2366
+ })} - ${i}` : `${r} - ${i}`;
2367
+ }
2368
+ function tt(e) {
2369
+ if (!e) return null;
2370
+ if (Array.isArray(e)) return "custom";
2371
+ let t = e.toLowerCase().trim(), n = [...qe, ...Je].find((e) => e.value.toLowerCase() === t);
2372
+ return n ? n.id : "custom";
2373
+ }
2374
+ var nt = {
2375
+ day: "days",
2376
+ week: "weeks",
2377
+ month: "months",
2378
+ quarter: "quarters",
2379
+ year: "years"
2380
+ };
2381
+ function rt(e) {
2382
+ if (!e) return null;
2383
+ if (Array.isArray(e)) return { rangeType: "custom" };
2384
+ let t = e.match(/^last (\d+) (days|weeks|months|quarters|years)$/);
2385
+ if (t) {
2386
+ let [, e, n] = t;
2387
+ return {
2388
+ rangeType: `last_n_${n}`,
2389
+ numberValue: parseInt(e) || 1
2390
+ };
2391
+ }
2392
+ let n = e.match(/^last (day|week|month|quarter|year)$/);
2393
+ if (n) {
2394
+ let [, e] = n;
2395
+ return {
2396
+ rangeType: `last_n_${nt[e] ?? "years"}`,
2397
+ numberValue: 1
2398
+ };
2399
+ }
2400
+ for (let t of Ke) if (t.value !== "custom" && !u(t.value) && s(t.value) === e) return { rangeType: t.value };
2401
+ return { rangeType: "custom" };
2402
+ }
2403
+ //#endregion
2404
+ //#region src/client/components/Modal.tsx
2405
+ var it = ({ isOpen: e, onClose: t, title: n, size: r = "md", closeOnBackdropClick: i = !0, closeOnEscape: a = !0, showCloseButton: o = !0, children: s, footer: c, noPadding: l = !1 }) => {
2406
+ let u = v((e) => {
2407
+ e.key === "Escape" && a && t();
2408
+ }, [a, t]);
2409
+ return y(() => (e ? (a && document.addEventListener("keydown", u), document.body.style.overflow = "hidden") : document.body.style.overflow = "unset", () => {
2410
+ document.removeEventListener("keydown", u), document.body.style.overflow = "unset";
2411
+ }), [
2412
+ e,
2413
+ a,
2414
+ u
2415
+ ]), e ? /* @__PURE__ */ w("div", {
2416
+ className: `dc:fixed dc:inset-0 dc:z-50 dc:backdrop-blur-md ${r === "fullscreen-mobile" ? "dc:flex dc:md:flex dc:md:items-center dc:md:justify-center" : "dc:flex dc:items-center dc:justify-center"}`,
2417
+ style: { backgroundColor: "var(--dc-overlay)" },
2418
+ onClick: i ? t : void 0,
2419
+ children: /* @__PURE__ */ T("div", {
2420
+ className: `dc:relative bg-dc-surface dc:border border-dc-border ${r === "fullscreen-mobile" ? "dc:rounded-none dc:md:rounded-lg" : "dc:rounded-lg"} ${r === "fullscreen" || r === "fullscreen-mobile" ? "" : "dc:mx-4"} ${(() => {
2421
+ switch (r) {
2422
+ case "sm": return "dc:max-w-md";
2423
+ case "md": return "dc:max-w-lg";
2424
+ case "lg": return "dc:max-w-2xl";
2425
+ case "xl": return "dc:max-w-6xl";
2426
+ case "xxl": return "dc:max-w-[1400px]";
2427
+ case "full": return "dc:max-w-7xl";
2428
+ case "fullscreen": return "dc:w-[90vw] dc:h-[90vh] dc:max-w-none";
2429
+ case "fullscreen-mobile": return "dc:w-full dc:h-full dc:md:w-[min(90vw,1400px)] dc:md:h-[90vh]";
2430
+ default: return "dc:max-w-lg";
2431
+ }
2432
+ })()} ${r === "fullscreen" || r === "fullscreen-mobile" ? "" : "dc:max-h-[90vh]"} dc:flex dc:flex-col`,
2433
+ style: { boxShadow: "var(--dc-shadow-2xl)" },
2434
+ onClick: (e) => e.stopPropagation(),
2435
+ role: "dialog",
2436
+ "aria-modal": "true",
2437
+ "aria-labelledby": n ? "modal-title" : void 0,
2438
+ children: [
2439
+ (n || o) && /* @__PURE__ */ T("div", {
2440
+ className: "dc:flex dc:items-center dc:justify-between dc:px-6 dc:py-4 dc:border-b border-dc-border",
2441
+ children: [n && /* @__PURE__ */ w("h2", {
2442
+ id: "modal-title",
2443
+ className: "dc:text-xl dc:font-semibold text-dc-text",
2444
+ children: n
2445
+ }), o && /* @__PURE__ */ w("button", {
2446
+ type: "button",
2447
+ onClick: t,
2448
+ className: "text-dc-text-muted hover:text-dc-text-secondary dc:transition-colors dc:p-2 dc:-mr-2",
2449
+ "aria-label": "Close modal",
2450
+ children: /* @__PURE__ */ w("svg", {
2451
+ width: "24",
2452
+ height: "24",
2453
+ fill: "none",
2454
+ viewBox: "0 0 24 24",
2455
+ stroke: "currentColor",
2456
+ children: /* @__PURE__ */ w("path", {
2457
+ strokeLinecap: "round",
2458
+ strokeLinejoin: "round",
2459
+ strokeWidth: 2,
2460
+ d: "M6 18L18 6M6 6l12 12"
2461
+ })
2462
+ })
2463
+ })]
2464
+ }),
2465
+ /* @__PURE__ */ w("div", {
2466
+ className: `dc:flex-1 dc:overflow-y-auto ${l ? "" : "dc:px-6 dc:py-4"}`,
2467
+ children: s
2468
+ }),
2469
+ c && /* @__PURE__ */ w("div", {
2470
+ className: "dc:flex dc:items-center dc:justify-end dc:space-x-3 dc:px-6 dc:py-4 dc:border-t border-dc-border bg-dc-surface-secondary",
2471
+ children: g.Children.toArray(c)
2472
+ })
2473
+ ]
2474
+ })
2475
+ }) : null;
2476
+ };
2477
+ //#endregion
2478
+ //#region src/client/adapters/funnelModeAdapter.ts
2479
+ function at(e) {
2480
+ let t = "";
2481
+ e.funnelBindingKey && (typeof e.funnelBindingKey.dimension == "string" ? t = e.funnelBindingKey.dimension : Array.isArray(e.funnelBindingKey.dimension) && (t = e.funnelBindingKey.dimension.map((e) => ({
2482
+ cube: e.cube,
2483
+ dimension: e.dimension
2484
+ }))));
2485
+ let n = e.funnelTimeDimension || "", r = e.funnelSteps.map((t) => {
2486
+ let n = { name: t.name };
2487
+ return t.cube && t.cube !== e.funnelCube && (n.cube = t.cube), t.filters && t.filters.length > 0 && (n.filter = t.filters.length === 1 ? t.filters[0] : { and: t.filters }), t.timeToConvert && (n.timeToConvert = t.timeToConvert), n;
2488
+ });
2489
+ return { funnel: {
2490
+ bindingKey: t,
2491
+ timeDimension: n,
2492
+ steps: r,
2493
+ includeTimeMetrics: !0
2494
+ } };
2495
+ }
2496
+ function ot(e) {
2497
+ let { funnel: t } = e, n = null;
2498
+ if (t.steps.length > 0 && t.steps[0].cube) n = t.steps[0].cube;
2499
+ else if (typeof t.bindingKey == "string") {
2500
+ let e = t.bindingKey.split(".");
2501
+ e.length > 0 && (n = e[0]);
2502
+ }
2503
+ let r = null;
2504
+ t.bindingKey && (typeof t.bindingKey == "string" ? r = { dimension: t.bindingKey } : Array.isArray(t.bindingKey) && (r = { dimension: t.bindingKey.map((e) => ({
2505
+ cube: e.cube,
2506
+ dimension: e.dimension
2507
+ })) }));
2508
+ let i = null;
2509
+ t.timeDimension && (typeof t.timeDimension == "string" ? i = t.timeDimension : Array.isArray(t.timeDimension) && t.timeDimension.length > 0 && (i = `${t.timeDimension[0].cube}.${t.timeDimension[0].dimension}`));
2510
+ let a = t.steps.map((e) => {
2511
+ let t = [];
2512
+ return e.filter && (t = Array.isArray(e.filter) ? e.filter : typeof e.filter == "object" && "and" in e.filter ? e.filter.and : [e.filter]), {
2513
+ id: Z(),
2514
+ name: e.name,
2515
+ cube: e.cube || n || "",
2516
+ filters: t,
2517
+ timeToConvert: e.timeToConvert
2518
+ };
2519
+ });
2520
+ return {
2521
+ funnelCube: n,
2522
+ funnelSteps: a,
2523
+ activeFunnelStepIndex: 0,
2524
+ funnelTimeDimension: i,
2525
+ funnelBindingKey: r
2526
+ };
2527
+ }
2528
+ function st(e) {
2529
+ if (!e || typeof e != "object") return !1;
2530
+ let t = e;
2531
+ if (t.version !== 1 || t.analysisType !== "funnel" || !t.query || typeof t.query != "object") return !1;
2532
+ let n = t.query;
2533
+ return !(!n.funnel || typeof n.funnel != "object");
2534
+ }
2535
+ var ct = {
2536
+ type: "funnel",
2537
+ createInitial() {
2538
+ return {
2539
+ funnelCube: null,
2540
+ funnelSteps: [],
2541
+ activeFunnelStepIndex: 0,
2542
+ funnelTimeDimension: null,
2543
+ funnelBindingKey: null
2544
+ };
2545
+ },
2546
+ extractState(e) {
2547
+ return {
2548
+ funnelCube: e.funnelCube,
2549
+ funnelSteps: e.funnelSteps,
2550
+ activeFunnelStepIndex: e.activeFunnelStepIndex,
2551
+ funnelTimeDimension: e.funnelTimeDimension,
2552
+ funnelBindingKey: e.funnelBindingKey
2553
+ };
2554
+ },
2555
+ canLoad(e) {
2556
+ return st(e);
2557
+ },
2558
+ load(e) {
2559
+ if (e.analysisType !== "funnel") throw Error(`Cannot load ${e.analysisType} config with funnel adapter`);
2560
+ return ot(e.query);
2561
+ },
2562
+ save(e, t, n) {
2563
+ return {
2564
+ version: 1,
2565
+ analysisType: "funnel",
2566
+ activeView: n,
2567
+ charts: { funnel: t.funnel || this.getDefaultChartConfig() },
2568
+ query: at(e)
2569
+ };
2570
+ },
2571
+ validate(e) {
2572
+ let t = [], n = [];
2573
+ e.funnelSteps.length < 2 && t.push("A funnel requires at least 2 steps"), e.funnelBindingKey?.dimension || t.push("A binding key is required to link funnel steps"), e.funnelTimeDimension || t.push("A time dimension is required for funnel ordering"), e.funnelSteps.forEach((e, t) => {
2574
+ (!e.name || e.name.trim() === "") && n.push(`Step ${t + 1} has no name`), e.filters.length === 0 && n.push(`Step ${t + 1} "${e.name}" has no filter - all events will match`);
2575
+ });
2576
+ let r = e.funnelSteps.map((e) => e.name.toLowerCase()), i = r.filter((e, t) => r.indexOf(e) !== t);
2577
+ return i.length > 0 && n.push(`Duplicate step names: ${[...new Set(i)].join(", ")}`), {
2578
+ isValid: t.length === 0,
2579
+ errors: t,
2580
+ warnings: n
2581
+ };
2582
+ },
2583
+ clear(e) {
2584
+ return {
2585
+ ...this.createInitial(),
2586
+ funnelCube: e.funnelCube
2587
+ };
2588
+ },
2589
+ getDefaultChartConfig() {
2590
+ return {
2591
+ chartType: "funnel",
2592
+ chartConfig: {},
2593
+ displayConfig: {
2594
+ showLegend: !0,
2595
+ showGrid: !0,
2596
+ showTooltip: !0
2597
+ }
2598
+ };
2599
+ }
2600
+ };
2601
+ //#endregion
2602
+ //#region src/client/adapters/flowModeAdapter.ts
2603
+ function lt(e) {
2604
+ let t = "";
2605
+ return e.flowBindingKey && (typeof e.flowBindingKey.dimension == "string" ? t = e.flowBindingKey.dimension : Array.isArray(e.flowBindingKey.dimension) && (t = e.flowBindingKey.dimension.map((e) => ({
2606
+ cube: e.cube,
2607
+ dimension: e.dimension
2608
+ })))), { flow: {
2609
+ bindingKey: t,
2610
+ timeDimension: e.flowTimeDimension || "",
2611
+ startingStep: {
2612
+ name: e.startingStep.name || "Starting Step",
2613
+ filter: e.startingStep.filters.length === 1 ? e.startingStep.filters[0] : e.startingStep.filters.length > 1 ? e.startingStep.filters : void 0
2614
+ },
2615
+ stepsBefore: e.stepsBefore,
2616
+ stepsAfter: e.stepsAfter,
2617
+ eventDimension: e.eventDimension || "",
2618
+ joinStrategy: e.joinStrategy
2619
+ } };
2620
+ }
2621
+ function ut(e) {
2622
+ let { flow: t } = e, n = null;
2623
+ if (typeof t.bindingKey == "string") {
2624
+ let e = t.bindingKey.split(".");
2625
+ e.length > 0 && (n = e[0]);
2626
+ } else Array.isArray(t.bindingKey) && t.bindingKey.length > 0 && (n = t.bindingKey[0].cube);
2627
+ let r = null;
2628
+ t.bindingKey && (typeof t.bindingKey == "string" ? r = { dimension: t.bindingKey } : Array.isArray(t.bindingKey) && (r = { dimension: t.bindingKey.map((e) => ({
2629
+ cube: e.cube,
2630
+ dimension: e.dimension
2631
+ })) }));
2632
+ let i = null;
2633
+ t.timeDimension && (typeof t.timeDimension == "string" ? i = t.timeDimension : Array.isArray(t.timeDimension) && t.timeDimension.length > 0 && (i = `${t.timeDimension[0].cube}.${t.timeDimension[0].dimension}`));
2634
+ let a = [];
2635
+ return t.startingStep.filter && (a = Array.isArray(t.startingStep.filter) ? t.startingStep.filter : [t.startingStep.filter]), {
2636
+ flowCube: n,
2637
+ flowBindingKey: r,
2638
+ flowTimeDimension: i,
2639
+ startingStep: {
2640
+ name: t.startingStep.name || "",
2641
+ filters: a
2642
+ },
2643
+ stepsBefore: t.stepsBefore || 3,
2644
+ stepsAfter: t.stepsAfter || 3,
2645
+ eventDimension: t.eventDimension || null,
2646
+ joinStrategy: t.joinStrategy || "auto"
2647
+ };
2648
+ }
2649
+ function dt(e) {
2650
+ if (!e || typeof e != "object") return !1;
2651
+ let t = e;
2652
+ if (t.version !== 1 || t.analysisType !== "flow" || !t.query || typeof t.query != "object") return !1;
2653
+ let n = t.query;
2654
+ return !(!n.flow || typeof n.flow != "object");
2655
+ }
2656
+ var ft = {
2657
+ type: "flow",
2658
+ createInitial() {
2659
+ return {
2660
+ flowCube: null,
2661
+ flowBindingKey: null,
2662
+ flowTimeDimension: null,
2663
+ startingStep: {
2664
+ name: "",
2665
+ filters: []
2666
+ },
2667
+ stepsBefore: 3,
2668
+ stepsAfter: 3,
2669
+ eventDimension: null,
2670
+ joinStrategy: "auto"
2671
+ };
2672
+ },
2673
+ extractState(e) {
2674
+ return {
2675
+ flowCube: e.flowCube,
2676
+ flowBindingKey: e.flowBindingKey,
2677
+ flowTimeDimension: e.flowTimeDimension,
2678
+ startingStep: e.startingStep,
2679
+ stepsBefore: e.stepsBefore,
2680
+ stepsAfter: e.stepsAfter,
2681
+ eventDimension: e.eventDimension,
2682
+ joinStrategy: e.joinStrategy || "auto"
2683
+ };
2684
+ },
2685
+ canLoad(e) {
2686
+ return dt(e);
2687
+ },
2688
+ load(e) {
2689
+ if (e.analysisType !== "flow") throw Error(`Cannot load ${e.analysisType} config with flow adapter`);
2690
+ return ut(e.query);
2691
+ },
2692
+ save(e, t, n) {
2693
+ return {
2694
+ version: 1,
2695
+ analysisType: "flow",
2696
+ activeView: n,
2697
+ charts: { flow: t.flow || this.getDefaultChartConfig() },
2698
+ query: lt(e)
2699
+ };
2700
+ },
2701
+ validate(e) {
2702
+ let t = [], n = [];
2703
+ return e.flowCube || t.push("Select an event stream cube for flow analysis"), e.flowBindingKey?.dimension || t.push("A binding key is required to link events to entities"), e.flowTimeDimension || t.push("A time dimension is required for event ordering"), e.eventDimension || t.push("An event dimension is required to categorize events"), e.startingStep.filters.length === 0 && t.push("The starting step must have at least one filter to identify the anchor event"), (e.stepsBefore < 0 || e.stepsBefore > 5) && t.push("Steps before must be between 0 and 5"), (e.stepsAfter < 0 || e.stepsAfter > 5) && t.push("Steps after must be between 0 and 5"), e.joinStrategy && ![
2704
+ "auto",
2705
+ "lateral",
2706
+ "window"
2707
+ ].includes(e.joinStrategy) && t.push("Join strategy must be auto, lateral, or window"), e.startingStep.name || n.push("Starting step has no name - using default"), (e.stepsBefore >= 4 || e.stepsAfter >= 4) && n.push("High step depth (4-5) may impact query performance on large datasets"), {
2708
+ isValid: t.length === 0,
2709
+ errors: t,
2710
+ warnings: n
2711
+ };
2712
+ },
2713
+ clear(e) {
2714
+ return {
2715
+ ...this.createInitial(),
2716
+ flowCube: e.flowCube
2717
+ };
2718
+ },
2719
+ getDefaultChartConfig() {
2720
+ return {
2721
+ chartType: "sankey",
2722
+ chartConfig: {},
2723
+ displayConfig: {
2724
+ showLegend: !0,
2725
+ showGrid: !1,
2726
+ showTooltip: !0
2727
+ }
2728
+ };
2729
+ }
2730
+ };
2731
+ //#endregion
2732
+ //#region src/client/adapters/retentionModeAdapter.ts
2733
+ function pt(e) {
2734
+ let t = "";
2735
+ e.retentionBindingKey && (typeof e.retentionBindingKey.dimension == "string" ? t = e.retentionBindingKey.dimension : Array.isArray(e.retentionBindingKey.dimension) && (t = e.retentionBindingKey.dimension.map((e) => ({
2736
+ cube: e.cube,
2737
+ dimension: e.dimension
2738
+ }))));
2739
+ let n = { retention: {
2740
+ timeDimension: e.retentionTimeDimension || "",
2741
+ bindingKey: t,
2742
+ dateRange: e.retentionDateRange,
2743
+ granularity: e.retentionViewGranularity,
2744
+ periods: e.retentionPeriods,
2745
+ retentionType: e.retentionType
2746
+ } };
2747
+ return e.retentionCohortFilters.length > 0 && (n.retention.cohortFilters = e.retentionCohortFilters.length === 1 ? e.retentionCohortFilters[0] : e.retentionCohortFilters), e.retentionActivityFilters.length > 0 && (n.retention.activityFilters = e.retentionActivityFilters.length === 1 ? e.retentionActivityFilters[0] : e.retentionActivityFilters), e.retentionBreakdowns && e.retentionBreakdowns.length > 0 && (n.retention.breakdownDimensions = e.retentionBreakdowns.map((e) => e.field)), n;
2748
+ }
2749
+ function mt(e) {
2750
+ let { retention: t } = e, n = null;
2751
+ if (typeof t.timeDimension == "string") {
2752
+ let e = t.timeDimension.split(".");
2753
+ e.length > 0 && (n = e[0]);
2754
+ } else t.timeDimension?.cube && (n = t.timeDimension.cube);
2755
+ let r = null;
2756
+ t.bindingKey && (typeof t.bindingKey == "string" ? r = { dimension: t.bindingKey } : Array.isArray(t.bindingKey) && (r = { dimension: t.bindingKey.map((e) => ({
2757
+ cube: e.cube,
2758
+ dimension: e.dimension
2759
+ })) }));
2760
+ let i = null;
2761
+ t.timeDimension && (i = typeof t.timeDimension == "string" ? t.timeDimension : `${t.timeDimension.cube}.${t.timeDimension.dimension}`);
2762
+ let a = [];
2763
+ t.cohortFilters && (a = Array.isArray(t.cohortFilters) ? t.cohortFilters : [t.cohortFilters]);
2764
+ let s = [];
2765
+ t.activityFilters && (s = Array.isArray(t.activityFilters) ? t.activityFilters : [t.activityFilters]);
2766
+ let c = [];
2767
+ t.breakdownDimensions && Array.isArray(t.breakdownDimensions) && (c = t.breakdownDimensions.map((e) => ({
2768
+ field: e,
2769
+ label: e.split(".").pop() || e
2770
+ })));
2771
+ let l = t.dateRange || o("last_3_months");
2772
+ return {
2773
+ retentionCube: n,
2774
+ retentionBindingKey: r,
2775
+ retentionTimeDimension: i,
2776
+ retentionDateRange: l,
2777
+ retentionViewGranularity: t.granularity,
2778
+ retentionPeriods: t.periods,
2779
+ retentionType: t.retentionType,
2780
+ retentionCohortFilters: a,
2781
+ retentionActivityFilters: s,
2782
+ retentionBreakdowns: c
2783
+ };
2784
+ }
2785
+ function ht(e) {
2786
+ if (!e || typeof e != "object") return !1;
2787
+ let t = e;
2788
+ if (t.version !== 1 || t.analysisType !== "retention" || !t.query || typeof t.query != "object") return !1;
2789
+ let n = t.query;
2790
+ return !(!n.retention || typeof n.retention != "object");
2791
+ }
2792
+ var gt = {
2793
+ type: "retention",
2794
+ createInitial() {
2795
+ return { ...i };
2796
+ },
2797
+ extractState(e) {
2798
+ return {
2799
+ retentionCube: e.retentionCube,
2800
+ retentionBindingKey: e.retentionBindingKey,
2801
+ retentionTimeDimension: e.retentionTimeDimension,
2802
+ retentionDateRange: e.retentionDateRange || o("last_3_months"),
2803
+ retentionViewGranularity: e.retentionViewGranularity || "week",
2804
+ retentionPeriods: e.retentionPeriods || 12,
2805
+ retentionType: e.retentionType || "classic",
2806
+ retentionCohortFilters: e.retentionCohortFilters || [],
2807
+ retentionActivityFilters: e.retentionActivityFilters || [],
2808
+ retentionBreakdowns: e.retentionBreakdowns || []
2809
+ };
2810
+ },
2811
+ canLoad(e) {
2812
+ return ht(e);
2813
+ },
2814
+ load(e) {
2815
+ if (e.analysisType !== "retention") throw Error(`Cannot load ${e.analysisType} config with retention adapter`);
2816
+ return mt(e.query);
2817
+ },
2818
+ save(e, t, n) {
2819
+ return {
2820
+ version: 1,
2821
+ analysisType: "retention",
2822
+ activeView: n,
2823
+ charts: { retention: t.retention || this.getDefaultChartConfig() },
2824
+ query: pt(e)
2825
+ };
2826
+ },
2827
+ validate(e) {
2828
+ let t = [], n = [];
2829
+ if (e.retentionCube || t.push("Select a cube for retention analysis"), e.retentionTimeDimension || t.push("Select a timestamp dimension for the analysis"), e.retentionBindingKey?.dimension || t.push("Select a user identifier (binding key) to track retention"), !e.retentionDateRange?.start || !e.retentionDateRange?.end) t.push("Date range is required for retention analysis");
2830
+ else {
2831
+ let n = new Date(e.retentionDateRange.start), r = new Date(e.retentionDateRange.end);
2832
+ isNaN(n.getTime()) && t.push("Invalid start date format"), isNaN(r.getTime()) && t.push("Invalid end date format"), n > r && t.push("Start date must be before or equal to end date");
2833
+ }
2834
+ return e.retentionPeriods < 1 && t.push("At least 1 retention period is required"), e.retentionPeriods > 52 && n.push("More than 52 periods may impact performance"), e.retentionTimeDimension && e.retentionTimeDimension.split(".").length < 2 && n.push("Time dimension should be in format \"Cube.dimension\""), {
2835
+ isValid: t.length === 0,
2836
+ errors: t,
2837
+ warnings: n
2838
+ };
2839
+ },
2840
+ clear(e) {
2841
+ return {
2842
+ ...this.createInitial(),
2843
+ retentionCube: e.retentionCube,
2844
+ retentionDateRange: e.retentionDateRange
2845
+ };
2846
+ },
2847
+ getDefaultChartConfig() {
2848
+ return {
2849
+ chartType: "retentionCombined",
2850
+ chartConfig: {},
2851
+ displayConfig: {
2852
+ showLegend: !0,
2853
+ showTooltip: !0,
2854
+ showGrid: !0,
2855
+ retentionDisplayMode: "combined"
2856
+ }
2857
+ };
2858
+ }
2859
+ };
2860
+ //#endregion
2861
+ //#region src/client/components/AnalysisBuilder/StringArrayInput.tsx
2862
+ function _t({ label: e, value: t, onChange: n, placeholder: r, description: i }) {
2863
+ let [a, o] = S(() => t.join("\n"));
2864
+ y(() => {
2865
+ o(t.join("\n"));
2866
+ }, [t]);
2867
+ let s = v(() => {
2868
+ n(a.split("\n").map((e) => e.trim()).filter((e) => e.length > 0));
2869
+ }, [a, n]);
2870
+ return /* @__PURE__ */ T("div", {
2871
+ className: "dc:space-y-1",
2872
+ children: [
2873
+ /* @__PURE__ */ w("label", {
2874
+ className: "dc:text-sm text-dc-text-secondary",
2875
+ children: e
2876
+ }),
2877
+ /* @__PURE__ */ w("textarea", {
2878
+ value: a,
2879
+ onChange: (e) => o(e.target.value),
2880
+ onBlur: s,
2881
+ placeholder: r,
2882
+ rows: 4,
2883
+ className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text dc:resize-y"
2884
+ }),
2885
+ i && /* @__PURE__ */ w("p", {
2886
+ className: "dc:text-xs text-dc-text-muted",
2887
+ children: i
2888
+ })
2889
+ ]
2890
+ });
2891
+ }
2892
+ //#endregion
2893
+ //#region src/client/components/AnalysisBuilder/DisplayOptionControl.tsx
2894
+ function $({ description: e, t }) {
2895
+ return e ? /* @__PURE__ */ w("p", {
2896
+ className: "dc:text-xs text-dc-text-muted",
2897
+ children: t(e)
2898
+ }) : null;
2899
+ }
2900
+ function vt({ option: e, displayConfig: t, setValue: n, t: r }) {
2901
+ let i = e.key;
2902
+ return /* @__PURE__ */ T("label", {
2903
+ className: "dc:flex dc:items-center dc:space-x-2",
2904
+ children: [/* @__PURE__ */ w("input", {
2905
+ type: "checkbox",
2906
+ checked: t[i] ?? e.defaultValue ?? !1,
2907
+ onChange: (e) => n(e.target.checked),
2908
+ className: "dc:rounded border-dc-border focus:ring-dc-accent",
2909
+ style: { color: "var(--dc-primary)" }
2910
+ }), /* @__PURE__ */ w("span", {
2911
+ className: "dc:text-sm text-dc-text",
2912
+ children: r(e.label)
2913
+ })]
2914
+ });
2915
+ }
2916
+ function yt({ option: e, displayConfig: t, setValue: n, t: r }) {
2917
+ let i = t[e.key] ?? e.defaultValue ?? "";
2918
+ return /* @__PURE__ */ T("div", {
2919
+ className: "dc:space-y-1",
2920
+ children: [
2921
+ /* @__PURE__ */ T("label", {
2922
+ className: "dc:text-sm text-dc-text-secondary",
2923
+ children: [r(e.label), e.key === "content" && /* @__PURE__ */ w("span", {
2924
+ className: "dc:text-xs text-dc-text-muted dc:ml-1",
2925
+ children: "(only headers, lists and links)"
2926
+ })]
2927
+ }),
2928
+ e.key === "content" ? /* @__PURE__ */ w("textarea", {
2929
+ value: i,
2930
+ onChange: (e) => n(e.target.value),
2931
+ placeholder: e.placeholder,
2932
+ rows: 8,
2933
+ className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent dc:font-mono dc:resize-y bg-dc-surface text-dc-text"
2934
+ }) : /* @__PURE__ */ w("input", {
2935
+ type: "text",
2936
+ value: i,
2937
+ onChange: (e) => n(e.target.value),
2938
+ placeholder: e.placeholder,
2939
+ className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
2940
+ }),
2941
+ /* @__PURE__ */ w($, {
2942
+ description: e.description,
2943
+ t: r
2944
+ })
2945
+ ]
2946
+ });
2947
+ }
2948
+ function bt({ option: e, displayConfig: t, colorPalette: n, setValue: r, t: i }) {
2949
+ let a = t[e.key] ?? e.defaultValue ?? 0;
2950
+ return /* @__PURE__ */ T("div", {
2951
+ className: "dc:space-y-1",
2952
+ children: [
2953
+ /* @__PURE__ */ w("label", {
2954
+ className: "dc:text-sm text-dc-text-secondary",
2955
+ children: i(e.label)
2956
+ }),
2957
+ /* @__PURE__ */ w("div", {
2958
+ className: "dc:flex dc:flex-wrap dc:gap-2",
2959
+ children: n?.colors.map((e, t) => /* @__PURE__ */ w("button", {
2960
+ type: "button",
2961
+ onClick: () => r(t),
2962
+ className: `dc:w-8 dc:h-8 dc:rounded dc:border-2 dc:transition-all dc:duration-200 dc:hover:scale-110 focus:outline-hidden dc:focus:ring-2 focus:ring-dc-accent dc:focus:ring-offset-1 ${a === t ? "dc:ring-2 dc:ring-offset-1 dc:scale-110" : "hover:border-dc-text-muted"}`,
2963
+ style: {
2964
+ backgroundColor: e,
2965
+ borderColor: a === t ? "var(--dc-primary)" : "var(--dc-border)"
2966
+ },
2967
+ title: `Color ${t + 1}: ${e}`
2968
+ }, t)) || [/* @__PURE__ */ w("button", {
2969
+ type: "button",
2970
+ onClick: () => r(0),
2971
+ className: "dc:w-8 dc:h-8 dc:rounded-sm dc:border-2 dc:ring-2 dc:ring-offset-1",
2972
+ style: {
2973
+ backgroundColor: "#8884d8",
2974
+ borderColor: "var(--dc-primary)",
2975
+ boxShadow: "0 0 0 2px var(--dc-primary)"
2976
+ },
2977
+ title: "Default Color"
2978
+ }, 0)]
2979
+ }),
2980
+ /* @__PURE__ */ w($, {
2981
+ description: e.description,
2982
+ t: i
2983
+ })
2984
+ ]
2985
+ });
2986
+ }
2987
+ function xt({ option: e, displayConfig: t, setValue: n, t: r }) {
2988
+ let i = e.key;
2989
+ return /* @__PURE__ */ T("div", {
2990
+ className: "dc:space-y-1",
2991
+ children: [
2992
+ /* @__PURE__ */ w("label", {
2993
+ className: "dc:text-sm text-dc-text-secondary",
2994
+ children: r(e.label)
2995
+ }),
2996
+ /* @__PURE__ */ w("input", {
2997
+ type: "number",
2998
+ value: t[i] ?? e.defaultValue ?? 0,
2999
+ onChange: (e) => n(e.target.value === "" ? void 0 : Number(e.target.value)),
3000
+ placeholder: e.placeholder,
3001
+ min: e.min,
3002
+ max: e.max,
3003
+ step: e.step,
3004
+ className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
3005
+ }),
3006
+ /* @__PURE__ */ w($, {
3007
+ description: e.description,
3008
+ t: r
3009
+ })
3010
+ ]
3011
+ });
3012
+ }
3013
+ function St({ option: e, displayConfig: t, setValue: n, t: r }) {
3014
+ let i = e.key;
3015
+ return /* @__PURE__ */ T("div", {
3016
+ className: "dc:space-y-1",
3017
+ children: [
3018
+ /* @__PURE__ */ w("label", {
3019
+ className: "dc:text-sm text-dc-text-secondary",
3020
+ children: r(e.label)
3021
+ }),
3022
+ /* @__PURE__ */ w("select", {
3023
+ value: t[i] ?? e.defaultValue ?? "",
3024
+ onChange: (e) => n(e.target.value),
3025
+ className: "dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text",
3026
+ children: e.options?.map((e) => /* @__PURE__ */ w("option", {
3027
+ value: e.value,
3028
+ children: r(e.label)
3029
+ }, e.value))
3030
+ }),
3031
+ /* @__PURE__ */ w($, {
3032
+ description: e.description,
3033
+ t: r
3034
+ })
3035
+ ]
3036
+ });
3037
+ }
3038
+ function Ct({ option: e, displayConfig: t, setValue: n, t: r }) {
3039
+ let i = t[e.key] ?? e.defaultValue ?? "#8884d8";
3040
+ return /* @__PURE__ */ T("div", {
3041
+ className: "dc:space-y-1",
3042
+ children: [
3043
+ /* @__PURE__ */ w("label", {
3044
+ className: "dc:text-sm text-dc-text-secondary",
3045
+ children: r(e.label)
3046
+ }),
3047
+ /* @__PURE__ */ T("div", {
3048
+ className: "dc:flex dc:items-center dc:space-x-2",
3049
+ children: [/* @__PURE__ */ w("input", {
3050
+ type: "color",
3051
+ value: i,
3052
+ onChange: (e) => n(e.target.value),
3053
+ className: "dc:w-12 dc:h-8 dc:border border-dc-border dc:rounded-sm dc:cursor-pointer"
3054
+ }), /* @__PURE__ */ w("input", {
3055
+ type: "text",
3056
+ value: i,
3057
+ onChange: (e) => n(e.target.value),
3058
+ placeholder: e.placeholder || "#8884d8",
3059
+ className: "dc:flex-1 dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text"
3060
+ })]
3061
+ }),
3062
+ /* @__PURE__ */ w($, {
3063
+ description: e.description,
3064
+ t: r
3065
+ })
3066
+ ]
3067
+ });
3068
+ }
3069
+ function wt({ option: e, displayConfig: t, setValue: n, t: r }) {
3070
+ let i = e.key;
3071
+ return /* @__PURE__ */ w(h, {
3072
+ axisLabel: r(e.label),
3073
+ value: t[i] || {},
3074
+ onChange: (e) => n(Object.keys(e).length > 0 ? e : void 0)
3075
+ });
3076
+ }
3077
+ function Tt({ option: e, displayConfig: t, setValue: n, t: r }) {
3078
+ let i = e.key;
3079
+ return /* @__PURE__ */ w(_t, {
3080
+ label: r(e.label),
3081
+ value: t[i] ?? [],
3082
+ onChange: (e) => n(e.length > 0 ? e : void 0),
3083
+ placeholder: e.placeholder,
3084
+ description: e.description ? r(e.description) : void 0
3085
+ });
3086
+ }
3087
+ function Et({ option: e, displayConfig: t, setValue: n, t: r }) {
3088
+ let i = e.key;
3089
+ return /* @__PURE__ */ T("div", {
3090
+ className: "dc:space-y-1",
3091
+ children: [
3092
+ /* @__PURE__ */ w("label", {
3093
+ className: "dc:text-sm text-dc-text-secondary",
3094
+ children: r(e.label)
3095
+ }),
3096
+ /* @__PURE__ */ w("div", {
3097
+ className: "dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden",
3098
+ children: e.options?.map((a) => /* @__PURE__ */ w("button", {
3099
+ type: "button",
3100
+ onClick: () => n(a.value),
3101
+ className: `dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${(t[i] ?? e.defaultValue) === a.value ? "bg-dc-primary text-white" : "bg-dc-surface text-dc-text hover:bg-dc-border"}`,
3102
+ children: r(a.label)
3103
+ }, a.value))
3104
+ }),
3105
+ /* @__PURE__ */ w($, {
3106
+ description: e.description,
3107
+ t: r
3108
+ })
3109
+ ]
3110
+ });
3111
+ }
3112
+ var Dt = {
3113
+ boolean: vt,
3114
+ string: yt,
3115
+ paletteColor: bt,
3116
+ number: xt,
3117
+ select: St,
3118
+ color: Ct,
3119
+ axisFormat: wt,
3120
+ stringArray: Tt,
3121
+ buttonGroup: Et
3122
+ };
3123
+ function Ot({ option: e, displayConfig: t, colorPalette: n, onDisplayConfigChange: r }) {
3124
+ let { t: i } = d(), a = (n) => r({
3125
+ ...t,
3126
+ [e.key]: n
3127
+ }), o = Dt[e.type];
3128
+ return o ? /* @__PURE__ */ w(o, {
3129
+ option: e,
3130
+ displayConfig: t,
3131
+ colorPalette: n,
3132
+ setValue: a,
3133
+ t: i
3134
+ }) : null;
3135
+ }
3136
+ //#endregion
3137
+ //#region src/client/components/AnalysisBuilder/LegacyBooleanOptions.tsx
3138
+ var kt = [
3139
+ {
3140
+ key: "showLegend",
3141
+ labelKey: "display.showLegend",
3142
+ defaultChecked: !0
3143
+ },
3144
+ {
3145
+ key: "showGrid",
3146
+ labelKey: "display.showGrid",
3147
+ defaultChecked: !0
3148
+ },
3149
+ {
3150
+ key: "showTooltip",
3151
+ labelKey: "display.showTooltip",
3152
+ defaultChecked: !0
3153
+ },
3154
+ {
3155
+ key: "stacked",
3156
+ labelKey: "display.stacked",
3157
+ defaultChecked: !1
3158
+ },
3159
+ {
3160
+ key: "showAllXLabels",
3161
+ labelKey: "chart.option.showAllXLabels.label",
3162
+ defaultChecked: !0
3163
+ },
3164
+ {
3165
+ key: "hideHeader",
3166
+ labelKey: "display.hideHeader",
3167
+ defaultChecked: !1
3168
+ }
3169
+ ], At = _(function({ displayOptions: e, displayConfig: t, onDisplayConfigChange: n }) {
3170
+ let { t: r } = d();
3171
+ return !e || e.length === 0 ? null : /* @__PURE__ */ w(C, { children: kt.filter((t) => e.includes(t.key)).map((e) => /* @__PURE__ */ T("label", {
3172
+ className: "dc:flex dc:items-center dc:space-x-2",
3173
+ children: [/* @__PURE__ */ w("input", {
3174
+ type: "checkbox",
3175
+ checked: t[e.key] ?? e.defaultChecked,
3176
+ onChange: (r) => n({
3177
+ ...t,
3178
+ [e.key]: r.target.checked
3179
+ }),
3180
+ className: "dc:rounded border-dc-border focus:ring-dc-accent",
3181
+ style: { color: "var(--dc-primary)" }
3182
+ }), /* @__PURE__ */ w("span", {
3183
+ className: "dc:text-sm text-dc-text",
3184
+ children: r(e.labelKey)
3185
+ })]
3186
+ }, e.key)) });
3187
+ });
3188
+ //#endregion
3189
+ //#region src/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.tsx
3190
+ function jt({ chartType: e, displayConfig: t, colorPalette: r, onDisplayConfigChange: i, excludeKeys: a }) {
3191
+ let { t: o } = d(), { config: s, loaded: c } = n(e);
3192
+ return c ? s.displayOptions && s.displayOptions.length > 0 || s.displayOptionsConfig && s.displayOptionsConfig.length > 0 ? /* @__PURE__ */ w("div", {
3193
+ className: "dc:space-y-6",
3194
+ children: /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w(m, {
3195
+ className: "dc:mb-2",
3196
+ children: o("display.heading")
3197
+ }), /* @__PURE__ */ T("div", {
3198
+ className: "dc:space-y-2",
3199
+ children: [/* @__PURE__ */ w(At, {
3200
+ displayOptions: s.displayOptions,
3201
+ displayConfig: t,
3202
+ onDisplayConfigChange: i
3203
+ }), s.displayOptionsConfig?.filter((e) => !a?.includes(e.key)).map((e) => /* @__PURE__ */ w("div", {
3204
+ className: `dc:space-y-1 ${e.type === "axisFormat" ? "dc:mt-6 dc:pt-2" : ""}`,
3205
+ children: /* @__PURE__ */ w(Ot, {
3206
+ option: e,
3207
+ displayConfig: t,
3208
+ colorPalette: r,
3209
+ onDisplayConfigChange: i
3210
+ })
3211
+ }, e.key))]
3212
+ })] })
3213
+ }) : /* @__PURE__ */ w("div", {
3214
+ className: "dc:text-center text-dc-text-muted dc:text-sm dc:py-4",
3215
+ children: /* @__PURE__ */ w("p", { children: o("display.noOptions") })
3216
+ }) : /* @__PURE__ */ w("div", {
3217
+ className: "dc:text-center text-dc-text-muted dc:text-sm dc:py-4",
3218
+ children: o("display.loading")
3219
+ });
3220
+ }
3221
+ //#endregion
3222
+ //#region src/client/components/ConfirmModal.tsx
3223
+ var Mt = ({ isOpen: e, onClose: t, onConfirm: n, title: r, message: i, confirmText: a, cancelText: o, confirmVariant: s = "primary", isLoading: c = !1 }) => {
3224
+ let { t: l } = d(), u = r ?? l("common.actions.confirm"), f = a ?? l("common.actions.confirm"), p = o ?? l("common.actions.cancel");
3225
+ return /* @__PURE__ */ w(it, {
3226
+ isOpen: e,
3227
+ onClose: t,
3228
+ title: u,
3229
+ size: "sm",
3230
+ closeOnBackdropClick: !c,
3231
+ closeOnEscape: !c,
3232
+ footer: /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("button", {
3233
+ type: "button",
3234
+ onClick: t,
3235
+ disabled: c,
3236
+ className: "dc:px-4 dc:py-2 dc:text-sm dc:font-medium text-dc-text-secondary bg-dc-surface dc:border border-dc-border dc:rounded-md hover:bg-dc-surface-hover dc:transition-colors dc:focus:outline-none dc:focus:ring-2 dc:focus:ring-offset-2 focus:ring-dc-primary dc:disabled:opacity-50 dc:disabled:cursor-not-allowed",
3237
+ children: p
3238
+ }), /* @__PURE__ */ w("button", {
3239
+ type: "button",
3240
+ onClick: async () => {
3241
+ await n(), t();
3242
+ },
3243
+ disabled: c,
3244
+ className: (() => {
3245
+ let e = "dc:px-4 dc:py-2 dc:text-sm dc:font-medium dc:rounded-md dc:transition-colors dc:focus:outline-none dc:focus:ring-2 dc:focus:ring-offset-2 dc:disabled:opacity-50 dc:disabled:cursor-not-allowed";
3246
+ switch (s) {
3247
+ case "danger": return `${e} bg-dc-danger dc:text-white dc:hover:bg-dc-danger/90 focus:ring-dc-danger`;
3248
+ case "warning": return `${e} bg-dc-warning dc:text-white dc:hover:bg-dc-warning/90 focus:ring-dc-warning`;
3249
+ default: return `${e} bg-dc-primary dc:text-white dc:hover:bg-dc-primary/90 focus:ring-dc-primary`;
3250
+ }
3251
+ })(),
3252
+ children: c ? /* @__PURE__ */ T("span", {
3253
+ className: "dc:flex dc:items-center dc:gap-2",
3254
+ children: [/* @__PURE__ */ T("svg", {
3255
+ className: "dc:animate-spin dc:h-4 dc:w-4",
3256
+ xmlns: "http://www.w3.org/2000/svg",
3257
+ fill: "none",
3258
+ viewBox: "0 0 24 24",
3259
+ children: [/* @__PURE__ */ w("circle", {
3260
+ className: "dc:opacity-25",
3261
+ cx: "12",
3262
+ cy: "12",
3263
+ r: "10",
3264
+ stroke: "currentColor",
3265
+ strokeWidth: "4"
3266
+ }), /* @__PURE__ */ w("path", {
3267
+ className: "dc:opacity-75",
3268
+ fill: "currentColor",
3269
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
3270
+ })]
3271
+ }), l("common.modal.processing")]
3272
+ }) : f
3273
+ })] }),
3274
+ children: /* @__PURE__ */ w("div", {
3275
+ className: "text-dc-text-secondary",
3276
+ children: i
3277
+ })
3278
+ });
3279
+ };
3280
+ //#endregion
3281
+ export { le as A, P as B, ge as C, K as D, fe as E, U as F, D as G, I as H, ie as I, k as J, A as K, H as L, q as M, W as N, G as O, ce as P, L as R, X as S, me as T, R as U, N as V, O as W, M as X, j as Y, ee as Z, ke as _, ct as a, ve as b, Je as c, tt as d, et as f, xe as g, be as h, ft as i, ue as j, pe as k, $e as l, Ge as m, jt as n, it as o, Ke as p, E as q, gt as r, qe as s, Mt as t, rt as u, Z as v, he as w, Y as x, ye as y, F as z };
3282
+
3283
+ //# sourceMappingURL=ConfirmModal-D6eLc9NO.js.map