Enhance MeetingSchedule and MeetingHistoryDetailDialog with load into planner functionality
This commit adds a new feature to the MeetingSchedule and MeetingHistoryDetailDialog components, allowing users to load meeting details into the planner. The LoadMeetingIntoPlanner method is implemented in both components, which retrieves team and student data, calculates absent students, and saves the state to localStorage before navigating to the planner. Additionally, a confirmation dialog is introduced in the SaveMeetingHistoryDialog to handle overwriting existing meeting histories, improving user experience and data management in the meeting scheduling feature.
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
@inject ISnackbar Snackbar
|
||||
@inject IDialogService DialogService
|
||||
@inject IMeetingScheduleDataService DataService
|
||||
@inject IMeetingScheduleStateService StateService
|
||||
@inject NavigationManager NavigationManager
|
||||
@implements IAsyncDisposable
|
||||
|
||||
<MudDialog>
|
||||
@@ -128,6 +130,13 @@
|
||||
Delete
|
||||
</MudButton>
|
||||
<MudSpacer />
|
||||
<MudButton Variant="Variant.Text"
|
||||
Color="Color.Secondary"
|
||||
OnClick="LoadIntoPlanner"
|
||||
Disabled="@IsActionDisabled"
|
||||
StartIcon="@Icons.Material.Filled.Upload">
|
||||
Load into Planner
|
||||
</MudButton>
|
||||
<MudButton Variant="Variant.Text"
|
||||
Color="Color.Primary"
|
||||
OnClick="OpenEditDialog"
|
||||
@@ -432,6 +441,57 @@
|
||||
return allStudents;
|
||||
}
|
||||
|
||||
private async Task LoadIntoPlanner()
|
||||
{
|
||||
if (_isDisposed || _meetingHistory == null) return;
|
||||
|
||||
try
|
||||
{
|
||||
// Get all teams and students from database
|
||||
var allTeams = await DataService.LoadTeamsAsync();
|
||||
var allStudents = await DataService.LoadStudentsAsync();
|
||||
|
||||
// Match teams from history to all teams by ID for reference equality
|
||||
var historyTeamIds = _meetingHistory.Teams.Select(t => t.Id).ToHashSet();
|
||||
var scheduledTeams = allTeams.Where(t => historyTeamIds.Contains(t.Id));
|
||||
|
||||
// Calculate absent students (all students not in the meeting history's student list)
|
||||
var presentStudentIds = _meetingHistory.Students.Select(s => s.Id).ToHashSet();
|
||||
var absentStudents = allStudents.Where(s => !presentStudentIds.Contains(s.Id));
|
||||
|
||||
// Save state to localStorage
|
||||
await StateService.SaveScheduledTeamsAsync(scheduledTeams);
|
||||
await StateService.SaveAbsentStudentsAsync(absentStudents);
|
||||
// Clear extended teams and excluded students when loading from history
|
||||
await StateService.SaveExtendedTeamsAsync([]);
|
||||
await StateService.SaveExcludedStudentsAsync(new Dictionary<(int teamId, int timeSlotIndex, int studentId), bool>());
|
||||
|
||||
// Close dialog and navigate to planner
|
||||
MudDialog.Close();
|
||||
NavigationManager.NavigateTo("/meeting-schedule");
|
||||
|
||||
if (!_isDisposed)
|
||||
{
|
||||
Snackbar.Add($"Loaded meeting from {_meetingHistory.MeetingDate:MM/dd/yyyy} into planner", Severity.Success);
|
||||
}
|
||||
}
|
||||
catch (TaskCanceledException)
|
||||
{
|
||||
// Component was disposed, ignore
|
||||
}
|
||||
catch (JSDisconnectedException)
|
||||
{
|
||||
// JS connection lost, ignore
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!_isDisposed)
|
||||
{
|
||||
Snackbar.Add($"Error loading meeting into planner: {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Close()
|
||||
{
|
||||
if (_isDisposed) return;
|
||||
|
||||
Reference in New Issue
Block a user