diff --git a/src/app/(protected)/workorders/_components/list/table/cells/site-dialog.tsx b/src/app/(protected)/workorders/_components/list/table/cells/site-dialog.tsx index 73524808..5405e38c 100644 --- a/src/app/(protected)/workorders/_components/list/table/cells/site-dialog.tsx +++ b/src/app/(protected)/workorders/_components/list/table/cells/site-dialog.tsx @@ -25,7 +25,8 @@ export type SitePatch = { pocName: string; pocPhone: string; pocNotes: string; - additionalContacts: WorkOrderAdditionalContact[]; + /** Omitted for site-only saves when GET had no contacts and the user did not edit them. */ + additionalContacts?: WorkOrderAdditionalContact[]; }; type SiteDialogProps = { @@ -60,6 +61,11 @@ export function SiteDialog({ const [notes, setNotes] = useState(pocNotes); const [extraContacts, setExtraContacts] = useState(additionalContacts); const [pocFilledFor, setPocFilledFor] = useState(""); + const [dirty, setDirty] = useState(false); + const [contactsDirty, setContactsDirty] = useState(false); + const [baselineHadContacts, setBaselineHadContacts] = useState( + () => additionalContacts.length > 0, + ); const { data: locationDetail, @@ -72,6 +78,14 @@ export function SiteDialog({ useEffect(() => { if (!open) { + setDirty(false); + setContactsDirty(false); + return; + } + }, [open]); + + useEffect(() => { + if (!open || dirty) { return; } const resolved = resolveLocationId(locationId, value, sites); @@ -81,8 +95,9 @@ export function SiteDialog({ setPp(pocPhone); setNotes(pocNotes); setExtraContacts(additionalContacts); + setBaselineHadContacts(additionalContacts.length > 0); setPocFilledFor(pocName.trim() || pocPhone.trim() ? resolved : ""); - }, [open, value, locationId, pocName, pocPhone, pocNotes, additionalContacts, sites]); + }, [open, dirty, value, locationId, pocName, pocPhone, pocNotes, additionalContacts, sites]); useEffect(() => { if (!open || !locId || !locationDetail || pocFilledFor === locId) { @@ -95,24 +110,36 @@ export function SiteDialog({ const handlePick = (id: string) => { const next = sites.find((s) => String(s.id) === id); + const siteChanged = id !== locId; setLocId(id); if (next) { setCode(resolveSiteCode(next)); } - if (id !== pocFilledFor) { + if (siteChanged) { + // Match wizard: clear POC 2+ when the site changes so stale contacts are not saved. + setExtraContacts([]); + setContactsDirty(true); + setDirty(true); + setPocFilledFor(""); + } else if (id !== pocFilledFor) { setPocFilledFor(""); } }; - const buildPatch = (): SitePatch => ({ - site: code || (selected ? resolveSiteCode(selected) : ""), - location: selected ? extractLocationLabel(selected) : "", - locationId: locId, - pocName: pn, - pocPhone: pp, - pocNotes: notes, - additionalContacts: extraContacts, - }); + const buildPatch = (): SitePatch => { + const patch: SitePatch = { + site: code || (selected ? resolveSiteCode(selected) : ""), + location: selected ? extractLocationLabel(selected) : "", + locationId: locId, + pocName: pn, + pocPhone: pp, + pocNotes: notes, + }; + if (contactsDirty || baselineHadContacts) { + patch.additionalContacts = extraContacts; + } + return patch; + }; return ( { + setDirty(true); + setPn(next); + }} + onPocPhoneChange={(next) => { + setDirty(true); + setPp(next); + }} + onPocNotesChange={(next) => { + setDirty(true); + setNotes(next); + }} + onAdditionalContactsChange={(contacts) => { + setDirty(true); + setContactsDirty(true); + setExtraContacts(contacts); + }} /> diff --git a/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx b/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx index d1578af7..b4a179d5 100644 --- a/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx +++ b/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx @@ -62,7 +62,9 @@ export function WoTableInlineRowCells({ pocName: p.pocName, pocPhone: p.pocPhone, pocNotes: p.pocNotes, - additionalContacts: p.additionalContacts, + ...(p.additionalContacts !== undefined + ? { additionalContacts: p.additionalContacts } + : {}), }) } /> diff --git a/src/app/(protected)/workorders/_components/list/table/wo-table-row-cells.tsx b/src/app/(protected)/workorders/_components/list/table/wo-table-row-cells.tsx index 50e13e1c..f4de0345 100644 --- a/src/app/(protected)/workorders/_components/list/table/wo-table-row-cells.tsx +++ b/src/app/(protected)/workorders/_components/list/table/wo-table-row-cells.tsx @@ -60,7 +60,9 @@ export function WoTableRowCells({ pocName: p.pocName, pocPhone: p.pocPhone, pocNotes: p.pocNotes, - additionalContacts: p.additionalContacts, + ...(p.additionalContacts !== undefined + ? { additionalContacts: p.additionalContacts } + : {}), }) } />