@sqlrooms/mosaic 0.29.0-rc.8 → 0.29.0-rc.9

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 (363) hide show
  1. package/README.md +84 -74
  2. package/dist/ai/agentIntent.d.ts +5 -0
  3. package/dist/ai/agentIntent.d.ts.map +1 -0
  4. package/dist/ai/agentIntent.js +8 -0
  5. package/dist/ai/agentIntent.js.map +1 -0
  6. package/dist/ai/block-document/constants.d.ts +9 -0
  7. package/dist/ai/block-document/constants.d.ts.map +1 -0
  8. package/dist/ai/block-document/constants.js +9 -0
  9. package/dist/ai/block-document/constants.js.map +1 -0
  10. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.d.ts +48 -0
  11. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.d.ts.map +1 -0
  12. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.js +59 -0
  13. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.js.map +1 -0
  14. package/dist/ai/block-document/createBlockDocumentChartTools.d.ts +19 -0
  15. package/dist/ai/block-document/createBlockDocumentChartTools.d.ts.map +1 -0
  16. package/dist/ai/block-document/createBlockDocumentChartTools.js +37 -0
  17. package/dist/ai/block-document/createBlockDocumentChartTools.js.map +1 -0
  18. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.d.ts +32 -0
  19. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.d.ts.map +1 -0
  20. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.js +37 -0
  21. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.js.map +1 -0
  22. package/dist/ai/constants.d.ts +3 -0
  23. package/dist/ai/constants.d.ts.map +1 -0
  24. package/dist/ai/constants.js +3 -0
  25. package/dist/ai/constants.js.map +1 -0
  26. package/dist/ai/createDataTableExplorerTool.d.ts +69 -0
  27. package/dist/ai/createDataTableExplorerTool.d.ts.map +1 -0
  28. package/dist/ai/createDataTableExplorerTool.js +68 -0
  29. package/dist/ai/createDataTableExplorerTool.js.map +1 -0
  30. package/dist/ai/dashboard/constants.d.ts +6 -0
  31. package/dist/ai/dashboard/constants.d.ts.map +1 -0
  32. package/dist/ai/dashboard/constants.js +6 -0
  33. package/dist/ai/dashboard/constants.js.map +1 -0
  34. package/dist/ai/dashboard/createDashboardAgentTool.d.ts +17 -0
  35. package/dist/ai/dashboard/createDashboardAgentTool.d.ts.map +1 -0
  36. package/dist/ai/dashboard/createDashboardAgentTool.js +205 -0
  37. package/dist/ai/dashboard/createDashboardAgentTool.js.map +1 -0
  38. package/dist/ai/dashboard/createDashboardAiAdapter.d.ts +14 -0
  39. package/dist/ai/dashboard/createDashboardAiAdapter.d.ts.map +1 -0
  40. package/dist/ai/dashboard/createDashboardAiAdapter.js +75 -0
  41. package/dist/ai/dashboard/createDashboardAiAdapter.js.map +1 -0
  42. package/dist/ai/dashboard/createDashboardAiTools.d.ts +26 -0
  43. package/dist/ai/dashboard/createDashboardAiTools.d.ts.map +1 -0
  44. package/dist/ai/dashboard/createDashboardAiTools.js +40 -0
  45. package/dist/ai/dashboard/createDashboardAiTools.js.map +1 -0
  46. package/dist/ai/dashboard/createDashboardChartTools.d.ts +27 -0
  47. package/dist/ai/dashboard/createDashboardChartTools.d.ts.map +1 -0
  48. package/dist/ai/dashboard/createDashboardChartTools.js +55 -0
  49. package/dist/ai/dashboard/createDashboardChartTools.js.map +1 -0
  50. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.d.ts +23 -0
  51. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.d.ts.map +1 -0
  52. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.js +29 -0
  53. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.js.map +1 -0
  54. package/dist/ai/dashboard/createListDashboardPanelsTool.d.ts +28 -0
  55. package/dist/ai/dashboard/createListDashboardPanelsTool.d.ts.map +1 -0
  56. package/dist/ai/dashboard/createListDashboardPanelsTool.js +54 -0
  57. package/dist/ai/dashboard/createListDashboardPanelsTool.js.map +1 -0
  58. package/dist/ai/dashboard/dashboard-types.d.ts +59 -0
  59. package/dist/ai/dashboard/dashboard-types.d.ts.map +1 -0
  60. package/dist/ai/dashboard/dashboard-types.js +2 -0
  61. package/dist/ai/dashboard/dashboard-types.js.map +1 -0
  62. package/dist/ai/database-types.d.ts +12 -0
  63. package/dist/ai/database-types.d.ts.map +1 -0
  64. package/dist/ai/database-types.js +2 -0
  65. package/dist/ai/database-types.js.map +1 -0
  66. package/dist/ai/errors.d.ts +8 -0
  67. package/dist/ai/errors.d.ts.map +1 -0
  68. package/dist/ai/errors.js +11 -0
  69. package/dist/ai/errors.js.map +1 -0
  70. package/dist/ai/tool-helpers.d.ts +28 -29
  71. package/dist/ai/tool-helpers.d.ts.map +1 -1
  72. package/dist/ai/tool-helpers.js +38 -76
  73. package/dist/ai/tool-helpers.js.map +1 -1
  74. package/dist/ai/tool-schemas.d.ts +9 -4
  75. package/dist/ai/tool-schemas.d.ts.map +1 -1
  76. package/dist/ai/tool-schemas.js +12 -12
  77. package/dist/ai/tool-schemas.js.map +1 -1
  78. package/dist/ai/tool-types.d.ts +19 -1
  79. package/dist/ai/tool-types.d.ts.map +1 -1
  80. package/dist/ai/tool-types.js.map +1 -1
  81. package/dist/ai/types.d.ts +64 -0
  82. package/dist/ai/types.d.ts.map +1 -0
  83. package/dist/ai/types.js +2 -0
  84. package/dist/ai/types.js.map +1 -0
  85. package/dist/ai.d.ts +16 -2
  86. package/dist/ai.d.ts.map +1 -1
  87. package/dist/ai.js +14 -5
  88. package/dist/ai.js.map +1 -1
  89. package/dist/charts/MosaicChart.js +1 -1
  90. package/dist/charts/MosaicChart.js.map +1 -1
  91. package/dist/charts/MosaicChartView.d.ts.map +1 -1
  92. package/dist/charts/MosaicChartView.js +1 -2
  93. package/dist/charts/MosaicChartView.js.map +1 -1
  94. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.d.ts.map +1 -1
  95. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.js +2 -1
  96. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.js.map +1 -1
  97. package/dist/charts/chart-settings/MosaicChartTypeSelector.d.ts.map +1 -1
  98. package/dist/charts/chart-settings/MosaicChartTypeSelector.js +4 -11
  99. package/dist/charts/chart-settings/MosaicChartTypeSelector.js.map +1 -1
  100. package/dist/charts/chart-types/base-types.d.ts +27 -23
  101. package/dist/charts/chart-types/base-types.d.ts.map +1 -1
  102. package/dist/charts/chart-types/base-types.js +3 -1
  103. package/dist/charts/chart-types/base-types.js.map +1 -1
  104. package/dist/charts/chart-types/box-plot/definition.d.ts.map +1 -1
  105. package/dist/charts/chart-types/box-plot/definition.js +1 -0
  106. package/dist/charts/chart-types/box-plot/definition.js.map +1 -1
  107. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts +37 -3
  108. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts.map +1 -1
  109. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js +26 -6
  110. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js.map +1 -1
  111. package/dist/charts/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js +2 -2
  112. package/dist/charts/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js.map +1 -1
  113. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.d.ts +12 -1
  114. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.d.ts.map +1 -1
  115. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.js +13 -3
  116. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.js.map +1 -1
  117. package/dist/charts/chart-types/box-plot/tool.d.ts +20 -24
  118. package/dist/charts/chart-types/box-plot/tool.d.ts.map +1 -1
  119. package/dist/charts/chart-types/box-plot/tool.js +25 -33
  120. package/dist/charts/chart-types/box-plot/tool.js.map +1 -1
  121. package/dist/charts/chart-types/box-plot/validation.d.ts +9 -0
  122. package/dist/charts/chart-types/box-plot/validation.d.ts.map +1 -0
  123. package/dist/charts/chart-types/box-plot/validation.js +32 -0
  124. package/dist/charts/chart-types/box-plot/validation.js.map +1 -0
  125. package/dist/charts/chart-types/column-types.d.ts +8 -0
  126. package/dist/charts/chart-types/column-types.d.ts.map +1 -0
  127. package/dist/charts/chart-types/column-types.js +2 -0
  128. package/dist/charts/chart-types/column-types.js.map +1 -0
  129. package/dist/charts/chart-types/count-plot/definition.d.ts.map +1 -1
  130. package/dist/charts/chart-types/count-plot/definition.js +1 -0
  131. package/dist/charts/chart-types/count-plot/definition.js.map +1 -1
  132. package/dist/charts/chart-types/count-plot/spec.d.ts.map +1 -1
  133. package/dist/charts/chart-types/count-plot/spec.js +1 -19
  134. package/dist/charts/chart-types/count-plot/spec.js.map +1 -1
  135. package/dist/charts/chart-types/count-plot/tool.d.ts +19 -24
  136. package/dist/charts/chart-types/count-plot/tool.d.ts.map +1 -1
  137. package/dist/charts/chart-types/count-plot/tool.js +25 -32
  138. package/dist/charts/chart-types/count-plot/tool.js.map +1 -1
  139. package/dist/charts/chart-types/count-plot/validation.d.ts +8 -0
  140. package/dist/charts/chart-types/count-plot/validation.d.ts.map +1 -0
  141. package/dist/charts/chart-types/count-plot/validation.js +20 -0
  142. package/dist/charts/chart-types/count-plot/validation.js.map +1 -0
  143. package/dist/charts/chart-types/createChartInstructions.d.ts +3 -0
  144. package/dist/charts/chart-types/createChartInstructions.d.ts.map +1 -0
  145. package/dist/charts/chart-types/createChartInstructions.js +12 -0
  146. package/dist/charts/chart-types/createChartInstructions.js.map +1 -0
  147. package/dist/charts/chart-types/createChartTools.d.ts +15 -9
  148. package/dist/charts/chart-types/createChartTools.d.ts.map +1 -1
  149. package/dist/charts/chart-types/createChartTools.js +16 -10
  150. package/dist/charts/chart-types/createChartTools.js.map +1 -1
  151. package/dist/charts/chart-types/custom-spec/definition.d.ts.map +1 -1
  152. package/dist/charts/chart-types/custom-spec/definition.js +1 -0
  153. package/dist/charts/chart-types/custom-spec/definition.js.map +1 -1
  154. package/dist/charts/chart-types/errors.d.ts +10 -0
  155. package/dist/charts/chart-types/errors.d.ts.map +1 -1
  156. package/dist/charts/chart-types/errors.js +18 -0
  157. package/dist/charts/chart-types/errors.js.map +1 -1
  158. package/dist/charts/chart-types/heatmap/definition.d.ts.map +1 -1
  159. package/dist/charts/chart-types/heatmap/definition.js +1 -0
  160. package/dist/charts/chart-types/heatmap/definition.js.map +1 -1
  161. package/dist/charts/chart-types/heatmap/spec.d.ts.map +1 -1
  162. package/dist/charts/chart-types/heatmap/spec.js +1 -33
  163. package/dist/charts/chart-types/heatmap/spec.js.map +1 -1
  164. package/dist/charts/chart-types/heatmap/tool.d.ts +20 -24
  165. package/dist/charts/chart-types/heatmap/tool.d.ts.map +1 -1
  166. package/dist/charts/chart-types/heatmap/tool.js +26 -36
  167. package/dist/charts/chart-types/heatmap/tool.js.map +1 -1
  168. package/dist/charts/chart-types/heatmap/validation.d.ts +9 -0
  169. package/dist/charts/chart-types/heatmap/validation.d.ts.map +1 -0
  170. package/dist/charts/chart-types/heatmap/validation.js +34 -0
  171. package/dist/charts/chart-types/heatmap/validation.js.map +1 -0
  172. package/dist/charts/chart-types/histogram/definition.d.ts.map +1 -1
  173. package/dist/charts/chart-types/histogram/definition.js +1 -0
  174. package/dist/charts/chart-types/histogram/definition.js.map +1 -1
  175. package/dist/charts/chart-types/histogram/spec.d.ts.map +1 -1
  176. package/dist/charts/chart-types/histogram/spec.js +1 -21
  177. package/dist/charts/chart-types/histogram/spec.js.map +1 -1
  178. package/dist/charts/chart-types/histogram/tool.d.ts +37 -24
  179. package/dist/charts/chart-types/histogram/tool.d.ts.map +1 -1
  180. package/dist/charts/chart-types/histogram/tool.js +38 -32
  181. package/dist/charts/chart-types/histogram/tool.js.map +1 -1
  182. package/dist/charts/chart-types/histogram/validation.d.ts +9 -0
  183. package/dist/charts/chart-types/histogram/validation.d.ts.map +1 -0
  184. package/dist/charts/chart-types/histogram/validation.js +22 -0
  185. package/dist/charts/chart-types/histogram/validation.js.map +1 -0
  186. package/dist/charts/chart-types/index.d.ts +1 -7
  187. package/dist/charts/chart-types/index.d.ts.map +1 -1
  188. package/dist/charts/chart-types/index.js +2 -8
  189. package/dist/charts/chart-types/index.js.map +1 -1
  190. package/dist/charts/chart-types/line-chart/definition.d.ts.map +1 -1
  191. package/dist/charts/chart-types/line-chart/definition.js +1 -0
  192. package/dist/charts/chart-types/line-chart/definition.js.map +1 -1
  193. package/dist/charts/chart-types/line-chart/spec.d.ts.map +1 -1
  194. package/dist/charts/chart-types/line-chart/spec.js +5 -46
  195. package/dist/charts/chart-types/line-chart/spec.js.map +1 -1
  196. package/dist/charts/chart-types/line-chart/tool.d.ts +26 -24
  197. package/dist/charts/chart-types/line-chart/tool.d.ts.map +1 -1
  198. package/dist/charts/chart-types/line-chart/tool.js +26 -38
  199. package/dist/charts/chart-types/line-chart/tool.js.map +1 -1
  200. package/dist/charts/chart-types/line-chart/validation.d.ts +16 -0
  201. package/dist/charts/chart-types/line-chart/validation.d.ts.map +1 -0
  202. package/dist/charts/chart-types/line-chart/validation.js +43 -0
  203. package/dist/charts/chart-types/line-chart/validation.js.map +1 -0
  204. package/dist/charts/chart-types/resolveChartTypes.d.ts +3 -0
  205. package/dist/charts/chart-types/resolveChartTypes.d.ts.map +1 -0
  206. package/dist/charts/chart-types/resolveChartTypes.js +8 -0
  207. package/dist/charts/chart-types/resolveChartTypes.js.map +1 -0
  208. package/dist/charts/chart-types/scatter-plot/definition.d.ts.map +1 -1
  209. package/dist/charts/chart-types/scatter-plot/definition.js +1 -0
  210. package/dist/charts/chart-types/scatter-plot/definition.js.map +1 -1
  211. package/dist/charts/chart-types/scatter-plot/spec.d.ts.map +1 -1
  212. package/dist/charts/chart-types/scatter-plot/spec.js +1 -45
  213. package/dist/charts/chart-types/scatter-plot/spec.js.map +1 -1
  214. package/dist/charts/chart-types/scatter-plot/tool.d.ts +21 -24
  215. package/dist/charts/chart-types/scatter-plot/tool.d.ts.map +1 -1
  216. package/dist/charts/chart-types/scatter-plot/tool.js +28 -41
  217. package/dist/charts/chart-types/scatter-plot/tool.js.map +1 -1
  218. package/dist/charts/chart-types/scatter-plot/validation.d.ts +13 -0
  219. package/dist/charts/chart-types/scatter-plot/validation.d.ts.map +1 -0
  220. package/dist/charts/chart-types/scatter-plot/validation.js +52 -0
  221. package/dist/charts/chart-types/scatter-plot/validation.js.map +1 -0
  222. package/dist/charts/chart-types/tool-types.d.ts +43 -0
  223. package/dist/charts/chart-types/tool-types.d.ts.map +1 -0
  224. package/dist/charts/chart-types/tool-types.js +2 -0
  225. package/dist/charts/chart-types/tool-types.js.map +1 -0
  226. package/dist/charts/chart-types/utils.d.ts +3 -0
  227. package/dist/charts/chart-types/utils.d.ts.map +1 -0
  228. package/dist/charts/chart-types/utils.js +4 -0
  229. package/dist/charts/chart-types/utils.js.map +1 -0
  230. package/dist/charts/dashboard/MosaicDashboardChartRenderer.d.ts.map +1 -1
  231. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js +5 -3
  232. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js.map +1 -1
  233. package/dist/charts/useChartDataPolicy.js +2 -2
  234. package/dist/charts/useChartDataPolicy.js.map +1 -1
  235. package/dist/components/AggregationSelector.d.ts.map +1 -1
  236. package/dist/components/AggregationSelector.js +1 -1
  237. package/dist/components/AggregationSelector.js.map +1 -1
  238. package/dist/components/ColorSelector.d.ts.map +1 -1
  239. package/dist/components/ColorSelector.js +1 -2
  240. package/dist/components/ColorSelector.js.map +1 -1
  241. package/dist/components/FieldSelectorInput.d.ts.map +1 -1
  242. package/dist/components/FieldSelectorInput.js +3 -3
  243. package/dist/components/FieldSelectorInput.js.map +1 -1
  244. package/dist/components/TemporalGranularitySelector.d.ts.map +1 -1
  245. package/dist/components/TemporalGranularitySelector.js +1 -1
  246. package/dist/components/TemporalGranularitySelector.js.map +1 -1
  247. package/dist/dashboard/MosaicDashboardCommands.d.ts +19 -0
  248. package/dist/dashboard/MosaicDashboardCommands.d.ts.map +1 -0
  249. package/dist/dashboard/MosaicDashboardCommands.js +226 -0
  250. package/dist/dashboard/MosaicDashboardCommands.js.map +1 -0
  251. package/dist/dashboard/dashboard-types.d.ts.map +1 -1
  252. package/dist/dashboard/dashboard-types.js.map +1 -1
  253. package/dist/dashboard/panel/MosaicDashboardPanel.d.ts.map +1 -1
  254. package/dist/dashboard/panel/MosaicDashboardPanel.js +1 -1
  255. package/dist/dashboard/panel/MosaicDashboardPanel.js.map +1 -1
  256. package/dist/dashboard/panel/MosaicDashboardPanelLayout.d.ts.map +1 -1
  257. package/dist/dashboard/panel/MosaicDashboardPanelLayout.js +3 -3
  258. package/dist/dashboard/panel/MosaicDashboardPanelLayout.js.map +1 -1
  259. package/dist/dashboard/panel/MosaicDashboardPanels.d.ts.map +1 -1
  260. package/dist/dashboard/panel/MosaicDashboardPanels.js +4 -2
  261. package/dist/dashboard/panel/MosaicDashboardPanels.js.map +1 -1
  262. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts.map +1 -1
  263. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js +4 -4
  264. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js.map +1 -1
  265. package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts.map +1 -1
  266. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js +5 -3
  267. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js.map +1 -1
  268. package/dist/dashboard/useSelectedOrFirstTable.d.ts +1 -1
  269. package/dist/dashboard/useSelectedOrFirstTable.d.ts.map +1 -1
  270. package/dist/dashboard/useSelectedOrFirstTable.js +10 -8
  271. package/dist/dashboard/useSelectedOrFirstTable.js.map +1 -1
  272. package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts +3 -2
  273. package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts.map +1 -1
  274. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js +3 -3
  275. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js.map +1 -1
  276. package/dist/data-table-explorer/DataTableExplorerCountClient.d.ts +3 -1
  277. package/dist/data-table-explorer/DataTableExplorerCountClient.d.ts.map +1 -1
  278. package/dist/data-table-explorer/DataTableExplorerCountClient.js +3 -3
  279. package/dist/data-table-explorer/DataTableExplorerCountClient.js.map +1 -1
  280. package/dist/data-table-explorer/DataTableExplorerHistogramClient.d.ts +3 -2
  281. package/dist/data-table-explorer/DataTableExplorerHistogramClient.d.ts.map +1 -1
  282. package/dist/data-table-explorer/DataTableExplorerHistogramClient.js +4 -4
  283. package/dist/data-table-explorer/DataTableExplorerHistogramClient.js.map +1 -1
  284. package/dist/data-table-explorer/DataTableExplorerPageClient.d.ts +3 -1
  285. package/dist/data-table-explorer/DataTableExplorerPageClient.d.ts.map +1 -1
  286. package/dist/data-table-explorer/DataTableExplorerPageClient.js +3 -1
  287. package/dist/data-table-explorer/DataTableExplorerPageClient.js.map +1 -1
  288. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.d.ts +3 -2
  289. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.d.ts.map +1 -1
  290. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.js +3 -3
  291. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.js.map +1 -1
  292. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.d.ts.map +1 -1
  293. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js +7 -4
  294. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js.map +1 -1
  295. package/dist/data-table-explorer/dataTableExplorerController.d.ts +58 -2
  296. package/dist/data-table-explorer/dataTableExplorerController.d.ts.map +1 -1
  297. package/dist/data-table-explorer/dataTableExplorerController.js +68 -8
  298. package/dist/data-table-explorer/dataTableExplorerController.js.map +1 -1
  299. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts +23 -1
  300. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts.map +1 -1
  301. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js +46 -13
  302. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js.map +1 -1
  303. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts +17 -3
  304. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts.map +1 -1
  305. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js +9 -6
  306. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js.map +1 -1
  307. package/dist/data-table-explorer/types.d.ts +10 -0
  308. package/dist/data-table-explorer/types.d.ts.map +1 -1
  309. package/dist/data-table-explorer/types.js.map +1 -1
  310. package/dist/data-table-explorer/useDataTableExplorer.d.ts.map +1 -1
  311. package/dist/data-table-explorer/useDataTableExplorer.js +10 -6
  312. package/dist/data-table-explorer/useDataTableExplorer.js.map +1 -1
  313. package/dist/data-table-explorer/utils.d.ts +64 -6
  314. package/dist/data-table-explorer/utils.d.ts.map +1 -1
  315. package/dist/data-table-explorer/utils.js +58 -0
  316. package/dist/data-table-explorer/utils.js.map +1 -1
  317. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.d.ts.map +1 -1
  318. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js +2 -2
  319. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js.map +1 -1
  320. package/dist/index.d.ts +49 -29
  321. package/dist/index.d.ts.map +1 -1
  322. package/dist/index.js +81 -25
  323. package/dist/index.js.map +1 -1
  324. package/dist/mosaicTableReference.d.ts +59 -0
  325. package/dist/mosaicTableReference.d.ts.map +1 -0
  326. package/dist/mosaicTableReference.js +68 -0
  327. package/dist/mosaicTableReference.js.map +1 -0
  328. package/dist/useVgPlotChartRender.d.ts.map +1 -1
  329. package/dist/useVgPlotChartRender.js +26 -1
  330. package/dist/useVgPlotChartRender.js.map +1 -1
  331. package/dist/utils/table-lookup.d.ts +7 -0
  332. package/dist/utils/table-lookup.d.ts.map +1 -0
  333. package/dist/utils/table-lookup.js +10 -0
  334. package/dist/utils/table-lookup.js.map +1 -0
  335. package/package.json +14 -14
  336. package/dist/ai/ai.d.ts +0 -108
  337. package/dist/ai/ai.d.ts.map +0 -1
  338. package/dist/ai/ai.js +0 -461
  339. package/dist/ai/ai.js.map +0 -1
  340. package/dist/ai/data-table-explorer-tool.d.ts +0 -40
  341. package/dist/ai/data-table-explorer-tool.d.ts.map +0 -1
  342. package/dist/ai/data-table-explorer-tool.js +0 -75
  343. package/dist/ai/data-table-explorer-tool.js.map +0 -1
  344. package/dist/ai/list-panels-tool.d.ts +0 -35
  345. package/dist/ai/list-panels-tool.d.ts.map +0 -1
  346. package/dist/ai/list-panels-tool.js +0 -66
  347. package/dist/ai/list-panels-tool.js.map +0 -1
  348. package/dist/ai/remove-panel-tool.d.ts +0 -31
  349. package/dist/ai/remove-panel-tool.d.ts.map +0 -1
  350. package/dist/ai/remove-panel-tool.js +0 -55
  351. package/dist/ai/remove-panel-tool.js.map +0 -1
  352. package/dist/ai/tool-validation.d.ts +0 -3
  353. package/dist/ai/tool-validation.d.ts.map +0 -1
  354. package/dist/ai/tool-validation.js +0 -11
  355. package/dist/ai/tool-validation.js.map +0 -1
  356. package/dist/components/Combobox.d.ts +0 -45
  357. package/dist/components/Combobox.d.ts.map +0 -1
  358. package/dist/components/Combobox.js +0 -58
  359. package/dist/components/Combobox.js.map +0 -1
  360. package/dist/components/useCombobox.d.ts +0 -23
  361. package/dist/components/useCombobox.d.ts.map +0 -1
  362. package/dist/components/useCombobox.js +0 -26
  363. package/dist/components/useCombobox.js.map +0 -1
