[FIX] Epic C / C1 — correzioni post-verifica flotta (1 major + 5 minor)
Flotta di verifica (14 agenti): sicurezza pulita, fedeltà del dato perfetta (codifica Simon intatta, 0 scostamenti). Corretti i 6 finding confermati: - MAJOR: PolicyController::ensureFrameworkProcedures ora in transazione + SELECT...FOR UPDATE sulla riga org -> no procedure duplicate su fallimento parziale (rollback) o richieste concorrenti. - MINOR: importer idempotente committato application/cli/seed_framework.php (DDL + upsert da nis2_framework_seed.json) -> re-seed riproducibile/versionato (verificato 2 run = 0 duplicati). - MINOR: allineato '92 requisiti' importanti (dato autoritativo Simon) in help.js + nis2_sources.php (era 87, contraddizione interna); coerente '24 requisiti aggiuntivi essenziali' (116-92). - MINOR (UI): troncamento anteprima valutazione sul RAW prima di esc() (no entita HTML spezzate). - MINOR (UI a11y/AGID): modale valutazione con focus iniziale, ripristino focus, focus-trap. Cache-buster ?v=20260623, version 1.18.2, SW nis2-shell-v1.18.2. NB residuo da verificare: data esatta Determinazione 333017/2025 (mese senza giorno) in nis2_sources.php. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1f2d48df7c
commit
45e6c3599c
@@ -70,8 +70,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) -->
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script src="js/common-bi.js?v=20260618"></script>
|
||||
<script>
|
||||
// Renderizza la sidebar BI (loadSidebar è stato ridefinito da common-bi.js)
|
||||
|
||||
+4
-4
@@ -152,8 +152,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -164,8 +164,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const FUNC_LABELS = {
|
||||
|
||||
@@ -1088,10 +1088,10 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/i18n.js?v=20260622"></script>
|
||||
<script src="js/help.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script src="js/i18n.js?v=20260623"></script>
|
||||
<script src="js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
loadSidebar();
|
||||
|
||||
@@ -154,8 +154,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -166,8 +166,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth check ───────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
+4
-4
@@ -366,8 +366,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -378,8 +378,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ─────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -349,14 +349,14 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle + override sidebar BI (common-bi.js dopo common.js: ridefinisce solo loadSidebar) -->
|
||||
<script src="vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script>if (window.bootstrap && bootstrap.loadFonts) { bootstrap.loadFonts('vendor/bootstrap-italia/dist/fonts'); }</script>
|
||||
<script src="js/common-bi.js?v=20260618"></script>
|
||||
<script src="js/i18n.js?v=20260622"></script>
|
||||
<script src="js/help.js?v=20260622"></script>
|
||||
<script src="js/i18n.js?v=20260623"></script>
|
||||
<script src="js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
|
||||
@@ -183,12 +183,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script src="/js/competenze.js?v=20260617"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -382,8 +382,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -394,7 +394,7 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script>
|
||||
const SPRITE = '/vendor/bootstrap-italia/dist/svg/sprites.svg';
|
||||
function ico(name, cls) { return `<svg class="ico ${cls||''}" aria-hidden="true"><use href="${SPRITE}#${name}"></use></svg>`; }
|
||||
|
||||
@@ -143,8 +143,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -155,8 +155,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth check ───────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della forgot-password.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script>
|
||||
const form = document.getElementById('forgot-form');
|
||||
const err = document.getElementById('err');
|
||||
|
||||
+4
-4
@@ -1142,8 +1142,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (accordion) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. -->
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
@@ -1153,8 +1153,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// La guida è accessibile anche da non autenticati (utile per onboarding)
|
||||
// ma se sei loggato carichi sidebar + i18n normalmente. Stessa logica
|
||||
|
||||
@@ -351,8 +351,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -363,8 +363,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ──────────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -910,8 +910,8 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
|
||||
|
||||
</main>
|
||||
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/i18n.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script src="js/i18n.js?v=20260623"></script>
|
||||
<script>
|
||||
function showTab(id) {
|
||||
document.querySelectorAll('.tab-btn').forEach((b, i) => {
|
||||
|
||||
+4
-4
@@ -184,8 +184,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -196,8 +196,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script src="/js/isms.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+3
-3
@@ -121,8 +121,8 @@ const HelpSystem = (function () {
|
||||
{
|
||||
heading: 'Importanti vs Essenziali',
|
||||
items: [
|
||||
'Il perimetro dipende dalla classificazione del soggetto: <strong>importante</strong> (Allegato 1) = <strong>37 misure / 87 requisiti</strong>; <strong>essenziale</strong> (Allegato 2) = <strong>43 misure / 116 requisiti</strong>.',
|
||||
'La codifica dei requisiti e\' <strong>identica</strong> per i due livelli (stessi codici GV/ID/PR/DE/RS/RC): agli essenziali si aggiungono 6 misure e 29 requisiti, oltre a punti aggiuntivi su misure gia\' presenti.',
|
||||
'Il perimetro dipende dalla classificazione del soggetto: <strong>importante</strong> (Allegato 1) = <strong>37 misure / 92 requisiti</strong>; <strong>essenziale</strong> (Allegato 2) = <strong>43 misure / 116 requisiti</strong>.',
|
||||
'La codifica dei requisiti e\' <strong>identica</strong> per i due livelli (stessi codici GV/ID/PR/DE/RS/RC): agli essenziali si aggiungono 6 misure e 24 requisiti, oltre a punti aggiuntivi su misure gia\' presenti.',
|
||||
'L\'app filtra automaticamente i requisiti applicabili in base al livello del soggetto (Impostazioni › Classificazione NIS2).'
|
||||
]
|
||||
},
|
||||
@@ -152,7 +152,7 @@ const HelpSystem = (function () {
|
||||
],
|
||||
references: [
|
||||
'Determinazione ACN n. 164179 del 14/04/2025 - Misure di sicurezza di base per i soggetti NIS',
|
||||
'Allegato 1 - Misure di base per i soggetti IMPORTANTI (37 misure, 87 requisiti)',
|
||||
'Allegato 1 - Misure di base per i soggetti IMPORTANTI (37 misure, 92 requisiti)',
|
||||
'Allegato 2 - Misure di base per i soggetti ESSENZIALI (43 misure, 116 requisiti)',
|
||||
'Framework Nazionale per la Cybersecurity e la Data Protection - funzioni GV/ID/PR/DE/RS/RC',
|
||||
'Art. 24 D.Lgs. 138/2024 (recepisce l\'art. 21 della Direttiva (UE) 2022/2555) - base normativa primaria'
|
||||
|
||||
+4
-4
@@ -151,8 +151,8 @@
|
||||
</div>
|
||||
|
||||
<!-- Stessa logica JS della pagina live (parita' funzionale assoluta, zero backend). -->
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. -->
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
@@ -162,8 +162,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script src="/js/kb.js"></script>
|
||||
<script>
|
||||
// Gate auth + chrome come le altre pagine -bi.
|
||||
|
||||
@@ -515,7 +515,7 @@ body { background: var(--bg-main); }
|
||||
|
||||
<div id="toast"></div>
|
||||
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script>
|
||||
// ══════════════════════════════════════════════════════
|
||||
// CONFIG
|
||||
|
||||
+2
-2
@@ -94,8 +94,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della login attuale: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script>
|
||||
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<title>Misure e Requisiti - NIS2 Agile</title>
|
||||
<!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css. -->
|
||||
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
|
||||
<link rel="stylesheet" href="/css/style.css?v=20260622">
|
||||
<link rel="stylesheet" href="/css/style.css?v=20260623">
|
||||
<style>
|
||||
.mr-intro { background:#eff6ff; border-left:4px solid var(--primary,#2563eb); padding:14px 18px; border-radius:8px; margin-bottom:14px; font-size:.92rem; line-height:1.6; }
|
||||
.mr-note { font-size:.82rem; color:#92400e; background:#fffbeb; border:1px solid #fde68a; border-radius:8px; padding:10px 12px; margin:0 0 16px; }
|
||||
@@ -162,12 +162,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
/*
|
||||
@@ -301,7 +301,8 @@
|
||||
html += '<td class="mr-yn ' + (req.applies_essential ? 'y' : 'n') + '">' + (req.applies_essential ? '✓' : '—') + '</td>';
|
||||
if (MR.has_org) {
|
||||
const sm = statoMeta(req.stato);
|
||||
const val = req.valutazione_rischio ? esc(req.valutazione_rischio).slice(0, 90) + (req.valutazione_rischio.length > 90 ? '…' : '') : '';
|
||||
const _vr = req.valutazione_rischio || '';
|
||||
const val = _vr ? esc(_vr.slice(0, 90)) + (_vr.length > 90 ? '…' : '') : '';
|
||||
html += '<td><button type="button" class="sv-badge ' + sm.cls + '" onclick="mrEdit(' + req.id + ')" title="Modifica valutazione">' + esc(sm.label) + '</button>' +
|
||||
(val ? '<div class="sv-val">' + val + '</div>' : '') + '</td>';
|
||||
}
|
||||
@@ -325,9 +326,14 @@
|
||||
el('mr-eval-val').value = q.valutazione_rischio || '';
|
||||
el('mr-eval-note').value = q.note || '';
|
||||
el('mr-eval-err').textContent = '';
|
||||
MR._lastFocus = document.activeElement;
|
||||
el('mr-modal').classList.add('open');
|
||||
setTimeout(function () { const s = el('mr-eval-stato'); if (s) s.focus(); }, 0);
|
||||
}
|
||||
function mrCloseEval() {
|
||||
el('mr-modal').classList.remove('open');
|
||||
if (MR._lastFocus && typeof MR._lastFocus.focus === 'function') { try { MR._lastFocus.focus(); } catch (e) {} }
|
||||
}
|
||||
function mrCloseEval() { el('mr-modal').classList.remove('open'); }
|
||||
async function mrSaveEval() {
|
||||
const reqId = parseInt(el('mr-eval-id').value, 10);
|
||||
const btn = el('mr-eval-save');
|
||||
@@ -350,7 +356,20 @@
|
||||
} finally { btn.disabled = false; }
|
||||
}
|
||||
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') mrCloseEval(); });
|
||||
(function () { const ov = el('mr-modal'); if (ov) ov.addEventListener('click', function (e) { if (e.target === ov) mrCloseEval(); }); })();
|
||||
(function () {
|
||||
const ov = el('mr-modal'); if (!ov) return;
|
||||
ov.addEventListener('click', function (e) { if (e.target === ov) mrCloseEval(); });
|
||||
// focus-trap: Tab/Shift+Tab restano dentro la modale aperta
|
||||
ov.addEventListener('keydown', function (e) {
|
||||
if (e.key !== 'Tab' || !ov.classList.contains('open')) return;
|
||||
const nodes = ov.querySelectorAll('select, textarea, button');
|
||||
const list = Array.prototype.filter.call(nodes, function (x) { return !x.disabled && x.offsetParent !== null; });
|
||||
if (!list.length) return;
|
||||
const first = list[0], last = list[list.length - 1];
|
||||
if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }
|
||||
else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -424,6 +424,6 @@ curl https://nis2.agile.software/api/services/status</pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -112,8 +112,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -124,8 +124,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
loadSidebar();
|
||||
|
||||
@@ -494,8 +494,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della onboarding.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth check ──────────────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -138,12 +138,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script src="/js/organigramma.js?v=20260617"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -333,8 +333,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -345,8 +345,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ─────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
+4
-4
@@ -131,12 +131,12 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script src="/js/raci.js?v=20260619"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -268,8 +268,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della register.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script>
|
||||
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
|
||||
|
||||
|
||||
+4
-4
@@ -443,8 +443,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -455,8 +455,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ─────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -141,12 +141,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
/*
|
||||
|
||||
+4
-4
@@ -494,8 +494,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -506,8 +506,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ──────────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -672,8 +672,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -684,8 +684,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth check ───────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -165,8 +165,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth check ───────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -124,12 +124,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
/*
|
||||
|
||||
@@ -477,8 +477,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -489,8 +489,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ─────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@
|
||||
* Il nome cache include la release: va BUMPATO ad ogni rilascio (vedi version.json),
|
||||
* cosi' activate elimina automaticamente la shell vecchia.
|
||||
*/
|
||||
const CACHE = 'nis2-shell-v1.18.1';
|
||||
const CACHE = 'nis2-shell-v1.18.2';
|
||||
|
||||
const PRECACHE = [
|
||||
'/offline.html',
|
||||
|
||||
@@ -292,8 +292,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -304,8 +304,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
// ── Auth & Init ─────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"version": "1.18.1", "build": "2026-06-16-v1.18.1", "date": "2026-06-16", "changelog": "Epic C / C1 operativo: valutazione/stato di conformità per requisito (org_requisito_state, mig.047) editabile dalla pagina Misure e Requisiti - da qui emerge la conformità (sostituisce Gap ACN); copia delle 42 procedure di default nel modulo Procedure al 1° accesso (mig.048, idempotente, org demo escluse). Help/KB aggiornati. Additivo."}
|
||||
{"version": "1.18.2", "build": "2026-06-16-v1.18.2", "date": "2026-06-16", "changelog": "Epic C / C1 - fix post verifica flotta: copia procedure ora transazionale (SELECT FOR UPDATE, anti-duplicati su fallimento parziale/concorrenza); importer idempotente committato (application/cli/seed_framework.php); allineato conteggio requisiti importanti 92 (dato autoritativo Simon) in help/registry fonti; troncamento anteprima valutazione corretto (raw prima di esc); focus management modale (a11y). Additivo."}
|
||||
|
||||
@@ -207,8 +207,8 @@
|
||||
|
||||
<!-- Report Detail Modal handled by common.js showModal -->
|
||||
|
||||
<script src="/js/api.js?v=20260622"></script>
|
||||
<script src="/js/common.js?v=20260622"></script>
|
||||
<script src="/js/api.js?v=20260623"></script>
|
||||
<script src="/js/common.js?v=20260623"></script>
|
||||
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
|
||||
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
|
||||
riusando tutti gli helper di common.js (zero backend). -->
|
||||
@@ -219,8 +219,8 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/js/common-bi.js?v=20260618"></script>
|
||||
<script src="/js/i18n.js?v=20260622"></script>
|
||||
<script src="/js/help.js?v=20260622"></script>
|
||||
<script src="/js/i18n.js?v=20260623"></script>
|
||||
<script src="/js/help.js?v=20260623"></script>
|
||||
<script>
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
loadSidebar();
|
||||
|
||||
@@ -319,9 +319,9 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="js/api.js?v=20260622"></script>
|
||||
<script src="js/common.js?v=20260622"></script>
|
||||
<script src="js/i18n.js?v=20260622"></script>
|
||||
<script src="js/api.js?v=20260623"></script>
|
||||
<script src="js/common.js?v=20260623"></script>
|
||||
<script src="js/i18n.js?v=20260623"></script>
|
||||
<script>
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
loadSidebar();
|
||||
|
||||
Reference in New Issue
Block a user