Add store location map manager #20
@ -17,7 +17,6 @@ const EMPTY_ITEMS = [];
|
|||||||
|
|
||||||
export default function LocationMapBottomSheet({
|
export default function LocationMapBottomSheet({
|
||||||
mode,
|
mode,
|
||||||
editorTool,
|
|
||||||
canManage,
|
canManage,
|
||||||
filters,
|
filters,
|
||||||
setFilters,
|
setFilters,
|
||||||
@ -72,17 +71,15 @@ export default function LocationMapBottomSheet({
|
|||||||
? `${selectedZoneItems.length} shown`
|
? `${selectedZoneItems.length} shown`
|
||||||
: `${selectedZoneItems.length} item${selectedZoneItems.length === 1 ? "" : "s"}`;
|
: `${selectedZoneItems.length} item${selectedZoneItems.length === 1 ? "" : "s"}`;
|
||||||
const sheetTitle = mode === "edit"
|
const sheetTitle = mode === "edit"
|
||||||
? selectedObject && editorTool === "edit"
|
? selectedObject
|
||||||
? selectedTitle
|
? selectedTitle
|
||||||
: editorTool === "edit"
|
: "Edit Areas"
|
||||||
? "Edit Areas"
|
|
||||||
: "Move Map"
|
|
||||||
: selectedObject
|
: selectedObject
|
||||||
? selectedTitle
|
? selectedTitle
|
||||||
: "Map Details";
|
: "Map Details";
|
||||||
const showHeaderItemCount = mode !== "edit" && Boolean(selectedObject);
|
const showHeaderItemCount = mode !== "edit" && Boolean(selectedObject);
|
||||||
const showEditorControls = mode === "edit" && canManage;
|
const showEditorControls = mode === "edit" && canManage;
|
||||||
const showSelectedObjectForm = Boolean(mode === "edit" && editorTool === "edit" && selectedObject);
|
const showSelectedObjectForm = Boolean(mode === "edit" && selectedObject);
|
||||||
const showUnmappedPanel = filters.showUnmapped && !selectedObject;
|
const showUnmappedPanel = filters.showUnmapped && !selectedObject;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -106,7 +103,7 @@ export default function LocationMapBottomSheet({
|
|||||||
() => mapObjects.filter((object) => !objectZoneId(object)).length,
|
() => mapObjects.filter((object) => !objectZoneId(object)).length,
|
||||||
[mapObjects]
|
[mapObjects]
|
||||||
);
|
);
|
||||||
const showDraftOverview = mode === "edit" && editorTool === "edit" && !selectedObject;
|
const showDraftOverview = mode === "edit" && !selectedObject;
|
||||||
const draftOverviewRows = [
|
const draftOverviewRows = [
|
||||||
{ label: "Areas", value: totalAreaCount },
|
{ label: "Areas", value: totalAreaCount },
|
||||||
...(hiddenAreaCount > 0 ? [{ label: "Hidden", value: hiddenAreaCount }] : []),
|
...(hiddenAreaCount > 0 ? [{ label: "Hidden", value: hiddenAreaCount }] : []),
|
||||||
@ -275,7 +272,7 @@ export default function LocationMapBottomSheet({
|
|||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
{mode === "edit" && editorTool === "edit" && selectedObject ? (
|
{mode === "edit" && selectedObject ? (
|
||||||
<SelectedMapObjectForm
|
<SelectedMapObjectForm
|
||||||
selectedObject={selectedObject}
|
selectedObject={selectedObject}
|
||||||
zones={mapState?.zones || EMPTY_ITEMS}
|
zones={mapState?.zones || EMPTY_ITEMS}
|
||||||
|
|||||||
@ -11,7 +11,6 @@ const NUDGE_KEYS = new Set(["ArrowUp", "ArrowRight", "ArrowDown", "ArrowLeft"]);
|
|||||||
|
|
||||||
export default function LocationMapCanvas({
|
export default function LocationMapCanvas({
|
||||||
mode,
|
mode,
|
||||||
editorTool,
|
|
||||||
objects,
|
objects,
|
||||||
filters,
|
filters,
|
||||||
mapSize,
|
mapSize,
|
||||||
@ -31,8 +30,8 @@ export default function LocationMapCanvas({
|
|||||||
remember,
|
remember,
|
||||||
updateObjects,
|
updateObjects,
|
||||||
}) {
|
}) {
|
||||||
const canEditObjects = !editingLocked && mode === "edit" && editorTool === "edit";
|
const canEditObjects = !editingLocked && mode === "edit";
|
||||||
const canDragPan = mode === "view" || editorTool === "pan" || canEditObjects;
|
const canDragPan = mode === "view" || mode === "edit";
|
||||||
const hiddenByZonesLayer = objects.length > 0 && !filters.showZones;
|
const hiddenByZonesLayer = objects.length > 0 && !filters.showZones;
|
||||||
const visibleObjectCount = filters.showZones
|
const visibleObjectCount = filters.showZones
|
||||||
? objects.filter((object) => object.visible).length
|
? objects.filter((object) => object.visible).length
|
||||||
@ -298,7 +297,7 @@ export default function LocationMapCanvas({
|
|||||||
className={[
|
className={[
|
||||||
"location-map-canvas-shell",
|
"location-map-canvas-shell",
|
||||||
mode === "edit" ? "is-edit-mode" : "is-view-mode",
|
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" : "",
|
isPanning ? "is-panning" : "",
|
||||||
].filter(Boolean).join(" ")}
|
].filter(Boolean).join(" ")}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -48,7 +48,6 @@ function ToolbarIcon({ name }) {
|
|||||||
|
|
||||||
export default function LocationMapToolbar({
|
export default function LocationMapToolbar({
|
||||||
mode,
|
mode,
|
||||||
editorTool,
|
|
||||||
hasAnyMap,
|
hasAnyMap,
|
||||||
canManage,
|
canManage,
|
||||||
saving,
|
saving,
|
||||||
@ -59,8 +58,6 @@ export default function LocationMapToolbar({
|
|||||||
onFit,
|
onFit,
|
||||||
onView,
|
onView,
|
||||||
onEdit,
|
onEdit,
|
||||||
onPanMode,
|
|
||||||
onEditObjects,
|
|
||||||
onUndo,
|
onUndo,
|
||||||
onRedo,
|
onRedo,
|
||||||
}) {
|
}) {
|
||||||
@ -126,29 +123,6 @@ export default function LocationMapToolbar({
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : 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">
|
<div className="location-map-zoom-controls" aria-label="Zoom controls">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@ -17,7 +17,6 @@ export default function useLocationMapDraftActions({
|
|||||||
mapDraft,
|
mapDraft,
|
||||||
objects,
|
objects,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setMapState,
|
setMapState,
|
||||||
setMode,
|
setMode,
|
||||||
setPreviewDraft,
|
setPreviewDraft,
|
||||||
@ -52,7 +51,6 @@ export default function useLocationMapDraftActions({
|
|||||||
const response = await createBlankLocationMap(activeHouseholdId, locationId, mapDraft);
|
const response = await createBlankLocationMap(activeHouseholdId, locationId, mapDraft);
|
||||||
if (!isCurrentScope()) return;
|
if (!isCurrentScope()) return;
|
||||||
applyDraftResponse(response);
|
applyDraftResponse(response);
|
||||||
setEditorTool("edit");
|
|
||||||
toast.success("Created map", "Blank draft map created");
|
toast.success("Created map", "Blank draft map created");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (!isCurrentScope()) return;
|
if (!isCurrentScope()) return;
|
||||||
@ -62,7 +60,7 @@ export default function useLocationMapDraftActions({
|
|||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
|
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
|
||||||
locationId, mapDraft, setEditorTool, toast,
|
locationId, mapDraft, toast,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const handleCreateFromZones = useCallback(async () => {
|
const handleCreateFromZones = useCallback(async () => {
|
||||||
@ -72,7 +70,6 @@ export default function useLocationMapDraftActions({
|
|||||||
const response = await createLocationMapFromZones(activeHouseholdId, locationId, mapDraft);
|
const response = await createLocationMapFromZones(activeHouseholdId, locationId, mapDraft);
|
||||||
if (!isCurrentScope()) return;
|
if (!isCurrentScope()) return;
|
||||||
applyDraftResponse(response);
|
applyDraftResponse(response);
|
||||||
setEditorTool("edit");
|
|
||||||
toast.success("Created starter map", "Zones were added as editable rectangles");
|
toast.success("Created starter map", "Zones were added as editable rectangles");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (!isCurrentScope()) return;
|
if (!isCurrentScope()) return;
|
||||||
@ -82,7 +79,7 @@ export default function useLocationMapDraftActions({
|
|||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
|
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, isCurrentScope,
|
||||||
locationId, mapDraft, setEditorTool, toast,
|
locationId, mapDraft, toast,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const handleSaveDraft = useCallback(async () => {
|
const handleSaveDraft = useCallback(async () => {
|
||||||
@ -125,7 +122,6 @@ export default function useLocationMapDraftActions({
|
|||||||
const response = await publishLocationMapDraft(activeHouseholdId, locationId);
|
const response = await publishLocationMapDraft(activeHouseholdId, locationId);
|
||||||
if (!isCurrentScope()) return;
|
if (!isCurrentScope()) return;
|
||||||
applyDraftResponse(response, "view", false);
|
applyDraftResponse(response, "view", false);
|
||||||
setEditorTool("pan");
|
|
||||||
toast.success(
|
toast.success(
|
||||||
"Published map",
|
"Published map",
|
||||||
hasUnsavedChanges
|
hasUnsavedChanges
|
||||||
@ -141,7 +137,7 @@ export default function useLocationMapDraftActions({
|
|||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, hasUnsavedChanges, isCurrentScope,
|
activeHouseholdId, applyDraftResponse, beginSaving, endSaving, hasUnsavedChanges, isCurrentScope,
|
||||||
locationId, mapDraft, objects, selectedObjectIndex, setEditorTool, toast,
|
locationId, mapDraft, objects, selectedObjectIndex, toast,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return { handleCreateBlank, handleCreateFromZones, handlePublish, handleSaveDraft };
|
return { handleCreateBlank, handleCreateFromZones, handlePublish, handleSaveDraft };
|
||||||
|
|||||||
@ -17,7 +17,6 @@ export default function useLocationMapDraftState({
|
|||||||
const [saving, setSaving] = useState(false);
|
const [saving, setSaving] = useState(false);
|
||||||
const [savingAction, setSavingAction] = useState(null);
|
const [savingAction, setSavingAction] = useState(null);
|
||||||
const [mode, setMode] = useState("setup");
|
const [mode, setMode] = useState("setup");
|
||||||
const [editorTool, setEditorTool] = useState("pan");
|
|
||||||
const [previewDraft, setPreviewDraft] = useState(false);
|
const [previewDraft, setPreviewDraft] = useState(false);
|
||||||
const [mapDraft, setMapDraft] = useState(getDefaultMapDraft);
|
const [mapDraft, setMapDraft] = useState(getDefaultMapDraft);
|
||||||
const [objects, setObjects] = useState([]);
|
const [objects, setObjects] = useState([]);
|
||||||
@ -77,7 +76,6 @@ export default function useLocationMapDraftState({
|
|||||||
nextState.can_manage ?? ["owner", "admin"].includes(activeHousehold?.role)
|
nextState.can_manage ?? ["owner", "admin"].includes(activeHousehold?.role)
|
||||||
);
|
);
|
||||||
setMapState(nextState);
|
setMapState(nextState);
|
||||||
setEditorTool("pan");
|
|
||||||
|
|
||||||
if (!nextState.draft_map && !nextState.published_map) {
|
if (!nextState.draft_map && !nextState.published_map) {
|
||||||
setMode("setup");
|
setMode("setup");
|
||||||
@ -127,9 +125,9 @@ export default function useLocationMapDraftState({
|
|||||||
const endSaving = useCallback(() => { setSaving(false); setSavingAction(null); }, []);
|
const endSaving = useCallback(() => { setSaving(false); setSavingAction(null); }, []);
|
||||||
|
|
||||||
return {
|
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,
|
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,
|
setHasUnsavedChanges, setHistory, setLayersOpen, setMapState, setMode, setObjects,
|
||||||
setPreviewDraft, setSelectedObjectKey, setZoom, syncMapDraftFromState, zoom,
|
setPreviewDraft, setSelectedObjectKey, setZoom, syncMapDraftFromState, zoom,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,7 +17,6 @@ export default function useLocationMapObjectActions({
|
|||||||
objects,
|
objects,
|
||||||
selectedObject,
|
selectedObject,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setFuture,
|
setFuture,
|
||||||
setHasUnsavedChanges,
|
setHasUnsavedChanges,
|
||||||
setHistory,
|
setHistory,
|
||||||
@ -48,9 +47,8 @@ export default function useLocationMapObjectActions({
|
|||||||
const nextObject = createClientObject(nextZone, objects.length);
|
const nextObject = createClientObject(nextZone, objects.length);
|
||||||
setObjects((currentObjects) => [...currentObjects, nextObject]);
|
setObjects((currentObjects) => [...currentObjects, nextObject]);
|
||||||
setSelectedObjectKey(getObjectKey(nextObject));
|
setSelectedObjectKey(getObjectKey(nextObject));
|
||||||
setEditorTool("edit");
|
|
||||||
setHasUnsavedChanges(true);
|
setHasUnsavedChanges(true);
|
||||||
}, [canManage, objects, remember, setEditorTool, setHasUnsavedChanges, setObjects, setSelectedObjectKey, zones]);
|
}, [canManage, objects, remember, setHasUnsavedChanges, setObjects, setSelectedObjectKey, zones]);
|
||||||
|
|
||||||
const handleDuplicateObject = useCallback(() => {
|
const handleDuplicateObject = useCallback(() => {
|
||||||
if (!selectedObject) return;
|
if (!selectedObject) return;
|
||||||
@ -67,9 +65,8 @@ export default function useLocationMapObjectActions({
|
|||||||
};
|
};
|
||||||
setObjects((currentObjects) => [...currentObjects, clampObjectToMap(nextObject, mapSize)]);
|
setObjects((currentObjects) => [...currentObjects, clampObjectToMap(nextObject, mapSize)]);
|
||||||
setSelectedObjectKey(getObjectKey(nextObject));
|
setSelectedObjectKey(getObjectKey(nextObject));
|
||||||
setEditorTool("edit");
|
|
||||||
setHasUnsavedChanges(true);
|
setHasUnsavedChanges(true);
|
||||||
}, [mapSize, objects.length, remember, selectedObject, setEditorTool, setHasUnsavedChanges, setObjects, setSelectedObjectKey]);
|
}, [mapSize, objects.length, remember, selectedObject, setHasUnsavedChanges, setObjects, setSelectedObjectKey]);
|
||||||
|
|
||||||
const requestDeleteObject = useCallback(() => {
|
const requestDeleteObject = useCallback(() => {
|
||||||
if (selectedObject) setPendingDeleteObject(selectedObject);
|
if (selectedObject) setPendingDeleteObject(selectedObject);
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import useMobileMapAutoFit from "./useMobileMapAutoFit";
|
|||||||
import { getObjectKey } from "../lib/locationMapUtils";
|
import { getObjectKey } from "../lib/locationMapUtils";
|
||||||
|
|
||||||
export default function useLocationMapViewControls({
|
export default function useLocationMapViewControls({
|
||||||
editorTool,
|
|
||||||
filters,
|
filters,
|
||||||
hasUnsavedChanges,
|
hasUnsavedChanges,
|
||||||
mapSize,
|
mapSize,
|
||||||
@ -12,7 +11,6 @@ export default function useLocationMapViewControls({
|
|||||||
objects,
|
objects,
|
||||||
previewDraft,
|
previewDraft,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setFuture,
|
setFuture,
|
||||||
setHasUnsavedChanges,
|
setHasUnsavedChanges,
|
||||||
setHistory,
|
setHistory,
|
||||||
@ -25,17 +23,6 @@ export default function useLocationMapViewControls({
|
|||||||
svgRef,
|
svgRef,
|
||||||
syncMapDraftFromState,
|
syncMapDraftFromState,
|
||||||
}) {
|
}) {
|
||||||
useEffect(() => {
|
|
||||||
if (mode !== "edit") {
|
|
||||||
setEditorTool("pan");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (editorTool === "pan") {
|
|
||||||
setSelectedObjectKey(null);
|
|
||||||
}
|
|
||||||
}, [editorTool, mode, setEditorTool, setSelectedObjectKey]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!selectedObjectKey) return;
|
if (!selectedObjectKey) return;
|
||||||
|
|
||||||
@ -77,15 +64,13 @@ export default function useLocationMapViewControls({
|
|||||||
|
|
||||||
const handlePreviewDraft = useCallback(() => {
|
const handlePreviewDraft = useCallback(() => {
|
||||||
setMode("view");
|
setMode("view");
|
||||||
setEditorTool("pan");
|
|
||||||
setLayersOpen(false);
|
setLayersOpen(false);
|
||||||
setPreviewDraft(true);
|
setPreviewDraft(true);
|
||||||
setSelectedObjectKey(null);
|
setSelectedObjectKey(null);
|
||||||
}, [setEditorTool, setLayersOpen, setMode, setPreviewDraft, setSelectedObjectKey]);
|
}, [setLayersOpen, setMode, setPreviewDraft, setSelectedObjectKey]);
|
||||||
|
|
||||||
const handleViewMode = useCallback(() => {
|
const handleViewMode = useCallback(() => {
|
||||||
setMode("view");
|
setMode("view");
|
||||||
setEditorTool("pan");
|
|
||||||
setLayersOpen(false);
|
setLayersOpen(false);
|
||||||
if ((mode === "edit" || previewDraft) && (hasUnsavedChanges || mapState?.draft_map)) {
|
if ((mode === "edit" || previewDraft) && (hasUnsavedChanges || mapState?.draft_map)) {
|
||||||
setPreviewDraft(true);
|
setPreviewDraft(true);
|
||||||
@ -101,7 +86,6 @@ export default function useLocationMapViewControls({
|
|||||||
mapState,
|
mapState,
|
||||||
mode,
|
mode,
|
||||||
previewDraft,
|
previewDraft,
|
||||||
setEditorTool,
|
|
||||||
setLayersOpen,
|
setLayersOpen,
|
||||||
setMode,
|
setMode,
|
||||||
setPreviewDraft,
|
setPreviewDraft,
|
||||||
@ -111,7 +95,6 @@ export default function useLocationMapViewControls({
|
|||||||
|
|
||||||
const handleEditMode = useCallback(() => {
|
const handleEditMode = useCallback(() => {
|
||||||
setMode("edit");
|
setMode("edit");
|
||||||
setEditorTool("edit");
|
|
||||||
setLayersOpen(false);
|
setLayersOpen(false);
|
||||||
setPreviewDraft(true);
|
setPreviewDraft(true);
|
||||||
if (!previewDraft && mapState && !hasUnsavedChanges) {
|
if (!previewDraft && mapState && !hasUnsavedChanges) {
|
||||||
@ -121,7 +104,6 @@ export default function useLocationMapViewControls({
|
|||||||
hasUnsavedChanges,
|
hasUnsavedChanges,
|
||||||
mapState,
|
mapState,
|
||||||
previewDraft,
|
previewDraft,
|
||||||
setEditorTool,
|
|
||||||
setLayersOpen,
|
setLayersOpen,
|
||||||
setMode,
|
setMode,
|
||||||
setPreviewDraft,
|
setPreviewDraft,
|
||||||
|
|||||||
@ -37,7 +37,6 @@ export default function LocationMapManager() {
|
|||||||
const {
|
const {
|
||||||
beginSaving,
|
beginSaving,
|
||||||
dragState,
|
dragState,
|
||||||
editorTool,
|
|
||||||
endSaving,
|
endSaving,
|
||||||
filters,
|
filters,
|
||||||
future,
|
future,
|
||||||
@ -56,7 +55,6 @@ export default function LocationMapManager() {
|
|||||||
savingAction,
|
savingAction,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setDragState,
|
setDragState,
|
||||||
setEditorTool,
|
|
||||||
setFilters,
|
setFilters,
|
||||||
setFuture,
|
setFuture,
|
||||||
setHasUnsavedChanges,
|
setHasUnsavedChanges,
|
||||||
@ -139,7 +137,6 @@ export default function LocationMapManager() {
|
|||||||
mapDraft,
|
mapDraft,
|
||||||
objects,
|
objects,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setMapState,
|
setMapState,
|
||||||
setMode,
|
setMode,
|
||||||
setPreviewDraft,
|
setPreviewDraft,
|
||||||
@ -167,7 +164,6 @@ export default function LocationMapManager() {
|
|||||||
objects,
|
objects,
|
||||||
selectedObject,
|
selectedObject,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setFuture,
|
setFuture,
|
||||||
setHasUnsavedChanges,
|
setHasUnsavedChanges,
|
||||||
setHistory,
|
setHistory,
|
||||||
@ -188,7 +184,6 @@ export default function LocationMapManager() {
|
|||||||
handleUndo,
|
handleUndo,
|
||||||
handleViewMode,
|
handleViewMode,
|
||||||
} = useLocationMapViewControls({
|
} = useLocationMapViewControls({
|
||||||
editorTool,
|
|
||||||
filters,
|
filters,
|
||||||
hasUnsavedChanges,
|
hasUnsavedChanges,
|
||||||
mapSize,
|
mapSize,
|
||||||
@ -197,7 +192,6 @@ export default function LocationMapManager() {
|
|||||||
objects,
|
objects,
|
||||||
previewDraft,
|
previewDraft,
|
||||||
selectedObjectKey,
|
selectedObjectKey,
|
||||||
setEditorTool,
|
|
||||||
setFuture,
|
setFuture,
|
||||||
setHasUnsavedChanges,
|
setHasUnsavedChanges,
|
||||||
setHistory,
|
setHistory,
|
||||||
@ -273,7 +267,6 @@ export default function LocationMapManager() {
|
|||||||
{hasAnyMap && mode !== "setup" ? (
|
{hasAnyMap && mode !== "setup" ? (
|
||||||
<LocationMapToolbar
|
<LocationMapToolbar
|
||||||
mode={mode}
|
mode={mode}
|
||||||
editorTool={editorTool}
|
|
||||||
hasAnyMap={hasAnyMap}
|
hasAnyMap={hasAnyMap}
|
||||||
canManage={canManage}
|
canManage={canManage}
|
||||||
saving={saving}
|
saving={saving}
|
||||||
@ -284,8 +277,6 @@ export default function LocationMapManager() {
|
|||||||
onFit={handleFitMap}
|
onFit={handleFitMap}
|
||||||
onView={handleViewMode}
|
onView={handleViewMode}
|
||||||
onEdit={handleEditMode}
|
onEdit={handleEditMode}
|
||||||
onPanMode={() => setEditorTool("pan")}
|
|
||||||
onEditObjects={() => setEditorTool("edit")}
|
|
||||||
onUndo={handleUndo}
|
onUndo={handleUndo}
|
||||||
onRedo={handleRedo}
|
onRedo={handleRedo}
|
||||||
/>
|
/>
|
||||||
@ -300,7 +291,6 @@ export default function LocationMapManager() {
|
|||||||
savingAction={savingAction}
|
savingAction={savingAction}
|
||||||
onContinue={() => {
|
onContinue={() => {
|
||||||
setMode("edit");
|
setMode("edit");
|
||||||
setEditorTool("edit");
|
|
||||||
setPreviewDraft(true);
|
setPreviewDraft(true);
|
||||||
}}
|
}}
|
||||||
onPreview={handlePreviewDraft}
|
onPreview={handlePreviewDraft}
|
||||||
@ -312,7 +302,6 @@ export default function LocationMapManager() {
|
|||||||
<>
|
<>
|
||||||
<LocationMapCanvas
|
<LocationMapCanvas
|
||||||
mode={mode}
|
mode={mode}
|
||||||
editorTool={editorTool}
|
|
||||||
objects={objects}
|
objects={objects}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
mapSize={mapSize}
|
mapSize={mapSize}
|
||||||
@ -339,7 +328,6 @@ export default function LocationMapManager() {
|
|||||||
/>
|
/>
|
||||||
<LocationMapBottomSheet
|
<LocationMapBottomSheet
|
||||||
mode={mode}
|
mode={mode}
|
||||||
editorTool={editorTool}
|
|
||||||
canManage={canManage}
|
canManage={canManage}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
setFilters={setFilters}
|
setFilters={setFilters}
|
||||||
|
|||||||
@ -131,7 +131,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.location-map-mode-buttons,
|
.location-map-mode-buttons,
|
||||||
.location-map-tool-buttons,
|
|
||||||
.location-map-zoom-controls,
|
.location-map-zoom-controls,
|
||||||
.location-map-history-buttons,
|
.location-map-history-buttons,
|
||||||
.location-map-editor-actions {
|
.location-map-editor-actions {
|
||||||
@ -141,7 +140,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.location-map-mode-buttons button,
|
.location-map-mode-buttons button,
|
||||||
.location-map-tool-buttons button,
|
|
||||||
.location-map-zoom-controls button,
|
.location-map-zoom-controls button,
|
||||||
.location-map-history-buttons button,
|
.location-map-history-buttons button,
|
||||||
.location-map-editor-actions button,
|
.location-map-editor-actions button,
|
||||||
@ -164,14 +162,6 @@
|
|||||||
background: rgba(15, 23, 34, 0.68);
|
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 {
|
.location-map-mode-buttons button {
|
||||||
min-height: 36px;
|
min-height: 36px;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
@ -179,16 +169,7 @@
|
|||||||
background: transparent;
|
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-mode-buttons button.active,
|
||||||
.location-map-tool-buttons button.active,
|
|
||||||
.location-map-editor-actions button.primary,
|
.location-map-editor-actions button.primary,
|
||||||
.location-map-setup-actions .btn-primary {
|
.location-map-setup-actions .btn-primary {
|
||||||
border-color: var(--color-primary);
|
border-color: var(--color-primary);
|
||||||
@ -235,7 +216,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.location-map-mode-buttons button:disabled,
|
.location-map-mode-buttons button:disabled,
|
||||||
.location-map-tool-buttons button:disabled,
|
|
||||||
.location-map-zoom-controls button:disabled,
|
.location-map-zoom-controls button:disabled,
|
||||||
.location-map-history-buttons button:disabled,
|
.location-map-history-buttons button:disabled,
|
||||||
.location-map-editor-actions button:disabled,
|
.location-map-editor-actions button:disabled,
|
||||||
@ -1148,10 +1128,6 @@
|
|||||||
font-size: 0.82rem;
|
font-size: 0.82rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.location-map-tool-buttons {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.location-map-bottom-sheet {
|
.location-map-bottom-sheet {
|
||||||
max-height: 34dvh;
|
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 page.getByRole("button", { name: "Create From 2 Zones" }).click();
|
||||||
await expect(page.getByText("Bakery")).toBeVisible();
|
await expect(page.getByText("Bakery")).toBeVisible();
|
||||||
await expect(page.getByText("Frozen Foods")).toBeVisible();
|
await expect(page.getByText("Frozen Foods")).toBeVisible();
|
||||||
await expect(page.getByRole("button", { name: "Move Map" })).toBeVisible();
|
await expect(page.getByRole("button", { name: "Move Map" })).toHaveCount(0);
|
||||||
await expect(page.getByRole("button", { name: "Edit Areas" })).toBeVisible();
|
await expect(page.getByRole("button", { name: "Edit Areas" })).toHaveCount(0);
|
||||||
await expect(page.locator(".location-map-tool-buttons")).toHaveCSS("border-radius", "999px");
|
await expect(page.locator(".location-map-tool-buttons")).toHaveCount(0);
|
||||||
await expect(page.getByRole("button", { name: "Edit Areas" })).toHaveAttribute("aria-pressed", "true");
|
|
||||||
await expect(page.locator(".location-map-pin")).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();
|
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first();
|
||||||
await bakeryObject.click();
|
await bakeryObject.click();
|
||||||
await expect(page.locator(".location-map-sheet-header strong")).toHaveText("Bakery");
|
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 expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Edit Draft" }).click();
|
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.locator(".location-map-object", { hasText: "Bread Wall" }).locator("rect").first().click();
|
||||||
await page.getByRole("button", { name: "Save Draft" }).click();
|
await page.getByRole("button", { name: "Save Draft" }).click();
|
||||||
await expect(page.locator(".location-map-status")).toHaveText("Draft");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
await page.getByRole("button", { name: "Continue Editing" }).click();
|
||||||
await page.getByRole("button", { name: "Edit Areas" }).click();
|
|
||||||
const summary = page.getByLabel("Draft map summary");
|
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")).toHaveCount(1);
|
||||||
await expect(summary.locator(".location-map-overview-row", { hasText: "Areas" }).locator("strong")).toHaveText("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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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("button", { name: "Map area Bakery" }).click();
|
||||||
const visibleToggle = page.getByRole("button", { name: "Visible" });
|
const visibleToggle = page.getByRole("button", { name: "Visible" });
|
||||||
const lockedToggle = page.getByRole("button", { name: "Locked" });
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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 bakeryArea = page.getByRole("button", { name: "Map area Bakery" });
|
||||||
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" });
|
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" });
|
||||||
await bakeryArea.click();
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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("button", { name: "Map area Bakery" }).click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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 bakeryArea = page.getByRole("button", { name: "Map area Bakery" });
|
||||||
await bakeryArea.focus();
|
await bakeryArea.focus();
|
||||||
await expect(bakeryArea).toBeFocused();
|
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.goto("/stores/100/locations/10/map");
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
|
|
||||||
await expect(page.locator(".location-map-field-row")).toHaveCount(2);
|
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.goto("/stores/100/locations/10/map");
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Saving Bakery");
|
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.goto("/stores/100/locations/10/map");
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("button", { name: "Visible" }).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: "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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Hard Navigation Bakery");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Navbar Bakery");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Logout Bakery");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Continue Editing" }).click();
|
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.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Unsaved Household Bakery");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Edit Draft" }).click();
|
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.locator(".location-map-object", { hasText: "Live Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Quick Publish Bakery");
|
await page.getByRole("textbox", { name: "Label" }).fill("Quick Publish Bakery");
|
||||||
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
|
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.goto("/stores/100/locations/10/map");
|
||||||
|
|
||||||
await page.getByRole("button", { name: "Edit Draft" }).click();
|
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.locator(".location-map-object", { hasText: "Live Bakery" }).locator("rect").first().click();
|
||||||
await page.getByRole("textbox", { name: "Label" }).fill("Saved Draft Bakery");
|
await page.getByRole("textbox", { name: "Label" }).fill("Saved Draft Bakery");
|
||||||
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
|
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 page.getByRole("button", { name: "Continue Editing" }).click();
|
||||||
|
|
||||||
await expect(page.getByLabel("Map controls")).toBeVisible();
|
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);
|
await expect(page.locator(".location-map-mobile-tool-switch")).toHaveCount(0);
|
||||||
const historyActions = page.locator(".location-map-history-buttons");
|
const historyActions = page.locator(".location-map-history-buttons");
|
||||||
await expect(historyActions.getByRole("button", { name: "Undo" })).toBeVisible();
|
await expect(historyActions.getByRole("button", { name: "Undo" })).toBeVisible();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user