diff --git a/frontend/src/components/maps/LocationMapCanvas.jsx b/frontend/src/components/maps/LocationMapCanvas.jsx
index c0208df..c7e5d39 100644
--- a/frontend/src/components/maps/LocationMapCanvas.jsx
+++ b/frontend/src/components/maps/LocationMapCanvas.jsx
@@ -22,7 +22,9 @@ export default function LocationMapCanvas({
svgRef,
dragState,
editingLocked = false,
+ hiddenAreaCount = 0,
onShowZones,
+ onShowHiddenAreas,
setDragState,
setSelectedObjectKey,
remember,
@@ -35,6 +37,9 @@ export default function LocationMapCanvas({
? objects.filter((object) => object.visible).length
: 0;
const hasNoVisibleObjects = objects.length > 0 && filters.showZones && visibleObjectCount === 0;
+ const canRecoverHiddenAreas =
+ mode === "edit" && hasNoVisibleObjects && hiddenAreaCount > 0 && typeof onShowHiddenAreas === "function";
+ const hasEmptyCanvasAction = hiddenByZonesLayer || canRecoverHiddenAreas;
const emptyCanvasMessage = objects.length === 0
? "No map areas yet"
: hiddenByZonesLayer
@@ -155,6 +160,11 @@ export default function LocationMapCanvas({
onShowZones?.();
};
+ const handleShowHiddenAreas = (event) => {
+ event.stopPropagation();
+ onShowHiddenAreas?.();
+ };
+
const clearSelection = () => {
if (suppressPanClickRef.current) {
suppressPanClickRef.current = false;
@@ -392,7 +402,7 @@ export default function LocationMapCanvas({
{emptyCanvasMessage}
@@ -404,6 +414,14 @@ export default function LocationMapCanvas({
>
Show Zones
+ ) : canRecoverHiddenAreas ? (
+
) : null}
) : null}
diff --git a/frontend/src/pages/LocationMapManager.jsx b/frontend/src/pages/LocationMapManager.jsx
index 1e4d435..95ac4bf 100644
--- a/frontend/src/pages/LocationMapManager.jsx
+++ b/frontend/src/pages/LocationMapManager.jsx
@@ -558,6 +558,7 @@ export default function LocationMapManager() {
svgRef={svgRef}
dragState={dragState}
editingLocked={saving}
+ hiddenAreaCount={hiddenAreaCount}
setDragState={setDragState}
setSelectedObjectKey={setSelectedObjectKey}
remember={remember}
@@ -568,6 +569,7 @@ export default function LocationMapManager() {
showZones: true,
}))
}
+ onShowHiddenAreas={handleShowHiddenAreas}
/>
{
+test("admin can recover hidden map areas from the empty canvas", async ({ page }) => {
await mockMapShell(page);
let savedPayload: Record | null = null;
@@ -655,11 +655,13 @@ test("admin can recover hidden map areas from the edit sheet", async ({ page })
await expect(page.getByRole("button", { name: "Map area Bakery" })).toHaveCount(0);
await expect(page.locator(".location-map-sheet-header strong")).toHaveText("Edit Objects");
await expect(page.getByText("No visible map areas")).toBeVisible();
+ await expect(page.locator(".location-map-empty-canvas").getByRole("button", { name: "Show Hidden" })).toBeVisible();
await expect(page.getByRole("button", { name: "Show Hidden Areas (1)" })).toBeVisible();
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
- await page.getByRole("button", { name: "Show Hidden Areas (1)" }).click();
+ await page.locator(".location-map-empty-canvas").getByRole("button", { name: "Show Hidden" }).click();
await expect(page.getByRole("button", { name: "Map area Bakery" })).toBeVisible();
+ await expect(page.locator(".location-map-empty-canvas").getByRole("button", { name: "Show Hidden" })).toHaveCount(0);
await expect(page.getByRole("button", { name: "Show Hidden Areas (1)" })).toHaveCount(0);
await page.getByRole("button", { name: "Save Draft" }).click();