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) => { const handleObjectField = useCallback((field, value) => {
if (!selectedObject) return; if (!selectedObject) return;
if (selectedObject[field] === value) return;
remember(); remember();
updateObjects((currentObjects) => updateObjects((currentObjects) =>
currentObjects.map((object) => ( currentObjects.map((object) => (
@ -106,16 +108,28 @@ export default function useLocationMapObjectActions({
}, [remember, selectedObject, updateObjects]); }, [remember, selectedObject, updateObjects]);
const handleZoneLinkChange = useCallback((zoneId) => { const handleZoneLinkChange = useCallback((zoneId) => {
if (!selectedObject) return;
const zone = zones.find((candidate) => String(candidate.id) === String(zoneId)); const zone = zones.find((candidate) => String(candidate.id) === String(zoneId));
handleObjectField("zone_id", zone?.id || null); const nextZoneId = zone?.id || null;
setObjects((currentObjects) => 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) => ( currentObjects.map((object) => (
getObjectKey(object) === selectedObjectKey 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 : object
)) ))
); );
}, [handleObjectField, selectedObjectKey, setObjects, zones]); }, [remember, selectedObject, selectedObjectKey, updateObjects, zones]);
return { return {
handleAddObject, 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: "Save Draft" })).toHaveCount(0);
await expect(page.getByRole("button", { name: "Undo" })).toBeDisabled(); 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(); const objectBox = await bakeryObject.boundingBox();
expect(objectBox).not.toBeNull(); expect(objectBox).not.toBeNull();
if (!objectBox) throw new Error("Bakery map object was not measurable"); if (!objectBox) throw new Error("Bakery map object was not measurable");