@sqlrooms/mosaic 0.29.0-rc.4 → 0.29.0-rc.6
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.
- package/README.md +43 -39
- package/dist/DataPointLimitError.d.ts +9 -0
- package/dist/DataPointLimitError.d.ts.map +1 -0
- package/dist/DataPointLimitError.js +14 -0
- package/dist/DataPointLimitError.js.map +1 -0
- package/dist/MosaicSlice.d.ts.map +1 -1
- package/dist/MosaicSlice.js +3 -3
- package/dist/MosaicSlice.js.map +1 -1
- package/dist/VgPlotChart.d.ts +8 -11
- package/dist/VgPlotChart.d.ts.map +1 -1
- package/dist/VgPlotChart.js +74 -90
- package/dist/VgPlotChart.js.map +1 -1
- package/dist/VgPlotChartError.d.ts +7 -0
- package/dist/VgPlotChartError.d.ts.map +1 -0
- package/dist/VgPlotChartError.js +9 -0
- package/dist/VgPlotChartError.js.map +1 -0
- package/dist/ai.d.ts +103 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +445 -0
- package/dist/ai.js.map +1 -0
- package/dist/boxplot/BoxPlotClient.d.ts +7 -0
- package/dist/boxplot/BoxPlotClient.d.ts.map +1 -1
- package/dist/boxplot/BoxPlotClient.js +22 -0
- package/dist/boxplot/BoxPlotClient.js.map +1 -1
- package/dist/chart/ChartRuntimeIssuePanel.d.ts +7 -0
- package/dist/chart/ChartRuntimeIssuePanel.d.ts.map +1 -0
- package/dist/chart/ChartRuntimeIssuePanel.js +10 -0
- package/dist/chart/ChartRuntimeIssuePanel.js.map +1 -0
- package/dist/chart/MosaicDashboardChart.d.ts +1 -1
- package/dist/chart/MosaicDashboardChart.d.ts.map +1 -1
- package/dist/chart/MosaicDashboardChart.js +1 -1
- package/dist/chart/MosaicDashboardChart.js.map +1 -1
- package/dist/chart/MosaicDashboardChartContent.d.ts +1 -1
- package/dist/chart/MosaicDashboardChartContent.d.ts.map +1 -1
- package/dist/chart/MosaicDashboardChartContent.js +29 -2
- package/dist/chart/MosaicDashboardChartContent.js.map +1 -1
- package/dist/chart/MosaicDashboardChartRenderer.d.ts +2 -1
- package/dist/chart/MosaicDashboardChartRenderer.d.ts.map +1 -1
- package/dist/chart/MosaicDashboardChartRenderer.js +2 -2
- package/dist/chart/MosaicDashboardChartRenderer.js.map +1 -1
- package/dist/chart/MosaicDashboardComponentChart.d.ts +5 -1
- package/dist/chart/MosaicDashboardComponentChart.d.ts.map +1 -1
- package/dist/chart/MosaicDashboardComponentChart.js +4 -1
- package/dist/chart/MosaicDashboardComponentChart.js.map +1 -1
- package/dist/chart/MosaicDashboardVgPlotChart.d.ts +4 -0
- package/dist/chart/MosaicDashboardVgPlotChart.d.ts.map +1 -1
- package/dist/chart/MosaicDashboardVgPlotChart.js +2 -2
- package/dist/chart/MosaicDashboardVgPlotChart.js.map +1 -1
- package/dist/chart/addChartPanelAction.d.ts +3 -0
- package/dist/chart/addChartPanelAction.d.ts.map +1 -0
- package/dist/chart/addChartPanelAction.js +14 -0
- package/dist/chart/addChartPanelAction.js.map +1 -0
- package/dist/chart/chart-settings/ChartSettings.d.ts.map +1 -1
- package/dist/chart/chart-settings/ChartSettings.js +7 -4
- package/dist/chart/chart-settings/ChartSettings.js.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsContent.d.ts +1 -1
- package/dist/chart/chart-settings/ChartSettingsContent.d.ts.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsContent.js.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsContext.d.ts +0 -2
- package/dist/chart/chart-settings/ChartSettingsContext.d.ts.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsContext.js +6 -7
- package/dist/chart/chart-settings/ChartSettingsContext.js.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsPanel.d.ts +1 -1
- package/dist/chart/chart-settings/ChartSettingsPanel.d.ts.map +1 -1
- package/dist/chart/chart-settings/ChartSettingsPanel.js +1 -1
- package/dist/chart/chart-settings/ChartSettingsPanel.js.map +1 -1
- package/dist/chart/chart-settings/ChartTypeSelector.d.ts.map +1 -1
- package/dist/chart/chart-settings/ChartTypeSelector.js +5 -5
- package/dist/chart/chart-settings/ChartTypeSelector.js.map +1 -1
- package/dist/chart-builders/ColumnSelector.d.ts +0 -2
- package/dist/chart-builders/ColumnSelector.d.ts.map +1 -1
- package/dist/chart-builders/ColumnSelector.js +4 -5
- package/dist/chart-builders/ColumnSelector.js.map +1 -1
- package/dist/chart-builders/ColumnsContext.d.ts +13 -0
- package/dist/chart-builders/ColumnsContext.d.ts.map +1 -0
- package/dist/chart-builders/ColumnsContext.js +15 -0
- package/dist/chart-builders/ColumnsContext.js.map +1 -0
- package/dist/chart-builders/MultiFieldSelector.js +4 -4
- package/dist/chart-builders/MultiFieldSelector.js.map +1 -1
- package/dist/chart-builders/TableSelector.d.ts +14 -0
- package/dist/chart-builders/TableSelector.d.ts.map +1 -0
- package/dist/chart-builders/TableSelector.js +23 -0
- package/dist/chart-builders/TableSelector.js.map +1 -0
- package/dist/chart-runtime.d.ts +50 -0
- package/dist/chart-runtime.d.ts.map +1 -0
- package/dist/chart-runtime.js +76 -0
- package/dist/chart-runtime.js.map +1 -0
- package/dist/chart-types/base-types.d.ts +45 -25
- package/dist/chart-types/base-types.d.ts.map +1 -1
- package/dist/chart-types/base-types.js.map +1 -1
- package/dist/chart-types/box-plot/definition.d.ts.map +1 -1
- package/dist/chart-types/box-plot/definition.js +5 -0
- package/dist/chart-types/box-plot/definition.js.map +1 -1
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.d.ts.map +1 -1
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js +4 -1
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js.map +1 -1
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts +4 -0
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts.map +1 -1
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js +13 -2
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js.map +1 -1
- package/dist/chart-types/box-plot/schema.d.ts +5 -0
- package/dist/chart-types/box-plot/schema.d.ts.map +1 -1
- package/dist/chart-types/box-plot/schema.js +2 -0
- package/dist/chart-types/box-plot/schema.js.map +1 -1
- package/dist/chart-types/box-plot/tool.d.ts +5 -9
- package/dist/chart-types/box-plot/tool.d.ts.map +1 -1
- package/dist/chart-types/box-plot/tool.js +14 -6
- package/dist/chart-types/box-plot/tool.js.map +1 -1
- package/dist/chart-types/bubble-chart/definition.d.ts.map +1 -1
- package/dist/chart-types/bubble-chart/definition.js +5 -0
- package/dist/chart-types/bubble-chart/definition.js.map +1 -1
- package/dist/chart-types/bubble-chart/schema.d.ts +5 -0
- package/dist/chart-types/bubble-chart/schema.d.ts.map +1 -1
- package/dist/chart-types/bubble-chart/schema.js +2 -0
- package/dist/chart-types/bubble-chart/schema.js.map +1 -1
- package/dist/chart-types/bubble-chart/tool.d.ts +5 -9
- package/dist/chart-types/bubble-chart/tool.d.ts.map +1 -1
- package/dist/chart-types/bubble-chart/tool.js +17 -9
- package/dist/chart-types/bubble-chart/tool.js.map +1 -1
- package/dist/chart-types/chart-config.d.ts +46 -0
- package/dist/chart-types/chart-config.d.ts.map +1 -1
- package/dist/chart-types/chart-config.js +2 -0
- package/dist/chart-types/chart-config.js.map +1 -1
- package/dist/chart-types/count-plot/schema.d.ts +5 -0
- package/dist/chart-types/count-plot/schema.d.ts.map +1 -1
- package/dist/chart-types/count-plot/schema.js +2 -0
- package/dist/chart-types/count-plot/schema.js.map +1 -1
- package/dist/chart-types/count-plot/tool.d.ts +5 -9
- package/dist/chart-types/count-plot/tool.d.ts.map +1 -1
- package/dist/chart-types/count-plot/tool.js +14 -6
- package/dist/chart-types/count-plot/tool.js.map +1 -1
- package/dist/chart-types/custom-spec/definition.d.ts.map +1 -1
- package/dist/chart-types/custom-spec/definition.js +5 -0
- package/dist/chart-types/custom-spec/definition.js.map +1 -1
- package/dist/chart-types/custom-spec/schema.d.ts +5 -0
- package/dist/chart-types/custom-spec/schema.d.ts.map +1 -1
- package/dist/chart-types/custom-spec/schema.js +2 -0
- package/dist/chart-types/custom-spec/schema.js.map +1 -1
- package/dist/chart-types/data-policy-schema.d.ts +8 -0
- package/dist/chart-types/data-policy-schema.d.ts.map +1 -0
- package/dist/chart-types/data-policy-schema.js +7 -0
- package/dist/chart-types/data-policy-schema.js.map +1 -0
- package/dist/chart-types/heatmap/schema.d.ts +5 -0
- package/dist/chart-types/heatmap/schema.d.ts.map +1 -1
- package/dist/chart-types/heatmap/schema.js +2 -0
- package/dist/chart-types/heatmap/schema.js.map +1 -1
- package/dist/chart-types/heatmap/tool.d.ts +5 -9
- package/dist/chart-types/heatmap/tool.d.ts.map +1 -1
- package/dist/chart-types/heatmap/tool.js +16 -8
- package/dist/chart-types/heatmap/tool.js.map +1 -1
- package/dist/chart-types/histogram/HistogramSettings.d.ts.map +1 -1
- package/dist/chart-types/histogram/HistogramSettings.js +4 -2
- package/dist/chart-types/histogram/HistogramSettings.js.map +1 -1
- package/dist/chart-types/histogram/schema.d.ts +10 -0
- package/dist/chart-types/histogram/schema.d.ts.map +1 -1
- package/dist/chart-types/histogram/schema.js +13 -0
- package/dist/chart-types/histogram/schema.js.map +1 -1
- package/dist/chart-types/histogram/spec.d.ts +1 -1
- package/dist/chart-types/histogram/spec.d.ts.map +1 -1
- package/dist/chart-types/histogram/spec.js +4 -3
- package/dist/chart-types/histogram/spec.js.map +1 -1
- package/dist/chart-types/histogram/tool.d.ts +7 -9
- package/dist/chart-types/histogram/tool.d.ts.map +1 -1
- package/dist/chart-types/histogram/tool.js +17 -7
- package/dist/chart-types/histogram/tool.js.map +1 -1
- package/dist/chart-types/index.d.ts +45 -3
- package/dist/chart-types/index.d.ts.map +1 -1
- package/dist/chart-types/index.js +8 -2
- package/dist/chart-types/index.js.map +1 -1
- package/dist/chart-types/line-chart/LineChartSettings.d.ts.map +1 -1
- package/dist/chart-types/line-chart/LineChartSettings.js +3 -1
- package/dist/chart-types/line-chart/LineChartSettings.js.map +1 -1
- package/dist/chart-types/line-chart/definition.d.ts.map +1 -1
- package/dist/chart-types/line-chart/definition.js +7 -0
- package/dist/chart-types/line-chart/definition.js.map +1 -1
- package/dist/chart-types/line-chart/schema.d.ts +5 -0
- package/dist/chart-types/line-chart/schema.d.ts.map +1 -1
- package/dist/chart-types/line-chart/schema.js +2 -0
- package/dist/chart-types/line-chart/schema.js.map +1 -1
- package/dist/chart-types/line-chart/tool.d.ts +5 -9
- package/dist/chart-types/line-chart/tool.d.ts.map +1 -1
- package/dist/chart-types/line-chart/tool.js +16 -8
- package/dist/chart-types/line-chart/tool.js.map +1 -1
- package/dist/chart-types/list-panels-tool.d.ts +35 -0
- package/dist/chart-types/list-panels-tool.d.ts.map +1 -0
- package/dist/chart-types/list-panels-tool.js +66 -0
- package/dist/chart-types/list-panels-tool.js.map +1 -0
- package/dist/chart-types/profiler-tool.d.ts +40 -0
- package/dist/chart-types/profiler-tool.d.ts.map +1 -0
- package/dist/chart-types/profiler-tool.js +73 -0
- package/dist/chart-types/profiler-tool.js.map +1 -0
- package/dist/chart-types/remove-panel-tool.d.ts +31 -0
- package/dist/chart-types/remove-panel-tool.d.ts.map +1 -0
- package/dist/chart-types/remove-panel-tool.js +55 -0
- package/dist/chart-types/remove-panel-tool.js.map +1 -0
- package/dist/chart-types/text-panel-tool.d.ts +42 -0
- package/dist/chart-types/text-panel-tool.d.ts.map +1 -0
- package/dist/chart-types/text-panel-tool.js +71 -0
- package/dist/chart-types/text-panel-tool.js.map +1 -0
- package/dist/chart-types/tool-helpers.d.ts +44 -0
- package/dist/chart-types/tool-helpers.d.ts.map +1 -0
- package/dist/chart-types/tool-helpers.js +129 -0
- package/dist/chart-types/tool-helpers.js.map +1 -0
- package/dist/chart-types/tool-schemas.d.ts +1 -0
- package/dist/chart-types/tool-schemas.d.ts.map +1 -1
- package/dist/chart-types/tool-schemas.js +5 -1
- package/dist/chart-types/tool-schemas.js.map +1 -1
- package/dist/dashboard/MosaicDashboard.d.ts +5 -2
- package/dist/dashboard/MosaicDashboard.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboard.js +20 -39
- package/dist/dashboard/MosaicDashboard.js.map +1 -1
- package/dist/dashboard/MosaicDashboardContext.d.ts +2 -0
- package/dist/dashboard/MosaicDashboardContext.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardContext.js.map +1 -1
- package/dist/dashboard/MosaicDashboardEmptyState.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardEmptyState.js +8 -44
- package/dist/dashboard/MosaicDashboardEmptyState.js.map +1 -1
- package/dist/dashboard/MosaicDashboardPanel.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardPanel.js +2 -5
- package/dist/dashboard/MosaicDashboardPanel.js.map +1 -1
- package/dist/dashboard/MosaicDashboardPanelHeader.d.ts +2 -2
- package/dist/dashboard/MosaicDashboardPanelHeader.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardPanelHeader.js +2 -2
- package/dist/dashboard/MosaicDashboardPanelHeader.js.map +1 -1
- package/dist/dashboard/MosaicDashboardPanels.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardPanels.js +3 -2
- package/dist/dashboard/MosaicDashboardPanels.js.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.d.ts +185 -107
- package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.js +80 -57
- package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
- package/dist/dashboard/action-types.d.ts +25 -0
- package/dist/dashboard/action-types.d.ts.map +1 -0
- package/dist/dashboard/action-types.js +5 -0
- package/dist/dashboard/action-types.js.map +1 -0
- package/dist/dashboard/core-types.d.ts +26 -0
- package/dist/dashboard/core-types.d.ts.map +1 -0
- package/dist/dashboard/core-types.js +21 -0
- package/dist/dashboard/core-types.js.map +1 -0
- package/dist/dashboard/dashboard-types.d.ts +491 -0
- package/dist/dashboard/dashboard-types.d.ts.map +1 -0
- package/dist/dashboard/dashboard-types.js +54 -0
- package/dist/dashboard/dashboard-types.js.map +1 -0
- package/dist/dashboard/defaultPanelActions.d.ts +3 -0
- package/dist/dashboard/defaultPanelActions.d.ts.map +1 -0
- package/dist/dashboard/defaultPanelActions.js +9 -0
- package/dist/dashboard/defaultPanelActions.js.map +1 -0
- package/dist/dashboard/defaultPanelRenderers.d.ts.map +1 -1
- package/dist/dashboard/defaultPanelRenderers.js +1 -1
- package/dist/dashboard/defaultPanelRenderers.js.map +1 -1
- package/dist/dashboard/initial-state/BuildDashboardManuallyPanel.d.ts +6 -0
- package/dist/dashboard/initial-state/BuildDashboardManuallyPanel.d.ts.map +1 -0
- package/dist/dashboard/initial-state/BuildDashboardManuallyPanel.js +46 -0
- package/dist/dashboard/initial-state/BuildDashboardManuallyPanel.js.map +1 -0
- package/dist/dashboard/initial-state/BuildDashboardWithAIPanel.d.ts +7 -0
- package/dist/dashboard/initial-state/BuildDashboardWithAIPanel.d.ts.map +1 -0
- package/dist/dashboard/initial-state/BuildDashboardWithAIPanel.js +29 -0
- package/dist/dashboard/initial-state/BuildDashboardWithAIPanel.js.map +1 -0
- package/dist/dashboard/initial-state/MosaicDashboardInitialState.d.ts +6 -0
- package/dist/dashboard/initial-state/MosaicDashboardInitialState.d.ts.map +1 -0
- package/dist/dashboard/initial-state/MosaicDashboardInitialState.js +9 -0
- package/dist/dashboard/initial-state/MosaicDashboardInitialState.js.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.d.ts +7 -0
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.d.ts.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js +12 -0
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.d.ts +7 -0
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.d.ts.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js +36 -0
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.js +15 -0
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.js.map +1 -0
- package/dist/dashboard/useAddPanelActions.d.ts +10 -0
- package/dist/dashboard/useAddPanelActions.d.ts.map +1 -0
- package/dist/dashboard/useAddPanelActions.js +26 -0
- package/dist/dashboard/useAddPanelActions.js.map +1 -0
- package/dist/dashboard/useMosaicDashboardAddPanelActionContext.d.ts +3 -0
- package/dist/dashboard/useMosaicDashboardAddPanelActionContext.d.ts.map +1 -0
- package/dist/dashboard/useMosaicDashboardAddPanelActionContext.js +18 -0
- package/dist/dashboard/useMosaicDashboardAddPanelActionContext.js.map +1 -0
- package/dist/dashboard/useSelectedOrFirstTable.d.ts +10 -0
- package/dist/dashboard/useSelectedOrFirstTable.d.ts.map +1 -0
- package/dist/dashboard/useSelectedOrFirstTable.js +25 -0
- package/dist/dashboard/useSelectedOrFirstTable.js.map +1 -0
- package/dist/dashboard/useTablesWithColumns.d.ts +9 -0
- package/dist/dashboard/useTablesWithColumns.d.ts.map +1 -0
- package/dist/dashboard/useTablesWithColumns.js +13 -0
- package/dist/dashboard/useTablesWithColumns.js.map +1 -0
- package/dist/index.d.ts +25 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.d.ts +2 -1
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.d.ts.map +1 -1
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.js +3 -3
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.js.map +1 -1
- package/dist/profiler/addProfilerPanelAction.d.ts +3 -0
- package/dist/profiler/addProfilerPanelAction.d.ts.map +1 -0
- package/dist/profiler/addProfilerPanelAction.js +9 -0
- package/dist/profiler/addProfilerPanelAction.js.map +1 -0
- package/dist/text/MosaicDashboardTextRenderer.d.ts +2 -1
- package/dist/text/MosaicDashboardTextRenderer.d.ts.map +1 -1
- package/dist/text/MosaicDashboardTextRenderer.js +4 -4
- package/dist/text/MosaicDashboardTextRenderer.js.map +1 -1
- package/dist/text/addTextPanelAction.d.ts +3 -0
- package/dist/text/addTextPanelAction.d.ts.map +1 -0
- package/dist/text/addTextPanelAction.js +9 -0
- package/dist/text/addTextPanelAction.js.map +1 -0
- package/dist/useMosaicClient.d.ts +4 -0
- package/dist/useMosaicClient.d.ts.map +1 -1
- package/dist/useMosaicClient.js +33 -3
- package/dist/useMosaicClient.js.map +1 -1
- package/dist/useVgPlotChartError.d.ts +13 -0
- package/dist/useVgPlotChartError.d.ts.map +1 -0
- package/dist/useVgPlotChartError.js +18 -0
- package/dist/useVgPlotChartError.js.map +1 -0
- package/dist/useVgPlotChartRender.d.ts +24 -0
- package/dist/useVgPlotChartRender.d.ts.map +1 -0
- package/dist/useVgPlotChartRender.js +152 -0
- package/dist/useVgPlotChartRender.js.map +1 -0
- package/dist/useVgPlotChartRetention.d.ts +21 -0
- package/dist/useVgPlotChartRetention.d.ts.map +1 -0
- package/dist/useVgPlotChartRetention.js +63 -0
- package/dist/useVgPlotChartRetention.js.map +1 -0
- package/dist/wrapCoordinatorWithValidation.d.ts +11 -0
- package/dist/wrapCoordinatorWithValidation.d.ts.map +1 -0
- package/dist/wrapCoordinatorWithValidation.js +23 -0
- package/dist/wrapCoordinatorWithValidation.js.map +1 -0
- package/package.json +31 -13
- package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +0 -1
- package/dist/dashboard/MosaicDashboardToolbar.js +0 -86
- package/dist/dashboard/MosaicDashboardToolbar.js.map +0 -1
- /package/dist/dashboard/{MosaicDashboardToolbar.d.ts → toolbar/MosaicDashboardToolbar.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -226,55 +226,59 @@ panel omits a source it falls back to the dashboard selected table. Panel render
|
|
|
226
226
|
definitions and chart builder definitions are runtime-only and intentionally
|
|
227
227
|
live outside persisted dashboard config.
|
|
228
228
|
|
|
229
|
-
### AI
|
|
229
|
+
### Dashboard AI Tools
|
|
230
230
|
|
|
231
|
-
`
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
231
|
+
`@sqlrooms/mosaic` provides reusable assistant tools for dashboard authoring,
|
|
232
|
+
including chart tools, profiler/text panel tools, panel management tools, and an
|
|
233
|
+
optional exploratory `dashboard_agent`. Client apps supply a small adapter that
|
|
234
|
+
maps Mosaic's generic dashboard operations to their store, artifact model, table
|
|
235
|
+
metadata, and AI run context. When an AI run context is present, implicit
|
|
236
|
+
dashboard targeting should resolve only a primary dashboard context item;
|
|
237
|
+
reference-only dashboard artifacts should require an explicit `artifactId`.
|
|
237
238
|
|
|
238
239
|
```ts
|
|
239
240
|
import {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
type
|
|
241
|
+
createDashboardAiTools,
|
|
242
|
+
MAP_TOOL_KEY,
|
|
243
|
+
type DashboardAiAdapter,
|
|
243
244
|
} from '@sqlrooms/mosaic';
|
|
244
245
|
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
246
|
+
const adapter: DashboardAiAdapter<AppState> = {
|
|
247
|
+
getTables: (state) => state.db.tables,
|
|
248
|
+
hasRunContext: (state, context) => hasAiRunContext(context),
|
|
249
|
+
resolveContextDashboardArtifactId: (state, context) =>
|
|
250
|
+
getPrimaryDashboardArtifactIdFromRunContext(context, state),
|
|
251
|
+
makeDashboardPrimaryForRun: (state, artifactId, context) =>
|
|
252
|
+
makeArtifactPrimaryForAiRun(artifactId, context),
|
|
253
|
+
getCurrentDashboardArtifactId: (state) =>
|
|
254
|
+
state.dashboard.getCurrentDashboardArtifactId(),
|
|
255
|
+
createDashboardArtifact: (state, title, layoutType) =>
|
|
256
|
+
state.dashboard.createDashboardArtifact(title, layoutType),
|
|
257
|
+
isDashboardArtifact: (state, artifactId) =>
|
|
258
|
+
state.artifacts.getArtifact(artifactId)?.type === 'dashboard',
|
|
259
|
+
setCurrentArtifact: (state, artifactId) =>
|
|
260
|
+
state.artifacts.setCurrentArtifact(artifactId),
|
|
261
|
+
ensureDashboard: (state, dashboardId) =>
|
|
262
|
+
state.dashboard.ensureDashboardArtifact(dashboardId),
|
|
263
|
+
getDashboard: (state, dashboardId) =>
|
|
264
|
+
state.mosaicDashboard.getDashboard(dashboardId),
|
|
265
|
+
setSelectedTable: (state, dashboardId, tableName) =>
|
|
266
|
+
state.mosaicDashboard.setSelectedTable(dashboardId, tableName),
|
|
267
|
+
addPanel: (state, dashboardId, panel) =>
|
|
268
|
+
state.mosaicDashboard.addPanel(dashboardId, panel),
|
|
269
|
+
updatePanel: (state, dashboardId, panelId, patch) =>
|
|
270
|
+
state.mosaicDashboard.updatePanel(dashboardId, panelId, patch),
|
|
271
|
+
removePanel: (state, dashboardId, panelId) =>
|
|
272
|
+
state.mosaicDashboard.removePanel(dashboardId, panelId),
|
|
270
273
|
};
|
|
271
274
|
|
|
272
|
-
const
|
|
273
|
-
createDefaultChartTypes({includeCustomSpec: false}),
|
|
274
|
-
deps,
|
|
275
|
-
);
|
|
275
|
+
const dashboardTools = createDashboardAiTools({store, adapter});
|
|
276
276
|
```
|
|
277
277
|
|
|
278
|
+
Host tools can be added with `extraTools`; they must not reuse built-in
|
|
279
|
+
dashboard tool keys. Register geospatial map tools under `MAP_TOOL_KEY` so the
|
|
280
|
+
dashboard prompts and tool registration stay aligned.
|
|
281
|
+
|
|
278
282
|
### Box Plot Chart Type
|
|
279
283
|
|
|
280
284
|
The built-in Box Plot chart type (`'box-plot'`) is a specialized chart that uses
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for data point limit exceeded.
|
|
3
|
+
*/
|
|
4
|
+
export declare class DataPointLimitError extends Error {
|
|
5
|
+
readonly rowCount: number;
|
|
6
|
+
readonly limit: number;
|
|
7
|
+
constructor(rowCount: number, limit: number);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=DataPointLimitError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataPointLimitError.d.ts","sourceRoot":"","sources":["../src/DataPointLimitError.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,MAAM;gBADb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM;CAOhC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error class for data point limit exceeded.
|
|
3
|
+
*/
|
|
4
|
+
export class DataPointLimitError extends Error {
|
|
5
|
+
rowCount;
|
|
6
|
+
limit;
|
|
7
|
+
constructor(rowCount, limit) {
|
|
8
|
+
super(`This chart would render ${rowCount.toLocaleString()} data points (limit: ${limit.toLocaleString()})`);
|
|
9
|
+
this.rowCount = rowCount;
|
|
10
|
+
this.limit = limit;
|
|
11
|
+
this.name = 'DataPointLimitError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DataPointLimitError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataPointLimitError.js","sourceRoot":"","sources":["../src/DataPointLimitError.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAE1B;IACA;IAFlB,YACkB,QAAgB,EAChB,KAAa;QAE7B,KAAK,CACH,2BAA2B,QAAQ,CAAC,cAAc,EAAE,wBAAwB,KAAK,CAAC,cAAc,EAAE,GAAG,CACtG,CAAC;QALc,aAAQ,GAAR,QAAQ,CAAQ;QAChB,UAAK,GAAL,KAAK,CAAQ;QAK7B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF","sourcesContent":["/**\n * Custom error class for data point limit exceeded.\n */\nexport class DataPointLimitError extends Error {\n constructor(\n public readonly rowCount: number,\n public readonly limit: number,\n ) {\n super(\n `This chart would render ${rowCount.toLocaleString()} data points (limit: ${limit.toLocaleString()})`,\n );\n this.name = 'DataPointLimitError';\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicSlice.d.ts","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MosaicSlice.d.ts","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"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"}
|
package/dist/MosaicSlice.js
CHANGED
|
@@ -7,9 +7,7 @@ import { z } from 'zod';
|
|
|
7
7
|
import { createMosaicTableFromArrowTable, toArrowClientResult, } from './tableInterop';
|
|
8
8
|
export const MosaicSliceConfig = z.object({});
|
|
9
9
|
export function createDefaultMosaicConfig(props) {
|
|
10
|
-
return {
|
|
11
|
-
...props,
|
|
12
|
-
};
|
|
10
|
+
return { ...props };
|
|
13
11
|
}
|
|
14
12
|
export function createMosaicSlice(props = {}) {
|
|
15
13
|
return createSlice((set, get, store) => ({
|
|
@@ -123,6 +121,7 @@ export function createMosaicSlice(props = {}) {
|
|
|
123
121
|
tracked.error = error;
|
|
124
122
|
}
|
|
125
123
|
}));
|
|
124
|
+
// Disable client to prevent further queries
|
|
126
125
|
client.enabled = false;
|
|
127
126
|
options.queryError?.(error);
|
|
128
127
|
};
|
|
@@ -205,6 +204,7 @@ export function createMosaicSlice(props = {}) {
|
|
|
205
204
|
tracked.error = error;
|
|
206
205
|
}
|
|
207
206
|
}));
|
|
207
|
+
// Disable client to prevent further queries
|
|
208
208
|
client.enabled = false;
|
|
209
209
|
options.onQueryError?.(error);
|
|
210
210
|
options.queryError?.(error);
|
package/dist/MosaicSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicSlice.js","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACL,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,WAAW,EACX,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAGL,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAoF9C,MAAM,UAAU,yBAAyB,CACvC,KAAkC;IAElC,OAAO;QACL,GAAG,KAAK;KACY,CAAC;AACzB,CAAC;AAQD,MAAM,UAAU,iBAAiB,CAAC,QAAgC,EAAE;IAClE,OAAO,WAAW,CAGhB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE;YACN,MAAM,EAAE,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC;YAChD,UAAU,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC;YAC5B,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YAEd,KAAK,CAAC,UAAU;gBACd,IAAI,eAAsC,CAAC;gBAC3C,IAAI,mBAAiC,CAAC;gBACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,EAAC,MAAM,EAAE,SAAS,EAAC,CAAC;gBAChD,CAAC,CAAC,CACH,CAAC;gBACF,IAAI,CAAC;oBACH,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;wBACtB,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAAC;wBACxC,8BAA8B,CAAC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBACpE,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,GAAG,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;wBAClD,mBAAmB,GAAG,WAAW,EAAE,CAAC;wBACpC,eAAe,GAAG,qBAAqB,CAAC,WAAW,CAAC;4BAClD,CAAC,CAAC,MAAM,aAAa,CAAC;gCAClB,6DAA6D;gCAC7D,wFAAwF;gCACxF,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE;gCAC3B,6DAA6D;gCAC7D,qCAAqC;gCACrC,UAAU,EAAE,WAAW,CAAC,aAAa,EAAE;6BACxC,CAAC;4BACJ,CAAC,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC;wBAC7C,8BAA8B,CAAC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;wBAClE,mBAAmB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,EAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC;oBACrD,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG;wBACxB,MAAM,EAAE,OAAO;wBACf,SAAS,EAAE,eAAe;wBAC1B,WAAW,EAAE,mBAAmB;qBACjC,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,OAAO;gBACX,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACnC,CAAC;YAED,SAAS,CAAC,MAAyB;gBACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC/B,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,YAAY,CACV,IAAY,EACZ,OAA2C,aAAa;gBAExD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;gBAE9B,MAAM,SAAS,GACb,IAAI,KAAK,aAAa;oBACpB,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;oBACzB,CAAC,CAAC,IAAI,KAAK,QAAQ;wBACjB,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE;wBACpB,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAE1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;gBAC5C,CAAC,CAAC,CACH,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,YAAY,CAAC,OAA4B;gBACvC,MAAM,EAAC,UAAU,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;gBAClC,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;gBAED,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAEpC,mCAAmC;gBACnC,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;oBACjB,CAAC,OAAO,CAAC,aAAa;wBACpB,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC;wBAClD,CAAC,CAAC,SAAS,CAAC,CAAC;gBAEjB,oEAAoE;gBACpE,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE;oBAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;4BACpB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;4BAC1B,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;wBAC5B,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,qCAAqC;oBACrC,OAAO,CAAC,WAAW,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnD,CAAC,CAAC;gBACF,MAAM,mBAAmB,GAAG,GAAG,EAAE;oBAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;4BACzB,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;wBAC5B,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC,CAAC;gBACF,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAE,EAAE;oBACzC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;4BAC1B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;wBACxB,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;oBACvB,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,UAAU,CAAC;oBACxB,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,SAAS;oBACT,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,WAAW,EAAE,kBAAkB;oBAC/B,YAAY,EAAE,mBAAmB;oBACjC,UAAU,EAAE,iBAAiB;iBAC9B,CAAC,CAAC;gBAEH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;wBACzB,EAAE;wBACF,MAAM;wBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,SAAS,EAAE,IAAI;wBACf,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,SAAS;wBAChB,SAAS;wBACT,mBAAmB,EAAE,OAAO,CAAC,WAAW;4BACtC,CAAC,CAAC,CAAC,MAAe,EAAE,EAAE,CAClB,OAAO,CAAC,WAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;4BACrD,CAAC,CAAC,SAAS;qBACd,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;gBAEF,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,YAAY,CACV,OAIC;gBAED,MAAM,EAAC,UAAU,EAAE,OAAO,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAClC,OAAO,CAAC,wDAAwD;gBAClE,CAAC;gBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAErC,mCAAmC;gBACnC,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;oBACjB,CAAC,OAAO,CAAC,aAAa;wBACpB,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC;wBAClD,CAAC,CAAC,SAAS,CAAC,CAAC;gBAEjB,+CAA+C;gBAC/C,uEAAuE;gBACvE,sEAAsE;gBACtE,gDAAgD;gBAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACjD,OAAO,CAAC,oDAAoD;gBAC9D,CAAC;gBAED,oDAAoD;gBACpD,IAAI,QAAQ,EAAE,CAAC;oBACb,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC;gBAED,gGAAgG;gBAChG,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE;oBAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACjD,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;4BACpB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;4BAC1B,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;wBAC5B,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC5C,qCAAqC;oBACrC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC;oBACnC,6CAA6C;oBAC7C,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;gBACnC,CAAC,CAAC;gBACF,MAAM,mBAAmB,GAAG,GAAG,EAAE;oBAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACjD,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;4BACzB,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;wBAC5B,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC,CAAC;gBACF,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAE,EAAE;oBACzC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACjD,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;4BAC1B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;wBACxB,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;oBACvB,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;oBAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,UAAU,CAAC;oBACxB,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,SAAS;oBACT,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,WAAW,EAAE,kBAAkB;oBAC/B,YAAY,EAAE,mBAAmB;oBACjC,UAAU,EAAE,iBAAiB;iBAC9B,CAAC,CAAC;gBAEH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;wBACjC,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,MAAM;wBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,SAAS,EAAE,IAAI;wBACf,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,SAAS;wBAChB,SAAS;wBACT,mBAAmB,EAAE,OAAO,CAAC,aAAa;4BACxC,CAAC,CAAC,CAAC,MAAe,EAAE,EAAE,CAClB,OAAO,CAAC,aAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;4BACvD,CAAC,CAAC,SAAS;qBACd,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,aAAa,CAAC,EAAU;gBACtB,MAAM,EAAC,OAAO,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAEzB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;YAED,iBAAiB;gBACf,MAAM,EAAC,OAAO,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACzC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC,CAAC,CAAC;gBAEH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC5B,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,8BAA8B,CACrC,iBAA8B,EAC9B,OAAmC;IAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,iBAAiB,CAAC,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,iBAAiB,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC5D,CAAC;AACH,CAAC;AAID,MAAM,UAAU,kBAAkB,CAChC,QAAkD;IAElD,OAAO,gBAAgB,CAAwB,CAAC,KAAK,EAAE,EAAE,CACvD,QAAQ,CAAC,KAA8C,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,2BAA2B,CAAC,SAA0B;IAC7D,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,EACX,KAA8D,EAC9D,EAAE;YACF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;YACxC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,OAAO,SAAgB,CAAC;YAC1B,CAAC;YACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CACpC,KAAK,CAAC,GAAG,CACV,CAAC;gBACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAQ,CAAC;YACjC,CAAC;YACD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACpD,OAAO,+BAA+B,CAAC,UAAU,CAAQ,CAAC;YAC5D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,IAAI,CAAC,CAAC;QACnE,CAAC,CAAuB;KACzB,CAAC;AACJ,CAAC","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n isWasmDuckDbConnector,\n type DuckDbConnector,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {\n BaseRoomStoreState,\n createSlice,\n useBaseRoomStore,\n type SliceFunctions,\n} from '@sqlrooms/room-store';\nimport type {\n ArrowQueryRequest,\n ExecQueryRequest,\n JSONQueryRequest,\n} from '@uwdata/mosaic-core';\nimport {\n Connector,\n Coordinator,\n coordinator,\n makeClient,\n Selection,\n wasmConnector,\n} from '@uwdata/mosaic-core';\nimport {Query} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {\n createMosaicTableFromArrowTable,\n toArrowClientResult,\n} from './tableInterop';\n\nexport const MosaicSliceConfig = z.object({});\nexport type MosaicSliceConfig = z.infer<typeof MosaicSliceConfig>;\n\nexport type MosaicPreAggregateOptions = {\n /** Database schema/namespace for Mosaic pre-aggregate tables. */\n schema?: string;\n /** Enable or disable Mosaic's pre-aggregation optimization. */\n enabled?: boolean;\n};\n\n// Client configuration options\nexport type MosaicClientOptions = {\n /** Unique identifier for this client */\n id?: string;\n /** Selection name for cross-filtering (will create if doesn't exist) */\n selectionName?: string;\n /** The selection to subscribe to for cross-filtering */\n selection?: Selection;\n /** Query builder function that receives the current filter */\n query: (filter: unknown) => ReturnType<typeof Query.from>;\n /** Callback when query results are received */\n queryResult?: (result: ArrowTable) => void;\n /** Callback when query execution fails */\n queryError?: (error: Error) => void;\n};\n\n// Tracked client info\nexport type TrackedClient = {\n id: string;\n client: ReturnType<typeof makeClient>;\n createdAt: number;\n isLoading: boolean;\n data: unknown | null;\n error?: Error;\n selection?: Selection; // Track for change detection\n queryResultCallback?: (result: ArrowTable) => void; // External callback\n};\n\nexport type MosaicIdleConnection = {status: 'idle'};\nexport type MosaicLoadingConnection = {status: 'loading'};\nexport type MosaicReadyConnection = {\n status: 'ready';\n connector?: Connector;\n coordinator: Coordinator;\n};\nexport type MosaicErrorConnection = {status: 'error'; error: unknown};\n\nexport type MosaicConnection =\n | MosaicIdleConnection\n | MosaicLoadingConnection\n | MosaicReadyConnection\n | MosaicErrorConnection;\n\nexport type MosaicSliceState = {\n mosaic: SliceFunctions & {\n connection: MosaicConnection;\n config: MosaicSliceConfig;\n /** Record of registered clients by id */\n clients: Record<string, TrackedClient>;\n /** Named selections for cross-filtering (e.g., 'brush', 'hover') */\n selections: Record<string, Selection>;\n initialize: () => Promise<void>;\n /** Get or create a named selection for cross-filtering */\n getSelection: (\n name: string,\n type?: 'crossfilter' | 'single' | 'union',\n ) => Selection;\n /** Create a mosaic client and register it */\n createClient: (options: MosaicClientOptions) => string;\n /** Ensure a client exists with given options (idempotent - creates or updates as needed) */\n ensureClient: (\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) => void;\n /** Disconnect and remove a client by id */\n destroyClient: (id: string) => void;\n /** Disconnect all clients (useful for cleanup) */\n destroyAllClients: () => void;\n };\n};\n\nexport function createDefaultMosaicConfig(\n props?: Partial<MosaicSliceConfig>,\n): MosaicSliceConfig {\n return {\n ...props,\n } as MosaicSliceConfig;\n}\n\nexport type CreateMosaicSliceProps = {\n config?: Partial<MosaicSliceConfig>;\n coordinator?: Coordinator;\n preagg?: MosaicPreAggregateOptions;\n};\n\nexport function createMosaicSlice(props: CreateMosaicSliceProps = {}) {\n return createSlice<\n MosaicSliceState,\n BaseRoomStoreState & DuckDbSliceState & MosaicSliceState\n >((set, get, store) => ({\n mosaic: {\n config: createDefaultMosaicConfig(props?.config),\n connection: {status: 'idle'},\n clients: {},\n selections: {},\n\n async initialize() {\n let mosaicConnector: Connector | undefined;\n let resolvedCoordinator!: Coordinator;\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'loading'};\n }),\n );\n try {\n if (props.coordinator) {\n resolvedCoordinator = props.coordinator;\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n } else {\n const dbConnector = await get().db.getConnector();\n resolvedCoordinator = coordinator();\n mosaicConnector = isWasmDuckDbConnector(dbConnector)\n ? await wasmConnector({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - We might be using a different version of duckdb-wasm than mosaic expects\n duckDb: dbConnector.getDb(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - same version mismatch\n connection: dbConnector.getConnection(),\n })\n : createDuckDbMosaicConnector(dbConnector);\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n resolvedCoordinator.databaseConnector(mosaicConnector);\n }\n } catch (error) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'error', error};\n }),\n );\n throw error;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {\n status: 'ready',\n connector: mosaicConnector,\n coordinator: resolvedCoordinator,\n };\n }),\n );\n },\n\n async destroy() {\n get().mosaic.destroyAllClients();\n },\n\n setConfig(config: MosaicSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.config = config;\n }),\n );\n },\n\n getSelection(\n name: string,\n type: 'crossfilter' | 'single' | 'union' = 'crossfilter',\n ) {\n const existing = get().mosaic.selections[name];\n if (existing) return existing;\n\n const selection =\n type === 'crossfilter'\n ? Selection.crossfilter()\n : type === 'single'\n ? Selection.single()\n : Selection.union();\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.selections[name] = selection;\n }),\n );\n return selection;\n },\n\n createClient(options: MosaicClientOptions) {\n const {connection} = get().mosaic;\n if (connection.status !== 'ready') {\n throw new Error('Mosaic connection not ready');\n }\n\n const id = options.id ?? createId();\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Wrap queryResult to update store state AND call external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n // Call external callback if provided\n options.queryResult?.(toArrowClientResult(data));\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[id] = {\n id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.queryResult\n ? (result: unknown) =>\n options.queryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n\n return id;\n },\n\n ensureClient(\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) {\n const {connection, clients} = get().mosaic;\n if (connection.status !== 'ready') {\n return; // Silently return if not ready - hook will handle retry\n }\n\n const existing = clients[options.id];\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Check if client exists and selection matches\n // Note: If query or callback changes, we recreate the client to ensure\n // the latest versions are used. This is simpler than trying to update\n // the bound queryResult callback in makeClient.\n if (existing && existing.selection === selection) {\n return; // No-op - client already exists with same selection\n }\n\n // If exists but selection changed, destroy it first\n if (existing) {\n get().mosaic.destroyClient(options.id);\n }\n\n // Create new client with wrapped queryResult that calls both store update and external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n const arrowData = toArrowClientResult(data);\n // Call external callback if provided\n options.onQueryResult?.(arrowData);\n // Also call original queryResult if provided\n options.queryResult?.(arrowData);\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.onQueryError?.(error);\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[options.id] = {\n id: options.id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.onQueryResult\n ? (result: unknown) =>\n options.onQueryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n },\n\n destroyClient(id: string) {\n const {clients} = get().mosaic;\n const tracked = clients[id];\n if (!tracked) return;\n\n tracked.client.destroy();\n\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaic.clients[id];\n }),\n );\n },\n\n destroyAllClients() {\n const {clients} = get().mosaic;\n Object.values(clients).forEach((tracked) => {\n tracked.client.destroy();\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients = {};\n }),\n );\n },\n },\n }));\n}\n\nfunction applyMosaicPreAggregateOptions(\n mosaicCoordinator: Coordinator,\n options?: MosaicPreAggregateOptions,\n) {\n if (!options) {\n return;\n }\n if (options.schema !== undefined) {\n mosaicCoordinator.preaggregator.schema = options.schema;\n }\n if (options.enabled !== undefined) {\n mosaicCoordinator.preaggregator.enabled = options.enabled;\n }\n}\n\nexport type DuckDbSliceStateWithMosaic = DuckDbSliceState & MosaicSliceState;\n\nexport function useStoreWithMosaic<T>(\n selector: (state: DuckDbSliceStateWithMosaic) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as DuckDbSliceStateWithMosaic),\n );\n}\n\n/**\n * Adapts a {@link DuckDbConnector} to the Mosaic {@link Connector} interface.\n *\n * For `'arrow'` queries the Apache Arrow table returned by the connector is\n * converted via {@link createMosaicTableFromArrowTable} into a flechette\n * `Table`, which is the shape Mosaic consumers expect (with `.toColumns()`).\n * For `'json'` queries, rows are materialized with {@link Array.from} which\n * may have performance/memory implications for very large result sets.\n * The `as any` casts on the return type are an intentional adapter trade-off\n * to satisfy the polymorphic {@link Connector['query']} signature.\n */\nfunction createDuckDbMosaicConnector(connector: DuckDbConnector): Connector {\n return {\n query: (async (\n query: ArrowQueryRequest | ExecQueryRequest | JSONQueryRequest,\n ) => {\n const queryType = query.type ?? 'arrow';\n if (queryType === 'exec') {\n await connector.execute(query.sql);\n return undefined as any;\n }\n if (queryType === 'json') {\n const rows = await connector.queryJson<Record<string, unknown>>(\n query.sql,\n );\n return Array.from(rows) as any;\n }\n if (queryType === 'arrow') {\n const arrowTable = await connector.query(query.sql);\n return createMosaicTableFromArrowTable(arrowTable) as any;\n }\n throw new Error(`Unsupported Mosaic query type \"${queryType}\".`);\n }) as Connector['query'],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MosaicSlice.js","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n isWasmDuckDbConnector,\n type DuckDbConnector,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {\n BaseRoomStoreState,\n createSlice,\n useBaseRoomStore,\n type SliceFunctions,\n} from '@sqlrooms/room-store';\nimport type {\n ArrowQueryRequest,\n ExecQueryRequest,\n JSONQueryRequest,\n} from '@uwdata/mosaic-core';\nimport {\n Connector,\n Coordinator,\n coordinator,\n makeClient,\n Selection,\n wasmConnector,\n} from '@uwdata/mosaic-core';\nimport {Query} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {\n createMosaicTableFromArrowTable,\n toArrowClientResult,\n} from './tableInterop';\n\nexport const MosaicSliceConfig = z.object({});\nexport type MosaicSliceConfig = z.infer<typeof MosaicSliceConfig>;\n\nexport type MosaicPreAggregateOptions = {\n /** Database schema/namespace for Mosaic pre-aggregate tables. */\n schema?: string;\n /** Enable or disable Mosaic's pre-aggregation optimization. */\n enabled?: boolean;\n};\n\n// Client configuration options\nexport type MosaicClientOptions = {\n /** Unique identifier for this client */\n id?: string;\n /** Selection name for cross-filtering (will create if doesn't exist) */\n selectionName?: string;\n /** The selection to subscribe to for cross-filtering */\n selection?: Selection;\n /** Query builder function that receives the current filter */\n query: (filter: unknown) => ReturnType<typeof Query.from>;\n /** Callback when query results are received */\n queryResult?: (result: ArrowTable) => void;\n /** Callback when query execution fails */\n queryError?: (error: Error) => void;\n};\n\n// Tracked client info\nexport type TrackedClient = {\n id: string;\n client: ReturnType<typeof makeClient>;\n createdAt: number;\n isLoading: boolean;\n data: unknown | null;\n error?: Error;\n selection?: Selection; // Track for change detection\n queryResultCallback?: (result: ArrowTable) => void; // External callback\n};\n\nexport type MosaicIdleConnection = {status: 'idle'};\nexport type MosaicLoadingConnection = {status: 'loading'};\nexport type MosaicReadyConnection = {\n status: 'ready';\n connector?: Connector;\n coordinator: Coordinator;\n};\nexport type MosaicErrorConnection = {status: 'error'; error: unknown};\n\nexport type MosaicConnection =\n | MosaicIdleConnection\n | MosaicLoadingConnection\n | MosaicReadyConnection\n | MosaicErrorConnection;\n\nexport type MosaicSliceState = {\n mosaic: SliceFunctions & {\n connection: MosaicConnection;\n config: MosaicSliceConfig;\n /** Record of registered clients by id */\n clients: Record<string, TrackedClient>;\n /** Named selections for cross-filtering (e.g., 'brush', 'hover') */\n selections: Record<string, Selection>;\n initialize: () => Promise<void>;\n /** Get or create a named selection for cross-filtering */\n getSelection: (\n name: string,\n type?: 'crossfilter' | 'single' | 'union',\n ) => Selection;\n /** Create a mosaic client and register it */\n createClient: (options: MosaicClientOptions) => string;\n /** Ensure a client exists with given options (idempotent - creates or updates as needed) */\n ensureClient: (\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) => void;\n /** Disconnect and remove a client by id */\n destroyClient: (id: string) => void;\n /** Disconnect all clients (useful for cleanup) */\n destroyAllClients: () => void;\n };\n};\n\nexport function createDefaultMosaicConfig(\n props?: Partial<MosaicSliceConfig>,\n): MosaicSliceConfig {\n return {...props} as MosaicSliceConfig;\n}\n\nexport type CreateMosaicSliceProps = {\n config?: Partial<MosaicSliceConfig>;\n coordinator?: Coordinator;\n preagg?: MosaicPreAggregateOptions;\n};\n\nexport function createMosaicSlice(props: CreateMosaicSliceProps = {}) {\n return createSlice<\n MosaicSliceState,\n BaseRoomStoreState & DuckDbSliceState & MosaicSliceState\n >((set, get, store) => ({\n mosaic: {\n config: createDefaultMosaicConfig(props?.config),\n connection: {status: 'idle'},\n clients: {},\n selections: {},\n\n async initialize() {\n let mosaicConnector: Connector | undefined;\n let resolvedCoordinator!: Coordinator;\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'loading'};\n }),\n );\n try {\n if (props.coordinator) {\n resolvedCoordinator = props.coordinator;\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n } else {\n const dbConnector = await get().db.getConnector();\n resolvedCoordinator = coordinator();\n mosaicConnector = isWasmDuckDbConnector(dbConnector)\n ? await wasmConnector({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - We might be using a different version of duckdb-wasm than mosaic expects\n duckDb: dbConnector.getDb(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - same version mismatch\n connection: dbConnector.getConnection(),\n })\n : createDuckDbMosaicConnector(dbConnector);\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n resolvedCoordinator.databaseConnector(mosaicConnector);\n }\n } catch (error) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'error', error};\n }),\n );\n throw error;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {\n status: 'ready',\n connector: mosaicConnector,\n coordinator: resolvedCoordinator,\n };\n }),\n );\n },\n\n async destroy() {\n get().mosaic.destroyAllClients();\n },\n\n setConfig(config: MosaicSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.config = config;\n }),\n );\n },\n\n getSelection(\n name: string,\n type: 'crossfilter' | 'single' | 'union' = 'crossfilter',\n ) {\n const existing = get().mosaic.selections[name];\n if (existing) return existing;\n\n const selection =\n type === 'crossfilter'\n ? Selection.crossfilter()\n : type === 'single'\n ? Selection.single()\n : Selection.union();\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.selections[name] = selection;\n }),\n );\n return selection;\n },\n\n createClient(options: MosaicClientOptions) {\n const {connection} = get().mosaic;\n if (connection.status !== 'ready') {\n throw new Error('Mosaic connection not ready');\n }\n\n const id = options.id ?? createId();\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Wrap queryResult to update store state AND call external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n // Call external callback if provided\n options.queryResult?.(toArrowClientResult(data));\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n // Disable client to prevent further queries\n client.enabled = false;\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[id] = {\n id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.queryResult\n ? (result: unknown) =>\n options.queryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n\n return id;\n },\n\n ensureClient(\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) {\n const {connection, clients} = get().mosaic;\n if (connection.status !== 'ready') {\n return; // Silently return if not ready - hook will handle retry\n }\n\n const existing = clients[options.id];\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Check if client exists and selection matches\n // Note: If query or callback changes, we recreate the client to ensure\n // the latest versions are used. This is simpler than trying to update\n // the bound queryResult callback in makeClient.\n if (existing && existing.selection === selection) {\n return; // No-op - client already exists with same selection\n }\n\n // If exists but selection changed, destroy it first\n if (existing) {\n get().mosaic.destroyClient(options.id);\n }\n\n // Create new client with wrapped queryResult that calls both store update and external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n const arrowData = toArrowClientResult(data);\n // Call external callback if provided\n options.onQueryResult?.(arrowData);\n // Also call original queryResult if provided\n options.queryResult?.(arrowData);\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n // Disable client to prevent further queries\n client.enabled = false;\n options.onQueryError?.(error);\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[options.id] = {\n id: options.id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.onQueryResult\n ? (result: unknown) =>\n options.onQueryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n },\n\n destroyClient(id: string) {\n const {clients} = get().mosaic;\n const tracked = clients[id];\n if (!tracked) return;\n\n tracked.client.destroy();\n\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaic.clients[id];\n }),\n );\n },\n\n destroyAllClients() {\n const {clients} = get().mosaic;\n Object.values(clients).forEach((tracked) => {\n tracked.client.destroy();\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients = {};\n }),\n );\n },\n },\n }));\n}\n\nfunction applyMosaicPreAggregateOptions(\n mosaicCoordinator: Coordinator,\n options?: MosaicPreAggregateOptions,\n) {\n if (!options) {\n return;\n }\n if (options.schema !== undefined) {\n mosaicCoordinator.preaggregator.schema = options.schema;\n }\n if (options.enabled !== undefined) {\n mosaicCoordinator.preaggregator.enabled = options.enabled;\n }\n}\n\nexport type DuckDbSliceStateWithMosaic = DuckDbSliceState & MosaicSliceState;\n\nexport function useStoreWithMosaic<T>(\n selector: (state: DuckDbSliceStateWithMosaic) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as DuckDbSliceStateWithMosaic),\n );\n}\n\n/**\n * Adapts a {@link DuckDbConnector} to the Mosaic {@link Connector} interface.\n *\n * For `'arrow'` queries the Apache Arrow table returned by the connector is\n * converted via {@link createMosaicTableFromArrowTable} into a flechette\n * `Table`, which is the shape Mosaic consumers expect (with `.toColumns()`).\n * For `'json'` queries, rows are materialized with {@link Array.from} which\n * may have performance/memory implications for very large result sets.\n * The `as any` casts on the return type are an intentional adapter trade-off\n * to satisfy the polymorphic {@link Connector['query']} signature.\n */\nfunction createDuckDbMosaicConnector(connector: DuckDbConnector): Connector {\n return {\n query: (async (\n query: ArrowQueryRequest | ExecQueryRequest | JSONQueryRequest,\n ) => {\n const queryType = query.type ?? 'arrow';\n if (queryType === 'exec') {\n await connector.execute(query.sql);\n return undefined as any;\n }\n if (queryType === 'json') {\n const rows = await connector.queryJson<Record<string, unknown>>(\n query.sql,\n );\n return Array.from(rows) as any;\n }\n if (queryType === 'arrow') {\n const arrowTable = await connector.query(query.sql);\n return createMosaicTableFromArrowTable(arrowTable) as any;\n }\n throw new Error(`Unsupported Mosaic query type \"${queryType}\".`);\n }) as Connector['query'],\n };\n}\n"]}
|
package/dist/VgPlotChart.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Param, Selection } from '@uwdata/mosaic-core';
|
|
2
2
|
import { Spec } from '@uwdata/mosaic-spec';
|
|
3
3
|
import { FC } from 'react';
|
|
4
|
+
import { VgPlotChartRetention } from './useVgPlotChartRetention';
|
|
5
|
+
import type { ChartDataPolicy, ChartRuntimeIssueContext, ChartRuntimeIssueReporter } from './chart-runtime';
|
|
4
6
|
type SpecProps = {
|
|
5
7
|
spec: Spec;
|
|
6
8
|
/**
|
|
@@ -16,23 +18,19 @@ type SpecProps = {
|
|
|
16
18
|
* switches.
|
|
17
19
|
*/
|
|
18
20
|
retention?: VgPlotChartRetention;
|
|
21
|
+
dataPolicy?: ChartDataPolicy | null;
|
|
22
|
+
runtimeIssueContext?: ChartRuntimeIssueContext;
|
|
23
|
+
runtimeIssueReporter?: ChartRuntimeIssueReporter;
|
|
19
24
|
};
|
|
20
25
|
type PlotProps = {
|
|
21
26
|
plot: HTMLElement | SVGSVGElement;
|
|
22
27
|
};
|
|
23
28
|
type VgPlotChartProps = SpecProps | PlotProps;
|
|
24
|
-
export type RetainedVgPlotChart = {
|
|
25
|
-
element: object;
|
|
26
|
-
params?: Map<string, Param<any> | Selection>;
|
|
27
|
-
specKey: string;
|
|
28
|
-
};
|
|
29
|
-
export type VgPlotChartRetention = {
|
|
30
|
-
chart?: RetainedVgPlotChart;
|
|
31
|
-
setChart: (chart: RetainedVgPlotChart) => void;
|
|
32
|
-
};
|
|
33
29
|
export declare function isSpecProps(props: VgPlotChartProps): props is SpecProps;
|
|
34
30
|
export declare function isPlotProps(props: VgPlotChartProps): props is PlotProps;
|
|
35
|
-
export
|
|
31
|
+
export type { VgPlotChartRetention } from './useVgPlotChartRetention';
|
|
32
|
+
export { destroyRetainedVgPlotChart } from './useVgPlotChartRetention';
|
|
33
|
+
export type { RetainedVgPlotChart } from './useVgPlotChartRetention';
|
|
36
34
|
/**
|
|
37
35
|
* Renders a Vega-Lite chart using the Mosaic library.
|
|
38
36
|
*
|
|
@@ -41,5 +39,4 @@ export declare function destroyRetainedVgPlotChart(chart: RetainedVgPlotChart):
|
|
|
41
39
|
* @returns {React.ReactElement} The rendered chart component.
|
|
42
40
|
*/
|
|
43
41
|
export declare const VgPlotChart: FC<VgPlotChartProps>;
|
|
44
|
-
export {};
|
|
45
42
|
//# sourceMappingURL=VgPlotChart.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VgPlotChart.d.ts","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"VgPlotChart.d.ts","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AACzC,OAAO,EACL,EAAE,EAOH,MAAM,OAAO,CAAC;AAGf,OAAO,EAGL,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX;;;;;OAKG;IACH,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C;;;;OAIG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C,oBAAoB,CAAC,EAAE,yBAAyB,CAAC;CAClD,CAAC;AACF,KAAK,SAAS,GAAG;IAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;CAAC,CAAC;AACrD,KAAK,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,IAAI,SAAS,CAEvE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,IAAI,SAAS,CAEvE;AAGD,YAAY,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,0BAA0B,EAAC,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAC;AAoBnE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAuI5C,CAAC"}
|
package/dist/VgPlotChart.js
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { astToDOM, parseSpec } from '@uwdata/mosaic-spec';
|
|
3
2
|
import { memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
4
3
|
import { ResponsivePlot } from './ResponsivePlot';
|
|
4
|
+
import { useVgPlotChartError } from './useVgPlotChartError';
|
|
5
|
+
import { useVgPlotChartRetention, } from './useVgPlotChartRetention';
|
|
6
|
+
import { useVgPlotChartRender } from './useVgPlotChartRender';
|
|
7
|
+
import { VgPlotChartError } from './VgPlotChartError';
|
|
8
|
+
export function isSpecProps(props) {
|
|
9
|
+
return 'spec' in props;
|
|
10
|
+
}
|
|
11
|
+
export function isPlotProps(props) {
|
|
12
|
+
return 'plot' in props;
|
|
13
|
+
}
|
|
14
|
+
export { destroyRetainedVgPlotChart } from './useVgPlotChartRetention';
|
|
5
15
|
function areEquivalentParams(left, right) {
|
|
6
16
|
if (left === right) {
|
|
7
17
|
return true;
|
|
@@ -16,49 +26,6 @@ function areEquivalentParams(left, right) {
|
|
|
16
26
|
}
|
|
17
27
|
return true;
|
|
18
28
|
}
|
|
19
|
-
export function isSpecProps(props) {
|
|
20
|
-
return 'spec' in props;
|
|
21
|
-
}
|
|
22
|
-
export function isPlotProps(props) {
|
|
23
|
-
return 'plot' in props;
|
|
24
|
-
}
|
|
25
|
-
export function destroyRetainedVgPlotChart(chart) {
|
|
26
|
-
const plot = getPlotInstance(chart.element);
|
|
27
|
-
plot?.marks?.forEach((mark) => {
|
|
28
|
-
mark.destroy?.();
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
function getPlotInstance(element) {
|
|
32
|
-
const plot = element.value;
|
|
33
|
-
return plot && typeof plot === 'object' ? plot : null;
|
|
34
|
-
}
|
|
35
|
-
function resizeChartElement(element, size) {
|
|
36
|
-
const plot = getPlotInstance(element);
|
|
37
|
-
if (!plot?.setAttribute || !plot.render) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
const widthChanged = plot.setAttribute('width', size.width);
|
|
41
|
-
const heightChanged = plot.setAttribute('height', size.height);
|
|
42
|
-
if (widthChanged || heightChanged) {
|
|
43
|
-
void plot.render();
|
|
44
|
-
}
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
async function createSpecChartElement(spec, size, params) {
|
|
48
|
-
const sizedSpec = {
|
|
49
|
-
...spec,
|
|
50
|
-
width: size.width,
|
|
51
|
-
height: size.height,
|
|
52
|
-
};
|
|
53
|
-
const ast = await parseSpec(sizedSpec);
|
|
54
|
-
const options = params
|
|
55
|
-
? { params: params }
|
|
56
|
-
: undefined;
|
|
57
|
-
return (await astToDOM(ast, options)).element;
|
|
58
|
-
}
|
|
59
|
-
function asPlotDomElement(element) {
|
|
60
|
-
return element;
|
|
61
|
-
}
|
|
62
29
|
/**
|
|
63
30
|
* Renders a Vega-Lite chart using the Mosaic library.
|
|
64
31
|
*
|
|
@@ -69,9 +36,9 @@ function asPlotDomElement(element) {
|
|
|
69
36
|
export const VgPlotChart = memo((props) => {
|
|
70
37
|
const [containerSize, setContainerSize] = useState(null);
|
|
71
38
|
const containerRef = useRef(null);
|
|
72
|
-
const localSpecChartRef = useRef(null);
|
|
73
|
-
const renderVersionRef = useRef(0);
|
|
74
39
|
const specKey = useMemo(() => (isSpecProps(props) ? JSON.stringify(props.spec) : null), [props]);
|
|
40
|
+
const { error, setError } = useVgPlotChartError(specKey);
|
|
41
|
+
const { getCachedChart, setCachedChart } = useVgPlotChartRetention(specKey, isSpecProps(props) ? props.params : undefined, isSpecProps(props) ? props.retention : undefined);
|
|
75
42
|
const handleResize = useCallback((size) => {
|
|
76
43
|
setContainerSize((prev) => {
|
|
77
44
|
if (prev && prev.width === size.width && prev.height === size.height) {
|
|
@@ -80,55 +47,64 @@ export const VgPlotChart = memo((props) => {
|
|
|
80
47
|
return size;
|
|
81
48
|
});
|
|
82
49
|
}, []);
|
|
50
|
+
const handleError = useCallback((error) => {
|
|
51
|
+
setError(error);
|
|
52
|
+
}, [setError]);
|
|
53
|
+
const handleChartCreated = useCallback((chart) => {
|
|
54
|
+
setCachedChart(chart);
|
|
55
|
+
}, [setCachedChart]);
|
|
56
|
+
const cachedChart = useMemo(() => getCachedChart(), [getCachedChart]);
|
|
57
|
+
// Handle PlotProps: directly render the provided plot element
|
|
83
58
|
useEffect(() => {
|
|
84
59
|
const container = containerRef.current;
|
|
85
|
-
if (!container) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
if (isPlotProps(props)) {
|
|
89
|
-
container.replaceChildren(props.plot);
|
|
60
|
+
if (!container || !isPlotProps(props)) {
|
|
90
61
|
return;
|
|
91
62
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const renderVersion = ++renderVersionRef.current;
|
|
112
|
-
let cancelled = false;
|
|
113
|
-
void createSpecChartElement(props.spec, containerSize, props.params).then((element) => {
|
|
114
|
-
if (cancelled ||
|
|
115
|
-
renderVersion !== renderVersionRef.current ||
|
|
116
|
-
!containerRef.current) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const nextChart = {
|
|
120
|
-
element,
|
|
121
|
-
params: props.params,
|
|
122
|
-
specKey: specKey ?? JSON.stringify(props.spec),
|
|
63
|
+
container.replaceChildren(props.plot);
|
|
64
|
+
}, [props]);
|
|
65
|
+
// Handle SpecProps: render from spec using hooks
|
|
66
|
+
const renderParams = useMemo(() => {
|
|
67
|
+
if (!isSpecProps(props)) {
|
|
68
|
+
return {
|
|
69
|
+
containerRef,
|
|
70
|
+
spec: {},
|
|
71
|
+
specKey: null,
|
|
72
|
+
params: undefined,
|
|
73
|
+
containerSize: null,
|
|
74
|
+
cachedChart: null,
|
|
75
|
+
onChartCreated: handleChartCreated,
|
|
76
|
+
onError: handleError,
|
|
77
|
+
dataPolicy: undefined,
|
|
78
|
+
runtimeIssueContext: undefined,
|
|
79
|
+
runtimeIssueReporter: undefined,
|
|
123
80
|
};
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
containerRef
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
containerRef,
|
|
84
|
+
spec: props.spec,
|
|
85
|
+
specKey,
|
|
86
|
+
params: props.params,
|
|
87
|
+
containerSize,
|
|
88
|
+
cachedChart,
|
|
89
|
+
onChartCreated: handleChartCreated,
|
|
90
|
+
onError: handleError,
|
|
91
|
+
dataPolicy: props.dataPolicy,
|
|
92
|
+
runtimeIssueContext: props.runtimeIssueContext,
|
|
93
|
+
runtimeIssueReporter: props.runtimeIssueReporter,
|
|
130
94
|
};
|
|
131
|
-
}, [
|
|
95
|
+
}, [
|
|
96
|
+
props,
|
|
97
|
+
specKey,
|
|
98
|
+
containerSize,
|
|
99
|
+
cachedChart,
|
|
100
|
+
handleChartCreated,
|
|
101
|
+
handleError,
|
|
102
|
+
]);
|
|
103
|
+
useVgPlotChartRender(renderParams);
|
|
104
|
+
// Show error message if present
|
|
105
|
+
if (error) {
|
|
106
|
+
return _jsx(VgPlotChartError, { error: error });
|
|
107
|
+
}
|
|
132
108
|
return (_jsx(ResponsivePlot, { ref: containerRef, onResize: handleResize, className: "h-full w-full" }));
|
|
133
109
|
}, (prevProps, nextProps) => {
|
|
134
110
|
if (isPlotProps(prevProps) && isPlotProps(nextProps)) {
|
|
@@ -138,7 +114,15 @@ export const VgPlotChart = memo((props) => {
|
|
|
138
114
|
const specEqual = JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);
|
|
139
115
|
const paramsEqual = areEquivalentParams(prevProps.params, nextProps.params);
|
|
140
116
|
const retentionEqual = prevProps.retention === nextProps.retention;
|
|
141
|
-
|
|
117
|
+
const policyEqual = prevProps.dataPolicy === nextProps.dataPolicy;
|
|
118
|
+
const issueReporterEqual = prevProps.runtimeIssueReporter === nextProps.runtimeIssueReporter;
|
|
119
|
+
const issueContextEqual = prevProps.runtimeIssueContext === nextProps.runtimeIssueContext;
|
|
120
|
+
return (specEqual &&
|
|
121
|
+
paramsEqual &&
|
|
122
|
+
retentionEqual &&
|
|
123
|
+
policyEqual &&
|
|
124
|
+
issueContextEqual &&
|
|
125
|
+
issueReporterEqual);
|
|
142
126
|
}
|
|
143
127
|
return false;
|
|
144
128
|
});
|
package/dist/VgPlotChart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VgPlotChart.js","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {astToDOM, parseSpec, Spec} from '@uwdata/mosaic-spec';\nimport {\n FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {PlotSize, ResponsivePlot} from './ResponsivePlot';\n\ntype SpecProps = {\n spec: Spec;\n /**\n * Pre-defined params/selections to inject when rendering the spec.\n * Keys are param names (without $), values are Param or Selection instances.\n * This allows multiple independently-rendered specs to share the same\n * Selection objects for cross-filtering.\n */\n params?: Map<string, Param<any> | Selection>;\n /**\n * Optional retention adapter for preserving the underlying vgplot\n * instance across temporary unmount/remount cycles, such as dashboard tab\n * switches.\n */\n retention?: VgPlotChartRetention;\n};\ntype PlotProps = {plot: HTMLElement | SVGSVGElement};\ntype VgPlotChartProps = SpecProps | PlotProps;\ntype PlotDomElement = HTMLElement | SVGSVGElement;\n\nexport type RetainedVgPlotChart = {\n element: object;\n params?: Map<string, Param<any> | Selection>;\n specKey: string;\n};\n\nexport type VgPlotChartRetention = {\n chart?: RetainedVgPlotChart;\n setChart: (chart: RetainedVgPlotChart) => void;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void}>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction areEquivalentParams(\n left?: Map<string, Param<any> | Selection>,\n right?: Map<string, Param<any> | Selection>,\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nexport function isSpecProps(props: VgPlotChartProps): props is SpecProps {\n return 'spec' in props;\n}\n\nexport function isPlotProps(props: VgPlotChartProps): props is PlotProps {\n return 'plot' in props;\n}\n\nexport function destroyRetainedVgPlotChart(chart: RetainedVgPlotChart) {\n const plot = getPlotInstance(chart.element);\n plot?.marks?.forEach((mark) => {\n mark.destroy?.();\n });\n}\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n const plot = (element as HTMLElement & {value?: unknown}).value;\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nfunction resizeChartElement(element: object, size: PlotSize): boolean {\n const plot = getPlotInstance(element);\n if (!plot?.setAttribute || !plot.render) {\n return false;\n }\n\n const widthChanged = plot.setAttribute('width', size.width);\n const heightChanged = plot.setAttribute('height', size.height);\n if (widthChanged || heightChanged) {\n void plot.render();\n }\n return true;\n}\n\nasync function createSpecChartElement(\n spec: Spec,\n size: PlotSize,\n params?: Map<string, Param<any> | Selection>,\n): Promise<PlotDomElement> {\n const sizedSpec = {\n ...spec,\n width: size.width,\n height: size.height,\n } as Spec;\n\n const ast = await parseSpec(sizedSpec);\n const options = params\n ? {params: params as unknown as Map<string, Param<any>>}\n : undefined;\n\n return (await astToDOM(ast, options)).element;\n}\n\nfunction asPlotDomElement(element: object): PlotDomElement {\n return element as PlotDomElement;\n}\n\n/**\n * Renders a Vega-Lite chart using the Mosaic library.\n *\n * @param {VgPlotChartProps} props - The component props.\n * @param {Spec} props.spec - The Vega-Lite specification for the chart.\n * @returns {React.ReactElement} The rendered chart component.\n */\nexport const VgPlotChart: FC<VgPlotChartProps> = memo(\n (props) => {\n const [containerSize, setContainerSize] = useState<PlotSize | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const localSpecChartRef = useRef<RetainedVgPlotChart | null>(null);\n const renderVersionRef = useRef(0);\n const specKey = useMemo(\n () => (isSpecProps(props) ? JSON.stringify(props.spec) : null),\n [props],\n );\n\n const handleResize = useCallback((size: PlotSize) => {\n setContainerSize((prev) => {\n if (prev && prev.width === size.width && prev.height === size.height) {\n return prev;\n }\n return size;\n });\n }, []);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n if (isPlotProps(props)) {\n container.replaceChildren(props.plot);\n return;\n }\n\n if (!containerSize) {\n return;\n }\n\n const cached = props.retention?.chart;\n const current =\n localSpecChartRef.current &&\n localSpecChartRef.current.specKey === specKey &&\n areEquivalentParams(localSpecChartRef.current.params, props.params)\n ? localSpecChartRef.current\n : cached &&\n cached.specKey === specKey &&\n areEquivalentParams(cached.params, props.params)\n ? cached\n : null;\n\n if (current) {\n localSpecChartRef.current = current;\n container.replaceChildren(asPlotDomElement(current.element));\n resizeChartElement(current.element, containerSize);\n return;\n }\n\n const renderVersion = ++renderVersionRef.current;\n let cancelled = false;\n\n void createSpecChartElement(props.spec, containerSize, props.params).then(\n (element) => {\n if (\n cancelled ||\n renderVersion !== renderVersionRef.current ||\n !containerRef.current\n ) {\n return;\n }\n\n const nextChart = {\n element,\n params: props.params,\n specKey: specKey ?? JSON.stringify(props.spec),\n } satisfies RetainedVgPlotChart;\n\n localSpecChartRef.current = nextChart;\n props.retention?.setChart(nextChart);\n containerRef.current.replaceChildren(element);\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [containerSize, props, specKey]);\n\n return (\n <ResponsivePlot\n ref={containerRef}\n onResize={handleResize}\n className=\"h-full w-full\"\n />\n );\n },\n (prevProps, nextProps) => {\n if (isPlotProps(prevProps) && isPlotProps(nextProps)) {\n return prevProps.plot === nextProps.plot;\n }\n if (isSpecProps(prevProps) && isSpecProps(nextProps)) {\n const specEqual =\n JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);\n const paramsEqual = areEquivalentParams(\n prevProps.params,\n nextProps.params,\n );\n const retentionEqual = prevProps.retention === nextProps.retention;\n return specEqual && paramsEqual && retentionEqual;\n }\n return false;\n },\n);\n\nVgPlotChart.displayName = 'VgPlotChart';\n"]}
|
|
1
|
+
{"version":3,"file":"VgPlotChart.js","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,IAAI,EACJ,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAW,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAEL,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AA6BpD,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAID,OAAO,EAAC,0BAA0B,EAAC,MAAM,2BAA2B,CAAC;AAGrE,SAAS,mBAAmB,CAC1B,IAA0C,EAC1C,KAA2C;IAE3C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAyB,IAAI,CACnD,CAAC,KAAK,EAAE,EAAE;IACR,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAC9D,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAC,cAAc,EAAE,cAAc,EAAC,GAAG,uBAAuB,CAC9D,OAAO,EACP,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC7C,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACjD,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAClD,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAY,EAAE,EAAE;QACf,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,KAA0B,EAAE,EAAE;QAC7B,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAEtE,8DAA8D;IAC9D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,iDAAiD;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,YAAY;gBACZ,IAAI,EAAE,EAAU;gBAChB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,SAAS;gBACjB,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,kBAAkB;gBAClC,OAAO,EAAE,WAAW;gBACpB,UAAU,EAAE,SAAS;gBACrB,mBAAmB,EAAE,SAAS;gBAC9B,oBAAoB,EAAE,SAAS;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,YAAY;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;YACP,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa;YACb,WAAW;YACX,cAAc,EAAE,kBAAkB;YAClC,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;SACjD,CAAC;IACJ,CAAC,EAAE;QACD,KAAK;QACL,OAAO;QACP,aAAa;QACb,WAAW;QACX,kBAAkB;QAClB,WAAW;KACZ,CAAC,CAAC;IAEH,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEnC,gCAAgC;IAChC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC5C,CAAC;IAED,OAAO,CACL,KAAC,cAAc,IACb,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,eAAe,GACzB,CACH,CAAC;AACJ,CAAC,EACD,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;IACvB,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,mBAAmB,CACrC,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,MAAM,CACjB,CAAC;QACF,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,CAAC;QACnE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC;QAClE,MAAM,kBAAkB,GACtB,SAAS,CAAC,oBAAoB,KAAK,SAAS,CAAC,oBAAoB,CAAC;QACpE,MAAM,iBAAiB,GACrB,SAAS,CAAC,mBAAmB,KAAK,SAAS,CAAC,mBAAmB,CAAC;QAClE,OAAO,CACL,SAAS;YACT,WAAW;YACX,cAAc;YACd,WAAW;YACX,iBAAiB;YACjB,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CACF,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {Spec} from '@uwdata/mosaic-spec';\nimport {\n FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {PlotSize, ResponsivePlot} from './ResponsivePlot';\nimport {useVgPlotChartError} from './useVgPlotChartError';\nimport {\n RetainedVgPlotChart,\n useVgPlotChartRetention,\n VgPlotChartRetention,\n} from './useVgPlotChartRetention';\nimport {useVgPlotChartRender} from './useVgPlotChartRender';\nimport {VgPlotChartError} from './VgPlotChartError';\nimport type {\n ChartDataPolicy,\n ChartRuntimeIssueContext,\n ChartRuntimeIssueReporter,\n} from './chart-runtime';\n\ntype SpecProps = {\n spec: Spec;\n /**\n * Pre-defined params/selections to inject when rendering the spec.\n * Keys are param names (without $), values are Param or Selection instances.\n * This allows multiple independently-rendered specs to share the same\n * Selection objects for cross-filtering.\n */\n params?: Map<string, Param<any> | Selection>;\n /**\n * Optional retention adapter for preserving the underlying vgplot\n * instance across temporary unmount/remount cycles, such as dashboard tab\n * switches.\n */\n retention?: VgPlotChartRetention;\n dataPolicy?: ChartDataPolicy | null;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n};\ntype PlotProps = {plot: HTMLElement | SVGSVGElement};\ntype VgPlotChartProps = SpecProps | PlotProps;\n\nexport function isSpecProps(props: VgPlotChartProps): props is SpecProps {\n return 'spec' in props;\n}\n\nexport function isPlotProps(props: VgPlotChartProps): props is PlotProps {\n return 'plot' in props;\n}\n\n// Re-export types for external use\nexport type {VgPlotChartRetention} from './useVgPlotChartRetention';\nexport {destroyRetainedVgPlotChart} from './useVgPlotChartRetention';\nexport type {RetainedVgPlotChart} from './useVgPlotChartRetention';\n\nfunction areEquivalentParams(\n left?: Map<string, Param<any> | Selection>,\n right?: Map<string, Param<any> | Selection>,\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Renders a Vega-Lite chart using the Mosaic library.\n *\n * @param {VgPlotChartProps} props - The component props.\n * @param {Spec} props.spec - The Vega-Lite specification for the chart.\n * @returns {React.ReactElement} The rendered chart component.\n */\nexport const VgPlotChart: FC<VgPlotChartProps> = memo(\n (props) => {\n const [containerSize, setContainerSize] = useState<PlotSize | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const specKey = useMemo(\n () => (isSpecProps(props) ? JSON.stringify(props.spec) : null),\n [props],\n );\n\n const {error, setError} = useVgPlotChartError(specKey);\n const {getCachedChart, setCachedChart} = useVgPlotChartRetention(\n specKey,\n isSpecProps(props) ? props.params : undefined,\n isSpecProps(props) ? props.retention : undefined,\n );\n\n const handleResize = useCallback((size: PlotSize) => {\n setContainerSize((prev) => {\n if (prev && prev.width === size.width && prev.height === size.height) {\n return prev;\n }\n return size;\n });\n }, []);\n\n const handleError = useCallback(\n (error: Error) => {\n setError(error);\n },\n [setError],\n );\n\n const handleChartCreated = useCallback(\n (chart: RetainedVgPlotChart) => {\n setCachedChart(chart);\n },\n [setCachedChart],\n );\n\n const cachedChart = useMemo(() => getCachedChart(), [getCachedChart]);\n\n // Handle PlotProps: directly render the provided plot element\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !isPlotProps(props)) {\n return;\n }\n\n container.replaceChildren(props.plot);\n }, [props]);\n\n // Handle SpecProps: render from spec using hooks\n const renderParams = useMemo(() => {\n if (!isSpecProps(props)) {\n return {\n containerRef,\n spec: {} as Spec,\n specKey: null,\n params: undefined,\n containerSize: null,\n cachedChart: null,\n onChartCreated: handleChartCreated,\n onError: handleError,\n dataPolicy: undefined,\n runtimeIssueContext: undefined,\n runtimeIssueReporter: undefined,\n };\n }\n\n return {\n containerRef,\n spec: props.spec,\n specKey,\n params: props.params,\n containerSize,\n cachedChart,\n onChartCreated: handleChartCreated,\n onError: handleError,\n dataPolicy: props.dataPolicy,\n runtimeIssueContext: props.runtimeIssueContext,\n runtimeIssueReporter: props.runtimeIssueReporter,\n };\n }, [\n props,\n specKey,\n containerSize,\n cachedChart,\n handleChartCreated,\n handleError,\n ]);\n\n useVgPlotChartRender(renderParams);\n\n // Show error message if present\n if (error) {\n return <VgPlotChartError error={error} />;\n }\n\n return (\n <ResponsivePlot\n ref={containerRef}\n onResize={handleResize}\n className=\"h-full w-full\"\n />\n );\n },\n (prevProps, nextProps) => {\n if (isPlotProps(prevProps) && isPlotProps(nextProps)) {\n return prevProps.plot === nextProps.plot;\n }\n if (isSpecProps(prevProps) && isSpecProps(nextProps)) {\n const specEqual =\n JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);\n const paramsEqual = areEquivalentParams(\n prevProps.params,\n nextProps.params,\n );\n const retentionEqual = prevProps.retention === nextProps.retention;\n const policyEqual = prevProps.dataPolicy === nextProps.dataPolicy;\n const issueReporterEqual =\n prevProps.runtimeIssueReporter === nextProps.runtimeIssueReporter;\n const issueContextEqual =\n prevProps.runtimeIssueContext === nextProps.runtimeIssueContext;\n return (\n specEqual &&\n paramsEqual &&\n retentionEqual &&\n policyEqual &&\n issueContextEqual &&\n issueReporterEqual\n );\n }\n return false;\n },\n);\n\nVgPlotChart.displayName = 'VgPlotChart';\n"]}
|