fix: ignore no-op map field edits

This commit is contained in:
Nico 2026-06-14 23:50:34 -07:00
parent 2fb7bc6d45
commit dcafea4a95
2 changed files with 24 additions and 4 deletions

View File

@ -97,6 +97,8 @@ export default function useLocationMapObjectActions({
const handleObjectField = useCallback((field, value) => {
if (!selectedObject) return;
if (selectedObject[field] === value) return;
remember();
updateObjects((currentObjects) =>
currentObjects.map((object) => (
@ -106,16 +108,28 @@ export default function useLocationMapObjectActions({
}, [remember, selectedObject, updateObjects]);
const handleZoneLinkChange = useCallback((zoneId) => {
if (!selectedObject) return;
const zone = zones.find((candidate) => String(candidate.id) === String(zoneId));
handleObjectField("zone_id", zone?.id || null);
setObjects((currentObjects) =>
const nextZoneId = zone?.id || null;
const nextZoneName = zone?.name || null;
const nextLabel = selectedObject.label ?? zone?.name ?? "";
if (
(selectedObject.zone_id || null) === nextZoneId &&
(selectedObject.zone_name || null) === nextZoneName &&
selectedObject.label === nextLabel
) {
return;
}
remember();
updateObjects((currentObjects) =>
currentObjects.map((object) => (
getObjectKey(object) === selectedObjectKey
? { ...object, zone_name: zone?.name || null, label: object.label ?? zone?.name ?? "" }
? { ...object, zone_id: nextZoneId, zone_name: nextZoneName, label: object.label ?? zone?.name ?? "" }
: object
))
);
}, [handleObjectField, selectedObjectKey, setObjects, zones]);
}, [remember, selectedObject, selectedObjectKey, updateObjects, zones]);
return {
handleAddObject,

View File

@ -1721,6 +1721,12 @@ test("admin selecting an object does not mark a draft dirty until it changes", a
await expect(page.getByRole("button", { name: "Save Draft" })).toHaveCount(0);
await expect(page.getByRole("button", { name: "Undo" })).toBeDisabled();
await page.getByRole("textbox", { name: "Label" }).fill("Bakery");
await page.getByLabel("Linked zone").selectOption("501");
await expect(page.locator(".location-map-status")).toHaveText("Draft");
await expect(page.getByRole("button", { name: "Save Draft" })).toHaveCount(0);
await expect(page.getByRole("button", { name: "Undo" })).toBeDisabled();
const objectBox = await bakeryObject.boundingBox();
expect(objectBox).not.toBeNull();
if (!objectBox) throw new Error("Bakery map object was not measurable");