From b7fa7fcbe1fc37899262647da131997bd3aa4ffc Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 31 Oct 2025 13:29:43 -0400 Subject: [PATCH] Add recomendations for meeting scheduler --- Core/Calculation/TeamIdComparer.cs | 16 +++ Core/Calculation/TeamSchedulerSolution.cs | 4 +- Core/Entities/Team.cs | 13 ++ .../Pages/MeetingSchedulePages/Index.razor | 121 +++++++++--------- 4 files changed, 93 insertions(+), 61 deletions(-) create mode 100644 Core/Calculation/TeamIdComparer.cs diff --git a/Core/Calculation/TeamIdComparer.cs b/Core/Calculation/TeamIdComparer.cs new file mode 100644 index 0000000..4a9fe3b --- /dev/null +++ b/Core/Calculation/TeamIdComparer.cs @@ -0,0 +1,16 @@ +using Core.Entities; + +namespace Core.Calculation; + +public class TeamIdComparer : IEqualityComparer +{ + public bool Equals(Team? x, Team? y) + { + return x != null && y != null && x.Id == y.Id; + } + + public int GetHashCode(Team obj) + { + return obj.Id.GetHashCode(); + } +} \ No newline at end of file diff --git a/Core/Calculation/TeamSchedulerSolution.cs b/Core/Calculation/TeamSchedulerSolution.cs index f7a6d0b..5701fa4 100644 --- a/Core/Calculation/TeamSchedulerSolution.cs +++ b/Core/Calculation/TeamSchedulerSolution.cs @@ -11,7 +11,9 @@ public class TeamSchedulerSolution( public TeamScheduleTimeSlot[] TimeSlots { get; set; } = timeSlots.Select( (teams,i) => - new TeamScheduleTimeSlot{Name = i.ToString(), Teams = teams, + new TeamScheduleTimeSlot{ + Name = "Time Slot " + (i + 1), + Teams = teams, StudentOverlaps = GetStudentTeamOverlaps(teams), UnscheduledStudents = GetStudentsNotInTimSlot(teams, students) } diff --git a/Core/Entities/Team.cs b/Core/Entities/Team.cs index 2424d19..f2d26e6 100644 --- a/Core/Entities/Team.cs +++ b/Core/Entities/Team.cs @@ -62,4 +62,17 @@ public class Team { return $"{Event.Name} {(Identifier != null ? $"({Identifier})" : "")}"; } + + public string StudentsFirstNames + { + get + { + return + string.Join(", ", + Students.Select(e => + e.FirstName + + (Captain != null && (Captain.Equals(e)) ? "(Cpt)" : "")) + ); + } + } } \ No newline at end of file diff --git a/WebApp/Components/Pages/MeetingSchedulePages/Index.razor b/WebApp/Components/Pages/MeetingSchedulePages/Index.razor index 13a6351..67d7c5c 100644 --- a/WebApp/Components/Pages/MeetingSchedulePages/Index.razor +++ b/WebApp/Components/Pages/MeetingSchedulePages/Index.razor @@ -16,14 +16,16 @@ Time Slots - + + Add High Effort + Add Regionals @@ -55,68 +57,74 @@ - - @foreach (var team in context.Teams.OrderBy(e => e.ToString())) - { - var removed = !_scheduledTeams.Contains(team); - - - - - @team - - @foreach (var student in team.Students) - { - var overlap = context.StudentHasOverlaps(student); - var color = overlap ? Color.Warning : Color.Default; + + + + @context.Name + @foreach (var team in context.Teams.OrderBy(e => e.ToString())) + { + var removed = !_scheduledTeams.Contains(team); - -  @student.FirstName@(overlap ? "*" : "") - - } - - - } - - - - @if (context.UnscheduledStudents.Any()) - { - Unscheduled - - @foreach (var student in context.UnscheduledStudents) - { - - @student.FirstName   - @{ - var pa = _possibleAdditions.ToArray(); - } + + + + @team - + @{var first = true;} + @foreach (var student in team.Students) + { + var overlap = context.StudentHasOverlaps(student); + var color = overlap ? Color.Warning : Color.Default; + + @if(!first) {, } + {first = false;} + +  @student.FirstName@(overlap ? "*" : "") + + } + + + } + + + + @if (context.UnscheduledStudents.Any()) + { + Unscheduled + + @foreach (var student in context.UnscheduledStudents) + { + + @student.FirstName  + @{var first = true;} @foreach (var unassignedTeam in _solution.StudentUnassignedTeams(student)) { - var color = pa.Contains(unassignedTeam) ? Color.Error : Color.Default; + var color = _possibleAdditions.Contains(unassignedTeam, new TeamIdComparer()) ? Color.Success : Color.Default; var added = _scheduledTeams.Contains(unassignedTeam); + @if(!first) {, } + {first = false;} - @unassignedTeam + @unassignedTeam } - - } - - } + + } + + } + + @@ -124,7 +132,6 @@ Scheduled Teams - @string.Join(", ", (_possibleAdditions ?? []).Select(e => e.ToString())) e.Event.Name)) { - s.FirstName))"> +
@team.ToString() @@ -150,7 +157,7 @@ @code { private Team[]? _teams; - private Student[]? _students; + private Student[]? _students; // TODO: Add absent student functionality MudTable _solutionData; private TeamSchedulerSolution _solution; private TeamSchedulerOptions _parameters; @@ -255,14 +262,8 @@ private async Task> SolveSchedule(TableState arg1, CancellationToken arg2) { _isSolving = true; + var teamScheduler = new TeamScheduler(_scheduledTeams, _parameters.TimeSlots); - - // teamScheduler - // .ScheduleSeparate( - // _teams.First(e => e.Event.Name.Contains("Data Science")), - // _teams.First(e => e.Event.Name.Contains("Microcontroller Design")) - // ); - _solution = teamScheduler.Solve(); var loe = new UnassignedStudentScheduler(_teams, _solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.LevelOfEffort);