@sqlrooms/deck 0.29.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE.md +10 -0
  2. package/README.md +654 -0
  3. package/dist/BlockMapSettings.d.ts +3 -0
  4. package/dist/BlockMapSettings.d.ts.map +1 -0
  5. package/dist/BlockMapSettings.js +57 -0
  6. package/dist/BlockMapSettings.js.map +1 -0
  7. package/dist/DashboardMapSettings.d.ts +7 -0
  8. package/dist/DashboardMapSettings.d.ts.map +1 -0
  9. package/dist/DashboardMapSettings.js +52 -0
  10. package/dist/DashboardMapSettings.js.map +1 -0
  11. package/dist/DeckJsonMap.d.ts +4 -0
  12. package/dist/DeckJsonMap.d.ts.map +1 -0
  13. package/dist/DeckJsonMap.js +370 -0
  14. package/dist/DeckJsonMap.js.map +1 -0
  15. package/dist/DeckJsonMapSpec.d.ts +7617 -0
  16. package/dist/DeckJsonMapSpec.d.ts.map +1 -0
  17. package/dist/DeckJsonMapSpec.js +82 -0
  18. package/dist/DeckJsonMapSpec.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +28 -0
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -0
  21. package/dist/DeckMapDefaultStylesProvider.js +23 -0
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -0
  23. package/dist/DeckMapSurface.d.ts +39 -0
  24. package/dist/DeckMapSurface.d.ts.map +1 -0
  25. package/dist/DeckMapSurface.js +137 -0
  26. package/dist/DeckMapSurface.js.map +1 -0
  27. package/dist/DeckMapsSlice.d.ts +99 -0
  28. package/dist/DeckMapsSlice.d.ts.map +1 -0
  29. package/dist/DeckMapsSlice.js +89 -0
  30. package/dist/DeckMapsSlice.js.map +1 -0
  31. package/dist/MapSettings.d.ts +16 -0
  32. package/dist/MapSettings.d.ts.map +1 -0
  33. package/dist/MapSettings.js +292 -0
  34. package/dist/MapSettings.js.map +1 -0
  35. package/dist/MapSettingsControls.d.ts +40 -0
  36. package/dist/MapSettingsControls.d.ts.map +1 -0
  37. package/dist/MapSettingsControls.js +54 -0
  38. package/dist/MapSettingsControls.js.map +1 -0
  39. package/dist/ai.d.ts +261 -0
  40. package/dist/ai.d.ts.map +1 -0
  41. package/dist/ai.js +392 -0
  42. package/dist/ai.js.map +1 -0
  43. package/dist/block.d.ts +21 -0
  44. package/dist/block.d.ts.map +1 -0
  45. package/dist/block.js +105 -0
  46. package/dist/block.js.map +1 -0
  47. package/dist/blockDocumentRegistration.d.ts +45 -0
  48. package/dist/blockDocumentRegistration.d.ts.map +1 -0
  49. package/dist/blockDocumentRegistration.js +68 -0
  50. package/dist/blockDocumentRegistration.js.map +1 -0
  51. package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
  52. package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
  53. package/dist/createDeckJsonSpecFromDatasets.js +85 -0
  54. package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
  55. package/dist/createOrUpdateDeckMapResource.d.ts +81 -0
  56. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -0
  57. package/dist/createOrUpdateDeckMapResource.js +82 -0
  58. package/dist/createOrUpdateDeckMapResource.js.map +1 -0
  59. package/dist/dashboard.d.ts +6 -0
  60. package/dist/dashboard.d.ts.map +1 -0
  61. package/dist/dashboard.js +337 -0
  62. package/dist/dashboard.js.map +1 -0
  63. package/dist/dashboardConfig.d.ts +25 -0
  64. package/dist/dashboardConfig.d.ts.map +1 -0
  65. package/dist/dashboardConfig.js +82 -0
  66. package/dist/dashboardConfig.js.map +1 -0
  67. package/dist/dashboardIntegration.d.ts +3 -0
  68. package/dist/dashboardIntegration.d.ts.map +1 -0
  69. package/dist/dashboardIntegration.js +16 -0
  70. package/dist/dashboardIntegration.js.map +1 -0
  71. package/dist/datasetSourceUtils.d.ts +16 -0
  72. package/dist/datasetSourceUtils.d.ts.map +1 -0
  73. package/dist/datasetSourceUtils.js +25 -0
  74. package/dist/datasetSourceUtils.js.map +1 -0
  75. package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
  76. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
  77. package/dist/datasets/PreparedDatasetStore.js +268 -0
  78. package/dist/datasets/PreparedDatasetStore.js.map +1 -0
  79. package/dist/datasets/helpers.d.ts +57 -0
  80. package/dist/datasets/helpers.d.ts.map +1 -0
  81. package/dist/datasets/helpers.js +155 -0
  82. package/dist/datasets/helpers.js.map +1 -0
  83. package/dist/datasets/normalizeDatasets.d.ts +11 -0
  84. package/dist/datasets/normalizeDatasets.d.ts.map +1 -0
  85. package/dist/datasets/normalizeDatasets.js +50 -0
  86. package/dist/datasets/normalizeDatasets.js.map +1 -0
  87. package/dist/datasets/tableAdapter.d.ts +11 -0
  88. package/dist/datasets/tableAdapter.d.ts.map +1 -0
  89. package/dist/datasets/tableAdapter.js +11 -0
  90. package/dist/datasets/tableAdapter.js.map +1 -0
  91. package/dist/datasets/tableDatasetSql.d.ts +16 -0
  92. package/dist/datasets/tableDatasetSql.d.ts.map +1 -0
  93. package/dist/datasets/tableDatasetSql.js +49 -0
  94. package/dist/datasets/tableDatasetSql.js.map +1 -0
  95. package/dist/datasets/types.d.ts +40 -0
  96. package/dist/datasets/types.d.ts.map +1 -0
  97. package/dist/datasets/types.js +2 -0
  98. package/dist/datasets/types.js.map +1 -0
  99. package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
  100. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
  101. package/dist/datasets/usePreparedDatasetStates.js +59 -0
  102. package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
  103. package/dist/index.d.ts +34 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +27 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/json/aggregateWaypoints.d.ts +14 -0
  108. package/dist/json/aggregateWaypoints.d.ts.map +1 -0
  109. package/dist/json/aggregateWaypoints.js +190 -0
  110. package/dist/json/aggregateWaypoints.js.map +1 -0
  111. package/dist/json/colorScaleFunction.d.ts +27 -0
  112. package/dist/json/colorScaleFunction.d.ts.map +1 -0
  113. package/dist/json/colorScaleFunction.js +46 -0
  114. package/dist/json/colorScaleFunction.js.map +1 -0
  115. package/dist/json/compileColorScale.d.ts +12 -0
  116. package/dist/json/compileColorScale.d.ts.map +1 -0
  117. package/dist/json/compileColorScale.js +125 -0
  118. package/dist/json/compileColorScale.js.map +1 -0
  119. package/dist/json/compileGeoArrowAccessor.d.ts +18 -0
  120. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -0
  121. package/dist/json/compileGeoArrowAccessor.js +129 -0
  122. package/dist/json/compileGeoArrowAccessor.js.map +1 -0
  123. package/dist/json/createDeckJsonConfiguration.d.ts +9 -0
  124. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -0
  125. package/dist/json/createDeckJsonConfiguration.js +315 -0
  126. package/dist/json/createDeckJsonConfiguration.js.map +1 -0
  127. package/dist/json/defaultClasses.d.ts +12 -0
  128. package/dist/json/defaultClasses.d.ts.map +1 -0
  129. package/dist/json/defaultClasses.js +35 -0
  130. package/dist/json/defaultClasses.js.map +1 -0
  131. package/dist/json/extractColorScaleLegends.d.ts +8 -0
  132. package/dist/json/extractColorScaleLegends.d.ts.map +1 -0
  133. package/dist/json/extractColorScaleLegends.js +86 -0
  134. package/dist/json/extractColorScaleLegends.js.map +1 -0
  135. package/dist/json/heatmapDefaults.d.ts +8 -0
  136. package/dist/json/heatmapDefaults.d.ts.map +1 -0
  137. package/dist/json/heatmapDefaults.js +14 -0
  138. package/dist/json/heatmapDefaults.js.map +1 -0
  139. package/dist/json/layerCompatibility.d.ts +21 -0
  140. package/dist/json/layerCompatibility.d.ts.map +1 -0
  141. package/dist/json/layerCompatibility.js +168 -0
  142. package/dist/json/layerCompatibility.js.map +1 -0
  143. package/dist/json/layerConfig.d.ts +14 -0
  144. package/dist/json/layerConfig.d.ts.map +1 -0
  145. package/dist/json/layerConfig.js +54 -0
  146. package/dist/json/layerConfig.js.map +1 -0
  147. package/dist/json/layers/DeckColumnLayer.d.ts +10 -0
  148. package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
  149. package/dist/json/layers/DeckColumnLayer.js +26 -0
  150. package/dist/json/layers/DeckColumnLayer.js.map +1 -0
  151. package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
  152. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
  153. package/dist/json/layers/DeckH3HexagonLayer.js +118 -0
  154. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
  155. package/dist/json/layers/DeckTripsLayer.d.ts +46 -0
  156. package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
  157. package/dist/json/layers/DeckTripsLayer.js +170 -0
  158. package/dist/json/layers/DeckTripsLayer.js.map +1 -0
  159. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts +20 -0
  160. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts.map +1 -0
  161. package/dist/json/layers/createTableToRecordBatchAdapter.js +81 -0
  162. package/dist/json/layers/createTableToRecordBatchAdapter.js.map +1 -0
  163. package/dist/json/layers/index.d.ts +5 -0
  164. package/dist/json/layers/index.d.ts.map +1 -0
  165. package/dist/json/layers/index.js +5 -0
  166. package/dist/json/layers/index.js.map +1 -0
  167. package/dist/json/rewriteGeoArrowAccessors.d.ts +7 -0
  168. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -0
  169. package/dist/json/rewriteGeoArrowAccessors.js +55 -0
  170. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -0
  171. package/dist/mapAiConfig.d.ts +111 -0
  172. package/dist/mapAiConfig.d.ts.map +1 -0
  173. package/dist/mapAiConfig.js +69 -0
  174. package/dist/mapAiConfig.js.map +1 -0
  175. package/dist/mapConfig.d.ts +73 -0
  176. package/dist/mapConfig.d.ts.map +1 -0
  177. package/dist/mapConfig.js +47 -0
  178. package/dist/mapConfig.js.map +1 -0
  179. package/dist/mapConfigUtils.d.ts +111 -0
  180. package/dist/mapConfigUtils.d.ts.map +1 -0
  181. package/dist/mapConfigUtils.js +502 -0
  182. package/dist/mapConfigUtils.js.map +1 -0
  183. package/dist/mapDataPolicy.d.ts +9 -0
  184. package/dist/mapDataPolicy.d.ts.map +1 -0
  185. package/dist/mapDataPolicy.js +25 -0
  186. package/dist/mapDataPolicy.js.map +1 -0
  187. package/dist/mapFit.d.ts +62 -0
  188. package/dist/mapFit.d.ts.map +1 -0
  189. package/dist/mapFit.js +325 -0
  190. package/dist/mapFit.js.map +1 -0
  191. package/dist/mapLayerConfigUtils.d.ts +54 -0
  192. package/dist/mapLayerConfigUtils.d.ts.map +1 -0
  193. package/dist/mapLayerConfigUtils.js +296 -0
  194. package/dist/mapLayerConfigUtils.js.map +1 -0
  195. package/dist/mapResourceAuthoring.d.ts +40 -0
  196. package/dist/mapResourceAuthoring.d.ts.map +1 -0
  197. package/dist/mapResourceAuthoring.js +266 -0
  198. package/dist/mapResourceAuthoring.js.map +1 -0
  199. package/dist/mosaic.d.ts +9 -0
  200. package/dist/mosaic.d.ts.map +1 -0
  201. package/dist/mosaic.js +8 -0
  202. package/dist/mosaic.js.map +1 -0
  203. package/dist/prepare/detectGeometryColumn.d.ts +19 -0
  204. package/dist/prepare/detectGeometryColumn.d.ts.map +1 -0
  205. package/dist/prepare/detectGeometryColumn.js +126 -0
  206. package/dist/prepare/detectGeometryColumn.js.map +1 -0
  207. package/dist/prepare/geoarrow.d.ts +18 -0
  208. package/dist/prepare/geoarrow.d.ts.map +1 -0
  209. package/dist/prepare/geoarrow.js +114 -0
  210. package/dist/prepare/geoarrow.js.map +1 -0
  211. package/dist/prepare/geometryDecoder.d.ts +8 -0
  212. package/dist/prepare/geometryDecoder.d.ts.map +1 -0
  213. package/dist/prepare/geometryDecoder.js +2 -0
  214. package/dist/prepare/geometryDecoder.js.map +1 -0
  215. package/dist/prepare/prepareDeckDataset.d.ts +57 -0
  216. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -0
  217. package/dist/prepare/prepareDeckDataset.js +112 -0
  218. package/dist/prepare/prepareDeckDataset.js.map +1 -0
  219. package/dist/prepare/toGeoJsonBinary.d.ts +9 -0
  220. package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -0
  221. package/dist/prepare/toGeoJsonBinary.js +26 -0
  222. package/dist/prepare/toGeoJsonBinary.js.map +1 -0
  223. package/dist/prepare/types.d.ts +25 -0
  224. package/dist/prepare/types.d.ts.map +1 -0
  225. package/dist/prepare/types.js +2 -0
  226. package/dist/prepare/types.js.map +1 -0
  227. package/dist/prepare/wkbDecoder.d.ts +3 -0
  228. package/dist/prepare/wkbDecoder.d.ts.map +1 -0
  229. package/dist/prepare/wkbDecoder.js +419 -0
  230. package/dist/prepare/wkbDecoder.js.map +1 -0
  231. package/dist/prepare/wkbParser.d.ts +24 -0
  232. package/dist/prepare/wkbParser.d.ts.map +1 -0
  233. package/dist/prepare/wkbParser.js +139 -0
  234. package/dist/prepare/wkbParser.js.map +1 -0
  235. package/dist/types.d.ts +92 -0
  236. package/dist/types.d.ts.map +1 -0
  237. package/dist/types.js +11 -0
  238. package/dist/types.js.map +1 -0
  239. package/dist/useDeckMapDatasetSchema.d.ts +33 -0
  240. package/dist/useDeckMapDatasetSchema.d.ts.map +1 -0
  241. package/dist/useDeckMapDatasetSchema.js +138 -0
  242. package/dist/useDeckMapDatasetSchema.js.map +1 -0
  243. package/dist/useDeckMapDatasets.d.ts +17 -0
  244. package/dist/useDeckMapDatasets.d.ts.map +1 -0
  245. package/dist/useDeckMapDatasets.js +69 -0
  246. package/dist/useDeckMapDatasets.js.map +1 -0
  247. package/dist/useDeckMapFitToBounds.d.ts +31 -0
  248. package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
  249. package/dist/useDeckMapFitToBounds.js +58 -0
  250. package/dist/useDeckMapFitToBounds.js.map +1 -0
  251. package/package.json +98 -0
