feat(ar1-admin): bottone Anteprima PDF wirato a BE /admin/ar1-templates/:id/preview-pdf

Rimosso toast 'TODO' dal bottone eye icon in Tab Template. Ora:
  1. chiama Ar1Service.previewTemplatePdf(row.id) (nuovo metodo, ritorna Blob)
  2. crea URL.createObjectURL + window.open('_blank')
  3. revokeObjectURL dopo 60s (cleanup)
  4. toast info iniziale 'Generazione anteprima...' + error toast su fail

Service: +1 metodo previewTemplatePdf(templateId) che torna Promise<Blob>
usando buildHeadersMultipart (nessun Content-Type per risposta binaria).
This commit is contained in:
BFLOWS
2026-04-23 14:36:32 +02:00
parent 4a719ded5b
commit 00ef1eb1e0
2 changed files with 16 additions and 3 deletions

View File

@@ -416,9 +416,16 @@ const Ar1AdminConfig = () => {
const tplActiveActionsTpl = (row) => ( const tplActiveActionsTpl = (row) => (
<div style={{ display: 'flex', gap: 4 }}> <div style={{ display: 'flex', gap: 4 }}>
<Button icon="pi pi-eye" rounded text severity="info" tooltip="Anteprima PDF (dati mock)" onClick={() => { <Button icon="pi pi-eye" rounded text severity="info" tooltip="Anteprima PDF (dati di esempio)" onClick={async () => {
// Anteprima PDF: apre endpoint dummy (TODO backend — fallback: mostra un alert) try {
if (toast.current) toast.current.show({ severity: 'info', summary: 'Anteprima', detail: `TODO: anteprima PDF ${row.variant} v${row.version}` }); if (toast.current) toast.current.show({ severity: 'info', summary: 'Generazione anteprima...', detail: 'Attendere qualche secondo', life: 3000 });
const blob = await Ar1Service.previewTemplatePdf(row.id);
const url = URL.createObjectURL(blob);
window.open(url, '_blank');
setTimeout(() => URL.revokeObjectURL(url), 60000);
} catch (e) {
if (toast.current) toast.current.show({ severity: 'error', summary: 'Errore anteprima', detail: e.message || 'Generazione PDF fallita' });
}
}} /> }} />
<Button icon="pi pi-pencil" rounded text tooltip="Modifica layout grafico" onClick={() => openEditLayout(row)} disabled={row.status === 'ARCHIVED'} /> <Button icon="pi pi-pencil" rounded text tooltip="Modifica layout grafico" onClick={() => openEditLayout(row)} disabled={row.status === 'ARCHIVED'} />
<Button icon="pi pi-plus-circle" rounded text severity="warning" tooltip="Nuova versione" onClick={() => openNewVersion(row.variant)} /> <Button icon="pi pi-plus-circle" rounded text severity="warning" tooltip="Nuova versione" onClick={() => openNewVersion(row.variant)} />

View File

@@ -210,6 +210,12 @@ const Ar1Service = {
}, },
// ---------- ADMIN: document categories (per dropdown) ---------- // ---------- ADMIN: document categories (per dropdown) ----------
previewTemplatePdf(templateId) {
return fetch(`${BASE_URL}/admin/ar1-templates/${templateId}/preview-pdf`, {
method: 'POST', mode: 'cors', headers: buildHeadersMultipart()
}).then(r => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.blob(); });
},
listDocumentCategories(onSuccess, onError) { listDocumentCategories(onSuccess, onError) {
fetch(`${BASE_URL}/admin/document-categories`, { fetch(`${BASE_URL}/admin/document-categories`, {
method: 'GET', mode: 'cors', headers: buildHeaders() method: 'GET', mode: 'cors', headers: buildHeaders()