@sqlrooms/mosaic 0.29.0-rc.3 → 0.29.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.md +90 -1
  2. package/dist/MosaicChartBuilder.d.ts +0 -4
  3. package/dist/MosaicChartBuilder.d.ts.map +1 -1
  4. package/dist/MosaicChartBuilder.js +0 -6
  5. package/dist/MosaicChartBuilder.js.map +1 -1
  6. package/dist/MosaicSlice.d.ts +17 -10
  7. package/dist/MosaicSlice.d.ts.map +1 -1
  8. package/dist/MosaicSlice.js +4 -1
  9. package/dist/MosaicSlice.js.map +1 -1
  10. package/dist/boxplot/BoxPlotClient.d.ts +58 -0
  11. package/dist/boxplot/BoxPlotClient.d.ts.map +1 -0
  12. package/dist/boxplot/BoxPlotClient.js +264 -0
  13. package/dist/boxplot/BoxPlotClient.js.map +1 -0
  14. package/dist/chart/MosaicDashboardChart.d.ts +14 -0
  15. package/dist/chart/MosaicDashboardChart.d.ts.map +1 -0
  16. package/dist/chart/MosaicDashboardChart.js +21 -0
  17. package/dist/chart/MosaicDashboardChart.js.map +1 -0
  18. package/dist/chart/MosaicDashboardChartContent.d.ts +16 -0
  19. package/dist/chart/MosaicDashboardChartContent.d.ts.map +1 -0
  20. package/dist/chart/MosaicDashboardChartContent.js +18 -0
  21. package/dist/chart/MosaicDashboardChartContent.js.map +1 -0
  22. package/dist/chart/MosaicDashboardChartHeaderActions.d.ts +4 -0
  23. package/dist/chart/MosaicDashboardChartHeaderActions.d.ts.map +1 -0
  24. package/dist/chart/MosaicDashboardChartHeaderActions.js +16 -0
  25. package/dist/chart/MosaicDashboardChartHeaderActions.js.map +1 -0
  26. package/dist/chart/MosaicDashboardChartRenderer.d.ts +3 -0
  27. package/dist/chart/MosaicDashboardChartRenderer.d.ts.map +1 -0
  28. package/dist/chart/MosaicDashboardChartRenderer.js +31 -0
  29. package/dist/chart/MosaicDashboardChartRenderer.js.map +1 -0
  30. package/dist/chart/MosaicDashboardComponentChart.d.ts +14 -0
  31. package/dist/chart/MosaicDashboardComponentChart.d.ts.map +1 -0
  32. package/dist/chart/MosaicDashboardComponentChart.js +11 -0
  33. package/dist/chart/MosaicDashboardComponentChart.js.map +1 -0
  34. package/dist/chart/MosaicDashboardVgPlotChart.d.ts +10 -0
  35. package/dist/chart/MosaicDashboardVgPlotChart.d.ts.map +1 -0
  36. package/dist/chart/MosaicDashboardVgPlotChart.js +10 -0
  37. package/dist/chart/MosaicDashboardVgPlotChart.js.map +1 -0
  38. package/dist/chart/MosaicDashboardVgPlotError.d.ts +8 -0
  39. package/dist/chart/MosaicDashboardVgPlotError.d.ts.map +1 -0
  40. package/dist/chart/MosaicDashboardVgPlotError.js +11 -0
  41. package/dist/chart/MosaicDashboardVgPlotError.js.map +1 -0
  42. package/dist/{dashboard → chart}/chart-settings/ChartSettings.d.ts +12 -7
  43. package/dist/chart/chart-settings/ChartSettings.d.ts.map +1 -0
  44. package/dist/chart/chart-settings/ChartSettings.js +71 -0
  45. package/dist/chart/chart-settings/ChartSettings.js.map +1 -0
  46. package/dist/chart/chart-settings/ChartSettingsContent.d.ts +13 -0
  47. package/dist/chart/chart-settings/ChartSettingsContent.d.ts.map +1 -0
  48. package/dist/chart/chart-settings/ChartSettingsContent.js +18 -0
  49. package/dist/chart/chart-settings/ChartSettingsContent.js.map +1 -0
  50. package/dist/chart/chart-settings/ChartSettingsContext.d.ts +27 -0
  51. package/dist/chart/chart-settings/ChartSettingsContext.d.ts.map +1 -0
  52. package/dist/chart/chart-settings/ChartSettingsContext.js +35 -0
  53. package/dist/chart/chart-settings/ChartSettingsContext.js.map +1 -0
  54. package/dist/chart/chart-settings/ChartSettingsPanel.d.ts +14 -0
  55. package/dist/chart/chart-settings/ChartSettingsPanel.d.ts.map +1 -0
  56. package/dist/chart/chart-settings/ChartSettingsPanel.js +17 -0
  57. package/dist/chart/chart-settings/ChartSettingsPanel.js.map +1 -0
  58. package/dist/chart/chart-settings/ChartSpecViewerPanel.d.ts +9 -0
  59. package/dist/chart/chart-settings/ChartSpecViewerPanel.d.ts.map +1 -0
  60. package/dist/chart/chart-settings/ChartSpecViewerPanel.js +11 -0
  61. package/dist/chart/chart-settings/ChartSpecViewerPanel.js.map +1 -0
  62. package/dist/chart/chart-settings/ChartTypeSelector.d.ts +9 -0
  63. package/dist/chart/chart-settings/ChartTypeSelector.d.ts.map +1 -0
  64. package/dist/chart/chart-settings/ChartTypeSelector.js +16 -0
  65. package/dist/chart/chart-settings/ChartTypeSelector.js.map +1 -0
  66. package/dist/chart/chart-settings/useTableColumns.d.ts.map +1 -0
  67. package/dist/{dashboard → chart}/chart-settings/useTableColumns.js +1 -1
  68. package/dist/chart/chart-settings/useTableColumns.js.map +1 -0
  69. package/dist/chart/useBrushSelectionParams.d.ts +3 -0
  70. package/dist/chart/useBrushSelectionParams.d.ts.map +1 -0
  71. package/dist/chart/useBrushSelectionParams.js +16 -0
  72. package/dist/chart/useBrushSelectionParams.js.map +1 -0
  73. package/dist/chart/useChartRetainer.d.ts +3 -0
  74. package/dist/chart/useChartRetainer.d.ts.map +1 -0
  75. package/dist/chart/useChartRetainer.js +11 -0
  76. package/dist/chart/useChartRetainer.js.map +1 -0
  77. package/dist/chart/useGenerateSpec.d.ts +13 -0
  78. package/dist/chart/useGenerateSpec.d.ts.map +1 -0
  79. package/dist/chart/useGenerateSpec.js +32 -0
  80. package/dist/chart/useGenerateSpec.js.map +1 -0
  81. package/dist/chart-builders/AggregationSelector.d.ts +11 -0
  82. package/dist/chart-builders/AggregationSelector.d.ts.map +1 -0
  83. package/dist/chart-builders/AggregationSelector.js +9 -0
  84. package/dist/chart-builders/AggregationSelector.js.map +1 -0
  85. package/dist/chart-builders/ChartBuilderActions.d.ts +2 -2
  86. package/dist/chart-builders/ChartBuilderActions.d.ts.map +1 -1
  87. package/dist/chart-builders/ChartBuilderActions.js +24 -16
  88. package/dist/chart-builders/ChartBuilderActions.js.map +1 -1
  89. package/dist/chart-builders/ChartBuilderContent.d.ts +4 -6
  90. package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -1
  91. package/dist/chart-builders/ChartBuilderContent.js.map +1 -1
  92. package/dist/chart-builders/ChartBuilderContext.d.ts +5 -6
  93. package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -1
  94. package/dist/chart-builders/ChartBuilderContext.js.map +1 -1
  95. package/dist/chart-builders/ChartBuilderDialog.d.ts +7 -10
  96. package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -1
  97. package/dist/chart-builders/ChartBuilderDialog.js +1 -1
  98. package/dist/chart-builders/ChartBuilderDialog.js.map +1 -1
  99. package/dist/chart-builders/ChartBuilderFields.d.ts +2 -2
  100. package/dist/chart-builders/ChartBuilderFields.d.ts.map +1 -1
  101. package/dist/chart-builders/ChartBuilderFields.js +28 -14
  102. package/dist/chart-builders/ChartBuilderFields.js.map +1 -1
  103. package/dist/chart-builders/ChartBuilderRoot.d.ts +4 -6
  104. package/dist/chart-builders/ChartBuilderRoot.d.ts.map +1 -1
  105. package/dist/chart-builders/ChartBuilderRoot.js +9 -28
  106. package/dist/chart-builders/ChartBuilderRoot.js.map +1 -1
  107. package/dist/chart-builders/ColumnSelector.d.ts +15 -0
  108. package/dist/chart-builders/ColumnSelector.d.ts.map +1 -0
  109. package/dist/chart-builders/ColumnSelector.js +31 -0
  110. package/dist/chart-builders/ColumnSelector.js.map +1 -0
  111. package/dist/chart-builders/Field.d.ts +11 -0
  112. package/dist/chart-builders/Field.d.ts.map +1 -0
  113. package/dist/chart-builders/Field.js +9 -0
  114. package/dist/chart-builders/Field.js.map +1 -0
  115. package/dist/chart-builders/FieldSelectorInput.d.ts +2 -1
  116. package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -1
  117. package/dist/chart-builders/FieldSelectorInput.js +5 -5
  118. package/dist/chart-builders/FieldSelectorInput.js.map +1 -1
  119. package/dist/chart-builders/MultiFieldSelector.d.ts +14 -0
  120. package/dist/chart-builders/MultiFieldSelector.d.ts.map +1 -0
  121. package/dist/chart-builders/MultiFieldSelector.js +53 -0
  122. package/dist/chart-builders/MultiFieldSelector.js.map +1 -0
  123. package/dist/chart-builders/TemporalGranularitySelector.d.ts +10 -0
  124. package/dist/chart-builders/TemporalGranularitySelector.d.ts.map +1 -0
  125. package/dist/chart-builders/TemporalGranularitySelector.js +37 -0
  126. package/dist/chart-builders/TemporalGranularitySelector.js.map +1 -0
  127. package/dist/chart-builders/chartSpecTitle.d.ts +1 -1
  128. package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -1
  129. package/dist/chart-builders/chartSpecTitle.js.map +1 -1
  130. package/dist/chart-builders/chartTypeUtils.d.ts +5 -9
  131. package/dist/chart-builders/chartTypeUtils.d.ts.map +1 -1
  132. package/dist/chart-builders/chartTypeUtils.js +24 -32
  133. package/dist/chart-builders/chartTypeUtils.js.map +1 -1
  134. package/dist/chart-builders/constants.d.ts +5 -0
  135. package/dist/chart-builders/constants.d.ts.map +1 -1
  136. package/dist/chart-builders/constants.js +13 -0
  137. package/dist/chart-builders/constants.js.map +1 -1
  138. package/dist/chart-builders/createChartBuilderStore.d.ts +5 -5
  139. package/dist/chart-builders/createChartBuilderStore.d.ts.map +1 -1
  140. package/dist/chart-builders/createChartBuilderStore.js.map +1 -1
  141. package/dist/chart-types/base-types.d.ts +112 -18
  142. package/dist/chart-types/base-types.d.ts.map +1 -1
  143. package/dist/chart-types/base-types.js +6 -1
  144. package/dist/chart-types/base-types.js.map +1 -1
  145. package/dist/chart-types/box-plot/BoxPlotSettings.d.ts +3 -0
  146. package/dist/chart-types/box-plot/BoxPlotSettings.d.ts.map +1 -0
  147. package/dist/chart-types/box-plot/BoxPlotSettings.js +9 -0
  148. package/dist/chart-types/box-plot/BoxPlotSettings.js.map +1 -0
  149. package/dist/chart-types/box-plot/definition.d.ts +3 -3
  150. package/dist/chart-types/box-plot/definition.d.ts.map +1 -1
  151. package/dist/chart-types/box-plot/definition.js +10 -36
  152. package/dist/chart-types/box-plot/definition.js.map +1 -1
  153. package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.d.ts +18 -0
  154. package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.d.ts.map +1 -0
  155. package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.js +28 -0
  156. package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.js.map +1 -0
  157. package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.d.ts +9 -0
  158. package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.d.ts.map +1 -0
  159. package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js +115 -0
  160. package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js.map +1 -0
  161. package/dist/chart-types/box-plot/renderer/constants.d.ts +24 -0
  162. package/dist/chart-types/box-plot/renderer/constants.d.ts.map +1 -0
  163. package/dist/chart-types/box-plot/renderer/constants.js +17 -0
  164. package/dist/chart-types/box-plot/renderer/constants.js.map +1 -0
  165. package/dist/chart-types/box-plot/renderer/plot.d.ts +14 -0
  166. package/dist/chart-types/box-plot/renderer/plot.d.ts.map +1 -0
  167. package/dist/chart-types/box-plot/renderer/plot.js +91 -0
  168. package/dist/chart-types/box-plot/renderer/plot.js.map +1 -0
  169. package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts +14 -0
  170. package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts.map +1 -0
  171. package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js +45 -0
  172. package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js.map +1 -0
  173. package/dist/chart-types/box-plot/renderer/utils.d.ts +6 -0
  174. package/dist/chart-types/box-plot/renderer/utils.d.ts.map +1 -0
  175. package/dist/chart-types/box-plot/renderer/utils.js +34 -0
  176. package/dist/chart-types/box-plot/renderer/utils.js.map +1 -0
  177. package/dist/chart-types/box-plot/schema.d.ts +4 -5
  178. package/dist/chart-types/box-plot/schema.d.ts.map +1 -1
  179. package/dist/chart-types/box-plot/schema.js +2 -3
  180. package/dist/chart-types/box-plot/schema.js.map +1 -1
  181. package/dist/chart-types/box-plot/tool.d.ts +44 -0
  182. package/dist/chart-types/box-plot/tool.d.ts.map +1 -0
  183. package/dist/chart-types/box-plot/tool.js +59 -0
  184. package/dist/chart-types/box-plot/tool.js.map +1 -0
  185. package/dist/chart-types/bubble-chart/BubbleChartSettings.d.ts +3 -0
  186. package/dist/chart-types/bubble-chart/BubbleChartSettings.d.ts.map +1 -0
  187. package/dist/chart-types/bubble-chart/BubbleChartSettings.js +9 -0
  188. package/dist/chart-types/bubble-chart/BubbleChartSettings.js.map +1 -0
  189. package/dist/chart-types/bubble-chart/definition.d.ts +3 -3
  190. package/dist/chart-types/bubble-chart/definition.d.ts.map +1 -1
  191. package/dist/chart-types/bubble-chart/definition.js +10 -39
  192. package/dist/chart-types/bubble-chart/definition.js.map +1 -1
  193. package/dist/chart-types/bubble-chart/schema.d.ts +2 -1
  194. package/dist/chart-types/bubble-chart/schema.d.ts.map +1 -1
  195. package/dist/chart-types/bubble-chart/schema.js +6 -3
  196. package/dist/chart-types/bubble-chart/schema.js.map +1 -1
  197. package/dist/chart-types/bubble-chart/spec.d.ts +4 -0
  198. package/dist/chart-types/bubble-chart/spec.d.ts.map +1 -0
  199. package/dist/chart-types/bubble-chart/spec.js +31 -0
  200. package/dist/chart-types/bubble-chart/spec.js.map +1 -0
  201. package/dist/chart-types/bubble-chart/tool.d.ts +46 -0
  202. package/dist/chart-types/bubble-chart/tool.d.ts.map +1 -0
  203. package/dist/chart-types/bubble-chart/tool.js +58 -0
  204. package/dist/chart-types/bubble-chart/tool.js.map +1 -0
  205. package/dist/chart-types/chart-config.d.ts +92 -0
  206. package/dist/chart-types/chart-config.d.ts.map +1 -0
  207. package/dist/chart-types/chart-config.js +47 -0
  208. package/dist/chart-types/chart-config.js.map +1 -0
  209. package/dist/chart-types/count-plot/CountPlotSettings.d.ts +3 -0
  210. package/dist/chart-types/count-plot/CountPlotSettings.d.ts.map +1 -0
  211. package/dist/chart-types/count-plot/CountPlotSettings.js +9 -0
  212. package/dist/chart-types/count-plot/CountPlotSettings.js.map +1 -0
  213. package/dist/chart-types/count-plot/definition.d.ts +3 -3
  214. package/dist/chart-types/count-plot/definition.d.ts.map +1 -1
  215. package/dist/chart-types/count-plot/definition.js +10 -41
  216. package/dist/chart-types/count-plot/definition.js.map +1 -1
  217. package/dist/chart-types/count-plot/schema.d.ts +0 -1
  218. package/dist/chart-types/count-plot/schema.d.ts.map +1 -1
  219. package/dist/chart-types/count-plot/schema.js +4 -2
  220. package/dist/chart-types/count-plot/schema.js.map +1 -1
  221. package/dist/chart-types/count-plot/spec.d.ts +4 -0
  222. package/dist/chart-types/count-plot/spec.d.ts.map +1 -0
  223. package/dist/chart-types/count-plot/spec.js +49 -0
  224. package/dist/chart-types/count-plot/spec.js.map +1 -0
  225. package/dist/chart-types/count-plot/tool.d.ts +42 -0
  226. package/dist/chart-types/count-plot/tool.d.ts.map +1 -0
  227. package/dist/chart-types/count-plot/tool.js +55 -0
  228. package/dist/chart-types/count-plot/tool.js.map +1 -0
  229. package/dist/chart-types/custom-spec/CustomSpecSettings.d.ts +7 -0
  230. package/dist/chart-types/custom-spec/CustomSpecSettings.d.ts.map +1 -0
  231. package/dist/chart-types/custom-spec/CustomSpecSettings.js +30 -0
  232. package/dist/chart-types/custom-spec/CustomSpecSettings.js.map +1 -0
  233. package/dist/chart-types/custom-spec/definition.d.ts +3 -3
  234. package/dist/chart-types/custom-spec/definition.d.ts.map +1 -1
  235. package/dist/chart-types/custom-spec/definition.js +8 -19
  236. package/dist/chart-types/custom-spec/definition.js.map +1 -1
  237. package/dist/chart-types/custom-spec/schema.d.ts +6 -3
  238. package/dist/chart-types/custom-spec/schema.d.ts.map +1 -1
  239. package/dist/chart-types/custom-spec/schema.js +3 -2
  240. package/dist/chart-types/custom-spec/schema.js.map +1 -1
  241. package/dist/chart-types/custom-spec/spec.d.ts +4 -0
  242. package/dist/chart-types/custom-spec/spec.d.ts.map +1 -0
  243. package/dist/chart-types/custom-spec/spec.js +24 -0
  244. package/dist/chart-types/custom-spec/spec.js.map +1 -0
  245. package/dist/chart-types/errors.d.ts +23 -0
  246. package/dist/chart-types/errors.d.ts.map +1 -0
  247. package/dist/chart-types/errors.js +26 -0
  248. package/dist/chart-types/errors.js.map +1 -0
  249. package/dist/chart-types/heatmap/HeatmapSettings.d.ts +3 -0
  250. package/dist/chart-types/heatmap/HeatmapSettings.d.ts.map +1 -0
  251. package/dist/chart-types/heatmap/HeatmapSettings.js +9 -0
  252. package/dist/chart-types/heatmap/HeatmapSettings.js.map +1 -0
  253. package/dist/chart-types/heatmap/definition.d.ts +3 -3
  254. package/dist/chart-types/heatmap/definition.d.ts.map +1 -1
  255. package/dist/chart-types/heatmap/definition.js +10 -40
  256. package/dist/chart-types/heatmap/definition.js.map +1 -1
  257. package/dist/chart-types/heatmap/schema.d.ts +0 -1
  258. package/dist/chart-types/heatmap/schema.d.ts.map +1 -1
  259. package/dist/chart-types/heatmap/schema.js +2 -3
  260. package/dist/chart-types/heatmap/schema.js.map +1 -1
  261. package/dist/chart-types/heatmap/spec.d.ts +4 -0
  262. package/dist/chart-types/heatmap/spec.d.ts.map +1 -0
  263. package/dist/chart-types/heatmap/spec.js +32 -0
  264. package/dist/chart-types/heatmap/spec.js.map +1 -0
  265. package/dist/chart-types/heatmap/tool.d.ts +44 -0
  266. package/dist/chart-types/heatmap/tool.d.ts.map +1 -0
  267. package/dist/chart-types/heatmap/tool.js +59 -0
  268. package/dist/chart-types/heatmap/tool.js.map +1 -0
  269. package/dist/chart-types/histogram/HistogramSettings.d.ts +3 -0
  270. package/dist/chart-types/histogram/HistogramSettings.d.ts.map +1 -0
  271. package/dist/chart-types/histogram/HistogramSettings.js +9 -0
  272. package/dist/chart-types/histogram/HistogramSettings.js.map +1 -0
  273. package/dist/chart-types/histogram/definition.d.ts +3 -3
  274. package/dist/chart-types/histogram/definition.d.ts.map +1 -1
  275. package/dist/chart-types/histogram/definition.js +10 -40
  276. package/dist/chart-types/histogram/definition.js.map +1 -1
  277. package/dist/chart-types/histogram/schema.d.ts +0 -1
  278. package/dist/chart-types/histogram/schema.d.ts.map +1 -1
  279. package/dist/chart-types/histogram/schema.js +4 -2
  280. package/dist/chart-types/histogram/schema.js.map +1 -1
  281. package/dist/chart-types/histogram/spec.d.ts +4 -0
  282. package/dist/chart-types/histogram/spec.d.ts.map +1 -0
  283. package/dist/chart-types/histogram/spec.js +36 -0
  284. package/dist/chart-types/histogram/spec.js.map +1 -0
  285. package/dist/chart-types/histogram/tool.d.ts +42 -0
  286. package/dist/chart-types/histogram/tool.d.ts.map +1 -0
  287. package/dist/chart-types/histogram/tool.js +55 -0
  288. package/dist/chart-types/histogram/tool.js.map +1 -0
  289. package/dist/chart-types/index.d.ts +102 -96
  290. package/dist/chart-types/index.d.ts.map +1 -1
  291. package/dist/chart-types/index.js +71 -41
  292. package/dist/chart-types/index.js.map +1 -1
  293. package/dist/chart-types/line-chart/LineChartSettings.d.ts +7 -0
  294. package/dist/chart-types/line-chart/LineChartSettings.d.ts.map +1 -0
  295. package/dist/chart-types/line-chart/LineChartSettings.js +22 -0
  296. package/dist/chart-types/line-chart/LineChartSettings.js.map +1 -0
  297. package/dist/chart-types/line-chart/definition.d.ts +3 -3
  298. package/dist/chart-types/line-chart/definition.d.ts.map +1 -1
  299. package/dist/chart-types/line-chart/definition.js +10 -37
  300. package/dist/chart-types/line-chart/definition.js.map +1 -1
  301. package/dist/chart-types/line-chart/schema.d.ts +69 -3
  302. package/dist/chart-types/line-chart/schema.d.ts.map +1 -1
  303. package/dist/chart-types/line-chart/schema.js +30 -3
  304. package/dist/chart-types/line-chart/schema.js.map +1 -1
  305. package/dist/chart-types/line-chart/spec.d.ts +4 -0
  306. package/dist/chart-types/line-chart/spec.d.ts.map +1 -0
  307. package/dist/chart-types/line-chart/spec.js +91 -0
  308. package/dist/chart-types/line-chart/spec.js.map +1 -0
  309. package/dist/chart-types/line-chart/tool.d.ts +68 -0
  310. package/dist/chart-types/line-chart/tool.d.ts.map +1 -0
  311. package/dist/chart-types/line-chart/tool.js +66 -0
  312. package/dist/chart-types/line-chart/tool.js.map +1 -0
  313. package/dist/chart-types/tool-schemas.d.ts +8 -0
  314. package/dist/chart-types/tool-schemas.d.ts.map +1 -0
  315. package/dist/chart-types/tool-schemas.js +18 -0
  316. package/dist/chart-types/tool-schemas.js.map +1 -0
  317. package/dist/chart-types/tool-types.d.ts +26 -0
  318. package/dist/chart-types/tool-types.d.ts.map +1 -0
  319. package/dist/chart-types/tool-types.js +2 -0
  320. package/dist/chart-types/tool-types.js.map +1 -0
  321. package/dist/chart-types/tool-validation.d.ts +3 -0
  322. package/dist/chart-types/tool-validation.d.ts.map +1 -0
  323. package/dist/chart-types/tool-validation.js +11 -0
  324. package/dist/chart-types/tool-validation.js.map +1 -0
  325. package/dist/chart-types/useChartTypeDefinition.d.ts +3 -0
  326. package/dist/chart-types/useChartTypeDefinition.d.ts.map +1 -0
  327. package/dist/chart-types/useChartTypeDefinition.js +8 -0
  328. package/dist/chart-types/useChartTypeDefinition.js.map +1 -0
  329. package/dist/dashboard/MosaicDashboard.d.ts.map +1 -1
  330. package/dist/dashboard/MosaicDashboard.js +7 -11
  331. package/dist/dashboard/MosaicDashboard.js.map +1 -1
  332. package/dist/dashboard/MosaicDashboardEmptyState.d.ts +2 -0
  333. package/dist/dashboard/MosaicDashboardEmptyState.d.ts.map +1 -0
  334. package/dist/dashboard/MosaicDashboardEmptyState.js +50 -0
  335. package/dist/dashboard/MosaicDashboardEmptyState.js.map +1 -0
  336. package/dist/dashboard/MosaicDashboardPanelLayout.d.ts.map +1 -1
  337. package/dist/dashboard/MosaicDashboardPanelLayout.js +23 -2
  338. package/dist/dashboard/MosaicDashboardPanelLayout.js.map +1 -1
  339. package/dist/dashboard/MosaicDashboardPanels.d.ts.map +1 -1
  340. package/dist/dashboard/MosaicDashboardPanels.js +2 -1
  341. package/dist/dashboard/MosaicDashboardPanels.js.map +1 -1
  342. package/dist/dashboard/MosaicDashboardSlice.d.ts +212 -87
  343. package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
  344. package/dist/dashboard/MosaicDashboardSlice.js +65 -18
  345. package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
  346. package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -1
  347. package/dist/dashboard/MosaicDashboardToolbar.js +9 -4
  348. package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -1
  349. package/dist/dashboard/defaultPanelRenderers.d.ts.map +1 -1
  350. package/dist/dashboard/defaultPanelRenderers.js +6 -4
  351. package/dist/dashboard/defaultPanelRenderers.js.map +1 -1
  352. package/dist/dashboard/utils.d.ts +3 -0
  353. package/dist/dashboard/utils.d.ts.map +1 -0
  354. package/dist/dashboard/utils.js +16 -0
  355. package/dist/dashboard/utils.js.map +1 -0
  356. package/dist/index.d.ts +6 -9
  357. package/dist/index.d.ts.map +1 -1
  358. package/dist/index.js +5 -7
  359. package/dist/index.js.map +1 -1
  360. package/dist/{dashboard → profiler}/MosaicDashboardProfilerPanelRenderer.d.ts +1 -1
  361. package/dist/profiler/MosaicDashboardProfilerPanelRenderer.d.ts.map +1 -0
  362. package/dist/{dashboard → profiler}/MosaicDashboardProfilerPanelRenderer.js +2 -2
  363. package/dist/profiler/MosaicDashboardProfilerPanelRenderer.js.map +1 -0
  364. package/dist/text/MosaicDashboardTextRenderer.d.ts +3 -0
  365. package/dist/text/MosaicDashboardTextRenderer.d.ts.map +1 -0
  366. package/dist/text/MosaicDashboardTextRenderer.js +46 -0
  367. package/dist/text/MosaicDashboardTextRenderer.js.map +1 -0
  368. package/package.json +38 -35
  369. package/dist/chart-builders/builders.d.ts +0 -34
  370. package/dist/chart-builders/builders.d.ts.map +0 -1
  371. package/dist/chart-builders/builders.js +0 -51
  372. package/dist/chart-builders/builders.js.map +0 -1
  373. package/dist/chart-builders/describeChartSpecs.d.ts +0 -9
  374. package/dist/chart-builders/describeChartSpecs.d.ts.map +0 -1
  375. package/dist/chart-builders/describeChartSpecs.js +0 -41
  376. package/dist/chart-builders/describeChartSpecs.js.map +0 -1
  377. package/dist/chart-builders/hooks/useChartFieldForm.d.ts +0 -13
  378. package/dist/chart-builders/hooks/useChartFieldForm.d.ts.map +0 -1
  379. package/dist/chart-builders/hooks/useChartFieldForm.js +0 -12
  380. package/dist/chart-builders/hooks/useChartFieldForm.js.map +0 -1
  381. package/dist/chart-builders/types.d.ts +0 -23
  382. package/dist/chart-builders/types.d.ts.map +0 -1
  383. package/dist/chart-builders/types.js +0 -17
  384. package/dist/chart-builders/types.js.map +0 -1
  385. package/dist/chart-types/box-plot/index.d.ts +0 -3
  386. package/dist/chart-types/box-plot/index.d.ts.map +0 -1
  387. package/dist/chart-types/box-plot/index.js +0 -3
  388. package/dist/chart-types/box-plot/index.js.map +0 -1
  389. package/dist/chart-types/bubble-chart/index.d.ts +0 -3
  390. package/dist/chart-types/bubble-chart/index.d.ts.map +0 -1
  391. package/dist/chart-types/bubble-chart/index.js +0 -3
  392. package/dist/chart-types/bubble-chart/index.js.map +0 -1
  393. package/dist/chart-types/count-plot/index.d.ts +0 -3
  394. package/dist/chart-types/count-plot/index.d.ts.map +0 -1
  395. package/dist/chart-types/count-plot/index.js +0 -3
  396. package/dist/chart-types/count-plot/index.js.map +0 -1
  397. package/dist/chart-types/custom-spec/index.d.ts +0 -3
  398. package/dist/chart-types/custom-spec/index.d.ts.map +0 -1
  399. package/dist/chart-types/custom-spec/index.js +0 -3
  400. package/dist/chart-types/custom-spec/index.js.map +0 -1
  401. package/dist/chart-types/ecdf/definition.d.ts +0 -4
  402. package/dist/chart-types/ecdf/definition.d.ts.map +0 -1
  403. package/dist/chart-types/ecdf/definition.js +0 -47
  404. package/dist/chart-types/ecdf/definition.js.map +0 -1
  405. package/dist/chart-types/ecdf/index.d.ts +0 -3
  406. package/dist/chart-types/ecdf/index.d.ts.map +0 -1
  407. package/dist/chart-types/ecdf/index.js +0 -3
  408. package/dist/chart-types/ecdf/index.js.map +0 -1
  409. package/dist/chart-types/ecdf/schema.d.ts +0 -15
  410. package/dist/chart-types/ecdf/schema.d.ts.map +0 -1
  411. package/dist/chart-types/ecdf/schema.js +0 -11
  412. package/dist/chart-types/ecdf/schema.js.map +0 -1
  413. package/dist/chart-types/heatmap/index.d.ts +0 -3
  414. package/dist/chart-types/heatmap/index.d.ts.map +0 -1
  415. package/dist/chart-types/heatmap/index.js +0 -3
  416. package/dist/chart-types/heatmap/index.js.map +0 -1
  417. package/dist/chart-types/histogram/index.d.ts +0 -3
  418. package/dist/chart-types/histogram/index.d.ts.map +0 -1
  419. package/dist/chart-types/histogram/index.js +0 -3
  420. package/dist/chart-types/histogram/index.js.map +0 -1
  421. package/dist/chart-types/line-chart/index.d.ts +0 -3
  422. package/dist/chart-types/line-chart/index.d.ts.map +0 -1
  423. package/dist/chart-types/line-chart/index.js +0 -3
  424. package/dist/chart-types/line-chart/index.js.map +0 -1
  425. package/dist/chart-types/registry.d.ts +0 -5
  426. package/dist/chart-types/registry.d.ts.map +0 -1
  427. package/dist/chart-types/registry.js +0 -28
  428. package/dist/chart-types/registry.js.map +0 -1
  429. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts.map +0 -1
  430. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js.map +0 -1
  431. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts +0 -4
  432. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts.map +0 -1
  433. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js +0 -29
  434. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js.map +0 -1
  435. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts +0 -3
  436. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts.map +0 -1
  437. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js +0 -68
  438. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js.map +0 -1
  439. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +0 -8
  440. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +0 -1
  441. package/dist/dashboard/VgPlotSpecPopoverEditor.js +0 -40
  442. package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +0 -1
  443. package/dist/dashboard/chart-settings/ChartSettings.d.ts.map +0 -1
  444. package/dist/dashboard/chart-settings/ChartSettings.js +0 -90
  445. package/dist/dashboard/chart-settings/ChartSettings.js.map +0 -1
  446. package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts +0 -20
  447. package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts.map +0 -1
  448. package/dist/dashboard/chart-settings/ChartSettingsContext.js +0 -14
  449. package/dist/dashboard/chart-settings/ChartSettingsContext.js.map +0 -1
  450. package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts +0 -11
  451. package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts.map +0 -1
  452. package/dist/dashboard/chart-settings/ChartSettingsPanel.js +0 -8
  453. package/dist/dashboard/chart-settings/ChartSettingsPanel.js.map +0 -1
  454. package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts +0 -11
  455. package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts.map +0 -1
  456. package/dist/dashboard/chart-settings/ChartTypeSelector.js +0 -17
  457. package/dist/dashboard/chart-settings/ChartTypeSelector.js.map +0 -1
  458. package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts +0 -11
  459. package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts.map +0 -1
  460. package/dist/dashboard/chart-settings/DynamicChartSettings.js +0 -19
  461. package/dist/dashboard/chart-settings/DynamicChartSettings.js.map +0 -1
  462. package/dist/dashboard/chart-settings/index.d.ts +0 -6
  463. package/dist/dashboard/chart-settings/index.d.ts.map +0 -1
  464. package/dist/dashboard/chart-settings/index.js +0 -6
  465. package/dist/dashboard/chart-settings/index.js.map +0 -1
  466. package/dist/dashboard/chart-settings/useTableColumns.d.ts.map +0 -1
  467. package/dist/dashboard/chart-settings/useTableColumns.js.map +0 -1
  468. package/dist/dashboard/generateMosaicChartSpec.d.ts +0 -15
  469. package/dist/dashboard/generateMosaicChartSpec.d.ts.map +0 -1
  470. package/dist/dashboard/generateMosaicChartSpec.js +0 -30
  471. package/dist/dashboard/generateMosaicChartSpec.js.map +0 -1
  472. /package/dist/{dashboard → chart}/chart-settings/useTableColumns.d.ts +0 -0
