using Microsoft.AspNetCore.Mvc; namespace PlanTempus.Application.Features.Dashboard.Components; /// /// ViewComponent for rendering a stat card on the dashboard. /// public class StatCardViewComponent : ViewComponent { public IViewComponentResult Invoke(string key) { var model = StatCardCatalog.Get(key); return View(model); } } /// /// ViewModel for the StatCard component. /// public class StatCardViewModel { public required string Key { get; init; } public required string Value { get; init; } public required string Label { get; init; } public string? TrendText { get; init; } public string? TrendIcon { get; init; } public string? TrendDirection { get; init; } public string? Variant { get; init; } public bool HasTrend => !string.IsNullOrEmpty(TrendText); } /// /// Catalog of available stat cards with their data. /// public static class StatCardCatalog { private static readonly Dictionary Cards = new() { ["bookings-today"] = new StatCardViewModel { Key = "bookings-today", Value = "12", Label = "Bookinger i dag", TrendText = "4 gennemført, 2 i gang", TrendIcon = "ph-check-circle", TrendDirection = "up", Variant = "highlight" }, ["expected-revenue"] = new StatCardViewModel { Key = "expected-revenue", Value = "8.450 kr", Label = "Forventet omsætning", TrendText = "+12% vs. gennemsnit", TrendIcon = "ph-trend-up", TrendDirection = "up", Variant = "success" }, ["occupancy-rate"] = new StatCardViewModel { Key = "occupancy-rate", Value = "78%", Label = "Belægningsgrad", TrendText = "God kapacitet", TrendIcon = "ph-trend-up", TrendDirection = "up", Variant = null }, ["needs-attention"] = new StatCardViewModel { Key = "needs-attention", Value = "4", Label = "Kræver opmærksomhed", TrendText = null, TrendIcon = null, TrendDirection = null, Variant = "warning" } }; public static StatCardViewModel Get(string key) { if (Cards.TryGetValue(key, out var card)) return card; throw new KeyNotFoundException($"StatCard with key '{key}' not found"); } public static IEnumerable AllKeys => Cards.Keys; }