From 890f0572f3fcf965a655dda8a80fa99f3b06ea59 Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Thu, 19 Feb 2026 10:48:31 +0100 Subject: [PATCH] feat: enhance document upload functionality and add save state indicators in Admin sections --- .../components/servizio/admin_conferma.tsx | 39 +++++++- .../components/servizio/admin_contratto.tsx | 94 +++++++++++++++++-- 2 files changed, 119 insertions(+), 14 deletions(-) diff --git a/apps/infoalloggi/src/components/servizio/admin_conferma.tsx b/apps/infoalloggi/src/components/servizio/admin_conferma.tsx index d91c9f2..d0d677d 100644 --- a/apps/infoalloggi/src/components/servizio/admin_conferma.tsx +++ b/apps/infoalloggi/src/components/servizio/admin_conferma.tsx @@ -1,5 +1,6 @@ import { format } from "date-fns"; import { + CircleAlert, CircleCheck, ClipboardPaste, FlaskConical, @@ -230,7 +231,18 @@ const DocSection = () => { }); }} /> - + { + if (storageIds.length === 1 && storageIds[0]) { + await updateServizioAnnunci({ + doc_conferma_added: true, + doc_conferma_ref: storageIds[0], + }); + } + }} + isAdmin + userId={userId} + /> @@ -266,13 +278,16 @@ const parseCaparra = (ingest: string) => { const Caparra = () => { const { data, updateServizioAnnunci } = useServizioAnnuncio(); - - const [caparra, setCaparra] = useState({ + const initialCaparra = { caparra_causale: data.caparra_causale, caparra_iban: data.caparra_iban, caparra_importo: data.caparra_importo, caparra_intestazione: data.caparra_intestazione, - }); + }; + + const [caparra, setCaparra] = useState( + initialCaparra, + ); const handleSave = async () => { await updateServizioAnnunci({ caparra_causale: caparra?.caparra_causale || null, @@ -415,9 +430,10 @@ const Caparra = () => {

Inserisci la stringa dal gestionale e elabora

)} - + + {JSON.stringify(caparra) !== JSON.stringify(initialCaparra) ? ( +
+ + Salva modifiche +
+ ) : ( + Object.values(initialCaparra).every((v) => v !== null) && ( +
+ + Dati salvati +
+ ) + )}
); diff --git a/apps/infoalloggi/src/components/servizio/admin_contratto.tsx b/apps/infoalloggi/src/components/servizio/admin_contratto.tsx index 1108051..a496f41 100644 --- a/apps/infoalloggi/src/components/servizio/admin_contratto.tsx +++ b/apps/infoalloggi/src/components/servizio/admin_contratto.tsx @@ -1,4 +1,11 @@ -import { CircleCheck, ClipboardPaste, Pen, Trash2, Wrench } from "lucide-react"; +import { + CircleAlert, + CircleCheck, + ClipboardPaste, + Pen, + Trash2, + Wrench, +} from "lucide-react"; import { useState } from "react"; import toast from "react-hot-toast"; import z from "zod"; @@ -77,6 +84,7 @@ export const AdminContratto = () => { const ContrattoSection = () => { const { userId } = useServizio(); const { data, updateServizioAnnunci } = useServizioAnnuncio(); + const initialDoc = data.doc_contratto_ref; const [selectedDoc, setSelectedDoc] = useState( data.doc_contratto_ref, ); @@ -112,6 +120,7 @@ const ContrattoSection = () => { if (files === undefined) { return

Errore nel caricamento dei documenti

; } + return ( @@ -146,11 +155,20 @@ const ContrattoSection = () => { setSelectedDoc(f.id); }} /> - + { + if (storageIds.length === 1 && storageIds[0]) { + setSelectedDoc(storageIds[0]); + } + }} + isAdmin + userId={userId} + /> - + + {selectedDoc !== initialDoc ? ( +
+ + Salva modifiche +
+ ) : ( + initialDoc && + selectedDoc === initialDoc && ( +
+ + Dati salvati +
+ ) + )}
); @@ -217,8 +249,7 @@ const parseContrattoImport = (ingest: string) => { const ContrattoImport = () => { const { data, updateServizioAnnunci } = useServizioAnnuncio(); - - const [contratto, setContratto] = useState({ + const initialContratto = { contratto_decorrenza: data.contratto_decorrenza ? new Date(data.contratto_decorrenza) : null, @@ -227,7 +258,11 @@ const ContrattoImport = () => { : null, contratto_tipo: data.contratto_tipo as ContrattoImportObj["contratto_tipo"], gestionale_id: data.gestionale_id, - }); + }; + + const [contratto, setContratto] = useState( + initialContratto, + ); const handleSave = async () => { await updateServizioAnnunci({ contratto_decorrenza: contratto?.contratto_decorrenza || null, @@ -404,9 +439,12 @@ const ContrattoImport = () => {

Inserisci la stringa dal gestionale e elabora

)} - + + {JSON.stringify(contratto) !== JSON.stringify(initialContratto) ? ( +
+ + Salva modifiche +
+ ) : ( + Object.values(initialContratto).every((v) => v !== null) && ( +
+ + Dati salvati +
+ ) + )}
); @@ -422,6 +473,7 @@ const ContrattoImport = () => { const RicevutaSection = () => { const { userId } = useServizio(); const { data, updateServizioAnnunci } = useServizioAnnuncio(); + const initialDoc = data.doc_registrazione_ref; const [selectedDoc, setSelectedDoc] = useState( data.doc_registrazione_ref, ); @@ -457,6 +509,7 @@ const RicevutaSection = () => { if (files === undefined) { return

Errore nel caricamento dei documenti

; } + return ( @@ -491,11 +544,20 @@ const RicevutaSection = () => { setSelectedDoc(f.id); }} /> - + { + if (storageIds.length === 1 && storageIds[0]) { + setSelectedDoc(storageIds[0]); + } + }} + isAdmin + userId={userId} + /> - + + {selectedDoc !== initialDoc ? ( +
+ + Salva modifiche +
+ ) : ( + initialDoc && + selectedDoc === initialDoc && ( +
+ + Dati salvati +
+ ) + )}
);