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