@@ -0,0 +1,226 @@
1
+ import { z } from 'zod';
2
+ import { ChartPanelConfig, DataTableExplorerPanel, MOSAIC_DASHBOARD_CHART_PANEL_TYPE, MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE, MosaicDashboardPanelConfig as MosaicDashboardPanelConfigSchema, } from './dashboard-types';
3
+ import { MosaicDashboardPanelSource } from './core-types';
4
+ export const MOSAIC_DASHBOARD_COMMAND_IDS = {
5
+ setSelectedTable: 'dashboard.set-selected-table',
6
+ addPanel: 'dashboard.add-panel',
7
+ updatePanel: 'dashboard.update-panel',
8
+ removePanel: 'dashboard.remove-panel',
9
+ };
10
+ const DashboardSetSelectedTableInput = z.object({
11
+ dashboardId: z.string().describe('Target dashboard ID.'),
12
+ tableName: z.string().min(1).describe('Selected Mosaic table name.'),
13
+ });
14
+ const DashboardAddPanelInput = z.object({
15
+ dashboardId: z.string().describe('Target dashboard ID.'),
16
+ panel: MosaicDashboardPanelConfigSchema.describe('Panel config to add.'),
17
+ });
18
+ const DashboardUpdatePanelInput = z.object({
19
+ dashboardId: z.string().describe('Target dashboard ID.'),
20
+ panelId: z.string().describe('Dashboard panel ID to update.'),
21
+ patch: z
22
+ .object({
23
+ title: z.string().optional(),
24
+ type: z.string().min(1).optional(),
25
+ source: MosaicDashboardPanelSource.optional(),
26
+ config: z.record(z.string(), z.unknown()).optional(),
27
+ })
28
+ .describe('Partial panel config patch.'),
29
+ });
30
+ const DashboardRemovePanelInput = z.object({
31
+ dashboardId: z.string().describe('Target dashboard ID.'),
32
+ panelId: z.string().describe('Dashboard panel ID to remove.'),
33
+ });
34
+ function dashboardMissing(commandId, dashboardId) {
35
+ return {
36
+ success: false,
37
+ commandId,
38
+ code: 'dashboard-not-found',
39
+ error: `Unknown dashboard "${dashboardId}".`,
40
+ };
41
+ }
42
+ function panelMissing(commandId, panelId) {
43
+ return {
44
+ success: false,
45
+ commandId,
46
+ code: 'dashboard-panel-not-found',
47
+ error: `Unknown dashboard panel "${panelId}".`,
48
+ };
49
+ }
50
+ function panelData(dashboardId, panel, selectedTable) {
51
+ return {
52
+ dashboardId,
53
+ panelId: panel.id,
54
+ panelType: panel.type,
55
+ title: panel.title,
56
+ selectedTable,
57
+ };
58
+ }
59
+ function getPanel(dashboard, panelId) {
60
+ return dashboard.panels.find((panel) => panel.id === panelId);
61
+ }
62
+ /**
63
+ * Create reusable Mosaic dashboard commands for selected table and panel
64
+ * mutations.
65
+ *
66
+ * These commands delegate to the dashboard slice so UI code, agents, and
67
+ * future automation share the same persistence behavior.
68
+ */
69
+ export function createMosaicDashboardCommands() {
70
+ return [
71
+ {
72
+ id: MOSAIC_DASHBOARD_COMMAND_IDS.setSelectedTable,
73
+ name: 'Set dashboard selected table',
74
+ description: 'Set the selected source table for a Mosaic dashboard.',
75
+ group: 'Dashboard',
76
+ keywords: ['dashboard', 'table', 'select', 'mosaic'],
77
+ inputSchema: DashboardSetSelectedTableInput,
78
+ inputDescription: 'Dashboard ID and table name.',
79
+ metadata: { readOnly: false, idempotent: true, riskLevel: 'low' },
80
+ execute: ({ getState }, input) => {
81
+ const { dashboardId, tableName } = input;
82
+ const state = getState();
83
+ const dashboard = state.mosaicDashboard.getDashboard(dashboardId);
84
+ const previousSelectedTable = dashboard?.selectedTable;
85
+ state.mosaicDashboard.setSelectedTable(dashboardId, tableName);
86
+ return {
87
+ success: true,
88
+ commandId: MOSAIC_DASHBOARD_COMMAND_IDS.setSelectedTable,
89
+ message: `Set dashboard "${dashboardId}" selected table to "${tableName}".`,
90
+ data: {
91
+ dashboardId,
92
+ selectedTable: tableName,
93
+ previousSelectedTable,
94
+ },
95
+ };
96
+ },
97
+ },
98
+ {
99
+ id: MOSAIC_DASHBOARD_COMMAND_IDS.addPanel,
100
+ name: 'Add dashboard panel',
101
+ description: 'Add a panel to a Mosaic dashboard.',
102
+ group: 'Dashboard',
103
+ keywords: ['dashboard', 'panel', 'add', 'chart', 'table'],
104
+ inputSchema: DashboardAddPanelInput,
105
+ inputDescription: 'Dashboard ID and panel config.',
106
+ metadata: { readOnly: false, idempotent: false, riskLevel: 'medium' },
107
+ execute: ({ getState }, input) => {
108
+ const { dashboardId, panel } = input;
109
+ const state = getState();
110
+ state.mosaicDashboard.addPanel(dashboardId, panel);
111
+ const dashboard = state.mosaicDashboard.getDashboard(dashboardId);
112
+ return {
113
+ success: true,
114
+ commandId: MOSAIC_DASHBOARD_COMMAND_IDS.addPanel,
115
+ message: `Added "${panel.title}" panel to dashboard "${dashboardId}".`,
116
+ data: panelData(dashboardId, panel, dashboard?.selectedTable),
117
+ };
118
+ },
119
+ },
120
+ {
121
+ id: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,
122
+ name: 'Update dashboard panel',
123
+ description: 'Update an existing Mosaic dashboard panel.',
124
+ group: 'Dashboard',
125
+ keywords: ['dashboard', 'panel', 'update', 'chart'],
126
+ inputSchema: DashboardUpdatePanelInput,
127
+ inputDescription: 'Dashboard ID, panel ID, and partial panel patch.',
128
+ metadata: { readOnly: false, idempotent: false, riskLevel: 'medium' },
129
+ execute: ({ getState }, input) => {
130
+ const { dashboardId, panelId, patch } = input;
131
+ const state = getState();
132
+ const dashboard = state.mosaicDashboard.getDashboard(dashboardId);
133
+ if (!dashboard) {
134
+ return dashboardMissing(MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel, dashboardId);
135
+ }
136
+ const existingPanel = getPanel(dashboard, panelId);
137
+ if (!existingPanel) {
138
+ return panelMissing(MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel, panelId);
139
+ }
140
+ const panelValidation = validatePanelConfig({
141
+ ...existingPanel,
142
+ ...patch,
143
+ id: panelId,
144
+ });
145
+ if (!panelValidation.success) {
146
+ return {
147
+ success: false,
148
+ commandId: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,
149
+ code: 'invalid-dashboard-panel-patch',
150
+ error: 'Dashboard panel patch does not match the panel type.',
151
+ data: {
152
+ dashboardId,
153
+ panelId,
154
+ issues: panelValidation.error.issues,
155
+ },
156
+ };
157
+ }
158
+ state.mosaicDashboard.updatePanel(dashboardId, panelId, stripPanelId(panelValidation.data));
159
+ const updatedDashboard = state.mosaicDashboard.getDashboard(dashboardId);
160
+ const updatedPanel = updatedDashboard
161
+ ? getPanel(updatedDashboard, panelId)
162
+ : undefined;
163
+ return {
164
+ success: true,
165
+ commandId: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,
166
+ message: `Updated dashboard panel "${panelId}".`,
167
+ data: updatedPanel
168
+ ? {
169
+ ...panelData(dashboardId, updatedPanel, updatedDashboard?.selectedTable),
170
+ previousTitle: existingPanel.title,
171
+ }
172
+ : { dashboardId, panelId },
173
+ };
174
+ },
175
+ },
176
+ {
177
+ id: MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,
178
+ name: 'Remove dashboard panel',
179
+ description: 'Remove a panel from a Mosaic dashboard.',
180
+ group: 'Dashboard',
181
+ keywords: ['dashboard', 'panel', 'remove', 'delete'],
182
+ inputSchema: DashboardRemovePanelInput,
183
+ inputDescription: 'Dashboard ID and panel ID.',
184
+ metadata: { readOnly: false, idempotent: false, riskLevel: 'medium' },
185
+ execute: ({ getState }, input) => {
186
+ const { dashboardId, panelId } = input;
187
+ const state = getState();
188
+ const dashboard = state.mosaicDashboard.getDashboard(dashboardId);
189
+ if (!dashboard) {
190
+ return dashboardMissing(MOSAIC_DASHBOARD_COMMAND_IDS.removePanel, dashboardId);
191
+ }
192
+ const panel = getPanel(dashboard, panelId);
193
+ if (!panel) {
194
+ return panelMissing(MOSAIC_DASHBOARD_COMMAND_IDS.removePanel, panelId);
195
+ }
196
+ state.mosaicDashboard.removePanel(dashboardId, panelId);
197
+ return {
198
+ success: true,
199
+ commandId: MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,
200
+ message: `Removed dashboard panel "${panelId}".`,
201
+ data: {
202
+ ...panelData(dashboardId, panel, dashboard.selectedTable),
203
+ removedPanel: panel,
204
+ },
205
+ };
206
+ },
207
+ },
208
+ ];
209
+ }
210
+ function stripPanelId(panel) {
211
+ const { id: _id, ...patch } = panel;
212
+ return patch;
213
+ }
214
+ function validatePanelConfig(panel) {
215
+ const panelType = typeof panel === 'object' && panel !== null && 'type' in panel
216
+ ? panel.type
217
+ : undefined;
218
+ if (panelType === MOSAIC_DASHBOARD_CHART_PANEL_TYPE) {
219
+ return ChartPanelConfig.safeParse(panel);
220
+ }
221
+ if (panelType === MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE) {
222
+ return DataTableExplorerPanel.safeParse(panel);
223
+ }
224
+ return MosaicDashboardPanelConfigSchema.safeParse(panel);
225
+ }
226
+ //# sourceMappingURL=MosaicDashboardCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MosaicDashboardCommands.js","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardCommands.ts"],"names":[],"mappings":"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","sourcesContent":["import type {BaseRoomStoreState, RoomCommand} from '@sqlrooms/room-store';\nimport {z} from 'zod';\nimport type {\n MosaicDashboardEntry,\n MosaicDashboardPanelConfig,\n} from './dashboard-types';\nimport {\n ChartPanelConfig,\n DataTableExplorerPanel,\n MOSAIC_DASHBOARD_CHART_PANEL_TYPE,\n MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE,\n MosaicDashboardPanelConfig as MosaicDashboardPanelConfigSchema,\n} from './dashboard-types';\nimport {MosaicDashboardPanelSource} from './core-types';\nimport type {MosaicDashboardSliceState} from './MosaicDashboardSlice';\n\nexport const MOSAIC_DASHBOARD_COMMAND_IDS = {\n setSelectedTable: 'dashboard.set-selected-table',\n addPanel: 'dashboard.add-panel',\n updatePanel: 'dashboard.update-panel',\n removePanel: 'dashboard.remove-panel',\n} as const;\n\nconst DashboardSetSelectedTableInput = z.object({\n dashboardId: z.string().describe('Target dashboard ID.'),\n tableName: z.string().min(1).describe('Selected Mosaic table name.'),\n});\n\nconst DashboardAddPanelInput = z.object({\n dashboardId: z.string().describe('Target dashboard ID.'),\n panel: MosaicDashboardPanelConfigSchema.describe('Panel config to add.'),\n});\n\nconst DashboardUpdatePanelInput = z.object({\n dashboardId: z.string().describe('Target dashboard ID.'),\n panelId: z.string().describe('Dashboard panel ID to update.'),\n patch: z\n .object({\n title: z.string().optional(),\n type: z.string().min(1).optional(),\n source: MosaicDashboardPanelSource.optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n })\n .describe('Partial panel config patch.'),\n});\n\nconst DashboardRemovePanelInput = z.object({\n dashboardId: z.string().describe('Target dashboard ID.'),\n panelId: z.string().describe('Dashboard panel ID to remove.'),\n});\n\ntype DashboardCommandState = BaseRoomStoreState & MosaicDashboardSliceState;\n\nfunction dashboardMissing(commandId: string, dashboardId: string) {\n return {\n success: false,\n commandId,\n code: 'dashboard-not-found',\n error: `Unknown dashboard \"${dashboardId}\".`,\n };\n}\n\nfunction panelMissing(commandId: string, panelId: string) {\n return {\n success: false,\n commandId,\n code: 'dashboard-panel-not-found',\n error: `Unknown dashboard panel \"${panelId}\".`,\n };\n}\n\nfunction panelData(\n dashboardId: string,\n panel: MosaicDashboardPanelConfig,\n selectedTable?: string,\n) {\n return {\n dashboardId,\n panelId: panel.id,\n panelType: panel.type,\n title: panel.title,\n selectedTable,\n };\n}\n\nfunction getPanel(\n dashboard: MosaicDashboardEntry,\n panelId: string,\n): MosaicDashboardPanelConfig | undefined {\n return dashboard.panels.find((panel) => panel.id === panelId);\n}\n\n/**\n * Create reusable Mosaic dashboard commands for selected table and panel\n * mutations.\n *\n * These commands delegate to the dashboard slice so UI code, agents, and\n * future automation share the same persistence behavior.\n */\nexport function createMosaicDashboardCommands<\n TRoomState extends DashboardCommandState = DashboardCommandState,\n>(): RoomCommand<TRoomState>[] {\n return [\n {\n id: MOSAIC_DASHBOARD_COMMAND_IDS.setSelectedTable,\n name: 'Set dashboard selected table',\n description: 'Set the selected source table for a Mosaic dashboard.',\n group: 'Dashboard',\n keywords: ['dashboard', 'table', 'select', 'mosaic'],\n inputSchema: DashboardSetSelectedTableInput,\n inputDescription: 'Dashboard ID and table name.',\n metadata: {readOnly: false, idempotent: true, riskLevel: 'low'},\n execute: ({getState}, input) => {\n const {dashboardId, tableName} = input as z.infer<\n typeof DashboardSetSelectedTableInput\n >;\n const state = getState();\n const dashboard = state.mosaicDashboard.getDashboard(dashboardId);\n const previousSelectedTable = dashboard?.selectedTable;\n state.mosaicDashboard.setSelectedTable(dashboardId, tableName);\n return {\n success: true,\n commandId: MOSAIC_DASHBOARD_COMMAND_IDS.setSelectedTable,\n message: `Set dashboard \"${dashboardId}\" selected table to \"${tableName}\".`,\n data: {\n dashboardId,\n selectedTable: tableName,\n previousSelectedTable,\n },\n };\n },\n },\n {\n id: MOSAIC_DASHBOARD_COMMAND_IDS.addPanel,\n name: 'Add dashboard panel',\n description: 'Add a panel to a Mosaic dashboard.',\n group: 'Dashboard',\n keywords: ['dashboard', 'panel', 'add', 'chart', 'table'],\n inputSchema: DashboardAddPanelInput,\n inputDescription: 'Dashboard ID and panel config.',\n metadata: {readOnly: false, idempotent: false, riskLevel: 'medium'},\n execute: ({getState}, input) => {\n const {dashboardId, panel} = input as z.infer<\n typeof DashboardAddPanelInput\n >;\n const state = getState();\n state.mosaicDashboard.addPanel(dashboardId, panel);\n const dashboard = state.mosaicDashboard.getDashboard(dashboardId);\n return {\n success: true,\n commandId: MOSAIC_DASHBOARD_COMMAND_IDS.addPanel,\n message: `Added \"${panel.title}\" panel to dashboard \"${dashboardId}\".`,\n data: panelData(dashboardId, panel, dashboard?.selectedTable),\n };\n },\n },\n {\n id: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,\n name: 'Update dashboard panel',\n description: 'Update an existing Mosaic dashboard panel.',\n group: 'Dashboard',\n keywords: ['dashboard', 'panel', 'update', 'chart'],\n inputSchema: DashboardUpdatePanelInput,\n inputDescription: 'Dashboard ID, panel ID, and partial panel patch.',\n metadata: {readOnly: false, idempotent: false, riskLevel: 'medium'},\n execute: ({getState}, input) => {\n const {dashboardId, panelId, patch} = input as z.infer<\n typeof DashboardUpdatePanelInput\n >;\n const state = getState();\n const dashboard = state.mosaicDashboard.getDashboard(dashboardId);\n if (!dashboard) {\n return dashboardMissing(\n MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,\n dashboardId,\n );\n }\n const existingPanel = getPanel(dashboard, panelId);\n if (!existingPanel) {\n return panelMissing(\n MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,\n panelId,\n );\n }\n const panelValidation = validatePanelConfig({\n ...existingPanel,\n ...patch,\n id: panelId,\n });\n if (!panelValidation.success) {\n return {\n success: false,\n commandId: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,\n code: 'invalid-dashboard-panel-patch',\n error: 'Dashboard panel patch does not match the panel type.',\n data: {\n dashboardId,\n panelId,\n issues: panelValidation.error.issues,\n },\n };\n }\n state.mosaicDashboard.updatePanel(\n dashboardId,\n panelId,\n stripPanelId(panelValidation.data),\n );\n const updatedDashboard =\n state.mosaicDashboard.getDashboard(dashboardId);\n const updatedPanel = updatedDashboard\n ? getPanel(updatedDashboard, panelId)\n : undefined;\n return {\n success: true,\n commandId: MOSAIC_DASHBOARD_COMMAND_IDS.updatePanel,\n message: `Updated dashboard panel \"${panelId}\".`,\n data: updatedPanel\n ? {\n ...panelData(\n dashboardId,\n updatedPanel,\n updatedDashboard?.selectedTable,\n ),\n previousTitle: existingPanel.title,\n }\n : {dashboardId, panelId},\n };\n },\n },\n {\n id: MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,\n name: 'Remove dashboard panel',\n description: 'Remove a panel from a Mosaic dashboard.',\n group: 'Dashboard',\n keywords: ['dashboard', 'panel', 'remove', 'delete'],\n inputSchema: DashboardRemovePanelInput,\n inputDescription: 'Dashboard ID and panel ID.',\n metadata: {readOnly: false, idempotent: false, riskLevel: 'medium'},\n execute: ({getState}, input) => {\n const {dashboardId, panelId} = input as z.infer<\n typeof DashboardRemovePanelInput\n >;\n const state = getState();\n const dashboard = state.mosaicDashboard.getDashboard(dashboardId);\n if (!dashboard) {\n return dashboardMissing(\n MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,\n dashboardId,\n );\n }\n const panel = getPanel(dashboard, panelId);\n if (!panel) {\n return panelMissing(\n MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,\n panelId,\n );\n }\n state.mosaicDashboard.removePanel(dashboardId, panelId);\n return {\n success: true,\n commandId: MOSAIC_DASHBOARD_COMMAND_IDS.removePanel,\n message: `Removed dashboard panel \"${panelId}\".`,\n data: {\n ...panelData(dashboardId, panel, dashboard.selectedTable),\n removedPanel: panel,\n },\n };\n },\n },\n ];\n}\n\nfunction stripPanelId(\n panel: MosaicDashboardPanelConfig,\n): Partial<Omit<MosaicDashboardPanelConfig, 'id'>> {\n const {id: _id, ...patch} = panel;\n return patch;\n}\n\nfunction validatePanelConfig(\n panel: unknown,\n):\n | {success: true; data: MosaicDashboardPanelConfig}\n | {success: false; error: z.ZodError} {\n const panelType =\n typeof panel === 'object' && panel !== null && 'type' in panel\n ? (panel as {type?: unknown}).type\n : undefined;\n if (panelType === MOSAIC_DASHBOARD_CHART_PANEL_TYPE) {\n return ChartPanelConfig.safeParse(panel);\n }\n if (panelType === MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE) {\n return DataTableExplorerPanel.safeParse(panel);\n }\n return MosaicDashboardPanelConfigSchema.safeParse(panel);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-types.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,UAAU,IAAI,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAQtB,eAAO,MAAM,iCAAiC,WAAW,CAAC;AAC1D,eAAO,MAAM,+CAA+C,wBACrC,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAMjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAG5E,eAAO,MAAM,iBAAiB;;;;;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGlE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAEf,CAAC;AACzB,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,0BAA0B,CAClC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"dashboard-types.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,UAAU,IAAI,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAQtB,eAAO,MAAM,iCAAiC,WAAW,CAAC;AAC1D,eAAO,MAAM,+CAA+C,wBACrC,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAMjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAG5E,eAAO,MAAM,iBAAiB;;;;;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGlE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAEf,CAAC;AAEzB,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,0BAA0B,CAClC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-types.js","sourceRoot":"","sources":["../../src/dashboard/dashboard-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,UAAU,IAAI,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,iCAAiC,GAAG,QAAQ,CAAC;AAC1D,MAAM,CAAC,MAAM,+CAA+C,GAC1D,qBAAqB,CAAC;AAExB,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,WAAW;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,+CAA+C,CAAC;IAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,4BAA4B;CACrC,CAAC,CAAC;AAGH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtD,CAAC,CAAC;AAGH,yCAAyC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,kBAAkB,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;KACtE,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAKzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACtC,UAAU,EAAE,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CACjC,CAAC,CAAC","sourcesContent":["/**\n * Core dashboard types - separated to avoid circular dependencies.\n */\n\nimport {LayoutNode as LayoutNodeSchema} from '@sqlrooms/layout-config';\nimport {z} from 'zod';\nimport {ChartConfig} from '../charts/chart-types/chart-config';\nimport {\n DataTableExplorerPanelConfig,\n MosaicDashboardLayoutType,\n MosaicDashboardPanelSource,\n} from './core-types';\n\nexport const MOSAIC_DASHBOARD_CHART_PANEL_TYPE = 'vgplot';\nexport const MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE =\n 'data-table-explorer';\n\n// Panel configs discriminated by type\nexport const ChartPanelConfig = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_CHART_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: ChartConfig,\n});\nexport type ChartPanelConfig = z.infer<typeof ChartPanelConfig>;\n\nexport const DataTableExplorerPanel = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: DataTableExplorerPanelConfig,\n});\nexport type DataTableExplorerPanel = z.infer<typeof DataTableExplorerPanel>;\n\n// Legacy panel for backward compatibility\nexport const LegacyPanelConfig = z.object({\n id: z.string(),\n type: z.string(),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: z.record(z.string(), z.unknown()).default({}),\n});\nexport type LegacyPanelConfig = z.infer<typeof LegacyPanelConfig>;\n\n// Discriminated union of all panel types\nexport const MosaicDashboardPanelConfig = z\n .discriminatedUnion('type', [ChartPanelConfig, DataTableExplorerPanel])\n .or(LegacyPanelConfig);\nexport type MosaicDashboardPanelConfig = z.infer<\n typeof MosaicDashboardPanelConfig\n>;\n\nexport const MosaicDashboardEntry = z.object({\n id: z.string(),\n title: z.string().default('Dashboard'),\n layoutType: MosaicDashboardLayoutType.default('dock'),\n selectedTable: z.string().optional(),\n panels: z.array(MosaicDashboardPanelConfig).default([]),\n layout: LayoutNodeSchema.nullable().default(null),\n updatedAt: z.number().default(0),\n});\nexport type MosaicDashboardEntry = z.infer<typeof MosaicDashboardEntry>;\n"]}
1
+ {"version":3,"file":"dashboard-types.js","sourceRoot":"","sources":["../../src/dashboard/dashboard-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,UAAU,IAAI,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,iCAAiC,GAAG,QAAQ,CAAC;AAC1D,MAAM,CAAC,MAAM,+CAA+C,GAC1D,qBAAqB,CAAC;AAExB,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,WAAW;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,+CAA+C,CAAC;IAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,4BAA4B;CACrC,CAAC,CAAC;AAGH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtD,CAAC,CAAC;AAGH,yCAAyC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,kBAAkB,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;KACtE,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAMzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACtC,UAAU,EAAE,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CACjC,CAAC,CAAC","sourcesContent":["/**\n * Core dashboard types - separated to avoid circular dependencies.\n */\n\nimport {LayoutNode as LayoutNodeSchema} from '@sqlrooms/layout-config';\nimport {z} from 'zod';\nimport {ChartConfig} from '../charts/chart-types/chart-config';\nimport {\n DataTableExplorerPanelConfig,\n MosaicDashboardLayoutType,\n MosaicDashboardPanelSource,\n} from './core-types';\n\nexport const MOSAIC_DASHBOARD_CHART_PANEL_TYPE = 'vgplot';\nexport const MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE =\n 'data-table-explorer';\n\n// Panel configs discriminated by type\nexport const ChartPanelConfig = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_CHART_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: ChartConfig,\n});\nexport type ChartPanelConfig = z.infer<typeof ChartPanelConfig>;\n\nexport const DataTableExplorerPanel = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_DATA_TABLE_EXPLORER_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: DataTableExplorerPanelConfig,\n});\nexport type DataTableExplorerPanel = z.infer<typeof DataTableExplorerPanel>;\n\n// Legacy panel for backward compatibility\nexport const LegacyPanelConfig = z.object({\n id: z.string(),\n type: z.string(),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: z.record(z.string(), z.unknown()).default({}),\n});\nexport type LegacyPanelConfig = z.infer<typeof LegacyPanelConfig>;\n\n// Discriminated union of all panel types\nexport const MosaicDashboardPanelConfig = z\n .discriminatedUnion('type', [ChartPanelConfig, DataTableExplorerPanel])\n .or(LegacyPanelConfig);\n\nexport type MosaicDashboardPanelConfig = z.infer<\n typeof MosaicDashboardPanelConfig\n>;\n\nexport const MosaicDashboardEntry = z.object({\n id: z.string(),\n title: z.string().default('Dashboard'),\n layoutType: MosaicDashboardLayoutType.default('dock'),\n selectedTable: z.string().optional(),\n panels: z.array(MosaicDashboardPanelConfig).default([]),\n layout: LayoutNodeSchema.nullable().default(null),\n updatedAt: z.number().default(0),\n});\nexport type MosaicDashboardEntry = z.infer<typeof MosaicDashboardEntry>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanel.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAUzD,eAAO,MAAM,oBAAoB,EAAE,kBA2DlC,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardPanel.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAUzD,eAAO,MAAM,oBAAoB,EAAE,kBA8DlC,CAAC"}
@@ -18,6 +18,6 @@ export const MosaicDashboardPanel = ({ meta }) => {
18
18
  return (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm", children: "Dashboard panel not found" }));
19
19
  }
20
20
  const RendererComponent = renderer?.component;
21
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(MosaicDashboardPanelHeader, { dashboardId: dashboardId, dashboard: dashboard, panel: panel, renderer: renderer, selectionName: selectionName }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: _jsx(MosaicDashboardPanelErrorBoundary, { panelType: panel.type, children: RendererComponent ? (_jsx(RendererComponent, { dashboardId: dashboardId, dashboard: dashboard, panel: panel, selectionName: selectionName })) : (_jsxs("div", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-sm", children: ["Unsupported dashboard panel type: ", panel.type] })) }) })] }));
21
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(MosaicDashboardPanelHeader, { dashboardId: dashboardId, dashboard: dashboard, panel: panel, renderer: renderer, selectionName: selectionName }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: _jsx(MosaicDashboardPanelErrorBoundary, { panelType: panel.type, children: RendererComponent ? (_jsx(RendererComponent, { dashboardId: dashboardId, dashboard: dashboard, panel: panel, selectionName: selectionName })) : (_jsxs("div", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-sm", children: ["Unsupported dashboard panel type: ", panel.type] })) }, dashboard?.selectedTable ?? '') })] }));
22
22
  };
23
23
  //# sourceMappingURL=MosaicDashboardPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanel.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,iCAAiC,EAAC,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAC,0BAA0B,EAAC,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAC,yBAAyB,EAAC,MAAM,2BAA2B,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAAuB,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE;IACjE,MAAM,EAAC,WAAW,EAAC,GAAG,yBAAyB,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,EAAE,OAA6B,CAAC;IAEpD,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,cAAc,GAAG,2BAA2B,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAChD,CAAC;IACF,MAAM,aAAa,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CACH,OAAO;QACL,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC;QACjE,CAAC,CAAC,SAAS,EACf,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAC7B,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CACL,cAAK,SAAS,EAAC,uEAAuE,0CAEhF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,CAAC;IAE9C,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,0BAA0B,IACzB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,GAC5B,EAEF,cAAK,SAAS,EAAC,gCAAgC,YAC7C,KAAC,iCAAiC,IAAC,SAAS,EAAE,KAAK,CAAC,IAAI,YACrD,iBAAiB,CAAC,CAAC,CAAC,CACnB,KAAC,iBAAiB,IAChB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,2EAA2E,mDACrD,KAAK,CAAC,IAAI,IACzC,CACP,GACiC,GAChC,IACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {RoomPanelComponent} from '@sqlrooms/layout';\nimport {useMemo} from 'react';\nimport {MosaicDashboardPanelErrorBoundary} from './MosaicDashboardPanelErrorBoundary';\nimport {MosaicDashboardPanelHeader} from './MosaicDashboardPanelHeader';\nimport {\n getMosaicDashboardSelectionName,\n useStoreWithMosaicDashboard,\n} from '../MosaicDashboardSlice';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\n\nexport const MosaicDashboardPanel: RoomPanelComponent = ({meta}) => {\n const {dashboardId} = useMosaicDashboardContext();\n const panelId = meta?.panelId as string | undefined;\n\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const panelRenderers = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.panelRenderers,\n );\n const selectionName = getMosaicDashboardSelectionName(dashboardId);\n\n const panel = useMemo(\n () =>\n panelId\n ? dashboard?.panels.find((candidate) => candidate.id === panelId)\n : undefined,\n [dashboard?.panels, panelId],\n );\n const renderer = panel ? panelRenderers[panel.type] : undefined;\n\n if (!dashboard || !panel) {\n return (\n <div className=\"text-muted-foreground flex h-full items-center justify-center text-sm\">\n Dashboard panel not found\n </div>\n );\n }\n\n const RendererComponent = renderer?.component;\n\n return (\n <div className=\"flex h-full flex-col\">\n <MosaicDashboardPanelHeader\n dashboardId={dashboardId}\n dashboard={dashboard}\n panel={panel}\n renderer={renderer}\n selectionName={selectionName}\n />\n\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <MosaicDashboardPanelErrorBoundary panelType={panel.type}>\n {RendererComponent ? (\n <RendererComponent\n dashboardId={dashboardId}\n dashboard={dashboard}\n panel={panel}\n selectionName={selectionName}\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Unsupported dashboard panel type: {panel.type}\n </div>\n )}\n </MosaicDashboardPanelErrorBoundary>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardPanel.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,iCAAiC,EAAC,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAC,0BAA0B,EAAC,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAC,yBAAyB,EAAC,MAAM,2BAA2B,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAAuB,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE;IACjE,MAAM,EAAC,WAAW,EAAC,GAAG,yBAAyB,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,EAAE,OAA6B,CAAC;IAEpD,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,cAAc,GAAG,2BAA2B,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAChD,CAAC;IACF,MAAM,aAAa,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CACH,OAAO;QACL,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC;QACjE,CAAC,CAAC,SAAS,EACf,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAC7B,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CACL,cAAK,SAAS,EAAC,uEAAuE,0CAEhF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,CAAC;IAE9C,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,0BAA0B,IACzB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,GAC5B,EAEF,cAAK,SAAS,EAAC,gCAAgC,YAC7C,KAAC,iCAAiC,IAEhC,SAAS,EAAE,KAAK,CAAC,IAAI,YAEpB,iBAAiB,CAAC,CAAC,CAAC,CACnB,KAAC,iBAAiB,IAChB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,2EAA2E,mDACrD,KAAK,CAAC,IAAI,IACzC,CACP,IAdI,SAAS,EAAE,aAAa,IAAI,EAAE,CAeD,GAChC,IACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {RoomPanelComponent} from '@sqlrooms/layout';\nimport {useMemo} from 'react';\nimport {MosaicDashboardPanelErrorBoundary} from './MosaicDashboardPanelErrorBoundary';\nimport {MosaicDashboardPanelHeader} from './MosaicDashboardPanelHeader';\nimport {\n getMosaicDashboardSelectionName,\n useStoreWithMosaicDashboard,\n} from '../MosaicDashboardSlice';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\n\nexport const MosaicDashboardPanel: RoomPanelComponent = ({meta}) => {\n const {dashboardId} = useMosaicDashboardContext();\n const panelId = meta?.panelId as string | undefined;\n\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const panelRenderers = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.panelRenderers,\n );\n const selectionName = getMosaicDashboardSelectionName(dashboardId);\n\n const panel = useMemo(\n () =>\n panelId\n ? dashboard?.panels.find((candidate) => candidate.id === panelId)\n : undefined,\n [dashboard?.panels, panelId],\n );\n const renderer = panel ? panelRenderers[panel.type] : undefined;\n\n if (!dashboard || !panel) {\n return (\n <div className=\"text-muted-foreground flex h-full items-center justify-center text-sm\">\n Dashboard panel not found\n </div>\n );\n }\n\n const RendererComponent = renderer?.component;\n\n return (\n <div className=\"flex h-full flex-col\">\n <MosaicDashboardPanelHeader\n dashboardId={dashboardId}\n dashboard={dashboard}\n panel={panel}\n renderer={renderer}\n selectionName={selectionName}\n />\n\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <MosaicDashboardPanelErrorBoundary\n key={dashboard?.selectedTable ?? ''}\n panelType={panel.type}\n >\n {RendererComponent ? (\n <RendererComponent\n dashboardId={dashboardId}\n dashboard={dashboard}\n panel={panel}\n selectionName={selectionName}\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Unsupported dashboard panel type: {panel.type}\n </div>\n )}\n </MosaicDashboardPanelErrorBoundary>\n </div>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanelLayout.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanelLayout.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAC,EAAE,EAA8B,MAAM,OAAO,CAAC;AAE7D,KAAK,+BAA+B,GAAG;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,EAAE,CACzC,+BAA+B,CA0EhC,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardPanelLayout.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanelLayout.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAC,EAAE,EAA8B,MAAM,OAAO,CAAC;AAE7D,KAAK,+BAA+B,GAAG;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,EAAE,CACzC,+BAA+B,CA0EhC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from '@sqlrooms/ui';
2
+ import { ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, } from '@sqlrooms/ui';
3
3
  import { useEffect, useRef, useState } from 'react';
4
4
  const MIN_WIDTH_FOR_SPLIT_VIEW = 200; // pixels
5
5
  export const MosaicDashboardPanelLayout = ({ isOpen, onIsOpenChange, settings, content }) => {
@@ -39,8 +39,8 @@ export const MosaicDashboardPanelLayout = ({ isOpen, onIsOpenChange, settings, c
39
39
  };
40
40
  // If container is too small and settings are open, show only settings
41
41
  if (containerWidth < MIN_WIDTH_FOR_SPLIT_VIEW && isOpen) {
42
- return (_jsx("div", { ref: containerRef, className: "h-full overflow-auto", children: settings }));
42
+ return (_jsx("div", { ref: containerRef, className: "h-full overflow-hidden", children: _jsx(ScrollArea, { className: "h-full", children: settings }) }));
43
43
  }
44
- return (_jsx("div", { ref: containerRef, className: "h-full", children: _jsxs(ResizablePanelGroup, { orientation: "horizontal", className: "h-full", children: [_jsx(ResizablePanel, { ref: panelRef, defaultSize: "35%", minSize: "30%", maxSize: "70%", collapsible: true, collapsedSize: 0, className: "overflow-auto", onResize: onResize, children: settings }), _jsx(ResizableHandle, { className: "w-px" }), _jsx(ResizablePanel, { children: content })] }) }));
44
+ return (_jsx("div", { ref: containerRef, className: "h-full", children: _jsxs(ResizablePanelGroup, { orientation: "horizontal", className: "h-full", children: [_jsx(ResizablePanel, { ref: panelRef, defaultSize: "35%", minSize: "30%", maxSize: "70%", collapsible: true, collapsedSize: 0, className: "overflow-hidden", onResize: onResize, children: _jsx(ScrollArea, { className: "h-full", children: settings }) }), _jsx(ResizableHandle, { className: "w-px" }), _jsx(ResizablePanel, { children: content })] }) }));
45
45
  };
46
46
  //# sourceMappingURL=MosaicDashboardPanelLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanelLayout.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanelLayout.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAc,EAAK,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAS7D,MAAM,wBAAwB,GAAG,GAAG,CAAC,CAAC,SAAS;AAE/C,MAAM,CAAC,MAAM,0BAA0B,GAEnC,CAAC,EAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAC,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,MAAM,CAAC,UAAU,CAClB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YACpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAEpD,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,sEAAsE;IACtE,IAAI,cAAc,GAAG,wBAAwB,IAAI,MAAM,EAAE,CAAC;QACxD,OAAO,CACL,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,sBAAsB,YACrD,QAAQ,GACL,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,QAAQ,YACxC,MAAC,mBAAmB,IAAC,WAAW,EAAC,YAAY,EAAC,SAAS,EAAC,QAAQ,aAC9D,KAAC,cAAc,IACb,GAAG,EAAE,QAAQ,EACb,WAAW,EAAC,KAAK,EACjB,OAAO,EAAC,KAAK,EACb,OAAO,EAAC,KAAK,EACb,WAAW,EAAE,IAAI,EACjB,aAAa,EAAE,CAAC,EAChB,SAAS,EAAC,eAAe,EACzB,QAAQ,EAAE,QAAQ,YAEjB,QAAQ,GACM,EACjB,KAAC,eAAe,IAAC,SAAS,EAAC,MAAM,GAAG,EACpC,KAAC,cAAc,cAAE,OAAO,GAAkB,IACtB,GAClB,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n type ResizablePanelHandle,\n} from '@sqlrooms/ui';\nimport React, {FC, useEffect, useRef, useState} from 'react';\n\ntype MosaicDashboardPanelLayoutProps = {\n isOpen?: boolean;\n onIsOpenChange?: (isOpen: boolean) => void;\n settings?: React.ReactNode;\n content?: React.ReactNode;\n};\n\nconst MIN_WIDTH_FOR_SPLIT_VIEW = 200; // pixels\n\nexport const MosaicDashboardPanelLayout: FC<\n MosaicDashboardPanelLayoutProps\n> = ({isOpen, onIsOpenChange, settings, content}) => {\n const panelRef = useRef<ResizablePanelHandle>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState<number>(\n window.innerWidth,\n );\n\n useEffect(() => {\n if (isOpen) {\n panelRef.current?.expand();\n } else {\n panelRef.current?.collapse();\n }\n }, [isOpen]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const onResize = () => {\n const isCollapsed = panelRef.current?.isCollapsed();\n\n if (isCollapsed && isOpen) {\n onIsOpenChange?.(false);\n }\n\n if (!isCollapsed && !isOpen) {\n onIsOpenChange?.(true);\n }\n };\n\n // If container is too small and settings are open, show only settings\n if (containerWidth < MIN_WIDTH_FOR_SPLIT_VIEW && isOpen) {\n return (\n <div ref={containerRef} className=\"h-full overflow-auto\">\n {settings}\n </div>\n );\n }\n\n return (\n <div ref={containerRef} className=\"h-full\">\n <ResizablePanelGroup orientation=\"horizontal\" className=\"h-full\">\n <ResizablePanel\n ref={panelRef}\n defaultSize=\"35%\"\n minSize=\"30%\"\n maxSize=\"70%\"\n collapsible={true}\n collapsedSize={0}\n className=\"overflow-auto\"\n onResize={onResize}\n >\n {settings}\n </ResizablePanel>\n <ResizableHandle className=\"w-px\" />\n <ResizablePanel>{content}</ResizablePanel>\n </ResizablePanelGroup>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardPanelLayout.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanelLayout.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,UAAU,GAEX,MAAM,cAAc,CAAC;AACtB,OAAc,EAAK,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAS7D,MAAM,wBAAwB,GAAG,GAAG,CAAC,CAAC,SAAS;AAE/C,MAAM,CAAC,MAAM,0BAA0B,GAEnC,CAAC,EAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAC,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,MAAM,CAAC,UAAU,CAClB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YACpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAEpD,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,sEAAsE;IACtE,IAAI,cAAc,GAAG,wBAAwB,IAAI,MAAM,EAAE,CAAC;QACxD,OAAO,CACL,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,wBAAwB,YACxD,KAAC,UAAU,IAAC,SAAS,EAAC,QAAQ,YAAE,QAAQ,GAAc,GAClD,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,QAAQ,YACxC,MAAC,mBAAmB,IAAC,WAAW,EAAC,YAAY,EAAC,SAAS,EAAC,QAAQ,aAC9D,KAAC,cAAc,IACb,GAAG,EAAE,QAAQ,EACb,WAAW,EAAC,KAAK,EACjB,OAAO,EAAC,KAAK,EACb,OAAO,EAAC,KAAK,EACb,WAAW,EAAE,IAAI,EACjB,aAAa,EAAE,CAAC,EAChB,SAAS,EAAC,iBAAiB,EAC3B,QAAQ,EAAE,QAAQ,YAElB,KAAC,UAAU,IAAC,SAAS,EAAC,QAAQ,YAAE,QAAQ,GAAc,GACvC,EACjB,KAAC,eAAe,IAAC,SAAS,EAAC,MAAM,GAAG,EACpC,KAAC,cAAc,cAAE,OAAO,GAAkB,IACtB,GAClB,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n ScrollArea,\n type ResizablePanelHandle,\n} from '@sqlrooms/ui';\nimport React, {FC, useEffect, useRef, useState} from 'react';\n\ntype MosaicDashboardPanelLayoutProps = {\n isOpen?: boolean;\n onIsOpenChange?: (isOpen: boolean) => void;\n settings?: React.ReactNode;\n content?: React.ReactNode;\n};\n\nconst MIN_WIDTH_FOR_SPLIT_VIEW = 200; // pixels\n\nexport const MosaicDashboardPanelLayout: FC<\n MosaicDashboardPanelLayoutProps\n> = ({isOpen, onIsOpenChange, settings, content}) => {\n const panelRef = useRef<ResizablePanelHandle>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState<number>(\n window.innerWidth,\n );\n\n useEffect(() => {\n if (isOpen) {\n panelRef.current?.expand();\n } else {\n panelRef.current?.collapse();\n }\n }, [isOpen]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const onResize = () => {\n const isCollapsed = panelRef.current?.isCollapsed();\n\n if (isCollapsed && isOpen) {\n onIsOpenChange?.(false);\n }\n\n if (!isCollapsed && !isOpen) {\n onIsOpenChange?.(true);\n }\n };\n\n // If container is too small and settings are open, show only settings\n if (containerWidth < MIN_WIDTH_FOR_SPLIT_VIEW && isOpen) {\n return (\n <div ref={containerRef} className=\"h-full overflow-hidden\">\n <ScrollArea className=\"h-full\">{settings}</ScrollArea>\n </div>\n );\n }\n\n return (\n <div ref={containerRef} className=\"h-full\">\n <ResizablePanelGroup orientation=\"horizontal\" className=\"h-full\">\n <ResizablePanel\n ref={panelRef}\n defaultSize=\"35%\"\n minSize=\"30%\"\n maxSize=\"70%\"\n collapsible={true}\n collapsedSize={0}\n className=\"overflow-hidden\"\n onResize={onResize}\n >\n <ScrollArea className=\"h-full\">{settings}</ScrollArea>\n </ResizablePanel>\n <ResizableHandle className=\"w-px\" />\n <ResizablePanel>{content}</ResizablePanel>\n </ResizablePanelGroup>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanels.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanels.tsx"],"names":[],"mappings":"AAsBA,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAqGzC,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardPanels.d.ts","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanels.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAyGzC,CAAC"}
@@ -7,6 +7,7 @@ import { MosaicDashboardPanel } from './MosaicDashboardPanel';
7
7
  import { getMosaicDashboardDockId, MOSAIC_DASHBOARD_PANEL, useStoreWithMosaicDashboard, } from '../MosaicDashboardSlice';
8
8
  import { DataTableSelectorEmptyState } from '../../components/DataTableSelector';
9
9
  import { useTablesWithColumns } from '../../hooks/useTablesWithColumns';
10
+ import { getMosaicTableIdentity, resolveMosaicTableReference, } from '../../mosaicTableReference';
10
11
  const EMPTY_DASHBOARD_PANELS = [];
11
12
  export const MosaicDashboardPanels = () => {
12
13
  const { dashboardId } = useMosaicDashboardContext();
@@ -20,8 +21,9 @@ export const MosaicDashboardPanels = () => {
20
21
  const tables = useTablesWithColumns();
21
22
  const selectedTable = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.config.dashboardsById[dashboardId]?.selectedTable);
22
23
  const setSelectedTable = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.setSelectedTable);
24
+ const selectedDataTable = useMemo(() => resolveMosaicTableReference(tables, selectedTable).table, [selectedTable, tables]);
23
25
  const handleTableChange = useCallback((table) => {
24
- setSelectedTable(dashboardId, table.table.toString());
26
+ setSelectedTable(dashboardId, getMosaicTableIdentity(table.table));
25
27
  }, [dashboardId, setSelectedTable]);
26
28
  useEffect(() => {
27
29
  // This renderer is shared by every Mosaic dashboard panel in the room.
@@ -52,7 +54,7 @@ export const MosaicDashboardPanels = () => {
52
54
  : nextLayout;
53
55
  setLayout(dashboardId, innerLayout);
54
56
  }, [dashboardId, setLayout]);
55
- if (!selectedTable) {
57
+ if (!selectedDataTable) {
56
58
  return (_jsx(DataTableSelectorEmptyState, { onChange: handleTableChange, tables: tables }));
57
59
  }
58
60
  if (!panels.length || !rootLayout) {
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardPanels.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanels.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n isLayoutDockNode,\n isLayoutGridNode,\n LayoutNode,\n LayoutRenderer,\n} from '@sqlrooms/layout';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\nimport {MosaicDashboardPanelDragOverlay} from './MosaicDashboardPanelDragOverlay';\nimport {MosaicDashboardPanel} from './MosaicDashboardPanel';\nimport type {MosaicDashboardPanelConfig} from '../dashboard-types';\nimport {\n getMosaicDashboardDockId,\n MOSAIC_DASHBOARD_PANEL,\n useStoreWithMosaicDashboard,\n} from '../MosaicDashboardSlice';\nimport {DataTableSelectorEmptyState} from '../../components/DataTableSelector';\nimport {useTablesWithColumns} from '../../hooks/useTablesWithColumns';\nimport type {DataTable} from '@sqlrooms/db';\n\nconst EMPTY_DASHBOARD_PANELS: MosaicDashboardPanelConfig[] = [];\n\nexport const MosaicDashboardPanels: React.FC = () => {\n const {dashboardId} = useMosaicDashboardContext();\n const registerPanel = useStoreWithMosaicDashboard(\n (state) => state.layout.registerPanel,\n );\n const setLayout = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setLayout,\n );\n const panels = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.panels ??\n EMPTY_DASHBOARD_PANELS,\n );\n const dashboardLayout = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.layout ?? null,\n );\n const dashboardLayoutType = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.layoutType ??\n 'dock',\n );\n\n const tables = useTablesWithColumns();\n const selectedTable = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.selectedTable,\n );\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(dashboardId, table.table.toString());\n },\n [dashboardId, setSelectedTable],\n );\n\n useEffect(() => {\n // This renderer is shared by every Mosaic dashboard panel in the room.\n // Dashboard blocks can be transiently unmounted by the surrounding editor,\n // so unregistering on instance cleanup can leave still-mounted dashboards\n // with layout panel shells but no chart renderer.\n registerPanel(MOSAIC_DASHBOARD_PANEL, () => ({\n title: 'Dashboard panel',\n component: MosaicDashboardPanel,\n dragOverlay: MosaicDashboardPanelDragOverlay,\n }));\n }, [registerPanel]);\n\n const rootLayout: LayoutNode | null = useMemo(() => {\n if (!dashboardLayout) return null;\n if (dashboardLayoutType === 'grid') {\n return isLayoutGridNode(dashboardLayout) ? dashboardLayout : null;\n }\n return {\n type: 'dock',\n id: getMosaicDashboardDockId(dashboardId),\n root: dashboardLayout,\n };\n }, [dashboardId, dashboardLayout, dashboardLayoutType]);\n\n const handleLayoutChange = useCallback(\n (nextLayout: LayoutNode | null) => {\n const innerLayout =\n nextLayout && isLayoutDockNode(nextLayout)\n ? nextLayout.root\n : nextLayout;\n setLayout(dashboardId, innerLayout);\n },\n [dashboardId, setLayout],\n );\n\n if (!selectedTable) {\n return (\n <DataTableSelectorEmptyState\n onChange={handleTableChange}\n tables={tables}\n />\n );\n }\n\n if (!panels.length || !rootLayout) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"text-muted-foreground text-sm\">\n Dashboard is empty. Add a panel to get started.\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-[360px]\">\n <LayoutRenderer\n rootLayout={rootLayout}\n onLayoutChange={handleLayoutChange}\n />\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardPanels.js","sourceRoot":"","sources":["../../../src/dashboard/panel/MosaicDashboardPanels.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n isLayoutDockNode,\n isLayoutGridNode,\n LayoutNode,\n LayoutRenderer,\n} from '@sqlrooms/layout';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\nimport {MosaicDashboardPanelDragOverlay} from './MosaicDashboardPanelDragOverlay';\nimport {MosaicDashboardPanel} from './MosaicDashboardPanel';\nimport type {MosaicDashboardPanelConfig} from '../dashboard-types';\nimport {\n getMosaicDashboardDockId,\n MOSAIC_DASHBOARD_PANEL,\n useStoreWithMosaicDashboard,\n} from '../MosaicDashboardSlice';\nimport {DataTableSelectorEmptyState} from '../../components/DataTableSelector';\nimport {useTablesWithColumns} from '../../hooks/useTablesWithColumns';\nimport type {DataTable} from '@sqlrooms/db';\nimport {\n getMosaicTableIdentity,\n resolveMosaicTableReference,\n} from '../../mosaicTableReference';\n\nconst EMPTY_DASHBOARD_PANELS: MosaicDashboardPanelConfig[] = [];\n\nexport const MosaicDashboardPanels: React.FC = () => {\n const {dashboardId} = useMosaicDashboardContext();\n const registerPanel = useStoreWithMosaicDashboard(\n (state) => state.layout.registerPanel,\n );\n const setLayout = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setLayout,\n );\n const panels = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.panels ??\n EMPTY_DASHBOARD_PANELS,\n );\n const dashboardLayout = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.layout ?? null,\n );\n const dashboardLayoutType = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.layoutType ??\n 'dock',\n );\n\n const tables = useTablesWithColumns();\n const selectedTable = useStoreWithMosaicDashboard(\n (state) =>\n state.mosaicDashboard.config.dashboardsById[dashboardId]?.selectedTable,\n );\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n const selectedDataTable = useMemo(\n () => resolveMosaicTableReference(tables, selectedTable).table,\n [selectedTable, tables],\n );\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(dashboardId, getMosaicTableIdentity(table.table));\n },\n [dashboardId, setSelectedTable],\n );\n\n useEffect(() => {\n // This renderer is shared by every Mosaic dashboard panel in the room.\n // Dashboard blocks can be transiently unmounted by the surrounding editor,\n // so unregistering on instance cleanup can leave still-mounted dashboards\n // with layout panel shells but no chart renderer.\n registerPanel(MOSAIC_DASHBOARD_PANEL, () => ({\n title: 'Dashboard panel',\n component: MosaicDashboardPanel,\n dragOverlay: MosaicDashboardPanelDragOverlay,\n }));\n }, [registerPanel]);\n\n const rootLayout: LayoutNode | null = useMemo(() => {\n if (!dashboardLayout) return null;\n if (dashboardLayoutType === 'grid') {\n return isLayoutGridNode(dashboardLayout) ? dashboardLayout : null;\n }\n return {\n type: 'dock',\n id: getMosaicDashboardDockId(dashboardId),\n root: dashboardLayout,\n };\n }, [dashboardId, dashboardLayout, dashboardLayoutType]);\n\n const handleLayoutChange = useCallback(\n (nextLayout: LayoutNode | null) => {\n const innerLayout =\n nextLayout && isLayoutDockNode(nextLayout)\n ? nextLayout.root\n : nextLayout;\n setLayout(dashboardId, innerLayout);\n },\n [dashboardId, setLayout],\n );\n\n if (!selectedDataTable) {\n return (\n <DataTableSelectorEmptyState\n onChange={handleTableChange}\n tables={tables}\n />\n );\n }\n\n if (!panels.length || !rootLayout) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"text-muted-foreground text-sm\">\n Dashboard is empty. Add a panel to get started.\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-[360px]\">\n <LayoutRenderer\n rootLayout={rootLayout}\n onLayoutChange={handleLayoutChange}\n />\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardDataTableSelector.d.ts","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardDataTableSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAc,MAAM,OAAO,CAAC;AAOtC,UAAU,qCAAqC;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAC/C,qCAAqC,CA4BtC,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardDataTableSelector.d.ts","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardDataTableSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAuB,MAAM,OAAO,CAAC;AAU/C,UAAU,qCAAqC;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAC/C,qCAAqC,CA+BtC,CAAC"}
@@ -1,17 +1,17 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback } from 'react';
2
+ import { useCallback, useMemo } from 'react';
3
3
  import { useStoreWithMosaicDashboard } from '../MosaicDashboardSlice';
4
4
  import { DataTableSelector } from '../../components/DataTableSelector';
5
5
  import { useTablesWithColumns } from '../../hooks/useTablesWithColumns';
6
- import { useDataTable } from '@sqlrooms/db';
6
+ import { getMosaicTableIdentity, resolveMosaicTableReference, } from '../../mosaicTableReference';
7
7
  export const MosaicDashboardDataTableSelector = ({ dashboardId }) => {
8
8
  const tables = useTablesWithColumns();
9
9
  const dashboard = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.config.dashboardsById[dashboardId]);
10
10
  const selectedTableName = dashboard?.selectedTable;
11
- const selectedTable = useDataTable(selectedTableName);
11
+ const selectedTable = useMemo(() => resolveMosaicTableReference(tables, selectedTableName).table, [selectedTableName, tables]);
12
12
  const setSelectedTable = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.setSelectedTable);
13
13
  const handleTableChange = useCallback((table) => {
14
- setSelectedTable(dashboardId, table.table.toString());
14
+ setSelectedTable(dashboardId, getMosaicTableIdentity(table.table));
15
15
  }, [dashboardId, setSelectedTable]);
16
16
  return (_jsx(DataTableSelector, { onChange: handleTableChange, tables: tables, value: selectedTable }));
17
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardDataTableSelector.js","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardDataTableSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,2BAA2B,EAAC,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAO1C,MAAM,CAAC,MAAM,gCAAgC,GAEzC,CAAC,EAAC,WAAW,EAAC,EAAE,EAAE;IACpB,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,iBAAiB,GAAG,SAAS,EAAE,aAAa,CAAC;IAEnD,MAAM,aAAa,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAEtD,MAAM,gBAAgB,GAAG,2BAA2B,CAClD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAClD,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAgB,EAAE,EAAE;QACnB,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC,EACD,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAChC,CAAC;IAEF,OAAO,CACL,KAAC,iBAAiB,IAChB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GACpB,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {FC, useCallback} from 'react';\nimport {useStoreWithMosaicDashboard} from '../MosaicDashboardSlice';\nimport {DataTableSelector} from '../../components/DataTableSelector';\nimport {useTablesWithColumns} from '../../hooks/useTablesWithColumns';\nimport {useDataTable} from '@sqlrooms/db';\nimport type {DataTable} from '@sqlrooms/db';\n\ninterface MosaicDashboardDataTableSelectorProps {\n dashboardId: string;\n}\n\nexport const MosaicDashboardDataTableSelector: FC<\n MosaicDashboardDataTableSelectorProps\n> = ({dashboardId}) => {\n const tables = useTablesWithColumns();\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const selectedTableName = dashboard?.selectedTable;\n\n const selectedTable = useDataTable(selectedTableName);\n\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(dashboardId, table.table.toString());\n },\n [dashboardId, setSelectedTable],\n );\n\n return (\n <DataTableSelector\n onChange={handleTableChange}\n tables={tables}\n value={selectedTable}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardDataTableSelector.js","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardDataTableSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAC,2BAA2B,EAAC,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAMpC,MAAM,CAAC,MAAM,gCAAgC,GAEzC,CAAC,EAAC,WAAW,EAAC,EAAE,EAAE;IACpB,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,iBAAiB,GAAG,SAAS,EAAE,aAAa,CAAC;IAEnD,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,KAAK,EAClE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAC5B,CAAC;IAEF,MAAM,gBAAgB,GAAG,2BAA2B,CAClD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAClD,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAgB,EAAE,EAAE;QACnB,gBAAgB,CAAC,WAAW,EAAE,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,EACD,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAChC,CAAC;IAEF,OAAO,CACL,KAAC,iBAAiB,IAChB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GACpB,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {FC, useCallback, useMemo} from 'react';\nimport {useStoreWithMosaicDashboard} from '../MosaicDashboardSlice';\nimport {DataTableSelector} from '../../components/DataTableSelector';\nimport {useTablesWithColumns} from '../../hooks/useTablesWithColumns';\nimport type {DataTable} from '@sqlrooms/db';\nimport {\n getMosaicTableIdentity,\n resolveMosaicTableReference,\n} from '../../mosaicTableReference';\n\ninterface MosaicDashboardDataTableSelectorProps {\n dashboardId: string;\n}\n\nexport const MosaicDashboardDataTableSelector: FC<\n MosaicDashboardDataTableSelectorProps\n> = ({dashboardId}) => {\n const tables = useTablesWithColumns();\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const selectedTableName = dashboard?.selectedTable;\n\n const selectedTable = useMemo(\n () => resolveMosaicTableReference(tables, selectedTableName).table,\n [selectedTableName, tables],\n );\n\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(dashboardId, getMosaicTableIdentity(table.table));\n },\n [dashboardId, setSelectedTable],\n );\n\n return (\n <DataTableSelector\n onChange={handleTableChange}\n tables={tables}\n value={selectedTable}\n />\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardToolbar.d.ts","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAc,MAAM,OAAO,CAAC;AAStC,eAAO,MAAM,sBAAsB,EAAE,EA0CpC,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardToolbar.d.ts","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAuB,MAAM,OAAO,CAAC;AAU/C,eAAO,MAAM,sBAAsB,EAAE,EA8CpC,CAAC"}
@@ -1,18 +1,20 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback } from 'react';
2
+ import { useCallback, useMemo } from 'react';
3
3
  import { useMosaicDashboardContext } from '../MosaicDashboardContext';
4
4
  import { useStoreWithMosaicDashboard } from '../MosaicDashboardSlice';
5
5
  import { MosaicDashboardAddPanelDropdown } from './MosaicDashboardAddPanelDropdown';
6
6
  import { MosaicDashboardResetFiltersButton } from './MosaicDashboardResetFiltersButton';
7
7
  import { MosaicDashboardDataTableSelector } from './MosaicDashboardDataTableSelector';
8
- import { useDataTable } from '@sqlrooms/db';
9
8
  import { BlockCaptionEditor } from '../../components/BlockCaptionEditor';
9
+ import { useTablesWithColumns } from '../../hooks/useTablesWithColumns';
10
+ import { resolveMosaicTableReference } from '../../mosaicTableReference';
10
11
  export const MosaicDashboardToolbar = () => {
11
12
  const { dashboardId } = useMosaicDashboardContext();
12
13
  const dashboard = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.config.dashboardsById[dashboardId]);
13
14
  const selectedTableName = dashboard?.selectedTable;
14
15
  const dashboardTitle = dashboard?.title ?? '';
15
- const selectedTable = useDataTable(selectedTableName);
16
+ const tables = useTablesWithColumns();
17
+ const selectedTable = useMemo(() => resolveMosaicTableReference(tables, selectedTableName).table, [selectedTableName, tables]);
16
18
  const tableName = selectedTable?.table.table;
17
19
  const setDashboardTitle = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.setDashboardTitle);
18
20
  const handleTitleChange = useCallback((title) => {
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardToolbar.js","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardToolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,yBAAyB,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,iCAAiC,EAAC,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAC,gCAAgC,EAAC,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AAEvE,MAAM,CAAC,MAAM,sBAAsB,GAAO,GAAG,EAAE;IAC7C,MAAM,EAAC,WAAW,EAAC,GAAG,yBAAyB,EAAE,CAAC;IAElD,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,iBAAiB,GAAG,SAAS,EAAE,aAAa,CAAC;IACnD,MAAM,cAAc,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;IAE9C,MAAM,aAAa,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC;IAE7C,MAAM,iBAAiB,GAAG,2BAA2B,CACnD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,iBAAiB,CACnD,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAyB,EAAE,EAAE;QAC5B,iBAAiB,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACjC,CAAC;IAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4DAA4D,aACzE,KAAC,kBAAkB,IACjB,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,SAAS,IAAI,iBAAiB,EAC3C,QAAQ,EAAE,iBAAiB,GAC3B,EAEF,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,+BAA+B,IAAC,WAAW,EAAE,WAAW,GAAI,EAC7D,KAAC,gCAAgC,IAAC,WAAW,EAAE,WAAW,GAAI,EAC9D,KAAC,iCAAiC,IAAC,WAAW,EAAE,WAAW,GAAI,IAC3D,IACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {FC, useCallback} from 'react';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\nimport {useStoreWithMosaicDashboard} from '../MosaicDashboardSlice';\nimport {MosaicDashboardAddPanelDropdown} from './MosaicDashboardAddPanelDropdown';\nimport {MosaicDashboardResetFiltersButton} from './MosaicDashboardResetFiltersButton';\nimport {MosaicDashboardDataTableSelector} from './MosaicDashboardDataTableSelector';\nimport {useDataTable} from '@sqlrooms/db';\nimport {BlockCaptionEditor} from '../../components/BlockCaptionEditor';\n\nexport const MosaicDashboardToolbar: FC = () => {\n const {dashboardId} = useMosaicDashboardContext();\n\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const selectedTableName = dashboard?.selectedTable;\n const dashboardTitle = dashboard?.title ?? '';\n\n const selectedTable = useDataTable(selectedTableName);\n const tableName = selectedTable?.table.table;\n\n const setDashboardTitle = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setDashboardTitle,\n );\n\n const handleTitleChange = useCallback(\n (title: string | undefined) => {\n setDashboardTitle(dashboardId, title || '');\n },\n [dashboardId, setDashboardTitle],\n );\n\n if (!selectedTableName) {\n return null;\n }\n\n return (\n <div className=\"flex items-center justify-between gap-2 border-b px-5 py-2\">\n <BlockCaptionEditor\n value={dashboardTitle}\n placeholder={tableName || 'Dashboard title'}\n onChange={handleTitleChange}\n />\n\n <div className=\"flex items-center gap-2\">\n <MosaicDashboardAddPanelDropdown dashboardId={dashboardId} />\n <MosaicDashboardDataTableSelector dashboardId={dashboardId} />\n <MosaicDashboardResetFiltersButton dashboardId={dashboardId} />\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardToolbar.js","sourceRoot":"","sources":["../../../src/dashboard/toolbar/MosaicDashboardToolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAC,yBAAyB,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,iCAAiC,EAAC,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAC,gCAAgC,EAAC,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAC,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AAEvE,MAAM,CAAC,MAAM,sBAAsB,GAAO,GAAG,EAAE;IAC7C,MAAM,EAAC,WAAW,EAAC,GAAG,yBAAyB,EAAE,CAAC;IAElD,MAAM,SAAS,GAAG,2BAA2B,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,iBAAiB,GAAG,SAAS,EAAE,aAAa,CAAC;IACnD,MAAM,cAAc,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;IAE9C,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,KAAK,EAClE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAC5B,CAAC;IACF,MAAM,SAAS,GAAG,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC;IAE7C,MAAM,iBAAiB,GAAG,2BAA2B,CACnD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,iBAAiB,CACnD,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAyB,EAAE,EAAE;QAC5B,iBAAiB,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACjC,CAAC;IAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4DAA4D,aACzE,KAAC,kBAAkB,IACjB,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,SAAS,IAAI,iBAAiB,EAC3C,QAAQ,EAAE,iBAAiB,GAC3B,EAEF,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,+BAA+B,IAAC,WAAW,EAAE,WAAW,GAAI,EAC7D,KAAC,gCAAgC,IAAC,WAAW,EAAE,WAAW,GAAI,EAC9D,KAAC,iCAAiC,IAAC,WAAW,EAAE,WAAW,GAAI,IAC3D,IACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {FC, useCallback, useMemo} from 'react';\nimport {useMosaicDashboardContext} from '../MosaicDashboardContext';\nimport {useStoreWithMosaicDashboard} from '../MosaicDashboardSlice';\nimport {MosaicDashboardAddPanelDropdown} from './MosaicDashboardAddPanelDropdown';\nimport {MosaicDashboardResetFiltersButton} from './MosaicDashboardResetFiltersButton';\nimport {MosaicDashboardDataTableSelector} from './MosaicDashboardDataTableSelector';\nimport {BlockCaptionEditor} from '../../components/BlockCaptionEditor';\nimport {useTablesWithColumns} from '../../hooks/useTablesWithColumns';\nimport {resolveMosaicTableReference} from '../../mosaicTableReference';\n\nexport const MosaicDashboardToolbar: FC = () => {\n const {dashboardId} = useMosaicDashboardContext();\n\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const selectedTableName = dashboard?.selectedTable;\n const dashboardTitle = dashboard?.title ?? '';\n\n const tables = useTablesWithColumns();\n const selectedTable = useMemo(\n () => resolveMosaicTableReference(tables, selectedTableName).table,\n [selectedTableName, tables],\n );\n const tableName = selectedTable?.table.table;\n\n const setDashboardTitle = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setDashboardTitle,\n );\n\n const handleTitleChange = useCallback(\n (title: string | undefined) => {\n setDashboardTitle(dashboardId, title || '');\n },\n [dashboardId, setDashboardTitle],\n );\n\n if (!selectedTableName) {\n return null;\n }\n\n return (\n <div className=\"flex items-center justify-between gap-2 border-b px-5 py-2\">\n <BlockCaptionEditor\n value={dashboardTitle}\n placeholder={tableName || 'Dashboard title'}\n onChange={handleTitleChange}\n />\n\n <div className=\"flex items-center gap-2\">\n <MosaicDashboardAddPanelDropdown dashboardId={dashboardId} />\n <MosaicDashboardDataTableSelector dashboardId={dashboardId} />\n <MosaicDashboardResetFiltersButton dashboardId={dashboardId} />\n </div>\n </div>\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { type DataTable } from '@sqlrooms/db';
2
2
  /**
3
- * Returns the last selected table for a dashboard if it exists,
3
+ * Returns the selected table for a dashboard if it exists,
4
4
  * otherwise falls back to the first table with columns.
5
5
  *
6
6
  * @param dashboardId - The dashboard ID
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectedOrFirstTable.d.ts","sourceRoot":"","sources":["../../src/dashboard/useSelectedOrFirstTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,cAAc,CAAC;AAI5C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,GAClB,SAAS,GAAG,SAAS,CAoBvB"}
1
+ {"version":3,"file":"useSelectedOrFirstTable.d.ts","sourceRoot":"","sources":["../../src/dashboard/useSelectedOrFirstTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,GAClB,SAAS,GAAG,SAAS,CAwBvB"}