/** * NIS2 Agile - Organigramma (A4 Fase 4.1) * Vista ad albero dei ruoli organizzativi + editor (crea/modifica/elimina). * Client api.orgRole*: ritorna `data`, lancia su success=false (vedi api.js _acn). * Nodo "organo di governance" = Art. 23 D.Lgs. 138/2024. */ 'use strict'; let ORG = { roles: [], users: [], tree: [] }; function el(id) { return document.getElementById(id); } function esc(s) { const d = document.createElement('div'); d.textContent = (s == null ? '' : String(s)); return d.innerHTML; } document.addEventListener('DOMContentLoaded', async function () { if (typeof checkAuth === 'function' && !checkAuth()) return; if (window.I18n && I18n.init) I18n.init('it'); if (typeof loadSidebar === 'function') loadSidebar(); if (window.HelpSystem && HelpSystem.init) HelpSystem.init(); // Chiudi la modale con ESC e con click sull'overlay. document.addEventListener('keydown', function (e) { if (e.key === 'Escape') orgCloseModal(); }); const ov = el('org-modal'); if (ov) ov.addEventListener('click', function (e) { if (e.target === ov) orgCloseModal(); }); await orgLoadAll(); }); async function orgLoadAll() { try { const [data, users] = await Promise.all([ api.orgRolesList(), api.orgRolesAssignableUsers() ]); ORG.roles = data.roles || []; ORG.tree = data.tree || []; ORG.users = Array.isArray(users) ? users : []; orgRender(); } catch (e) { showNotification('Errore nel caricamento dell\'organigramma: ' + (e.message || e), 'error'); } } function orgRender() { const tree = el('org-tree'); const empty = el('org-empty'); const stats = el('org-stats'); if (!ORG.roles.length) { tree.innerHTML = ''; empty.style.display = 'block'; stats.style.display = 'none'; return; } empty.style.display = 'none'; // Statistiche const gov = ORG.roles.filter(r => r.is_governance_body).length; const vacant = ORG.roles.filter(r => !r.holder_user_id).length; el('org-stat-total').textContent = ORG.roles.length; el('org-stat-gov').textContent = gov; el('org-stat-vacant').textContent = vacant; stats.style.display = 'flex'; tree.innerHTML = ORG.tree.map(orgNodeHtml).join(''); } function orgNodeHtml(node) { const gov = node.is_governance_body; const holder = node.holder_name ? '