Add some local storage to save settings between
page reloads.
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
@inject IConfiguration Configuration
|
||||
@inject AppDbContext Context
|
||||
@inject ClipboardService ClipboardService
|
||||
@inject LocalStorageService LocalStorage
|
||||
|
||||
<PageTitle>@Configuration["ChapterSettings:Shortname"] TSA Schedule @Configuration["ChapterSettings:CompetitionYear"]</PageTitle>
|
||||
|
||||
@@ -18,7 +19,8 @@
|
||||
<MudPaper Class="pa-2 ma-2" Elevation="3">
|
||||
<MudGrid>
|
||||
<MudItem xs="6" sm="3" lg="2">
|
||||
<MudNumericField @bind-Value="_parameters.TimeSlots"
|
||||
<MudNumericField Value="_parameters.TimeSlots"
|
||||
ValueChanged="async (int val) => await OnTimeSlotCountChanged(val)"
|
||||
Label="Time Slots" Min="1" Max="4">
|
||||
</MudNumericField>
|
||||
</MudItem>
|
||||
@@ -83,13 +85,15 @@
|
||||
<MudItem xs="5" sm="4" lg="3">
|
||||
<MudStack>
|
||||
<StudentTextBoxSelector Students="@_students"
|
||||
@bind-SelectedStudents="_absentStudents"
|
||||
SelectedStudents="_absentStudents"
|
||||
SelectedStudentsChanged="OnAbsentStudentsChanged"
|
||||
Title="Absent Students"
|
||||
Label="Search for absent students"
|
||||
ShowFullName="true"/>
|
||||
<MudDivider Class="my-4"/>
|
||||
<TeamToggleSelector Teams="@_teams"
|
||||
@bind-SelectedTeams="_scheduledTeams"
|
||||
SelectedTeams="_scheduledTeams"
|
||||
SelectedTeamsChanged="OnScheduledTeamsChanged"
|
||||
Title="Scheduled Teams"
|
||||
ShowEventAttributes="true" />
|
||||
</MudStack>
|
||||
@@ -109,43 +113,67 @@
|
||||
private IEnumerable<Student> _absentStudents = [];
|
||||
private IEnumerable<Team> _possibleAdditions = [];
|
||||
|
||||
private void AddRegionals()
|
||||
private async Task OnScheduledTeamsChanged(IEnumerable<Team> teams)
|
||||
{
|
||||
_scheduledTeams = teams;
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private async Task OnAbsentStudentsChanged(IEnumerable<Student> students)
|
||||
{
|
||||
_absentStudents = students;
|
||||
await SaveAbsentStudents();
|
||||
}
|
||||
|
||||
private async Task OnTimeSlotCountChanged(int timeSlots)
|
||||
{
|
||||
_parameters.TimeSlots = timeSlots;
|
||||
await SaveTimeSlotCount();
|
||||
}
|
||||
|
||||
private async void AddRegionals()
|
||||
{
|
||||
_scheduledTeams
|
||||
= _teams.Where(e => e.Event.RegionalEvent).Concat(_scheduledTeams).Distinct();
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void AddHighLevelOfEffort()
|
||||
private async void AddHighLevelOfEffort()
|
||||
{
|
||||
_scheduledTeams
|
||||
= _teams.Where(e => e.Event.LevelOfEffort >= 3).Concat(_scheduledTeams).Distinct();
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void RemoveIndividual()
|
||||
private async void RemoveIndividual()
|
||||
{
|
||||
_scheduledTeams
|
||||
= _scheduledTeams.Where(t => t.Event.EventFormat != EventFormat.Individual);
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void RemoveLowLevelOfEffort()
|
||||
private async void RemoveLowLevelOfEffort()
|
||||
{
|
||||
_scheduledTeams
|
||||
= _scheduledTeams.Where(t => t.Event.LevelOfEffort > 1);
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void Invert()
|
||||
private async void Invert()
|
||||
{
|
||||
var rt = _scheduledTeams.ToArray();
|
||||
_scheduledTeams
|
||||
= _teams.Where(t => !rt.Contains(t));
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
private async void Reset()
|
||||
{
|
||||
_scheduledTeams = [];
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
private void ToggleRequiredTeam(Team unassignedTeam)
|
||||
private async void ToggleRequiredTeam(Team unassignedTeam)
|
||||
{
|
||||
if (_scheduledTeams.Contains(unassignedTeam))
|
||||
_scheduledTeams = _scheduledTeams.Where(t => t != unassignedTeam);
|
||||
@@ -153,6 +181,7 @@
|
||||
{
|
||||
_scheduledTeams = _scheduledTeams.Concat(new[] { unassignedTeam });
|
||||
}
|
||||
await SaveScheduledTeams();
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
@@ -201,6 +230,55 @@
|
||||
.Include(e => e.EventRankings)
|
||||
.ThenInclude(e => e.EventDefinition)
|
||||
.OrderBy(e => e.FirstName).ToArrayAsync();
|
||||
|
||||
// Load saved selections from localStorage
|
||||
await LoadScheduledTeams();
|
||||
await LoadAbsentStudents();
|
||||
await LoadTimeSlotCount();
|
||||
}
|
||||
|
||||
private async Task SaveScheduledTeams()
|
||||
{
|
||||
var teamIds = _scheduledTeams.Select(t => t.Id).ToArray();
|
||||
await LocalStorage.SetIntArrayAsync("MeetingSchedule_ScheduledTeams", teamIds);
|
||||
}
|
||||
|
||||
private async Task LoadScheduledTeams()
|
||||
{
|
||||
var teamIds = await LocalStorage.GetIntArrayAsync("MeetingSchedule_ScheduledTeams");
|
||||
if (teamIds.Length > 0)
|
||||
{
|
||||
_scheduledTeams = _teams.Where(t => teamIds.Contains(t.Id)).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SaveAbsentStudents()
|
||||
{
|
||||
var studentIds = _absentStudents.Select(s => s.Id).ToArray();
|
||||
await LocalStorage.SetIntArrayAsync("MeetingSchedule_AbsentStudents", studentIds);
|
||||
}
|
||||
|
||||
private async Task LoadAbsentStudents()
|
||||
{
|
||||
var studentIds = await LocalStorage.GetIntArrayAsync("MeetingSchedule_AbsentStudents");
|
||||
if (studentIds.Length > 0)
|
||||
{
|
||||
_absentStudents = _students.Where(s => studentIds.Contains(s.Id)).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SaveTimeSlotCount()
|
||||
{
|
||||
await LocalStorage.SetIntAsync("MeetingSchedule_TimeSlotCount", _parameters.TimeSlots);
|
||||
}
|
||||
|
||||
private async Task LoadTimeSlotCount()
|
||||
{
|
||||
var timeSlots = await LocalStorage.GetIntAsync("MeetingSchedule_TimeSlotCount", defaultValue: 2);
|
||||
if (timeSlots > 0)
|
||||
{
|
||||
_parameters.TimeSlots = timeSlots;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<TableData<TeamScheduleTimeSlot>> SolveSchedule(TableState arg1, CancellationToken arg2)
|
||||
|
||||
Reference in New Issue
Block a user