@@ -0,0 +1,337 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { column, sql, useMosaicClient, useStoreWithMosaicDashboard, usePanelClientRegistration, } from '@sqlrooms/mosaic';
3
+ import { Button, Tooltip, TooltipContent, TooltipTrigger } from '@sqlrooms/ui';
4
+ import { AlertTriangleIcon, FocusIcon, MapIcon } from 'lucide-react';
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import { DeckJsonMap } from './DeckJsonMap';
7
+ import { asDeckJsonMapConfig, createDeckMapDashboardPanelConfig, createDeckMapDashboardDatasetQuery, createDeckMapDashboardDatasets, DECK_MAP_DASHBOARD_PANEL_TYPE, DEFAULT_DECK_MAP_MAX_DATA_POINTS, isDeckMapDashboardSqlDatasetSource, isDeckMapDashboardTableDatasetSource, resolveDeckMapDashboardDatasetSource, } from './dashboardConfig';
8
+ import { useDeckMapFitToBounds, emitDeckMapDashboardFitRequest, createDeckMapBoundsQuery, } from './useDeckMapFitToBounds';
9
+ export { createDeckMapBoundsQuery };
10
+ import { useDeckMapDatasets } from './useDeckMapDatasets';
11
+ import { DeckMapDashboardSettings } from './DashboardMapSettings';
12
+ import { createDeckMapDashboardPanelConfigForTable, findGeometryColumn, findLongitudeLatitudeColumns, } from './mapConfigUtils';
13
+ import { isDeckMapGeneratedColumn } from './useDeckMapDatasetSchema';
14
+ function createEmptyDeckMapDashboardPanelConfig(title = 'Map') {
15
+ return createDeckMapDashboardPanelConfig({
16
+ title,
17
+ spec: {
18
+ initialViewState: { longitude: 0, latitude: 20, zoom: 1.5 },
19
+ layers: [],
20
+ },
21
+ datasets: {},
22
+ });
23
+ }
24
+ /**
25
+ * Extracts column names from common DuckDB "column not found" error messages
26
+ * and layer geometry incompatibility errors.
27
+ * Returns the column names if detected, or null for unrecognized errors.
28
+ */
29
+ function parseMissingColumnsFromError(message) {
30
+ // "Referenced column "X" not found in FROM clause!" — may appear multiple times
31
+ const refMatches = [
32
+ ...message.matchAll(/Referenced column "([^"]+)" not found/gi),
33
+ ];
34
+ if (refMatches.length > 0)
35
+ return refMatches.map((m) => m[1]);
36
+ // "Binder Error: Column "X" does not exist" or "column X not found"
37
+ const colMatch = message.match(/(?:Column|column)\s+"([^"]+)"\s+(?:does not exist|not found)/i);
38
+ if (colMatch)
39
+ return [colMatch[1]];
40
+ // "Geometry column "X" was not found"
41
+ const geomNotFound = message.match(/Geometry column "([^"]+)" was not found/i);
42
+ if (geomNotFound)
43
+ return [geomNotFound[1]];
44
+ // "Layer ... references unknown column "X" for getTimestamps."
45
+ const unknownColumn = message.match(/references unknown column "([^"]+)"/i);
46
+ if (unknownColumn)
47
+ return [unknownColumn[1]];
48
+ return null;
49
+ }
50
+ /**
51
+ * Detects geometry type mismatch errors (e.g. polygon layer on point data).
52
+ */
53
+ function parseGeometryMismatchError(message) {
54
+ const match = message.match(/requires (\w+) geometry .+ but only (\w+) coordinates were found/i);
55
+ if (match)
56
+ return { required: match[1], found: match[2] };
57
+ return null;
58
+ }
59
+ /**
60
+ * Detects columns referenced in layer config that are missing from the loaded dataset.
61
+ */
62
+ function detectMissingColumns(mapConfig, datasetStates) {
63
+ if (!mapConfig?.spec)
64
+ return [];
65
+ const missing = [];
66
+ const spec = mapConfig.spec;
67
+ const layers = Array.isArray(spec.layers) ? spec.layers : [];
68
+ for (const layer of layers) {
69
+ if (!layer || typeof layer !== 'object')
70
+ continue;
71
+ const layerObj = layer;
72
+ const binding = layerObj._sqlroomsBinding;
73
+ const datasetId = binding?.dataset;
74
+ const arrowTable = datasetId
75
+ ? datasetStates[datasetId]?.arrowTable
76
+ : undefined;
77
+ if (!arrowTable)
78
+ continue;
79
+ const fieldNames = new Set(arrowTable.schema.fields.map((f) => f.name.toLowerCase()));
80
+ const check = (col) => {
81
+ if (col && !fieldNames.has(col.toLowerCase())) {
82
+ missing.push(col);
83
+ }
84
+ };
85
+ for (const bindingColumn of [
86
+ binding?.geometryColumn,
87
+ binding?.sourceGeometryColumn,
88
+ binding?.targetGeometryColumn,
89
+ binding?.timestampColumn,
90
+ binding?.hexagonColumn,
91
+ ]) {
92
+ check(bindingColumn);
93
+ }
94
+ // Check @@= accessors
95
+ for (const [propName, propValue] of Object.entries(layerObj)) {
96
+ // Skip elevation references when extrusion is disabled
97
+ if (propName === 'getElevation' && !layerObj.extruded)
98
+ continue;
99
+ if (typeof propValue === 'string' && propValue.startsWith('@@=')) {
100
+ const expression = propValue.slice(3).trim();
101
+ const identifiers = expression.match(/\b[A-Za-z_$][\w$]*\b/g);
102
+ if (identifiers) {
103
+ for (const id of identifiers) {
104
+ check(id);
105
+ }
106
+ }
107
+ }
108
+ // Check @@function colorScale/scale field references
109
+ if (propValue &&
110
+ typeof propValue === 'object' &&
111
+ '@@function' in propValue) {
112
+ const fn = propValue;
113
+ if (typeof fn.field === 'string') {
114
+ check(fn.field);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return [...new Set(missing)];
120
+ }
121
+ function DeckMapRuntimeIssuePanel({ issue }) {
122
+ if (issue.kind === 'sql-error' || issue.kind === 'render-error') {
123
+ const missingColumns = parseMissingColumnsFromError(issue.message);
124
+ if (missingColumns) {
125
+ const generatedMissingColumns = missingColumns.filter(isDeckMapGeneratedColumn);
126
+ if (generatedMissingColumns.length > 0) {
127
+ return (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center p-4", children: [_jsx("div", { className: "mb-2 text-center font-semibold", children: "The visualization can't be displayed" }), _jsxs("div", { className: "text-center text-sm", children: [_jsxs("span", { children: ["The dataset transform did not produce required map output columns:", ' '] }), generatedMissingColumns.map((col, idx) => (_jsxs("span", { children: [_jsx("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", children: col }), ' '] }, idx)))] })] }));
128
+ }
129
+ return (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center p-4", children: [_jsx("div", { className: "mb-2 text-center font-semibold", children: "The visualization can't be displayed" }), _jsxs("div", { className: "text-center text-sm", children: [_jsx("span", { children: "Selected columns are missing in the dataset: " }), missingColumns.map((col, idx) => (_jsxs("span", { children: [_jsx("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", children: col }), ' '] }, idx)))] })] }));
130
+ }
131
+ const geomMismatch = parseGeometryMismatchError(issue.message);
132
+ if (geomMismatch) {
133
+ return (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center p-4", children: [_jsx("div", { className: "mb-2 text-center font-semibold", children: "The visualization can't be displayed" }), _jsxs("div", { className: "text-center text-sm", children: ["This layer requires ", geomMismatch.required, " geometry, but the current dataset only has ", geomMismatch.found, " coordinates."] })] }));
134
+ }
135
+ }
136
+ const title = issue.kind === 'too-much-data'
137
+ ? 'Too much data'
138
+ : issue.kind === 'sql-error'
139
+ ? 'Map query failed'
140
+ : 'Unable to display map';
141
+ return (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center p-4", children: [_jsx("div", { className: "mb-2 text-center font-semibold", children: title }), _jsx("div", { className: "text-center text-sm whitespace-pre-wrap", children: issue.message })] }));
142
+ }
143
+ function DeckMapDashboardDatasetClient({ dashboard, dataset, datasetId, fitToData, panel, onDatasetState, runtimeIssueContext, runtimeIssueReporter, selectionName, maxRows, }) {
144
+ const datasetFitToData = useMemo(() => (fitToData?.dataset === datasetId ? fitToData : undefined), [datasetId, fitToData]);
145
+ const source = useMemo(() => resolveDeckMapDashboardDatasetSource({
146
+ dashboard,
147
+ panel,
148
+ dataset,
149
+ fitToData: datasetFitToData,
150
+ }), [dashboard, dataset, datasetFitToData, panel]);
151
+ const query = useCallback((filter) => source
152
+ ? createDeckMapDashboardDatasetQuery(source, filter, {
153
+ sampleRows: maxRows,
154
+ })
155
+ : createDeckMapDashboardDatasetQuery({ tableName: '__missing_dashboard_map_dataset__' }, filter, { sampleRows: maxRows }), [maxRows, source]);
156
+ const queryError = useCallback((err) => {
157
+ onDatasetState(datasetId, {
158
+ arrowTable: undefined,
159
+ error: err,
160
+ isLoading: false,
161
+ client: null,
162
+ isSampled: false,
163
+ });
164
+ }, [datasetId, onDatasetState]);
165
+ const sourceKey = isDeckMapDashboardTableDatasetSource(source)
166
+ ? source.tableName
167
+ : isDeckMapDashboardSqlDatasetSource(source)
168
+ ? ''
169
+ : (dashboard.selectedTable ?? '');
170
+ const sourceQueryKey = isDeckMapDashboardSqlDatasetSource(source)
171
+ ? source.sqlQuery
172
+ : isDeckMapDashboardTableDatasetSource(source)
173
+ ? (source.transformSql ?? '')
174
+ : '';
175
+ const { data, error, isLoading, client } = useMosaicClient({
176
+ id: `${panel.id}:${datasetId}:${sourceKey}:${sourceQueryKey}:${maxRows}`,
177
+ selectionName,
178
+ query,
179
+ queryError,
180
+ enabled: Boolean(source),
181
+ runtimeIssueContext,
182
+ runtimeIssueReporter,
183
+ });
184
+ // Register client for panel reset button
185
+ usePanelClientRegistration(dashboard.id, panel.id, client ? [client] : []);
186
+ const isSampled = Boolean(data && data.numRows >= maxRows);
187
+ useEffect(() => {
188
+ onDatasetState(datasetId, {
189
+ arrowTable: data ?? undefined,
190
+ error,
191
+ isLoading,
192
+ client,
193
+ isSampled,
194
+ });
195
+ return () => {
196
+ onDatasetState(datasetId, undefined);
197
+ };
198
+ }, [client, data, datasetId, error, isLoading, isSampled, onDatasetState]);
199
+ return null;
200
+ }
201
+ function createPointRadiusPredicate(interaction, coordinate) {
202
+ const [longitude, latitude] = coordinate;
203
+ const radiusMeters = interaction.radiusMeters ?? 500;
204
+ const metersPerDegree = 111_320;
205
+ const cosLatitude = Math.cos(latitude * (Math.PI / 180));
206
+ const radiusSquared = radiusMeters * radiusMeters;
207
+ return sql `(
208
+ pow((${column(interaction.longitudeColumn)} - ${longitude}) * ${cosLatitude * metersPerDegree}, 2) +
209
+ pow((${column(interaction.latitudeColumn)} - ${latitude}) * ${metersPerDegree}, 2)
210
+ ) < ${radiusSquared}`;
211
+ }
212
+ function getCoordinate(info) {
213
+ return info.coordinate && info.coordinate.length >= 2
214
+ ? [info.coordinate[0], info.coordinate[1]]
215
+ : undefined;
216
+ }
217
+ function isPickedMapFeature(info) {
218
+ return Boolean(info.picked || info.object || (info.index ?? -1) >= 0);
219
+ }
220
+ function DeckMapDashboardHeaderActions({ panel, }) {
221
+ const mapConfig = asDeckJsonMapConfig(panel.config);
222
+ const canFitView = Boolean(mapConfig?.fitToData);
223
+ const fitViewLabel = canFitView
224
+ ? 'Fit map view to data'
225
+ : 'Fit view unavailable for this map';
226
+ return (_jsx("div", { className: "flex items-center gap-0.5", children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "inline-flex", tabIndex: canFitView ? undefined : 0, "aria-label": canFitView ? undefined : fitViewLabel, children: _jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6", "aria-label": fitViewLabel, disabled: !canFitView, onClick: () => emitDeckMapDashboardFitRequest(panel.id), children: _jsx(FocusIcon, { className: "h-3.5 w-3.5" }) }) }) }), _jsx(TooltipContent, { children: fitViewLabel })] }) }));
227
+ }
228
+ function DeckMapDashboardRenderer({ dashboard, dashboardId, panel, selectionName, }) {
229
+ const mapConfig = asDeckJsonMapConfig(panel.config);
230
+ const isCustomMode = mapConfig?.configMode === 'custom';
231
+ const getSelection = useStoreWithMosaicDashboard((state) => state.mosaic.getSelection);
232
+ const issue = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.getPanelIssue(dashboardId, panel.id));
233
+ const clearPanelIssue = useStoreWithMosaicDashboard((state) => state.mosaicDashboard.clearPanelIssue);
234
+ // Clear runtime issues when the active table or panel config changes so
235
+ // the map can recover (e.g., after switching tables or AI updating the map).
236
+ useEffect(() => {
237
+ clearPanelIssue(dashboardId, panel.id);
238
+ }, [
239
+ clearPanelIssue,
240
+ dashboard.selectedTable,
241
+ dashboardId,
242
+ panel.config,
243
+ panel.id,
244
+ ]);
245
+ const selection = useMemo(() => getSelection(selectionName, 'crossfilter'), [getSelection, selectionName]);
246
+ const [container, setContainer] = useState(null);
247
+ const deckMapRef = useRef(null);
248
+ const [sampledDismissed, setSampledDismissed] = useState(false);
249
+ const { datasetStates, handleDatasetState, runtimeIssueContext, runtimeIssueReporter, handleRenderingError, } = useDeckMapDatasets({ dashboardId, panel });
250
+ const { fitToData } = useDeckMapFitToBounds({
251
+ panelId: panel.id,
252
+ dashboard,
253
+ panel,
254
+ container,
255
+ deckMapRef,
256
+ });
257
+ const handleBrushEvent = useCallback((info) => {
258
+ const interaction = mapConfig?.interaction;
259
+ if (!interaction) {
260
+ return;
261
+ }
262
+ const client = datasetStates[interaction.dataset]?.client;
263
+ if (!client) {
264
+ return;
265
+ }
266
+ const coordinate = getCoordinate(info);
267
+ if (!coordinate) {
268
+ return;
269
+ }
270
+ if (interaction.event !== 'click' && !isPickedMapFeature(info)) {
271
+ selection.reset(selection.clauses.filter((clause) => clause.source === client));
272
+ return;
273
+ }
274
+ const radiusMeters = interaction.radiusMeters ?? 500;
275
+ selection.update({
276
+ source: client,
277
+ clients: new Set([client]),
278
+ value: [coordinate[0], coordinate[1], radiusMeters],
279
+ predicate: createPointRadiusPredicate(interaction, coordinate),
280
+ });
281
+ }, [datasetStates, mapConfig?.interaction, selection]);
282
+ const datasetError = useMemo(() => {
283
+ for (const state of Object.values(datasetStates)) {
284
+ if (state.error)
285
+ return state.error;
286
+ }
287
+ return undefined;
288
+ }, [datasetStates]);
289
+ const missingColumns = useMemo(() => detectMissingColumns(mapConfig ?? undefined, datasetStates), [mapConfig, datasetStates]);
290
+ const maxRows = mapConfig?.dataPolicy?.maxRows ?? DEFAULT_DECK_MAP_MAX_DATA_POINTS;
291
+ const mapContent = !mapConfig ? (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-sm", children: "Invalid map panel config." })) : Object.entries(mapConfig.datasets).length === 0 ? (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-sm", children: "Map panels require at least one dataset." })) : (_jsxs(_Fragment, { children: [Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => (_jsx(DeckMapDashboardDatasetClient, { dashboard: dashboard, dataset: dataset, datasetId: datasetId, fitToData: fitToData ?? undefined, panel: panel, onDatasetState: handleDatasetState, runtimeIssueContext: runtimeIssueContext, runtimeIssueReporter: runtimeIssueReporter, selectionName: selectionName, maxRows: maxRows }, datasetId))), issue ? (_jsx(DeckMapRuntimeIssuePanel, { issue: issue })) : datasetError ? (_jsx(DeckMapRuntimeIssuePanel, { issue: {
292
+ kind: 'sql-error',
293
+ panelId: panel.id,
294
+ chartType: DECK_MAP_DASHBOARD_PANEL_TYPE,
295
+ message: datasetError.message,
296
+ recoverable: true,
297
+ } })) : (_jsxs("div", { ref: setContainer, className: "relative h-full w-full", children: [Object.values(datasetStates).some((s) => s.isSampled) &&
298
+ !sampledDismissed && (_jsxs("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", children: [_jsxs("span", { children: ["Data sampled to ", maxRows.toLocaleString(), " rows"] }), _jsx("button", { className: "text-muted-foreground/60 hover:text-foreground -mr-0.5 ml-0.5", onClick: () => setSampledDismissed(true), children: "\u00D7" })] })), missingColumns.length > 0 && !isCustomMode && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: `absolute left-2 z-10 flex h-5 w-5 items-center justify-center ${Object.values(datasetStates).some((s) => s.isSampled) &&
299
+ !sampledDismissed
300
+ ? 'top-9'
301
+ : 'top-2'}`, children: _jsx(AlertTriangleIcon, { className: "h-4 w-4 text-amber-500 drop-shadow-sm" }) }) }), _jsxs(TooltipContent, { side: "right", children: [_jsx("p", { className: "text-xs font-medium", children: "Missing columns:" }), _jsx("p", { className: "text-xs", children: missingColumns.join(', ') })] })] })), _jsx(DeckJsonMap, { ref: deckMapRef, className: "h-full w-full px-0.5 pb-0.5", spec: mapConfig.spec, datasets: mapConfig
302
+ ? createDeckMapDashboardDatasets(mapConfig, datasetStates)
303
+ : {}, mapStyle: mapConfig.mapStyle, mapProps: mapConfig.mapProps, showLegends: mapConfig.showLegends !== false, onRenderingError: handleRenderingError, deckProps: {
304
+ controller: true,
305
+ ...(mapConfig.interaction
306
+ ? (mapConfig.interaction.event ?? 'hover') === 'click'
307
+ ? { onClick: handleBrushEvent }
308
+ : { onHover: handleBrushEvent }
309
+ : {}),
310
+ } })] }))] }));
311
+ return mapContent;
312
+ }
313
+ export const deckMapDashboardPanelRenderer = {
314
+ component: DeckMapDashboardRenderer,
315
+ headerActions: DeckMapDashboardHeaderActions,
316
+ icon: MapIcon,
317
+ settings: DeckMapDashboardSettings,
318
+ };
319
+ export const deckMapDashboardAddPanelAction = {
320
+ type: DECK_MAP_DASHBOARD_PANEL_TYPE,
321
+ label: 'Map',
322
+ icon: MapIcon,
323
+ createPanel: ({ selectedTable }) => {
324
+ if (selectedTable &&
325
+ (findLongitudeLatitudeColumns(selectedTable) ??
326
+ findGeometryColumn(selectedTable))) {
327
+ return createDeckMapDashboardPanelConfigForTable({
328
+ title: `${selectedTable.tableName} map`,
329
+ tableName: selectedTable.tableName,
330
+ columns: selectedTable.columns,
331
+ tableReference: selectedTable.table,
332
+ });
333
+ }
334
+ return createEmptyDeckMapDashboardPanelConfig(selectedTable ? `${selectedTable.tableName} map` : 'Map');
335
+ },
336
+ };
337
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
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 {AlertTriangleIcon, FocusIcon, MapIcon} from 'lucide-react';\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {DeckJsonMap} from './DeckJsonMap';\nimport type {DeckJsonMapHandle} from './types';\nimport {\n asDeckJsonMapConfig,\n createDeckMapDashboardPanelConfig,\n createDeckMapDashboardDatasetQuery,\n createDeckMapDashboardDatasets,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n isDeckMapDashboardSqlDatasetSource,\n isDeckMapDashboardTableDatasetSource,\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 {DeckMapDashboardSettings} from './DashboardMapSettings';\nimport {\n createDeckMapDashboardPanelConfigForTable,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n} from './mapConfigUtils';\nimport {isDeckMapGeneratedColumn} from './useDeckMapDatasetSchema';\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 // \"Layer ... references unknown column \"X\" for getTimestamps.\"\n const unknownColumn = message.match(/references unknown column \"([^\"]+)\"/i);\n if (unknownColumn) return [unknownColumn[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 for (const bindingColumn of [\n binding?.geometryColumn,\n binding?.sourceGeometryColumn,\n binding?.targetGeometryColumn,\n binding?.timestampColumn,\n binding?.hexagonColumn,\n ]) {\n check(bindingColumn as string | undefined);\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 const expression = propValue.slice(3).trim();\n const identifiers = expression.match(/\\b[A-Za-z_$][\\w$]*\\b/g);\n if (identifiers) {\n for (const id of identifiers) {\n check(id);\n }\n }\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 const generatedMissingColumns = missingColumns.filter(\n isDeckMapGeneratedColumn,\n );\n if (generatedMissingColumns.length > 0) {\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&apos;t be displayed\n </div>\n <div className=\"text-center text-sm\">\n <span>\n The dataset transform did not produce required map output\n columns:{' '}\n </span>\n {generatedMissingColumns.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 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&apos;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&apos;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 = isDeckMapDashboardTableDatasetSource(source)\n ? source.tableName\n : isDeckMapDashboardSqlDatasetSource(source)\n ? ''\n : (dashboard.selectedTable ?? '');\n const sourceQueryKey = isDeckMapDashboardSqlDatasetSource(source)\n ? source.sqlQuery\n : isDeckMapDashboardTableDatasetSource(source)\n ? (source.transformSql ?? '')\n : '';\n const {data, error, isLoading, client} = useMosaicClient({\n id: `${panel.id}:${datasetId}:${sourceKey}:${sourceQueryKey}:${maxRows}`,\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 panel,\n}: MosaicDashboardPanelRendererProps) {\n const mapConfig = asDeckJsonMapConfig(panel.config);\n const canFitView = Boolean(mapConfig?.fitToData);\n const fitViewLabel = canFitView\n ? 'Fit map view to data'\n : 'Fit view unavailable for this map';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"inline-flex\"\n tabIndex={canFitView ? undefined : 0}\n aria-label={canFitView ? undefined : fitViewLabel}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={fitViewLabel}\n disabled={!canFitView}\n onClick={() => emitDeckMapDashboardFitRequest(panel.id)}\n >\n <FocusIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{fitViewLabel}</TooltipContent>\n </Tooltip>\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 isCustomMode = mapConfig?.configMode === 'custom';\n const getSelection = useStoreWithMosaicDashboard(\n (state) => state.mosaic.getSelection,\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 selection = useMemo<Selection>(\n () => getSelection(selectionName, 'crossfilter'),\n [getSelection, selectionName],\n );\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const deckMapRef = useRef<DeckJsonMapHandle>(null);\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 const {fitToData} = useDeckMapFitToBounds({\n panelId: panel.id,\n dashboard,\n panel,\n container,\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 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 maxRows =\n mapConfig?.dataPolicy?.maxRows ?? DEFAULT_DECK_MAP_MAX_DATA_POINTS;\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={maxRows}\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={setContainer} 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>Data sampled to {maxRows.toLocaleString()} rows</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 && !isCustomMode && (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\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 >\n <AlertTriangleIcon className=\"h-4 w-4 text-amber-500 drop-shadow-sm\" />\n </span>\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 px-0.5 pb-0.5\"\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 !== false}\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 mapContent;\n}\n\nexport const deckMapDashboardPanelRenderer: MosaicDashboardPanelRenderer = {\n component: DeckMapDashboardRenderer,\n headerActions: DeckMapDashboardHeaderActions,\n icon: MapIcon,\n settings: DeckMapDashboardSettings,\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"]}
@@ -0,0 +1,25 @@
1
+ import { type MosaicDashboardEntryType, type MosaicDashboardPanelConfigType } from '@sqlrooms/mosaic';
2
+ import type { Table as ArrowTable } from 'apache-arrow';
3
+ import { type DeckMapDashboardDatasetConfig, type DeckMapDashboardDatasetSource, type DeckMapDashboardFitToDataConfig, type DeckMapDashboardPanelConfig } from './mapConfig';
4
+ export { asDeckJsonMapConfig, createDeckMapDashboardPanelConfig, DECK_MAP_DASHBOARD_PANEL_TYPE, DEFAULT_DECK_MAP_MAX_DATA_POINTS, isDeckMapDashboardSqlDatasetSource, isDeckMapDashboardTableDatasetSource, } from './mapConfig';
5
+ export type { CreateDeckMapDashboardPanelConfigOptions, DeckMapDashboardDatasetConfig, DeckMapDashboardDatasetSource, DeckMapDashboardFitToDataConfig, DeckMapDashboardInteractionConfig, DeckMapDashboardPanelConfig, } from './mapConfig';
6
+ export type { DeckJsonMapProps } from './types';
7
+ import type { DeckJsonMapProps } from './types';
8
+ export type DeckMapDashboardDatasetClientState = {
9
+ arrowTable?: ArrowTable;
10
+ isLoading: boolean;
11
+ error?: Error;
12
+ client: unknown;
13
+ isSampled?: boolean;
14
+ };
15
+ export declare function resolveDeckMapDashboardDatasetSource(options: {
16
+ dashboard: MosaicDashboardEntryType;
17
+ panel: MosaicDashboardPanelConfigType;
18
+ dataset?: DeckMapDashboardDatasetConfig;
19
+ fitToData?: DeckMapDashboardFitToDataConfig;
20
+ }): DeckMapDashboardDatasetSource | undefined;
21
+ export declare function createDeckMapDashboardDatasetQuery(source: DeckMapDashboardDatasetSource, filter: unknown, options?: {
22
+ sampleRows?: number;
23
+ }): import("@uwdata/mosaic-sql").SelectQuery;
24
+ export declare function createDeckMapDashboardDatasets(mapConfig: DeckMapDashboardPanelConfig, datasetStates: Record<string, Pick<DeckMapDashboardDatasetClientState, 'arrowTable'>>): DeckJsonMapProps['datasets'];
25
+ //# sourceMappingURL=dashboardConfig.d.ts.map
@@ -0,0 +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;AAQ1B,OAAO,KAAK,EAAC,KAAK,IAAI,UAAU,EAAC,MAAM,cAAc,CAAC;AAEtD,OAAO,EAGL,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,iCAAiC,EACjC,6BAA6B,EAC7B,gCAAgC,EAChC,kCAAkC,EAClC,oCAAoC,GACrC,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,wCAAwC,EACxC,6BAA6B,EAC7B,6BAA6B,EAC7B,+BAA+B,EAC/B,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,kCAAkC,GAAG;IAC/C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,SAAS,EAAE,wBAAwB,CAAC;IACpC,KAAK,EAAE,8BAA8B,CAAC;IACtC,OAAO,CAAC,EAAE,6BAA6B,CAAC;IACxC,SAAS,CAAC,EAAE,+BAA+B,CAAC;CAC7C,GAAG,6BAA6B,GAAG,SAAS,CA6B5C;AAeD,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,6BAA6B,EACrC,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAC,4CA2BhC;AAUD,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,2BAA2B,EACtC,aAAa,EAAE,MAAM,CACnB,MAAM,EACN,IAAI,CAAC,kCAAkC,EAAE,YAAY,CAAC,CACvD,GACA,gBAAgB,CAAC,UAAU,CAAC,CAW9B"}
@@ -0,0 +1,82 @@
1
+ import { Query, } from '@sqlrooms/mosaic';
2
+ import { getTableIdentity, makeQualifiedTableName, parseQualifiedSqlIdentifier, quoteParsedRawSqlTableReference, } from '@sqlrooms/duckdb';
3
+ import { verbatim } from '@uwdata/mosaic-sql';
4
+ import { createDeckTableDatasetSql } from './datasets/tableDatasetSql';
5
+ import { isDeckMapDashboardSqlDatasetSource, isDeckMapDashboardTableDatasetSource, } from './mapConfig';
6
+ export { asDeckJsonMapConfig, createDeckMapDashboardPanelConfig, DECK_MAP_DASHBOARD_PANEL_TYPE, DEFAULT_DECK_MAP_MAX_DATA_POINTS, isDeckMapDashboardSqlDatasetSource, isDeckMapDashboardTableDatasetSource, } from './mapConfig';
7
+ export function resolveDeckMapDashboardDatasetSource(options) {
8
+ const datasetSource = options.dataset?.source;
9
+ const dashboardTable = stripCatalogPrefix(options.dashboard.selectedTable);
10
+ // The dashboard's selected table always takes precedence as the data source.
11
+ // When the user switches the table in the selector, structured table-backed
12
+ // datasets update while literal SQL remains pinned to its authored query.
13
+ if (isDeckMapDashboardSqlDatasetSource(datasetSource)) {
14
+ return datasetSource;
15
+ }
16
+ const baseTableName = dashboardTable ||
17
+ (isDeckMapDashboardTableDatasetSource(datasetSource)
18
+ ? datasetSource.tableName
19
+ : undefined);
20
+ if (!baseTableName) {
21
+ return undefined;
22
+ }
23
+ const resolvedSource = {
24
+ tableName: baseTableName,
25
+ ...(isDeckMapDashboardTableDatasetSource(datasetSource) &&
26
+ datasetSource.transformSql
27
+ ? { transformSql: datasetSource.transformSql }
28
+ : {}),
29
+ };
30
+ return resolvedSource;
31
+ }
32
+ function stripCatalogPrefix(tableName) {
33
+ const parsed = parseQualifiedSqlIdentifier(tableName);
34
+ if (!parsed?.database || !parsed.schema || !parsed.table) {
35
+ return tableName;
36
+ }
37
+ return getTableIdentity(makeQualifiedTableName({
38
+ schema: parsed.schema,
39
+ table: parsed.table,
40
+ }));
41
+ }
42
+ export function createDeckMapDashboardDatasetQuery(source, filter, options) {
43
+ const isSqlSource = isDeckMapDashboardSqlDatasetSource(source);
44
+ const isTableSource = isDeckMapDashboardTableDatasetSource(source);
45
+ const isDirectTableSource = isTableSource && !source.transformSql;
46
+ const tableReference = isDirectTableSource
47
+ ? getDeckMapDatasetSourceTableReference(source.tableName)
48
+ : '';
49
+ // Apply USING SAMPLE at the source level so Mosaic filters work on top.
50
+ const sourceExpr = isSqlSource
51
+ ? `(${source.sqlQuery})`
52
+ : isDirectTableSource
53
+ ? tableReference
54
+ : `(${createDeckTableDatasetSql(source)})`;
55
+ const sampledSource = options?.sampleRows
56
+ ? `(SELECT * FROM ${sourceExpr} USING SAMPLE ${options.sampleRows} ROWS)`
57
+ : sourceExpr;
58
+ const query = isSqlSource || !isDirectTableSource || options?.sampleRows
59
+ ? Query.from({
60
+ __dashboard_map_dataset: verbatim(sampledSource),
61
+ })
62
+ : Query.from({ __dashboard_map_dataset: verbatim(tableReference) });
63
+ return query.select('*').where(filter);
64
+ }
65
+ function getDeckMapDatasetSourceTableReference(tableName) {
66
+ const tableReference = quoteParsedRawSqlTableReference(tableName);
67
+ if (!tableReference) {
68
+ throw new Error('Deck map dataset query requires a valid table source.');
69
+ }
70
+ return tableReference;
71
+ }
72
+ export function createDeckMapDashboardDatasets(mapConfig, datasetStates) {
73
+ return Object.fromEntries(Object.entries(mapConfig.datasets).map(([datasetId, dataset]) => [
74
+ datasetId,
75
+ {
76
+ arrowTable: datasetStates[datasetId]?.arrowTable,
77
+ geometryColumn: dataset.geometryColumn,
78
+ geometryEncodingHint: dataset.geometryEncodingHint,
79
+ },
80
+ ]));
81
+ }
82
+ //# sourceMappingURL=dashboardConfig.js.map
@@ -0,0 +1 @@
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 {\n getTableIdentity,\n makeQualifiedTableName,\n parseQualifiedSqlIdentifier,\n quoteParsedRawSqlTableReference,\n} from '@sqlrooms/duckdb';\nimport {verbatim} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {createDeckTableDatasetSql} from './datasets/tableDatasetSql';\nimport {\n isDeckMapDashboardSqlDatasetSource,\n isDeckMapDashboardTableDatasetSource,\n type DeckMapDashboardDatasetConfig,\n type DeckMapDashboardDatasetSource,\n type DeckMapDashboardFitToDataConfig,\n type DeckMapDashboardPanelConfig,\n} from './mapConfig';\nexport {\n asDeckJsonMapConfig,\n createDeckMapDashboardPanelConfig,\n DECK_MAP_DASHBOARD_PANEL_TYPE,\n DEFAULT_DECK_MAP_MAX_DATA_POINTS,\n isDeckMapDashboardSqlDatasetSource,\n isDeckMapDashboardTableDatasetSource,\n} from './mapConfig';\nexport type {\n CreateDeckMapDashboardPanelConfigOptions,\n DeckMapDashboardDatasetConfig,\n DeckMapDashboardDatasetSource,\n DeckMapDashboardFitToDataConfig,\n DeckMapDashboardInteractionConfig,\n DeckMapDashboardPanelConfig,\n} from './mapConfig';\nexport type {DeckJsonMapProps} from './types';\nimport type {DeckJsonMapProps} from './types';\n\nexport type DeckMapDashboardDatasetClientState = {\n arrowTable?: ArrowTable;\n isLoading: boolean;\n error?: Error;\n client: unknown;\n isSampled?: boolean;\n};\n\nexport function resolveDeckMapDashboardDatasetSource(options: {\n dashboard: MosaicDashboardEntryType;\n panel: MosaicDashboardPanelConfigType;\n dataset?: DeckMapDashboardDatasetConfig;\n fitToData?: DeckMapDashboardFitToDataConfig;\n}): DeckMapDashboardDatasetSource | 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, structured table-backed\n // datasets update while literal SQL remains pinned to its authored query.\n if (isDeckMapDashboardSqlDatasetSource(datasetSource)) {\n return datasetSource;\n }\n\n const baseTableName =\n dashboardTable ||\n (isDeckMapDashboardTableDatasetSource(datasetSource)\n ? datasetSource.tableName\n : undefined);\n if (!baseTableName) {\n return undefined;\n }\n\n const resolvedSource: DeckMapDashboardDatasetSource = {\n tableName: baseTableName,\n ...(isDeckMapDashboardTableDatasetSource(datasetSource) &&\n datasetSource.transformSql\n ? {transformSql: datasetSource.transformSql}\n : {}),\n };\n\n return resolvedSource;\n}\n\nfunction stripCatalogPrefix(tableName: string | undefined) {\n const parsed = parseQualifiedSqlIdentifier(tableName);\n if (!parsed?.database || !parsed.schema || !parsed.table) {\n return tableName;\n }\n return getTableIdentity(\n makeQualifiedTableName({\n schema: parsed.schema,\n table: parsed.table,\n }),\n );\n}\n\nexport function createDeckMapDashboardDatasetQuery(\n source: DeckMapDashboardDatasetSource,\n filter: unknown,\n options?: {sampleRows?: number},\n) {\n const isSqlSource = isDeckMapDashboardSqlDatasetSource(source);\n const isTableSource = isDeckMapDashboardTableDatasetSource(source);\n const isDirectTableSource = isTableSource && !source.transformSql;\n const tableReference = isDirectTableSource\n ? getDeckMapDatasetSourceTableReference(source.tableName)\n : '';\n // Apply USING SAMPLE at the source level so Mosaic filters work on top.\n const sourceExpr: string = isSqlSource\n ? `(${source.sqlQuery})`\n : isDirectTableSource\n ? tableReference\n : `(${createDeckTableDatasetSql(source)})`;\n\n const sampledSource = options?.sampleRows\n ? `(SELECT * FROM ${sourceExpr} USING SAMPLE ${options.sampleRows} ROWS)`\n : sourceExpr;\n\n const query =\n isSqlSource || !isDirectTableSource || options?.sampleRows\n ? Query.from({\n __dashboard_map_dataset: verbatim(sampledSource),\n })\n : Query.from({__dashboard_map_dataset: verbatim(tableReference)});\n\n return query.select('*').where(filter as never);\n}\n\nfunction getDeckMapDatasetSourceTableReference(tableName: string | undefined) {\n const tableReference = quoteParsedRawSqlTableReference(tableName);\n if (!tableReference) {\n throw new Error('Deck map dataset query requires a valid table source.');\n }\n return tableReference;\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"]}
@@ -0,0 +1,3 @@
1
+ import { type CreateMosaicDashboardSliceProps } from '@sqlrooms/mosaic';
2
+ export declare function createDeckMapDashboardSliceOptions(): CreateMosaicDashboardSliceProps;
3
+ //# sourceMappingURL=dashboardIntegration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardIntegration.d.ts","sourceRoot":"","sources":["../src/dashboardIntegration.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,+BAA+B,EACrC,MAAM,kBAAkB,CAAC;AAO1B,wBAAgB,kCAAkC,IAAI,+BAA+B,CAWpF"}
@@ -0,0 +1,16 @@
1
+ import { createDefaultChartTypes, createDefaultMosaicDashboardPanelRenderers, defaultAddPanelActions, } from '@sqlrooms/mosaic';
2
+ import { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
3
+ import { DECK_MAP_DASHBOARD_PANEL_TYPE } from './dashboardConfig';
4
+ export function createDeckMapDashboardSliceOptions() {
5
+ return {
6
+ panelRenderers: createDefaultMosaicDashboardPanelRenderers({
7
+ [DECK_MAP_DASHBOARD_PANEL_TYPE]: deckMapDashboardPanelRenderer,
8
+ }),
9
+ addPanelActions: [
10
+ ...defaultAddPanelActions,
11
+ deckMapDashboardAddPanelAction,
12
+ ],
13
+ chartTypes: createDefaultChartTypes(),
14
+ };
15
+ }
16
+ //# sourceMappingURL=dashboardIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardIntegration.js","sourceRoot":"","sources":["../src/dashboardIntegration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,0CAA0C,EAC1C,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,6BAA6B,EAAC,MAAM,mBAAmB,CAAC;AAEhE,MAAM,UAAU,kCAAkC;IAChD,OAAO;QACL,cAAc,EAAE,0CAA0C,CAAC;YACzD,CAAC,6BAA6B,CAAC,EAAE,6BAA6B;SAC/D,CAAC;QACF,eAAe,EAAE;YACf,GAAG,sBAAsB;YACzB,8BAA8B;SAC/B;QACD,UAAU,EAAE,uBAAuB,EAAE;KACtC,CAAC;AACJ,CAAC","sourcesContent":["import {\n createDefaultChartTypes,\n createDefaultMosaicDashboardPanelRenderers,\n defaultAddPanelActions,\n type CreateMosaicDashboardSliceProps,\n} from '@sqlrooms/mosaic';\nimport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nimport {DECK_MAP_DASHBOARD_PANEL_TYPE} from './dashboardConfig';\n\nexport function createDeckMapDashboardSliceOptions(): CreateMosaicDashboardSliceProps {\n return {\n panelRenderers: createDefaultMosaicDashboardPanelRenderers({\n [DECK_MAP_DASHBOARD_PANEL_TYPE]: deckMapDashboardPanelRenderer,\n }),\n addPanelActions: [\n ...defaultAddPanelActions,\n deckMapDashboardAddPanelAction,\n ],\n chartTypes: createDefaultChartTypes(),\n };\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Minimal Deck map config shape needed to inspect dataset sources.
3
+ */
4
+ export type DeckMapDatasetSourceConfig = {
5
+ datasets?: Record<string, unknown>;
6
+ };
7
+ /**
8
+ * Returns the first dataset `source.tableName` found in a Deck map config.
9
+ */
10
+ export declare function getFirstDatasetSourceTableName(config: DeckMapDatasetSourceConfig): string | undefined;
11
+ /**
12
+ * Returns true when any dataset source is a literal `sqlQuery` without a
13
+ * structured `tableName` (so selected-table switching cannot apply).
14
+ */
15
+ export declare function hasSqlOnlyDatasetSource(config: DeckMapDatasetSourceConfig): boolean;
16
+ //# sourceMappingURL=datasetSourceUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetSourceUtils.d.ts","sourceRoot":"","sources":["../src/datasetSourceUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,0BAA0B,GACjC,MAAM,GAAG,SAAS,CAapB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAWT"}