fix: ignore no-op map field edits
This commit is contained in:
parent
2fb7bc6d45
commit
dcafea4a95
@ -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,
|
||||
|
||||
@ -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");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user