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) && (<>
+
+
+ >)}
@@ -658,10 +681,12 @@ const IstruttoriaPratica = () => {
body={(r) => (