@@ -5,7 +5,7 @@ import { createSlice, useBaseRoomStore, } from '@sqlrooms/room-store';
5
5
  import { produce } from 'immer';
6
6
  import { z } from 'zod';
7
7
  import { destroyRetainedVgPlotChart, } from '../VgPlotChart';
8
- import { VgPlotChartConfig } from '../chart-types';
8
+ import { ChartConfig } from '../chart-types/chart-config';
9
9
  /**
10
10
  * Panel key used for function-form panel definitions registered by
11
11
  * `MosaicDashboardPanels`. Individual dashboard panels are represented as
@@ -13,8 +13,9 @@ import { VgPlotChartConfig } from '../chart-types';
13
13
  * `{ key: MOSAIC_DASHBOARD_PANEL, meta: { dashboardId, panelId } }`.
14
14
  */
15
15
  export const MOSAIC_DASHBOARD_PANEL = 'mosaic-dashboard-panel';
16
- export const MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE = 'vgplot';
16
+ export const MOSAIC_DASHBOARD_CHART_PANEL_TYPE = 'vgplot';
17
17
  export const MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE = 'profiler';
18
+ export const MOSAIC_DASHBOARD_TEXT_PANEL_TYPE = 'text';
18
19
  export const MosaicDashboardLayoutType = z.enum(['dock', 'grid']);
