fix: simplify map edit controls

This commit is contained in:
Nico 2026-06-04 22:12:47 -07:00
parent 8ad160196c
commit 771436b4ca
10 changed files with 20 additions and 143 deletions

View File

@ -17,7 +17,6 @@ const EMPTY_ITEMS = [];
export default function LocationMapBottomSheet({
mode,
editorTool,
canManage,
filters,
setFilters,
@ -72,17 +71,15 @@ export default function LocationMapBottomSheet({
? `${selectedZoneItems.length} shown`
: `${selectedZoneItems.length} item${selectedZoneItems.length === 1 ? "" : "s"}`;
const sheetTitle = mode === "edit"
? selectedObject && editorTool === "edit"
? selectedObject
? selectedTitle
: editorTool === "edit"
? "Edit Areas"
: "Move Map"
: "Edit Areas"
: selectedObject
? selectedTitle
: "Map Details";
const showHeaderItemCount = mode !== "edit" && Boolean(selectedObject);
const showEditorControls = mode === "edit" && canManage;
const showSelectedObjectForm = Boolean(mode === "edit" && editorTool === "edit" && selectedObject);
const showSelectedObjectForm = Boolean(mode === "edit" && selectedObject);
const showUnmappedPanel = filters.showUnmapped && !selectedObject;
useEffect(() => {
@ -106,7 +103,7 @@ export default function LocationMapBottomSheet({
() => mapObjects.filter((object) => !objectZoneId(object)).length,
[mapObjects]
);
const showDraftOverview = mode === "edit" && editorTool === "edit" && !selectedObject;
const showDraftOverview = mode === "edit" && !selectedObject;
const draftOverviewRows = [
{ label: "Areas", value: totalAreaCount },
...(hiddenAreaCount > 0 ? [{ label: "Hidden", value: hiddenAreaCount }] : []),
@ -275,7 +272,7 @@ export default function LocationMapBottomSheet({
/>
) : null}
{mode === "edit" && editorTool === "edit" && selectedObject ? (
{mode === "edit" && selectedObject ? (
<SelectedMapObjectForm
selectedObject={selectedObject}
zones={mapState?.zones || EMPTY_ITEMS}

View File

@ -11,7 +11,6 @@ const NUDGE_KEYS = new Set(["ArrowUp", "ArrowRight", "ArrowDown", "ArrowLeft"]);
export default function LocationMapCanvas({
mode,
editorTool,
objects,
filters,
mapSize,
@ -31,8 +30,8 @@ export default function LocationMapCanvas({
remember,
updateObjects,
}) {
const canEditObjects = !editingLocked && mode === "edit" && editorTool === "edit";
const canDragPan = mode === "view" || editorTool === "pan" || canEditObjects;
const canEditObjects = !editingLocked && mode === "edit";
const canDragPan = mode === "view" || mode === "edit";
const hiddenByZonesLayer = objects.length > 0 && !filters.showZones;
const visibleObjectCount = filters.showZones
? objects.filter((object) => object.visible).length
@ -298,7 +297,7 @@ export default function LocationMapCanvas({
className={[
"location-map-canvas-shell",
mode === "edit" ? "is-edit-mode" : "is-view-mode",
editorTool === "edit" ? "is-object-tool" : "is-pan-tool",
mode === "edit" ? "is-object-tool" : "is-pan-tool",
isPanning ? "is-panning" : "",
].filter(Boolean).join(" ")}
>

View File

@ -48,7 +48,6 @@ function ToolbarIcon({ name }) {
export default function LocationMapToolbar({
mode,
editorTool,
hasAnyMap,
canManage,
saving,
@ -59,8 +58,6 @@ export default function LocationMapToolbar({
onFit,
onView,
onEdit,
onPanMode,
onEditObjects,
onUndo,
onRedo,
}) {
@ -126,29 +123,6 @@ export default function LocationMapToolbar({
</button>
</div>
) : null}
{mode === "edit" && canManage ? (
<div className="location-map-tool-buttons" aria-label="Edit tool">
<button
type="button"
className={editorTool === "pan" ? "active is-pan" : ""}
onClick={onPanMode}
disabled={saving}
aria-pressed={editorTool === "pan"}
>
Move Map
</button>
<button
type="button"
className={editorTool === "edit" ? "active is-edit" : ""}
onClick={onEditObjects}
disabled={saving}
aria-pressed={editorTool === "edit"}
>
Edit Areas
</button>
</div>
) : null}
<div className="location-map-zoom-controls" aria-label="Zoom controls">
<button
type="button"

View File

@ -17,7 +17,6 @@ export default function useLocationMapDraftActions({
mapDraft,
objects,
selectedObjectKey,
setEditorTool,
setMapState,
setMode,
setPreviewDraft,
@ -52,7 +51,6 @@ export default function useLocationMapDraftActions({
const response = await createBlankLocationMap(activeHouseholdId, locationId, mapDraft);
if (!isCurrentScope()) return;
applyDraftResponse(response);
setEditorTool("edit");
toast.success("Created map", "Blank draft map created");
} catch (error) {
if (!isCurrentScope()) return;
@ -62,7 +60,7 @@ export default function useLocationMapDraftActions({
}
}, [
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
locationId, mapDraft, setEditorTool, toast,
locationId, mapDraft, toast,
]);
const handleCreateFromZones = useCallback(async () => {
@ -72,7 +70,6 @@ export default function useLocationMapDraftActions({
const response = await createLocationMapFromZones(activeHouseholdId, locationId, mapDraft);
if (!isCurrentScope()) return;
applyDraftResponse(response);
setEditorTool("edit");
toast.success("Created starter map", "Zones were added as editable rectangles");
} catch (error) {
if (!isCurrentScope()) return;
@ -82,7 +79,7 @@ export default function useLocationMapDraftActions({
}
}, [
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
locationId, mapDraft, setEditorTool, toast,
locationId, mapDraft, toast,
]);
const handleSaveDraft = useCallback(async () => {
@ -125,7 +122,6 @@ export default function useLocationMapDraftActions({
const response = await publishLocationMapDraft(activeHouseholdId, locationId);
if (!isCurrentScope()) return;
applyDraftResponse(response, "view", false);
setEditorTool("pan");
toast.success(
"Published map",
hasUnsavedChanges
@ -141,7 +137,7 @@ export default function useLocationMapDraftActions({
}
}, [
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, hasUnsavedChanges, isCurrentScope,
locationId, mapDraft, objects, selectedObjectIndex, setEditorTool, toast,
locationId, mapDraft, objects, selectedObjectIndex, toast,
]);
return { handleCreateBlank, handleCreateFromZones, handlePublish, handleSaveDraft };

View File

@ -17,7 +17,6 @@ export default function useLocationMapDraftState({
const [saving, setSaving] = useState(false);
const [savingAction, setSavingAction] = useState(null);
const [mode, setMode] = useState("setup");
const [editorTool, setEditorTool] = useState("pan");
const [previewDraft, setPreviewDraft] = useState(false);
const [mapDraft, setMapDraft] = useState(getDefaultMapDraft);
const [objects, setObjects] = useState([]);
@ -77,7 +76,6 @@ export default function useLocationMapDraftState({
nextState.can_manage ?? ["owner", "admin"].includes(activeHousehold?.role)
);
setMapState(nextState);
setEditorTool("pan");
if (!nextState.draft_map && !nextState.published_map) {
setMode("setup");
@ -127,9 +125,9 @@ export default function useLocationMapDraftState({
const endSaving = useCallback(() => { setSaving(false); setSavingAction(null); }, []);
return {
beginSaving, dragState, editorTool, endSaving, filters, future, hasUnsavedChanges, history, layersOpen,
beginSaving, dragState, endSaving, filters, future, hasUnsavedChanges, history, layersOpen,
loadError, loadMap, loading, mapDraft, mapState, mode, objects, previewDraft, saving,
savingAction, selectedObjectKey, setDragState, setEditorTool, setFilters, setFuture,
savingAction, selectedObjectKey, setDragState, setFilters, setFuture,
setHasUnsavedChanges, setHistory, setLayersOpen, setMapState, setMode, setObjects,
setPreviewDraft, setSelectedObjectKey, setZoom, syncMapDraftFromState, zoom,
};

View File

@ -17,7 +17,6 @@ export default function useLocationMapObjectActions({
objects,
selectedObject,
selectedObjectKey,
setEditorTool,
setFuture,
setHasUnsavedChanges,
setHistory,
@ -48,9 +47,8 @@ export default function useLocationMapObjectActions({
const nextObject = createClientObject(nextZone, objects.length);
setObjects((currentObjects) => [...currentObjects, nextObject]);
setSelectedObjectKey(getObjectKey(nextObject));
setEditorTool("edit");
setHasUnsavedChanges(true);
}, [canManage, objects, remember, setEditorTool, setHasUnsavedChanges, setObjects, setSelectedObjectKey, zones]);
}, [canManage, objects, remember, setHasUnsavedChanges, setObjects, setSelectedObjectKey, zones]);
const handleDuplicateObject = useCallback(() => {
if (!selectedObject) return;
@ -67,9 +65,8 @@ export default function useLocationMapObjectActions({
};
setObjects((currentObjects) => [...currentObjects, clampObjectToMap(nextObject, mapSize)]);
setSelectedObjectKey(getObjectKey(nextObject));
setEditorTool("edit");
setHasUnsavedChanges(true);
}, [mapSize, objects.length, remember, selectedObject, setEditorTool, setHasUnsavedChanges, setObjects, setSelectedObjectKey]);
}, [mapSize, objects.length, remember, selectedObject, setHasUnsavedChanges, setObjects, setSelectedObjectKey]);
const requestDeleteObject = useCallback(() => {
if (selectedObject) setPendingDeleteObject(selectedObject);

View File

@ -3,7 +3,6 @@ import useMobileMapAutoFit from "./useMobileMapAutoFit";
import { getObjectKey } from "../lib/locationMapUtils";
export default function useLocationMapViewControls({
editorTool,
filters,
hasUnsavedChanges,
mapSize,
@ -12,7 +11,6 @@ export default function useLocationMapViewControls({
objects,
previewDraft,
selectedObjectKey,
setEditorTool,
setFuture,
setHasUnsavedChanges,
setHistory,
@ -25,17 +23,6 @@ export default function useLocationMapViewControls({
svgRef,
syncMapDraftFromState,
}) {
useEffect(() => {
if (mode !== "edit") {
setEditorTool("pan");
return;
}
if (editorTool === "pan") {
setSelectedObjectKey(null);
}
}, [editorTool, mode, setEditorTool, setSelectedObjectKey]);
useEffect(() => {
if (!selectedObjectKey) return;
@ -77,15 +64,13 @@ export default function useLocationMapViewControls({
const handlePreviewDraft = useCallback(() => {
setMode("view");
setEditorTool("pan");
setLayersOpen(false);
setPreviewDraft(true);
setSelectedObjectKey(null);
}, [setEditorTool, setLayersOpen, setMode, setPreviewDraft, setSelectedObjectKey]);
}, [setLayersOpen, setMode, setPreviewDraft, setSelectedObjectKey]);
const handleViewMode = useCallback(() => {
setMode("view");
setEditorTool("pan");
setLayersOpen(false);
if ((mode === "edit" || previewDraft) && (hasUnsavedChanges || mapState?.draft_map)) {
setPreviewDraft(true);
@ -101,7 +86,6 @@ export default function useLocationMapViewControls({
mapState,
mode,
previewDraft,
setEditorTool,
setLayersOpen,
setMode,
setPreviewDraft,
@ -111,7 +95,6 @@ export default function useLocationMapViewControls({
const handleEditMode = useCallback(() => {
setMode("edit");
setEditorTool("edit");
setLayersOpen(false);
setPreviewDraft(true);
if (!previewDraft && mapState && !hasUnsavedChanges) {
@ -121,7 +104,6 @@ export default function useLocationMapViewControls({
hasUnsavedChanges,
mapState,
previewDraft,
setEditorTool,
setLayersOpen,
setMode,
setPreviewDraft,

View File

@ -37,7 +37,6 @@ export default function LocationMapManager() {
const {
beginSaving,
dragState,
editorTool,
endSaving,
filters,
future,
@ -56,7 +55,6 @@ export default function LocationMapManager() {
savingAction,
selectedObjectKey,
setDragState,
setEditorTool,
setFilters,
setFuture,
setHasUnsavedChanges,
@ -139,7 +137,6 @@ export default function LocationMapManager() {
mapDraft,
objects,
selectedObjectKey,
setEditorTool,
setMapState,
setMode,
setPreviewDraft,
@ -167,7 +164,6 @@ export default function LocationMapManager() {
objects,
selectedObject,
selectedObjectKey,
setEditorTool,
setFuture,
setHasUnsavedChanges,
setHistory,
@ -188,7 +184,6 @@ export default function LocationMapManager() {
handleUndo,
handleViewMode,
} = useLocationMapViewControls({
editorTool,
filters,
hasUnsavedChanges,
mapSize,
@ -197,7 +192,6 @@ export default function LocationMapManager() {
objects,
previewDraft,
selectedObjectKey,
setEditorTool,
setFuture,
setHasUnsavedChanges,
setHistory,
@ -273,7 +267,6 @@ export default function LocationMapManager() {
{hasAnyMap && mode !== "setup" ? (
<LocationMapToolbar
mode={mode}
editorTool={editorTool}
hasAnyMap={hasAnyMap}
canManage={canManage}
saving={saving}
@ -284,8 +277,6 @@ export default function LocationMapManager() {
onFit={handleFitMap}
onView={handleViewMode}
onEdit={handleEditMode}
onPanMode={() => setEditorTool("pan")}
onEditObjects={() => setEditorTool("edit")}
onUndo={handleUndo}
onRedo={handleRedo}
/>
@ -300,7 +291,6 @@ export default function LocationMapManager() {
savingAction={savingAction}
onContinue={() => {
setMode("edit");
setEditorTool("edit");
setPreviewDraft(true);
}}
onPreview={handlePreviewDraft}
@ -312,7 +302,6 @@ export default function LocationMapManager() {
<>
<LocationMapCanvas
mode={mode}
editorTool={editorTool}
objects={objects}
filters={filters}
mapSize={mapSize}
@ -339,7 +328,6 @@ export default function LocationMapManager() {
/>
<LocationMapBottomSheet
mode={mode}
editorTool={editorTool}
canManage={canManage}
filters={filters}
setFilters={setFilters}

View File

@ -131,7 +131,6 @@
}
.location-map-mode-buttons,
.location-map-tool-buttons,
.location-map-zoom-controls,
.location-map-history-buttons,
.location-map-editor-actions {
@ -141,7 +140,6 @@
}
.location-map-mode-buttons button,
.location-map-tool-buttons button,
.location-map-zoom-controls button,
.location-map-history-buttons button,
.location-map-editor-actions button,
@ -164,14 +162,6 @@
background: rgba(15, 23, 34, 0.68);
}
.location-map-tool-buttons {
gap: 0.25rem;
padding: 0.25rem;
border: 1px solid var(--color-border-light);
border-radius: 999px;
background: rgba(15, 23, 34, 0.68);
}
.location-map-mode-buttons button {
min-height: 36px;
border-color: transparent;
@ -179,16 +169,7 @@
background: transparent;
}
.location-map-tool-buttons button {
min-width: 96px;
min-height: 36px;
border-color: transparent;
border-radius: 999px;
background: transparent;
}
.location-map-mode-buttons button.active,
.location-map-tool-buttons button.active,
.location-map-editor-actions button.primary,
.location-map-setup-actions .btn-primary {
border-color: var(--color-primary);
@ -235,7 +216,6 @@
}
.location-map-mode-buttons button:disabled,
.location-map-tool-buttons button:disabled,
.location-map-zoom-controls button:disabled,
.location-map-history-buttons button:disabled,
.location-map-editor-actions button:disabled,
@ -1148,10 +1128,6 @@
font-size: 0.82rem;
}
.location-map-tool-buttons {
display: none;
}
.location-map-bottom-sheet {
max-height: 34dvh;
}

View File

@ -299,26 +299,11 @@ test("admin creates a map from zones, saves a draft, and publishes it", async ({
await page.getByRole("button", { name: "Create From 2 Zones" }).click();
await expect(page.getByText("Bakery")).toBeVisible();
await expect(page.getByText("Frozen Foods")).toBeVisible();
await expect(page.getByRole("button", { name: "Move Map" })).toBeVisible();
await expect(page.getByRole("button", { name: "Edit Areas" })).toBeVisible();
await expect(page.locator(".location-map-tool-buttons")).toHaveCSS("border-radius", "999px");
await expect(page.getByRole("button", { name: "Edit Areas" })).toHaveAttribute("aria-pressed", "true");
await expect(page.getByRole("button", { name: "Move Map" })).toHaveCount(0);
await expect(page.getByRole("button", { name: "Edit Areas" })).toHaveCount(0);
await expect(page.locator(".location-map-tool-buttons")).toHaveCount(0);
await expect(page.locator(".location-map-pin")).toHaveCount(0);
await page.getByRole("button", { name: "Move Map" }).click();
await expect(page.getByRole("button", { name: "Move Map" })).toHaveAttribute("aria-pressed", "true");
const bakeryPanObject = page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first();
const panBox = await bakeryPanObject.boundingBox();
expect(panBox).not.toBeNull();
if (!panBox) throw new Error("Bakery map object was not measurable");
await page.mouse.move(panBox.x + panBox.width / 2, panBox.y + panBox.height / 2);
await page.mouse.down();
await page.mouse.move(panBox.x + panBox.width / 2 - 80, panBox.y + panBox.height / 2 - 20, {
steps: 8,
});
await page.mouse.up();
await page.getByRole("button", { name: "Edit Areas" }).click();
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first();
await bakeryObject.click();
await expect(page.locator(".location-map-sheet-header strong")).toHaveText("Bakery");
@ -369,7 +354,6 @@ test("admin creates a map from zones, saves a draft, and publishes it", async ({
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
await page.getByRole("button", { name: "Edit Draft" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bread Wall" }).locator("rect").first().click();
await page.getByRole("button", { name: "Save Draft" }).click();
await expect(page.locator(".location-map-status")).toHaveText("Draft");
@ -1594,7 +1578,6 @@ test("admin selecting an object does not mark a draft dirty until it changes", a
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
const summary = page.getByLabel("Draft map summary");
await expect(summary.locator(".location-map-overview-row")).toHaveCount(1);
await expect(summary.locator(".location-map-overview-row", { hasText: "Areas" }).locator("strong")).toHaveText("1");
@ -1674,7 +1657,6 @@ test("admin can recover hidden map areas from the empty canvas", async ({ page }
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.getByRole("button", { name: "Map area Bakery" }).click();
const visibleToggle = page.getByRole("button", { name: "Visible" });
const lockedToggle = page.getByRole("button", { name: "Locked" });
@ -1801,7 +1783,6 @@ test("admin locked map areas hide resize affordances", async ({ page }) => {
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
const bakeryArea = page.getByRole("button", { name: "Map area Bakery" });
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" });
await bakeryArea.click();
@ -1952,7 +1933,6 @@ test("admin cleared map area labels keep linked zone action names", async ({ pag
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.getByRole("button", { name: "Map area Bakery" }).click();
await page.getByRole("textbox", { name: "Label" }).fill("");
@ -2012,7 +1992,6 @@ test("admin nudges selected map areas with arrow keys", async ({ page }) => {
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
const bakeryArea = page.getByRole("button", { name: "Map area Bakery" });
await bakeryArea.focus();
await expect(bakeryArea).toBeFocused();
@ -2068,7 +2047,6 @@ test("admin selected map area uses compact editable fields", async ({ page }) =>
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await expect(page.locator(".location-map-field-row")).toHaveCount(2);
@ -2134,7 +2112,6 @@ test("admin save progress locks draft controls", async ({ page }) => {
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Saving Bakery");
@ -2210,7 +2187,6 @@ test("admin save progress locks empty-canvas recovery actions", async ({ page })
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("button", { name: "Visible" }).click();
@ -2280,7 +2256,6 @@ test("admin hard navigation warns when draft edits are unsaved", async ({ page }
});
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Hard Navigation Bakery");
@ -2331,7 +2306,6 @@ test("admin app navigation warns when draft edits are unsaved", async ({ page })
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Navbar Bakery");
@ -2389,7 +2363,6 @@ test("admin logout warns when draft edits are unsaved", async ({ page }) => {
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Logout Bakery");
@ -2481,7 +2454,6 @@ test("admin household switch warns when draft edits are unsaved", async ({ page
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Continue Editing" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Household Bakery");
@ -2564,7 +2536,6 @@ test("admin publish saves pending map edits before publishing", async ({ page })
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Edit Draft" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Live Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Quick Publish Bakery");
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
@ -2646,7 +2617,6 @@ test("admin publish failure keeps successfully saved pending edits", async ({ pa
await page.goto("/stores/100/locations/10/map");
await page.getByRole("button", { name: "Edit Draft" }).click();
await page.getByRole("button", { name: "Edit Areas" }).click();
await page.locator(".location-map-object", { hasText: "Live Bakery" }).locator("rect").first().click();
await page.getByRole("textbox", { name: "Label" }).fill("Saved Draft Bakery");
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
@ -4061,7 +4031,7 @@ test("mobile editor uses bottom sheet controls instead of desktop object toolbar
await page.getByRole("button", { name: "Continue Editing" }).click();
await expect(page.getByLabel("Map controls")).toBeVisible();
await expect(page.locator(".location-map-tool-buttons")).toBeHidden();
await expect(page.locator(".location-map-tool-buttons")).toHaveCount(0);
await expect(page.locator(".location-map-mobile-tool-switch")).toHaveCount(0);
const historyActions = page.locator(".location-map-history-buttons");
await expect(historyActions.getByRole("button", { name: "Undo" })).toBeVisible();