87 lines
3.1 KiB
Plaintext
87 lines
3.1 KiB
Plaintext
@using System.Collections.Generic
|
|
@using System.Globalization
|
|
|
|
<div class="mb-3">
|
|
@if (!string.IsNullOrWhiteSpace(Title))
|
|
{
|
|
<div class="d-flex justify-content-between align-items-center mb-1">
|
|
<strong>@Title</strong>
|
|
@if (Total > 0)
|
|
{
|
|
<span class="text-muted small">Totale: @Total</span>
|
|
}
|
|
</div>
|
|
}
|
|
|
|
@if (Total > 0)
|
|
{
|
|
<div class="progress" style="height: 32px;" role="progressbar" aria-label="@($"Pareto scadenze: {success} OK, {warning} Warning, {danger} Danger")">
|
|
<div class="progress-bar bg-success" style="width: @(CalcPctCss(SuccessPct))" title="@($"OK: {success} ({SuccessPct:F1}%)")" aria-valuenow="@SuccessPct" aria-valuemin="0" aria-valuemax="100">
|
|
@if (ShowIcon)
|
|
{
|
|
<span>✅ OK: </span>
|
|
}
|
|
@success
|
|
</div>
|
|
<div class="progress-bar bg-warning text-dark" style="width: @(CalcPctCss(WarningPct))" title="@($"Warning: {warning} ({WarningPct:F1}%)")" aria-valuenow="@WarningPct" aria-valuemin="0" aria-valuemax="100">
|
|
@if (ShowIcon)
|
|
{
|
|
<span>⚠️ Warning: </span>
|
|
}
|
|
@warning
|
|
</div>
|
|
<div class="progress-bar bg-danger" style="width: @(CalcPctCss(DangerPct))" title="@($"Danger: {danger} ({DangerPct:F1}%)")" aria-valuenow="@DangerPct" aria-valuemin="0" aria-valuemax="100">
|
|
@if (ShowIcon)
|
|
{
|
|
<span>🚨 Danger: </span>
|
|
}
|
|
@danger
|
|
</div>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="text-muted py-2">Nessun record</div>
|
|
}
|
|
</div>
|
|
|
|
@code {
|
|
/// <summary>
|
|
/// Dizionario valori dussiviso tra success/warning/danger
|
|
/// </summary>
|
|
[Parameter]
|
|
public Dictionary<string, int>? ParetoData { get; set; }
|
|
|
|
/// <summary>
|
|
/// Titolo del display
|
|
/// </summary>
|
|
[Parameter]
|
|
public string Title { get; set; } = "Distribuzione";
|
|
|
|
/// <summary>
|
|
/// Indica se mostrare icona insieme al numero dentro i blocchi
|
|
/// </summary>
|
|
[Parameter]
|
|
public bool ShowIcon { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Valore larghezza calcolata in % corretta
|
|
/// </summary>
|
|
/// <param name="currVal"></param>
|
|
/// <returns></returns>
|
|
private string CalcPctCss(double currVal)
|
|
{
|
|
var dblVal = Total > 0 ? currVal / (double)Total * 100 : 0;
|
|
return $"{dblVal.ToString("F2", CultureInfo.InvariantCulture)}%";
|
|
}
|
|
|
|
// Proprietà calcolate con fallback sicuro
|
|
private int success => ParetoData?.GetValueOrDefault("success", 0) ?? 0;
|
|
private int warning => ParetoData?.GetValueOrDefault("warning", 0) ?? 0;
|
|
private int danger => ParetoData?.GetValueOrDefault("danger", 0) ?? 0;
|
|
private int Total => success + warning + danger;
|
|
|
|
private double SuccessPct => Total > 0 ? (success / (double)Total) * 100 : 0;
|
|
private double WarningPct => Total > 0 ? (warning / (double)Total) * 100 : 0;
|
|
private double DangerPct => Total > 0 ? (danger / (double)Total) * 100 : 0;
|
|
} |