@page "/" @inject DashboardService Dash MeterVault — Overview Overview @if (_summary is null) { } else { This month @Format.Euro(_summary.Month.Current) This year @Format.Euro(_summary.Year.Current) Latest month with data @Format.Euro(_summary.LatestMonthCost) What costs most (this year) @if (_breakdown is { Count: > 0 }) { @foreach (var slice in _breakdown) { @slice.Name @Format.Euro(slice.Cost) } } else { No cost data yet — import a sheet or add tariffs. } What cost more / less (year vs last year) CategoryNowPrevΔ @foreach (var row in _difference) { @row.Name @Format.Euro(row.Current) @Format.Euro(row.Previous) @Format.DirectionIcon(Math.Sign(row.Delta)) @Format.Euro(Math.Abs(row.Delta)) } } @code { private DashboardSummary? _summary; private IReadOnlyList _breakdown = []; private IReadOnlyList _difference = []; protected override async Task OnInitializedAsync() { var asOf = DateOnly.FromDateTime(DateTime.UtcNow); _summary = await Dash.GetSummaryAsync(asOf); var yearStart = new DateOnly(asOf.Year, 1, 1); _breakdown = await Dash.GetCategoryBreakdownAsync(yearStart, asOf.AddMonths(1)); _difference = await Dash.GetCategoryDifferenceAsync(yearStart, yearStart.AddYears(-1), asOf.AddMonths(1)); } }