diff --git a/app/src/app/(dashboard)/[id]/edit/page.tsx b/app/src/app/(dashboard)/[id]/edit/page.tsx index 816455e6..4840bd76 100644 --- a/app/src/app/(dashboard)/[id]/edit/page.tsx +++ b/app/src/app/(dashboard)/[id]/edit/page.tsx @@ -341,19 +341,19 @@ export default function DashboardEditorPage({ { shortcut: "Cmd+E", handler: () => { - router.push("/" + id); + // Route through unsaved-changes guard (same as the Back button) + if (requestNavigation("/" + id)) router.push("/" + id); }, }, { - shortcut: "Cmd+N", + shortcut: "Cmd+Shift+N", handler: openAddWidget, disabled: editorOpen, }, { shortcut: "Escape", - handler: () => { - if (editorOpen) setEditorOpen(false); - }, + handler: () => setEditorOpen(false), + disabled: !editorOpen, }, ]); @@ -468,7 +468,7 @@ export default function DashboardEditorPage({ variant="outline" size="sm" onClick={openAddWidget} - title="Add widget (Cmd+N)" + title="Add widget (Cmd+Shift+N)" > Add Widget diff --git a/app/src/components/card-container.tsx b/app/src/components/card-container.tsx index 59ab45de..0263b901 100644 --- a/app/src/components/card-container.tsx +++ b/app/src/components/card-container.tsx @@ -303,6 +303,7 @@ export function CardContainer({ ); } let mappedData: unknown; + let transformError: string | null = null; try { mappedData = (chartConfig.transformWithMapping ?? chartConfig.transform)( previewData, @@ -314,6 +315,7 @@ export function CardContainer({ err, ); mappedData = previewData; + transformError = "Data transform failed — showing raw data"; } // Skip transforms for graph charts — their data shape is incompatible with tabular transforms let transformedData: unknown = mappedData; @@ -327,11 +329,17 @@ export function CardContainer({ } catch (err) { console.error("Data transform failed:", err); transformedData = mappedData; + transformError = "Data transform failed — showing raw data"; } } const availableColumns = extractColumnNames(previewData); return (
+ {transformError && ( +
+ {transformError} +
+ )}
+ {liveTransformError && ( +
+ {liveTransformError} +
+ )} {widgetQuery.data?.truncated && (
diff --git a/app/src/plugins/choropleth/transform.ts b/app/src/plugins/choropleth/transform.ts index 85f97934..8b5dbc92 100644 --- a/app/src/plugins/choropleth/transform.ts +++ b/app/src/plugins/choropleth/transform.ts @@ -18,7 +18,9 @@ export function transformToChoroplethData(data: unknown): unknown { keys.find( (k) => k !== nameKey && /^(value|count|total|population|gdp|amount)$/i.test(k), - ) ?? keys[1]; + ) ?? + keys.find((k) => k !== nameKey) ?? + keys[1]; return records .map((row) => ({ diff --git a/component/src/charts/choropleth-chart.tsx b/component/src/charts/choropleth-chart.tsx index 45ff253c..c742d893 100644 --- a/component/src/charts/choropleth-chart.tsx +++ b/component/src/charts/choropleth-chart.tsx @@ -78,14 +78,27 @@ function ChoroplethChart({ useEffect(() => { if (mapRegistered || registering.current) return; registering.current = true; + let cancelled = false; - import("./world.geo.json").then((module) => { - const geoJSON = module.default ?? module; - if (!echarts.getMap("world")) { - echarts.registerMap("world", geoJSON as never); - } - setMapRegistered(true); - }); + import("./world.geo.json") + .then((module) => { + if (cancelled) return; + const geoJSON = module.default ?? module; + if (!echarts.getMap("world")) { + echarts.registerMap("world", geoJSON as never); + } + setMapRegistered(true); + }) + .catch((err) => { + if (!cancelled) { + console.error("Failed to load world map GeoJSON:", err); + registering.current = false; // allow retry on re-mount + } + }); + + return () => { + cancelled = true; + }; }, [mapRegistered]); const options = useMemo((): EChartsOption | undefined => { diff --git a/docs/src/content/docs/guides/keyboard-shortcuts.mdx b/docs/src/content/docs/guides/keyboard-shortcuts.mdx index 99b2addc..d48b303c 100644 --- a/docs/src/content/docs/guides/keyboard-shortcuts.mdx +++ b/docs/src/content/docs/guides/keyboard-shortcuts.mdx @@ -11,7 +11,7 @@ description: Speed up your workflow with keyboard shortcuts. |----------|--------| | `Cmd/Ctrl + S` | Save dashboard | | `Cmd/Ctrl + E` | Switch to view mode | -| `Cmd/Ctrl + N` | Open "Add Widget" dialog | +| `Cmd/Ctrl + Shift + N` | Open "Add Widget" dialog | | `Escape` | Close the current modal or dialog | ### View Mode