19
20
  export const MosaicDashboardPanelSource = z.object({
20
21
  tableName: z.string().optional(),
@@ -24,13 +25,19 @@ export const MosaicDashboardPanelSource = z.object({
24
25
  export const ProfilerPanelConfig = z.object({
25
26
  pageSize: z.number().optional(),
26
27
  });
28
+ // Text panel config
29
+ export const TextPanelConfig = z.object({
30
+ content: z.string().default(''),
31
+ toolbarOpen: z.boolean().default(true),
32
+ sourcePanelOpen: z.boolean().default(false),
33
+ });
27
34
  // Panel configs discriminated by type
28
- export const VgPlotPanelConfig = z.object({
35
+ export const ChartPanelConfig = z.object({
29
36
  id: z.string(),
30
- type: z.literal(MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE),
37
+ type: z.literal(MOSAIC_DASHBOARD_CHART_PANEL_TYPE),
31
38
  title: z.string().default('Panel'),
32
39
  source: MosaicDashboardPanelSource.optional(),
33
- config: VgPlotChartConfig,
40
+ config: ChartConfig,
34
41
  });
35
42
  export const ProfilerPanel = z.object({
36
43
  id: z.string(),
@@ -39,6 +46,13 @@ export const ProfilerPanel = z.object({
39
46
  source: MosaicDashboardPanelSource.optional(),
40
47
  config: ProfilerPanelConfig,
41
48
  });
49
+ export const TextPanel = z.object({
50
+ id: z.string(),
51
+ type: z.literal(MOSAIC_DASHBOARD_TEXT_PANEL_TYPE),
52
+ title: z.string().default('Text'),
53
+ source: MosaicDashboardPanelSource.optional(),
54
+ config: TextPanelConfig,
55
+ });
42
56
  // Legacy panel for backward compatibility
43
57
  export const LegacyPanelConfig = z.object({
44
58
  id: z.string(),
@@ -49,26 +63,45 @@ export const LegacyPanelConfig = z.object({
49
63
  });
50
64
  // Discriminated union of all panel types
51
65
  export const MosaicDashboardPanelConfig = z
52
- .discriminatedUnion('type', [VgPlotPanelConfig, ProfilerPanel])
66
+ .discriminatedUnion('type', [ChartPanelConfig, ProfilerPanel, TextPanel])
53
67
  .or(LegacyPanelConfig);
54
- export function createMosaicDashboardVgPlotPanelConfig(title, config, source) {
55
- return VgPlotPanelConfig.parse({
68
+ export function createMosaicDashboardPanelConfig(options) {
69
+ return {
56
70
  id: createId(),
57
- type: MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE,
71
+ type: options.type,
72
+ title: options.title,
73
+ source: options.source,
74
+ config: options.config ?? {},
75
+ };
76
+ }
77
+ export function createMosaicDashboardChartPanelConfig(title, config, source) {
78
+ return {
79
+ id: createId(),
80
+ type: MOSAIC_DASHBOARD_CHART_PANEL_TYPE,
58
81
  title,
59
82
  source,
60
83
  config,
61
- });
84
+ };
62
85
  }
63
86
  export function createMosaicDashboardProfilerPanelConfig(options = {}) {
64
- return {
65
- id: createId(),
87
+ return createMosaicDashboardPanelConfig({
66
88
  type: MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,
67
89
  title: options.title ?? 'Profiler',
68
90
  source: options.source,
69
91
  config: {
70
92
  pageSize: options.pageSize ?? 10,
71
93
  },
94
+ });
95
+ }
96
+ export function createMosaicDashboardTextPanelConfig(options = {}) {
97
+ return {
98
+ id: createId(),
99
+ type: MOSAIC_DASHBOARD_TEXT_PANEL_TYPE,
100
+ title: options.title ?? 'Text',
101
+ source: options.source,
102
+ config: {
103
+ content: options.content ?? '',
104
+ },
72
105
  };
73
106
  }
74
107
  export const MosaicDashboardEntry = z.object({
@@ -342,8 +375,8 @@ function ensureLayoutContainsDashboardPanels(layout, dashboardId, panelIds, layo
342
375
  }
343
376
  return nextLayout;
344
377
  }
345
- export function isVgPlotPanelConfig(panel) {
346
- return panel.type === MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE;
378
+ export function isChartPanelConfig(panel) {
379
+ return panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE;
347
380
  }
348
381
  export function getMosaicDashboardPanelId(dashboardId, panelId) {
349
382
  return `dashboard:${dashboardId}:panel:${panelId}`;
@@ -369,16 +402,31 @@ function shouldEvictPanelRuntimeForPatch(panel, patch) {
369
402
  if (patch.type && patch.type !== panel.type) {
370
403
  return true;
371
404
  }
372
- if (panel.type === MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE) {
373
- return Boolean(patch.config &&
374
- Object.prototype.hasOwnProperty.call(patch.config, 'vgplot'));
405
+ if (panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE) {
406
+ return Boolean('config' in patch && patch.config);
375
407
  }
376
408
  return false;
377
409
  }
410
+ /**
411
+ * Type guard to check if a panel config has a source property.
412
+ * All standard panel types (Chart, Profiler, Text) have optional sources.
413
+ */
414
+ export function panelHasSource(panel) {
415
+ return (panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE ||
416
+ panel.type === MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE ||
417
+ panel.type === MOSAIC_DASHBOARD_TEXT_PANEL_TYPE);
418
+ }
378
419
  export function resolveMosaicDashboardPanelSource(dashboard, panel) {
420
+ if (!panelHasSource(panel)) {
421
+ return undefined;
422
+ }
379
423
  if (panel.source?.sqlQuery || panel.source?.tableName) {
380
424
  return panel.source;
381
425
  }
426
+ // Text panels typically don't need a table source
427
+ if (panel.type === MOSAIC_DASHBOARD_TEXT_PANEL_TYPE) {
428
+ return undefined;
429
+ }
382
430
  return dashboard.selectedTable
383
431
  ? { tableName: dashboard.selectedTable }
384
432
  : undefined;
@@ -396,7 +444,6 @@ export function createMosaicDashboardSlice(props = {}) {
396
444
  runtime: {
397
445
  retainedChartsByPanelId: {},
398
446
  },
399
- chartBuilders: props.chartBuilders,
400
447
  chartTypes: props.chartTypes,
401
448
  addPanelActions: props.addPanelActions ?? [],
402
449
  panelRenderers: props.panelRenderers ?? {},
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardSlice.js","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {DbSliceState} from '@sqlrooms/db';\nimport {type DataTable, type DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {\n DEFAULT_GRID_COLS,\n getGridColsForBreakpoint,\n type LayoutSliceState,\n} from '@sqlrooms/layout';\nimport {\n type LayoutGridItem,\n type LayoutGridNode,\n type LayoutNode,\n type LayoutPanelNode,\n isLayoutGridNode,\n isLayoutNodeKey,\n isLayoutPanelNode,\n isLayoutSplitNode,\n LayoutNode as LayoutNodeSchema,\n} from '@sqlrooms/layout-config';\nimport {\n BaseRoomStoreState,\n createSlice,\n SliceFunctions,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport type {ComponentType} from 'react';\nimport {z} from 'zod';\nimport type {\n ChartBuilderTemplate,\n ChartTypeDefinition,\n} from '../chart-builders/types';\nimport {type MosaicSliceState} from '../MosaicSlice';\nimport {\n destroyRetainedVgPlotChart,\n type RetainedVgPlotChart,\n} from '../VgPlotChart';\nimport {VgPlotChartConfig} from '../chart-types';\n\n/**\n * Panel key used for function-form panel definitions registered by\n * `MosaicDashboardPanels`. Individual dashboard panels are represented as\n * `LayoutPanelNode` entries whose `panel` property carries\n * `{ key: MOSAIC_DASHBOARD_PANEL, meta: { dashboardId, panelId } }`.\n */\nexport const MOSAIC_DASHBOARD_PANEL = 'mosaic-dashboard-panel';\nexport const MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE = 'vgplot';\nexport const MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE = 'profiler';\n\nexport const MosaicDashboardLayoutType = z.enum(['dock', 'grid']);\nexport type MosaicDashboardLayoutType = z.infer<\n typeof MosaicDashboardLayoutType\n>;\n\nexport const MosaicDashboardPanelSource = z.object({\n tableName: z.string().optional(),\n sqlQuery: z.string().optional(),\n});\nexport type MosaicDashboardPanelSource = z.infer<\n typeof MosaicDashboardPanelSource\n>;\n\n// Profiler panel config\nexport const ProfilerPanelConfig = z.object({\n pageSize: z.number().optional(),\n});\nexport type ProfilerPanelConfig = z.infer<typeof ProfilerPanelConfig>;\n\n// Panel configs discriminated by type\nexport const VgPlotPanelConfig = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: VgPlotChartConfig,\n});\nexport type VgPlotPanelConfig = z.infer<typeof VgPlotPanelConfig>;\n\nexport const ProfilerPanel = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: ProfilerPanelConfig,\n});\nexport type ProfilerPanel = z.infer<typeof ProfilerPanel>;\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', [VgPlotPanelConfig, ProfilerPanel])\n .or(LegacyPanelConfig);\nexport type MosaicDashboardPanelConfig = z.infer<\n typeof MosaicDashboardPanelConfig\n>;\n\nexport type MosaicDashboardPanelRendererProps<\n TPanel extends MosaicDashboardPanelConfig = MosaicDashboardPanelConfig,\n> = {\n dashboardId: string;\n dashboard: MosaicDashboardEntry;\n panel: TPanel;\n selectionName: string;\n resolvedSource?: MosaicDashboardPanelSource;\n};\n\nexport type VgPlotPanelRendererProps =\n MosaicDashboardPanelRendererProps<VgPlotPanelConfig>;\nexport type ProfilerPanelRendererProps =\n MosaicDashboardPanelRendererProps<ProfilerPanel>;\n\nexport type MosaicDashboardPanelRenderer<\n TPanel extends MosaicDashboardPanelConfig = MosaicDashboardPanelConfig,\n> = {\n component: ComponentType<MosaicDashboardPanelRendererProps<TPanel>>;\n headerActions?: ComponentType<MosaicDashboardPanelRendererProps<TPanel>>;\n icon?: ComponentType<{className?: string}>;\n};\n\n// Type-erased renderer for storage (avoids circular dependency issues)\nexport type AnyPanelRenderer = {\n component: ComponentType<any>;\n headerActions?: ComponentType<any>;\n icon?: ComponentType<{className?: string}>;\n};\n\n// Map of panel type string to panel config type\nexport type PanelTypeMap = {\n [MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE]: VgPlotPanelConfig;\n [MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]: ProfilerPanel;\n};\n\n// Panel renderers record - use type-erased renderers for runtime compatibility\nexport type PanelRenderersRecord = Record<string, AnyPanelRenderer>;\n\nexport type MosaicDashboardAddPanelActionContext = {\n dashboardId: string;\n dashboard: MosaicDashboardEntry | undefined;\n selectedTable: DataTable | undefined;\n tables: DataTable[];\n};\n\nexport type MosaicDashboardAddPanelAction = {\n type: string;\n label: string;\n icon?: ComponentType<{className?: string}>;\n isEnabled?: (context: MosaicDashboardAddPanelActionContext) => boolean;\n createPanel: (\n context: MosaicDashboardAddPanelActionContext,\n ) => MosaicDashboardPanelConfig | undefined;\n};\n\nexport function createMosaicDashboardVgPlotPanelConfig(\n title: string,\n config: VgPlotChartConfig,\n source?: MosaicDashboardPanelSource,\n): VgPlotPanelConfig {\n return VgPlotPanelConfig.parse({\n id: createId(),\n type: MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE,\n title,\n source,\n config,\n });\n}\n\nexport function createMosaicDashboardProfilerPanelConfig(\n options: {\n title?: string;\n source?: MosaicDashboardPanelSource;\n pageSize?: number;\n } = {},\n): MosaicDashboardPanelConfig {\n return {\n id: createId(),\n type: MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n title: options.title ?? 'Profiler',\n source: options.source,\n config: {\n pageSize: options.pageSize ?? 10,\n },\n };\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\nexport const MosaicDashboardSliceConfig = z.object({\n dashboardsById: z.record(z.string(), MosaicDashboardEntry).default({}),\n});\nexport type MosaicDashboardSliceConfig = z.infer<\n typeof MosaicDashboardSliceConfig\n>;\n\nexport type MosaicDashboardSliceState = {\n mosaicDashboard: SliceFunctions & {\n config: MosaicDashboardSliceConfig;\n runtime: {\n /**\n * Live vgplot chart instances retained across transient dashboard panel\n * remounts, keyed by `getMosaicDashboardPanelId(dashboardId, panelId)`.\n *\n * This is runtime-only state: entries are never serialized with dashboard\n * config and must be evicted when their panel/dashboard lifecycle ends.\n */\n retainedChartsByPanelId: Record<string, RetainedVgPlotChart>;\n };\n chartBuilders?: ChartBuilderTemplate[];\n chartTypes?: ChartTypeDefinition[];\n addPanelActions: MosaicDashboardAddPanelAction[];\n createDashboard: (\n title?: string,\n layoutType?: MosaicDashboardLayoutType,\n ) => string;\n ensureDashboard: (\n dashboardId: string,\n title?: string,\n layoutType?: MosaicDashboardLayoutType,\n ) => void;\n removeDashboard: (dashboardId: string) => void;\n getDashboard: (dashboardId: string) => MosaicDashboardEntry | undefined;\n setSelectedTable: (dashboardId: string, tableName: string) => void;\n panelRenderers: PanelRenderersRecord;\n registerPanelRenderer: (type: string, renderer: AnyPanelRenderer) => void;\n unregisterPanelRenderer: (type: string) => void;\n addPanel: (\n dashboardId: string,\n panel: MosaicDashboardPanelConfig,\n ) => MosaicDashboardPanelConfig['id'];\n updatePanel: (\n dashboardId: string,\n panelId: string,\n patch: Partial<Omit<MosaicDashboardPanelConfig, 'id'>>,\n ) => void;\n removePanel: (dashboardId: string, panelId: string) => void;\n getRetainedChart: (\n dashboardId: string,\n panelId: string,\n ) => RetainedVgPlotChart | undefined;\n setRetainedChart: (\n dashboardId: string,\n panelId: string,\n chart: RetainedVgPlotChart,\n ) => void;\n evictPanelRuntime: (dashboardId: string, panelId: string) => void;\n evictDashboardRuntime: (\n dashboardId: string,\n options?: {resetSelection?: boolean},\n ) => void;\n clearAllDashboardRuntime: () => void;\n setLayout: (dashboardId: string, layout: LayoutNode | null) => void;\n };\n};\n\nexport type MosaicDashboardStoreState = BaseRoomStoreState &\n DbSliceState &\n DuckDbSliceState &\n LayoutSliceState &\n MosaicSliceState &\n MosaicDashboardSliceState;\n\ntype DashboardPanelTypesByLayoutId = Record<string, string | undefined>;\n\n// ---------------------------------------------------------------------------\n// Layout tree helpers (operate on the new LayoutNode types)\n// ---------------------------------------------------------------------------\n\nfunction createDashboardPanelNode(\n dashboardId: string,\n panelId: string,\n): LayoutPanelNode {\n return {\n type: 'panel',\n id: getMosaicDashboardPanelId(dashboardId, panelId),\n minSize: 200,\n panel: {\n key: MOSAIC_DASHBOARD_PANEL,\n meta: {dashboardId, panelId},\n },\n };\n}\n\nfunction getDashboardPanelTypesByLayoutId(\n dashboardId: string,\n panels: MosaicDashboardPanelConfig[],\n): DashboardPanelTypesByLayoutId {\n return Object.fromEntries(\n panels.map((panel) => [\n getMosaicDashboardPanelId(dashboardId, panel.id),\n panel.type,\n ]),\n );\n}\n\nfunction appendPanelToLayout(\n layout: LayoutNode | null,\n panelNode: LayoutPanelNode,\n): LayoutNode {\n if (!layout) {\n return panelNode;\n }\n return {\n type: 'split',\n id: `split-${createId()}`,\n direction: 'row',\n children: [layout, panelNode],\n };\n}\n\nfunction createDashboardGridLayout(\n dashboardId: string,\n panelNode?: LayoutPanelNode,\n): LayoutGridNode {\n const children = panelNode ? [panelNode] : [];\n const layouts = createDashboardGridLayoutsForChildren(children);\n return {\n type: 'grid',\n id: getMosaicDashboardGridId(dashboardId),\n children,\n rowHeight: 150,\n margin: [12, 12],\n containerPadding: [0, 0],\n compactType: 'vertical',\n preventCollision: false,\n resizeHandles: ['e', 's', 'w', 'se', 'sw'],\n layouts,\n };\n}\n\nfunction getLayoutChildId(node: LayoutNode): string {\n return isLayoutNodeKey(node) ? node : node.id;\n}\n\nfunction createDashboardGridItem(\n panelId: string,\n layout: LayoutGridItem[],\n cols = 12,\n panelType?: string,\n): LayoutGridItem {\n const effectiveCols = Math.max(1, cols);\n const w =\n panelType === MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE\n ? effectiveCols\n : Math.max(1, Math.ceil(effectiveCols / 2));\n const h = 2;\n const bottom = layout.reduce(\n (max, item) => Math.max(max, item.y + item.h),\n 0,\n );\n\n for (let y = 0; y <= bottom; y += 1) {\n for (let x = 0; x <= effectiveCols - w; x += 1) {\n const overlaps = layout.some(\n (item) =>\n x < item.x + item.w &&\n x + w > item.x &&\n y < item.y + item.h &&\n y + h > item.y,\n );\n if (!overlaps) {\n return {\n i: panelId,\n x,\n y,\n w,\n h,\n };\n }\n }\n }\n\n return {\n i: panelId,\n x: 0,\n y: bottom,\n w,\n h,\n };\n}\n\nfunction createDashboardGridLayoutsForChildren(\n children: LayoutNode[],\n sourceLayouts?: LayoutGridNode['layouts'],\n cols?: LayoutGridNode['cols'],\n panelTypesByLayoutId: Record<string, string | undefined> = {},\n): LayoutGridNode['layouts'] {\n const childIds = new Set(children.map((child) => getLayoutChildId(child)));\n const sourceEntries = new Map<string, LayoutGridItem[]>(\n Object.keys(DEFAULT_GRID_COLS).map((breakpoint) => [breakpoint, []]),\n );\n for (const [breakpoint, breakpointLayout] of Object.entries(\n sourceLayouts ?? {},\n )) {\n sourceEntries.set(breakpoint, breakpointLayout);\n }\n\n return Object.fromEntries(\n [...sourceEntries.entries()].map(([breakpoint, breakpointLayout]) => {\n const nextLayout = breakpointLayout.filter((item) =>\n childIds.has(item.i),\n );\n const layoutItemIds = new Set(nextLayout.map((item) => item.i));\n\n for (const child of children) {\n const childId = getLayoutChildId(child);\n if (!layoutItemIds.has(childId)) {\n const item = createDashboardGridItem(\n childId,\n nextLayout,\n getGridColsForBreakpoint(cols, breakpoint),\n panelTypesByLayoutId[childId],\n );\n nextLayout.push(item);\n layoutItemIds.add(childId);\n }\n }\n\n return [breakpoint, nextLayout];\n }),\n );\n}\n\nfunction isExpectedDashboardPanelNode(\n node: LayoutNode,\n expectedPanelIds: Set<string>,\n): boolean {\n return expectedPanelIds.has(getLayoutChildId(node));\n}\n\nfunction collectDashboardPanelNodes(\n layout: LayoutNode | null,\n expectedPanelIds: Set<string>,\n nodes: LayoutNode[] = [],\n seen = new Set<string>(),\n): LayoutNode[] {\n if (!layout) return nodes;\n\n if (isLayoutNodeKey(layout) || isLayoutPanelNode(layout)) {\n if (isExpectedDashboardPanelNode(layout, expectedPanelIds)) {\n const id = getLayoutChildId(layout);\n if (!seen.has(id)) {\n nodes.push(layout);\n seen.add(id);\n }\n }\n return nodes;\n }\n\n if (isLayoutSplitNode(layout) || isLayoutGridNode(layout)) {\n for (const child of layout.children) {\n collectDashboardPanelNodes(child, expectedPanelIds, nodes, seen);\n }\n }\n\n return nodes;\n}\n\nfunction normalizeDashboardGridLayout(\n layout: LayoutNode | null,\n dashboardId: string,\n expectedPanelIds: Set<string>,\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutGridNode {\n const collectedPanelIds = collectPanelIds(layout);\n const existingExpectedPanelIds = new Set(\n [...expectedPanelIds].filter((panelId) => collectedPanelIds.has(panelId)),\n );\n const children = collectDashboardPanelNodes(layout, existingExpectedPanelIds);\n const layouts = createDashboardGridLayoutsForChildren(\n children,\n isLayoutGridNode(layout) ? layout.layouts : undefined,\n isLayoutGridNode(layout) ? layout.cols : undefined,\n panelTypesByLayoutId,\n );\n\n if (isLayoutGridNode(layout)) {\n return {\n ...layout,\n children,\n layouts,\n };\n }\n\n return {\n ...createDashboardGridLayout(dashboardId),\n children,\n layouts,\n };\n}\n\nfunction appendPanelToGridLayout(\n layout: LayoutNode | null,\n dashboardId: string,\n panelNode: LayoutPanelNode,\n panelType?: string,\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutGridNode {\n const nextPanelTypesByLayoutId = {\n ...panelTypesByLayoutId,\n [panelNode.id]: panelType ?? panelTypesByLayoutId[panelNode.id],\n };\n\n if (!isLayoutGridNode(layout)) {\n const dashboardPanelPrefix = `dashboard:${dashboardId}:panel:`;\n const expectedPanelIds = new Set(\n [...collectPanelIds(layout)].filter((panelId) =>\n panelId.startsWith(dashboardPanelPrefix),\n ),\n );\n expectedPanelIds.add(panelNode.id);\n const normalizedLayout = normalizeDashboardGridLayout(\n layout,\n dashboardId,\n expectedPanelIds,\n nextPanelTypesByLayoutId,\n );\n return appendPanelToGridLayout(\n normalizedLayout,\n dashboardId,\n panelNode,\n panelType,\n nextPanelTypesByLayoutId,\n );\n }\n\n const hasChild = layout.children.some((child) => {\n if (isLayoutNodeKey(child)) return child === panelNode.id;\n return child.id === panelNode.id;\n });\n const children = hasChild ? layout.children : [...layout.children, panelNode];\n const layouts = Object.fromEntries(\n Object.entries(\n createDashboardGridLayoutsForChildren(\n children,\n layout.layouts,\n layout.cols,\n nextPanelTypesByLayoutId,\n ) ?? {},\n ).map(([breakpoint, breakpointLayout]) => {\n if (breakpointLayout.some((item) => item.i === panelNode.id)) {\n return [breakpoint, breakpointLayout];\n }\n return [\n breakpoint,\n [\n ...breakpointLayout,\n createDashboardGridItem(\n panelNode.id,\n breakpointLayout,\n getGridColsForBreakpoint(layout.cols, breakpoint),\n nextPanelTypesByLayoutId[panelNode.id],\n ),\n ],\n ];\n }),\n );\n\n return {\n ...layout,\n children,\n layouts,\n };\n}\n\nfunction removePanelFromLayout(\n layout: LayoutNode | null,\n panelId: string,\n): LayoutNode | null {\n if (!layout) return null;\n\n if (isLayoutNodeKey(layout)) {\n return layout === panelId ? null : layout;\n }\n\n if (isLayoutPanelNode(layout)) {\n return layout.id === panelId ? null : layout;\n }\n\n if (isLayoutSplitNode(layout)) {\n const nextChildren = layout.children\n .map((child) => removePanelFromLayout(child, panelId))\n .filter((child): child is LayoutNode => child !== null);\n\n if (nextChildren.length === 0) return null;\n if (nextChildren.length === 1) return nextChildren[0] ?? null;\n\n return {...layout, children: nextChildren};\n }\n\n if (isLayoutGridNode(layout)) {\n const nextChildren = layout.children.filter((child) => {\n if (isLayoutNodeKey(child)) return child !== panelId;\n return child.id !== panelId;\n });\n const nextLayouts = layout.layouts\n ? Object.fromEntries(\n Object.entries(layout.layouts).map(\n ([breakpoint, breakpointLayout]) => [\n breakpoint,\n breakpointLayout.filter((item) => item.i !== panelId),\n ],\n ),\n )\n : layout.layouts;\n\n if (nextChildren.length === 0) return null;\n return {...layout, children: nextChildren, layouts: nextLayouts};\n }\n\n return layout;\n}\n\nfunction collectPanelIds(\n layout: LayoutNode | null,\n panelIds = new Set<string>(),\n): Set<string> {\n if (!layout) return panelIds;\n if (isLayoutNodeKey(layout)) {\n panelIds.add(layout);\n return panelIds;\n }\n if (isLayoutPanelNode(layout)) {\n panelIds.add(layout.id);\n return panelIds;\n }\n if (isLayoutSplitNode(layout)) {\n for (const child of layout.children) {\n collectPanelIds(child, panelIds);\n }\n }\n if (isLayoutGridNode(layout)) {\n for (const child of layout.children) {\n collectPanelIds(child, panelIds);\n }\n }\n return panelIds;\n}\n\nfunction ensureLayoutContainsDashboardPanels(\n layout: LayoutNode | null,\n dashboardId: string,\n panelIds: string[],\n layoutType: MosaicDashboardLayoutType = 'dock',\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutNode | null {\n let nextLayout = layout;\n\n if (layoutType === 'grid') {\n const expectedPanelIds = new Set(\n panelIds.map((panelId) =>\n getMosaicDashboardPanelId(dashboardId, panelId),\n ),\n );\n nextLayout = normalizeDashboardGridLayout(\n nextLayout,\n dashboardId,\n expectedPanelIds,\n panelTypesByLayoutId,\n );\n }\n\n const existing = collectPanelIds(nextLayout);\n for (const panelId of panelIds) {\n const layoutPanelId = getMosaicDashboardPanelId(dashboardId, panelId);\n if (!existing.has(layoutPanelId)) {\n const panelNode = createDashboardPanelNode(dashboardId, panelId);\n nextLayout =\n layoutType === 'grid'\n ? appendPanelToGridLayout(\n nextLayout,\n dashboardId,\n panelNode,\n panelTypesByLayoutId[layoutPanelId],\n panelTypesByLayoutId,\n )\n : appendPanelToLayout(nextLayout, panelNode);\n existing.add(layoutPanelId);\n }\n }\n\n return nextLayout;\n}\n\nexport function isVgPlotPanelConfig(\n panel: MosaicDashboardPanelConfig,\n): panel is VgPlotPanelConfig {\n return panel.type === MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE;\n}\n\nexport function getMosaicDashboardPanelId(\n dashboardId: string,\n panelId: string,\n): string {\n return `dashboard:${dashboardId}:panel:${panelId}`;\n}\n\nexport function getMosaicDashboardDockId(dashboardId: string): string {\n return `dashboard:${dashboardId}:dock`;\n}\n\nexport function getMosaicDashboardGridId(dashboardId: string): string {\n return `dashboard:${dashboardId}:grid`;\n}\n\nexport function getMosaicDashboardSelectionName(dashboardId: string): string {\n return `dashboard:${dashboardId}:brush`;\n}\n\nfunction destroyDashboardRuntimeChart(\n chart: RetainedVgPlotChart | undefined,\n): void {\n if (!chart) return;\n destroyRetainedVgPlotChart(chart);\n}\n\nfunction evictDashboardSelection(\n state: MosaicDashboardStoreState,\n dashboardId: string,\n): void {\n state.mosaic.selections[\n getMosaicDashboardSelectionName(dashboardId)\n ]?.reset();\n}\n\nfunction shouldEvictPanelRuntimeForPatch(\n panel: MosaicDashboardPanelConfig,\n patch: Partial<Omit<MosaicDashboardPanelConfig, 'id'>>,\n): boolean {\n if (patch.type && patch.type !== panel.type) {\n return true;\n }\n\n if (panel.type === MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE) {\n return Boolean(\n patch.config &&\n Object.prototype.hasOwnProperty.call(patch.config, 'vgplot'),\n );\n }\n\n return false;\n}\n\nexport function resolveMosaicDashboardPanelSource(\n dashboard: MosaicDashboardEntry,\n panel: MosaicDashboardPanelConfig,\n): MosaicDashboardPanelSource | undefined {\n if (panel.source?.sqlQuery || panel.source?.tableName) {\n return panel.source;\n }\n return dashboard.selectedTable\n ? {tableName: dashboard.selectedTable}\n : undefined;\n}\n\nexport function createDefaultMosaicDashboardConfig(\n props?: Partial<MosaicDashboardSliceConfig>,\n): MosaicDashboardSliceConfig {\n return MosaicDashboardSliceConfig.parse({\n dashboardsById: {},\n ...props,\n });\n}\n\ntype CreateMosaicDashboardSliceProps = {\n config?: Partial<MosaicDashboardSliceConfig>;\n panelRenderers?: Record<string, MosaicDashboardPanelRenderer>;\n addPanelActions?: MosaicDashboardAddPanelAction[];\n chartTypes?: ChartTypeDefinition[];\n chartBuilders?: ChartBuilderTemplate[];\n};\nexport type {CreateMosaicDashboardSliceProps};\n\nexport function createMosaicDashboardSlice(\n props: CreateMosaicDashboardSliceProps = {},\n) {\n return createSlice<MosaicDashboardSliceState, MosaicDashboardStoreState>(\n (set, get) => ({\n mosaicDashboard: {\n config: createDefaultMosaicDashboardConfig(props.config),\n runtime: {\n retainedChartsByPanelId: {},\n },\n chartBuilders: props.chartBuilders,\n chartTypes: props.chartTypes,\n addPanelActions: props.addPanelActions ?? [],\n panelRenderers: props.panelRenderers ?? {},\n\n createDashboard(title, layoutType) {\n const dashboardId = createId();\n get().mosaicDashboard.ensureDashboard(dashboardId, title, layoutType);\n return dashboardId;\n },\n\n ensureDashboard(dashboardId, title, layoutType) {\n set((state) =>\n produce(state, (draft) => {\n const existing =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (existing) {\n if (title && existing.title !== title) {\n existing.title = title;\n existing.updatedAt = Date.now();\n }\n return;\n }\n draft.mosaicDashboard.config.dashboardsById[dashboardId] = {\n id: dashboardId,\n title: title ?? 'Dashboard',\n layoutType: layoutType ?? 'dock',\n selectedTable: undefined,\n panels: [],\n layout:\n layoutType === 'grid'\n ? createDashboardGridLayout(dashboardId)\n : null,\n updatedAt: Date.now(),\n };\n }),\n );\n },\n\n removeDashboard(dashboardId) {\n get().mosaicDashboard.evictDashboardRuntime(dashboardId, {\n resetSelection: true,\n });\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaicDashboard.config.dashboardsById[dashboardId];\n }),\n );\n },\n\n getDashboard(dashboardId) {\n return get().mosaicDashboard.config.dashboardsById[dashboardId];\n },\n\n setConfig(config: MosaicDashboardSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaicDashboard.config = config;\n }),\n );\n },\n\n setSelectedTable(dashboardId, tableName) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n dashboard.selectedTable = tableName;\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n\n registerPanelRenderer(type, renderer) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaicDashboard.panelRenderers[type] = renderer;\n }),\n );\n },\n\n unregisterPanelRenderer(type) {\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaicDashboard.panelRenderers[type];\n }),\n );\n },\n\n addPanel(dashboardId, panel) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n dashboard.panels.push(panel);\n const panelNode = createDashboardPanelNode(dashboardId, panel.id);\n const panelTypesByLayoutId = getDashboardPanelTypesByLayoutId(\n dashboardId,\n dashboard.panels,\n );\n dashboard.layout =\n dashboard.layoutType === 'grid'\n ? appendPanelToGridLayout(\n dashboard.layout,\n dashboardId,\n panelNode,\n panel.type,\n panelTypesByLayoutId,\n )\n : appendPanelToLayout(dashboard.layout, panelNode);\n dashboard.updatedAt = Date.now();\n }),\n );\n return panel.id;\n },\n\n updatePanel(dashboardId, panelId, patch) {\n const existing = get().mosaicDashboard.config.dashboardsById[\n dashboardId\n ]?.panels.find((candidate) => candidate.id === panelId);\n const shouldEvict = existing\n ? shouldEvictPanelRuntimeForPatch(existing, patch)\n : false;\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n const panel = dashboard.panels.find(\n (candidate) => candidate.id === panelId,\n );\n if (!panel) return;\n\n Object.assign(panel, patch);\n dashboard.updatedAt = Date.now();\n }),\n );\n if (shouldEvict) {\n get().mosaicDashboard.evictPanelRuntime(dashboardId, panelId);\n }\n },\n\n removePanel(dashboardId, panelId) {\n get().mosaicDashboard.evictPanelRuntime(dashboardId, panelId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n dashboard.panels = dashboard.panels.filter(\n (panel) => panel.id !== panelId,\n );\n dashboard.layout = removePanelFromLayout(\n dashboard.layout,\n getMosaicDashboardPanelId(dashboardId, panelId),\n );\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n\n getRetainedChart(dashboardId, panelId) {\n return get().mosaicDashboard.runtime.retainedChartsByPanelId[\n getMosaicDashboardPanelId(dashboardId, panelId)\n ];\n },\n\n setRetainedChart(dashboardId, panelId, chart) {\n const runtimePanelId = getMosaicDashboardPanelId(\n dashboardId,\n panelId,\n );\n const previous =\n get().mosaicDashboard.runtime.retainedChartsByPanelId[\n runtimePanelId\n ];\n if (previous && previous !== chart) {\n destroyDashboardRuntimeChart(previous);\n }\n set((state) => ({\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n [runtimePanelId]: chart,\n },\n },\n },\n }));\n },\n\n evictPanelRuntime(dashboardId, panelId) {\n const runtimePanelId = getMosaicDashboardPanelId(\n dashboardId,\n panelId,\n );\n const existing =\n get().mosaicDashboard.runtime.retainedChartsByPanelId[\n runtimePanelId\n ];\n destroyDashboardRuntimeChart(existing);\n set((state) => {\n const nextRetainedChartsByPanelId = {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n };\n delete nextRetainedChartsByPanelId[runtimePanelId];\n return {\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: nextRetainedChartsByPanelId,\n },\n },\n };\n });\n },\n\n evictDashboardRuntime(dashboardId, options) {\n const runtimePrefix = `dashboard:${dashboardId}:panel:`;\n const existingEntries = Object.entries(\n get().mosaicDashboard.runtime.retainedChartsByPanelId,\n ).filter(([runtimePanelId]) =>\n runtimePanelId.startsWith(runtimePrefix),\n );\n\n existingEntries.forEach(([, chart]) => {\n destroyDashboardRuntimeChart(chart);\n });\n\n if (options?.resetSelection) {\n evictDashboardSelection(get(), dashboardId);\n }\n\n set((state) => {\n const nextRetainedChartsByPanelId = {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n };\n for (const [runtimePanelId] of existingEntries) {\n delete nextRetainedChartsByPanelId[runtimePanelId];\n }\n return {\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: nextRetainedChartsByPanelId,\n },\n },\n };\n });\n },\n\n clearAllDashboardRuntime() {\n Object.values(\n get().mosaicDashboard.runtime.retainedChartsByPanelId,\n ).forEach((chart) => {\n destroyDashboardRuntimeChart(chart);\n });\n set((state) => ({\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: {},\n },\n },\n }));\n },\n\n setLayout(dashboardId, layout) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n const panelIds = dashboard.panels.map((panel) => panel.id);\n const panelTypesByLayoutId = getDashboardPanelTypesByLayoutId(\n dashboardId,\n dashboard.panels,\n );\n dashboard.layout = ensureLayoutContainsDashboardPanels(\n layout,\n dashboardId,\n panelIds,\n dashboard.layoutType,\n panelTypesByLayoutId,\n );\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n },\n }),\n );\n}\n\nexport function useStoreWithMosaicDashboard<T>(\n selector: (state: MosaicDashboardStoreState) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as MosaicDashboardStoreState),\n );\n}\n"]}
1
+ {"version":3,"file":"MosaicDashboardSlice.js","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {DbSliceState} from '@sqlrooms/db';\nimport {type DataTable, type DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {\n DEFAULT_GRID_COLS,\n getGridColsForBreakpoint,\n type LayoutSliceState,\n} from '@sqlrooms/layout';\nimport {\n type LayoutGridItem,\n type LayoutGridNode,\n type LayoutNode,\n type LayoutPanelNode,\n isLayoutGridNode,\n isLayoutNodeKey,\n isLayoutPanelNode,\n isLayoutSplitNode,\n LayoutNode as LayoutNodeSchema,\n} from '@sqlrooms/layout-config';\nimport {\n BaseRoomStoreState,\n createSlice,\n SliceFunctions,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport type {ComponentType} from 'react';\nimport {z} from 'zod';\nimport type {ChartTypeDefinition} from '../chart-types/base-types';\nimport {type MosaicSliceState} from '../MosaicSlice';\nimport {\n destroyRetainedVgPlotChart,\n type RetainedVgPlotChart,\n} from '../VgPlotChart';\nimport {ChartConfig} from '../chart-types/chart-config';\n\n/**\n * Panel key used for function-form panel definitions registered by\n * `MosaicDashboardPanels`. Individual dashboard panels are represented as\n * `LayoutPanelNode` entries whose `panel` property carries\n * `{ key: MOSAIC_DASHBOARD_PANEL, meta: { dashboardId, panelId } }`.\n */\nexport const MOSAIC_DASHBOARD_PANEL = 'mosaic-dashboard-panel';\nexport const MOSAIC_DASHBOARD_CHART_PANEL_TYPE = 'vgplot';\nexport const MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE = 'profiler';\nexport const MOSAIC_DASHBOARD_TEXT_PANEL_TYPE = 'text';\n\nexport const MosaicDashboardLayoutType = z.enum(['dock', 'grid']);\nexport type MosaicDashboardLayoutType = z.infer<\n typeof MosaicDashboardLayoutType\n>;\n\nexport const MosaicDashboardPanelSource = z.object({\n tableName: z.string().optional(),\n sqlQuery: z.string().optional(),\n});\nexport type MosaicDashboardPanelSource = z.infer<\n typeof MosaicDashboardPanelSource\n>;\n\n// Profiler panel config\nexport const ProfilerPanelConfig = z.object({\n pageSize: z.number().optional(),\n});\nexport type ProfilerPanelConfig = z.infer<typeof ProfilerPanelConfig>;\n\n// Text panel config\nexport const TextPanelConfig = z.object({\n content: z.string().default(''),\n toolbarOpen: z.boolean().default(true),\n sourcePanelOpen: z.boolean().default(false),\n});\nexport type TextPanelConfig = z.infer<typeof TextPanelConfig>;\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 ProfilerPanel = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE),\n title: z.string().default('Panel'),\n source: MosaicDashboardPanelSource.optional(),\n config: ProfilerPanelConfig,\n});\nexport type ProfilerPanel = z.infer<typeof ProfilerPanel>;\n\nexport const TextPanel = z.object({\n id: z.string(),\n type: z.literal(MOSAIC_DASHBOARD_TEXT_PANEL_TYPE),\n title: z.string().default('Text'),\n source: MosaicDashboardPanelSource.optional(),\n config: TextPanelConfig,\n});\nexport type TextPanel = z.infer<typeof TextPanel>;\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, ProfilerPanel, TextPanel])\n .or(LegacyPanelConfig);\nexport type MosaicDashboardPanelConfig = z.infer<\n typeof MosaicDashboardPanelConfig\n>;\n\nexport type MosaicDashboardPanelRendererProps<\n TPanel extends MosaicDashboardPanelConfig = MosaicDashboardPanelConfig,\n> = {\n dashboardId: string;\n dashboard: MosaicDashboardEntry;\n panel: TPanel;\n selectionName: string;\n resolvedSource?: MosaicDashboardPanelSource;\n};\n\nexport type ChartPanelRendererProps =\n MosaicDashboardPanelRendererProps<ChartPanelConfig>;\nexport type ProfilerPanelRendererProps =\n MosaicDashboardPanelRendererProps<ProfilerPanel>;\nexport type TextPanelRendererProps =\n MosaicDashboardPanelRendererProps<TextPanel>;\n\nexport type MosaicDashboardPanelRenderer<\n TPanel extends MosaicDashboardPanelConfig = MosaicDashboardPanelConfig,\n> = {\n component: ComponentType<MosaicDashboardPanelRendererProps<TPanel>>;\n headerActions?: ComponentType<MosaicDashboardPanelRendererProps<TPanel>>;\n icon?: ComponentType<{className?: string}>;\n};\n\n// Type-erased renderer for storage (avoids circular dependency issues)\nexport type AnyPanelRenderer = {\n component: ComponentType<any>;\n headerActions?: ComponentType<any>;\n icon?: ComponentType<{className?: string}>;\n};\n\n// Map of panel type string to panel config type\nexport type PanelTypeMap = {\n [MOSAIC_DASHBOARD_CHART_PANEL_TYPE]: ChartPanelConfig;\n [MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]: ProfilerPanel;\n [MOSAIC_DASHBOARD_TEXT_PANEL_TYPE]: TextPanel;\n};\n\n// Panel renderers record - use type-erased renderers for runtime compatibility\nexport type PanelRenderersRecord = Record<string, AnyPanelRenderer>;\n\nexport type MosaicDashboardAddPanelActionContext = {\n dashboardId: string;\n dashboard: MosaicDashboardEntry | undefined;\n selectedTable: DataTable | undefined;\n tables: DataTable[];\n};\n\nexport type MosaicDashboardAddPanelAction = {\n type: string;\n label: string;\n icon?: ComponentType<{className?: string}>;\n isEnabled?: (context: MosaicDashboardAddPanelActionContext) => boolean;\n createPanel: (\n context: MosaicDashboardAddPanelActionContext,\n ) => MosaicDashboardPanelConfig | undefined;\n};\n\nexport function createMosaicDashboardPanelConfig(options: {\n type: string;\n title: string;\n source?: MosaicDashboardPanelSource;\n config?: Record<string, unknown>;\n}): MosaicDashboardPanelConfig {\n return {\n id: createId(),\n type: options.type,\n title: options.title,\n source: options.source,\n config: options.config ?? {},\n };\n}\n\nexport function createMosaicDashboardChartPanelConfig(\n title: string,\n config: ChartConfig,\n source?: MosaicDashboardPanelSource,\n): ChartPanelConfig {\n return {\n id: createId(),\n type: MOSAIC_DASHBOARD_CHART_PANEL_TYPE,\n title,\n source,\n config,\n };\n}\n\nexport function createMosaicDashboardProfilerPanelConfig(\n options: {\n title?: string;\n source?: MosaicDashboardPanelSource;\n pageSize?: number;\n } = {},\n): MosaicDashboardPanelConfig {\n return createMosaicDashboardPanelConfig({\n type: MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n title: options.title ?? 'Profiler',\n source: options.source,\n config: {\n pageSize: options.pageSize ?? 10,\n },\n });\n}\n\nexport function createMosaicDashboardTextPanelConfig(\n options: {\n title?: string;\n content?: string;\n source?: MosaicDashboardPanelSource;\n } = {},\n): MosaicDashboardPanelConfig {\n return {\n id: createId(),\n type: MOSAIC_DASHBOARD_TEXT_PANEL_TYPE,\n title: options.title ?? 'Text',\n source: options.source,\n config: {\n content: options.content ?? '',\n },\n };\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\nexport const MosaicDashboardSliceConfig = z.object({\n dashboardsById: z.record(z.string(), MosaicDashboardEntry).default({}),\n});\nexport type MosaicDashboardSliceConfig = z.infer<\n typeof MosaicDashboardSliceConfig\n>;\n\nexport type MosaicDashboardSliceState = {\n mosaicDashboard: SliceFunctions & {\n config: MosaicDashboardSliceConfig;\n runtime: {\n /**\n * Live vgplot chart instances retained across transient dashboard panel\n * remounts, keyed by `getMosaicDashboardPanelId(dashboardId, panelId)`.\n *\n * This is runtime-only state: entries are never serialized with dashboard\n * config and must be evicted when their panel/dashboard lifecycle ends.\n */\n retainedChartsByPanelId: Record<string, RetainedVgPlotChart>;\n };\n chartTypes?: ChartTypeDefinition[];\n addPanelActions: MosaicDashboardAddPanelAction[];\n createDashboard: (\n title?: string,\n layoutType?: MosaicDashboardLayoutType,\n ) => string;\n ensureDashboard: (\n dashboardId: string,\n title?: string,\n layoutType?: MosaicDashboardLayoutType,\n ) => void;\n removeDashboard: (dashboardId: string) => void;\n getDashboard: (dashboardId: string) => MosaicDashboardEntry | undefined;\n setSelectedTable: (dashboardId: string, tableName: string) => void;\n panelRenderers: PanelRenderersRecord;\n registerPanelRenderer: (type: string, renderer: AnyPanelRenderer) => void;\n unregisterPanelRenderer: (type: string) => void;\n addPanel: (\n dashboardId: string,\n panel: MosaicDashboardPanelConfig,\n ) => MosaicDashboardPanelConfig['id'];\n updatePanel: (\n dashboardId: string,\n panelId: string,\n patch: Partial<Omit<MosaicDashboardPanelConfig, 'id'>>,\n ) => void;\n removePanel: (dashboardId: string, panelId: string) => void;\n getRetainedChart: (\n dashboardId: string,\n panelId: string,\n ) => RetainedVgPlotChart | undefined;\n setRetainedChart: (\n dashboardId: string,\n panelId: string,\n chart: RetainedVgPlotChart,\n ) => void;\n evictPanelRuntime: (dashboardId: string, panelId: string) => void;\n evictDashboardRuntime: (\n dashboardId: string,\n options?: {resetSelection?: boolean},\n ) => void;\n clearAllDashboardRuntime: () => void;\n setLayout: (dashboardId: string, layout: LayoutNode | null) => void;\n };\n};\n\nexport type MosaicDashboardStoreState = BaseRoomStoreState &\n DbSliceState &\n DuckDbSliceState &\n LayoutSliceState &\n MosaicSliceState &\n MosaicDashboardSliceState;\n\ntype DashboardPanelTypesByLayoutId = Record<string, string | undefined>;\n\n// ---------------------------------------------------------------------------\n// Layout tree helpers (operate on the new LayoutNode types)\n// ---------------------------------------------------------------------------\n\nfunction createDashboardPanelNode(\n dashboardId: string,\n panelId: string,\n): LayoutPanelNode {\n return {\n type: 'panel',\n id: getMosaicDashboardPanelId(dashboardId, panelId),\n minSize: 200,\n panel: {\n key: MOSAIC_DASHBOARD_PANEL,\n meta: {dashboardId, panelId},\n },\n };\n}\n\nfunction getDashboardPanelTypesByLayoutId(\n dashboardId: string,\n panels: MosaicDashboardPanelConfig[],\n): DashboardPanelTypesByLayoutId {\n return Object.fromEntries(\n panels.map((panel) => [\n getMosaicDashboardPanelId(dashboardId, panel.id),\n panel.type,\n ]),\n );\n}\n\nfunction appendPanelToLayout(\n layout: LayoutNode | null,\n panelNode: LayoutPanelNode,\n): LayoutNode {\n if (!layout) {\n return panelNode;\n }\n return {\n type: 'split',\n id: `split-${createId()}`,\n direction: 'row',\n children: [layout, panelNode],\n };\n}\n\nfunction createDashboardGridLayout(\n dashboardId: string,\n panelNode?: LayoutPanelNode,\n): LayoutGridNode {\n const children = panelNode ? [panelNode] : [];\n const layouts = createDashboardGridLayoutsForChildren(children);\n return {\n type: 'grid',\n id: getMosaicDashboardGridId(dashboardId),\n children,\n rowHeight: 150,\n margin: [12, 12],\n containerPadding: [0, 0],\n compactType: 'vertical',\n preventCollision: false,\n resizeHandles: ['e', 's', 'w', 'se', 'sw'],\n layouts,\n };\n}\n\nfunction getLayoutChildId(node: LayoutNode): string {\n return isLayoutNodeKey(node) ? node : node.id;\n}\n\nfunction createDashboardGridItem(\n panelId: string,\n layout: LayoutGridItem[],\n cols = 12,\n panelType?: string,\n): LayoutGridItem {\n const effectiveCols = Math.max(1, cols);\n const w =\n panelType === MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE\n ? effectiveCols\n : Math.max(1, Math.ceil(effectiveCols / 2));\n const h = 2;\n const bottom = layout.reduce(\n (max, item) => Math.max(max, item.y + item.h),\n 0,\n );\n\n for (let y = 0; y <= bottom; y += 1) {\n for (let x = 0; x <= effectiveCols - w; x += 1) {\n const overlaps = layout.some(\n (item) =>\n x < item.x + item.w &&\n x + w > item.x &&\n y < item.y + item.h &&\n y + h > item.y,\n );\n if (!overlaps) {\n return {\n i: panelId,\n x,\n y,\n w,\n h,\n };\n }\n }\n }\n\n return {\n i: panelId,\n x: 0,\n y: bottom,\n w,\n h,\n };\n}\n\nfunction createDashboardGridLayoutsForChildren(\n children: LayoutNode[],\n sourceLayouts?: LayoutGridNode['layouts'],\n cols?: LayoutGridNode['cols'],\n panelTypesByLayoutId: Record<string, string | undefined> = {},\n): LayoutGridNode['layouts'] {\n const childIds = new Set(children.map((child) => getLayoutChildId(child)));\n const sourceEntries = new Map<string, LayoutGridItem[]>(\n Object.keys(DEFAULT_GRID_COLS).map((breakpoint) => [breakpoint, []]),\n );\n for (const [breakpoint, breakpointLayout] of Object.entries(\n sourceLayouts ?? {},\n )) {\n sourceEntries.set(breakpoint, breakpointLayout);\n }\n\n return Object.fromEntries(\n [...sourceEntries.entries()].map(([breakpoint, breakpointLayout]) => {\n const nextLayout = breakpointLayout.filter((item) =>\n childIds.has(item.i),\n );\n const layoutItemIds = new Set(nextLayout.map((item) => item.i));\n\n for (const child of children) {\n const childId = getLayoutChildId(child);\n if (!layoutItemIds.has(childId)) {\n const item = createDashboardGridItem(\n childId,\n nextLayout,\n getGridColsForBreakpoint(cols, breakpoint),\n panelTypesByLayoutId[childId],\n );\n nextLayout.push(item);\n layoutItemIds.add(childId);\n }\n }\n\n return [breakpoint, nextLayout];\n }),\n );\n}\n\nfunction isExpectedDashboardPanelNode(\n node: LayoutNode,\n expectedPanelIds: Set<string>,\n): boolean {\n return expectedPanelIds.has(getLayoutChildId(node));\n}\n\nfunction collectDashboardPanelNodes(\n layout: LayoutNode | null,\n expectedPanelIds: Set<string>,\n nodes: LayoutNode[] = [],\n seen = new Set<string>(),\n): LayoutNode[] {\n if (!layout) return nodes;\n\n if (isLayoutNodeKey(layout) || isLayoutPanelNode(layout)) {\n if (isExpectedDashboardPanelNode(layout, expectedPanelIds)) {\n const id = getLayoutChildId(layout);\n if (!seen.has(id)) {\n nodes.push(layout);\n seen.add(id);\n }\n }\n return nodes;\n }\n\n if (isLayoutSplitNode(layout) || isLayoutGridNode(layout)) {\n for (const child of layout.children) {\n collectDashboardPanelNodes(child, expectedPanelIds, nodes, seen);\n }\n }\n\n return nodes;\n}\n\nfunction normalizeDashboardGridLayout(\n layout: LayoutNode | null,\n dashboardId: string,\n expectedPanelIds: Set<string>,\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutGridNode {\n const collectedPanelIds = collectPanelIds(layout);\n const existingExpectedPanelIds = new Set(\n [...expectedPanelIds].filter((panelId) => collectedPanelIds.has(panelId)),\n );\n const children = collectDashboardPanelNodes(layout, existingExpectedPanelIds);\n const layouts = createDashboardGridLayoutsForChildren(\n children,\n isLayoutGridNode(layout) ? layout.layouts : undefined,\n isLayoutGridNode(layout) ? layout.cols : undefined,\n panelTypesByLayoutId,\n );\n\n if (isLayoutGridNode(layout)) {\n return {\n ...layout,\n children,\n layouts,\n };\n }\n\n return {\n ...createDashboardGridLayout(dashboardId),\n children,\n layouts,\n };\n}\n\nfunction appendPanelToGridLayout(\n layout: LayoutNode | null,\n dashboardId: string,\n panelNode: LayoutPanelNode,\n panelType?: string,\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutGridNode {\n const nextPanelTypesByLayoutId = {\n ...panelTypesByLayoutId,\n [panelNode.id]: panelType ?? panelTypesByLayoutId[panelNode.id],\n };\n\n if (!isLayoutGridNode(layout)) {\n const dashboardPanelPrefix = `dashboard:${dashboardId}:panel:`;\n const expectedPanelIds = new Set(\n [...collectPanelIds(layout)].filter((panelId) =>\n panelId.startsWith(dashboardPanelPrefix),\n ),\n );\n expectedPanelIds.add(panelNode.id);\n const normalizedLayout = normalizeDashboardGridLayout(\n layout,\n dashboardId,\n expectedPanelIds,\n nextPanelTypesByLayoutId,\n );\n return appendPanelToGridLayout(\n normalizedLayout,\n dashboardId,\n panelNode,\n panelType,\n nextPanelTypesByLayoutId,\n );\n }\n\n const hasChild = layout.children.some((child) => {\n if (isLayoutNodeKey(child)) return child === panelNode.id;\n return child.id === panelNode.id;\n });\n const children = hasChild ? layout.children : [...layout.children, panelNode];\n const layouts = Object.fromEntries(\n Object.entries(\n createDashboardGridLayoutsForChildren(\n children,\n layout.layouts,\n layout.cols,\n nextPanelTypesByLayoutId,\n ) ?? {},\n ).map(([breakpoint, breakpointLayout]) => {\n if (breakpointLayout.some((item) => item.i === panelNode.id)) {\n return [breakpoint, breakpointLayout];\n }\n return [\n breakpoint,\n [\n ...breakpointLayout,\n createDashboardGridItem(\n panelNode.id,\n breakpointLayout,\n getGridColsForBreakpoint(layout.cols, breakpoint),\n nextPanelTypesByLayoutId[panelNode.id],\n ),\n ],\n ];\n }),\n );\n\n return {\n ...layout,\n children,\n layouts,\n };\n}\n\nfunction removePanelFromLayout(\n layout: LayoutNode | null,\n panelId: string,\n): LayoutNode | null {\n if (!layout) return null;\n\n if (isLayoutNodeKey(layout)) {\n return layout === panelId ? null : layout;\n }\n\n if (isLayoutPanelNode(layout)) {\n return layout.id === panelId ? null : layout;\n }\n\n if (isLayoutSplitNode(layout)) {\n const nextChildren = layout.children\n .map((child) => removePanelFromLayout(child, panelId))\n .filter((child): child is LayoutNode => child !== null);\n\n if (nextChildren.length === 0) return null;\n if (nextChildren.length === 1) return nextChildren[0] ?? null;\n\n return {...layout, children: nextChildren};\n }\n\n if (isLayoutGridNode(layout)) {\n const nextChildren = layout.children.filter((child) => {\n if (isLayoutNodeKey(child)) return child !== panelId;\n return child.id !== panelId;\n });\n const nextLayouts = layout.layouts\n ? Object.fromEntries(\n Object.entries(layout.layouts).map(\n ([breakpoint, breakpointLayout]) => [\n breakpoint,\n breakpointLayout.filter((item) => item.i !== panelId),\n ],\n ),\n )\n : layout.layouts;\n\n if (nextChildren.length === 0) return null;\n return {...layout, children: nextChildren, layouts: nextLayouts};\n }\n\n return layout;\n}\n\nfunction collectPanelIds(\n layout: LayoutNode | null,\n panelIds = new Set<string>(),\n): Set<string> {\n if (!layout) return panelIds;\n if (isLayoutNodeKey(layout)) {\n panelIds.add(layout);\n return panelIds;\n }\n if (isLayoutPanelNode(layout)) {\n panelIds.add(layout.id);\n return panelIds;\n }\n if (isLayoutSplitNode(layout)) {\n for (const child of layout.children) {\n collectPanelIds(child, panelIds);\n }\n }\n if (isLayoutGridNode(layout)) {\n for (const child of layout.children) {\n collectPanelIds(child, panelIds);\n }\n }\n return panelIds;\n}\n\nfunction ensureLayoutContainsDashboardPanels(\n layout: LayoutNode | null,\n dashboardId: string,\n panelIds: string[],\n layoutType: MosaicDashboardLayoutType = 'dock',\n panelTypesByLayoutId: DashboardPanelTypesByLayoutId = {},\n): LayoutNode | null {\n let nextLayout = layout;\n\n if (layoutType === 'grid') {\n const expectedPanelIds = new Set(\n panelIds.map((panelId) =>\n getMosaicDashboardPanelId(dashboardId, panelId),\n ),\n );\n nextLayout = normalizeDashboardGridLayout(\n nextLayout,\n dashboardId,\n expectedPanelIds,\n panelTypesByLayoutId,\n );\n }\n\n const existing = collectPanelIds(nextLayout);\n for (const panelId of panelIds) {\n const layoutPanelId = getMosaicDashboardPanelId(dashboardId, panelId);\n if (!existing.has(layoutPanelId)) {\n const panelNode = createDashboardPanelNode(dashboardId, panelId);\n nextLayout =\n layoutType === 'grid'\n ? appendPanelToGridLayout(\n nextLayout,\n dashboardId,\n panelNode,\n panelTypesByLayoutId[layoutPanelId],\n panelTypesByLayoutId,\n )\n : appendPanelToLayout(nextLayout, panelNode);\n existing.add(layoutPanelId);\n }\n }\n\n return nextLayout;\n}\n\nexport function isChartPanelConfig(\n panel: MosaicDashboardPanelConfig,\n): panel is ChartPanelConfig {\n return panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE;\n}\n\nexport function getMosaicDashboardPanelId(\n dashboardId: string,\n panelId: string,\n): string {\n return `dashboard:${dashboardId}:panel:${panelId}`;\n}\n\nexport function getMosaicDashboardDockId(dashboardId: string): string {\n return `dashboard:${dashboardId}:dock`;\n}\n\nexport function getMosaicDashboardGridId(dashboardId: string): string {\n return `dashboard:${dashboardId}:grid`;\n}\n\nexport function getMosaicDashboardSelectionName(dashboardId: string): string {\n return `dashboard:${dashboardId}:brush`;\n}\n\nfunction destroyDashboardRuntimeChart(\n chart: RetainedVgPlotChart | undefined,\n): void {\n if (!chart) return;\n destroyRetainedVgPlotChart(chart);\n}\n\nfunction evictDashboardSelection(\n state: MosaicDashboardStoreState,\n dashboardId: string,\n): void {\n state.mosaic.selections[\n getMosaicDashboardSelectionName(dashboardId)\n ]?.reset();\n}\n\nfunction shouldEvictPanelRuntimeForPatch(\n panel: MosaicDashboardPanelConfig,\n patch: Partial<Omit<MosaicDashboardPanelConfig, 'id'>>,\n): boolean {\n if (patch.type && patch.type !== panel.type) {\n return true;\n }\n\n if (panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE) {\n return Boolean('config' in patch && patch.config);\n }\n\n return false;\n}\n\n/**\n * Type guard to check if a panel config has a source property.\n * All standard panel types (Chart, Profiler, Text) have optional sources.\n */\nexport function panelHasSource(\n panel: MosaicDashboardPanelConfig,\n): panel is ChartPanelConfig | ProfilerPanel | TextPanel {\n return (\n panel.type === MOSAIC_DASHBOARD_CHART_PANEL_TYPE ||\n panel.type === MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE ||\n panel.type === MOSAIC_DASHBOARD_TEXT_PANEL_TYPE\n );\n}\n\nexport function resolveMosaicDashboardPanelSource(\n dashboard: MosaicDashboardEntry,\n panel: MosaicDashboardPanelConfig,\n): MosaicDashboardPanelSource | undefined {\n if (!panelHasSource(panel)) {\n return undefined;\n }\n if (panel.source?.sqlQuery || panel.source?.tableName) {\n return panel.source;\n }\n // Text panels typically don't need a table source\n if (panel.type === MOSAIC_DASHBOARD_TEXT_PANEL_TYPE) {\n return undefined;\n }\n return dashboard.selectedTable\n ? {tableName: dashboard.selectedTable}\n : undefined;\n}\n\nexport function createDefaultMosaicDashboardConfig(\n props?: Partial<MosaicDashboardSliceConfig>,\n): MosaicDashboardSliceConfig {\n return MosaicDashboardSliceConfig.parse({\n dashboardsById: {},\n ...props,\n });\n}\n\ntype CreateMosaicDashboardSliceProps = {\n config?: Partial<MosaicDashboardSliceConfig>;\n panelRenderers?: Record<string, MosaicDashboardPanelRenderer>;\n addPanelActions?: MosaicDashboardAddPanelAction[];\n chartTypes?: ChartTypeDefinition[];\n};\nexport type {CreateMosaicDashboardSliceProps};\n\nexport function createMosaicDashboardSlice(\n props: CreateMosaicDashboardSliceProps = {},\n) {\n return createSlice<MosaicDashboardSliceState, MosaicDashboardStoreState>(\n (set, get) => ({\n mosaicDashboard: {\n config: createDefaultMosaicDashboardConfig(props.config),\n runtime: {\n retainedChartsByPanelId: {},\n },\n chartTypes: props.chartTypes,\n addPanelActions: props.addPanelActions ?? [],\n panelRenderers: props.panelRenderers ?? {},\n\n createDashboard(title, layoutType) {\n const dashboardId = createId();\n get().mosaicDashboard.ensureDashboard(dashboardId, title, layoutType);\n return dashboardId;\n },\n\n ensureDashboard(dashboardId, title, layoutType) {\n set((state) =>\n produce(state, (draft) => {\n const existing =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (existing) {\n if (title && existing.title !== title) {\n existing.title = title;\n existing.updatedAt = Date.now();\n }\n return;\n }\n draft.mosaicDashboard.config.dashboardsById[dashboardId] = {\n id: dashboardId,\n title: title ?? 'Dashboard',\n layoutType: layoutType ?? 'dock',\n selectedTable: undefined,\n panels: [],\n layout:\n layoutType === 'grid'\n ? createDashboardGridLayout(dashboardId)\n : null,\n updatedAt: Date.now(),\n };\n }),\n );\n },\n\n removeDashboard(dashboardId) {\n get().mosaicDashboard.evictDashboardRuntime(dashboardId, {\n resetSelection: true,\n });\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaicDashboard.config.dashboardsById[dashboardId];\n }),\n );\n },\n\n getDashboard(dashboardId) {\n return get().mosaicDashboard.config.dashboardsById[dashboardId];\n },\n\n setConfig(config: MosaicDashboardSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaicDashboard.config = config;\n }),\n );\n },\n\n setSelectedTable(dashboardId, tableName) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n dashboard.selectedTable = tableName;\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n\n registerPanelRenderer(type, renderer) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaicDashboard.panelRenderers[type] = renderer;\n }),\n );\n },\n\n unregisterPanelRenderer(type) {\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaicDashboard.panelRenderers[type];\n }),\n );\n },\n\n addPanel(dashboardId, panel) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n dashboard.panels.push(panel);\n const panelNode = createDashboardPanelNode(dashboardId, panel.id);\n const panelTypesByLayoutId = getDashboardPanelTypesByLayoutId(\n dashboardId,\n dashboard.panels,\n );\n dashboard.layout =\n dashboard.layoutType === 'grid'\n ? appendPanelToGridLayout(\n dashboard.layout,\n dashboardId,\n panelNode,\n panel.type,\n panelTypesByLayoutId,\n )\n : appendPanelToLayout(dashboard.layout, panelNode);\n dashboard.updatedAt = Date.now();\n }),\n );\n return panel.id;\n },\n\n updatePanel(dashboardId, panelId, patch) {\n const existing = get().mosaicDashboard.config.dashboardsById[\n dashboardId\n ]?.panels.find((candidate) => candidate.id === panelId);\n const shouldEvict = existing\n ? shouldEvictPanelRuntimeForPatch(existing, patch)\n : false;\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n const panel = dashboard.panels.find(\n (candidate) => candidate.id === panelId,\n );\n if (!panel) return;\n\n Object.assign(panel, patch);\n dashboard.updatedAt = Date.now();\n }),\n );\n if (shouldEvict) {\n get().mosaicDashboard.evictPanelRuntime(dashboardId, panelId);\n }\n },\n\n removePanel(dashboardId, panelId) {\n get().mosaicDashboard.evictPanelRuntime(dashboardId, panelId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n dashboard.panels = dashboard.panels.filter(\n (panel) => panel.id !== panelId,\n );\n dashboard.layout = removePanelFromLayout(\n dashboard.layout,\n getMosaicDashboardPanelId(dashboardId, panelId),\n );\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n\n getRetainedChart(dashboardId, panelId) {\n return get().mosaicDashboard.runtime.retainedChartsByPanelId[\n getMosaicDashboardPanelId(dashboardId, panelId)\n ];\n },\n\n setRetainedChart(dashboardId, panelId, chart) {\n const runtimePanelId = getMosaicDashboardPanelId(\n dashboardId,\n panelId,\n );\n const previous =\n get().mosaicDashboard.runtime.retainedChartsByPanelId[\n runtimePanelId\n ];\n if (previous && previous !== chart) {\n destroyDashboardRuntimeChart(previous);\n }\n set((state) => ({\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n [runtimePanelId]: chart,\n },\n },\n },\n }));\n },\n\n evictPanelRuntime(dashboardId, panelId) {\n const runtimePanelId = getMosaicDashboardPanelId(\n dashboardId,\n panelId,\n );\n const existing =\n get().mosaicDashboard.runtime.retainedChartsByPanelId[\n runtimePanelId\n ];\n destroyDashboardRuntimeChart(existing);\n set((state) => {\n const nextRetainedChartsByPanelId = {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n };\n delete nextRetainedChartsByPanelId[runtimePanelId];\n return {\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: nextRetainedChartsByPanelId,\n },\n },\n };\n });\n },\n\n evictDashboardRuntime(dashboardId, options) {\n const runtimePrefix = `dashboard:${dashboardId}:panel:`;\n const existingEntries = Object.entries(\n get().mosaicDashboard.runtime.retainedChartsByPanelId,\n ).filter(([runtimePanelId]) =>\n runtimePanelId.startsWith(runtimePrefix),\n );\n\n existingEntries.forEach(([, chart]) => {\n destroyDashboardRuntimeChart(chart);\n });\n\n if (options?.resetSelection) {\n evictDashboardSelection(get(), dashboardId);\n }\n\n set((state) => {\n const nextRetainedChartsByPanelId = {\n ...state.mosaicDashboard.runtime.retainedChartsByPanelId,\n };\n for (const [runtimePanelId] of existingEntries) {\n delete nextRetainedChartsByPanelId[runtimePanelId];\n }\n return {\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: nextRetainedChartsByPanelId,\n },\n },\n };\n });\n },\n\n clearAllDashboardRuntime() {\n Object.values(\n get().mosaicDashboard.runtime.retainedChartsByPanelId,\n ).forEach((chart) => {\n destroyDashboardRuntimeChart(chart);\n });\n set((state) => ({\n mosaicDashboard: {\n ...state.mosaicDashboard,\n runtime: {\n ...state.mosaicDashboard.runtime,\n retainedChartsByPanelId: {},\n },\n },\n }));\n },\n\n setLayout(dashboardId, layout) {\n get().mosaicDashboard.ensureDashboard(dashboardId);\n set((state) =>\n produce(state, (draft) => {\n const dashboard =\n draft.mosaicDashboard.config.dashboardsById[dashboardId];\n if (!dashboard) return;\n\n const panelIds = dashboard.panels.map((panel) => panel.id);\n const panelTypesByLayoutId = getDashboardPanelTypesByLayoutId(\n dashboardId,\n dashboard.panels,\n );\n dashboard.layout = ensureLayoutContainsDashboardPanels(\n layout,\n dashboardId,\n panelIds,\n dashboard.layoutType,\n panelTypesByLayoutId,\n );\n dashboard.updatedAt = Date.now();\n }),\n );\n },\n },\n }),\n );\n}\n\nexport function useStoreWithMosaicDashboard<T>(\n selector: (state: MosaicDashboardStoreState) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as MosaicDashboardStoreState),\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardToolbar.d.ts","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAW1D,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAgN1C,CAAC"}
1
+ {"version":3,"file":"MosaicDashboardToolbar.d.ts","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAa1D,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EA2N1C,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Popover, PopoverContent, PopoverTrigger, } from '@sqlrooms/ui';
3
- import { BarChart3, Check, ChevronsUpDown, Plus, TableProperties, } from 'lucide-react';
3
+ import { BarChart3, Check, ChevronsUpDown, FileText, Plus, TableProperties, } from 'lucide-react';
4
4
  import { useEffect, useMemo, useState } from 'react';
5
5
  import { useMosaicDashboardContext } from './MosaicDashboardContext';
6
- import { createMosaicDashboardProfilerPanelConfig, getMosaicDashboardSelectionName, MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE, useStoreWithMosaicDashboard, } from './MosaicDashboardSlice';
6
+ import { createMosaicDashboardProfilerPanelConfig, createMosaicDashboardTextPanelConfig, getMosaicDashboardSelectionName, MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE, MOSAIC_DASHBOARD_TEXT_PANEL_TYPE, useStoreWithMosaicDashboard, } from './MosaicDashboardSlice';
7
7
  export const MosaicDashboardToolbar = () => {
8
8
  const { dashboardId, canCreateChart, addDefaultChart } = useMosaicDashboardContext();
9
9
  const dashboard = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.config.dashboardsById[dashboardId]);
@@ -20,6 +20,7 @@ export const MosaicDashboardToolbar = () => {
20
20
  const [tablePickerOpen, setTablePickerOpen] = useState(false);
21
21
  const canAddProfiler = Boolean(dashboard?.selectedTable &&
22
22
  panelRenderers[MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]);
23
+ const canAddText = Boolean(panelRenderers[MOSAIC_DASHBOARD_TEXT_PANEL_TYPE]);
23
24
  const addPanelActionContext = useMemo(() => ({
24
25
  dashboardId,
25
26
  dashboard,
@@ -33,7 +34,7 @@ export const MosaicDashboardToolbar = () => {
33
34
  : true,
34
35
  })), [addPanelActionContext, addPanelActions]);
35
36
  const canAddCustomPanel = addPanelActionEntries.some((entry) => entry.enabled);
36
- const canAddAnyPanel = canCreateChart || canAddProfiler || canAddCustomPanel;
37
+ const canAddAnyPanel = canCreateChart || canAddProfiler || canAddText || canAddCustomPanel;
37
38
  const [selectionVersion, setSelectionVersion] = useState(0);
38
39
  useEffect(() => {
39
40
  if (!dashboardSelection) {
@@ -61,6 +62,10 @@ export const MosaicDashboardToolbar = () => {
61
62
  : createMosaicDashboardProfilerPanelConfig();
62
63
  addPanel(dashboardId, panel);
63
64
  };
65
+ const handleAddText = () => {
66
+ const panel = createMosaicDashboardTextPanelConfig();
67
+ addPanel(dashboardId, panel);
68
+ };
64
69
  const handleAddCustomPanel = (action) => {
65
70
  const panel = action.createPanel(addPanelActionContext);
66
71
  if (panel) {
@@ -73,7 +78,7 @@ export const MosaicDashboardToolbar = () => {
73
78
  return (_jsxs("div", { className: "flex items-center justify-between border-b px-5 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: tablePickerOpen, onOpenChange: setTablePickerOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", role: "combobox", "aria-expanded": tablePickerOpen, className: "w-[200px] justify-between", children: [_jsx("span", { className: "truncate", children: dashboard?.selectedTable || 'Select table…' }), _jsx(ChevronsUpDown, { className: "ml-1 h-3.5 w-3.5 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[220px] p-0", align: "start", children: _jsxs(Command, { children: [_jsx(CommandInput, { placeholder: "Search tables\u2026" }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: "No tables found." }), _jsx(CommandGroup, { children: tablesWithColumns.map((table) => (_jsxs(CommandItem, { value: table.tableName, onSelect: (value) => {
74
79
  setSelectedTable(dashboardId, value);
75
80
  setTablePickerOpen(false);
76
- }, children: [_jsx(Check, { className: `mr-2 h-3.5 w-3.5 ${dashboard?.selectedTable === table.tableName ? 'opacity-100' : 'opacity-0'}` }), table.tableName] }, table.tableName))) })] })] }) })] }), _jsx(Button, { variant: "link", size: "sm", className: "h-8 px-0", disabled: !hasActiveFilters, onClick: handleResetFilters, children: "Reset filters" })] }), _jsx("div", { className: "flex items-center gap-2", children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "outline", disabled: !canAddAnyPanel, children: [_jsx(Plus, { className: "mr-1 h-4 w-4" }), "Add"] }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsxs(DropdownMenuItem, { onClick: addDefaultChart, disabled: !canCreateChart, children: [_jsx(BarChart3, { className: "mr-2 h-4 w-4" }), "Chart"] }), _jsxs(DropdownMenuItem, { onClick: handleAddProfiler, disabled: !canAddProfiler, children: [_jsx(TableProperties, { className: "mr-2 h-4 w-4" }), "Profiler"] }), addPanelActionEntries.map(({ action, enabled }) => {
81
+ }, children: [_jsx(Check, { className: `mr-2 h-3.5 w-3.5 ${dashboard?.selectedTable === table.tableName ? 'opacity-100' : 'opacity-0'}` }), table.tableName] }, table.tableName))) })] })] }) })] }), _jsx(Button, { variant: "link", size: "sm", className: "h-8 px-0", disabled: !hasActiveFilters, onClick: handleResetFilters, children: "Reset filters" })] }), _jsx("div", { className: "flex items-center gap-2", children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "outline", disabled: !canAddAnyPanel, children: [_jsx(Plus, { className: "mr-1 h-4 w-4" }), "Add"] }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsxs(DropdownMenuItem, { onClick: addDefaultChart, disabled: !canCreateChart, children: [_jsx(BarChart3, { className: "mr-2 h-4 w-4" }), "Chart"] }), _jsxs(DropdownMenuItem, { onClick: handleAddProfiler, disabled: !canAddProfiler, children: [_jsx(TableProperties, { className: "mr-2 h-4 w-4" }), "Profiler"] }), _jsxs(DropdownMenuItem, { onClick: handleAddText, disabled: !canAddText, children: [_jsx(FileText, { className: "mr-2 h-4 w-4" }), "Text"] }), addPanelActionEntries.map(({ action, enabled }) => {
77
82
  const Icon = action.icon;
78
83
  return (_jsxs(DropdownMenuItem, { onClick: () => handleAddCustomPanel(action), disabled: !enabled, children: [Icon ? _jsx(Icon, { className: "mr-2 h-4 w-4" }) : null, action.label] }, action.type));
79
84
  })] })] }) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"MosaicDashboardToolbar.js","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@sqlrooms/ui';\nimport {\n BarChart3,\n Check,\n ChevronsUpDown,\n Plus,\n TableProperties,\n} from 'lucide-react';\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {useMosaicDashboardContext} from './MosaicDashboardContext';\nimport {\n type MosaicDashboardAddPanelAction,\n type MosaicDashboardAddPanelActionContext,\n createMosaicDashboardProfilerPanelConfig,\n getMosaicDashboardSelectionName,\n MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n useStoreWithMosaicDashboard,\n} from './MosaicDashboardSlice';\n\nexport const MosaicDashboardToolbar: React.FC = () => {\n const {dashboardId, canCreateChart, addDefaultChart} =\n useMosaicDashboardContext();\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n const addPanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.addPanel,\n );\n const panelRenderers = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.panelRenderers,\n );\n const addPanelActions = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.addPanelActions,\n );\n const getSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.getSelection,\n );\n const dashboardSelectionName = getMosaicDashboardSelectionName(dashboardId);\n const dashboardSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.selections[dashboardSelectionName],\n );\n const tables = useStoreWithMosaicDashboard((state) => state.db.tables);\n const tablesWithColumns = useMemo(\n () => tables.filter((table) => table.columns && table.columns.length > 0),\n [tables],\n );\n const selectedTable = useMemo(\n () =>\n tablesWithColumns.find(\n (table) => table.tableName === dashboard?.selectedTable,\n ),\n [dashboard?.selectedTable, tablesWithColumns],\n );\n const [tablePickerOpen, setTablePickerOpen] = useState(false);\n const canAddProfiler = Boolean(\n dashboard?.selectedTable &&\n panelRenderers[MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE],\n );\n const addPanelActionContext = useMemo<MosaicDashboardAddPanelActionContext>(\n () => ({\n dashboardId,\n dashboard,\n selectedTable,\n tables: tablesWithColumns,\n }),\n [dashboard, dashboardId, selectedTable, tablesWithColumns],\n );\n const addPanelActionEntries = useMemo(\n () =>\n addPanelActions.map((action) => ({\n action,\n enabled: action.isEnabled\n ? action.isEnabled(addPanelActionContext)\n : true,\n })),\n [addPanelActionContext, addPanelActions],\n );\n const canAddCustomPanel = addPanelActionEntries.some(\n (entry) => entry.enabled,\n );\n const canAddAnyPanel = canCreateChart || canAddProfiler || canAddCustomPanel;\n const [selectionVersion, setSelectionVersion] = useState(0);\n\n useEffect(() => {\n if (!dashboardSelection) {\n getSelection(dashboardSelectionName, 'crossfilter');\n }\n }, [dashboardSelection, dashboardSelectionName, getSelection]);\n\n useEffect(() => {\n if (!dashboardSelection) {\n return;\n }\n\n const handleSelectionChange = () => {\n setSelectionVersion((value) => value + 1);\n };\n\n dashboardSelection.addEventListener('value', handleSelectionChange);\n return () => {\n dashboardSelection.removeEventListener('value', handleSelectionChange);\n };\n }, [dashboardSelection]);\n\n const hasActiveFilters = useMemo(\n () => Boolean(dashboardSelection?.clauses.length),\n [dashboardSelection, selectionVersion],\n );\n\n const handleAddProfiler = () => {\n const panel = dashboard?.selectedTable\n ? createMosaicDashboardProfilerPanelConfig({\n source: {tableName: dashboard.selectedTable},\n })\n : createMosaicDashboardProfilerPanelConfig();\n addPanel(dashboardId, panel);\n };\n\n const handleAddCustomPanel = (action: MosaicDashboardAddPanelAction) => {\n const panel = action.createPanel(addPanelActionContext);\n if (panel) {\n addPanel(dashboardId, panel);\n }\n };\n\n const handleResetFilters = () => {\n dashboardSelection?.reset();\n };\n\n return (\n <div className=\"flex items-center justify-between border-b px-5 py-2\">\n <div className=\"flex items-center gap-2\">\n <Popover open={tablePickerOpen} onOpenChange={setTablePickerOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n role=\"combobox\"\n aria-expanded={tablePickerOpen}\n className=\"w-[200px] justify-between\"\n >\n <span className=\"truncate\">\n {dashboard?.selectedTable || 'Select table…'}\n </span>\n <ChevronsUpDown className=\"ml-1 h-3.5 w-3.5 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder=\"Search tables…\" />\n <CommandList>\n <CommandEmpty>No tables found.</CommandEmpty>\n <CommandGroup>\n {tablesWithColumns.map((table) => (\n <CommandItem\n key={table.tableName}\n value={table.tableName}\n onSelect={(value) => {\n setSelectedTable(dashboardId, value);\n setTablePickerOpen(false);\n }}\n >\n <Check\n className={`mr-2 h-3.5 w-3.5 ${dashboard?.selectedTable === table.tableName ? 'opacity-100' : 'opacity-0'}`}\n />\n {table.tableName}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"h-8 px-0\"\n disabled={!hasActiveFilters}\n onClick={handleResetFilters}\n >\n Reset filters\n </Button>\n </div>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" disabled={!canAddAnyPanel}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Add\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={addDefaultChart}\n disabled={!canCreateChart}\n >\n <BarChart3 className=\"mr-2 h-4 w-4\" />\n Chart\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={handleAddProfiler}\n disabled={!canAddProfiler}\n >\n <TableProperties className=\"mr-2 h-4 w-4\" />\n Profiler\n </DropdownMenuItem>\n {addPanelActionEntries.map(({action, enabled}) => {\n const Icon = action.icon;\n return (\n <DropdownMenuItem\n key={action.type}\n onClick={() => handleAddCustomPanel(action)}\n disabled={!enabled}\n >\n {Icon ? <Icon className=\"mr-2 h-4 w-4\" /> : null}\n {action.label}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MosaicDashboardToolbar.js","sourceRoot":"","sources":["../../src/dashboard/MosaicDashboardToolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@sqlrooms/ui';\nimport {\n BarChart3,\n Check,\n ChevronsUpDown,\n FileText,\n Plus,\n TableProperties,\n} from 'lucide-react';\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {useMosaicDashboardContext} from './MosaicDashboardContext';\nimport {\n type MosaicDashboardAddPanelAction,\n type MosaicDashboardAddPanelActionContext,\n createMosaicDashboardProfilerPanelConfig,\n createMosaicDashboardTextPanelConfig,\n getMosaicDashboardSelectionName,\n MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n MOSAIC_DASHBOARD_TEXT_PANEL_TYPE,\n useStoreWithMosaicDashboard,\n} from './MosaicDashboardSlice';\n\nexport const MosaicDashboardToolbar: React.FC = () => {\n const {dashboardId, canCreateChart, addDefaultChart} =\n useMosaicDashboardContext();\n const dashboard = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.config.dashboardsById[dashboardId],\n );\n const setSelectedTable = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.setSelectedTable,\n );\n const addPanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.addPanel,\n );\n const panelRenderers = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.panelRenderers,\n );\n const addPanelActions = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.addPanelActions,\n );\n const getSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.getSelection,\n );\n const dashboardSelectionName = getMosaicDashboardSelectionName(dashboardId);\n const dashboardSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.selections[dashboardSelectionName],\n );\n const tables = useStoreWithMosaicDashboard((state) => state.db.tables);\n const tablesWithColumns = useMemo(\n () => tables.filter((table) => table.columns && table.columns.length > 0),\n [tables],\n );\n const selectedTable = useMemo(\n () =>\n tablesWithColumns.find(\n (table) => table.tableName === dashboard?.selectedTable,\n ),\n [dashboard?.selectedTable, tablesWithColumns],\n );\n const [tablePickerOpen, setTablePickerOpen] = useState(false);\n const canAddProfiler = Boolean(\n dashboard?.selectedTable &&\n panelRenderers[MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE],\n );\n const canAddText = Boolean(panelRenderers[MOSAIC_DASHBOARD_TEXT_PANEL_TYPE]);\n const addPanelActionContext = useMemo<MosaicDashboardAddPanelActionContext>(\n () => ({\n dashboardId,\n dashboard,\n selectedTable,\n tables: tablesWithColumns,\n }),\n [dashboard, dashboardId, selectedTable, tablesWithColumns],\n );\n const addPanelActionEntries = useMemo(\n () =>\n addPanelActions.map((action) => ({\n action,\n enabled: action.isEnabled\n ? action.isEnabled(addPanelActionContext)\n : true,\n })),\n [addPanelActionContext, addPanelActions],\n );\n const canAddCustomPanel = addPanelActionEntries.some(\n (entry) => entry.enabled,\n );\n const canAddAnyPanel =\n canCreateChart || canAddProfiler || canAddText || canAddCustomPanel;\n const [selectionVersion, setSelectionVersion] = useState(0);\n\n useEffect(() => {\n if (!dashboardSelection) {\n getSelection(dashboardSelectionName, 'crossfilter');\n }\n }, [dashboardSelection, dashboardSelectionName, getSelection]);\n\n useEffect(() => {\n if (!dashboardSelection) {\n return;\n }\n\n const handleSelectionChange = () => {\n setSelectionVersion((value) => value + 1);\n };\n\n dashboardSelection.addEventListener('value', handleSelectionChange);\n return () => {\n dashboardSelection.removeEventListener('value', handleSelectionChange);\n };\n }, [dashboardSelection]);\n\n const hasActiveFilters = useMemo(\n () => Boolean(dashboardSelection?.clauses.length),\n [dashboardSelection, selectionVersion],\n );\n\n const handleAddProfiler = () => {\n const panel = dashboard?.selectedTable\n ? createMosaicDashboardProfilerPanelConfig({\n source: {tableName: dashboard.selectedTable},\n })\n : createMosaicDashboardProfilerPanelConfig();\n addPanel(dashboardId, panel);\n };\n\n const handleAddText = () => {\n const panel = createMosaicDashboardTextPanelConfig();\n addPanel(dashboardId, panel);\n };\n\n const handleAddCustomPanel = (action: MosaicDashboardAddPanelAction) => {\n const panel = action.createPanel(addPanelActionContext);\n if (panel) {\n addPanel(dashboardId, panel);\n }\n };\n\n const handleResetFilters = () => {\n dashboardSelection?.reset();\n };\n\n return (\n <div className=\"flex items-center justify-between border-b px-5 py-2\">\n <div className=\"flex items-center gap-2\">\n <Popover open={tablePickerOpen} onOpenChange={setTablePickerOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n role=\"combobox\"\n aria-expanded={tablePickerOpen}\n className=\"w-[200px] justify-between\"\n >\n <span className=\"truncate\">\n {dashboard?.selectedTable || 'Select table…'}\n </span>\n <ChevronsUpDown className=\"ml-1 h-3.5 w-3.5 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder=\"Search tables…\" />\n <CommandList>\n <CommandEmpty>No tables found.</CommandEmpty>\n <CommandGroup>\n {tablesWithColumns.map((table) => (\n <CommandItem\n key={table.tableName}\n value={table.tableName}\n onSelect={(value) => {\n setSelectedTable(dashboardId, value);\n setTablePickerOpen(false);\n }}\n >\n <Check\n className={`mr-2 h-3.5 w-3.5 ${dashboard?.selectedTable === table.tableName ? 'opacity-100' : 'opacity-0'}`}\n />\n {table.tableName}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"h-8 px-0\"\n disabled={!hasActiveFilters}\n onClick={handleResetFilters}\n >\n Reset filters\n </Button>\n </div>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" disabled={!canAddAnyPanel}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Add\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={addDefaultChart}\n disabled={!canCreateChart}\n >\n <BarChart3 className=\"mr-2 h-4 w-4\" />\n Chart\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={handleAddProfiler}\n disabled={!canAddProfiler}\n >\n <TableProperties className=\"mr-2 h-4 w-4\" />\n Profiler\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleAddText} disabled={!canAddText}>\n <FileText className=\"mr-2 h-4 w-4\" />\n Text\n </DropdownMenuItem>\n {addPanelActionEntries.map(({action, enabled}) => {\n const Icon = action.icon;\n return (\n <DropdownMenuItem\n key={action.type}\n onClick={() => handleAddCustomPanel(action)}\n disabled={!enabled}\n >\n {Icon ? <Icon className=\"mr-2 h-4 w-4\" /> : null}\n {action.label}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"defaultPanelRenderers.d.ts","sourceRoot":"","sources":["../../src/dashboard/defaultPanelRenderers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAIhC,wBAAgB,0CAA0C,CACxD,cAAc,GAAE,oBAAyB,GACxC,oBAAoB,CAQtB"}
1
+ {"version":3,"file":"defaultPanelRenderers.d.ts","sourceRoot":"","sources":["../../src/dashboard/defaultPanelRenderers.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAKhC,wBAAgB,0CAA0C,CACxD,cAAc,GAAE,oBAAyB,GACxC,oBAAoB,CAUtB"}
@@ -1,10 +1,12 @@
1
- import { MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE, MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE, } from './MosaicDashboardSlice';
2
- import { mosaicDashboardProfilerPanelRenderer } from './MosaicDashboardProfilerPanelRenderer';
3
- import { mosaicDashboardVgPlotPanelRenderer } from './MosaicDashboardVgPlotPanelRenderer';
1
+ import { MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE, MOSAIC_DASHBOARD_CHART_PANEL_TYPE, MOSAIC_DASHBOARD_TEXT_PANEL_TYPE, } from './MosaicDashboardSlice';
2
+ import { mosaicDashboardProfilerPanelRenderer } from '../profiler/MosaicDashboardProfilerPanelRenderer';
3
+ import { mosaicDashboardChartRenderer } from '../chart/MosaicDashboardChartRenderer';
4
+ import { mosaicDashboardTextRenderer } from '../text/MosaicDashboardTextRenderer';
4
5
  export function createDefaultMosaicDashboardPanelRenderers(extraRenderers = {}) {
5
6
  return {
6
- [MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE]: mosaicDashboardVgPlotPanelRenderer,
7
+ [MOSAIC_DASHBOARD_CHART_PANEL_TYPE]: mosaicDashboardChartRenderer,
7
8
  [MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]: mosaicDashboardProfilerPanelRenderer,
9
+ [MOSAIC_DASHBOARD_TEXT_PANEL_TYPE]: mosaicDashboardTextRenderer,
8
10
  ...extraRenderers,
9
11
  };
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"defaultPanelRenderers.js","sourceRoot":"","sources":["../../src/dashboard/defaultPanelRenderers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,kCAAkC,GAGnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,oCAAoC,EAAC,MAAM,wCAAwC,CAAC;AAC5F,OAAO,EAAC,kCAAkC,EAAC,MAAM,sCAAsC,CAAC;AAExF,MAAM,UAAU,0CAA0C,CACxD,iBAAuC,EAAE;IAEzC,OAAO;QACL,CAAC,kCAAkC,CAAC,EAClC,kCAAsD;QACxD,CAAC,oCAAoC,CAAC,EACpC,oCAAwD;QAC1D,GAAG,cAAc;KAClB,CAAC;AACJ,CAAC","sourcesContent":["import {\n MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE,\n type AnyPanelRenderer,\n type PanelRenderersRecord,\n} from './MosaicDashboardSlice';\nimport {mosaicDashboardProfilerPanelRenderer} from './MosaicDashboardProfilerPanelRenderer';\nimport {mosaicDashboardVgPlotPanelRenderer} from './MosaicDashboardVgPlotPanelRenderer';\n\nexport function createDefaultMosaicDashboardPanelRenderers(\n extraRenderers: PanelRenderersRecord = {},\n): PanelRenderersRecord {\n return {\n [MOSAIC_DASHBOARD_VGPLOT_PANEL_TYPE]:\n mosaicDashboardVgPlotPanelRenderer as AnyPanelRenderer,\n [MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]:\n mosaicDashboardProfilerPanelRenderer as AnyPanelRenderer,\n ...extraRenderers,\n };\n}\n"]}
1
+ {"version":3,"file":"defaultPanelRenderers.js","sourceRoot":"","sources":["../../src/dashboard/defaultPanelRenderers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,iCAAiC,EACjC,gCAAgC,GAGjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,oCAAoC,EAAC,MAAM,kDAAkD,CAAC;AACtG,OAAO,EAAC,4BAA4B,EAAC,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAC,2BAA2B,EAAC,MAAM,qCAAqC,CAAC;AAEhF,MAAM,UAAU,0CAA0C,CACxD,iBAAuC,EAAE;IAEzC,OAAO;QACL,CAAC,iCAAiC,CAAC,EACjC,4BAAgD;QAClD,CAAC,oCAAoC,CAAC,EACpC,oCAAwD;QAC1D,CAAC,gCAAgC,CAAC,EAChC,2BAA+C;QACjD,GAAG,cAAc;KAClB,CAAC;AACJ,CAAC","sourcesContent":["import {\n MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE,\n MOSAIC_DASHBOARD_CHART_PANEL_TYPE,\n MOSAIC_DASHBOARD_TEXT_PANEL_TYPE,\n type AnyPanelRenderer,\n type PanelRenderersRecord,\n} from './MosaicDashboardSlice';\nimport {mosaicDashboardProfilerPanelRenderer} from '../profiler/MosaicDashboardProfilerPanelRenderer';\nimport {mosaicDashboardChartRenderer} from '../chart/MosaicDashboardChartRenderer';\nimport {mosaicDashboardTextRenderer} from '../text/MosaicDashboardTextRenderer';\n\nexport function createDefaultMosaicDashboardPanelRenderers(\n extraRenderers: PanelRenderersRecord = {},\n): PanelRenderersRecord {\n return {\n [MOSAIC_DASHBOARD_CHART_PANEL_TYPE]:\n mosaicDashboardChartRenderer as AnyPanelRenderer,\n [MOSAIC_DASHBOARD_PROFILER_PANEL_TYPE]:\n mosaicDashboardProfilerPanelRenderer as AnyPanelRenderer,\n [MOSAIC_DASHBOARD_TEXT_PANEL_TYPE]:\n mosaicDashboardTextRenderer as AnyPanelRenderer,\n ...extraRenderers,\n };\n}\n"]}