@sqlrooms/deck 0.29.0-rc.8 → 0.29.0-rc.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -6
- package/dist/DeckJsonMap.d.ts +2 -2
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +202 -19
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +36 -36
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +1 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +202 -25
- package/dist/MapSettings.js.map +1 -1
- package/dist/ai.d.ts +55 -8
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +190 -41
- package/dist/ai.js.map +1 -1
- package/dist/block.d.ts +20 -0
- package/dist/block.d.ts.map +1 -0
- package/dist/block.js +119 -0
- package/dist/block.js.map +1 -0
- package/dist/dashboard.d.ts +2 -8
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +194 -289
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +11 -3
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +82 -7
- package/dist/dashboardConfig.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/json/aggregateWaypoints.d.ts +14 -0
- package/dist/json/aggregateWaypoints.d.ts.map +1 -0
- package/dist/json/aggregateWaypoints.js +190 -0
- package/dist/json/aggregateWaypoints.js.map +1 -0
- package/dist/json/compileColorScale.d.ts +1 -1
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +42 -20
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +106 -8
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts +5 -4
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +9 -4
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +43 -5
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +8 -0
- package/dist/json/heatmapDefaults.d.ts.map +1 -0
- package/dist/json/heatmapDefaults.js +14 -0
- package/dist/json/heatmapDefaults.js.map +1 -0
- package/dist/json/layerCompatibility.d.ts.map +1 -1
- package/dist/json/layerCompatibility.js +5 -1
- package/dist/json/layerCompatibility.js.map +1 -1
- package/dist/json/layers/DeckColumnLayer.d.ts +12 -0
- package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckColumnLayer.js +26 -0
- package/dist/json/layers/DeckColumnLayer.js.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.js +96 -0
- package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
- package/dist/json/layers/DeckTripsLayer.d.ts +45 -0
- package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckTripsLayer.js +169 -0
- package/dist/json/layers/DeckTripsLayer.js.map +1 -0
- package/dist/json/layers/index.d.ts +4 -0
- package/dist/json/layers/index.d.ts.map +1 -0
- package/dist/json/layers/index.js +4 -0
- package/dist/json/layers/index.js.map +1 -0
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +5 -0
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +102 -1
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +21 -3
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +15 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +109 -7
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/prepare/detectGeometryColumn.d.ts +10 -1
- package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
- package/dist/prepare/detectGeometryColumn.js +48 -6
- package/dist/prepare/detectGeometryColumn.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +88 -1
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +5 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +24 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/types.d.ts +14 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckMapDatasets.d.ts +17 -0
- package/dist/useDeckMapDatasets.d.ts.map +1 -0
- package/dist/useDeckMapDatasets.js +69 -0
- package/dist/useDeckMapDatasets.js.map +1 -0
- package/dist/useDeckMapFitToBounds.d.ts +29 -0
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
- package/dist/useDeckMapFitToBounds.js +333 -0
- package/dist/useDeckMapFitToBounds.js.map +1 -0
- package/package.json +7 -6
package/dist/dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {WebMercatorViewport} from '@deck.gl/core';\nimport type {ComponentProps} from 'react';\nimport type DeckGLReact from '@deck.gl/react';\n\ntype DeckProps = ComponentProps<typeof DeckGLReact>;\nimport {\n escapeId,\n getColValAsNumber,\n quoteTableReference,\n useStoreWithDuckDb,\n} from '@sqlrooms/duckdb';\nimport {\n column,\n type MosaicDashboardEntryType,\n type MosaicDashboardPanelConfigType,\n type MosaicDashboardPanelRenderer,\n type MosaicDashboardPanelRendererProps,\n sql,\n type ChartDataPolicy,\n type ChartRuntimeIssue,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n useMosaicClient,\n useStoreWithMosaicDashboard,\n usePanelClientRegistration,\n usePanelClients,\n usePanelResetFilters,\n ResetFiltersButton,\n} from '@sqlrooms/mosaic';\nimport {Button, Tooltip, TooltipContent, TooltipTrigger} from '@sqlrooms/ui';\nimport type {MosaicClient} from '@uwdata/mosaic-core';\nimport type {Selection} from '@uwdata/mosaic-core';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {FocusIcon, MapIcon, SettingsIcon} from 'lucide-react';\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {DeckMapConfigPopoverEditor} from './DeckMapConfigPopoverEditor';\nimport {DeckJsonMap} from './DeckJsonMap';\nimport {MapSettingsPanel} from './MapSettings';\nimport {MosaicDashboardPanelLayout} from '@sqlrooms/mosaic';\nimport {\n asDeckJsonMapConfig,\n createDeckMapDashboardDatasetQuery,\n createDeckMapDashboardDatasets,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n resolveDeckMapDashboardDatasetSource,\n type DeckMapDashboardFitToDataConfig,\n type DeckMapDashboardDatasetClientState,\n type DeckMapDashboardDatasetConfig,\n type DeckMapDashboardInteractionConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nimport {getDeckMapDataPolicy} from './mapDataPolicy';\nimport {\n createDeckMapDashboardPanelConfigForTable,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n} from './mapConfigUtils';\n\nfunction DeckMapRuntimeIssuePanel({issue}: {issue: ChartRuntimeIssue}) {\n const title =\n issue.kind === 'too-much-data'\n ? 'Too much data'\n : issue.kind === 'sql-error'\n ? 'Map query failed'\n : 'Unable to display map';\n\n return (\n <div className=\"flex h-full min-h-[200px] flex-col items-center justify-center p-4\">\n <div className=\"mb-2 text-center font-semibold\">{title}</div>\n <div className=\"text-center text-sm whitespace-pre-wrap\">\n {issue.message}\n </div>\n </div>\n );\n}\n\nfunction DeckMapDashboardDatasetClient({\n dashboard,\n dataset,\n datasetId,\n dataPolicy,\n panel,\n onDatasetState,\n runtimeIssueContext,\n runtimeIssueReporter,\n selectionName,\n}: {\n dashboard: MosaicDashboardEntryType;\n dataset: DeckMapDashboardDatasetConfig;\n datasetId: string;\n dataPolicy?: ChartDataPolicy | null;\n panel: MosaicDashboardPanelConfigType;\n onDatasetState: (\n datasetId: string,\n state: DeckMapDashboardDatasetClientState | undefined,\n ) => void;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n selectionName: string;\n}) {\n const source = useMemo(\n () =>\n resolveDeckMapDashboardDatasetSource({\n dashboard,\n panel,\n dataset,\n }),\n [dashboard, dataset, panel],\n );\n const query = useCallback(\n (filter: unknown) =>\n source\n ? createDeckMapDashboardDatasetQuery(source, filter)\n : createDeckMapDashboardDatasetQuery(\n {tableName: '__missing_dashboard_map_dataset__'},\n filter,\n ),\n [source],\n );\n const {data, error, isLoading, client} = useMosaicClient({\n id: `${panel.id}:${datasetId}`,\n selectionName,\n query,\n dataPolicy,\n enabled: Boolean(source),\n runtimeIssueContext,\n runtimeIssueReporter,\n });\n\n // Register client for panel reset button\n usePanelClientRegistration(dashboard.id, panel.id, client ? [client] : []);\n\n useEffect(() => {\n onDatasetState(datasetId, {\n arrowTable: data ?? undefined,\n error,\n isLoading,\n client,\n });\n\n return () => {\n onDatasetState(datasetId, undefined);\n };\n }, [client, data, datasetId, error, isLoading, onDatasetState]);\n\n return null;\n}\n\nfunction createPointRadiusPredicate(\n interaction: DeckMapDashboardInteractionConfig,\n coordinate: [number, number],\n) {\n const [longitude, latitude] = coordinate;\n const radiusMeters = interaction.radiusMeters ?? 500;\n const metersPerDegree = 111_320;\n const cosLatitude = Math.cos(latitude * (Math.PI / 180));\n const radiusSquared = radiusMeters * radiusMeters;\n\n return sql`(\n pow((${column(interaction.longitudeColumn)} - ${longitude}) * ${\n cosLatitude * metersPerDegree\n }, 2) +\n pow((${column(interaction.latitudeColumn)} - ${latitude}) * ${\n metersPerDegree\n }, 2)\n ) < ${radiusSquared}`;\n}\n\ntype DeckMapInteractionEvent = {\n coordinate?: number[] | null;\n object?: unknown;\n index?: number;\n picked?: boolean;\n};\n\nfunction getCoordinate(\n info: DeckMapInteractionEvent,\n): [number, number] | undefined {\n return info.coordinate && info.coordinate.length >= 2\n ? [info.coordinate[0]!, info.coordinate[1]!]\n : undefined;\n}\n\nfunction isPickedMapFeature(info: DeckMapInteractionEvent) {\n return Boolean(info.picked || info.object || (info.index ?? -1) >= 0);\n}\n\nexport function createDeckMapBoundsQuery(options: {\n source: {tableName?: string; sqlQuery?: string};\n fitToData: DeckMapDashboardFitToDataConfig;\n}) {\n const {source, fitToData} = options;\n const baseSourceSql = source.sqlQuery\n ? `SELECT * FROM (${source.sqlQuery}) AS \"__sqlrooms_dashboard_map_source\"`\n : `SELECT * FROM ${quoteTableReference(source.tableName ?? '')}`;\n const longitudeColumn = escapeId(fitToData.longitudeColumn);\n const latitudeColumn = escapeId(fitToData.latitudeColumn);\n\n return `\n SELECT\n ST_XMin(extent) AS min_longitude,\n ST_YMin(extent) AS min_latitude,\n ST_XMax(extent) AS max_longitude,\n ST_YMax(extent) AS max_latitude\n FROM (\n SELECT ST_Extent_Agg(ST_Point(${longitudeColumn}, ${latitudeColumn})) AS extent\n FROM (${baseSourceSql}) AS \"__sqlrooms_dashboard_map_points\"\n WHERE ${longitudeColumn} IS NOT NULL AND ${latitudeColumn} IS NOT NULL\n ) AS \"__sqlrooms_dashboard_map_extent\"\n WHERE extent IS NOT NULL\n `;\n}\n\nfunction readBoundsFromExtentResult(result: ArrowTable) {\n const minLongitude = getColValAsNumber(result, 'min_longitude');\n const minLatitude = getColValAsNumber(result, 'min_latitude');\n const maxLongitude = getColValAsNumber(result, 'max_longitude');\n const maxLatitude = getColValAsNumber(result, 'max_latitude');\n if (\n !Number.isFinite(minLongitude) ||\n !Number.isFinite(minLatitude) ||\n !Number.isFinite(maxLongitude) ||\n !Number.isFinite(maxLatitude)\n ) {\n return null;\n }\n\n return [\n [\n minLongitude === maxLongitude ? minLongitude - 0.01 : minLongitude,\n minLatitude === maxLatitude ? minLatitude - 0.01 : minLatitude,\n ],\n [\n minLongitude === maxLongitude ? maxLongitude + 0.01 : maxLongitude,\n minLatitude === maxLatitude ? maxLatitude + 0.01 : maxLatitude,\n ],\n ] as const;\n}\n\nfunction fitViewStateToBounds(options: {\n bounds: readonly [readonly [number, number], readonly [number, number]];\n width: number;\n height: number;\n padding?: number;\n maxZoom?: number;\n}) {\n const {bounds, width, height, padding = 40, maxZoom = 12} = options;\n const viewport = new WebMercatorViewport({\n width: Math.max(width, 1),\n height: Math.max(height, 1),\n });\n const fitted = viewport.fitBounds(\n [\n [bounds[0][0], bounds[0][1]],\n [bounds[1][0], bounds[1][1]],\n ],\n {padding},\n ) as WebMercatorViewport & {\n longitude: number;\n latitude: number;\n zoom: number;\n };\n\n return {\n longitude: fitted.longitude,\n latitude: fitted.latitude,\n zoom: Math.min(fitted.zoom, maxZoom),\n };\n}\n\nconst deckMapDashboardFitRequestTarget = new EventTarget();\n\nfunction emitDeckMapDashboardFitRequest(panelId: string) {\n deckMapDashboardFitRequestTarget.dispatchEvent(\n new CustomEvent('fit-view', {detail: {panelId}}),\n );\n}\n\ntype DeckMapDashboardFitState = {\n key: string;\n viewState: DeckProps['viewState'];\n didAutoFit: boolean;\n fitRequestVersion: number;\n handledFitRequestVersion: number;\n};\n\nfunction createInitialDeckMapDashboardFitState(\n key: string,\n): DeckMapDashboardFitState {\n return {\n key,\n viewState: undefined,\n didAutoFit: false,\n fitRequestVersion: 0,\n handledFitRequestVersion: 0,\n };\n}\n\nfunction DeckMapDashboardHeaderActions({\n dashboardId,\n panel,\n selectionName,\n}: MosaicDashboardPanelRendererProps) {\n const updatePanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.updatePanel,\n );\n const panelClients = usePanelClients(dashboardId, panel.id);\n const {hasActiveFilters, reset} = usePanelResetFilters({\n panelClients,\n selectionName,\n });\n\n const mapConfig = asDeckJsonMapConfig(panel.config);\n const canFitView = Boolean(mapConfig?.fitToData);\n\n const isSettingsOpen = Boolean(mapConfig?.settingsOpen);\n\n const handleConfigApply = useCallback(\n (nextConfig: Record<string, unknown>) => {\n updatePanel(dashboardId, panel.id, {\n config: nextConfig,\n });\n },\n [dashboardId, panel.id, updatePanel],\n );\n\n const handleToggleSettings = useCallback(() => {\n updatePanel(dashboardId, panel.id, {\n config: {...panel.config, settingsOpen: !isSettingsOpen},\n });\n }, [dashboardId, isSettingsOpen, panel.config, panel.id, updatePanel]);\n\n return (\n <div className=\"flex items-center gap-0.5\">\n <ResetFiltersButton\n disabled={!hasActiveFilters}\n onClick={reset}\n tooltip=\"Reset panel filters\"\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"data-[state=active]:bg-accent h-6 w-6\"\n title=\"Map settings\"\n onClick={handleToggleSettings}\n data-state={isSettingsOpen ? 'active' : 'inactive'}\n >\n <SettingsIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Map settings</TooltipContent>\n </Tooltip>\n <DeckMapConfigPopoverEditor\n value={panel.config}\n onApply={handleConfigApply}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n title={\n canFitView\n ? 'Fit map view to data'\n : 'Fit view unavailable for this map'\n }\n disabled={!canFitView}\n onClick={() => emitDeckMapDashboardFitRequest(panel.id)}\n >\n <FocusIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n );\n}\n\nfunction DeckMapDashboardRenderer({\n dashboard,\n dashboardId,\n panel,\n selectionName,\n}: MosaicDashboardPanelRendererProps) {\n const mapConfig = asDeckJsonMapConfig(panel.config);\n const getSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.getSelection,\n );\n const updatePanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.updatePanel,\n );\n const issue = useStoreWithMosaicDashboard((state) =>\n state.mosaicDashboard.getPanelIssue(dashboardId, panel.id),\n );\n const reportPanelIssue = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.reportPanelIssue,\n );\n const clearPanelIssue = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.clearPanelIssue,\n );\n const executeSql = useStoreWithDuckDb((state) => state.db.executeSql);\n\n const isSettingsOpen = Boolean(\n (panel.config as DeckMapDashboardPanelConfig).settingsOpen,\n );\n\n const handleSettingsOpenChange = useCallback(\n (isOpen: boolean) => {\n updatePanel(dashboardId, panel.id, {\n config: {...panel.config, settingsOpen: isOpen},\n });\n },\n [dashboardId, panel.config, panel.id, updatePanel],\n );\n const selection = useMemo<Selection>(\n () => getSelection(selectionName, 'crossfilter'),\n [getSelection, selectionName],\n );\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [datasetStates, setDatasetStates] = useState<\n Record<string, DeckMapDashboardDatasetClientState>\n >({});\n const [containerSize, setContainerSize] = useState({width: 0, height: 0});\n\n const handleDatasetState = useCallback(\n (\n datasetId: string,\n state: DeckMapDashboardDatasetClientState | undefined,\n ) => {\n setDatasetStates((current) => {\n const next = {...current};\n if (state) {\n next[datasetId] = state;\n } else {\n delete next[datasetId];\n }\n return next;\n });\n },\n [],\n );\n\n const dataPolicy = useMemo<ChartDataPolicy>(\n () => getDeckMapDataPolicy(mapConfig),\n [mapConfig],\n );\n const runtimeIssueContext = useMemo(\n () => ({\n panelId: panel.id,\n chartType: DECK_MAP_DASHBOARD_PANEL_TYPE,\n }),\n [panel.id],\n );\n const runtimeIssueReporter = useMemo<ChartRuntimeIssueReporter>(\n () => ({\n reportIssue: (issueToReport) => {\n reportPanelIssue(dashboardId, panel.id, issueToReport);\n },\n clearIssue: () => {\n clearPanelIssue(dashboardId, panel.id);\n },\n }),\n [clearPanelIssue, dashboardId, panel.id, reportPanelIssue],\n );\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const updateSize = () => {\n setContainerSize({\n width: container.clientWidth,\n height: container.clientHeight,\n });\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(container);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const fitToData = mapConfig?.fitToData ?? null;\n const fitToDataSource = useMemo(\n () =>\n fitToData\n ? resolveDeckMapDashboardDatasetSource({\n dashboard,\n panel,\n dataset: mapConfig?.datasets[fitToData.dataset],\n })\n : undefined,\n [dashboard, fitToData, mapConfig?.datasets, panel],\n );\n const fitToDataKey = useMemo(\n () =>\n fitToData && fitToDataSource\n ? JSON.stringify({\n source: fitToDataSource,\n fitToData,\n })\n : null,\n [fitToData, fitToDataSource],\n );\n const fitStateKey = useMemo(\n () => JSON.stringify({panelId: panel.id, fitToDataKey}),\n [fitToDataKey, panel.id],\n );\n const [fitState, setFitState] = useState<DeckMapDashboardFitState>(() =>\n createInitialDeckMapDashboardFitState(fitStateKey),\n );\n const activeFitState =\n fitState.key === fitStateKey\n ? fitState\n : createInitialDeckMapDashboardFitState(fitStateKey);\n const {didAutoFit, fitRequestVersion, handledFitRequestVersion, viewState} =\n activeFitState;\n\n useEffect(() => {\n const handleFitRequest = (event: Event) => {\n const detail = (event as CustomEvent<{panelId?: string}>).detail;\n if (detail?.panelId === panel.id) {\n setFitState((current) => {\n const scoped =\n current.key === fitStateKey\n ? current\n : createInitialDeckMapDashboardFitState(fitStateKey);\n return {\n ...scoped,\n fitRequestVersion: scoped.fitRequestVersion + 1,\n };\n });\n }\n };\n\n deckMapDashboardFitRequestTarget.addEventListener(\n 'fit-view',\n handleFitRequest,\n );\n return () => {\n deckMapDashboardFitRequestTarget.removeEventListener(\n 'fit-view',\n handleFitRequest,\n );\n };\n }, [fitStateKey, panel.id]);\n\n useEffect(() => {\n const hasManualFitRequest = fitRequestVersion > handledFitRequestVersion;\n if (\n !fitToData ||\n !fitToDataSource ||\n containerSize.width <= 0 ||\n containerSize.height <= 0 ||\n (!hasManualFitRequest && didAutoFit)\n ) {\n return;\n }\n\n let isCancelled = false;\n\n const fitToDataBounds = async () => {\n try {\n const handle = await executeSql(\n createDeckMapBoundsQuery({\n source: fitToDataSource,\n fitToData,\n }),\n );\n const result = handle ? await handle : null;\n if (isCancelled || !result) {\n return;\n }\n\n const bounds = readBoundsFromExtentResult(result);\n if (!bounds) {\n setFitState((current) => {\n const scoped =\n current.key === fitStateKey\n ? current\n : createInitialDeckMapDashboardFitState(fitStateKey);\n return {\n ...scoped,\n didAutoFit: true,\n handledFitRequestVersion: fitRequestVersion,\n };\n });\n return;\n }\n\n const nextViewState = fitViewStateToBounds({\n bounds,\n width: containerSize.width,\n height: containerSize.height,\n padding: fitToData.padding,\n maxZoom: fitToData.maxZoom,\n });\n setFitState((current) => {\n const scoped =\n current.key === fitStateKey\n ? current\n : createInitialDeckMapDashboardFitState(fitStateKey);\n return {\n ...scoped,\n viewState: nextViewState,\n didAutoFit: true,\n handledFitRequestVersion: fitRequestVersion,\n };\n });\n } catch {\n if (!isCancelled) {\n setFitState((current) => {\n const scoped =\n current.key === fitStateKey\n ? current\n : createInitialDeckMapDashboardFitState(fitStateKey);\n return {\n ...scoped,\n didAutoFit: true,\n handledFitRequestVersion: fitRequestVersion,\n };\n });\n }\n }\n };\n\n void fitToDataBounds();\n\n return () => {\n isCancelled = true;\n };\n }, [\n containerSize.height,\n containerSize.width,\n didAutoFit,\n executeSql,\n fitRequestVersion,\n fitStateKey,\n fitToData,\n fitToDataSource,\n handledFitRequestVersion,\n ]);\n\n const handleBrushEvent = useCallback(\n (info: DeckMapInteractionEvent) => {\n const interaction = mapConfig?.interaction;\n if (!interaction) {\n return;\n }\n\n const client = datasetStates[interaction.dataset]?.client as\n | MosaicClient\n | null\n | undefined;\n if (!client) {\n return;\n }\n const coordinate = getCoordinate(info);\n if (!coordinate) {\n return;\n }\n if (interaction.event !== 'click' && !isPickedMapFeature(info)) {\n selection.reset(\n selection.clauses.filter((clause) => clause.source === client),\n );\n return;\n }\n\n const radiusMeters = interaction.radiusMeters ?? 500;\n selection.update({\n source: client,\n clients: new Set([client]),\n value: [coordinate[0], coordinate[1], radiusMeters],\n predicate: createPointRadiusPredicate(interaction, coordinate),\n });\n },\n [datasetStates, mapConfig?.interaction, selection],\n );\n\n const handleViewStateChange = useCallback(\n ({\n viewState: nextViewState,\n interactionState,\n }: {\n viewState: any;\n interactionState?: any;\n }) => {\n const hasUserInteraction = Boolean(\n interactionState &&\n ['isDragging', 'isPanning', 'isRotating', 'isZooming'].some((key) =>\n Boolean(interactionState[key]),\n ),\n );\n if (\n fitToData &&\n !didAutoFit &&\n viewState === null &&\n !hasUserInteraction\n ) {\n return;\n }\n\n setFitState((current) => {\n const scoped =\n current.key === fitStateKey\n ? current\n : createInitialDeckMapDashboardFitState(fitStateKey);\n return {\n ...scoped,\n viewState: nextViewState,\n didAutoFit: hasUserInteraction || scoped.didAutoFit || !fitToData,\n };\n });\n },\n [didAutoFit, fitStateKey, fitToData, viewState],\n );\n\n const settingsContent = (\n <MapSettingsPanel\n dashboardId={dashboardId}\n panel={panel}\n onClose={() => handleSettingsOpenChange(false)}\n />\n );\n\n const mapContent = !mapConfig ? (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Invalid map panel config.\n </div>\n ) : issue ? (\n <DeckMapRuntimeIssuePanel issue={issue} />\n ) : Object.entries(mapConfig.datasets).length === 0 ? (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Map panels require at least one dataset.\n </div>\n ) : (\n <div ref={containerRef} className=\"relative h-full w-full\">\n {Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => (\n <DeckMapDashboardDatasetClient\n key={datasetId}\n dashboard={dashboard}\n dataset={dataset}\n datasetId={datasetId}\n dataPolicy={dataPolicy}\n panel={panel}\n onDatasetState={handleDatasetState}\n runtimeIssueContext={runtimeIssueContext}\n runtimeIssueReporter={runtimeIssueReporter}\n selectionName={selectionName}\n />\n ))}\n {Object.entries(datasetStates)\n .filter(([, state]) => state.error)\n .map(([datasetId, state]) => (\n <div\n key={datasetId}\n className=\"bg-background/90 text-destructive absolute inset-x-4 top-4 z-10 rounded-md border p-3 text-sm shadow\"\n >\n Failed to load dataset "{datasetId}":{' '}\n {state.error?.message}\n </div>\n ))}\n <DeckJsonMap\n className=\"h-full w-full\"\n spec={mapConfig.spec}\n datasets={\n mapConfig\n ? createDeckMapDashboardDatasets(mapConfig, datasetStates)\n : {}\n }\n mapStyle={mapConfig.mapStyle}\n mapProps={mapConfig.mapProps}\n showLegends={mapConfig.showLegends}\n deckProps={{\n controller: true,\n ...(viewState ? {viewState} : {}),\n onViewStateChange: handleViewStateChange,\n ...(mapConfig.interaction\n ? (mapConfig.interaction.event ?? 'hover') === 'click'\n ? {onClick: handleBrushEvent}\n : {onHover: handleBrushEvent}\n : {}),\n }}\n />\n </div>\n );\n\n return (\n <div className=\"h-full min-h-0\">\n <MosaicDashboardPanelLayout\n isOpen={isSettingsOpen}\n onIsOpenChange={handleSettingsOpenChange}\n settings={settingsContent}\n content={mapContent}\n />\n </div>\n );\n}\n\nexport const deckMapDashboardPanelRenderer: MosaicDashboardPanelRenderer = {\n component: DeckMapDashboardRenderer,\n headerActions: DeckMapDashboardHeaderActions,\n icon: MapIcon,\n};\n\nexport const deckMapDashboardAddPanelAction: import('@sqlrooms/mosaic').MosaicDashboardAddPanelAction =\n {\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n label: 'Map',\n icon: MapIcon,\n isEnabled: ({selectedTable}) =>\n Boolean(\n findLongitudeLatitudeColumns(selectedTable) ??\n findGeometryColumn(selectedTable),\n ),\n createPanel: ({selectedTable}) =>\n selectedTable\n ? createDeckMapDashboardPanelConfigForTable({\n title: `${selectedTable.tableName} map`,\n tableName: selectedTable.tableName,\n columns: selectedTable.columns,\n tableReference: selectedTable.table,\n })\n : undefined,\n };\n"]}
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n column,\n type MosaicDashboardEntryType,\n type MosaicDashboardPanelConfigType,\n type MosaicDashboardPanelRenderer,\n type MosaicDashboardPanelRendererProps,\n sql,\n type ChartRuntimeIssue,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n useMosaicClient,\n useStoreWithMosaicDashboard,\n usePanelClientRegistration,\n} from '@sqlrooms/mosaic';\nimport {Button, Tooltip, TooltipContent, TooltipTrigger} from '@sqlrooms/ui';\nimport type {MosaicClient} from '@uwdata/mosaic-core';\nimport type {Selection} from '@uwdata/mosaic-core';\nimport {\n AlertTriangleIcon,\n FocusIcon,\n MapIcon,\n SettingsIcon,\n} from 'lucide-react';\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {DeckMapConfigPopoverEditor} from './DeckMapConfigPopoverEditor';\nimport {DeckJsonMap} from './DeckJsonMap';\nimport type {DeckJsonMapHandle} from './types';\nimport {MapSettingsPanel} from './MapSettings';\nimport {MosaicDashboardPanelLayout} from '@sqlrooms/mosaic';\nimport {\n asDeckJsonMapConfig,\n createDeckMapDashboardPanelConfig,\n createDeckMapDashboardDatasetQuery,\n createDeckMapDashboardDatasets,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n resolveDeckMapDashboardDatasetSource,\n type DeckMapDashboardFitToDataConfig,\n type DeckMapDashboardDatasetClientState,\n type DeckMapDashboardDatasetConfig,\n type DeckMapDashboardInteractionConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nimport {\n useDeckMapFitToBounds,\n emitDeckMapDashboardFitRequest,\n createDeckMapBoundsQuery,\n} from './useDeckMapFitToBounds';\nexport {createDeckMapBoundsQuery};\nimport {useDeckMapDatasets} from './useDeckMapDatasets';\nimport {\n createDeckMapDashboardPanelConfigForTable,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n} from './mapConfigUtils';\n\nfunction createEmptyDeckMapDashboardPanelConfig(title = 'Map') {\n return createDeckMapDashboardPanelConfig({\n title,\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [],\n },\n datasets: {},\n });\n}\n\n/**\n * Extracts column names from common DuckDB \"column not found\" error messages\n * and layer geometry incompatibility errors.\n * Returns the column names if detected, or null for unrecognized errors.\n */\nfunction parseMissingColumnsFromError(message: string): string[] | null {\n // \"Referenced column \"X\" not found in FROM clause!\" — may appear multiple times\n const refMatches = [\n ...message.matchAll(/Referenced column \"([^\"]+)\" not found/gi),\n ];\n if (refMatches.length > 0) return refMatches.map((m) => m[1]!);\n\n // \"Binder Error: Column \"X\" does not exist\" or \"column X not found\"\n const colMatch = message.match(\n /(?:Column|column)\\s+\"([^\"]+)\"\\s+(?:does not exist|not found)/i,\n );\n if (colMatch) return [colMatch[1]!];\n\n // \"Geometry column \"X\" was not found\"\n const geomNotFound = message.match(\n /Geometry column \"([^\"]+)\" was not found/i,\n );\n if (geomNotFound) return [geomNotFound[1]!];\n\n return null;\n}\n\n/**\n * Detects geometry type mismatch errors (e.g. polygon layer on point data).\n */\nfunction parseGeometryMismatchError(\n message: string,\n): {required: string; found: string} | null {\n const match = message.match(\n /requires (\\w+) geometry .+ but only (\\w+) coordinates were found/i,\n );\n if (match) return {required: match[1]!, found: match[2]!};\n return null;\n}\n\n/**\n * Detects columns referenced in layer config that are missing from the loaded dataset.\n */\nfunction detectMissingColumns(\n mapConfig: DeckMapDashboardPanelConfig | undefined,\n datasetStates: Record<string, DeckMapDashboardDatasetClientState>,\n): string[] {\n if (!mapConfig?.spec) return [];\n const missing: string[] = [];\n const spec = mapConfig.spec as Record<string, unknown>;\n const layers = Array.isArray(spec.layers) ? spec.layers : [];\n\n for (const layer of layers) {\n if (!layer || typeof layer !== 'object') continue;\n const layerObj = layer as Record<string, unknown>;\n const binding = layerObj._sqlroomsBinding as\n | Record<string, unknown>\n | undefined;\n const datasetId = binding?.dataset as string | undefined;\n const arrowTable = datasetId\n ? datasetStates[datasetId]?.arrowTable\n : undefined;\n if (!arrowTable) continue;\n\n const fieldNames = new Set(\n arrowTable.schema.fields.map((f) => f.name.toLowerCase()),\n );\n const check = (col: string | undefined) => {\n if (col && !fieldNames.has(col.toLowerCase())) {\n missing.push(col);\n }\n };\n\n // Check @@= accessors\n for (const [propName, propValue] of Object.entries(layerObj)) {\n // Skip elevation references when extrusion is disabled\n if (propName === 'getElevation' && !layerObj.extruded) continue;\n\n if (typeof propValue === 'string' && propValue.startsWith('@@=')) {\n check(propValue.slice(3).trim());\n }\n // Check @@function colorScale/scale field references\n if (\n propValue &&\n typeof propValue === 'object' &&\n '@@function' in (propValue as object)\n ) {\n const fn = propValue as Record<string, unknown>;\n if (typeof fn.field === 'string') {\n check(fn.field);\n }\n }\n }\n }\n\n return [...new Set(missing)];\n}\n\nfunction DeckMapRuntimeIssuePanel({issue}: {issue: ChartRuntimeIssue}) {\n if (issue.kind === 'sql-error' || issue.kind === 'render-error') {\n const missingColumns = parseMissingColumnsFromError(issue.message);\n if (missingColumns) {\n return (\n <div className=\"flex h-full min-h-[200px] flex-col items-center justify-center p-4\">\n <div className=\"mb-2 text-center font-semibold\">\n The visualization can't be displayed\n </div>\n <div className=\"text-center text-sm\">\n <span>Selected columns are missing in the dataset: </span>\n {missingColumns.map((col, idx) => (\n <span key={idx}>\n <span className=\"inline-flex items-center rounded-md border border-gray-600 bg-gray-800 px-1 py-0.5 text-xs font-medium text-gray-300\">\n {col}\n </span>{' '}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n const geomMismatch = parseGeometryMismatchError(issue.message);\n if (geomMismatch) {\n return (\n <div className=\"flex h-full min-h-[200px] flex-col items-center justify-center p-4\">\n <div className=\"mb-2 text-center font-semibold\">\n The visualization can't be displayed\n </div>\n <div className=\"text-center text-sm\">\n This layer requires {geomMismatch.required} geometry, but the\n current dataset only has {geomMismatch.found} coordinates.\n </div>\n </div>\n );\n }\n }\n\n const title =\n issue.kind === 'too-much-data'\n ? 'Too much data'\n : issue.kind === 'sql-error'\n ? 'Map query failed'\n : 'Unable to display map';\n\n return (\n <div className=\"flex h-full min-h-[200px] flex-col items-center justify-center p-4\">\n <div className=\"mb-2 text-center font-semibold\">{title}</div>\n <div className=\"text-center text-sm whitespace-pre-wrap\">\n {issue.message}\n </div>\n </div>\n );\n}\n\nfunction DeckMapDashboardDatasetClient({\n dashboard,\n dataset,\n datasetId,\n fitToData,\n panel,\n onDatasetState,\n runtimeIssueContext,\n runtimeIssueReporter,\n selectionName,\n maxRows,\n}: {\n dashboard: MosaicDashboardEntryType;\n dataset: DeckMapDashboardDatasetConfig;\n datasetId: string;\n fitToData?: DeckMapDashboardFitToDataConfig;\n panel: MosaicDashboardPanelConfigType;\n onDatasetState: (\n datasetId: string,\n state: DeckMapDashboardDatasetClientState | undefined,\n ) => void;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n selectionName: string;\n maxRows: number;\n}) {\n const datasetFitToData = useMemo(\n () => (fitToData?.dataset === datasetId ? fitToData : undefined),\n [datasetId, fitToData],\n );\n const source = useMemo(\n () =>\n resolveDeckMapDashboardDatasetSource({\n dashboard,\n panel,\n dataset,\n fitToData: datasetFitToData,\n }),\n [dashboard, dataset, datasetFitToData, panel],\n );\n const query = useCallback(\n (filter: unknown) =>\n source\n ? createDeckMapDashboardDatasetQuery(source, filter, {\n sampleRows: maxRows,\n })\n : createDeckMapDashboardDatasetQuery(\n {tableName: '__missing_dashboard_map_dataset__'},\n filter,\n {sampleRows: maxRows},\n ),\n [maxRows, source],\n );\n const queryError = useCallback(\n (err: Error) => {\n onDatasetState(datasetId, {\n arrowTable: undefined,\n error: err,\n isLoading: false,\n client: null,\n isSampled: false,\n });\n },\n [datasetId, onDatasetState],\n );\n const sourceKey = source?.tableName ?? dashboard.selectedTable ?? '';\n const sourceQueryKey = source?.sqlQuery ?? '';\n const {data, error, isLoading, client} = useMosaicClient({\n id: `${panel.id}:${datasetId}:${sourceKey}:${sourceQueryKey}`,\n selectionName,\n query,\n queryError,\n enabled: Boolean(source),\n runtimeIssueContext,\n runtimeIssueReporter,\n });\n\n // Register client for panel reset button\n usePanelClientRegistration(dashboard.id, panel.id, client ? [client] : []);\n\n const isSampled = Boolean(data && data.numRows >= maxRows);\n\n useEffect(() => {\n onDatasetState(datasetId, {\n arrowTable: data ?? undefined,\n error,\n isLoading,\n client,\n isSampled,\n });\n\n return () => {\n onDatasetState(datasetId, undefined);\n };\n }, [client, data, datasetId, error, isLoading, isSampled, onDatasetState]);\n\n return null;\n}\n\nfunction createPointRadiusPredicate(\n interaction: DeckMapDashboardInteractionConfig,\n coordinate: [number, number],\n) {\n const [longitude, latitude] = coordinate;\n const radiusMeters = interaction.radiusMeters ?? 500;\n const metersPerDegree = 111_320;\n const cosLatitude = Math.cos(latitude * (Math.PI / 180));\n const radiusSquared = radiusMeters * radiusMeters;\n\n return sql`(\n pow((${column(interaction.longitudeColumn)} - ${longitude}) * ${\n cosLatitude * metersPerDegree\n }, 2) +\n pow((${column(interaction.latitudeColumn)} - ${latitude}) * ${\n metersPerDegree\n }, 2)\n ) < ${radiusSquared}`;\n}\n\ntype DeckMapInteractionEvent = {\n coordinate?: number[] | null;\n object?: unknown;\n index?: number;\n picked?: boolean;\n};\n\nfunction getCoordinate(\n info: DeckMapInteractionEvent,\n): [number, number] | undefined {\n return info.coordinate && info.coordinate.length >= 2\n ? [info.coordinate[0]!, info.coordinate[1]!]\n : undefined;\n}\n\nfunction isPickedMapFeature(info: DeckMapInteractionEvent) {\n return Boolean(info.picked || info.object || (info.index ?? -1) >= 0);\n}\n\nfunction DeckMapDashboardHeaderActions({\n dashboardId,\n panel,\n}: MosaicDashboardPanelRendererProps) {\n const updatePanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.updatePanel,\n );\n\n const mapConfig = asDeckJsonMapConfig(panel.config);\n const canFitView = Boolean(mapConfig?.fitToData);\n\n const isSettingsOpen = Boolean(mapConfig?.settingsOpen);\n\n const handleConfigApply = useCallback(\n (nextConfig: Record<string, unknown>) => {\n updatePanel(dashboardId, panel.id, {\n config: nextConfig,\n });\n },\n [dashboardId, panel.id, updatePanel],\n );\n\n const handleToggleSettings = useCallback(() => {\n updatePanel(dashboardId, panel.id, {\n config: {...panel.config, settingsOpen: !isSettingsOpen},\n });\n }, [dashboardId, isSettingsOpen, panel.config, panel.id, updatePanel]);\n\n return (\n <div className=\"flex items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"data-[state=active]:bg-accent h-6 w-6\"\n title=\"Map settings\"\n onClick={handleToggleSettings}\n data-state={isSettingsOpen ? 'active' : 'inactive'}\n >\n <SettingsIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Map settings</TooltipContent>\n </Tooltip>\n <DeckMapConfigPopoverEditor\n value={panel.config}\n onApply={handleConfigApply}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n title={\n canFitView\n ? 'Fit map view to data'\n : 'Fit view unavailable for this map'\n }\n disabled={!canFitView}\n onClick={() => emitDeckMapDashboardFitRequest(panel.id)}\n >\n <FocusIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n );\n}\n\nfunction DeckMapDashboardRenderer({\n dashboard,\n dashboardId,\n panel,\n selectionName,\n}: MosaicDashboardPanelRendererProps) {\n const mapConfig = asDeckJsonMapConfig(panel.config);\n const getSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.getSelection,\n );\n const updatePanel = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.updatePanel,\n );\n const issue = useStoreWithMosaicDashboard((state) =>\n state.mosaicDashboard.getPanelIssue(dashboardId, panel.id),\n );\n const clearPanelIssue = useStoreWithMosaicDashboard(\n (state) => state.mosaicDashboard.clearPanelIssue,\n );\n\n // Clear runtime issues when the active table or panel config changes so\n // the map can recover (e.g., after switching tables or AI updating the map).\n useEffect(() => {\n clearPanelIssue(dashboardId, panel.id);\n }, [\n clearPanelIssue,\n dashboard.selectedTable,\n dashboardId,\n panel.config,\n panel.id,\n ]);\n\n const isSettingsOpen = Boolean(\n (panel.config as DeckMapDashboardPanelConfig).settingsOpen,\n );\n\n const handleSettingsOpenChange = useCallback(\n (isOpen: boolean) => {\n updatePanel(dashboardId, panel.id, {\n config: {...panel.config, settingsOpen: isOpen},\n });\n },\n [dashboardId, panel.config, panel.id, updatePanel],\n );\n const selection = useMemo<Selection>(\n () => getSelection(selectionName, 'crossfilter'),\n [getSelection, selectionName],\n );\n const containerRef = useRef<HTMLDivElement | null>(null);\n const deckMapRef = useRef<DeckJsonMapHandle>(null);\n const [containerSize, setContainerSize] = useState({width: 0, height: 0});\n const [sampledDismissed, setSampledDismissed] = useState(false);\n\n const {\n datasetStates,\n handleDatasetState,\n runtimeIssueContext,\n runtimeIssueReporter,\n handleRenderingError,\n } = useDeckMapDatasets({dashboardId, panel});\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const updateSize = () => {\n setContainerSize({\n width: container.clientWidth,\n height: container.clientHeight,\n });\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(container);\n\n return () => {\n observer.disconnect();\n };\n }, [issue]);\n\n const {fitToData} = useDeckMapFitToBounds({\n panelId: panel.id,\n dashboard,\n panel,\n containerSize,\n deckMapRef,\n });\n\n const handleBrushEvent = useCallback(\n (info: DeckMapInteractionEvent) => {\n const interaction = mapConfig?.interaction;\n if (!interaction) {\n return;\n }\n\n const client = datasetStates[interaction.dataset]?.client as\n | MosaicClient\n | null\n | undefined;\n if (!client) {\n return;\n }\n const coordinate = getCoordinate(info);\n if (!coordinate) {\n return;\n }\n if (interaction.event !== 'click' && !isPickedMapFeature(info)) {\n selection.reset(\n selection.clauses.filter((clause) => clause.source === client),\n );\n return;\n }\n\n const radiusMeters = interaction.radiusMeters ?? 500;\n selection.update({\n source: client,\n clients: new Set([client]),\n value: [coordinate[0], coordinate[1], radiusMeters],\n predicate: createPointRadiusPredicate(interaction, coordinate),\n });\n },\n [datasetStates, mapConfig?.interaction, selection],\n );\n\n const settingsContent = (\n <MapSettingsPanel\n dashboardId={dashboardId}\n panel={panel}\n onClose={() => handleSettingsOpenChange(false)}\n />\n );\n\n const datasetError = useMemo(() => {\n for (const state of Object.values(datasetStates)) {\n if (state.error) return state.error;\n }\n return undefined;\n }, [datasetStates]);\n\n const missingColumns = useMemo(\n () => detectMissingColumns(mapConfig ?? undefined, datasetStates),\n [mapConfig, datasetStates],\n );\n\n const mapContent = !mapConfig ? (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Invalid map panel config.\n </div>\n ) : Object.entries(mapConfig.datasets).length === 0 ? (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-sm\">\n Map panels require at least one dataset.\n </div>\n ) : (\n <>\n {Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => (\n <DeckMapDashboardDatasetClient\n key={datasetId}\n dashboard={dashboard}\n dataset={dataset}\n datasetId={datasetId}\n fitToData={fitToData ?? undefined}\n panel={panel}\n onDatasetState={handleDatasetState}\n runtimeIssueContext={runtimeIssueContext}\n runtimeIssueReporter={runtimeIssueReporter}\n selectionName={selectionName}\n maxRows={DEFAULT_DECK_MAP_MAX_DATA_POINTS}\n />\n ))}\n {issue ? (\n <DeckMapRuntimeIssuePanel issue={issue} />\n ) : datasetError ? (\n <DeckMapRuntimeIssuePanel\n issue={{\n kind: 'sql-error',\n panelId: panel.id,\n chartType: DECK_MAP_DASHBOARD_PANEL_TYPE,\n message: datasetError.message,\n recoverable: true,\n }}\n />\n ) : (\n <div ref={containerRef} className=\"relative h-full w-full\">\n {Object.values(datasetStates).some((s) => s.isSampled) &&\n !sampledDismissed && (\n <div className=\"bg-background/80 text-muted-foreground absolute top-2 left-2 z-10 flex items-center gap-1.5 rounded px-2 py-1 text-xs shadow\">\n <span>\n Data sampled to{' '}\n {DEFAULT_DECK_MAP_MAX_DATA_POINTS.toLocaleString()} rows\n </span>\n <button\n className=\"text-muted-foreground/60 hover:text-foreground -mr-0.5 ml-0.5\"\n onClick={() => setSampledDismissed(true)}\n >\n ×\n </button>\n </div>\n )}\n {missingColumns.length > 0 && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className={`absolute left-2 z-10 flex h-5 w-5 items-center justify-center ${\n Object.values(datasetStates).some((s) => s.isSampled) &&\n !sampledDismissed\n ? 'top-9'\n : 'top-2'\n }`}\n onClick={() => handleSettingsOpenChange(true)}\n >\n <AlertTriangleIcon className=\"h-4 w-4 text-amber-500 drop-shadow-sm\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <p className=\"text-xs font-medium\">Missing columns:</p>\n <p className=\"text-xs\">{missingColumns.join(', ')}</p>\n </TooltipContent>\n </Tooltip>\n )}\n <DeckJsonMap\n ref={deckMapRef}\n className=\"h-full w-full\"\n spec={mapConfig.spec}\n datasets={\n mapConfig\n ? createDeckMapDashboardDatasets(mapConfig, datasetStates)\n : {}\n }\n mapStyle={mapConfig.mapStyle}\n mapProps={mapConfig.mapProps}\n showLegends={mapConfig.showLegends}\n onRenderingError={handleRenderingError}\n deckProps={{\n controller: true,\n ...(mapConfig.interaction\n ? (mapConfig.interaction.event ?? 'hover') === 'click'\n ? {onClick: handleBrushEvent}\n : {onHover: handleBrushEvent}\n : {}),\n }}\n />\n </div>\n )}\n </>\n );\n\n return (\n <div className=\"h-full min-h-0\">\n <MosaicDashboardPanelLayout\n isOpen={isSettingsOpen}\n onIsOpenChange={handleSettingsOpenChange}\n settings={settingsContent}\n content={mapContent}\n />\n </div>\n );\n}\n\nexport const deckMapDashboardPanelRenderer: MosaicDashboardPanelRenderer = {\n component: DeckMapDashboardRenderer,\n headerActions: DeckMapDashboardHeaderActions,\n icon: MapIcon,\n};\n\nexport const deckMapDashboardAddPanelAction: import('@sqlrooms/mosaic').MosaicDashboardAddPanelAction =\n {\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n label: 'Map',\n icon: MapIcon,\n createPanel: ({selectedTable}) => {\n if (\n selectedTable &&\n (findLongitudeLatitudeColumns(selectedTable) ??\n findGeometryColumn(selectedTable))\n ) {\n return createDeckMapDashboardPanelConfigForTable({\n title: `${selectedTable.tableName} map`,\n tableName: selectedTable.tableName,\n columns: selectedTable.columns,\n tableReference: selectedTable.table,\n });\n }\n\n return createEmptyDeckMapDashboardPanelConfig(\n selectedTable ? `${selectedTable.tableName} map` : 'Map',\n );\n },\n };\n"]}
|
|
@@ -24,8 +24,12 @@ export type DeckMapDashboardInteractionConfig = {
|
|
|
24
24
|
};
|
|
25
25
|
export type DeckMapDashboardFitToDataConfig = {
|
|
26
26
|
dataset: string;
|
|
27
|
-
longitudeColumn
|
|
28
|
-
latitudeColumn
|
|
27
|
+
longitudeColumn?: string;
|
|
28
|
+
latitudeColumn?: string;
|
|
29
|
+
/** Geometry column name (WKB) for computing bounds from geometry directly. */
|
|
30
|
+
geometryColumn?: string;
|
|
31
|
+
/** H3 hex index column for computing bounds from H3 cells. */
|
|
32
|
+
h3Column?: string;
|
|
29
33
|
padding?: number;
|
|
30
34
|
maxZoom?: number;
|
|
31
35
|
};
|
|
@@ -48,6 +52,7 @@ export type DeckMapDashboardDatasetClientState = {
|
|
|
48
52
|
isLoading: boolean;
|
|
49
53
|
error?: Error;
|
|
50
54
|
client: unknown;
|
|
55
|
+
isSampled?: boolean;
|
|
51
56
|
};
|
|
52
57
|
export declare function asDeckJsonMapConfig(config: Record<string, unknown>): DeckMapDashboardPanelConfig | null;
|
|
53
58
|
export declare function createDeckMapDashboardPanelConfig(options: CreateDeckMapDashboardPanelConfigOptions): any;
|
|
@@ -55,6 +60,7 @@ export declare function resolveDeckMapDashboardDatasetSource(options: {
|
|
|
55
60
|
dashboard: MosaicDashboardEntryType;
|
|
56
61
|
panel: MosaicDashboardPanelConfigType;
|
|
57
62
|
dataset?: DeckMapDashboardDatasetConfig;
|
|
63
|
+
fitToData?: DeckMapDashboardFitToDataConfig;
|
|
58
64
|
}): {
|
|
59
65
|
tableName?: string;
|
|
60
66
|
sqlQuery?: string;
|
|
@@ -62,6 +68,8 @@ export declare function resolveDeckMapDashboardDatasetSource(options: {
|
|
|
62
68
|
export declare function createDeckMapDashboardDatasetQuery(source: {
|
|
63
69
|
tableName?: string;
|
|
64
70
|
sqlQuery?: string;
|
|
65
|
-
}, filter: unknown
|
|
71
|
+
}, filter: unknown, options?: {
|
|
72
|
+
sampleRows?: number;
|
|
73
|
+
}): import("@uwdata/mosaic-sql").SelectQuery;
|
|
66
74
|
export declare function createDeckMapDashboardDatasets(mapConfig: DeckMapDashboardPanelConfig, datasetStates: Record<string, Pick<DeckMapDashboardDatasetClientState, 'arrowTable'>>): DeckJsonMapProps['datasets'];
|
|
67
75
|
//# sourceMappingURL=dashboardConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardConfig.d.ts","sourceRoot":"","sources":["../src/dashboardConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EAEpC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAC,KAAK,IAAI,UAAU,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAC,gBAAgB,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAEnE,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D,eAAO,MAAM,gCAAgC,SAAU,CAAC;AAExD,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,mBAAmB,EACnB,UAAU,CACX,GAAG;IACF,MAAM,CAAC,EAAE;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboardConfig.d.ts","sourceRoot":"","sources":["../src/dashboardConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/dashboardConfig.js
CHANGED
|
@@ -23,17 +23,92 @@ export function createDeckMapDashboardPanelConfig(options) {
|
|
|
23
23
|
}
|
|
24
24
|
export function resolveDeckMapDashboardDatasetSource(options) {
|
|
25
25
|
const datasetSource = options.dataset?.source;
|
|
26
|
-
|
|
26
|
+
const dashboardTable = stripCatalogPrefix(options.dashboard.selectedTable);
|
|
27
|
+
// The dashboard's selected table always takes precedence as the data source.
|
|
28
|
+
// When the user switches the table in the selector, all panels update.
|
|
29
|
+
const baseTableName = dashboardTable || datasetSource?.tableName;
|
|
30
|
+
if (!baseTableName && !datasetSource?.sqlQuery) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
// If the dataset has a sqlQuery and the dashboard table differs from the
|
|
34
|
+
// original source table, rewrite the FROM clause to use the new table.
|
|
35
|
+
if (datasetSource?.sqlQuery && dashboardTable) {
|
|
36
|
+
const originalTable = datasetSource.tableName;
|
|
37
|
+
const quote = (id) => `"${id.replace(/"/g, '""')}"`;
|
|
38
|
+
const quotedDashboard = dashboardTable.includes('"')
|
|
39
|
+
? dashboardTable
|
|
40
|
+
: dashboardTable.split('.').map(quote).join('.');
|
|
41
|
+
if (originalTable && dashboardTable !== originalTable) {
|
|
42
|
+
const quotedOriginal = originalTable.split('.').map(quote).join('.');
|
|
43
|
+
const rewritten = datasetSource.sqlQuery
|
|
44
|
+
.replace(new RegExp(`\\bFROM\\s+${escapeRegExp(originalTable)}(?=\\s|$|[,;)\\[\\]])`, 'gi'), `FROM ${quotedDashboard}`)
|
|
45
|
+
.replace(new RegExp(`\\bFROM\\s+${escapeRegExp(quotedOriginal)}(?=\\s|$|[,;)\\[\\]])`, 'gi'), `FROM ${quotedDashboard}`);
|
|
46
|
+
return { sqlQuery: rewritten };
|
|
47
|
+
}
|
|
48
|
+
if (!originalTable) {
|
|
49
|
+
// No explicit tableName — replace the first FROM <identifier> with the dashboard table.
|
|
50
|
+
const rewritten = datasetSource.sqlQuery.replace(/\bFROM\s+((?:"[^"]*"(?:\."[^"]*")*)|(?:[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*))(?=\s|$|[,;)[\]])/i, `FROM ${quotedDashboard}`);
|
|
51
|
+
if (rewritten !== datasetSource.sqlQuery) {
|
|
52
|
+
return { sqlQuery: rewritten };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
27
55
|
return datasetSource;
|
|
28
56
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
57
|
+
const resolvedSource = { tableName: baseTableName };
|
|
58
|
+
return resolvedSource;
|
|
59
|
+
}
|
|
60
|
+
function escapeRegExp(str) {
|
|
61
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Strips the catalog/database and schema prefixes from a fully qualified table name.
|
|
65
|
+
* DuckDB queries run in a context where the catalog prefix is not valid,
|
|
66
|
+
* and the default schema is typically "main".
|
|
67
|
+
* E.g. "sqlrooms-cli"."main"."earthquakes" → earthquakes
|
|
68
|
+
* "main"."earthquakes" → earthquakes
|
|
69
|
+
* earthquakes → earthquakes (unchanged)
|
|
70
|
+
*/
|
|
71
|
+
function stripCatalogPrefix(tableName) {
|
|
72
|
+
if (!tableName)
|
|
73
|
+
return tableName;
|
|
74
|
+
// Split on dots that are outside quotes
|
|
75
|
+
const parts = [];
|
|
76
|
+
let current = '';
|
|
77
|
+
let inQuotes = false;
|
|
78
|
+
for (let i = 0; i < tableName.length; i++) {
|
|
79
|
+
const ch = tableName[i];
|
|
80
|
+
if (ch === '"') {
|
|
81
|
+
inQuotes = !inQuotes;
|
|
82
|
+
current += ch;
|
|
83
|
+
}
|
|
84
|
+
else if (ch === '.' && !inQuotes) {
|
|
85
|
+
parts.push(current);
|
|
86
|
+
current = '';
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
current += ch;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
parts.push(current);
|
|
93
|
+
// Use the last part (bare table name), stripping quotes
|
|
94
|
+
const lastPart = parts[parts.length - 1] ?? tableName;
|
|
95
|
+
// Remove surrounding quotes if present
|
|
96
|
+
if (lastPart.startsWith('"') && lastPart.endsWith('"')) {
|
|
97
|
+
return lastPart.slice(1, -1);
|
|
98
|
+
}
|
|
99
|
+
return lastPart;
|
|
32
100
|
}
|
|
33
|
-
export function createDeckMapDashboardDatasetQuery(source, filter) {
|
|
34
|
-
|
|
101
|
+
export function createDeckMapDashboardDatasetQuery(source, filter, options) {
|
|
102
|
+
// Apply USING SAMPLE at the source level so Mosaic filters work on top.
|
|
103
|
+
const sourceExpr = source.sqlQuery
|
|
104
|
+
? `(${source.sqlQuery})`
|
|
105
|
+
: (source.tableName ?? '');
|
|
106
|
+
const sampledSource = options?.sampleRows
|
|
107
|
+
? `(SELECT * FROM ${sourceExpr} USING SAMPLE ${options.sampleRows} ROWS)`
|
|
108
|
+
: sourceExpr;
|
|
109
|
+
const query = source.sqlQuery || options?.sampleRows
|
|
35
110
|
? Query.from({
|
|
36
|
-
__dashboard_map_dataset: verbatim(
|
|
111
|
+
__dashboard_map_dataset: verbatim(sampledSource),
|
|
37
112
|
})
|
|
38
113
|
: Query.from(source.tableName ?? '');
|
|
39
114
|
return query.select('*').where(filter);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardConfig.js","sourceRoot":"","sources":["../src/dashboardConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAI5C,MAAM,CAAC,MAAM,6BAA6B,GAAG,eAAe,CAAC;AAC7D,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAwDxD,MAAM,UAAU,mBAAmB,CACjC,MAA+B;IAE/B,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,MAAM,CAAC,QAAQ;QAChB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAqC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAiD;IAEjD,MAAM,EAAC,KAAK,EAAE,GAAG,MAAM,EAAC,GAAG,OAAO,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,QAAQ,EAAE;QACd,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,KAAK,IAAI,KAAK;QACrB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAA4B;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,OAIpD;IACC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;IAC9C,IAAI,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,SAAS,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa;QACpC,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,EAAC;QAC9C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,MAA+C,EAC/C,MAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ;QAC3B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACT,uBAAuB,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;SAC1D,CAAC;QACJ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAEvC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAe,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAAsC,EACtC,aAGC;IAED,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QAC/D,SAAS;QACT;YACE,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,UAAU;YAChD,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACnD;KACF,CAAC,CACH,CAAC;AACJ,CAAC","sourcesContent":["import {\n type MosaicDashboardEntryType,\n type MosaicDashboardPanelConfigType,\n Query,\n} from '@sqlrooms/mosaic';\nimport {createId} from '@paralleldrive/cuid2';\nimport {verbatim} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport type {DeckJsonMapProps, DeckSqlDatasetInput} from './types';\n\nexport const DECK_MAP_DASHBOARD_PANEL_TYPE = 'deck-json-map';\nexport const DEFAULT_DECK_MAP_MAX_DATA_POINTS = 100_000;\n\nexport type DeckMapDataPolicyOverride = {\n disabled?: boolean;\n maxRows?: number;\n reason?: string;\n};\n\nexport type DeckMapDashboardDatasetConfig = Omit<\n DeckSqlDatasetInput,\n 'sqlQuery'\n> & {\n source?: {tableName?: string; sqlQuery?: string};\n};\n\nexport type DeckMapDashboardInteractionConfig = {\n type: 'point-radius-brush';\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n radiusMeters?: number;\n event?: 'hover' | 'click';\n};\n\nexport type DeckMapDashboardFitToDataConfig = {\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n padding?: number;\n maxZoom?: number;\n};\n\nexport type DeckMapDashboardPanelConfig = {\n spec: DeckJsonMapProps['spec'];\n datasets: Record<string, DeckMapDashboardDatasetConfig>;\n mapStyle?: string;\n mapProps?: Record<string, unknown>;\n showLegends?: boolean;\n interaction?: DeckMapDashboardInteractionConfig;\n fitToData?: DeckMapDashboardFitToDataConfig;\n dataPolicy?: DeckMapDataPolicyOverride;\n settingsOpen?: boolean;\n};\n\nexport type CreateDeckMapDashboardPanelConfigOptions =\n DeckMapDashboardPanelConfig & {\n title?: string;\n };\n\nexport type DeckMapDashboardDatasetClientState = {\n arrowTable?: ArrowTable;\n isLoading: boolean;\n error?: Error;\n client: unknown;\n};\n\nexport function asDeckJsonMapConfig(\n config: Record<string, unknown>,\n): DeckMapDashboardPanelConfig | null {\n if (\n !config.spec ||\n !config.datasets ||\n typeof config.datasets !== 'object' ||\n Array.isArray(config.datasets)\n ) {\n return null;\n }\n\n return config as DeckMapDashboardPanelConfig;\n}\n\nexport function createDeckMapDashboardPanelConfig(\n options: CreateDeckMapDashboardPanelConfigOptions,\n): any {\n const {title, ...config} = options;\n return {\n id: createId(),\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n title: title ?? 'Map',\n config: JSON.parse(JSON.stringify(config)) as Record<string, unknown>,\n };\n}\n\nexport function resolveDeckMapDashboardDatasetSource(options: {\n dashboard: MosaicDashboardEntryType;\n panel: MosaicDashboardPanelConfigType;\n dataset?: DeckMapDashboardDatasetConfig;\n}): {tableName?: string; sqlQuery?: string} | undefined {\n const datasetSource = options.dataset?.source;\n if (datasetSource?.sqlQuery || datasetSource?.tableName) {\n return datasetSource;\n }\n return options.dashboard.selectedTable\n ? {tableName: options.dashboard.selectedTable}\n : undefined;\n}\n\nexport function createDeckMapDashboardDatasetQuery(\n source: {tableName?: string; sqlQuery?: string},\n filter: unknown,\n) {\n const query = source.sqlQuery\n ? Query.from({\n __dashboard_map_dataset: verbatim(`(${source.sqlQuery})`),\n })\n : Query.from(source.tableName ?? '');\n\n return query.select('*').where(filter as never);\n}\n\nexport function createDeckMapDashboardDatasets(\n mapConfig: DeckMapDashboardPanelConfig,\n datasetStates: Record<\n string,\n Pick<DeckMapDashboardDatasetClientState, 'arrowTable'>\n >,\n): DeckJsonMapProps['datasets'] {\n return Object.fromEntries(\n Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => [\n datasetId,\n {\n arrowTable: datasetStates[datasetId]?.arrowTable,\n geometryColumn: dataset.geometryColumn,\n geometryEncodingHint: dataset.geometryEncodingHint,\n },\n ]),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dashboardConfig.js","sourceRoot":"","sources":["../src/dashboardConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type MosaicDashboardEntryType,\n type MosaicDashboardPanelConfigType,\n Query,\n} from '@sqlrooms/mosaic';\nimport {createId} from '@paralleldrive/cuid2';\nimport {verbatim} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport type {DeckJsonMapProps, DeckSqlDatasetInput} from './types';\n\nexport const DECK_MAP_DASHBOARD_PANEL_TYPE = 'deck-json-map';\nexport const DEFAULT_DECK_MAP_MAX_DATA_POINTS = 100_000;\n\nexport type DeckMapDataPolicyOverride = {\n disabled?: boolean;\n maxRows?: number;\n reason?: string;\n};\n\nexport type DeckMapDashboardDatasetConfig = Omit<\n DeckSqlDatasetInput,\n 'sqlQuery'\n> & {\n source?: {tableName?: string; sqlQuery?: string};\n};\n\nexport type DeckMapDashboardInteractionConfig = {\n type: 'point-radius-brush';\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n radiusMeters?: number;\n event?: 'hover' | 'click';\n};\n\nexport type DeckMapDashboardFitToDataConfig = {\n dataset: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n /** Geometry column name (WKB) for computing bounds from geometry directly. */\n geometryColumn?: string;\n /** H3 hex index column for computing bounds from H3 cells. */\n h3Column?: string;\n padding?: number;\n maxZoom?: number;\n};\n\nexport type DeckMapDashboardPanelConfig = {\n spec: DeckJsonMapProps['spec'];\n datasets: Record<string, DeckMapDashboardDatasetConfig>;\n mapStyle?: string;\n mapProps?: Record<string, unknown>;\n showLegends?: boolean;\n interaction?: DeckMapDashboardInteractionConfig;\n fitToData?: DeckMapDashboardFitToDataConfig;\n dataPolicy?: DeckMapDataPolicyOverride;\n settingsOpen?: boolean;\n};\n\nexport type CreateDeckMapDashboardPanelConfigOptions =\n DeckMapDashboardPanelConfig & {\n title?: string;\n };\n\nexport type DeckMapDashboardDatasetClientState = {\n arrowTable?: ArrowTable;\n isLoading: boolean;\n error?: Error;\n client: unknown;\n isSampled?: boolean;\n};\n\nexport function asDeckJsonMapConfig(\n config: Record<string, unknown>,\n): DeckMapDashboardPanelConfig | null {\n if (\n !config.spec ||\n !config.datasets ||\n typeof config.datasets !== 'object' ||\n Array.isArray(config.datasets)\n ) {\n return null;\n }\n\n return config as DeckMapDashboardPanelConfig;\n}\n\nexport function createDeckMapDashboardPanelConfig(\n options: CreateDeckMapDashboardPanelConfigOptions,\n): any {\n const {title, ...config} = options;\n return {\n id: createId(),\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n title: title ?? 'Map',\n config: JSON.parse(JSON.stringify(config)) as Record<string, unknown>,\n };\n}\n\nexport function resolveDeckMapDashboardDatasetSource(options: {\n dashboard: MosaicDashboardEntryType;\n panel: MosaicDashboardPanelConfigType;\n dataset?: DeckMapDashboardDatasetConfig;\n fitToData?: DeckMapDashboardFitToDataConfig;\n}): {tableName?: string; sqlQuery?: string} | undefined {\n const datasetSource = options.dataset?.source;\n const dashboardTable = stripCatalogPrefix(options.dashboard.selectedTable);\n\n // The dashboard's selected table always takes precedence as the data source.\n // When the user switches the table in the selector, all panels update.\n const baseTableName = dashboardTable || datasetSource?.tableName;\n if (!baseTableName && !datasetSource?.sqlQuery) {\n return undefined;\n }\n\n // If the dataset has a sqlQuery and the dashboard table differs from the\n // original source table, rewrite the FROM clause to use the new table.\n if (datasetSource?.sqlQuery && dashboardTable) {\n const originalTable = datasetSource.tableName;\n const quote = (id: string) => `\"${id.replace(/\"/g, '\"\"')}\"`;\n const quotedDashboard = dashboardTable.includes('\"')\n ? dashboardTable\n : dashboardTable.split('.').map(quote).join('.');\n\n if (originalTable && dashboardTable !== originalTable) {\n const quotedOriginal = originalTable.split('.').map(quote).join('.');\n const rewritten = datasetSource.sqlQuery\n .replace(\n new RegExp(\n `\\\\bFROM\\\\s+${escapeRegExp(originalTable)}(?=\\\\s|$|[,;)\\\\[\\\\]])`,\n 'gi',\n ),\n `FROM ${quotedDashboard}`,\n )\n .replace(\n new RegExp(\n `\\\\bFROM\\\\s+${escapeRegExp(quotedOriginal)}(?=\\\\s|$|[,;)\\\\[\\\\]])`,\n 'gi',\n ),\n `FROM ${quotedDashboard}`,\n );\n return {sqlQuery: rewritten};\n }\n\n if (!originalTable) {\n // No explicit tableName — replace the first FROM <identifier> with the dashboard table.\n const rewritten = datasetSource.sqlQuery.replace(\n /\\bFROM\\s+((?:\"[^\"]*\"(?:\\.\"[^\"]*\")*)|(?:[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*))(?=\\s|$|[,;)[\\]])/i,\n `FROM ${quotedDashboard}`,\n );\n if (rewritten !== datasetSource.sqlQuery) {\n return {sqlQuery: rewritten};\n }\n }\n\n return datasetSource;\n }\n\n const resolvedSource = {tableName: baseTableName!};\n\n return resolvedSource;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Strips the catalog/database and schema prefixes from a fully qualified table name.\n * DuckDB queries run in a context where the catalog prefix is not valid,\n * and the default schema is typically \"main\".\n * E.g. \"sqlrooms-cli\".\"main\".\"earthquakes\" → earthquakes\n * \"main\".\"earthquakes\" → earthquakes\n * earthquakes → earthquakes (unchanged)\n */\nfunction stripCatalogPrefix(tableName: string | undefined): string | undefined {\n if (!tableName) return tableName;\n // Split on dots that are outside quotes\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n for (let i = 0; i < tableName.length; i++) {\n const ch = tableName[i];\n if (ch === '\"') {\n inQuotes = !inQuotes;\n current += ch;\n } else if (ch === '.' && !inQuotes) {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n parts.push(current);\n\n // Use the last part (bare table name), stripping quotes\n const lastPart = parts[parts.length - 1] ?? tableName;\n // Remove surrounding quotes if present\n if (lastPart.startsWith('\"') && lastPart.endsWith('\"')) {\n return lastPart.slice(1, -1);\n }\n return lastPart;\n}\n\nexport function createDeckMapDashboardDatasetQuery(\n source: {tableName?: string; sqlQuery?: string},\n filter: unknown,\n options?: {sampleRows?: number},\n) {\n // Apply USING SAMPLE at the source level so Mosaic filters work on top.\n const sourceExpr = source.sqlQuery\n ? `(${source.sqlQuery})`\n : (source.tableName ?? '');\n\n const sampledSource = options?.sampleRows\n ? `(SELECT * FROM ${sourceExpr} USING SAMPLE ${options.sampleRows} ROWS)`\n : sourceExpr;\n\n const query =\n source.sqlQuery || options?.sampleRows\n ? Query.from({\n __dashboard_map_dataset: verbatim(sampledSource),\n })\n : Query.from(source.tableName ?? '');\n\n return query.select('*').where(filter as never);\n}\n\nexport function createDeckMapDashboardDatasets(\n mapConfig: DeckMapDashboardPanelConfig,\n datasetStates: Record<\n string,\n Pick<DeckMapDashboardDatasetClientState, 'arrowTable'>\n >,\n): DeckJsonMapProps['datasets'] {\n return Object.fromEntries(\n Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => [\n datasetId,\n {\n arrowTable: datasetStates[datasetId]?.arrowTable,\n geometryColumn: dataset.geometryColumn,\n geometryEncodingHint: dataset.geometryEncodingHint,\n },\n ]),\n );\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { ColorScaleLegend } from '@sqlrooms/color-scales';
|
|
6
6
|
export { createDeckJsonSpecFromDatasets } from './createDeckJsonSpecFromDatasets';
|
|
7
|
-
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
7
|
+
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
8
8
|
export type { DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
|
|
9
9
|
export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
|
|
10
|
+
export { DeckMapBlockRenderer, ensureDeckMapBlockState, type DeckMapBlockRendererProps, } from './block';
|
|
10
11
|
export { createDeckMapDashboardSliceOptions } from './dashboardIntegration';
|
|
11
12
|
export { asDeckJsonMapConfig, createDeckMapDashboardDatasetQuery, createDeckMapDashboardDatasets, createDeckMapDashboardPanelConfig, DEFAULT_DECK_MAP_MAX_DATA_POINTS, DECK_MAP_DASHBOARD_PANEL_TYPE, resolveDeckMapDashboardDatasetSource, } from './dashboardConfig';
|
|
12
13
|
export { getDeckMapDataPolicy } from './mapDataPolicy';
|
|
13
|
-
export { createDeckMapDashboardConfigForTable, createDeckMapDashboardPanelConfigForTable, findDeckMapLongitudeLatitudeColumns, findLongitudeLatitudeColumns, normalizeDeckMapFillColor, quoteDeckMapSqlIdentifier, quoteDeckMapSqlTableReference, regenerateMapConfigForTable, } from './mapConfigUtils';
|
|
14
|
+
export { createDeckMapDashboardConfigForTable, createDeckMapDashboardPanelConfigForTable, findDeckMapLongitudeLatitudeColumns, findGeometryColumn, findLongitudeLatitudeColumns, normalizeDeckMapFillColor, quoteDeckMapSqlIdentifier, quoteDeckMapSqlTableReference, regenerateMapConfigForTable, } from './mapConfigUtils';
|
|
14
15
|
export type { DeckMapConfigColumn, DeckMapFillColor, DeckMapTableReference, } from './mapConfigUtils';
|
|
15
16
|
export type { DeckMapDashboardFitToDataConfig, CreateDeckMapDashboardPanelConfigOptions, DeckMapDashboardDatasetClientState, DeckMapDashboardDatasetConfig, DeckMapDataPolicyOverride, DeckMapDashboardInteractionConfig, DeckMapDashboardPanelConfig, } from './dashboardConfig';
|
|
16
17
|
export { DeckJsonMap } from './DeckJsonMap';
|
|
@@ -20,5 +21,5 @@ export { prepareDeckDataset } from './prepare/prepareDeckDataset';
|
|
|
20
21
|
export type { ColorLegendConfig, ColorScaleConfig } from '@sqlrooms/color-scales';
|
|
21
22
|
export type { GeometryEncodingHint, PreparedDeckDataset, PreparedGeoArrowLayerData, ResolvedGeometryColumn, ResolvedGeometryEncoding, } from './prepare/types';
|
|
22
23
|
export { isArrowTableDatasetInput, isSqlDatasetInput } from './types';
|
|
23
|
-
export type { CreateDeckJsonSpecFromDatasetsOptions, DeckArrowTableDatasetInput, DeckAutoLayerType, DeckDatasetInput, DeckJsonMapProps, DeckJsonSpecDatasetHint, DeckSqlDatasetInput, DeckTable, PreparedDeckDatasetState, } from './types';
|
|
24
|
+
export type { CreateDeckJsonSpecFromDatasetsOptions, DeckArrowTableDatasetInput, DeckAutoLayerType, DeckDatasetInput, DeckJsonMapHandle, DeckJsonMapProps, DeckJsonSpecDatasetHint, DeckSqlDatasetInput, DeckTable, PreparedDeckDatasetState, } from './types';
|
|
24
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAChF,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,yCAAyC,EACzC,mCAAmC,EACnC,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,kCAAkC,EAClC,6BAA6B,EAC7B,yBAAyB,EACzB,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,IAAI,wBAAwB,EAChD,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAEhE,YAAY,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAChF,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,wBAAwB,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC;AACpE,YAAY,EACV,qCAAqC,EACrC,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,SAAS,EACT,wBAAwB,GACzB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAChF,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,yCAAyC,EACzC,mCAAmC,EACnC,kBAAkB,EAClB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,kCAAkC,EAClC,6BAA6B,EAC7B,yBAAyB,EACzB,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,IAAI,wBAAwB,EAChD,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAEhE,YAAY,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAChF,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,wBAAwB,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC;AACpE,YAAY,EACV,qCAAqC,EACrC,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,SAAS,EACT,wBAAwB,GACzB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { ColorScaleLegend } from '@sqlrooms/color-scales';
|
|
6
6
|
export { createDeckJsonSpecFromDatasets } from './createDeckJsonSpecFromDatasets';
|
|
7
|
-
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
7
|
+
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
8
8
|
export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
|
|
9
|
+
export { DeckMapBlockRenderer, ensureDeckMapBlockState, } from './block';
|
|
9
10
|
export { createDeckMapDashboardSliceOptions } from './dashboardIntegration';
|
|
10
11
|
export { asDeckJsonMapConfig, createDeckMapDashboardDatasetQuery, createDeckMapDashboardDatasets, createDeckMapDashboardPanelConfig, DEFAULT_DECK_MAP_MAX_DATA_POINTS, DECK_MAP_DASHBOARD_PANEL_TYPE, resolveDeckMapDashboardDatasetSource, } from './dashboardConfig';
|
|
11
12
|
export { getDeckMapDataPolicy } from './mapDataPolicy';
|
|
12
|
-
export { createDeckMapDashboardConfigForTable, createDeckMapDashboardPanelConfigForTable, findDeckMapLongitudeLatitudeColumns, findLongitudeLatitudeColumns, normalizeDeckMapFillColor, quoteDeckMapSqlIdentifier, quoteDeckMapSqlTableReference, regenerateMapConfigForTable, } from './mapConfigUtils';
|
|
13
|
+
export { createDeckMapDashboardConfigForTable, createDeckMapDashboardPanelConfigForTable, findDeckMapLongitudeLatitudeColumns, findGeometryColumn, findLongitudeLatitudeColumns, normalizeDeckMapFillColor, quoteDeckMapSqlIdentifier, quoteDeckMapSqlTableReference, regenerateMapConfigForTable, } from './mapConfigUtils';
|
|
13
14
|
export { DeckJsonMap } from './DeckJsonMap';
|
|
14
15
|
export { ColorScaleFunction, GeometryEncodingHint as DeckGeometryEncodingHint, DeckJsonMapLayerSpec, DeckJsonMapSpec, LayerBindingConfig, LayerBindingProps, } from './DeckJsonMapSpec';
|
|
15
16
|
export { createDeckJsonConfiguration } from './json/createDeckJsonConfiguration';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAChF,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AAMd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,yCAAyC,EACzC,mCAAmC,EACnC,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAe1B,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,IAAI,wBAAwB,EAChD,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAUhE,OAAO,EAAC,wBAAwB,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {ColorScaleLegend} from '@sqlrooms/color-scales';\nexport {createDeckJsonSpecFromDatasets} from './createDeckJsonSpecFromDatasets';\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport {\n asDeckJsonMapConfig,\n createDeckMapDashboardDatasetQuery,\n createDeckMapDashboardDatasets,\n createDeckMapDashboardPanelConfig,\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n resolveDeckMapDashboardDatasetSource,\n} from './dashboardConfig';\nexport {getDeckMapDataPolicy} from './mapDataPolicy';\nexport {\n createDeckMapDashboardConfigForTable,\n createDeckMapDashboardPanelConfigForTable,\n findDeckMapLongitudeLatitudeColumns,\n findLongitudeLatitudeColumns,\n normalizeDeckMapFillColor,\n quoteDeckMapSqlIdentifier,\n quoteDeckMapSqlTableReference,\n regenerateMapConfigForTable,\n} from './mapConfigUtils';\nexport type {\n DeckMapConfigColumn,\n DeckMapFillColor,\n DeckMapTableReference,\n} from './mapConfigUtils';\nexport type {\n DeckMapDashboardFitToDataConfig,\n CreateDeckMapDashboardPanelConfigOptions,\n DeckMapDashboardDatasetClientState,\n DeckMapDashboardDatasetConfig,\n DeckMapDataPolicyOverride,\n DeckMapDashboardInteractionConfig,\n DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nexport {DeckJsonMap} from './DeckJsonMap';\nexport {\n ColorScaleFunction,\n GeometryEncodingHint as DeckGeometryEncodingHint,\n DeckJsonMapLayerSpec,\n DeckJsonMapSpec,\n LayerBindingConfig,\n LayerBindingProps,\n} from './DeckJsonMapSpec';\nexport {createDeckJsonConfiguration} from './json/createDeckJsonConfiguration';\nexport {prepareDeckDataset} from './prepare/prepareDeckDataset';\n\nexport type {ColorLegendConfig, ColorScaleConfig} from '@sqlrooms/color-scales';\nexport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n ResolvedGeometryEncoding,\n} from './prepare/types';\nexport {isArrowTableDatasetInput, isSqlDatasetInput} from './types';\nexport type {\n CreateDeckJsonSpecFromDatasetsOptions,\n DeckArrowTableDatasetInput,\n DeckAutoLayerType,\n DeckDatasetInput,\n DeckJsonMapProps,\n DeckJsonSpecDatasetHint,\n DeckSqlDatasetInput,\n DeckTable,\n PreparedDeckDatasetState,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAChF,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AAMd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,yCAAyC,EACzC,mCAAmC,EACnC,kBAAkB,EAClB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAe1B,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,IAAI,wBAAwB,EAChD,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAUhE,OAAO,EAAC,wBAAwB,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {ColorScaleLegend} from '@sqlrooms/color-scales';\nexport {createDeckJsonSpecFromDatasets} from './createDeckJsonSpecFromDatasets';\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n createDeckMapPanelFromNativeConfig,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {\n DeckMapBlockRenderer,\n ensureDeckMapBlockState,\n type DeckMapBlockRendererProps,\n} from './block';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport {\n asDeckJsonMapConfig,\n createDeckMapDashboardDatasetQuery,\n createDeckMapDashboardDatasets,\n createDeckMapDashboardPanelConfig,\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n resolveDeckMapDashboardDatasetSource,\n} from './dashboardConfig';\nexport {getDeckMapDataPolicy} from './mapDataPolicy';\nexport {\n createDeckMapDashboardConfigForTable,\n createDeckMapDashboardPanelConfigForTable,\n findDeckMapLongitudeLatitudeColumns,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n normalizeDeckMapFillColor,\n quoteDeckMapSqlIdentifier,\n quoteDeckMapSqlTableReference,\n regenerateMapConfigForTable,\n} from './mapConfigUtils';\nexport type {\n DeckMapConfigColumn,\n DeckMapFillColor,\n DeckMapTableReference,\n} from './mapConfigUtils';\nexport type {\n DeckMapDashboardFitToDataConfig,\n CreateDeckMapDashboardPanelConfigOptions,\n DeckMapDashboardDatasetClientState,\n DeckMapDashboardDatasetConfig,\n DeckMapDataPolicyOverride,\n DeckMapDashboardInteractionConfig,\n DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nexport {DeckJsonMap} from './DeckJsonMap';\nexport {\n ColorScaleFunction,\n GeometryEncodingHint as DeckGeometryEncodingHint,\n DeckJsonMapLayerSpec,\n DeckJsonMapSpec,\n LayerBindingConfig,\n LayerBindingProps,\n} from './DeckJsonMapSpec';\nexport {createDeckJsonConfiguration} from './json/createDeckJsonConfiguration';\nexport {prepareDeckDataset} from './prepare/prepareDeckDataset';\n\nexport type {ColorLegendConfig, ColorScaleConfig} from '@sqlrooms/color-scales';\nexport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n ResolvedGeometryEncoding,\n} from './prepare/types';\nexport {isArrowTableDatasetInput, isSqlDatasetInput} from './types';\nexport type {\n CreateDeckJsonSpecFromDatasetsOptions,\n DeckArrowTableDatasetInput,\n DeckAutoLayerType,\n DeckDatasetInput,\n DeckJsonMapHandle,\n DeckJsonMapProps,\n DeckJsonSpecDatasetHint,\n DeckSqlDatasetInput,\n DeckTable,\n PreparedDeckDatasetState,\n} from './types';\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as arrow from 'apache-arrow';
|
|
2
|
+
/**
|
|
3
|
+
* Auto-aggregates per-waypoint rows into LineString vectors for PathLayer.
|
|
4
|
+
* Detects group-by ID and order columns by naming patterns, groups rows,
|
|
5
|
+
* and builds a GeoArrow List<FixedSizeList<2, Float64>> linestring vector.
|
|
6
|
+
*
|
|
7
|
+
* Also builds a timestamps list column if a timestamp-like column is found,
|
|
8
|
+
* suitable for GeoArrowTripsLayer.
|
|
9
|
+
*/
|
|
10
|
+
export declare function tryAggregateWaypointsToLineStrings(table: arrow.Table): {
|
|
11
|
+
table: arrow.Table;
|
|
12
|
+
geometryVector: arrow.Vector;
|
|
13
|
+
} | null;
|
|
14
|
+
//# sourceMappingURL=aggregateWaypoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregateWaypoints.d.ts","sourceRoot":"","sources":["../../src/json/aggregateWaypoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AA0DtC;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,KAAK,CAAC,KAAK,GACjB;IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAA;CAAC,GAAG,IAAI,CAgJ3D"}
|