[UI] SWAP V2: Bootstrap Italia ora UFFICIALE su 27 pagine app (kill della vecchia UI)

Promosse le pagine -bi a nomi ufficiali (contenuto BI), link -bi->plain, titoli '(BI)' rimossi.
La vecchia UI delle pagine app e sostituita. Backup: git (commit 36967f9) + /tmp/nis2-v1-backup.

Promosse (27): auth (login/register/onboarding/forgot/reset) + app (dashboard/assessment/
risks/incidents/policies/supply-chain/training/assets/reports/settings/isms/acn-gap/normative/
whistleblowing/kb/cross-analysis/service-continuity/guida/companies) + admin (index/orgs/users).
common-bi.js: sidebar BI ora linka le pagine ufficiali.

ESCLUSA: index.html (landing marketing 1298 righe) -> conversione dedicata a parte (la -bi
era 557 righe, rischio perdita contenuti). Pagine marketing/demo (presentation/simulate/
workflow/architecture/index-en) restano vecchio stile (fuori scope app autenticata).

Verifica produzione: 27/27 servite 200 con BI, 0 link -bi residui, 0 '(BI)' nei titoli,
auth intatta (401 su pwd errata), common-bi.js node --check OK.

Rollback: git revert HEAD  (oppure ripristino da /tmp/nis2-v1-backup).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-12 14:49:15 +02:00
co-authored by Claude Opus 4.8
parent 36967f9452
commit 1c64211685
28 changed files with 2474 additions and 3105 deletions
+24 -10
View File
@@ -4,6 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Policy - NIS2 Agile</title>
<!-- Bootstrap Italia v2.18.1 self-hostato (regola: MAI CDN). Caricato PRIMA di style.css
cosi' style.css (design system esistente) resta autorevole per i widget renderizzati
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="/css/style.css">
<style>
/* ── Policy Page Styles ──────────────────────────────────── */
@@ -242,7 +246,7 @@
<main class="main-content">
<header class="content-header">
<h2 data-i18n="policies.title">Gestione Policy</h2>
<h1 class="h2" data-i18n="policies.title">Gestione Policy</h1>
<div class="content-header-actions">
<button 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>
@@ -262,7 +266,7 @@
<!-- Tab: Lista Policy -->
<div class="tab-content active" id="tab-list">
<div class="filters-bar">
<select class="form-select" id="filter-category" onchange="loadPolicies()">
<select class="form-select" id="filter-category" onchange="loadPolicies()" aria-label="Filtra per categoria">
<option value="">Tutte le Categorie</option>
<option value="information_security">Sicurezza Informazioni</option>
<option value="access_control">Controllo Accessi</option>
@@ -275,7 +279,7 @@
<option value="network_security">Sicurezza Rete</option>
<option value="vulnerability_management">Gestione Vulnerabilita'</option>
</select>
<select class="form-select" id="filter-status" onchange="loadPolicies()">
<select class="form-select" id="filter-status" onchange="loadPolicies()" aria-label="Filtra per stato">
<option value="">Tutti gli Stati</option>
<option value="draft">Bozza</option>
<option value="review">In Revisione</option>
@@ -318,6 +322,16 @@
<script src="/js/api.js"></script>
<script src="/js/common.js"></script>
<!-- Bootstrap Italia bundle (componenti) + override sidebar BI (common-bi.js).
common-bi.js va DOPO common.js: ridefinisce solo loadSidebar() con markup BI,
riusando tutti gli helper di common.js (zero backend). -->
<script src="/vendor/bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js"></script>
<script>
if (window.bootstrap && bootstrap.loadFonts) {
bootstrap.loadFonts('/vendor/bootstrap-italia/dist/fonts');
}
</script>
<script src="/js/common-bi.js"></script>
<script src="/js/i18n.js"></script>
<script src="/js/help.js"></script>
<script>
@@ -639,34 +653,34 @@
const content = `
<form id="policy-form" onsubmit="return false;">
<div class="form-group">
<label class="form-label">Titolo <span class="required">*</span></label>
<label for="form-title" class="form-label">Titolo <span class="required">*</span></label>
<input type="text" class="form-input" id="form-title" value="${isEdit ? escapeHtml(policy.title) : ''}" required placeholder="Inserisci il titolo della policy">
</div>
<div class="form-row" style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
<div class="form-group">
<label class="form-label">Categoria <span class="required">*</span></label>
<label for="form-category" class="form-label">Categoria <span class="required">*</span></label>
<select class="form-select" id="form-category" required>
<option value="">Seleziona...</option>
${categoryOptions}
</select>
</div>
<div class="form-group">
<label class="form-label">Articolo NIS2</label>
<label for="form-nis2-article" class="form-label">Articolo NIS2</label>
<input type="text" class="form-input" id="form-nis2-article" value="${isEdit && policy.nis2_article ? escapeHtml(policy.nis2_article) : ''}" placeholder="es. 21.2.a">
</div>
</div>
<div class="form-row" style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
<div class="form-group">
<label class="form-label">Versione</label>
<label for="form-version" class="form-label">Versione</label>
<input type="text" class="form-input" id="form-version" value="${isEdit && policy.version ? escapeHtml(policy.version) : '1.0'}" placeholder="1.0">
</div>
<div class="form-group">
<label class="form-label">Prossima Revisione</label>
<label for="form-review-date" class="form-label">Prossima Revisione</label>
<input type="date" class="form-input" id="form-review-date" value="${isEdit && policy.next_review_date ? policy.next_review_date.substring(0, 10) : ''}">
</div>
</div>
<div class="form-group">
<label class="form-label">Contenuto</label>
<label for="form-content" class="form-label">Contenuto</label>
<textarea class="form-textarea" id="form-content" rows="12" placeholder="Inserisci il contenuto della policy...&#10;&#10;Puoi strutturare il documento con sezioni:&#10;1. Scopo&#10;2. Ambito&#10;3. Responsabilita'&#10;4. Procedure&#10;5. Revisione">${isEdit && policy.content ? escapeHtml(policy.content) : ''}</textarea>
</div>
</form>
@@ -806,7 +820,7 @@
Il contenuto generato potra' essere rivisto e modificato prima della pubblicazione.
</p>
<div class="form-group">
<label class="form-label">Categoria Policy <span class="required">*</span></label>
<label for="ai-category" class="form-label">Categoria Policy <span class="required">*</span></label>
<select class="form-select" id="ai-category">
${categoryOptions}
</select>