diff --git a/src/modules/rendicontazione/pages/IstruttoriaPratica.js b/src/modules/rendicontazione/pages/IstruttoriaPratica.js index f294583..41c9abc 100644 --- a/src/modules/rendicontazione/pages/IstruttoriaPratica.js +++ b/src/modules/rendicontazione/pages/IstruttoriaPratica.js @@ -16,6 +16,7 @@ import { Checkbox } from 'primereact/checkbox'; import { ConfirmPopup, confirmPopup } from 'primereact/confirmpopup'; import RendicontazioneService from '../service/rendicontazioneService'; +import FilePreviewDialog from '../components/FilePreviewDialog'; const CONTRACT_TYPES = { T_IND: 'Tempo indeterminato', T_DET: 'Tempo determinato', @@ -67,7 +68,7 @@ const IstruttoriaPratica = () => { const [bundle, setBundle] = useState(null); // dialoghi - const [previewDialog, setPreviewDialog] = useState({ visible: false, filename: null, title: null }); + const [previewDialog, setPreviewDialog] = useState({ visible: false, entityType: null, entityId: null, filename: null, title: null }); const [docNoteDialog, setDocNoteDialog] = useState({ visible: false, doc: null, status: null }); // tabelle: expanded rows + buffer modifiche inline const [expandedInv, setExpandedInv] = useState({}); @@ -123,10 +124,22 @@ const IstruttoriaPratica = () => { detail: typeof err?.detail === 'object' ? JSON.stringify(err.detail) : err?.detail }); }; - const openPreview = (filename, title) => setPreviewDialog({ visible: true, filename, title }); - const downloadStub = (filename) => { - toast.current?.show({ severity: 'info', summary: __('Sandbox', 'gepafin'), - detail: __(`Download di ${filename} — in produzione scarica il file reale dallo storage.`, 'gepafin') }); + const openPreview = (entityType, entityId, title, filename) => setPreviewDialog({ visible: true, entityType, entityId, title, filename }); + const closePreview = () => setPreviewDialog({ visible: false, entityType: null, entityId: null, filename: null, title: null }); + const downloadVerbale = () => { + RendicontazioneService.downloadVerbale(practiceId, + (err) => toast.current?.show({ severity: 'error', summary: __('Errore', 'gepafin'), detail: err?.detail || __('Verbale non disponibile', 'gepafin') }) + ); + }; + const openVerbaleHtml = () => { + RendicontazioneService.openVerbaleHtml(practiceId).catch(() => + toast.current?.show({ severity: 'error', summary: __('Errore', 'gepafin'), detail: __('Verbale non disponibile', 'gepafin') }) + ); + }; + const doDownload = (entityType, entityId) => { + RendicontazioneService.downloadEntityFile(entityType, entityId, + (err) => toast.current?.show({ severity: 'error', summary: __('Errore', 'gepafin'), detail: err?.detail || __('Download non riuscito', 'gepafin') }) + ); }; // Quick verify (thumbs up/down) senza rettifica @@ -403,6 +416,16 @@ const IstruttoriaPratica = () => { disabled={openAmendments.length > 0} onClick={() => setAmendDialog({ visible: true, text: '', deadline: null })} /> )} + + {/* Verbale: sempre visibile all'istruttore per preview e scarico */} + {['UNDER_REVIEW', 'AWAITING_AMENDMENT', 'APPROVED', 'REJECTED'].includes(practice.status) && (<> +