@page "/calendar" @attribute [Authorize] @using WebApp.Models @using WebApp.Services @using Heron.MudCalendar @using Microsoft.Extensions.Logging @using WebApp.Authentication @inject ICalendarService CalendarService @inject ILogger Logger @inject IDialogService DialogService Import Schedule handout Admin @if (_calendarItems == null) { Loading calendar events... } else {
@context.Text
@context.Text
@context.Text
}
@code { private List? _calendarItems; private DateTime _calendarDate = DateTime.Today; private CalendarView _currentView = CalendarView.Month; [SupplyParameterFromQuery] private string? Date { get; set; } protected override async Task OnInitializedAsync() { // Parse date from query parameter if provided if (!string.IsNullOrEmpty(Date) && DateTime.TryParse(Date, out var parsedDate)) { _calendarDate = parsedDate.Date; } await LoadCalendarEvents(); } private async Task LoadCalendarEvents() { try { Logger.LogInformation("Loading calendar events"); _calendarItems = await CalendarService.GetAllCalendarItemsAsync(); Logger.LogInformation("Loaded {Count} calendar items", _calendarItems.Count); } catch (Exception ex) { Logger.LogError(ex, "Error loading calendar events"); _calendarItems = []; } finally { StateHasChanged(); } } private string GetEventTooltip(CalendarItemWrapper wrapper) { if (wrapper.ItemType == CalendarItemType.Event && wrapper.EventItem != null) { return GetEventTooltip(wrapper.EventItem); } else if (wrapper.ItemType == CalendarItemType.Meeting && wrapper.MeetingItem != null) { return GetMeetingTooltip(wrapper.MeetingItem); } return wrapper.Text; } private string GetEventTooltip(CalendarEventItem item) { List parts = []; if (!string.IsNullOrEmpty(item.EventDefinition?.Name)) { parts.Add($"Event: {item.EventDefinition.Name}"); } if (!string.IsNullOrEmpty(item.EventOccurrenceData?.Name)) { parts.Add($"Occurrence: {item.EventOccurrenceData.Name}"); } if (!string.IsNullOrEmpty(item.EventOccurrenceData?.Location)) { parts.Add($"Location: {item.EventOccurrenceData.Location}"); } if (item.EventOccurrenceData?.StartTime != null) { parts.Add($"Time: {item.EventOccurrenceData.StartTime:g}"); } if (item.StudentFirstNames.Any()) { parts.Add($"Students: {string.Join(", ", item.StudentFirstNames)}"); } return string.Join("\n", parts); } private string GetMeetingTooltip(CalendarMeetingItem item) { if (item.MeetingHistoryData == null) return "Team Meeting"; return $"Team Meeting\nDate: {item.MeetingHistoryData.MeetingDate:g}"; } private async Task OnItemClicked(CalendarItemWrapper wrapper) { if (_calendarItems == null) return; if (wrapper.ItemType == CalendarItemType.Event && wrapper.EventItem != null) { await ShowEventDetails(wrapper.EventItem); } else if (wrapper.ItemType == CalendarItemType.Meeting && wrapper.MeetingItem != null) { await ShowMeetingDetails(wrapper.MeetingItem); } } private async Task ShowEventDetails(CalendarEventItem item) { if (item.EventOccurrenceData == null) return; var parameters = new DialogParameters { ["EventOccurrence"] = item.EventOccurrenceData, ["EventDefinition"] = item.EventDefinition, ["StudentFirstNames"] = item.StudentFirstNames }; var options = new DialogOptions { CloseOnEscapeKey = true, CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true }; await DialogService.ShowAsync("Event Details", parameters, options); } private async Task ShowMeetingDetails(CalendarMeetingItem item) { if (item.MeetingHistoryData == null) return; var parameters = new DialogParameters { ["MeetingHistoryId"] = item.MeetingHistoryData.Id }; var options = new DialogOptions { CloseOnEscapeKey = true, CloseButton = true, MaxWidth = MaxWidth.Large, FullWidth = true }; await DialogService.ShowAsync("Meeting Details", parameters, options); } }