@sqlrooms/mosaic 0.29.0-rc.7 → 0.29.0-rc.8
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/LICENSE.md +2 -1
- package/README.md +134 -0
- package/dist/MosaicSlice.d.ts +1 -0
- package/dist/MosaicSlice.d.ts.map +1 -1
- package/dist/MosaicSlice.js.map +1 -1
- package/dist/VgPlotChart.d.ts.map +1 -1
- package/dist/VgPlotChart.js +9 -3
- package/dist/VgPlotChart.js.map +1 -1
- package/dist/ai/ai.d.ts +9 -4
- package/dist/ai/ai.d.ts.map +1 -1
- package/dist/ai/ai.js +91 -49
- package/dist/ai/ai.js.map +1 -1
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js.map +1 -1
- package/dist/charts/MosaicChart.d.ts +3 -1
- package/dist/charts/MosaicChart.d.ts.map +1 -1
- package/dist/charts/MosaicChart.js +2 -2
- package/dist/charts/MosaicChart.js.map +1 -1
- package/dist/charts/MosaicChartError.d.ts +8 -2
- package/dist/charts/MosaicChartError.d.ts.map +1 -1
- package/dist/charts/MosaicChartError.js +29 -3
- package/dist/charts/MosaicChartError.js.map +1 -1
- package/dist/charts/MosaicChartSettingsButton.d.ts +15 -0
- package/dist/charts/MosaicChartSettingsButton.d.ts.map +1 -0
- package/dist/charts/MosaicChartSettingsButton.js +7 -0
- package/dist/charts/MosaicChartSettingsButton.js.map +1 -0
- package/dist/charts/MosaicChartView.d.ts +2 -0
- package/dist/charts/MosaicChartView.d.ts.map +1 -1
- package/dist/charts/MosaicChartView.js +20 -7
- package/dist/charts/MosaicChartView.js.map +1 -1
- package/dist/charts/chart-settings/MosaicChartSettings.d.ts.map +1 -1
- package/dist/charts/chart-settings/MosaicChartSettings.js +3 -3
- package/dist/charts/chart-settings/MosaicChartSettings.js.map +1 -1
- package/dist/charts/chart-settings/MosaicChartSettingsPanel.js +1 -1
- package/dist/charts/chart-settings/MosaicChartSettingsPanel.js.map +1 -1
- package/dist/charts/chart-settings/MosaicChartTypeSelector.d.ts.map +1 -1
- package/dist/charts/chart-settings/MosaicChartTypeSelector.js +11 -4
- package/dist/charts/chart-settings/MosaicChartTypeSelector.js.map +1 -1
- package/dist/charts/chart-types/base-types.d.ts +17 -6
- package/dist/charts/chart-types/base-types.d.ts.map +1 -1
- package/dist/charts/chart-types/base-types.js +3 -0
- package/dist/charts/chart-types/base-types.js.map +1 -1
- package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts.map +1 -1
- package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js +3 -8
- package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js.map +1 -1
- package/dist/charts/chart-types/chart-config.d.ts +3 -1
- package/dist/charts/chart-types/chart-config.d.ts.map +1 -1
- package/dist/charts/chart-types/chart-config.js +2 -2
- package/dist/charts/chart-types/chart-config.js.map +1 -1
- package/dist/charts/chart-types/count-plot/spec.d.ts +2 -1
- package/dist/charts/chart-types/count-plot/spec.d.ts.map +1 -1
- package/dist/charts/chart-types/count-plot/spec.js +65 -34
- package/dist/charts/chart-types/count-plot/spec.js.map +1 -1
- package/dist/charts/chart-types/count-plot/tool.js +1 -1
- package/dist/charts/chart-types/count-plot/tool.js.map +1 -1
- package/dist/charts/chart-types/createDefaultChartTypes.js +2 -2
- package/dist/charts/chart-types/createDefaultChartTypes.js.map +1 -1
- package/dist/charts/chart-types/custom-spec/spec.d.ts +2 -1
- package/dist/charts/chart-types/custom-spec/spec.d.ts.map +1 -1
- package/dist/charts/chart-types/custom-spec/spec.js +16 -12
- package/dist/charts/chart-types/custom-spec/spec.js.map +1 -1
- package/dist/charts/chart-types/errors.d.ts +25 -0
- package/dist/charts/chart-types/errors.d.ts.map +1 -1
- package/dist/charts/chart-types/errors.js +38 -0
- package/dist/charts/chart-types/errors.js.map +1 -1
- package/dist/charts/chart-types/heatmap/spec.d.ts +2 -1
- package/dist/charts/chart-types/heatmap/spec.d.ts.map +1 -1
- package/dist/charts/chart-types/heatmap/spec.js +53 -21
- package/dist/charts/chart-types/heatmap/spec.js.map +1 -1
- package/dist/charts/chart-types/heatmap/tool.js +2 -2
- package/dist/charts/chart-types/heatmap/tool.js.map +1 -1
- package/dist/charts/chart-types/histogram/HistogramSettings.d.ts.map +1 -1
- package/dist/charts/chart-types/histogram/HistogramSettings.js +3 -1
- package/dist/charts/chart-types/histogram/HistogramSettings.js.map +1 -1
- package/dist/charts/chart-types/histogram/schema.d.ts +2 -0
- package/dist/charts/chart-types/histogram/schema.d.ts.map +1 -1
- package/dist/charts/chart-types/histogram/schema.js +1 -0
- package/dist/charts/chart-types/histogram/schema.js.map +1 -1
- package/dist/charts/chart-types/histogram/spec.d.ts +2 -1
- package/dist/charts/chart-types/histogram/spec.d.ts.map +1 -1
- package/dist/charts/chart-types/histogram/spec.js +50 -27
- package/dist/charts/chart-types/histogram/spec.js.map +1 -1
- package/dist/charts/chart-types/histogram/tool.d.ts +2 -0
- package/dist/charts/chart-types/histogram/tool.d.ts.map +1 -1
- package/dist/charts/chart-types/histogram/tool.js +1 -1
- package/dist/charts/chart-types/histogram/tool.js.map +1 -1
- package/dist/charts/chart-types/index.d.ts +4 -4
- package/dist/charts/chart-types/index.js +4 -4
- package/dist/charts/chart-types/index.js.map +1 -1
- package/dist/charts/chart-types/line-chart/LineChartSettings.d.ts.map +1 -1
- package/dist/charts/chart-types/line-chart/LineChartSettings.js +4 -13
- package/dist/charts/chart-types/line-chart/LineChartSettings.js.map +1 -1
- package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts +7 -0
- package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts.map +1 -0
- package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js +22 -0
- package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js.map +1 -0
- package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts +7 -0
- package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts.map +1 -0
- package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js +42 -0
- package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js.map +1 -0
- package/dist/charts/chart-types/line-chart/schema.d.ts +2 -0
- package/dist/charts/chart-types/line-chart/schema.d.ts.map +1 -1
- package/dist/charts/chart-types/line-chart/schema.js +5 -0
- package/dist/charts/chart-types/line-chart/schema.js.map +1 -1
- package/dist/charts/chart-types/line-chart/spec.d.ts +2 -1
- package/dist/charts/chart-types/line-chart/spec.d.ts.map +1 -1
- package/dist/charts/chart-types/line-chart/spec.js +97 -65
- package/dist/charts/chart-types/line-chart/spec.js.map +1 -1
- package/dist/charts/chart-types/line-chart/tool.d.ts +2 -0
- package/dist/charts/chart-types/line-chart/tool.d.ts.map +1 -1
- package/dist/charts/chart-types/line-chart/tool.js +1 -1
- package/dist/charts/chart-types/line-chart/tool.js.map +1 -1
- package/dist/charts/chart-types/line-chart/utils.d.ts +7 -0
- package/dist/charts/chart-types/line-chart/utils.d.ts.map +1 -0
- package/dist/charts/chart-types/line-chart/utils.js +17 -0
- package/dist/charts/chart-types/line-chart/utils.js.map +1 -0
- package/dist/charts/chart-types/mosaicChartTypes.d.ts +4 -2
- package/dist/charts/chart-types/mosaicChartTypes.d.ts.map +1 -1
- package/dist/charts/chart-types/mosaicChartTypes.js +2 -2
- package/dist/charts/chart-types/mosaicChartTypes.js.map +1 -1
- package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts +3 -0
- package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts.map +1 -0
- package/dist/charts/chart-types/{bubble-chart/BubbleChartSettings.js → scatter-plot/ScatterPlotSettings.js} +4 -4
- package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.js.map +1 -0
- package/dist/charts/chart-types/scatter-plot/definition.d.ts +4 -0
- package/dist/charts/chart-types/scatter-plot/definition.d.ts.map +1 -0
- package/dist/charts/chart-types/scatter-plot/definition.js +24 -0
- package/dist/charts/chart-types/scatter-plot/definition.js.map +1 -0
- package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.d.ts +5 -5
- package/dist/charts/chart-types/scatter-plot/schema.d.ts.map +1 -0
- package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.js +5 -5
- package/dist/charts/chart-types/scatter-plot/schema.js.map +1 -0
- package/dist/charts/chart-types/scatter-plot/spec.d.ts +5 -0
- package/dist/charts/chart-types/scatter-plot/spec.d.ts.map +1 -0
- package/dist/charts/chart-types/scatter-plot/spec.js +81 -0
- package/dist/charts/chart-types/scatter-plot/spec.js.map +1 -0
- package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.d.ts +3 -3
- package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.d.ts.map +1 -1
- package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.js +17 -13
- package/dist/charts/chart-types/scatter-plot/tool.js.map +1 -0
- package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.d.ts.map +1 -1
- package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js +12 -5
- package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js.map +1 -1
- package/dist/charts/dashboard/MosaicDashboardChartRenderer.d.ts.map +1 -1
- package/dist/charts/dashboard/MosaicDashboardChartRenderer.js +2 -2
- package/dist/charts/dashboard/MosaicDashboardChartRenderer.js.map +1 -1
- package/dist/charts/useChartDataPolicy.d.ts.map +1 -1
- package/dist/charts/useChartDataPolicy.js +2 -1
- package/dist/charts/useChartDataPolicy.js.map +1 -1
- package/dist/charts/useChartPanelClients.d.ts +8 -0
- package/dist/charts/useChartPanelClients.d.ts.map +1 -0
- package/dist/charts/useChartPanelClients.js +22 -0
- package/dist/charts/useChartPanelClients.js.map +1 -0
- package/dist/charts/useMosaicChartRenderContext.d.ts +2 -3
- package/dist/charts/useMosaicChartRenderContext.d.ts.map +1 -1
- package/dist/charts/useMosaicChartRenderContext.js +15 -15
- package/dist/charts/useMosaicChartRenderContext.js.map +1 -1
- package/dist/charts/worksheet/ChartBlockHeader.d.ts.map +1 -1
- package/dist/charts/worksheet/ChartBlockHeader.js +4 -3
- package/dist/charts/worksheet/ChartBlockHeader.js.map +1 -1
- package/dist/charts/worksheet/ChartBlockRenderer.d.ts.map +1 -1
- package/dist/charts/worksheet/ChartBlockRenderer.js +3 -13
- package/dist/charts/worksheet/ChartBlockRenderer.js.map +1 -1
- package/dist/column-types-utils.d.ts.map +1 -1
- package/dist/column-types-utils.js +12 -4
- package/dist/column-types-utils.js.map +1 -1
- package/dist/components/AggregationSelector.d.ts.map +1 -1
- package/dist/components/AggregationSelector.js +9 -2
- package/dist/components/AggregationSelector.js.map +1 -1
- package/dist/components/BlockCaptionEditor.d.ts +20 -0
- package/dist/components/BlockCaptionEditor.d.ts.map +1 -0
- package/dist/components/BlockCaptionEditor.js +15 -0
- package/dist/components/BlockCaptionEditor.js.map +1 -0
- package/dist/components/ColorSelector.d.ts +12 -0
- package/dist/components/ColorSelector.d.ts.map +1 -0
- package/dist/components/ColorSelector.js +14 -0
- package/dist/components/ColorSelector.js.map +1 -0
- package/dist/components/ColumnSelector.d.ts +1 -0
- package/dist/components/ColumnSelector.d.ts.map +1 -1
- package/dist/components/ColumnSelector.js +2 -2
- package/dist/components/ColumnSelector.js.map +1 -1
- package/dist/components/Combobox.d.ts +45 -0
- package/dist/components/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox.js +58 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/FieldSelectorInput.d.ts +1 -0
- package/dist/components/FieldSelectorInput.d.ts.map +1 -1
- package/dist/components/FieldSelectorInput.js +4 -9
- package/dist/components/FieldSelectorInput.js.map +1 -1
- package/dist/components/MultiFieldSelector.d.ts +4 -1
- package/dist/components/MultiFieldSelector.d.ts.map +1 -1
- package/dist/components/MultiFieldSelector.js +4 -13
- package/dist/components/MultiFieldSelector.js.map +1 -1
- package/dist/components/TemporalGranularitySelector.d.ts.map +1 -1
- package/dist/components/TemporalGranularitySelector.js +13 -9
- package/dist/components/TemporalGranularitySelector.js.map +1 -1
- package/dist/components/useCombobox.d.ts +23 -0
- package/dist/components/useCombobox.d.ts.map +1 -0
- package/dist/components/useCombobox.js +26 -0
- package/dist/components/useCombobox.js.map +1 -0
- package/dist/constants/chart-colors.d.ts +3 -0
- package/dist/constants/chart-colors.d.ts.map +1 -0
- package/dist/constants/chart-colors.js +5 -0
- package/dist/constants/chart-colors.js.map +1 -0
- package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts +2 -1
- package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts.map +1 -1
- package/dist/dashboard/DefaultMosaicDashboardBlock.js +1 -1
- package/dist/dashboard/DefaultMosaicDashboardBlock.js.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.d.ts +22 -4
- package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.js +55 -0
- package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
- package/dist/dashboard/components/ResetFiltersButton.d.ts +14 -0
- package/dist/dashboard/components/ResetFiltersButton.d.ts.map +1 -0
- package/dist/dashboard/components/ResetFiltersButton.js +15 -0
- package/dist/dashboard/components/ResetFiltersButton.js.map +1 -0
- package/dist/dashboard/dashboard-types.d.ts +9 -3
- package/dist/dashboard/dashboard-types.d.ts.map +1 -1
- package/dist/dashboard/hooks/useDashboardResetFilters.d.ts +14 -0
- package/dist/dashboard/hooks/useDashboardResetFilters.d.ts.map +1 -0
- package/dist/dashboard/hooks/useDashboardResetFilters.js +39 -0
- package/dist/dashboard/hooks/useDashboardResetFilters.js.map +1 -0
- package/dist/dashboard/hooks/usePanelResetFilters.d.ts +16 -0
- package/dist/dashboard/hooks/usePanelResetFilters.d.ts.map +1 -0
- package/dist/dashboard/hooks/usePanelResetFilters.js +47 -0
- package/dist/dashboard/hooks/usePanelResetFilters.js.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.d.ts.map +1 -1
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js +3 -3
- package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js.map +1 -1
- package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts +7 -0
- package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js +18 -0
- package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js.map +1 -0
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.d.ts.map +1 -1
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js +4 -32
- package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js.map +1 -1
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts +2 -2
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts.map +1 -1
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.js +12 -10
- package/dist/dashboard/toolbar/MosaicDashboardToolbar.js.map +1 -1
- package/dist/dashboard/usePanelClientRegistration.d.ts +7 -0
- package/dist/dashboard/usePanelClientRegistration.d.ts.map +1 -0
- package/dist/dashboard/usePanelClientRegistration.js +30 -0
- package/dist/dashboard/usePanelClientRegistration.js.map +1 -0
- package/dist/dashboard/usePanelClients.d.ts +7 -0
- package/dist/dashboard/usePanelClients.d.ts.map +1 -0
- package/dist/dashboard/usePanelClients.js +13 -0
- package/dist/dashboard/usePanelClients.js.map +1 -0
- package/dist/data-table-explorer/DataTableExplorer.d.ts +4 -2
- package/dist/data-table-explorer/DataTableExplorer.d.ts.map +1 -1
- package/dist/data-table-explorer/DataTableExplorer.js +4 -4
- package/dist/data-table-explorer/DataTableExplorer.js.map +1 -1
- package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts.map +1 -1
- package/dist/data-table-explorer/DataTableExplorerCategoryClient.js +1 -0
- package/dist/data-table-explorer/DataTableExplorerCategoryClient.js.map +1 -1
- package/dist/data-table-explorer/createDataTableExplorerStore.d.ts +3 -0
- package/dist/data-table-explorer/createDataTableExplorerStore.d.ts.map +1 -1
- package/dist/data-table-explorer/createDataTableExplorerStore.js +6 -0
- package/dist/data-table-explorer/createDataTableExplorerStore.js.map +1 -1
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts +4 -0
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts.map +1 -0
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js +13 -0
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js.map +1 -0
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.d.ts.map +1 -1
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js +22 -7
- package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js.map +1 -1
- package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts +13 -0
- package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts.map +1 -0
- package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js +32 -0
- package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js.map +1 -0
- package/dist/data-table-explorer/dataTableExplorerController.d.ts +5 -1
- package/dist/data-table-explorer/dataTableExplorerController.d.ts.map +1 -1
- package/dist/data-table-explorer/dataTableExplorerController.js +5 -2
- package/dist/data-table-explorer/dataTableExplorerController.js.map +1 -1
- package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts +12 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js +19 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts +30 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js +120 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts +28 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js +40 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts +13 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js +40 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts +18 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js +23 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts +27 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js +28 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts +15 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts.map +1 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js +21 -0
- package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js.map +1 -0
- package/dist/data-table-explorer/types.d.ts +6 -3
- package/dist/data-table-explorer/types.d.ts.map +1 -1
- package/dist/data-table-explorer/types.js.map +1 -1
- package/dist/data-table-explorer/useDataTableExplorer.d.ts.map +1 -1
- package/dist/data-table-explorer/useDataTableExplorer.js +12 -275
- package/dist/data-table-explorer/useDataTableExplorer.js.map +1 -1
- package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts +1 -0
- package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts.map +1 -1
- package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js +4 -2
- package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js.map +1 -1
- package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.d.ts.map +1 -1
- package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js +3 -3
- package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/useVgPlotChartRender.d.ts.map +1 -1
- package/dist/useVgPlotChartRender.js +125 -24
- package/dist/useVgPlotChartRender.js.map +1 -1
- package/dist/useVgPlotChartRetention.d.ts +11 -0
- package/dist/useVgPlotChartRetention.d.ts.map +1 -1
- package/dist/useVgPlotChartRetention.js.map +1 -1
- package/package.json +14 -14
- package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts +0 -3
- package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts.map +0 -1
- package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.js.map +0 -1
- package/dist/charts/chart-types/bubble-chart/definition.d.ts +0 -4
- package/dist/charts/chart-types/bubble-chart/definition.d.ts.map +0 -1
- package/dist/charts/chart-types/bubble-chart/definition.js +0 -24
- package/dist/charts/chart-types/bubble-chart/definition.js.map +0 -1
- package/dist/charts/chart-types/bubble-chart/schema.d.ts.map +0 -1
- package/dist/charts/chart-types/bubble-chart/schema.js.map +0 -1
- package/dist/charts/chart-types/bubble-chart/spec.d.ts +0 -4
- package/dist/charts/chart-types/bubble-chart/spec.d.ts.map +0 -1
- package/dist/charts/chart-types/bubble-chart/spec.js +0 -31
- package/dist/charts/chart-types/bubble-chart/spec.js.map +0 -1
- package/dist/charts/chart-types/bubble-chart/tool.js.map +0 -1
- package/dist/hooks/useDataTable.d.ts +0 -3
- package/dist/hooks/useDataTable.d.ts.map +0 -1
- package/dist/hooks/useDataTable.js +0 -28
- package/dist/hooks/useDataTable.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, cn, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@sqlrooms/ui';
|
|
3
|
+
import { Settings2Icon } from 'lucide-react';
|
|
4
|
+
export const MosaicChartSettingsButton = ({ className, isSettingsOpen, onToggleSettings, }) => {
|
|
5
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: cn('data-[state=active]:bg-accent h-6 w-6', className), onClick: onToggleSettings, "data-state": isSettingsOpen ? 'active' : 'inactive', children: _jsx(Settings2Icon, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Chart settings" })] }) }));
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=MosaicChartSettingsButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicChartSettingsButton.js","sourceRoot":"","sources":["../../src/charts/MosaicChartSettingsButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,EAAE,EACF,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAgB3C,MAAM,CAAC,MAAM,yBAAyB,GAAuC,CAAC,EAC5E,SAAS,EACT,cAAc,EACd,gBAAgB,GACjB,EAAE,EAAE;IACH,OAAO,CACL,KAAC,eAAe,cACd,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,EACjE,OAAO,EAAE,gBAAgB,gBACb,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,YAElD,KAAC,aAAa,IAAC,SAAS,EAAC,aAAa,GAAG,GAClC,GACM,EACjB,KAAC,cAAc,iCAAgC,IACvC,GACM,CACnB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {Settings2Icon} from 'lucide-react';\nimport {type FC} from 'react';\n\n/**\n * Props for MosaicChartSettingsButton.\n *\n * @param className - Optional CSS class name\n * @param isSettingsOpen - Whether settings panel is currently open\n * @param onToggleSettings - Callback to toggle settings panel visibility\n */\nexport type MosaicChartSettingsButtonProps = {\n className?: string;\n isSettingsOpen?: boolean;\n onToggleSettings: () => void;\n};\n\nexport const MosaicChartSettingsButton: FC<MosaicChartSettingsButtonProps> = ({\n className,\n isSettingsOpen,\n onToggleSettings,\n}) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('data-[state=active]:bg-accent h-6 w-6', className)}\n onClick={onToggleSettings}\n data-state={isSettingsOpen ? 'active' : 'inactive'}\n >\n <Settings2Icon className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Chart settings</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n"]}
|
|
@@ -8,6 +8,8 @@ export type MosaicChartViewProps = {
|
|
|
8
8
|
retentionKey?: string;
|
|
9
9
|
runtimeIssueKey?: string;
|
|
10
10
|
className?: string;
|
|
11
|
+
dashboardId?: string;
|
|
12
|
+
panelId?: string;
|
|
11
13
|
};
|
|
12
14
|
export declare const MosaicChartView: FC<MosaicChartViewProps>;
|
|
13
15
|
//# sourceMappingURL=MosaicChartView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartView.d.ts","sourceRoot":"","sources":["../../src/charts/MosaicChartView.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"MosaicChartView.d.ts","sourceRoot":"","sources":["../../src/charts/MosaicChartView.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,EAAoC,MAAM,OAAO,CAAC;AAGjE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AAW5D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAGvC,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAsHpD,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { SpinnerPane, cn } from '@sqlrooms/ui';
|
|
3
|
-
import { createElement, useMemo } from 'react';
|
|
3
|
+
import { createElement, useMemo, useEffect } from 'react';
|
|
4
4
|
import { VgPlotChart } from '../VgPlotChart';
|
|
5
5
|
import { useStoreWithMosaicDashboard } from '../dashboard/MosaicDashboardSlice';
|
|
6
|
+
import { usePanelClientRegistration } from '../dashboard/usePanelClientRegistration';
|
|
7
|
+
import { useChartPanelClients } from './useChartPanelClients';
|
|
6
8
|
import { MosaicChartRuntimeIssuePanel } from './MosaicChartRuntimeIssuePanel';
|
|
7
9
|
import { MosaicChartError } from './MosaicChartError';
|
|
8
10
|
import { useBrushSelectionParams } from './useBrushSelectionParams';
|
|
@@ -10,9 +12,12 @@ import { useChartDataPolicy } from './useChartDataPolicy';
|
|
|
10
12
|
import { useChartRetainerByKey } from './useChartRetainer';
|
|
11
13
|
import { useMosaicChartRenderContext } from './useMosaicChartRenderContext';
|
|
12
14
|
import { useRuntimeIssueReporter } from './useRuntimeIssueReporter';
|
|
13
|
-
|
|
15
|
+
import { getChartTableReference } from './chart-types/base-types';
|
|
16
|
+
export const MosaicChartView = ({ dataTable, config, selectionName, retentionKey, runtimeIssueKey, className, dashboardId, panelId, }) => {
|
|
14
17
|
const connection = useStoreWithMosaicDashboard((state) => state.mosaic.connection);
|
|
15
18
|
const retention = useChartRetainerByKey(retentionKey);
|
|
19
|
+
const chartClients = useChartPanelClients(retention);
|
|
20
|
+
usePanelClientRegistration(dashboardId, panelId, chartClients);
|
|
16
21
|
const params = useBrushSelectionParams(selectionName);
|
|
17
22
|
const dataPolicy = useChartDataPolicy(dataTable, config);
|
|
18
23
|
const runtimeIssueReporter = useRuntimeIssueReporter(runtimeIssueKey);
|
|
@@ -23,25 +28,33 @@ export const MosaicChartView = ({ dataTable, config, selectionName, retentionKey
|
|
|
23
28
|
const issue = useStoreWithMosaicDashboard((state) => runtimeIssueKey
|
|
24
29
|
? state.mosaicDashboard.getPanelIssueByKey(runtimeIssueKey)
|
|
25
30
|
: undefined);
|
|
26
|
-
const
|
|
31
|
+
const clearPanelIssue = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.clearPanelIssueByKey);
|
|
32
|
+
// Clear issue when config changes - new config means user is trying different settings
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (runtimeIssueKey && issue) {
|
|
35
|
+
clearPanelIssue(runtimeIssueKey);
|
|
36
|
+
}
|
|
37
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
38
|
+
}, [config, runtimeIssueKey, clearPanelIssue]);
|
|
39
|
+
const renderContext = useMosaicChartRenderContext(dataTable, config, selectionName);
|
|
27
40
|
if (connection.status === 'loading' || connection.status === 'idle') {
|
|
28
41
|
return _jsx(SpinnerPane, { className: "h-full w-full" });
|
|
29
42
|
}
|
|
30
43
|
if (connection.status === 'error') {
|
|
31
44
|
return (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm", children: "Mosaic connection failed" }));
|
|
32
45
|
}
|
|
46
|
+
if (renderContext.type === 'error') {
|
|
47
|
+
return (_jsx("div", { className: cn('flex h-full flex-col items-center justify-center', className), children: _jsx(MosaicChartError, { error: renderContext.error }) }));
|
|
48
|
+
}
|
|
33
49
|
if (issue) {
|
|
34
50
|
return _jsx(MosaicChartRuntimeIssuePanel, { issue: issue });
|
|
35
51
|
}
|
|
36
|
-
if (renderContext.type === 'error') {
|
|
37
|
-
return (_jsx("div", { className: cn('flex h-full flex-col items-center justify-center', className), children: _jsx(MosaicChartError, { title: renderContext.title, message: renderContext.message }) }));
|
|
38
|
-
}
|
|
39
52
|
if (renderContext.type === 'spec') {
|
|
40
53
|
return (_jsx("div", { className: cn('h-full w-full', className), children: _jsx(VgPlotChart, { spec: renderContext.spec, params: params, retention: retention, dataPolicy: dataPolicy, runtimeIssueContext: runtimeIssueContext, runtimeIssueReporter: runtimeIssueReporter }) }));
|
|
41
54
|
}
|
|
42
55
|
if (renderContext.type === 'component') {
|
|
43
56
|
return (_jsx("div", { className: cn('h-full w-full', className), children: createElement(renderContext.renderer, {
|
|
44
|
-
tableName: renderContext.dataTable
|
|
57
|
+
tableName: getChartTableReference(renderContext.dataTable),
|
|
45
58
|
config,
|
|
46
59
|
coordinator: connection.coordinator,
|
|
47
60
|
params,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartView.js","sourceRoot":"","sources":["../../src/charts/MosaicChartView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAE,EAAE,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAU,aAAa,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MosaicChartView.js","sourceRoot":"","sources":["../../src/charts/MosaicChartView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SpinnerPane, cn} from '@sqlrooms/ui';\nimport {type FC, createElement, useMemo, useEffect} from 'react';\nimport {VgPlotChart} from '../VgPlotChart';\nimport type {ChartRuntimeIssueContext} from '../chart-runtime';\nimport type {ChartConfig} from './chart-types/chart-config';\nimport {useStoreWithMosaicDashboard} from '../dashboard/MosaicDashboardSlice';\nimport {usePanelClientRegistration} from '../dashboard/usePanelClientRegistration';\nimport {useChartPanelClients} from './useChartPanelClients';\nimport {MosaicChartRuntimeIssuePanel} from './MosaicChartRuntimeIssuePanel';\nimport {MosaicChartError} from './MosaicChartError';\nimport {useBrushSelectionParams} from './useBrushSelectionParams';\nimport {useChartDataPolicy} from './useChartDataPolicy';\nimport {useChartRetainerByKey} from './useChartRetainer';\nimport {useMosaicChartRenderContext} from './useMosaicChartRenderContext';\nimport {useRuntimeIssueReporter} from './useRuntimeIssueReporter';\nimport {DataTable} from '@sqlrooms/db';\nimport {getChartTableReference} from './chart-types/base-types';\n\nexport type MosaicChartViewProps = {\n dataTable?: DataTable;\n config: ChartConfig;\n selectionName?: string;\n retentionKey?: string;\n runtimeIssueKey?: string;\n className?: string;\n dashboardId?: string;\n panelId?: string;\n};\n\nexport const MosaicChartView: FC<MosaicChartViewProps> = ({\n dataTable,\n config,\n selectionName,\n retentionKey,\n runtimeIssueKey,\n className,\n dashboardId,\n panelId,\n}) => {\n const connection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.connection,\n );\n\n const retention = useChartRetainerByKey(retentionKey);\n const chartClients = useChartPanelClients(retention);\n\n usePanelClientRegistration(dashboardId, panelId, chartClients);\n\n const params = useBrushSelectionParams(selectionName);\n const dataPolicy = useChartDataPolicy(dataTable, config);\n\n const runtimeIssueReporter = useRuntimeIssueReporter(runtimeIssueKey);\n\n const runtimeIssueContext: ChartRuntimeIssueContext = useMemo(\n () => ({\n panelId: runtimeIssueKey ?? retentionKey ?? config.chartType,\n chartType: config.chartType,\n }),\n [config.chartType, retentionKey, runtimeIssueKey],\n );\n\n const issue = useStoreWithMosaicDashboard((state) =>\n runtimeIssueKey\n ? state.mosaicDashboard.getPanelIssueByKey(runtimeIssueKey)\n : undefined,\n );\n\n const clearPanelIssue = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.clearPanelIssueByKey,\n );\n\n // Clear issue when config changes - new config means user is trying different settings\n useEffect(() => {\n if (runtimeIssueKey && issue) {\n clearPanelIssue(runtimeIssueKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config, runtimeIssueKey, clearPanelIssue]);\n\n const renderContext = useMosaicChartRenderContext(\n dataTable,\n config,\n selectionName,\n );\n\n if (connection.status === 'loading' || connection.status === 'idle') {\n return <SpinnerPane className=\"h-full w-full\" />;\n }\n\n if (connection.status === 'error') {\n return (\n <div className=\"text-muted-foreground flex h-full items-center justify-center text-sm\">\n Mosaic connection failed\n </div>\n );\n }\n\n if (renderContext.type === 'error') {\n return (\n <div\n className={cn(\n 'flex h-full flex-col items-center justify-center',\n className,\n )}\n >\n <MosaicChartError error={renderContext.error} />\n </div>\n );\n }\n\n if (issue) {\n return <MosaicChartRuntimeIssuePanel issue={issue} />;\n }\n\n if (renderContext.type === 'spec') {\n return (\n <div className={cn('h-full w-full', className)}>\n <VgPlotChart\n spec={renderContext.spec}\n params={params}\n retention={retention}\n dataPolicy={dataPolicy}\n runtimeIssueContext={runtimeIssueContext}\n runtimeIssueReporter={runtimeIssueReporter}\n />\n </div>\n );\n }\n\n if (renderContext.type === 'component') {\n return (\n <div className={cn('h-full w-full', className)}>\n {createElement(renderContext.renderer, {\n tableName: getChartTableReference(renderContext.dataTable),\n config,\n coordinator: connection.coordinator,\n params,\n retention,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n })}\n </div>\n );\n }\n\n return null;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartSettings.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettings.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAC,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAgB,MAAM,OAAO,CAAC;AAMrE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,KAAK,WAAW,EAAiB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"MosaicChartSettings.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettings.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAC,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAgB,MAAM,OAAO,CAAC;AAMrE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,KAAK,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAahE,UAAU,4BAA4B;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CACzC;AA6HD,eAAO,MAAM,mBAAmB;;;;;;;;;;;kBA7GuB,MAAM,IAAI;;;iBAuBd,MAAM,IAAI;;CA8FnD,CAAC"}
|
|
@@ -18,7 +18,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
18
18
|
import { createElement } from 'react';
|
|
19
19
|
import { MosaicChartTypeSelector } from './MosaicChartTypeSelector';
|
|
20
20
|
import { MosaicChartSettingsProvider, useMosaicChartSettingsContext, } from './MosaicChartSettingsContext';
|
|
21
|
-
import { Button } from '@sqlrooms/ui';
|
|
21
|
+
import { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@sqlrooms/ui';
|
|
22
22
|
import { CodeIcon, XIcon } from 'lucide-react';
|
|
23
23
|
import { useChartTypeDefinition } from '../useChartTypeDefinition';
|
|
24
24
|
import { Field } from '../../components/Field';
|
|
@@ -27,10 +27,10 @@ const MosaicChartSettingsRoot = ({ config, columns, onChange, children }) => {
|
|
|
27
27
|
return (_jsx(MosaicChartSettingsProvider, { config: config, columns: columns, onChange: onChange, children: children }));
|
|
28
28
|
};
|
|
29
29
|
const MosaicChartSettingsViewSpecButton = ({ onClick, }) => {
|
|
30
|
-
return (_jsx(Button, { variant: "ghost", size: "icon", className: "h-5 w-5", onClick: onClick,
|
|
30
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-5 w-5", onClick: onClick, "aria-label": "View spec", children: _jsx(CodeIcon, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "View spec" })] }) }));
|
|
31
31
|
};
|
|
32
32
|
const MosaicChartSettingsCloseButton = ({ onClick, }) => {
|
|
33
|
-
return (_jsx(Button, { variant: "ghost", size: "icon", className: "h-5 w-5", onClick: onClick, "aria-label": "Close", children: _jsx(XIcon, { className: "h-3.5 w-3.5" }) }));
|
|
33
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-5 w-5", onClick: onClick, "aria-label": "Close", children: _jsx(XIcon, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Close" })] }) }));
|
|
34
34
|
};
|
|
35
35
|
const MosaicChartSettingsHeader = ({ children }) => {
|
|
36
36
|
return (_jsx("div", { className: "flex items-center justify-between border-b px-3 py-1.5 text-xs font-medium", children: children }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartSettings.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettings.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAkC,aAAa,EAAC,MAAM,OAAO,CAAC;AACrE,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,
|
|
1
|
+
{"version":3,"file":"MosaicChartSettings.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Chart settings compound component for configuring chart types and their parameters.\n *\n * @example\n * ```tsx\n * <MosaicChartSettings.Root\n * tableName={tableName}\n * config={config}\n * columns={columns}\n * onChange={handleChange}\n * >\n * <MosaicChartSettings.TypeSelector />\n * <MosaicChartSettings.Fields />\n * </MosaicChartSettings.Root>\n * ```\n */\nimport {type FC, type PropsWithChildren, createElement} from 'react';\nimport {MosaicChartTypeSelector} from './MosaicChartTypeSelector';\nimport {\n MosaicChartSettingsProvider,\n useMosaicChartSettingsContext,\n} from './MosaicChartSettingsContext';\nimport type {TableColumn} from '@sqlrooms/db';\nimport {type ChartConfig, type ChartType} from '../chart-types';\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {CodeIcon, XIcon} from 'lucide-react';\nimport {useChartTypeDefinition} from '../useChartTypeDefinition';\nimport {Field} from '../../components/Field';\nimport {useColumnsContext} from '../../components/ColumnsContext';\n\ninterface MosaicChartSettingsRootProps {\n config: ChartConfig;\n columns: TableColumn[];\n onChange: (config: ChartConfig) => void;\n}\n\nconst MosaicChartSettingsRoot: FC<\n PropsWithChildren<MosaicChartSettingsRootProps>\n> = ({config, columns, onChange, children}) => {\n return (\n <MosaicChartSettingsProvider\n config={config}\n columns={columns}\n onChange={onChange}\n >\n {children}\n </MosaicChartSettingsProvider>\n );\n};\n\nconst MosaicChartSettingsViewSpecButton: FC<{onClick?: () => void}> = ({\n onClick,\n}) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-5 w-5\"\n onClick={onClick}\n aria-label=\"View spec\"\n >\n <CodeIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>View spec</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nconst MosaicChartSettingsCloseButton: FC<{onClick: () => void}> = ({\n onClick,\n}) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-5 w-5\"\n onClick={onClick}\n aria-label=\"Close\"\n >\n <XIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Close</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nconst MosaicChartSettingsHeader: FC<PropsWithChildren> = ({children}) => {\n return (\n <div className=\"flex items-center justify-between border-b px-3 py-1.5 text-xs font-medium\">\n {children}\n </div>\n );\n};\n\nconst MosaicChartSettingsContent: FC<PropsWithChildren> = ({children}) => {\n return <div className=\"flex flex-col gap-2 p-2\">{children}</div>;\n};\n\nconst MosaicChartSettingsTypeSelector: FC = () => {\n const {config, onChange} = useMosaicChartSettingsContext();\n\n const handleChartTypeChange = (newChartType: ChartType) => {\n // When changing chart type, clear settings\n onChange({\n chartType: newChartType,\n settings: {},\n settingsOpen: config.settingsOpen,\n });\n };\n\n return (\n <Field label=\"Chart type\" required>\n <MosaicChartTypeSelector\n value={config.chartType}\n onChange={handleChartTypeChange}\n />\n </Field>\n );\n};\n\nconst MosaicChartSettingsFields: FC = () => {\n const {config} = useMosaicChartSettingsContext();\n const {columns} = useColumnsContext();\n\n const chartTypeDef = useChartTypeDefinition(config.chartType);\n\n if (!chartTypeDef) {\n return (\n <Field label=\"Chart type\" required>\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Unknown chart type: {config.chartType}\n </div>\n </Field>\n );\n }\n\n if (columns.length === 0) {\n return (\n <Field label=\"Columns\" required>\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n No columns available\n </div>\n </Field>\n );\n }\n\n return createElement(chartTypeDef.settingsComponent);\n};\n\nexport const MosaicChartSettings = {\n Root: MosaicChartSettingsRoot,\n Header: MosaicChartSettingsHeader,\n Content: MosaicChartSettingsContent,\n TypeSelector: MosaicChartSettingsTypeSelector,\n Fields: MosaicChartSettingsFields,\n ViewSpecButton: MosaicChartSettingsViewSpecButton,\n CloseButton: MosaicChartSettingsCloseButton,\n} as const;\n"]}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useCallback } from 'react';
|
|
3
3
|
import { MosaicChartSettings } from './MosaicChartSettings';
|
|
4
4
|
import { useStoreWithMosaicDashboard } from '../../dashboard/MosaicDashboardSlice';
|
|
5
|
-
import { useDataTable } from '
|
|
5
|
+
import { useDataTable } from '@sqlrooms/db';
|
|
6
6
|
export const MosaicChartSettingsPanel = ({ dashboardId, panel, tableName, spec, onClose, onViewSpec, }) => {
|
|
7
7
|
const config = panel.config;
|
|
8
8
|
const updatePanel = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.updatePanel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartSettingsPanel.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettingsPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAC,2BAA2B,EAAC,MAAM,sCAAsC,CAAC;AAEjF,OAAO,EAAC,YAAY,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"MosaicChartSettingsPanel.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartSettingsPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAC,2BAA2B,EAAC,MAAM,sCAAsC,CAAC;AAEjF,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAW1C,MAAM,CAAC,MAAM,wBAAwB,GAAsC,CAAC,EAC1E,WAAW,EACX,KAAK,EACL,SAAS,EACT,IAAI,EACJ,OAAO,EACP,UAAU,GACX,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,MAAM,WAAW,GAAG,2BAA2B,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAC7C,CAAC;IAEF,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,oBAAoB,GAAG,WAAW,CACtC,CAAC,MAAmB,EAAE,EAAE;QACtB,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE;YACjC,MAAM;SACP,CAAC,CAAC;IACL,CAAC,EACD,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CACrC,CAAC;IAEF,OAAO,CACL,MAAC,mBAAmB,CAAC,IAAI,IACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,EACjC,QAAQ,EAAE,oBAAoB,aAE9B,MAAC,mBAAmB,CAAC,MAAM,eACzB,cAAK,SAAS,EAAC,mBAAmB,+BAAqB,EACvD,eAAK,SAAS,EAAC,yBAAyB,aACrC,IAAI,IAAI,KAAC,mBAAmB,CAAC,cAAc,IAAC,OAAO,EAAE,UAAU,GAAI,EACnE,OAAO,IAAI,KAAC,mBAAmB,CAAC,WAAW,IAAC,OAAO,EAAE,OAAO,GAAI,IAC7D,IACqB,EAC7B,MAAC,mBAAmB,CAAC,OAAO,eAC1B,KAAC,mBAAmB,CAAC,YAAY,KAAG,EACpC,KAAC,mBAAmB,CAAC,MAAM,KAAG,IACF,IACL,CAC5B,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {FC, useCallback} from 'react';\nimport {MosaicChartSettings} from './MosaicChartSettings';\nimport {type ChartConfig} from '../chart-types/chart-config';\nimport type {ChartPanelConfig} from '../../dashboard/dashboard-types';\nimport {useStoreWithMosaicDashboard} from '../../dashboard/MosaicDashboardSlice';\nimport {Spec} from '@uwdata/mosaic-spec';\nimport {useDataTable} from '@sqlrooms/db';\n\ninterface MosaicChartSettingsPanelProps {\n dashboardId: string;\n tableName: string;\n spec?: Spec;\n panel: ChartPanelConfig;\n onClose?: () => void;\n onViewSpec?: () => void;\n}\n\nexport const MosaicChartSettingsPanel: FC<MosaicChartSettingsPanelProps> = ({\n dashboardId,\n panel,\n tableName,\n spec,\n onClose,\n onViewSpec,\n}) => {\n const config = panel.config;\n\n const updatePanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.updatePanel,\n );\n\n const dataTable = useDataTable(tableName);\n\n const handleSettingsChange = useCallback(\n (config: ChartConfig) => {\n updatePanel(dashboardId, panel.id, {\n config,\n });\n },\n [dashboardId, panel.id, updatePanel],\n );\n\n return (\n <MosaicChartSettings.Root\n config={config}\n columns={dataTable?.columns || []}\n onChange={handleSettingsChange}\n >\n <MosaicChartSettings.Header>\n <div className=\"flex items-center\">Chart settings</div>\n <div className=\"flex items-center gap-1\">\n {spec && <MosaicChartSettings.ViewSpecButton onClick={onViewSpec} />}\n {onClose && <MosaicChartSettings.CloseButton onClick={onClose} />}\n </div>\n </MosaicChartSettings.Header>\n <MosaicChartSettings.Content>\n <MosaicChartSettings.TypeSelector />\n <MosaicChartSettings.Fields />\n </MosaicChartSettings.Content>\n </MosaicChartSettings.Root>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartTypeSelector.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartTypeSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"MosaicChartTypeSelector.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartTypeSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,EAA6B,MAAM,OAAO,CAAC;AAE1D,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,2BAA2B,CAAC;AAIzD,UAAU,4BAA4B;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1C;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CA8DpE,CAAC"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useMemo } from 'react';
|
|
3
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@sqlrooms/ui';
|
|
2
|
+
import { memo, useMemo, useCallback } from 'react';
|
|
4
3
|
import { ChartNoAxesCombined } from 'lucide-react';
|
|
5
4
|
import { useStoreWithMosaicDashboard } from '../../dashboard/MosaicDashboardSlice';
|
|
5
|
+
import { Combobox } from '../../components/Combobox';
|
|
6
6
|
export const MosaicChartTypeSelector = memo(({ value, onChange }) => {
|
|
7
7
|
const chartTypes = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.chartTypes);
|
|
8
|
+
// Custom selection handler: maps from label back to id
|
|
9
|
+
const handleChange = useCallback((searchValue) => {
|
|
10
|
+
const chartType = chartTypes?.find((ct) => (ct.label ?? ct.id).toLowerCase() === searchValue.toLowerCase());
|
|
11
|
+
if (chartType) {
|
|
12
|
+
onChange(chartType.id);
|
|
13
|
+
}
|
|
14
|
+
}, [chartTypes, onChange]);
|
|
8
15
|
const selectedChartType = useMemo(() => chartTypes?.find((chartType) => chartType.id === value), [chartTypes, value]);
|
|
9
16
|
const SelectedChartTypeIcon = selectedChartType?.icon ?? ChartNoAxesCombined;
|
|
10
|
-
return (_jsxs(
|
|
17
|
+
return (_jsxs(Combobox, { value: value, onChange: handleChange, children: [_jsx(Combobox.Trigger, { className: "w-full", ariaLabel: "Chart type", children: selectedChartType ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(SelectedChartTypeIcon, { className: "h-3.5 w-3.5" }), _jsx("span", { children: selectedChartType.label })] })) : (_jsx("span", { className: "text-muted-foreground", children: "Select chart type" })) }), _jsx(Combobox.Content, { searchable: true, searchPlaceholder: "Search chart types...", emptyMessage: "No matching chart type.", children: chartTypes?.map((chartType) => {
|
|
11
18
|
const Icon = chartType.icon ?? ChartNoAxesCombined;
|
|
12
|
-
return (
|
|
19
|
+
return (_jsxs(Combobox.Item, { value: chartType.label ?? chartType.id, isSelected: value === chartType.id, children: [_jsx(Icon, { className: "mr-2 h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "truncate text-xs", children: chartType.label })] }, chartType.id));
|
|
13
20
|
}) })] }));
|
|
14
21
|
});
|
|
15
22
|
MosaicChartTypeSelector.displayName = 'MosaicChartTypeSelector';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartTypeSelector.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartTypeSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAU,IAAI,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MosaicChartTypeSelector.js","sourceRoot":"","sources":["../../../src/charts/chart-settings/MosaicChartTypeSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAU,IAAI,EAAE,OAAO,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAC,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAC,2BAA2B,EAAC,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AAOnD,MAAM,CAAC,MAAM,uBAAuB,GAAqC,IAAI,CAC3E,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IACpB,MAAM,UAAU,GAAG,2BAA2B,CAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAC5C,CAAC;IAEF,uDAAuD;IACvD,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,WAAmB,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,UAAU,EAAE,IAAI,CAChC,CAAC,EAAE,EAAE,EAAE,CACL,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CAClE,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EACD,CAAC,UAAU,EAAE,QAAQ,CAAC,CACvB,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAC7D,CAAC,UAAU,EAAE,KAAK,CAAC,CACpB,CAAC;IAEF,MAAM,qBAAqB,GACzB,iBAAiB,EAAE,IAAI,IAAI,mBAAmB,CAAC;IAEjD,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,aAC5C,KAAC,QAAQ,CAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,YAAY,YACxD,iBAAiB,CAAC,CAAC,CAAC,CACnB,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,qBAAqB,IAAC,SAAS,EAAC,aAAa,GAAG,EACjD,yBAAO,iBAAiB,CAAC,KAAK,GAAQ,IAClC,CACP,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,uBAAuB,kCAAyB,CACjE,GACgB,EACnB,KAAC,QAAQ,CAAC,OAAO,IACf,UAAU,QACV,iBAAiB,EAAC,uBAAuB,EACzC,YAAY,EAAC,yBAAyB,YAErC,UAAU,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;oBAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,mBAAmB,CAAC;oBACnD,OAAO,CACL,MAAC,QAAQ,CAAC,IAAI,IAEZ,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE,EACtC,UAAU,EAAE,KAAK,KAAK,SAAS,CAAC,EAAE,aAElC,KAAC,IAAI,IAAC,SAAS,EAAC,2BAA2B,GAAG,EAC9C,eAAM,SAAS,EAAC,kBAAkB,YAAE,SAAS,CAAC,KAAK,GAAQ,KALtD,SAAS,CAAC,EAAE,CAMH,CACjB,CAAC;gBACJ,CAAC,CAAC,GACe,IACV,CACZ,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,uBAAuB,CAAC,WAAW,GAAG,yBAAyB,CAAC","sourcesContent":["import {type FC, memo, useMemo, useCallback} from 'react';\nimport {ChartNoAxesCombined} from 'lucide-react';\nimport {type ChartType} from '../chart-types/base-types';\nimport {useStoreWithMosaicDashboard} from '../../dashboard/MosaicDashboardSlice';\nimport {Combobox} from '../../components/Combobox';\n\ninterface MosaicChartTypeSelectorProps {\n value: ChartType;\n onChange: (chartType: ChartType) => void;\n}\n\nexport const MosaicChartTypeSelector: FC<MosaicChartTypeSelectorProps> = memo(\n ({value, onChange}) => {\n const chartTypes = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.chartTypes,\n );\n\n // Custom selection handler: maps from label back to id\n const handleChange = useCallback(\n (searchValue: string) => {\n const chartType = chartTypes?.find(\n (ct) =>\n (ct.label ?? ct.id).toLowerCase() === searchValue.toLowerCase(),\n );\n if (chartType) {\n onChange(chartType.id);\n }\n },\n [chartTypes, onChange],\n );\n\n const selectedChartType = useMemo(\n () => chartTypes?.find((chartType) => chartType.id === value),\n [chartTypes, value],\n );\n\n const SelectedChartTypeIcon =\n selectedChartType?.icon ?? ChartNoAxesCombined;\n\n return (\n <Combobox value={value} onChange={handleChange}>\n <Combobox.Trigger className=\"w-full\" ariaLabel=\"Chart type\">\n {selectedChartType ? (\n <div className=\"flex items-center gap-2\">\n <SelectedChartTypeIcon className=\"h-3.5 w-3.5\" />\n <span>{selectedChartType.label}</span>\n </div>\n ) : (\n <span className=\"text-muted-foreground\">Select chart type</span>\n )}\n </Combobox.Trigger>\n <Combobox.Content\n searchable\n searchPlaceholder=\"Search chart types...\"\n emptyMessage=\"No matching chart type.\"\n >\n {chartTypes?.map((chartType) => {\n const Icon = chartType.icon ?? ChartNoAxesCombined;\n return (\n <Combobox.Item\n key={chartType.id}\n value={chartType.label ?? chartType.id}\n isSelected={value === chartType.id}\n >\n <Icon className=\"mr-2 h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate text-xs\">{chartType.label}</span>\n </Combobox.Item>\n );\n })}\n </Combobox.Content>\n </Combobox>\n );\n },\n);\n\nMosaicChartTypeSelector.displayName = 'MosaicChartTypeSelector';\n"]}
|
|
@@ -7,12 +7,13 @@ import { type Tool } from 'ai';
|
|
|
7
7
|
import type { Coordinator } from '@uwdata/mosaic-core';
|
|
8
8
|
import type { ComponentType } from 'react';
|
|
9
9
|
import type * as z from 'zod';
|
|
10
|
-
import { ChartConfig, ChartType } from './chart-config';
|
|
10
|
+
import { ChartConfig, ChartSettings, ChartType } from './chart-config';
|
|
11
11
|
import { RetainedVgPlotChart } from '../../VgPlotChart';
|
|
12
12
|
import type { Selection } from '@uwdata/mosaic-core';
|
|
13
13
|
import type { DataTableExplorerPanelConfig } from '../../dashboard/core-types';
|
|
14
14
|
import type { MosaicDashboardEntry } from '../../dashboard/dashboard-types';
|
|
15
15
|
import type { ChartDataPolicy, ChartDataPolicyContext, ChartRuntimeIssue, ChartRuntimeIssueContext, ChartRuntimeIssueReporter } from '../../chart-runtime';
|
|
16
|
+
import { DataTable, type QualifiedTableName } from '@sqlrooms/duckdb';
|
|
16
17
|
export type { ChartType };
|
|
17
18
|
/**
|
|
18
19
|
* Column info passed to chart builder UI
|
|
@@ -39,10 +40,14 @@ export interface ChartBuilderField {
|
|
|
39
40
|
multiple?: boolean;
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
|
-
* Result of table resolution
|
|
43
|
+
* Result of table resolution.
|
|
44
|
+
* tableName is the fully quoted string boundary form
|
|
45
|
+
* (QualifiedTableName.toString()); qualifiedName is the canonical structured
|
|
46
|
+
* identity when available.
|
|
43
47
|
*/
|
|
44
48
|
export interface ResolvedTable {
|
|
45
49
|
tableName: string;
|
|
50
|
+
qualifiedName: QualifiedTableName;
|
|
46
51
|
columns: ChartBuilderColumn[];
|
|
47
52
|
}
|
|
48
53
|
/**
|
|
@@ -65,10 +70,10 @@ export interface DashboardToolDeps {
|
|
|
65
70
|
*/
|
|
66
71
|
resolveArtifact: (artifactId?: string, createIfMissing?: boolean, context?: ChartToolExecutionContext) => string;
|
|
67
72
|
/**
|
|
68
|
-
* Resolves table
|
|
69
|
-
*
|
|
73
|
+
* Resolves user/display table input to canonical table identity and columns.
|
|
74
|
+
* Bare names are accepted only when unambiguous.
|
|
70
75
|
*/
|
|
71
|
-
resolveTable: (artifactId: string, tableName?: string) => ResolvedTable;
|
|
76
|
+
resolveTable: (artifactId: string, tableName?: string | QualifiedTableName) => ResolvedTable;
|
|
72
77
|
addPanel: (dashboardId: string, panel: any) => string;
|
|
73
78
|
updatePanel: (dashboardId: string, panelId: string, patch: Partial<PanelPatch>) => void;
|
|
74
79
|
getDashboard: (dashboardId: string) => MosaicDashboardEntry | undefined;
|
|
@@ -146,8 +151,14 @@ type BaseChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> = {
|
|
|
146
151
|
/** Optional runtime data policy for renderer-specific query validation. */
|
|
147
152
|
getDataPolicy?: (context: ChartDataPolicyContext<TConfig>) => ChartDataPolicy | null | undefined;
|
|
148
153
|
};
|
|
154
|
+
export type CreateSpecOptions<TSettings = ChartSettings> = {
|
|
155
|
+
dataTable: DataTable;
|
|
156
|
+
settings: TSettings;
|
|
157
|
+
selectionName?: string;
|
|
158
|
+
};
|
|
159
|
+
export declare function getChartTableReference(dataTable: DataTable): string;
|
|
149
160
|
export type SpecChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> = BaseChartTypeDefinition<TConfig> & {
|
|
150
|
-
createSpec: (
|
|
161
|
+
createSpec: (options: CreateSpecOptions<TConfig['settings']>) => Spec;
|
|
151
162
|
canViewSpec?: boolean;
|
|
152
163
|
};
|
|
153
164
|
export type ComponentChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> = BaseChartTypeDefinition<TConfig> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-types.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-types/base-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,KAAK,IAAI,EAAC,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-types.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-types/base-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Base types for chart configurations.
|
|
3
3
|
* Separated to avoid circular dependencies.
|
|
4
4
|
*/
|
|
5
|
+
export function getChartTableReference(dataTable) {
|
|
6
|
+
return dataTable.table.toString();
|
|
7
|
+
}
|
|
5
8
|
export function isSpecChartType(chartType) {
|
|
6
9
|
return 'createSpec' in chartType;
|
|
7
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-types.js","sourceRoot":"","sources":["../../../src/charts/chart-types/base-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"base-types.js","sourceRoot":"","sources":["../../../src/charts/chart-types/base-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsMH,MAAM,UAAU,sBAAsB,CAAC,SAAoB;IACzD,OAAO,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACpC,CAAC;AAsBD,MAAM,UAAU,eAAe,CAC7B,SAAuC;IAEvC,OAAO,YAAY,IAAI,SAAS,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAuC;IAEvC,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC","sourcesContent":["/**\n * Base types for chart configurations.\n * Separated to avoid circular dependencies.\n */\n\nimport type {Spec} from '@uwdata/mosaic-spec';\nimport {type Tool} from 'ai';\nimport type {Coordinator} from '@uwdata/mosaic-core';\nimport type {ComponentType} from 'react';\nimport type * as z from 'zod';\nimport {ChartConfig, ChartSettings, ChartType} from './chart-config';\nimport {RetainedVgPlotChart} from '../../VgPlotChart';\nimport type {Selection} from '@uwdata/mosaic-core';\nimport type {DataTableExplorerPanelConfig} from '../../dashboard/core-types';\nimport type {MosaicDashboardEntry} from '../../dashboard/dashboard-types';\nimport type {\n ChartDataPolicy,\n ChartDataPolicyContext,\n ChartRuntimeIssue,\n ChartRuntimeIssueContext,\n ChartRuntimeIssueReporter,\n} from '../../chart-runtime';\nimport {DataTable, type QualifiedTableName} from '@sqlrooms/duckdb';\n\nexport type {ChartType};\n\n/**\n * Column info passed to chart builder UI\n */\nexport interface ChartBuilderColumn {\n name: string;\n type: string;\n}\n\n/**\n * Describes a field selector in a chart builder UI\n */\nexport interface ChartBuilderField {\n /** Unique key for this field */\n key: string;\n /** Display label */\n label: string;\n /** Whether the field is required */\n required?: boolean;\n /** Filter columns by DuckDB type (e.g. 'INTEGER', 'VARCHAR', 'DOUBLE') */\n types?: string[];\n /** Optional helper text for AI or custom UIs */\n description?: string;\n /** Whether this field accepts multiple values (array) */\n multiple?: boolean;\n}\n\n/**\n * Result of table resolution.\n * tableName is the fully quoted string boundary form\n * (QualifiedTableName.toString()); qualifiedName is the canonical structured\n * identity when available.\n */\nexport interface ResolvedTable {\n tableName: string;\n qualifiedName: QualifiedTableName;\n columns: ChartBuilderColumn[];\n}\n\n/**\n * Partial update to apply to a dashboard panel.\n * Config can be any of the panel config types (chart, dataTableExplorer).\n */\nexport interface PanelPatch {\n title?: string;\n source?: ChartBuilderPanelSource;\n config?: ChartConfig | DataTableExplorerPanelConfig;\n}\n\n/**\n * Dependencies injected into dashboard tool creation functions.\n * Provides the resources and operations needed to create dashboard panels.\n */\nexport interface DashboardToolDeps {\n /**\n * Resolves the dashboard artifact ID.\n * Use this when you only need the artifact and not table information.\n */\n resolveArtifact: (\n artifactId?: string,\n createIfMissing?: boolean,\n context?: ChartToolExecutionContext,\n ) => string;\n\n /**\n * Resolves user/display table input to canonical table identity and columns.\n * Bare names are accepted only when unambiguous.\n */\n resolveTable: (\n artifactId: string,\n tableName?: string | QualifiedTableName,\n ) => ResolvedTable;\n\n addPanel: (dashboardId: string, panel: any) => string;\n updatePanel: (\n dashboardId: string,\n panelId: string,\n patch: Partial<PanelPatch>,\n ) => void;\n getDashboard: (dashboardId: string) => MosaicDashboardEntry | undefined;\n getPanelIssue?: (\n dashboardId: string,\n panelId: string,\n ) => ChartRuntimeIssue | undefined;\n removePanel: (dashboardId: string, panelId: string) => void;\n setCurrentArtifact: (artifactId: string) => void;\n\n maxDataPoints: number;\n}\n\nexport type ChartToolExecutionContext = object & {\n sessionId?: string;\n aiRunContext?: unknown;\n};\n\nexport type ChartBuilderPanelSource = {\n tableName?: string;\n sqlQuery?: string;\n};\n\nexport type ChartBuilderVgPlotOutput = {\n kind: 'vgplot';\n spec: Spec;\n};\n\nexport type ChartBuilderDashboardPanelOutput = {\n kind: 'dashboard-panel';\n type: string;\n source?: ChartBuilderPanelSource;\n config?: Record<string, unknown>;\n};\n\nexport type ChartBuilderOutput =\n | ChartBuilderVgPlotOutput\n | ChartBuilderDashboardPanelOutput;\n\nexport type ChartRetainer = {\n chart: RetainedVgPlotChart | undefined;\n setChart: (chart: RetainedVgPlotChart) => void;\n};\n\nexport type BrushSelectionParams = Map<string, Selection>;\n\n/**\n * Props passed to chart renderer components.\n */\nexport interface ChartRendererProps<TConfig extends ChartConfig = ChartConfig> {\n tableName: string;\n config: TConfig;\n coordinator: Coordinator;\n dataPolicy?: ChartDataPolicy | null;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n /**\n * Pre-defined params/selections to inject when rendering vgplot specs.\n * Keys are param names (without $), values are Param or Selection instances.\n */\n params?: BrushSelectionParams;\n /**\n * Optional retention adapter for preserving the underlying vgplot\n * instance across temporary unmount/remount cycles.\n */\n retention?: ChartRetainer;\n}\n\ntype BaseChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> = {\n /** Unique identifier */\n id: ChartType;\n /** Short human-friendly name used in chart-type grids and prompts */\n label?: string;\n /** Short description of what this builder creates */\n description: string;\n /** Zod schema for runtime validation of settings */\n schema: z.ZodType<TConfig['settings']>;\n /** Generate a chart title from selected field values */\n buildTitle?: (fieldValues: Record<string, unknown>) => string;\n /** Optional availability override for a given table schema */\n isAvailable?: (columns: ChartBuilderColumn[]) => boolean;\n /** Explicit settings component for this chart type */\n settingsComponent: ComponentType;\n /** Optional icon component for chart-type grids */\n icon: ComponentType<{className?: string}>;\n /** Optional function to create an AI tool for this chart type */\n createTool?: (deps: DashboardToolDeps) => Tool;\n /** Optional runtime data policy for renderer-specific query validation. */\n getDataPolicy?: (\n context: ChartDataPolicyContext<TConfig>,\n ) => ChartDataPolicy | null | undefined;\n};\n\nexport type CreateSpecOptions<TSettings = ChartSettings> = {\n dataTable: DataTable;\n settings: TSettings;\n selectionName?: string;\n};\n\nexport function getChartTableReference(dataTable: DataTable): string {\n return dataTable.table.toString();\n}\n\nexport type SpecChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> =\n BaseChartTypeDefinition<TConfig> & {\n createSpec: (options: CreateSpecOptions<TConfig['settings']>) => Spec;\n canViewSpec?: boolean;\n };\n\nexport type ComponentChartTypeDefinition<\n TConfig extends ChartConfig = ChartConfig,\n> = BaseChartTypeDefinition<TConfig> & {\n renderer: ComponentType<ChartRendererProps<TConfig>>;\n};\n\n/**\n * Shared chart-type definition used by both the chart-builder UI and\n * assistant-driven chart creation.\n */\nexport type ChartTypeDefinition<TConfig extends ChartConfig = ChartConfig> =\n | SpecChartTypeDefinition<TConfig>\n | ComponentChartTypeDefinition<TConfig>;\n\nexport function isSpecChartType<TConfig extends ChartConfig>(\n chartType: ChartTypeDefinition<TConfig>,\n): chartType is SpecChartTypeDefinition<TConfig> {\n return 'createSpec' in chartType;\n}\n\nexport function isComponentChartType<TConfig extends ChartConfig>(\n chartType: ChartTypeDefinition<TConfig>,\n): chartType is ComponentChartTypeDefinition<TConfig> {\n return 'renderer' in chartType;\n}\n\n/**\n * Backward-compatible alias for earlier chart-builder helper APIs.\n * @deprecated Use {@link ChartTypeDefinition} instead.\n */\nexport type ChartSpec = ChartTypeDefinition;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BoxPlotClient.d.ts","sourceRoot":"","sources":["../../../../../src/charts/chart-types/box-plot/renderer/BoxPlotClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"BoxPlotClient.d.ts","sourceRoot":"","sources":["../../../../../src/charts/chart-types/box-plot/renderer/BoxPlotClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAW,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC/B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C,oBAAoB,CAAC,EAAE,yBAAyB,CAAC;IACjD,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AA0EF,KAAK,qBAAqB,GAAG;IAC3B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAiFrE;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAA4B;IAClE,OAAO,CAAC,KAAK,CAIX;IACF,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IAYzC,IAAa,YAAY,IAAI,OAAO,CAEnC;IAED,MAAM,IAAI,MAAM,EAAE;IAIlB,OAAO,CAAC,SAAS;IAQR,YAAY,IAAI,IAAI;IAKpB,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM;IASzC,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IA6EhC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAcvC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAStC,KAAK;IAII,OAAO;CAIjB"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { MosaicClient, clauseInterval, } from '@uwdata/mosaic-core';
|
|
2
|
+
import { escapeId, quoteTableReference } from '@sqlrooms/duckdb';
|
|
2
3
|
import { assertChartDataPolicy, createChartRuntimeIssueFromError, } from '../../../../chart-runtime';
|
|
3
|
-
function quoteIdentifier(identifier) {
|
|
4
|
-
return `"${identifier.replace(/"/g, '""')}"`;
|
|
5
|
-
}
|
|
6
|
-
function quoteTableReference(tableName) {
|
|
7
|
-
return tableName.split('.').map(quoteIdentifier).join('.');
|
|
8
|
-
}
|
|
9
4
|
function normalizeFilter(filter) {
|
|
10
5
|
if (!filter) {
|
|
11
6
|
return [];
|
|
@@ -64,8 +59,8 @@ function numericValue(value) {
|
|
|
64
59
|
}
|
|
65
60
|
export function buildBoxPlotQuery(args) {
|
|
66
61
|
const table = quoteTableReference(args.tableName);
|
|
67
|
-
const x =
|
|
68
|
-
const y =
|
|
62
|
+
const x = escapeId(args.x);
|
|
63
|
+
const y = escapeId(args.y);
|
|
69
64
|
const filters = normalizeFilter(args.filter).join(' AND ');
|
|
70
65
|
const where = [`${y} IS NOT NULL`, filters].filter(Boolean).join(' AND ');
|
|
71
66
|
return `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BoxPlotClient.js","sourceRoot":"","sources":["../../../../../src/charts/chart-types/box-plot/renderer/BoxPlotClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MosaicClient,\n clauseInterval,\n type Selection,\n} from '@uwdata/mosaic-core';\nimport type {ExprNode, FilterExpr} from '@uwdata/mosaic-sql';\nimport {\n assertChartDataPolicy,\n createChartRuntimeIssueFromError,\n type ChartDataPolicy,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n} from '../../../../chart-runtime';\n\nexport type BoxPlotSummaryRow = {\n category: unknown;\n count: number;\n lowerFence: number;\n median: number;\n q1: number;\n q3: number;\n upperFence: number;\n whiskerHigh: number;\n whiskerLow: number;\n};\n\nexport type BoxPlotOutlierRow = {\n category: unknown;\n value: number;\n};\n\nexport type BoxPlotState = {\n error?: Error;\n isLoading: boolean;\n outliers: BoxPlotOutlierRow[];\n summaries: BoxPlotSummaryRow[];\n yBrush?: [number, number];\n};\n\nexport type BoxPlotClientOptions = {\n dataPolicy?: ChartDataPolicy | null;\n onStateChange: (state: BoxPlotState) => void;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n selection: Selection;\n tableName: string;\n x: string;\n y: string;\n};\n\ntype BoxPlotQueryRow = Partial<BoxPlotSummaryRow & BoxPlotOutlierRow> & {\n rowKind?: 'summary' | 'outlier';\n};\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction quoteTableReference(tableName: string): string {\n return tableName.split('.').map(quoteIdentifier).join('.');\n}\n\nfunction normalizeFilter(filter?: FilterExpr | null): string[] {\n if (!filter) {\n return [];\n }\n const filters = Array.isArray(filter) ? filter.flat(Infinity) : [filter];\n return filters\n .map((expr) => {\n if (typeof expr === 'boolean') {\n return expr ? null : 'FALSE';\n }\n return `(${(expr as string | ExprNode).toString()})`;\n })\n .filter((expr): expr is string => Boolean(expr));\n}\n\n/**\n * Type guard to check if data has a toArray method.\n */\nfunction hasToArrayMethod(data: unknown): data is {toArray: () => unknown} {\n return (\n data !== null &&\n data !== undefined &&\n typeof data === 'object' &&\n 'toArray' in data &&\n typeof (data as Record<string, unknown>).toArray === 'function'\n );\n}\n\n/**\n * Safely extract rows from query result data.\n * Handles both direct arrays and objects with toArray() method.\n * Returns empty array if data is invalid or doesn't have expected structure.\n */\nfunction rowsFromQueryResult<T>(data: unknown): T[] {\n // Handle direct arrays\n if (Array.isArray(data)) {\n return data as T[];\n }\n\n // Handle objects with toArray() method (Arrow Tables, Mosaic results, etc.)\n if (!hasToArrayMethod(data)) {\n return [];\n }\n\n try {\n const result = data.toArray();\n\n // Validate that toArray() returned an array\n if (!Array.isArray(result)) {\n console.warn(\n 'BoxPlotClient: toArray() did not return an array',\n typeof result,\n );\n return [];\n }\n\n return result as T[];\n } catch (error) {\n console.error('BoxPlotClient: Error calling toArray():', error);\n return [];\n }\n}\n\nfunction numericValue(value: unknown): number | undefined {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : undefined;\n}\n\ntype BuildBoxPlotQueryArgs = {\n filter?: FilterExpr | null;\n tableName: string;\n x: string;\n y: string;\n};\n\nexport function buildBoxPlotQuery(args: BuildBoxPlotQueryArgs): string {\n const table = quoteTableReference(args.tableName);\n const x = quoteIdentifier(args.x);\n const y = quoteIdentifier(args.y);\n const filters = normalizeFilter(args.filter).join(' AND ');\n const where = [`${y} IS NOT NULL`, filters].filter(Boolean).join(' AND ');\n\n return `\nWITH base AS (\n SELECT\n ${x} AS \"category\",\n TRY_CAST(${y} AS DOUBLE) AS \"value\"\n FROM ${table}\n WHERE ${where}\n),\nstats AS (\n SELECT\n \"category\",\n COUNT(*)::DOUBLE AS \"count\",\n quantile_cont(\"value\", 0.25) AS \"q1\",\n quantile_cont(\"value\", 0.5) AS \"median\",\n quantile_cont(\"value\", 0.75) AS \"q3\"\n FROM base\n WHERE \"value\" IS NOT NULL\n GROUP BY \"category\"\n),\nfences AS (\n SELECT\n *,\n \"q1\" - 1.5 * (\"q3\" - \"q1\") AS \"lowerFence\",\n \"q3\" + 1.5 * (\"q3\" - \"q1\") AS \"upperFence\"\n FROM stats\n),\nwhiskers AS (\n SELECT\n b.\"category\",\n MIN(b.\"value\") AS \"whiskerLow\",\n MAX(b.\"value\") AS \"whiskerHigh\"\n FROM base b\n JOIN fences f ON b.\"category\" IS NOT DISTINCT FROM f.\"category\"\n WHERE b.\"value\" BETWEEN f.\"lowerFence\" AND f.\"upperFence\"\n GROUP BY b.\"category\"\n),\nsummary AS (\n SELECT\n 'summary' AS \"rowKind\",\n f.\"category\",\n f.\"count\",\n f.\"q1\",\n f.\"median\",\n f.\"q3\",\n f.\"lowerFence\",\n f.\"upperFence\",\n w.\"whiskerLow\",\n w.\"whiskerHigh\",\n NULL::DOUBLE AS \"value\"\n FROM fences f\n JOIN whiskers w ON w.\"category\" IS NOT DISTINCT FROM f.\"category\"\n),\noutliers AS (\n SELECT\n 'outlier' AS \"rowKind\",\n b.\"category\",\n NULL::DOUBLE AS \"count\",\n NULL::DOUBLE AS \"q1\",\n NULL::DOUBLE AS \"median\",\n NULL::DOUBLE AS \"q3\",\n NULL::DOUBLE AS \"lowerFence\",\n NULL::DOUBLE AS \"upperFence\",\n NULL::DOUBLE AS \"whiskerLow\",\n NULL::DOUBLE AS \"whiskerHigh\",\n b.\"value\"\n FROM base b\n JOIN fences f ON b.\"category\" IS NOT DISTINCT FROM f.\"category\"\n WHERE b.\"value\" < f.\"lowerFence\" OR b.\"value\" > f.\"upperFence\"\n)\nSELECT * FROM summary\nUNION ALL\nSELECT * FROM outliers\nORDER BY \"category\", \"rowKind\", \"value\"\n`.trim();\n}\n\nexport class BoxPlotClient extends MosaicClient {\n private readonly onStateChange: (state: BoxPlotState) => void;\n private readonly tableName: string;\n private readonly x: string;\n private readonly y: string;\n private readonly selection: Selection;\n private readonly dataPolicy?: ChartDataPolicy | null;\n private readonly runtimeIssueContext?: ChartRuntimeIssueContext;\n private readonly runtimeIssueReporter?: ChartRuntimeIssueReporter;\n private state: BoxPlotState = {\n isLoading: true,\n outliers: [],\n summaries: [],\n };\n private destroyed = false;\n\n constructor(options: BoxPlotClientOptions) {\n super(options.selection);\n this.dataPolicy = options.dataPolicy;\n this.onStateChange = options.onStateChange;\n this.runtimeIssueContext = options.runtimeIssueContext;\n this.runtimeIssueReporter = options.runtimeIssueReporter;\n this.tableName = options.tableName;\n this.x = options.x;\n this.y = options.y;\n this.selection = options.selection;\n }\n\n override get filterStable(): boolean {\n return false;\n }\n\n fields(): string[] {\n return [this.x, this.y];\n }\n\n private emitState(next: Partial<BoxPlotState>) {\n if (this.destroyed) {\n return;\n }\n this.state = {...this.state, ...next};\n this.onStateChange(this.state);\n }\n\n override queryPending(): this {\n this.emitState({error: undefined, isLoading: true});\n return this;\n }\n\n override query(filter?: FilterExpr | null): string {\n return buildBoxPlotQuery({\n filter,\n tableName: this.tableName,\n x: this.x,\n y: this.y,\n });\n }\n\n override queryResult(data: unknown): this {\n try {\n assertChartDataPolicy(this.dataPolicy, data);\n this.runtimeIssueReporter?.clearIssue();\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.runtimeIssueContext) {\n this.runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n normalizedError,\n this.runtimeIssueContext,\n this.dataPolicy,\n ),\n );\n }\n this.emitState({error: normalizedError, isLoading: false});\n return this;\n }\n\n const rows = rowsFromQueryResult<BoxPlotQueryRow>(data);\n const summaries: BoxPlotSummaryRow[] = [];\n const outliers: BoxPlotOutlierRow[] = [];\n\n for (const row of rows) {\n if (row.rowKind === 'summary') {\n const count = numericValue(row.count);\n const q1 = numericValue(row.q1);\n const median = numericValue(row.median);\n const q3 = numericValue(row.q3);\n const lowerFence = numericValue(row.lowerFence);\n const upperFence = numericValue(row.upperFence);\n const whiskerLow = numericValue(row.whiskerLow);\n const whiskerHigh = numericValue(row.whiskerHigh);\n if (\n count === undefined ||\n q1 === undefined ||\n median === undefined ||\n q3 === undefined ||\n lowerFence === undefined ||\n upperFence === undefined ||\n whiskerLow === undefined ||\n whiskerHigh === undefined\n ) {\n continue;\n }\n summaries.push({\n category: row.category,\n count,\n lowerFence,\n median,\n q1,\n q3,\n upperFence,\n whiskerHigh,\n whiskerLow,\n });\n } else if (row.rowKind === 'outlier') {\n const value = numericValue(row.value);\n if (value !== undefined) {\n outliers.push({\n category: row.category,\n value,\n });\n }\n }\n }\n\n this.emitState({\n error: undefined,\n isLoading: false,\n outliers,\n summaries,\n });\n return this;\n }\n\n override queryError(error: Error): this {\n if (this.runtimeIssueContext) {\n this.runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n error,\n this.runtimeIssueContext,\n this.dataPolicy,\n ),\n );\n }\n this.emitState({error, isLoading: false});\n return this;\n }\n\n updateYBrush(extent?: [number, number]) {\n const normalized = extent\n ? ([Math.min(...extent), Math.max(...extent)] as [number, number])\n : undefined;\n this.emitState({yBrush: normalized});\n const clause = clauseInterval(this.y, normalized ?? null, {source: this});\n this.selection.update(clause);\n }\n\n reset() {\n this.updateYBrush();\n }\n\n override destroy() {\n this.destroyed = true;\n super.destroy();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"BoxPlotClient.js","sourceRoot":"","sources":["../../../../../src/charts/chart-types/box-plot/renderer/BoxPlotClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MosaicClient,\n clauseInterval,\n type Selection,\n} from '@uwdata/mosaic-core';\nimport {escapeId, quoteTableReference} from '@sqlrooms/duckdb';\nimport type {ExprNode, FilterExpr} from '@uwdata/mosaic-sql';\nimport {\n assertChartDataPolicy,\n createChartRuntimeIssueFromError,\n type ChartDataPolicy,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n} from '../../../../chart-runtime';\n\nexport type BoxPlotSummaryRow = {\n category: unknown;\n count: number;\n lowerFence: number;\n median: number;\n q1: number;\n q3: number;\n upperFence: number;\n whiskerHigh: number;\n whiskerLow: number;\n};\n\nexport type BoxPlotOutlierRow = {\n category: unknown;\n value: number;\n};\n\nexport type BoxPlotState = {\n error?: Error;\n isLoading: boolean;\n outliers: BoxPlotOutlierRow[];\n summaries: BoxPlotSummaryRow[];\n yBrush?: [number, number];\n};\n\nexport type BoxPlotClientOptions = {\n dataPolicy?: ChartDataPolicy | null;\n onStateChange: (state: BoxPlotState) => void;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n selection: Selection;\n tableName: string;\n x: string;\n y: string;\n};\n\ntype BoxPlotQueryRow = Partial<BoxPlotSummaryRow & BoxPlotOutlierRow> & {\n rowKind?: 'summary' | 'outlier';\n};\n\nfunction normalizeFilter(filter?: FilterExpr | null): string[] {\n if (!filter) {\n return [];\n }\n const filters = Array.isArray(filter) ? filter.flat(Infinity) : [filter];\n return filters\n .map((expr) => {\n if (typeof expr === 'boolean') {\n return expr ? null : 'FALSE';\n }\n return `(${(expr as string | ExprNode).toString()})`;\n })\n .filter((expr): expr is string => Boolean(expr));\n}\n\n/**\n * Type guard to check if data has a toArray method.\n */\nfunction hasToArrayMethod(data: unknown): data is {toArray: () => unknown} {\n return (\n data !== null &&\n data !== undefined &&\n typeof data === 'object' &&\n 'toArray' in data &&\n typeof (data as Record<string, unknown>).toArray === 'function'\n );\n}\n\n/**\n * Safely extract rows from query result data.\n * Handles both direct arrays and objects with toArray() method.\n * Returns empty array if data is invalid or doesn't have expected structure.\n */\nfunction rowsFromQueryResult<T>(data: unknown): T[] {\n // Handle direct arrays\n if (Array.isArray(data)) {\n return data as T[];\n }\n\n // Handle objects with toArray() method (Arrow Tables, Mosaic results, etc.)\n if (!hasToArrayMethod(data)) {\n return [];\n }\n\n try {\n const result = data.toArray();\n\n // Validate that toArray() returned an array\n if (!Array.isArray(result)) {\n console.warn(\n 'BoxPlotClient: toArray() did not return an array',\n typeof result,\n );\n return [];\n }\n\n return result as T[];\n } catch (error) {\n console.error('BoxPlotClient: Error calling toArray():', error);\n return [];\n }\n}\n\nfunction numericValue(value: unknown): number | undefined {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : undefined;\n}\n\ntype BuildBoxPlotQueryArgs = {\n filter?: FilterExpr | null;\n tableName: string;\n x: string;\n y: string;\n};\n\nexport function buildBoxPlotQuery(args: BuildBoxPlotQueryArgs): string {\n const table = quoteTableReference(args.tableName);\n const x = escapeId(args.x);\n const y = escapeId(args.y);\n const filters = normalizeFilter(args.filter).join(' AND ');\n const where = [`${y} IS NOT NULL`, filters].filter(Boolean).join(' AND ');\n\n return `\nWITH base AS (\n SELECT\n ${x} AS \"category\",\n TRY_CAST(${y} AS DOUBLE) AS \"value\"\n FROM ${table}\n WHERE ${where}\n),\nstats AS (\n SELECT\n \"category\",\n COUNT(*)::DOUBLE AS \"count\",\n quantile_cont(\"value\", 0.25) AS \"q1\",\n quantile_cont(\"value\", 0.5) AS \"median\",\n quantile_cont(\"value\", 0.75) AS \"q3\"\n FROM base\n WHERE \"value\" IS NOT NULL\n GROUP BY \"category\"\n),\nfences AS (\n SELECT\n *,\n \"q1\" - 1.5 * (\"q3\" - \"q1\") AS \"lowerFence\",\n \"q3\" + 1.5 * (\"q3\" - \"q1\") AS \"upperFence\"\n FROM stats\n),\nwhiskers AS (\n SELECT\n b.\"category\",\n MIN(b.\"value\") AS \"whiskerLow\",\n MAX(b.\"value\") AS \"whiskerHigh\"\n FROM base b\n JOIN fences f ON b.\"category\" IS NOT DISTINCT FROM f.\"category\"\n WHERE b.\"value\" BETWEEN f.\"lowerFence\" AND f.\"upperFence\"\n GROUP BY b.\"category\"\n),\nsummary AS (\n SELECT\n 'summary' AS \"rowKind\",\n f.\"category\",\n f.\"count\",\n f.\"q1\",\n f.\"median\",\n f.\"q3\",\n f.\"lowerFence\",\n f.\"upperFence\",\n w.\"whiskerLow\",\n w.\"whiskerHigh\",\n NULL::DOUBLE AS \"value\"\n FROM fences f\n JOIN whiskers w ON w.\"category\" IS NOT DISTINCT FROM f.\"category\"\n),\noutliers AS (\n SELECT\n 'outlier' AS \"rowKind\",\n b.\"category\",\n NULL::DOUBLE AS \"count\",\n NULL::DOUBLE AS \"q1\",\n NULL::DOUBLE AS \"median\",\n NULL::DOUBLE AS \"q3\",\n NULL::DOUBLE AS \"lowerFence\",\n NULL::DOUBLE AS \"upperFence\",\n NULL::DOUBLE AS \"whiskerLow\",\n NULL::DOUBLE AS \"whiskerHigh\",\n b.\"value\"\n FROM base b\n JOIN fences f ON b.\"category\" IS NOT DISTINCT FROM f.\"category\"\n WHERE b.\"value\" < f.\"lowerFence\" OR b.\"value\" > f.\"upperFence\"\n)\nSELECT * FROM summary\nUNION ALL\nSELECT * FROM outliers\nORDER BY \"category\", \"rowKind\", \"value\"\n`.trim();\n}\n\nexport class BoxPlotClient extends MosaicClient {\n private readonly onStateChange: (state: BoxPlotState) => void;\n private readonly tableName: string;\n private readonly x: string;\n private readonly y: string;\n private readonly selection: Selection;\n private readonly dataPolicy?: ChartDataPolicy | null;\n private readonly runtimeIssueContext?: ChartRuntimeIssueContext;\n private readonly runtimeIssueReporter?: ChartRuntimeIssueReporter;\n private state: BoxPlotState = {\n isLoading: true,\n outliers: [],\n summaries: [],\n };\n private destroyed = false;\n\n constructor(options: BoxPlotClientOptions) {\n super(options.selection);\n this.dataPolicy = options.dataPolicy;\n this.onStateChange = options.onStateChange;\n this.runtimeIssueContext = options.runtimeIssueContext;\n this.runtimeIssueReporter = options.runtimeIssueReporter;\n this.tableName = options.tableName;\n this.x = options.x;\n this.y = options.y;\n this.selection = options.selection;\n }\n\n override get filterStable(): boolean {\n return false;\n }\n\n fields(): string[] {\n return [this.x, this.y];\n }\n\n private emitState(next: Partial<BoxPlotState>) {\n if (this.destroyed) {\n return;\n }\n this.state = {...this.state, ...next};\n this.onStateChange(this.state);\n }\n\n override queryPending(): this {\n this.emitState({error: undefined, isLoading: true});\n return this;\n }\n\n override query(filter?: FilterExpr | null): string {\n return buildBoxPlotQuery({\n filter,\n tableName: this.tableName,\n x: this.x,\n y: this.y,\n });\n }\n\n override queryResult(data: unknown): this {\n try {\n assertChartDataPolicy(this.dataPolicy, data);\n this.runtimeIssueReporter?.clearIssue();\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.runtimeIssueContext) {\n this.runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n normalizedError,\n this.runtimeIssueContext,\n this.dataPolicy,\n ),\n );\n }\n this.emitState({error: normalizedError, isLoading: false});\n return this;\n }\n\n const rows = rowsFromQueryResult<BoxPlotQueryRow>(data);\n const summaries: BoxPlotSummaryRow[] = [];\n const outliers: BoxPlotOutlierRow[] = [];\n\n for (const row of rows) {\n if (row.rowKind === 'summary') {\n const count = numericValue(row.count);\n const q1 = numericValue(row.q1);\n const median = numericValue(row.median);\n const q3 = numericValue(row.q3);\n const lowerFence = numericValue(row.lowerFence);\n const upperFence = numericValue(row.upperFence);\n const whiskerLow = numericValue(row.whiskerLow);\n const whiskerHigh = numericValue(row.whiskerHigh);\n if (\n count === undefined ||\n q1 === undefined ||\n median === undefined ||\n q3 === undefined ||\n lowerFence === undefined ||\n upperFence === undefined ||\n whiskerLow === undefined ||\n whiskerHigh === undefined\n ) {\n continue;\n }\n summaries.push({\n category: row.category,\n count,\n lowerFence,\n median,\n q1,\n q3,\n upperFence,\n whiskerHigh,\n whiskerLow,\n });\n } else if (row.rowKind === 'outlier') {\n const value = numericValue(row.value);\n if (value !== undefined) {\n outliers.push({\n category: row.category,\n value,\n });\n }\n }\n }\n\n this.emitState({\n error: undefined,\n isLoading: false,\n outliers,\n summaries,\n });\n return this;\n }\n\n override queryError(error: Error): this {\n if (this.runtimeIssueContext) {\n this.runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n error,\n this.runtimeIssueContext,\n this.dataPolicy,\n ),\n );\n }\n this.emitState({error, isLoading: false});\n return this;\n }\n\n updateYBrush(extent?: [number, number]) {\n const normalized = extent\n ? ([Math.min(...extent), Math.max(...extent)] as [number, number])\n : undefined;\n this.emitState({yBrush: normalized});\n const clause = clauseInterval(this.y, normalized ?? null, {source: this});\n this.selection.update(clause);\n }\n\n reset() {\n this.updateYBrush();\n }\n\n override destroy() {\n this.destroyed = true;\n super.destroy();\n }\n}\n"]}
|