[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:
co-authored by
Claude Opus 4.8
parent
36967f9452
commit
1c64211685
+35
-21
@@ -4,6 +4,10 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Inventario Asset - 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/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="/css/style.css">
|
||||
<style>
|
||||
/* ── Stats Cards ────────────────────────────────────────── */
|
||||
@@ -261,7 +265,7 @@
|
||||
|
||||
<main class="main-content">
|
||||
<header class="content-header">
|
||||
<h2 data-i18n="assets.title">Inventario Asset</h2>
|
||||
<h1 class="h2" data-i18n="assets.title">Inventario Asset</h1>
|
||||
<div class="content-header-actions">
|
||||
<span class="text-muted" style="font-size:0.8rem; margin-right:8px;">Art. 21.2.i NIS2</span>
|
||||
<button class="btn btn-secondary" onclick="openImportModal()" title="Importa asset da CSV/CMDB">Importa</button>
|
||||
@@ -313,7 +317,7 @@
|
||||
|
||||
<!-- Filters -->
|
||||
<div class="filters-bar">
|
||||
<select id="filter-type" onchange="applyFilters()">
|
||||
<select id="filter-type" onchange="applyFilters()" aria-label="Filtra per tipo">
|
||||
<option value="">Tutti i tipi</option>
|
||||
<option value="hardware">Hardware</option>
|
||||
<option value="software">Software</option>
|
||||
@@ -323,14 +327,14 @@
|
||||
<option value="personnel">Personale</option>
|
||||
<option value="facility">Struttura</option>
|
||||
</select>
|
||||
<select id="filter-criticality" onchange="applyFilters()">
|
||||
<select id="filter-criticality" onchange="applyFilters()" aria-label="Filtra per criticità">
|
||||
<option value="">Tutte le criticita'</option>
|
||||
<option value="critical">Critica</option>
|
||||
<option value="high">Alta</option>
|
||||
<option value="medium">Media</option>
|
||||
<option value="low">Bassa</option>
|
||||
</select>
|
||||
<select id="filter-status" onchange="applyFilters()">
|
||||
<select id="filter-status" onchange="applyFilters()" aria-label="Filtra per stato">
|
||||
<option value="">Tutti gli stati</option>
|
||||
<option value="active">Attivo</option>
|
||||
<option value="maintenance">Manutenzione</option>
|
||||
@@ -351,6 +355,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>
|
||||
@@ -549,7 +563,7 @@
|
||||
body += `<div class="form-group" style="margin-bottom:0.75rem;">
|
||||
<label class="form-label" style="font-weight:600;">${def.label} <span style="color:var(--gray-400);font-weight:400;">(max ${def.max})</span></label>
|
||||
<div style="font-size:0.78rem;color:var(--gray-500);margin-bottom:4px;">${def.help}</div>
|
||||
<select class="form-select score-criterion" data-key="${key}" onchange="updateScorePreview()">${opts}</select>
|
||||
<select class="form-select score-criterion" data-key="${key}" onchange="updateScorePreview()" aria-label="${def.label}">${opts}</select>
|
||||
</div>`;
|
||||
}
|
||||
body += `<div id="score-preview" style="margin-top:1rem;padding:0.9rem;border-radius:10px;background:var(--gray-50);font-weight:600;text-align:center;">
|
||||
@@ -763,70 +777,70 @@
|
||||
|
||||
showModal(title, `
|
||||
<div class="form-group">
|
||||
<label class="form-label">Nome *</label>
|
||||
<label for="asset-name" class="form-label">Nome *</label>
|
||||
<input type="text" class="form-input" id="asset-name" value="${escapeHtml(a.name || '')}" required>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Tipo *</label>
|
||||
<label for="asset-type" class="form-label">Tipo *</label>
|
||||
<select class="form-select" id="asset-type">${typeOptions}</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Categoria</label>
|
||||
<label for="asset-category" class="form-label">Categoria</label>
|
||||
<input type="text" class="form-input" id="asset-category" value="${escapeHtml(a.category || '')}" placeholder="Es: Server, Database...">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Descrizione</label>
|
||||
<label for="asset-description" class="form-label">Descrizione</label>
|
||||
<textarea class="form-input" id="asset-description" rows="2">${escapeHtml(a.description || '')}</textarea>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Criticita'</label>
|
||||
<label for="asset-criticality" class="form-label">Criticita'</label>
|
||||
<select class="form-select" id="asset-criticality">${critOptions}</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Stato</label>
|
||||
<label for="asset-status" class="form-label">Stato</label>
|
||||
<select class="form-select" id="asset-status">${statusOptions}</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Owner (ID utente)</label>
|
||||
<label for="asset-owner" class="form-label">Owner (ID utente)</label>
|
||||
<input type="text" class="form-input" id="asset-owner" value="${escapeHtml(a.owner_user_id || '')}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Posizione</label>
|
||||
<label for="asset-location" class="form-label">Posizione</label>
|
||||
<input type="text" class="form-input" id="asset-location" value="${escapeHtml(a.location || '')}" placeholder="Es: Data Center Roma">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Indirizzo IP</label>
|
||||
<label for="asset-ip" class="form-label">Indirizzo IP</label>
|
||||
<input type="text" class="form-input" id="asset-ip" value="${escapeHtml(a.ip_address || '')}" placeholder="Es: 192.168.1.100">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Fornitore</label>
|
||||
<label for="asset-vendor" class="form-label">Fornitore</label>
|
||||
<input type="text" class="form-input" id="asset-vendor" value="${escapeHtml(a.vendor || '')}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Versione</label>
|
||||
<label for="asset-version" class="form-label">Versione</label>
|
||||
<input type="text" class="form-input" id="asset-version" value="${escapeHtml(a.version || '')}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Numero Seriale</label>
|
||||
<label for="asset-serial" class="form-label">Numero Seriale</label>
|
||||
<input type="text" class="form-input" id="asset-serial" value="${escapeHtml(a.serial_number || '')}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Data Acquisto</label>
|
||||
<label for="asset-purchase-date" class="form-label">Data Acquisto</label>
|
||||
<input type="date" class="form-input" id="asset-purchase-date" value="${a.purchase_date || ''}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Scadenza Garanzia</label>
|
||||
<label for="asset-warranty" class="form-label">Scadenza Garanzia</label>
|
||||
<input type="date" class="form-input" id="asset-warranty" value="${a.warranty_expiry || ''}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -877,8 +891,8 @@ function openImportModal(){
|
||||
<p style="font-size:.85rem;color:var(--gray-600);margin-bottom:10px;">Incolla CSV o carica un file. Colonne riconosciute:
|
||||
<code>name, asset_type, criticality, data_classification, internet_facing, dependencies_count, regulated, external_ref, vendor, location</code>.
|
||||
Lo scoring di rilevanza NIS2 (GV.OC-04) viene calcolato automaticamente.</p>
|
||||
<div class="form-group"><input type="file" accept=".csv,text/csv" id="imp-file" onchange="impFile(event)"></div>
|
||||
<div class="form-group"><label class="form-label">Oppure incolla CSV (prima riga = intestazioni)</label>
|
||||
<div class="form-group"><input type="file" accept=".csv,text/csv" id="imp-file" onchange="impFile(event)" aria-label="Seleziona file CSV da importare"></div>
|
||||
<div class="form-group"><label for="imp-csv" class="form-label">Oppure incolla CSV (prima riga = intestazioni)</label>
|
||||
<textarea class="form-input" id="imp-csv" rows="8" placeholder="name,asset_type,criticality,data_classification,internet_facing,dependencies_count,regulated
|
||||
Core ERP,software,critical,financial,false,8,true
|
||||
Web Portal,service,high,personal,true,3,true"></textarea></div>
|
||||
|
||||
Reference in New Issue
Block a user