@page "/utilities/booking-scheduler" @using Indotalent.Features.Utilities.BookingScheduler @using Indotalent.Features.Utilities.BookingScheduler.Cqrs @using MudBlazor @inject BookingSchedulerService SchedulerService
Booking Scheduler Visual schedule of resource allocations and time slots.
/ Utilities / Scheduler
Date Navigation
Summary for @(_selectedDate?.ToString("dd MMM yyyy") ?? "Today")
Total Bookings @GetFilteredData().Count()
Active Resources @GetFilteredData().Select(x => x.ResourceName).Distinct().Count()
@if (_loading) {
} else {
Timeline Details
@if (!GetFilteredData().Any()) {
No bookings scheduled for this date.
} else { @foreach (var item in GetFilteredData()) {
@item.StartTime?.ToString("HH:mm") @item.EndTime?.ToString("HH:mm")
@item.ResourceGroupName
@item.Subject
@item.ResourceName
@item.Status?.ToUpper()
@if (!string.IsNullOrEmpty(item.Description)) { @item.Description }
@GetDuration(item.StartTime, item.EndTime)
}
}
}
@code { private List _data = new(); private bool _loading = true; private DateTime? _selectedDate = DateTime.Today; protected override async Task OnInitializedAsync() => await LoadData(); private async Task LoadData() { _loading = true; StateHasChanged(); try { var response = await SchedulerService.GetBookingSchedulerListAsync(); await Task.Delay(500); if (response != null && response.IsSuccess) { _data = response.Value ?? new(); } } finally { _loading = false; StateHasChanged(); } } private IEnumerable GetFilteredData() { if (!_selectedDate.HasValue) return _data; return _data.Where(x => x.StartTime.HasValue && x.StartTime.Value.Date == _selectedDate.Value.Date); } private Color GetStatusColor(string? status) => status switch { "Confirmed" => Color.Success, "Done" => Color.Primary, "OnProgress" => Color.Info, "Cancelled" => Color.Error, _ => Color.Default }; private string GetStatusHex(string? status) => status switch { "Confirmed" => "#2E7D32", "Done" => "#1565C0", "OnProgress" => "#0288D1", "Cancelled" => "#C62828", _ => "#64748B" }; private string GetStatusTextStyle(string? status) { var hex = GetStatusHex(status); return $"font-weight: 900; color: {hex};"; } private string GetCardStyle(string? status) { var hex = GetStatusHex(status); return $"border: 1px solid #E2E8F0; border-left: 6px solid {hex}; background: #ffffff; box-shadow: 0 2px 4px rgba(0,0,0,0.02);"; } private string GetDuration(DateTime? start, DateTime? end) { if (!start.HasValue || !end.HasValue) return "N/A"; var diff = end.Value - start.Value; return $"{(int)diff.TotalHours}h {diff.Minutes}m"; } }