fix: recover hidden areas from map canvas

This commit is contained in:
Nico 2026-06-03 22:24:40 -07:00
parent 0a16ad3e7e
commit 784d0f4d48
3 changed files with 25 additions and 3 deletions

View File

@ -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({
<div
className={[
"location-map-empty-canvas",
hiddenByZonesLayer ? "has-action" : "",
hasEmptyCanvasAction ? "has-action" : "",
].filter(Boolean).join(" ")}
>
<span>{emptyCanvasMessage}</span>
@ -404,6 +414,14 @@ export default function LocationMapCanvas({
>
Show Zones
</button>
) : canRecoverHiddenAreas ? (
<button
type="button"
onPointerDown={(event) => event.stopPropagation()}
onClick={handleShowHiddenAreas}
>
Show Hidden
</button>
) : null}
</div>
) : null}

View File

@ -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}
/>
<LocationMapBottomSheet
mode={mode}

View File

@ -596,7 +596,7 @@ test("admin selecting an object does not mark a draft dirty until it changes", a
await expect(page.getByRole("button", { name: "Undo" })).toBeEnabled();
});
test("admin can recover hidden map areas from the edit sheet", async ({ page }) => {
test("admin can recover hidden map areas from the empty canvas", async ({ page }) => {
await mockMapShell(page);
let savedPayload: Record<string, unknown> | 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();