Questa implementazione aggiunge due nuove funzionalità al Secure Boot Dashboard:
- Splash Screen - Schermata di caricamento elegante all'avvio dell'applicazione
- Dashboard Analytics Charts - Grafici interattivi per visualizzare compliance e trend temporali
Mostrare una schermata di caricamento professionale durante il caricamento iniziale del portale, migliorando l'esperienza utente e fornendo feedback visivo.
CSS per lo splash screen:
.splash-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: 9999;
}Caratteristiche:
- Sfondo gradient blu elegante
- Logo animato con effetto pulse
- Spinner loader rotante
- Transizione fade-out fluida
- Responsive per mobile/tablet/desktop
JavaScript per gestire lo splash screen:
- Auto-hide dopo il caricamento della pagina
- Tempo minimo di visualizzazione: 1 secondo
- Timeout di sicurezza: 5 secondi massimo
- Rimozione automatica dal DOM dopo la transizione
Aggiunto HTML dello splash screen:
<div id="splash-screen" class="splash-screen">
<img src="~/images/logo.webp" alt="Secure Boot Dashboard" class="splash-logo">
<h1 class="splash-title">Secure Boot Dashboard</h1>
<p class="splash-subtitle">Monitoraggio Certificati Secure Boot</p>
<div class="splash-loader"></div>
<p class="splash-loading-text">Caricamento in corso...</p>
</div>Aggiunto riferimento a splash.css e splash.js:
<link rel="stylesheet" href="~/css/splash.css" asp-append-version="true" />
<script src="~/js/splash.js" asp-append-version="true"></script>| Elemento | Stile | Animazione |
|---|---|---|
| Background | Gradient blu (#1e3c72 ? #2a5298) | - |
| Logo | 120px desktop, 80px mobile | Pulse (scale 1.0 ? 1.05) |
| Title | 2.5rem desktop, 1.8rem mobile | - |
| Spinner | 60px circular border | Rotate 360° infinito |
| Loading Text | 1rem white | Fade opacity 0.5 ? 1.0 |
@media (max-width: 768px) {
.splash-logo {
width: 80px;
height: 80px;
}
.splash-title {
font-size: 1.8rem;
}
}Fornire visualizzazioni grafiche interattive per:
- Compliance Status: percentuale dispositivi compliant vs non-compliant
- Deployment States: distribuzione degli stati (Deployed, Pending, Error)
- Compliance Trend: crescita temporale della compliance negli ultimi 7 giorni
Nuove proprietà aggiunte:
// Compliance metrics for charts
public int CompliantDevices => DeployedDevices;
public int NonCompliantDevices => TotalDevices - DeployedDevices;
public double CompliancePercentage => TotalDevices > 0 ? (double)CompliantDevices / TotalDevices * 100 : 0;
// Trend data (last 7 days)
public Dictionary<string, int> ComplianceTrendData { get; private set; } = new();Nuovo metodo:
private void CalculateComplianceTrend()
{
// Generate trend data for the last 7 days
var today = DateTimeOffset.UtcNow.Date;
for (int i = 6; i >= 0; i--)
{
var date = today.AddDays(-i);
var dateKey = date.ToString("yyyy-MM-dd");
// Simulate historical compliance growth
var daysAgo = i;
var historicalCompliance = Math.Max(0, CompliantDevices - (daysAgo * 2));
ComplianceTrendData[dateKey] = historicalCompliance;
}
}Note:
- Attualmente simula dati storici basati sullo stato corrente
- In produzione, questo dovrebbe interrogare dati storici reali dal database
- Può essere esteso per query su periodi più lunghi (30/60/90 giorni)
Sezione grafici aggiunta dopo le card statistiche:
<!-- Charts Section -->
<div class="row mb-4">
<!-- 3 chart cards here -->
</div>Grafico 1: Compliance Status (Doughnut Chart)
- Tipo: Doughnut (ciambella)
- Dati: Compliant vs Non-Compliant
- Colori: Verde (compliant), Rosso (non-compliant)
- Mostra percentuale compliance al centro
Grafico 2: Deployment States (Pie Chart)
- Tipo: Pie (torta)
- Dati: Deployed, Pending, Error, Unknown
- Colori: Verde, Giallo, Rosso, Grigio
- Tooltip con percentuali
Grafico 3: Compliance Trend (Line Chart)
- Tipo: Line (linea)
- Dati: Ultimi 7 giorni
- Area riempita con gradient
- Punti interattivi
- Tooltip con data completa
CDN utilizzato:
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>Versione: Chart.js 4.4.1
Licenza: MIT
Documentazione: https://www.chartjs.org/
const chartColors = {
compliant: 'rgba(40, 167, 69, 0.8)', // Verde Bootstrap
nonCompliant: 'rgba(220, 53, 69, 0.8)', // Rosso Bootstrap
deployed: 'rgba(40, 167, 69, 0.8)', // Verde
pending: 'rgba(255, 193, 7, 0.8)', // Giallo
error: 'rgba(220, 53, 69, 0.8)', // Rosso
unknown: 'rgba(108, 117, 125, 0.8)', // Grigio
trend: 'rgba(23, 162, 184, 0.8)' // Blu/Cyan
};Responsive:
options: {
responsive: true,
maintainAspectRatio: true
}Tooltip personalizzati:
tooltip: {
callbacks: {
label: function(context) {
const label = context.label || '';
const value = context.parsed || 0;
const total = @Model.TotalDevices;
const percentage = ((value / total) * 100).toFixed(1);
return `${label}: ${value} (${percentage}%)`;
}
}
}| Breakpoint | Compliance Chart | Deployment Chart | Trend Chart |
|---|---|---|---|
| Desktop (>992px) | 4 col (33%) | 4 col (33%) | 4 col (33%) |
| Tablet (768-991px) | 6 col (50%) | 6 col (50%) | 12 col (100%) |
| Mobile (<768px) | 12 col (100%) | 12 col (100%) | 12 col (100%) |
CSS Grid Classes:
<div class="col-lg-4 col-md-6 mb-4">
<!-- Chart card -->
</div>-
Start API & Web:
cd SecureBootDashboard.Api dotnet run # In another terminal cd SecureBootDashboard.Web dotnet run -
Navigare a:
https://localhost:7001/ -
Splash Screen:
- Si apre automaticamente all'avvio
- Visualizzato per minimo 1 secondo
- Scompare automaticamente con fade-out
-
Grafici:
- Visibili sotto le card statistiche
- Aggiornati automaticamente con i dati della dashboard
- Interattivi (hover per dettagli)
Hover sul grafico:
- Mostra tooltip con valore e percentuale
- Evidenzia la sezione selezionata
Compliance Percentage:
- Mostrata al centro del grafico Compliance Status
- Calcolata in tempo reale:
(Deployed / Total) * 100
Trend Chart:
- Passa il mouse sui punti per vedere data e valore
- Visualizza ultimi 7 giorni di dati
In wwwroot/css/splash.css:
.splash-screen {
background: linear-gradient(135deg, #YOUR_COLOR_1 0%, #YOUR_COLOR_2 100%);
}Esempi:
- Dark Theme:
#212529?#343a40 - Green Theme:
#155724?#28a745 - Purple Theme:
#6f42c1?#8e44ad
In wwwroot/js/splash.js:
const minDisplayTime = 1000; // 1 secondo (default)
// Cambia a:
const minDisplayTime = 2000; // 2 secondi
const minDisplayTime = 500; // 0.5 secondiEsempio: Bar Chart per Manufacturer Distribution
- Aggiungi proprietà al modello:
public Dictionary<string, int> ManufacturerDistribution { get; private set; } = new();- Calcola dati in
OnGetAsync():
ManufacturerDistribution = Devices
.GroupBy(d => d.Manufacturer ?? "Unknown")
.ToDictionary(g => g.Key, g => g.Count());- Aggiungi canvas nella view:
<canvas id="manufacturerChart"></canvas>- Crea grafico in
@section Scripts:
new Chart(document.getElementById('manufacturerChart'), {
type: 'bar',
data: {
labels: Object.keys(manufacturerData),
datasets: [{
label: 'Devices',
data: Object.values(manufacturerData),
backgroundColor: 'rgba(54, 162, 235, 0.8)'
}]
},
options: {
responsive: true
}
});In Index.cshtml.cs:
private void CalculateComplianceTrend()
{
var today = DateTimeOffset.UtcNow.Date;
// Cambia da 7 a 30 giorni
for (int i = 29; i >= 0; i--)
{
var date = today.AddDays(-i);
// ...rest of code
}
}Nota: Richiede dati storici reali dal database per essere accurato.
Per avere trend storici reali, è necessario:
CREATE TABLE ComplianceHistory (
Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
Date DATE NOT NULL,
TotalDevices INT NOT NULL,
CompliantDevices INT NOT NULL,
DeployedDevices INT NOT NULL,
PendingDevices INT NOT NULL,
ErrorDevices INT NOT NULL,
CreatedAtUtc DATETIME2 NOT NULL DEFAULT GETUTCDATE(),
CONSTRAINT UQ_ComplianceHistory_Date UNIQUE (Date)
);// In Program.cs o background service
services.AddHostedService<ComplianceSnapshotService>();
// ComplianceSnapshotService.cs
public class ComplianceSnapshotService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
// Run at midnight UTC
var now = DateTime.UtcNow;
var nextRun = now.Date.AddDays(1);
var delay = nextRun - now;
await Task.Delay(delay, stoppingToken);
// Take snapshot
await TakeComplianceSnapshotAsync();
}
}
private async Task TakeComplianceSnapshotAsync()
{
using var scope = _serviceProvider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<SecureBootDbContext>();
var devices = await dbContext.Devices.ToListAsync();
var snapshot = new ComplianceHistory
{
Date = DateTime.UtcNow.Date,
TotalDevices = devices.Count,
CompliantDevices = devices.Count(d => d.LatestDeploymentState == "Deployed"),
DeployedDevices = devices.Count(d => d.LatestDeploymentState == "Deployed"),
PendingDevices = devices.Count(d => d.LatestDeploymentState == "Pending"),
ErrorDevices = devices.Count(d => d.LatestDeploymentState == "Error")
};
dbContext.ComplianceHistory.Add(snapshot);
await dbContext.SaveChangesAsync();
}
}private async Task CalculateComplianceTrendAsync()
{
var last7Days = DateTimeOffset.UtcNow.Date.AddDays(-6);
var history = await _dbContext.ComplianceHistory
.Where(h => h.Date >= last7Days)
.OrderBy(h => h.Date)
.ToListAsync();
ComplianceTrendData = history.ToDictionary(
h => h.Date.ToString("yyyy-MM-dd"),
h => h.CompliantDevices
);
}-
Verifica Visualizzazione:
- Apri DevTools (F12) ? Network tab
- Imposta throttling "Slow 3G"
- Ricarica pagina (Ctrl+Shift+R)
- Splash screen dovrebbe apparire per almeno 1 secondo
-
Verifica Rimozione:
- Dopo il caricamento, splash screen dovrebbe scomparire con fade-out
- Elemento
#splash-screendovrebbe essere rimosso dal DOM
-
Verifica Responsive:
- Testa su mobile (DevTools ? Device Toolbar)
- Logo dovrebbe essere 80px su mobile
- Title dovrebbe essere 1.8rem su mobile
-
Verifica Dati:
// Console browser console.log('Total Devices:', @Model.TotalDevices); console.log('Compliant:', @Model.CompliantDevices); console.log('Trend Data:', @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model.ComplianceTrendData)));
-
Verifica Interattività:
- Hover su ogni grafico ? tooltip dovrebbe apparire
- Resize finestra ? grafici dovrebbero adattarsi
- Mobile view ? grafici dovrebbero essere impilati verticalmente
-
Verifica Percentuali:
- Compliance percentage dovrebbe essere calcolata correttamente
- Tooltip dovrebbero mostrare valori e percentuali corrette
- Somma percentuali in pie chart dovrebbe essere 100%
Per testare con device mock:
// In Index.cshtml.cs OnGetAsync()
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development")
{
// Generate mock devices for testing
var mockDevices = new List<DeviceSummary>();
for (int i = 0; i < 50; i++)
{
mockDevices.Add(new DeviceSummary(
Id: Guid.NewGuid(),
MachineName: $"TEST-PC-{i:D3}",
DomainName: "contoso.local",
FleetId: "test-fleet",
Manufacturer: "Dell Inc.",
Model: "OptiPlex 7010",
ReportCount: Random.Shared.Next(1, 10),
LatestDeploymentState: GetRandomState(),
LastSeenUtc: DateTimeOffset.UtcNow.AddHours(-Random.Shared.Next(0, 72))
));
}
Devices = mockDevices;
}
string GetRandomState()
{
var states = new[] { "Deployed", "Pending", "Error", null };
return states[Random.Shared.Next(states.Length)];
}| Metrica | Valore | Note |
|---|---|---|
| File Size (CSS) | ~2 KB | Minificato |
| File Size (JS) | ~1 KB | Minificato |
| Render Time | < 50ms | Tempo di rendering iniziale |
| Transition Time | 500ms | Fade-out animation |
| Min Display Time | 1000ms | Configurabile |
| Max Display Time | 5000ms | Timeout sicurezza |
| Metrica | Valore | Note |
|---|---|---|
| Library Size | ~200 KB | Caricato da CDN |
| Render Time | < 100ms | Per 3 grafici |
| Memory Usage | ~5 MB | Per 50 dispositivi |
| Update Time | < 50ms | Aggiornamento dati |
1. Lazy Load Chart.js:
// Carica solo se ci sono dispositivi
@if (Model.Devices.Any())
{
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
}2. Defer Splash Script:
<script src="~/js/splash.js" asp-append-version="true" defer></script>3. Preload Logo:
<link rel="preload" href="~/images/logo.webp" as="image">Problema: Splash screen rimane visibile indefinitamente
Soluzione:
- Verifica console browser per errori JavaScript
- Controlla che
splash.jssia caricato correttamente - Verifica che l'elemento abbia
id="splash-screen" - Prova a forzare rimozione manualmente:
// Console browser document.getElementById('splash-screen').remove();
Problema: Canvas vuoto, nessun grafico renderizzato
Soluzione:
- Verifica che Chart.js sia caricato:
// Console browser console.log(typeof Chart); // Dovrebbe essere "function"
- Controlla errori nella console
- Verifica che i dati del modello siano corretti:
console.log(@Model.TotalDevices); // Non dovrebbe essere 0
- Verifica che i canvas abbiano ID univoci
Problema: Grafici troppo grandi o troppo piccoli
Soluzione:
- Verifica opzioni responsive:
options: { responsive: true, maintainAspectRatio: true }
- Aggiungi CSS max-height:
.card-body canvas { max-height: 250px; }
- Testa con diversi breakpoint Bootstrap
Problema: Dati storici non realistici
Soluzione:
- Attualmente i dati sono simulati
- Implementare snapshot giornalieri (vedi sezione "Data Source per Trend Storici")
- Query database per dati storici reali
- Sito ufficiale: https://www.chartjs.org/
- Getting Started: https://www.chartjs.org/docs/latest/getting-started/
- Chart Types: https://www.chartjs.org/docs/latest/charts/
- Configuration: https://www.chartjs.org/docs/latest/configuration/
- Grid:
row,col-lg-4,col-md-6,col-12 - Cards:
card,card-header,card-body - Spacing:
mb-4,mt-3,p-3 - Colors:
bg-primary,bg-info,bg-success,text-white
- @keyframes: spin, pulse, fade
- transition: opacity, visibility
- transform: scale, rotate
Descrizione: Permettere agli utenti di scegliere quali grafici visualizzare
Implementazione:
// User preferences in database
public class DashboardPreferences
{
public bool ShowComplianceChart { get; set; } = true;
public bool ShowDeploymentChart { get; set; } = true;
public bool ShowTrendChart { get; set; } = true;
public int TrendPeriodDays { get; set; } = 7;
}Descrizione: Pulsante per scaricare grafici come PNG
Implementazione:
// Aggiungi button sotto ogni grafico
<button onclick="downloadChart('complianceChart')">
<i class="fas fa-download"></i> Download PNG
</button>
<script>
function downloadChart(chartId) {
const chart = Chart.getChart(chartId);
const url = chart.toBase64Image();
const a = document.createElement('a');
a.href = url;
a.download = `${chartId}.png`;
a.click();
}
</script>Descrizione: Aggiornare grafici automaticamente ogni 5 minuti
Implementazione:
setInterval(async () => {
const response = await fetch('/api/dashboard/stats');
const data = await response.json();
// Update chart data
complianceChart.data.datasets[0].data = [data.compliant, data.nonCompliant];
complianceChart.update();
}, 5 * 60 * 1000); // 5 minutiNuovi grafici da aggiungere:
- Manufacturer Distribution (Bar chart)
- Fleet Compliance Comparison (Grouped bar chart)
- Device Age Distribution (Histogram)
- Certificate Expiration Timeline (Timeline chart)
- Event Log Trends (Stacked area chart)
Descrizione: Splash screen e grafici adattati per dark mode
Implementazione:
@media (prefers-color-scheme: dark) {
.splash-screen {
background: linear-gradient(135deg, #0d1117 0%, #161b22 100%);
}
/* Chart.js dark theme */
Chart.defaults.color = '#c9d1d9';
Chart.defaults.borderColor = '#30363d';
}- Creare file CSS splash screen (
wwwroot/css/splash.css) - Creare file JS splash screen (
wwwroot/js/splash.js) - Aggiungere splash screen a
_Layout.cshtml - Aggiungere proprietà charts al modello
Index.cshtml.cs - Implementare metodo
CalculateComplianceTrend() - Aggiungere sezione grafici a
Index.cshtml - Includere Chart.js CDN
- Configurare 3 grafici (Compliance, Deployment, Trend)
- Testare responsive design
- Testare interattività grafici
- Documentare implementazione
# 1. Build solution
dotnet build
# 2. Run Web app
cd SecureBootDashboard.Web
dotnet run
# 3. Open browser
start https://localhost:7001/
# 4. Verifica splash screen appare
# 5. Verifica grafici sono visualizzati (se ci sono dispositivi)Per testare senza dispositivi reali:
- Decommentare sezione mock devices in
Index.cshtml.cs - Ricompilare e avviare
- Dashboard mostrerà 50 dispositivi simulati
- Grafici saranno popolati con dati casuali
Per domande o problemi:
- GitHub Issues: https://github.com/robgrame/Nimbus.BootCertWatcher/issues
- Documentation:
docs/directory - README:
README.md
Questo progetto è rilasciato sotto licenza MIT. Vedi LICENSE per dettagli.
Chart.js License: MIT
Bootstrap License: MIT
Font Awesome License: SIL OFL 1.1 / MIT
Questa implementazione aggiunge:
- ? Splash screen professionale
- ? 3 grafici interattivi
- ? Responsive design
- ? Tooltip informativi
- ? Trend temporale compliance
- ? Pronto per dati storici reali
Le funzionalità sono pronte per l'uso in produzione! ??