diff --git a/public/assets.html b/public/assets.html index 2c53264..6e76e69 100644 --- a/public/assets.html +++ b/public/assets.html @@ -281,6 +281,7 @@

Inventario

Art. 21.2.i NIS2 +
@@ -581,6 +582,9 @@ + `; }); @@ -732,7 +736,10 @@ try { deps = JSON.parse(deps); } catch(e) { deps = []; } } if (deps && deps.length > 0) { - depsHtml = deps.map(d => `ID: ${escapeHtml(String(d))}`).join(''); + depsHtml = deps.map(d => { + const dep = (allAssets || []).find(x => x.id === parseInt(d)); + return `${dep ? escapeHtml(dep.name) : ('ID: ' + escapeHtml(String(d)))}`; + }).join(''); } } @@ -797,6 +804,7 @@ size: 'lg', footer: ` + ` @@ -868,6 +876,15 @@ `` ).join(''); + // Dipendenze (mappa delle dipendenze): opzioni = tutti gli altri beni + let curDeps = a.dependencies; + if (typeof curDeps === 'string') { try { curDeps = JSON.parse(curDeps); } catch (e) { curDeps = []; } } + curDeps = (curDeps || []).map(x => parseInt(x)); + const depOptions = (allAssets || []) + .filter(x => x.id !== a.id) + .map(x => ``) + .join('') || ''; + // Store the callback window._assetSaveCallback = onSave; @@ -948,6 +965,11 @@ +
+ + + Seleziona i beni da cui questo bene dipende (tieni premuto Ctrl/Cmd per selezionarne piu' di uno). Alimenta la Mappa delle Dipendenze e supporta l'analisi del rischio (art. 24 D.Lgs. 138/2024). +
`, { size: 'lg', footer: ` @@ -982,11 +1004,66 @@ status: document.getElementById('asset-status').value, }; + const depSel = document.getElementById('asset-dependencies'); + data.dependencies = depSel + ? Array.from(depSel.selectedOptions).map(o => parseInt(o.value)).filter(n => !isNaN(n)) + : []; + if (window._assetSaveCallback) { window._assetSaveCallback(data); } } + // ── Elimina bene ──────────────────────────────────────── + async function confirmDeleteAsset(id) { + const a = (allAssets || []).find(x => x.id === parseInt(id)); + const nome = a ? a.name : ('#' + id); + if (!confirm(`Eliminare definitivamente il bene "${nome}"?\nL'operazione non e' reversibile.`)) return; + try { + const r = await api.deleteAsset(id); + if (r.success) { + showNotification('Bene eliminato dall\'inventario.', 'success'); + closeModal(); + loadAssets(); + } else { + showNotification(r.message || 'Eliminazione non riuscita (serve il ruolo amministratore).', 'error'); + } + } catch (e) { + showNotification('Errore di connessione.', 'error'); + } + } + + // ── Mappa delle Dipendenze ────────────────────────────── + function parseAssetDeps(a) { + let d = a.dependencies; + if (typeof d === 'string') { try { d = JSON.parse(d); } catch (e) { d = []; } } + return (d || []).map(x => parseInt(x)).filter(n => !isNaN(n)); + } + function showDependencyMap() { + const assets = allAssets || []; + const byId = {}; + assets.forEach(a => { byId[a.id] = a; }); + const total = assets.reduce((s, a) => s + parseAssetDeps(a).length, 0); + let body; + if (!assets.length) { + body = `

Nessun bene in inventario. Aggiungi prima i beni, poi apri Modifica su ciascuno per impostare le dipendenze.

`; + } else { + const rows = assets.map(a => { + const deps = parseAssetDeps(a); + const depNames = deps.length + ? deps.map(id => `${byId[id] ? escapeHtml(byId[id].name) : ('#' + id)}`).join(' ') + : '— nessuna dipendenza'; + return `${escapeHtml(a.name)}${depNames}`; + }).join(''); + body = `

Relazioni di dipendenza tra i beni dell'inventario (${total} collegamenti totali). Per impostare o modificare le dipendenze di un bene, aprilo con Modifica e usa il campo Dipendenze. La mappa supporta l'analisi del rischio e la continuita' operativa (art. 24 D.Lgs. 138/2024).

+ ${rows}
BeneDipende da
`; + } + showModal('Mappa delle Dipendenze', body, { + size: 'lg', + footer: `` + }); + } + // ── Initial Load ──────────────────────────────────────── loadAssets(); diff --git a/public/version.json b/public/version.json index 343c0ed..ec9c5dc 100644 --- a/public/version.json +++ b/public/version.json @@ -1 +1 @@ -{"version": "1.24.12", "build": "2026-06-24-v1.24.12", "date": "2026-06-24", "changelog": "Widget Segnalazioni — Risolto l'errore \"Data too long for column 'operative_summary'\" quando la descrizione era troppo lunga: ora la casella ha un limite di 1900 caratteri con contatore live e un messaggio chiaro se si supera (al posto dell'errore tecnico). Causa radice (dimensione colonna lato ticket-ms) inoltrata ad AgileHub. Risolto ticket #430."} +{"version": "1.24.13", "build": "2026-06-25-v1.24.13", "date": "2026-06-25", "changelog": "Inventario beni — Aggiunta la Mappa delle Dipendenze: nuovo pulsante 'Mappa Dipendenze' che mostra le relazioni tra i beni, e nel form di ogni bene un campo per selezionare i beni da cui dipende (supporta l'analisi del rischio, art. 24 D.Lgs. 138/2024). Aggiunto il pulsante per eliminare un bene dall'inventario (lista e dettaglio). Risolti ticket #440 e #439."}