@page "/" @using NimbusFlow.Frontend.Services @using NimbusFlow.Frontend.Models @inject IApiService ApiService NimbusFlow Dashboard

NimbusFlow Dashboard

Active Members

@activeMemberCount

Pending Schedules

@pendingScheduleCount

Upcoming Services

@upcomingServiceCount

Total Classifications

@classificationCount

Recent Schedules
@if (recentSchedules.Any()) {
@foreach (var schedule in recentSchedules.Take(5)) {
@($"{schedule.Member?.FullName}")
@schedule.Status

Service: @schedule.Service?.ServiceDate.ToString("MMM dd, yyyy")

Scheduled: @schedule.ScheduledAt.ToString("MMM dd, yyyy HH:mm")
}
} else {

No recent schedules found.

}
@code { private int activeMemberCount = 0; private int pendingScheduleCount = 0; private int upcomingServiceCount = 0; private int classificationCount = 0; private List recentSchedules = new(); protected override async Task OnInitializedAsync() { try { // Load dashboard data var members = await ApiService.GetMembersAsync(); activeMemberCount = members.Count(m => m.IsActive == 1); var schedules = await ApiService.GetSchedulesAsync(); recentSchedules = schedules.OrderByDescending(s => s.ScheduledAt).ToList(); pendingScheduleCount = schedules.Count(s => s.Status == "pending"); var services = await ApiService.GetServicesAsync(); upcomingServiceCount = services.Count(s => s.ServiceDate >= DateTime.Today); var classifications = await ApiService.GetClassificationsAsync(); classificationCount = classifications.Count; } catch (Exception ex) { // Handle API errors gracefully Console.WriteLine($"Error loading dashboard data: {ex.Message}"); } } private string GetStatusBadgeClass(string status) { return status switch { "pending" => "bg-warning", "accepted" => "bg-success", "declined" => "bg-danger", _ => "bg-secondary" }; } }