fix: simplify map edit controls
This commit is contained in:
parent
8ad160196c
commit
771436b4ca
@ -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}
|
||||
|
||||
@ -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(" ")}
|
||||
>
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -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,
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user