[FIX] Cache-buster ?v=20260613 sui JS/CSS modificati (help/common/common-bi/i18n/feedback/style/demo) + bump bug-reporter + demo assets

Risolve 'le modifiche non si vedono': /js/help.js era senza ?v -> browser serviva la versione cached
vecchia. 281 ref su 57 pagine + injection demo/bug-reporter aggiornate.
This commit is contained in:
DevEnv nis2-agile
2026-06-13 19:17:59 +02:00
parent b49044c57f
commit 3c484fe604
63 changed files with 315 additions and 315 deletions
+4 -4
View File
@@ -9,7 +9,7 @@
<link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<!-- Stile applicativo NIS2: fornisce le classi della sidebar (.sidebar-nav, .sidebar-brand, ecc.) <!-- Stile applicativo NIS2: fornisce le classi della sidebar (.sidebar-nav, .sidebar-brand, ecc.)
riusate dal markup BI per parità visiva con la chrome di produzione --> riusate dal markup BI per parità visiva con la chrome di produzione -->
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
/* Solo layout della pagina demo: niente colori custom (vengono da BI/style.css) */ /* Solo layout della pagina demo: niente colori custom (vengono da BI/style.css) */
body { margin: 0; } body { margin: 0; }
@@ -57,9 +57,9 @@
</script> </script>
<!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) --> <!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script src="js/common-bi.js"></script> <script src="js/common-bi.js?v=20260613"></script>
<script> <script>
// Renderizza la sidebar BI (loadSidebar è stato ridefinito da common-bi.js) // Renderizza la sidebar BI (loadSidebar è stato ridefinito da common-bi.js)
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
+6 -6
View File
@@ -9,7 +9,7 @@
via JS (griglia misure/requisiti, scoring) -> parita' funzionale assoluta. via JS (griglia misure/requisiti, scoring) -> parita' funzionale assoluta.
BI veste la chrome (sidebar, font, bottoni, icone sprite). --> BI veste la chrome (sidebar, font, bottoni, icone sprite). -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* Stili specifici della pagina ACN — identici alla live acn-gap.html /* Stili specifici della pagina ACN — identici alla live acn-gap.html
(variabili --primary/--gray-* del design system esistente) */ (variabili --primary/--gray-* del design system esistente) */
@@ -139,8 +139,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -150,9 +150,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
'use strict'; 'use strict';
const FUNC_LABELS = { const FUNC_LABELS = {
+6 -6
View File
@@ -9,7 +9,7 @@
via JS (griglia misure/requisiti, scoring) -> parita' funzionale assoluta. via JS (griglia misure/requisiti, scoring) -> parita' funzionale assoluta.
BI veste la chrome (sidebar, font, bottoni, icone sprite). --> BI veste la chrome (sidebar, font, bottoni, icone sprite). -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* Stili specifici della pagina ACN — identici alla live acn-gap.html /* Stili specifici della pagina ACN — identici alla live acn-gap.html
(variabili --primary/--gray-* del design system esistente) */ (variabili --primary/--gray-* del design system esistente) */
@@ -139,8 +139,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -150,9 +150,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
'use strict'; 'use strict';
const FUNC_LABELS = { const FUNC_LABELS = {
+5 -5
View File
@@ -8,7 +8,7 @@
cosi' style.css resta autorevole per i widget renderizzati via JS -> parita' funzionale. cosi' style.css resta autorevole per i widget renderizzati via JS -> parita' funzionale.
Pagina in /admin/: gli asset usano path ASSOLUTI (/vendor, /js, /css) serviti dal web root. --> Pagina in /admin/: gli asset usano path ASSOLUTI (/vendor, /js, /css) serviti dal web root. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.admin-stats-grid { .admin-stats-grid {
display: grid; display: grid;
@@ -304,8 +304,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -315,8 +315,8 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -8,7 +8,7 @@
cosi' style.css resta autorevole per i widget renderizzati via JS -> parita' funzionale. cosi' style.css resta autorevole per i widget renderizzati via JS -> parita' funzionale.
Pagina in /admin/: gli asset usano path ASSOLUTI (/vendor, /js, /css) serviti dal web root. --> Pagina in /admin/: gli asset usano path ASSOLUTI (/vendor, /js, /css) serviti dal web root. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.admin-stats-grid { .admin-stats-grid {
display: grid; display: grid;
@@ -304,8 +304,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -315,8 +315,8 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -9,7 +9,7 @@
via JS (tabella org/paginazione/badge) -> parita' funzionale assoluta. BI veste la chrome. via JS (tabella org/paginazione/badge) -> parita' funzionale assoluta. BI veste la chrome.
Path relativi ../ perche' la pagina vive sotto public/admin/. --> Path relativi ../ perche' la pagina vive sotto public/admin/. -->
<link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="../css/style.css"> <link rel="stylesheet" href="../css/style.css?v=20260613">
<style> <style>
.entity-type-badge { .entity-type-badge {
display: inline-flex; display: inline-flex;
@@ -134,8 +134,8 @@
</main> </main>
</div> </div>
<script src="../js/api.js"></script> <script src="../js/api.js?v=20260613"></script>
<script src="../js/common.js"></script> <script src="../js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -145,8 +145,8 @@
bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="../js/common-bi.js"></script> <script src="../js/common-bi.js?v=20260613"></script>
<script src="../js/i18n.js"></script> <script src="../js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -9,7 +9,7 @@
via JS (tabella org/paginazione/badge) -> parita' funzionale assoluta. BI veste la chrome. via JS (tabella org/paginazione/badge) -> parita' funzionale assoluta. BI veste la chrome.
Path relativi ../ perche' la pagina vive sotto public/admin/. --> Path relativi ../ perche' la pagina vive sotto public/admin/. -->
<link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="../css/style.css"> <link rel="stylesheet" href="../css/style.css?v=20260613">
<style> <style>
.entity-type-badge { .entity-type-badge {
display: inline-flex; display: inline-flex;
@@ -134,8 +134,8 @@
</main> </main>
</div> </div>
<script src="../js/api.js"></script> <script src="../js/api.js?v=20260613"></script>
<script src="../js/common.js"></script> <script src="../js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -145,8 +145,8 @@
bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="../js/common-bi.js"></script> <script src="../js/common-bi.js?v=20260613"></script>
<script src="../js/i18n.js"></script> <script src="../js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -9,7 +9,7 @@
via JS (tabella utenti/azioni) -> parita' funzionale assoluta. BI veste la chrome. via JS (tabella utenti/azioni) -> parita' funzionale assoluta. BI veste la chrome.
Path ../ perche' questa pagina vive in /admin/. --> Path ../ perche' questa pagina vive in /admin/. -->
<link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="../css/style.css"> <link rel="stylesheet" href="../css/style.css?v=20260613">
<style> <style>
.role-badge { .role-badge {
display: inline-flex; display: inline-flex;
@@ -156,8 +156,8 @@
</main> </main>
</div> </div>
<script src="../js/api.js"></script> <script src="../js/api.js?v=20260613"></script>
<script src="../js/common.js"></script> <script src="../js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -167,8 +167,8 @@
bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="../js/common-bi.js"></script> <script src="../js/common-bi.js?v=20260613"></script>
<script src="../js/i18n.js"></script> <script src="../js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -9,7 +9,7 @@
via JS (tabella utenti/azioni) -> parita' funzionale assoluta. BI veste la chrome. via JS (tabella utenti/azioni) -> parita' funzionale assoluta. BI veste la chrome.
Path ../ perche' questa pagina vive in /admin/. --> Path ../ perche' questa pagina vive in /admin/. -->
<link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="../vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="../css/style.css"> <link rel="stylesheet" href="../css/style.css?v=20260613">
<style> <style>
.role-badge { .role-badge {
display: inline-flex; display: inline-flex;
@@ -156,8 +156,8 @@
</main> </main>
</div> </div>
<script src="../js/api.js"></script> <script src="../js/api.js?v=20260613"></script>
<script src="../js/common.js"></script> <script src="../js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -167,8 +167,8 @@
bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('../vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="../js/common-bi.js"></script> <script src="../js/common-bi.js?v=20260613"></script>
<script src="../js/i18n.js"></script> <script src="../js/i18n.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Architettura - NIS2 Agile</title> <title>Architettura - NIS2 Agile</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
/* ── Architecture Page Styles ────────────────────────────────── */ /* ── Architecture Page Styles ────────────────────────────────── */
@@ -954,7 +954,7 @@
<div class="module-card"> <div class="module-card">
<div class="module-ref">Art. 23</div> <div class="module-ref">Art. 23</div>
<h4>Gestione Incidenti</h4> <h4>Gestione Incidenti</h4>
<p>Timeline di notifica NIS2 completa: pre-allarme 24h, notifica 72h, relazione finale 30 giorni.</p> <p>Timeline di notifica NIS2 completa: pre-allarme 24h, notifica 72h, relazione finale 1 mese.</p>
</div> </div>
<div class="module-card"> <div class="module-card">
<div class="module-ref">Art. 21</div> <div class="module-ref">Art. 21</div>
@@ -1075,10 +1075,10 @@
</main> </main>
</div> </div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script src="js/i18n.js"></script> <script src="js/i18n.js?v=20260613"></script>
<script src="js/help.js"></script> <script src="js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (wizard/form/gauge) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (wizard/form/gauge) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
</head> </head>
<body> <body>
<div class="app-layout"> <div class="app-layout">
@@ -141,8 +141,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -152,9 +152,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (wizard/form/gauge) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (wizard/form/gauge) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
</head> </head>
<body> <body>
<div class="app-layout"> <div class="app-layout">
@@ -141,8 +141,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -152,9 +152,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Stats Cards ────────────────────────────────────────── */ /* ── Stats Cards ────────────────────────────────────────── */
.asset-stats { .asset-stats {
@@ -353,8 +353,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -364,9 +364,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Stats Cards ────────────────────────────────────────── */ /* ── Stats Cards ────────────────────────────────────────── */
.asset-stats { .asset-stats {
@@ -353,8 +353,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -364,9 +364,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -6,7 +6,7 @@
<title>Le Mie Aziende - NIS2 Agile</title> <title>Le Mie Aziende - NIS2 Agile</title>
<!-- Bootstrap Italia v2.18.1 self-hostato (MAI CDN). Caricato PRIMA di style.css: BI veste la chrome/sidebar, style.css resta autorevole per i widget. --> <!-- Bootstrap Italia v2.18.1 self-hostato (MAI CDN). Caricato PRIMA di style.css: BI veste la chrome/sidebar, style.css resta autorevole per i widget. -->
<link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
.companies-header { .companies-header {
display: flex; display: flex;
@@ -336,14 +336,14 @@
</main> </main>
</div> </div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle + override sidebar BI (common-bi.js dopo common.js: ridefinisce solo loadSidebar) --> <!-- 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 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>if (window.bootstrap && bootstrap.loadFonts) { bootstrap.loadFonts('vendor/bootstrap-italia/dist/fonts'); }</script>
<script src="js/common-bi.js"></script> <script src="js/common-bi.js?v=20260613"></script>
<script src="js/i18n.js"></script> <script src="js/i18n.js?v=20260613"></script>
<script src="js/help.js"></script> <script src="js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+9 -9
View File
@@ -6,7 +6,7 @@
<title>Le Mie Aziende - NIS2 Agile</title> <title>Le Mie Aziende - NIS2 Agile</title>
<!-- Bootstrap Italia v2.18.1 self-hostato (MAI CDN). Caricato PRIMA di style.css: BI veste la chrome/sidebar, style.css resta autorevole per i widget. --> <!-- Bootstrap Italia v2.18.1 self-hostato (MAI CDN). Caricato PRIMA di style.css: BI veste la chrome/sidebar, style.css resta autorevole per i widget. -->
<link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
.companies-header { .companies-header {
display: flex; display: flex;
@@ -279,7 +279,7 @@
<div class="page-container"> <div class="page-container">
<!-- Page Header --> <!-- Page Header -->
<div class="companies-header"> <div class="companies-header" id="nis2-companies-header">
<div> <div>
<h1>Le Mie Aziende</h1> <h1>Le Mie Aziende</h1>
<p style="color:var(--gray-500);font-size:.9rem;margin-top:2px;">Gestisci il portafoglio clienti e monitora la compliance NIS2</p> <p style="color:var(--gray-500);font-size:.9rem;margin-top:2px;">Gestisci il portafoglio clienti e monitora la compliance NIS2</p>
@@ -289,7 +289,7 @@
<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z" clip-rule="evenodd"/></svg> <svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z" clip-rule="evenodd"/></svg>
<input type="text" class="form-input" id="search-input" placeholder="Cerca azienda..." oninput="filterCompanies(this.value)"> <input type="text" class="form-input" id="search-input" placeholder="Cerca azienda..." oninput="filterCompanies(this.value)">
</div> </div>
<a href="onboarding.html" class="btn btn-primary"> <a href="onboarding.html" class="btn btn-primary" id="nis2-companies-add-btn">
<svg width="18" height="18" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd"/></svg> <svg width="18" height="18" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd"/></svg>
Aggiungi Cliente Aggiungi Cliente
</a> </a>
@@ -326,7 +326,7 @@
</svg> </svg>
<h3>Nessuna azienda ancora</h3> <h3>Nessuna azienda ancora</h3>
<p>Aggiungi il tuo primo cliente per iniziare a monitorare la compliance NIS2.</p> <p>Aggiungi il tuo primo cliente per iniziare a monitorare la compliance NIS2.</p>
<a href="onboarding.html" class="btn btn-primary"> <a href="onboarding.html" class="btn btn-primary" id="nis2-companies-add-first-btn">
<svg width="18" height="18" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd"/></svg> <svg width="18" height="18" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd"/></svg>
Aggiungi Primo Cliente Aggiungi Primo Cliente
</a> </a>
@@ -336,14 +336,14 @@
</main> </main>
</div> </div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle + override sidebar BI (common-bi.js dopo common.js: ridefinisce solo loadSidebar) --> <!-- 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 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>if (window.bootstrap && bootstrap.loadFonts) { bootstrap.loadFonts('vendor/bootstrap-italia/dist/fonts'); }</script>
<script src="js/common-bi.js"></script> <script src="js/common-bi.js?v=20260613"></script>
<script src="js/i18n.js"></script> <script src="js/i18n.js?v=20260613"></script>
<script src="js/help.js"></script> <script src="js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+5 -5
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (chat/portfolio/storico) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (chat/portfolio/storico) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
:root { :root {
--nis2-cyan: #06B6D4; --nis2-cyan: #06B6D4;
@@ -369,8 +369,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -380,8 +380,8 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script> <script>
const SPRITE = '/vendor/bootstrap-italia/dist/svg/sprites.svg'; 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>`; } function ico(name, cls) { return `<svg class="ico ${cls||''}" aria-hidden="true"><use href="${SPRITE}#${name}"></use></svg>`; }
+5 -5
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (chat/portfolio/storico) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (chat/portfolio/storico) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
:root { :root {
--nis2-cyan: #06B6D4; --nis2-cyan: #06B6D4;
@@ -369,8 +369,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -380,8 +380,8 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script> <script>
const SPRITE = '/vendor/bootstrap-italia/dist/svg/sprites.svg'; 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>`; } function ico(name, cls) { return `<svg class="ico ${cls||''}" aria-hidden="true"><use href="${SPRITE}#${name}"></use></svg>`; }
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (card/gauge/stat/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (card/gauge/stat/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
</head> </head>
<body> <body>
<div class="app-layout"> <div class="app-layout">
@@ -130,8 +130,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -141,9 +141,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+9 -9
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (card/gauge/stat/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (card/gauge/stat/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
</head> </head>
<body> <body>
<div class="app-layout"> <div class="app-layout">
@@ -82,17 +82,17 @@
</div> </div>
<!-- Quick Actions --> <!-- Quick Actions -->
<div class="card mb-24"> <div class="card mb-24" id="nis2-dashboard-quick-actions">
<div class="card-header"> <div class="card-header">
<h3>Azioni Rapide</h3> <h3>Azioni Rapide</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="quick-actions"> <div class="quick-actions">
<button class="quick-action-btn" onclick="window.location.href='assessment.html'"> <button class="quick-action-btn" id="nis2-dashboard-qa-assessment" onclick="window.location.href='assessment.html'">
<svg viewBox="0 0 20 20" fill="currentColor" width="20" height="20"><path fill-rule="evenodd" d="M10 5a1 1 0 011 1v3h3a1 1 0 110 2h-3v3a1 1 0 11-2 0v-3H6a1 1 0 110-2h3V6a1 1 0 011-1z" clip-rule="evenodd"/></svg> <svg viewBox="0 0 20 20" fill="currentColor" width="20" height="20"><path fill-rule="evenodd" d="M10 5a1 1 0 011 1v3h3a1 1 0 110 2h-3v3a1 1 0 11-2 0v-3H6a1 1 0 110-2h3V6a1 1 0 011-1z" clip-rule="evenodd"/></svg>
Nuovo Assessment Nuovo Assessment
</button> </button>
<button class="quick-action-btn" onclick="window.location.href='incidents.html'"> <button class="quick-action-btn" id="nis2-dashboard-qa-incidente" onclick="window.location.href='incidents.html'">
<svg viewBox="0 0 20 20" fill="currentColor" width="20" height="20"><path d="M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6z"/></svg> <svg viewBox="0 0 20 20" fill="currentColor" width="20" height="20"><path d="M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6z"/></svg>
Registra Incidente Registra Incidente
</button> </button>
@@ -130,8 +130,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -141,9 +141,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+1 -1
View File
@@ -60,7 +60,7 @@
</script> </script>
<!-- Stessa logica della forgot-password.html: ZERO modifiche backend --> <!-- Stessa logica della forgot-password.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script> <script>
const form = document.getElementById('forgot-form'); const form = document.getElementById('forgot-form');
const err = document.getElementById('err'); const err = document.getElementById('err');
+1 -1
View File
@@ -60,7 +60,7 @@
</script> </script>
<!-- Stessa logica della forgot-password.html: ZERO modifiche backend --> <!-- Stessa logica della forgot-password.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script> <script>
const form = document.getElementById('forgot-form'); const form = document.getElementById('forgot-form');
const err = document.getElementById('err'); const err = document.getElementById('err');
+6 -6
View File
@@ -7,7 +7,7 @@
<!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css <!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css
cosi' style.css resta autorevole per la chrome (sidebar/widget). BI veste la guida. --> cosi' style.css resta autorevole per la chrome (sidebar/widget). BI veste la guida. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Stili specifici guida (callout normativi/esempi) ──────── */ /* ── Stili specifici guida (callout normativi/esempi) ──────── */
.guide-wrap { max-width: 940px; margin: 0 auto; } .guide-wrap { max-width: 940px; margin: 0 auto; }
@@ -1129,8 +1129,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (accordion) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (accordion) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. --> 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> <script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
@@ -1139,9 +1139,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// La guida è accessibile anche da non autenticati (utile per onboarding) // La guida è accessibile anche da non autenticati (utile per onboarding)
// ma se sei loggato carichi sidebar + i18n normalmente. Stessa logica // ma se sei loggato carichi sidebar + i18n normalmente. Stessa logica
+6 -6
View File
@@ -7,7 +7,7 @@
<!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css <!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css
cosi' style.css resta autorevole per la chrome (sidebar/widget). BI veste la guida. --> cosi' style.css resta autorevole per la chrome (sidebar/widget). BI veste la guida. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Stili specifici guida (callout normativi/esempi) ──────── */ /* ── Stili specifici guida (callout normativi/esempi) ──────── */
.guide-wrap { max-width: 940px; margin: 0 auto; } .guide-wrap { max-width: 940px; margin: 0 auto; }
@@ -1129,8 +1129,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (accordion) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (accordion) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. --> 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> <script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
@@ -1139,9 +1139,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// La guida è accessibile anche da non autenticati (utile per onboarding) // La guida è accessibile anche da non autenticati (utile per onboarding)
// ma se sei loggato carichi sidebar + i18n normalmente. Stessa logica // ma se sei loggato carichi sidebar + i18n normalmente. Stessa logica
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/decision-tree/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/decision-tree/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Filters Bar ─────────────────────────────────────── */ /* ── Filters Bar ─────────────────────────────────────── */
.filters-bar { .filters-bar {
@@ -338,8 +338,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -349,9 +349,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ────────────────────────────────────────────── // ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/decision-tree/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/decision-tree/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Filters Bar ─────────────────────────────────────── */ /* ── Filters Bar ─────────────────────────────────────── */
.filters-bar { .filters-bar {
@@ -338,8 +338,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -349,9 +349,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ────────────────────────────────────────────── // ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+1 -1
View File
@@ -835,7 +835,7 @@
<div class="problema-card"> <div class="problema-card">
<div class="problema-icon icon-cyan"><i class="fa-solid fa-clock"></i></div> <div class="problema-icon icon-cyan"><i class="fa-solid fa-clock"></i></div>
<h3>Strict deadlines</h3> <h3>Strict deadlines</h3>
<p>Significant incident notification: early warning within <strong style="color:var(--text-white)">24h</strong>, formal notification within <strong style="color:var(--text-white)">72h</strong>, final report within <strong style="color:var(--text-white)">30 days</strong>. No possibility of derogation.</p> <p>Significant incident notification: early warning within <strong style="color:var(--text-white)">24h</strong>, formal notification within <strong style="color:var(--text-white)">72h</strong>, final report within <strong style="color:var(--text-white)">1 month</strong>. No possibility of derogation.</p>
<span class="tag-badge tag-cyan">Article 23 NIS2</span> <span class="tag-badge tag-cyan">Article 23 NIS2</span>
</div> </div>
</div> </div>
+1 -1
View File
@@ -850,7 +850,7 @@
<div class="problema-card"> <div class="problema-card">
<div class="problema-icon icon-cyan"><i class="fa-solid fa-clock"></i></div> <div class="problema-icon icon-cyan"><i class="fa-solid fa-clock"></i></div>
<h3>Scadenze stringenti</h3> <h3>Scadenze stringenti</h3>
<p>Notifica incidenti significativi: early warning in <strong style="color:var(--text-white)">24h</strong>, notifica formale in <strong style="color:var(--text-white)">72h</strong>, report finale in <strong style="color:var(--text-white)">30 giorni</strong>. Nessuna possibilità di deroga.</p> <p>Notifica incidenti significativi: early warning in <strong style="color:var(--text-white)">24h</strong>, notifica formale in <strong style="color:var(--text-white)">72h</strong>, report finale in <strong style="color:var(--text-white)">1 mese</strong>. Nessuna possibilità di deroga.</p>
<span class="tag-badge tag-cyan">Art. 23 NIS2</span> <span class="tag-badge tag-cyan">Art. 23 NIS2</span>
</div> </div>
</div> </div>
+3 -3
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>NIS2 Agile — Integrazioni Esterne</title> <title>NIS2 Agile — Integrazioni Esterne</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
/* ── Page-specific overrides ── */ /* ── Page-specific overrides ── */
.integ-hero { .integ-hero {
@@ -897,8 +897,8 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
</main> </main>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script src="js/i18n.js"></script> <script src="js/i18n.js?v=20260613"></script>
<script> <script>
function showTab(id) { function showTab(id) {
document.querySelectorAll('.tab-btn').forEach((b, i) => { document.querySelectorAll('.tab-btn').forEach((b, i) => {
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (wizard/SoA/tabelle) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (wizard/SoA/tabelle) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.isms-intro { background:#eff6ff; border-left:4px solid var(--primary,#2563eb); padding:14px 18px; border-radius:8px; margin-bottom:20px; font-size:.92rem; line-height:1.6; } .isms-intro { background:#eff6ff; border-left:4px solid var(--primary,#2563eb); padding:14px 18px; border-radius:8px; margin-bottom:20px; font-size:.92rem; line-height:1.6; }
.isms-steps { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px; } .isms-steps { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px; }
@@ -171,8 +171,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -182,9 +182,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script src="/js/isms.js"></script> <script src="/js/isms.js"></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (wizard/SoA/tabelle) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (wizard/SoA/tabelle) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.isms-intro { background:#eff6ff; border-left:4px solid var(--primary,#2563eb); padding:14px 18px; border-radius:8px; margin-bottom:20px; font-size:.92rem; line-height:1.6; } .isms-intro { background:#eff6ff; border-left:4px solid var(--primary,#2563eb); padding:14px 18px; border-radius:8px; margin-bottom:20px; font-size:.92rem; line-height:1.6; }
.isms-steps { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px; } .isms-steps { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px; }
@@ -56,7 +56,7 @@
<h2 data-i18n="isms.title">Modello Organizzativo SGSI (ISO 27001)</h2> <h2 data-i18n="isms.title">Modello Organizzativo SGSI (ISO 27001)</h2>
<div class="content-header-actions"> <div class="content-header-actions">
<span class="savehint" id="isms-savehint" role="status" aria-live="polite"></span> <span class="savehint" id="isms-savehint" role="status" aria-live="polite"></span>
<button class="btn btn-outline btn-sm" onclick="ismsExportView()" data-i18n="isms.export"> <button class="btn btn-outline btn-sm" id="nis2-isms-btn-export" onclick="ismsExportView()" data-i18n="isms.export">
<svg class="icon icon-sm" aria-hidden="true"><use href="/vendor/bootstrap-italia/dist/svg/sprites.svg#it-file"></use></svg> <svg class="icon icon-sm" aria-hidden="true"><use href="/vendor/bootstrap-italia/dist/svg/sprites.svg#it-file"></use></svg>
<span>Esporta SGSI</span> <span>Esporta SGSI</span>
</button> </button>
@@ -64,11 +64,11 @@
</header> </header>
<div class="content-body"> <div class="content-body">
<div class="isms-intro"> <div class="isms-intro" id="nis2-isms-intro">
<strong data-i18n="isms.intro.title">Costruisci il tuo Sistema di Gestione della Sicurezza delle Informazioni.</strong> <strong data-i18n="isms.intro.title">Costruisci il tuo Sistema di Gestione della Sicurezza delle Informazioni.</strong>
<span data-i18n="isms.intro.body">Procedura guidata ISO/IEC 27001:2022 (clausole 4-10 + Statement of Applicability). Lo Statement of Applicability viene pre-popolato dalle tue risposte alla Gap Analysis NIS2. Attiva le estensioni cloud ISO 27017/27018 dove pertinenti.</span> <span data-i18n="isms.intro.body">Procedura guidata ISO/IEC 27001:2022 (clausole 4-10 + Statement of Applicability). Lo Statement of Applicability viene pre-popolato dalle tue risposte alla Gap Analysis NIS2. Attiva le estensioni cloud ISO 27017/27018 dove pertinenti.</span>
</div> </div>
<div class="isms-disclaimer" data-i18n="isms.disclaimer">Strumento di supporto e pre-audit: non costituisce una certificazione ISO 27001 né un parere professionale vincolante. Gli obblighi normativi in Italia derivano da NIS2 / D.Lgs. 138/2024 / Determinazioni ACN; ISO 27001/27017/27018 sono best practice.</div> <div class="isms-disclaimer" id="nis2-isms-disclaimer" data-i18n="isms.disclaimer">Strumento di supporto e pre-audit: non costituisce una certificazione ISO 27001 né un parere professionale vincolante. Gli obblighi normativi in Italia derivano da NIS2 / D.Lgs. 138/2024 / Determinazioni ACN; ISO 27001/27017/27018 sono best practice.</div>
<div class="isms-steps" id="isms-steps"></div> <div class="isms-steps" id="isms-steps"></div>
@@ -88,7 +88,7 @@
<label><input type="checkbox" id="f-cloud-provider"> <span data-i18n="isms.s1.cloud_provider">Siamo fornitori di servizi cloud → ISO 27017 (lato provider)</span></label> <label><input type="checkbox" id="f-cloud-provider"> <span data-i18n="isms.s1.cloud_provider">Siamo fornitori di servizi cloud → ISO 27017 (lato provider)</span></label>
<label><input type="checkbox" id="f-pii-cloud"> <span data-i18n="isms.s1.pii_cloud">Trattiamo dati personali (PII) in cloud pubblico come responsabili → ISO 27018</span></label> <label><input type="checkbox" id="f-pii-cloud"> <span data-i18n="isms.s1.pii_cloud">Trattiamo dati personali (PII) in cloud pubblico come responsabili → ISO 27018</span></label>
</div> </div>
<button class="btn btn-primary" onclick="saveStep1()" data-i18n="isms.save_next">Salva e continua</button> <button class="btn btn-primary" id="nis2-isms-btn-save-step1" onclick="saveStep1()" data-i18n="isms.save_next">Salva e continua</button>
</div></div> </div></div>
</div> </div>
@@ -102,9 +102,9 @@
<input id="r-name" placeholder="Ruolo (es. CISO)" aria-label="Ruolo" style="flex:1 1 160px;"> <input id="r-name" placeholder="Ruolo (es. CISO)" aria-label="Ruolo" style="flex:1 1 160px;">
<input id="r-resp" placeholder="Responsabilità" aria-label="Responsabilità" style="flex:2 1 220px;"> <input id="r-resp" placeholder="Responsabilità" aria-label="Responsabilità" style="flex:2 1 220px;">
<select id="r-raci" aria-label="RACI"><option value="">RACI</option><option>R</option><option>A</option><option>C</option><option>I</option></select> <select id="r-raci" aria-label="RACI"><option value="">RACI</option><option>R</option><option>A</option><option>C</option><option>I</option></select>
<button class="btn btn-sm btn-primary" onclick="addRole()" data-i18n="isms.s2.add">Aggiungi ruolo</button> <button class="btn btn-sm btn-primary" id="nis2-isms-btn-add-role" onclick="addRole()" data-i18n="isms.s2.add">Aggiungi ruolo</button>
</div> </div>
<button class="btn btn-outline" style="margin-top:14px;" onclick="goStep(2)" data-i18n="isms.next">Continua</button> <button class="btn btn-outline" id="nis2-isms-btn-next-step2" style="margin-top:14px;" onclick="goStep(2)" data-i18n="isms.next">Continua</button>
</div></div> </div></div>
</div> </div>
@@ -115,7 +115,7 @@
<div class="isms-field"><label for="f-method" data-i18n="isms.s3.method">Metodologia di risk assessment</label><textarea id="f-method" rows="3" placeholder="Es. ISO 27005 / NIST SP 800-30; scala probabilità×impatto 5×5 (già usata nel modulo Rischi)."></textarea></div> <div class="isms-field"><label for="f-method" data-i18n="isms.s3.method">Metodologia di risk assessment</label><textarea id="f-method" rows="3" placeholder="Es. ISO 27005 / NIST SP 800-30; scala probabilità×impatto 5×5 (già usata nel modulo Rischi)."></textarea></div>
<div class="isms-field"><label for="f-objectives" data-i18n="isms.s3.objectives">Obiettivi del SGSI (uno per riga)</label><textarea id="f-objectives" rows="3"></textarea></div> <div class="isms-field"><label for="f-objectives" data-i18n="isms.s3.objectives">Obiettivi del SGSI (uno per riga)</label><textarea id="f-objectives" rows="3"></textarea></div>
<p class="text-muted" data-i18n="isms.s3.link">Il registro dei rischi vive nel modulo <a href="risks.html">Rischi</a>: questo passo ne dichiara la metodologia.</p> <p class="text-muted" data-i18n="isms.s3.link">Il registro dei rischi vive nel modulo <a href="risks.html">Rischi</a>: questo passo ne dichiara la metodologia.</p>
<button class="btn btn-primary" onclick="saveStep3()" data-i18n="isms.save_next">Salva e continua</button> <button class="btn btn-primary" id="nis2-isms-btn-save-step3" onclick="saveStep3()" data-i18n="isms.save_next">Salva e continua</button>
</div></div> </div></div>
</div> </div>
@@ -125,11 +125,11 @@
<h3 data-i18n="isms.s4.title">4. Statement of Applicability</h3> <h3 data-i18n="isms.s4.title">4. Statement of Applicability</h3>
<p class="text-muted" data-i18n="isms.s4.hint">I controlli sono pre-popolati dalle risposte NIS2 dove esiste corrispondenza (badge "da NIS2"). Conferma applicabilità, stato e motivazione per ciascuno.</p> <p class="text-muted" data-i18n="isms.s4.hint">I controlli sono pre-popolati dalle risposte NIS2 dove esiste corrispondenza (badge "da NIS2"). Conferma applicabilità, stato e motivazione per ciascuno.</p>
<div style="margin:10px 0;"> <div style="margin:10px 0;">
<button class="btn btn-sm btn-outline" onclick="deriveSoa()" data-i18n="isms.s4.derive">Ri-deriva dal NIS2</button> <button class="btn btn-sm btn-outline" id="nis2-isms-btn-derive-soa" onclick="deriveSoa()" data-i18n="isms.s4.derive">Ri-deriva dal NIS2</button>
<span id="soa-stats" class="text-muted" style="margin-left:12px; font-size:.85rem;"></span> <span id="soa-stats" class="text-muted" style="margin-left:12px; font-size:.85rem;"></span>
</div> </div>
<div id="soa-groups"></div> <div id="soa-groups"></div>
<button class="btn btn-outline" style="margin-top:14px;" onclick="goStep(4)" data-i18n="isms.next">Continua</button> <button class="btn btn-outline" id="nis2-isms-btn-next-step4" style="margin-top:14px;" onclick="goStep(4)" data-i18n="isms.next">Continua</button>
</div></div> </div></div>
</div> </div>
@@ -151,7 +151,7 @@
</div> </div>
<div class="savehint" id="aigen-hint" role="status" aria-live="polite"></div> <div class="savehint" id="aigen-hint" role="status" aria-live="polite"></div>
<div id="docs-list" style="margin-top:14px;"></div> <div id="docs-list" style="margin-top:14px;"></div>
<button class="btn btn-outline" style="margin-top:14px;" onclick="goStep(5)" data-i18n="isms.next">Continua</button> <button class="btn btn-outline" id="nis2-isms-btn-next-step5" style="margin-top:14px;" onclick="goStep(5)" data-i18n="isms.next">Continua</button>
</div></div> </div></div>
</div> </div>
@@ -171,8 +171,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -182,9 +182,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script src="/js/isms.js"></script> <script src="/js/isms.js"></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -196,10 +196,10 @@
try { if (typeof api !== 'undefined' && api) { api.token = djwt; if (orgv) api.orgId = orgv; } } catch (e3) { /* noop */ } try { if (typeof api !== 'undefined' && api) { api.token = djwt; if (orgv) api.orgId = orgv; } } catch (e3) { /* noop */ }
} }
} catch (e1) { /* noop */ } } catch (e1) { /* noop */ }
var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css'; document.head.appendChild(css); var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css?v=20260613'; document.head.appendChild(css);
var inject = function () { var inject = function () {
var s1 = document.createElement('script'); s1.src = '/js/demo-selectors.js'; var s1 = document.createElement('script'); s1.src = '/js/demo-selectors.js?v=20260613';
s1.onload = function () { var s2 = document.createElement('script'); s2.src = '/js/demo-mode.js'; document.body.appendChild(s2); }; s1.onload = function () { var s2 = document.createElement('script'); s2.src = '/js/demo-mode.js?v=20260613'; document.body.appendChild(s2); };
document.body.appendChild(s1); document.body.appendChild(s1);
}; };
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', inject); else inject(); if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', inject); else inject();
+1 -1
View File
@@ -948,7 +948,7 @@ function switchLang(lang) {
if (!window.__nexusWidgetLoaded) { if (!window.__nexusWidgetLoaded) {
window.__nexusWidgetLoaded = true; window.__nexusWidgetLoaded = true;
var s = document.createElement('script'); var s = document.createElement('script');
s.src = 'js/bug-reporter.js?v=20260411'; s.src = 'js/bug-reporter.js?v=20260613';
s.async = true; s.async = true;
s.dataset.product = 'NIS2'; s.dataset.product = 'NIS2';
s.dataset.tenantId = '7'; s.dataset.tenantId = '7';
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (lista doc, search) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (lista doc, search) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.kb-scope-radios { display: flex; gap: 18px; flex-wrap: wrap; font-size: .9rem; } .kb-scope-radios { display: flex; gap: 18px; flex-wrap: wrap; font-size: .9rem; }
.kb-scope-radios label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; } .kb-scope-radios label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
@@ -138,8 +138,8 @@
</div> </div>
<!-- Stessa logica JS della pagina live (parita' funzionale assoluta, zero backend). --> <!-- Stessa logica JS della pagina live (parita' funzionale assoluta, zero backend). -->
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. --> 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> <script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
@@ -148,9 +148,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script src="/js/kb.js"></script> <script src="/js/kb.js"></script>
<script> <script>
// Gate auth + chrome come le altre pagine -bi. // Gate auth + chrome come le altre pagine -bi.
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (lista doc, search) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (lista doc, search) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.kb-scope-radios { display: flex; gap: 18px; flex-wrap: wrap; font-size: .9rem; } .kb-scope-radios { display: flex; gap: 18px; flex-wrap: wrap; font-size: .9rem; }
.kb-scope-radios label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; } .kb-scope-radios label { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
@@ -138,8 +138,8 @@
</div> </div>
<!-- Stessa logica JS della pagina live (parita' funzionale assoluta, zero backend). --> <!-- Stessa logica JS della pagina live (parita' funzionale assoluta, zero backend). -->
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI. --> 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> <script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
@@ -148,9 +148,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script src="/js/kb.js"></script> <script src="/js/kb.js"></script>
<script> <script>
// Gate auth + chrome come le altre pagine -bi. // Gate auth + chrome come le altre pagine -bi.
+2 -2
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>NIS2 Agile — Gestione Licenze</title> <title>NIS2 Agile — Gestione Licenze</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
/* ── Layout ── */ /* ── Layout ── */
body { background: var(--bg-main); } body { background: var(--bg-main); }
@@ -502,7 +502,7 @@ body { background: var(--bg-main); }
<div id="toast"></div> <div id="toast"></div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script> <script>
// ══════════════════════════════════════════════════════ // ══════════════════════════════════════════════════════
// CONFIG // CONFIG
+2 -2
View File
@@ -81,8 +81,8 @@
</script> </script>
<!-- Stessa logica della login attuale: ZERO modifiche backend --> <!-- Stessa logica della login attuale: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard-bi.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard-bi.html'; }
+2 -2
View File
@@ -81,8 +81,8 @@
</script> </script>
<!-- Stessa logica della login attuale: ZERO modifiche backend --> <!-- Stessa logica della login attuale: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
+2 -2
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>NIS2 Agile — License API · Documentazione Marketing</title> <title>NIS2 Agile — License API · Documentazione Marketing</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<style> <style>
.doc-layout { max-width: 860px; margin: 0 auto; padding: 2rem 1.5rem; } .doc-layout { max-width: 860px; margin: 0 auto; padding: 2rem 1.5rem; }
.doc-hero { .doc-hero {
@@ -411,6 +411,6 @@ curl https://nis2.agile.software/api/services/status</pre>
</div> </div>
</div> </div>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (card aggiornamenti/badge/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (card aggiornamenti/badge/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.impact-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; } .impact-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; }
.impact-critical { background: var(--danger-bg); color: var(--danger); } .impact-critical { background: var(--danger-bg); color: var(--danger); }
@@ -99,8 +99,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -110,9 +110,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (card aggiornamenti/badge/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (card aggiornamenti/badge/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.impact-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; } .impact-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; }
.impact-critical { background: var(--danger-bg); color: var(--danger); } .impact-critical { background: var(--danger-bg); color: var(--danger); }
@@ -99,8 +99,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -110,9 +110,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
+2 -2
View File
@@ -424,8 +424,8 @@
</script> </script>
<!-- Stessa logica della onboarding.html: ZERO modifiche backend --> <!-- Stessa logica della onboarding.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
// ── Auth check ────────────────────────────────────────────────── // ── Auth check ──────────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -424,8 +424,8 @@
</script> </script>
<!-- Stessa logica della onboarding.html: ZERO modifiche backend --> <!-- Stessa logica della onboarding.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
// ── Auth check ────────────────────────────────────────────────── // ── Auth check ──────────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/editor/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/editor/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Policy Page Styles ──────────────────────────────────── */ /* ── Policy Page Styles ──────────────────────────────────── */
.filters-bar { .filters-bar {
@@ -320,8 +320,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -331,9 +331,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+11 -11
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/editor/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/editor/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Policy Page Styles ──────────────────────────────────── */ /* ── Policy Page Styles ──────────────────────────────────── */
.filters-bar { .filters-bar {
@@ -248,19 +248,19 @@
<header class="content-header"> <header class="content-header">
<h1 class="h2" data-i18n="policies.title">Gestione Policy</h1> <h1 class="h2" data-i18n="policies.title">Gestione Policy</h1>
<div class="content-header-actions"> <div class="content-header-actions">
<button class="btn btn-outline" onclick="openAIGenerateModal()"> <button id="nis2-policies-btn-ai-generate" class="btn btn-outline" onclick="openAIGenerateModal()">
<svg viewBox="0 0 20 20" fill="currentColor" width="16" height="16"><path d="M5 2a1 1 0 011 1v1h1a1 1 0 010 2H6v1a1 1 0 01-2 0V6H3a1 1 0 010-2h1V3a1 1 0 011-1zm0 10a1 1 0 011 1v1h1a1 1 0 110 2H6v1a1 1 0 11-2 0v-1H3a1 1 0 110-2h1v-1a1 1 0 011-1zm7-10a1 1 0 01.967.744L14.146 7.2 17.5 8.512a1 1 0 010 1.836l-3.354 1.311-1.18 4.456a1 1 0 01-1.932 0L9.854 11.66 6.5 10.348a1 1 0 010-1.836l3.354-1.311 1.18-4.456A1 1 0 0112 2z"/></svg> <svg viewBox="0 0 20 20" fill="currentColor" width="16" height="16"><path d="M5 2a1 1 0 011 1v1h1a1 1 0 010 2H6v1a1 1 0 01-2 0V6H3a1 1 0 010-2h1V3a1 1 0 011-1zm0 10a1 1 0 011 1v1h1a1 1 0 110 2H6v1a1 1 0 11-2 0v-1H3a1 1 0 110-2h1v-1a1 1 0 011-1zm7-10a1 1 0 01.967.744L14.146 7.2 17.5 8.512a1 1 0 010 1.836l-3.354 1.311-1.18 4.456a1 1 0 01-1.932 0L9.854 11.66 6.5 10.348a1 1 0 010-1.836l3.354-1.311 1.18-4.456A1 1 0 0112 2z"/></svg>
Genera con AI Genera con AI
</button> </button>
<button class="btn btn-primary" onclick="openCreateModal()">+ Nuova Policy</button> <button id="nis2-policies-btn-new" class="btn btn-primary" onclick="openCreateModal()">+ Nuova Policy</button>
</div> </div>
</header> </header>
<div class="content-body" id="page-content"> <div class="content-body" id="page-content">
<!-- Tabs --> <!-- Tabs -->
<div class="tabs"> <div class="tabs" id="nis2-policies-tabs">
<button class="tab-btn active" onclick="switchTab('list')">Elenco Policy</button> <button id="nis2-policies-tab-btn-list" class="tab-btn active" onclick="switchTab('list')">Elenco Policy</button>
<button class="tab-btn" onclick="switchTab('templates')">Template</button> <button id="nis2-policies-tab-btn-templates" class="tab-btn" onclick="switchTab('templates')">Template</button>
</div> </div>
<!-- Tab: Lista Policy --> <!-- Tab: Lista Policy -->
@@ -320,8 +320,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -331,9 +331,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+3 -3
View File
@@ -965,7 +965,7 @@
<ul style="list-style: none; padding: 0;"> <ul style="list-style: none; padding: 0;">
<li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>24h Early Warning</li> <li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>24h Early Warning</li>
<li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>72h Notification</li> <li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>72h Notification</li>
<li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>30d Final Report</li> <li style="font-size: 11.5px; color: var(--text); padding: 3px 0;"><i class="fa-solid fa-check" style="color: var(--green); font-size: 10px; margin-right: 6px;"></i>1 mese Final Report</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -1199,7 +1199,7 @@
<div class="step-icon bg-blue text-blue border-blue" style="border: 2px solid rgba(59,130,246,0.4);"> <div class="step-icon bg-blue text-blue border-blue" style="border: 2px solid rgba(59,130,246,0.4);">
<i class="fa-solid fa-file-circle-check"></i> <i class="fa-solid fa-file-circle-check"></i>
</div> </div>
<div class="step-time text-blue">30d</div> <div class="step-time text-blue">1 mese</div>
<div class="step-title">Final Report</div> <div class="step-title">Final Report</div>
<div class="step-desc">Report finale dettagliato: root cause analysis, misure adottate, lezioni apprese, piano miglioramento.</div> <div class="step-desc">Report finale dettagliato: root cause analysis, misure adottate, lezioni apprese, piano miglioramento.</div>
</div> </div>
@@ -1309,7 +1309,7 @@
<span class="key">3. TEMPISTICHE DI NOTIFICA (Art. 23)</span> <span class="key">3. TEMPISTICHE DI NOTIFICA (Art. 23)</span>
<span class="dim">T+24h</span> <span class="val">Early Warning al CSIRT nazionale</span> <span class="dim">T+24h</span> <span class="val">Early Warning al CSIRT nazionale</span>
<span class="dim">T+72h</span> <span class="val">Notifica completa con IoC</span> <span class="dim">T+72h</span> <span class="val">Notifica completa con IoC</span>
<span class="dim">T+30d</span> <span class="val">Report finale con root cause</span> <span class="dim">T+1 mese</span> <span class="val">Report finale con root cause</span>
<br> <br>
<span class="key">4. RUOLI E RESPONSABILITA</span> <span class="key">4. RUOLI E RESPONSABILITA</span>
<span class="val">CISO: coordinamento risposta incidenti</span> <span class="val">CISO: coordinamento risposta incidenti</span>
+2 -2
View File
@@ -255,8 +255,8 @@
</script> </script>
<!-- Stessa logica della register.html: ZERO modifiche backend --> <!-- Stessa logica della register.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard-bi.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard-bi.html'; }
+2 -2
View File
@@ -255,8 +255,8 @@
</script> </script>
<!-- Stessa logica della register.html: ZERO modifiche backend --> <!-- Stessa logica della register.html: ZERO modifiche backend -->
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Tab Navigation ─────────────────────────────────────── */ /* ── Tab Navigation ─────────────────────────────────────── */
.tab-nav { .tab-nav {
@@ -430,8 +430,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -441,9 +441,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Tab Navigation ─────────────────────────────────────── */ /* ── Tab Navigation ─────────────────────────────────────── */
.tab-nav { .tab-nav {
@@ -430,8 +430,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -441,9 +441,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/matrice/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/matrice/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── View Toggle ─────────────────────────────────────── */ /* ── View Toggle ─────────────────────────────────────── */
.view-toggle { .view-toggle {
@@ -481,8 +481,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -492,9 +492,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ────────────────────────────────────────────── // ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/matrice/modali) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/matrice/modali) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── View Toggle ─────────────────────────────────────── */ /* ── View Toggle ─────────────────────────────────────── */
.view-toggle { .view-toggle {
@@ -481,8 +481,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -492,9 +492,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ────────────────────────────────────────────── // ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.settings-tabs { .settings-tabs {
display: flex; display: flex;
@@ -659,8 +659,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -670,9 +670,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.settings-tabs { .settings-tabs {
display: flex; display: flex;
@@ -659,8 +659,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -670,9 +670,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+3 -3
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Configura Organizzazione - NIS2 Agile</title> <title>Configura Organizzazione - NIS2 Agile</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
</head> </head>
<body> <body>
<div class="app-layout"> <div class="app-layout">
@@ -152,8 +152,8 @@
</main> </main>
</div> </div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script> <script>
// ── Auth check ─────────────────────────────────────────── // ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -197,7 +197,7 @@
<div class="sim-card" onclick="selectSim(this, 'sim02')"> <div class="sim-card" onclick="selectSim(this, 'sim02')">
<div class="sim-badge" style="background:rgba(239,68,68,.1);color:#fca5a5;border:1px solid rgba(239,68,68,.3);">SIM-02</div> <div class="sim-badge" style="background:rgba(239,68,68,.1);color:#fca5a5;border:1px solid rgba(239,68,68,.3);">SIM-02</div>
<h4>Ransomware Art.23 DataCore</h4> <h4>Ransomware Art.23 DataCore</h4>
<p>Attacco critico su cloud. Timeline 24h/72h/30d con notifiche CSIRT.</p> <p>Attacco critico su cloud. Timeline 24h/72h/1 mese con notifiche CSIRT.</p>
</div> </div>
<div class="sim-card" onclick="selectSim(this, 'sim03')"> <div class="sim-card" onclick="selectSim(this, 'sim03')">
<div class="sim-badge" style="background:rgba(139,92,246,.1);color:#ddd6fe;border:1px solid rgba(139,92,246,.3);">SIM-03</div> <div class="sim-badge" style="background:rgba(139,92,246,.1);color:#ddd6fe;border:1px solid rgba(139,92,246,.3);">SIM-03</div>
@@ -275,7 +275,7 @@
<div class="log-info">Seleziona uno scenario e premi "Avvia Simulazione".</div> <div class="log-info">Seleziona uno scenario e premi "Avvia Simulazione".</div>
<div class="log-info" style="margin-top:8px;color:#475569;">Scenari disponibili:</div> <div class="log-info" style="margin-top:8px;color:#475569;">Scenari disponibili:</div>
<div class="log-ok"> SIM-01 Onboarding + Gap Assessment 80 domande</div> <div class="log-ok"> SIM-01 Onboarding + Gap Assessment 80 domande</div>
<div class="log-ok"> SIM-02 Incidente Ransomware Art.23 (24h/72h/30d)</div> <div class="log-ok"> SIM-02 Incidente Ransomware Art.23 (24h/72h/1 mese)</div>
<div class="log-ok"> SIM-03 Data Breach Supply Chain + GDPR</div> <div class="log-ok"> SIM-03 Data Breach Supply Chain + GDPR</div>
<div class="log-ok"> SIM-04 Whistleblowing anonimo SCADA</div> <div class="log-ok"> SIM-04 Whistleblowing anonimo SCADA</div>
<div class="log-ok"> SIM-05 Audit Trail Hash Chain Verification</div> <div class="log-ok"> SIM-05 Audit Trail Hash Chain Verification</div>
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Supply Chain Page Styles ─────────────────────────── */ /* ── Supply Chain Page Styles ─────────────────────────── */
.filters-bar { .filters-bar {
@@ -464,8 +464,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -475,9 +475,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Supply Chain Page Styles ─────────────────────────── */ /* ── Supply Chain Page Styles ─────────────────────────── */
.filters-bar { .filters-bar {
@@ -464,8 +464,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -475,9 +475,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Tab Navigation ─────────────────────────────────────── */ /* ── Tab Navigation ─────────────────────────────────────── */
.tab-nav { .tab-nav {
@@ -279,8 +279,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -290,9 +290,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -8,7 +8,7 @@
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. --> via JS (tabelle/modali/form) -> parita' funzionale assoluta. BI veste la chrome. -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
/* ── Tab Navigation ─────────────────────────────────────── */ /* ── Tab Navigation ─────────────────────────────────────── */
.tab-nav { .tab-nav {
@@ -279,8 +279,8 @@
</main> </main>
</div> </div>
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -290,9 +290,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
// ── Auth & Init ───────────────────────────────────────── // ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
+6 -6
View File
@@ -9,7 +9,7 @@
renderizzati via JS (tabelle/modali/timeline) -> parita' funzionale assoluta. renderizzati via JS (tabelle/modali/timeline) -> parita' funzionale assoluta.
BI veste la chrome (sidebar + font istituzionale). --> BI veste la chrome (sidebar + font istituzionale). -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.priority-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; } .priority-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; }
.priority-critical { background: var(--danger-bg); color: var(--danger); } .priority-critical { background: var(--danger-bg); color: var(--danger); }
@@ -194,8 +194,8 @@
<!-- Report Detail Modal handled by common.js showModal --> <!-- Report Detail Modal handled by common.js showModal -->
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -205,9 +205,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
+6 -6
View File
@@ -9,7 +9,7 @@
renderizzati via JS (tabelle/modali/timeline) -> parita' funzionale assoluta. renderizzati via JS (tabelle/modali/timeline) -> parita' funzionale assoluta.
BI veste la chrome (sidebar + font istituzionale). --> BI veste la chrome (sidebar + font istituzionale). -->
<link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css"> <link rel="stylesheet" href="/vendor/bootstrap-italia/dist/css/bootstrap-italia.min.css">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css?v=20260613">
<style> <style>
.priority-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; } .priority-badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 12px; font-size: 0.7rem; font-weight: 700; }
.priority-critical { background: var(--danger-bg); color: var(--danger); } .priority-critical { background: var(--danger-bg); color: var(--danger); }
@@ -194,8 +194,8 @@
<!-- Report Detail Modal handled by common.js showModal --> <!-- Report Detail Modal handled by common.js showModal -->
<script src="/js/api.js"></script> <script src="/js/api.js?v=20260613"></script>
<script src="/js/common.js"></script> <script src="/js/common.js?v=20260613"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js). <!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI, common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). --> riusando tutti gli helper di common.js (zero backend). -->
@@ -205,9 +205,9 @@
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts'); bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
} }
</script> </script>
<script src="/js/common-bi.js"></script> <script src="/js/common-bi.js?v=20260613"></script>
<script src="/js/i18n.js"></script> <script src="/js/i18n.js?v=20260613"></script>
<script src="/js/help.js"></script> <script src="/js/help.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
+5 -5
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Compliance Journey - NIS2 Agile</title> <title>Compliance Journey - NIS2 Agile</title>
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css?v=20260613">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style> <style>
:root { :root {
@@ -306,9 +306,9 @@
</main> </main>
</div> </div>
<script src="js/api.js"></script> <script src="js/api.js?v=20260613"></script>
<script src="js/common.js"></script> <script src="js/common.js?v=20260613"></script>
<script src="js/i18n.js"></script> <script src="js/i18n.js?v=20260613"></script>
<script> <script>
if (!checkAuth()) throw new Error('Not authenticated'); if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); loadSidebar();
@@ -365,7 +365,7 @@ const PHASES = [
color: '#d97706', icon: 'fa-eye', color: '#d97706', icon: 'fa-eye',
desc: 'Incidenti, non-conformità e normative', desc: 'Incidenti, non-conformità e normative',
steps: [ steps: [
{ id: 'incidents', name: 'Incidenti Art.23', icon: 'fa-bell', desc: 'Gestione e notifica CSIRT: 24h early warning, 72h, 30 giorni', href: 'incidents.html', mk: 'incidents_count' }, { id: 'incidents', name: 'Incidenti Art.23', icon: 'fa-bell', desc: 'Gestione e notifica CSIRT: 24h early warning, 72h, 1 mese', href: 'incidents.html', mk: 'incidents_count' },
{ id: 'ncr', name: 'NCR / CAPA', icon: 'fa-circle-xmark', desc: 'Non-conformità rilevate e azioni correttive in corso', href: 'reports.html', mk: 'ncr_open' }, { id: 'ncr', name: 'NCR / CAPA', icon: 'fa-circle-xmark', desc: 'Non-conformità rilevate e azioni correttive in corso', href: 'reports.html', mk: 'ncr_open' },
{ id: 'normative', name: 'Aggiornamenti NIS2', icon: 'fa-newspaper', desc: 'Feed ACN, DORA, D.Lgs. 138/2024 con conferma di lettura', href: 'normative.html', mk: 'normative_pending' }, { id: 'normative', name: 'Aggiornamenti NIS2', icon: 'fa-newspaper', desc: 'Feed ACN, DORA, D.Lgs. 138/2024 con conferma di lettura', href: 'normative.html', mk: 'normative_pending' },
{ id: 'wb', name: 'Segnalazioni', icon: 'fa-user-secret', desc: 'Canale whistleblowing anonimo Art.32 NIS2', href: 'whistleblowing.html', mk: 'wb_open' }, { id: 'wb', name: 'Segnalazioni', icon: 'fa-user-secret', desc: 'Canale whistleblowing anonimo Art.32 NIS2', href: 'whistleblowing.html', mk: 'wb_open' },