diff --git a/src/components/admin/offers/OfferEditorClient.tsx b/src/components/admin/offers/OfferEditorClient.tsx index f3ec2e9..c9abfe1 100644 --- a/src/components/admin/offers/OfferEditorClient.tsx +++ b/src/components/admin/offers/OfferEditorClient.tsx @@ -92,6 +92,7 @@ export function OfferEditorClient({ const [obiettivoOptions, setObiettivoOptions] = useState(fieldOptions.obiettivo); const [initialArchived] = useState(data.macro.is_archived); + const [savedDraft, setSavedDraft] = useState(false); const filteredServices = useMemo(() => { return macro.category @@ -99,16 +100,22 @@ export function OfferEditorClient({ : data.availableServices; }, [macro.category, data.availableServices]); + // Totals use the full catalog (not filtered) so changing category doesn't zero them. + const serviceById = useMemo( + () => new Map(data.availableServices.map((s) => [s.id, s])), + [data.availableServices] + ); + const tierTotals = useMemo(() => { return tiers.map((tier) => tier.assignedServiceIds.reduce((sum, id) => { - const service = filteredServices.find((s) => s.id === id); + const service = serviceById.get(id); return sum + Number(service?.unit_price ?? 0); }, 0) ); - }, [tiers, filteredServices]); + }, [tiers, serviceById]); - const canSave = tiers.some((t) => t.assignedServiceIds.length > 0); + const isDraft = !tiers.some((t) => t.assignedServiceIds.length > 0); function updateMacro(key: K, value: MacroFields[K]) { setMacro((prev) => ({ ...prev, [key]: value })); @@ -164,7 +171,12 @@ export function OfferEditorClient({ startTransition(async () => { try { await saveOfferEditor(data.macro.id, payload); - router.push("/admin/offers"); + if (isDraft) { + setSavedDraft(true); + router.refresh(); + } else { + router.push("/admin/offers"); + } } catch { setSaveError("Errore nel salvataggio. Verifica i campi."); } @@ -183,6 +195,18 @@ export function OfferEditorClient({ }); } + function handleRestore() { + if (!window.confirm("Ripristinare l'offerta? TornerĂ  visibile nella lista.")) return; + startTransition(async () => { + try { + await toggleOfferArchived(data.macro.id, false); + router.push("/admin/offers"); + } catch { + setSaveError("Errore nel salvataggio. Verifica i campi."); + } + }); + } + function handleRenameCategoria(oldValue: string, newValue: string) { setCategoriaOptions((prev) => prev.map((o) => (o === oldValue ? newValue : o))); if (macro.category === oldValue) updateMacro("category", newValue); @@ -468,16 +492,29 @@ export function OfferEditorClient({ {/* Action buttons */} {saveError &&

{saveError}

} + {savedDraft && !saveError && ( +

Bozza salvata.

+ )}
- + {isDraft ? ( + + ) : ( + + )} )} + {initialArchived && ( + + )}
); diff --git a/src/lib/offer-queries.ts b/src/lib/offer-queries.ts index 65f4dfd..e049393 100644 --- a/src/lib/offer-queries.ts +++ b/src/lib/offer-queries.ts @@ -206,23 +206,17 @@ export async function getOfferEditorData(macroId: string): Promise