diff --git a/Core/Calculation/TeamScheduler.cs b/Core/Calculation/TeamScheduler.cs index 0748d35..61489eb 100644 --- a/Core/Calculation/TeamScheduler.cs +++ b/Core/Calculation/TeamScheduler.cs @@ -84,9 +84,10 @@ public class TeamScheduler foreach (var s in _timeSlots) model.Add(x[ts.Item1, s] != x[ts.Item2, s]); - var solver = new CpSolver(); - - var cpSolverStatus = solver.Solve(model); + var solver = new CpSolver(); + solver.StringParameters = "max_time_in_seconds:2.0"; + + var cpSolverStatus = solver.Solve(model); Debug.WriteLine($"Solver status: {cpSolverStatus}"); var timeSlotTeams = new Team[_timeSlots.Length][]; diff --git a/Core/Calculation/TeamSchedulerSolution.cs b/Core/Calculation/TeamSchedulerSolution.cs index 7735cf2..e3ac173 100644 --- a/Core/Calculation/TeamSchedulerSolution.cs +++ b/Core/Calculation/TeamSchedulerSolution.cs @@ -29,4 +29,16 @@ public class TeamSchedulerSolution( where gs.Key.Count() > 1 select Tuple.Create(gs.First(), gs.Key); } + + + public static Student[] GetStudentsNotInTimSlot(Team[] timeSlot, Student[] students) + { + var studentsInTimeSlot = timeSlot.SelectMany(ts => ts.Students).Distinct(); + return + (from allStudent in students + where studentsInTimeSlot.FirstOrDefault(e => e.Equals(allStudent)) == null + select allStudent + ).ToArray(); + + } } \ No newline at end of file diff --git a/Core/Entities/EventDefinition.cs b/Core/Entities/EventDefinition.cs index 55554c5..01ff23e 100644 --- a/Core/Entities/EventDefinition.cs +++ b/Core/Entities/EventDefinition.cs @@ -5,9 +5,20 @@ namespace Core.Entities; public class EventDefinition { public int Id { get; set; } + + [Required] + [StringLength(100, MinimumLength = 2)] + [Display(Name = "Event Name")] + public string Name { get; set; } - public string? ShortName { get; set; } - public EventFormat EventFormat { get; set; } + + [Required] + [StringLength(40, MinimumLength = 2)] + [Display(Name = "Event Short Name")] + public string? ShortName { get; set; } + + [Required] + public EventFormat EventFormat { get; set; } [Range(1, 6)] public int MinTeamSize { get; set; } @@ -55,6 +66,7 @@ public class EventDefinition public string? Documentation { get; set; } + [Required] public string Eligibility { get; set; } public string? Theme { get; set; } public string? Description { get; set; } diff --git a/WebApp/Components/Pages/EventDefinitionPages/Create.razor b/WebApp/Components/Pages/EventDefinitionPages/Create.razor index c6744d6..992ef45 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Create.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Create.razor @@ -1,134 +1,63 @@ @page "/events/create" -@using Microsoft.EntityFrameworkCore -@using Core.Entities -@using Data @inject AppDbContext context @inject NavigationManager NavigationManager -Create +Create Event - TSA Chapter Organizer -

Create

+Create +Event + -

EventDefinition

-
-
-
- - - -
- - - -
-
- - - -
-
- - - @foreach (var format in Enum.GetValues(typeof(EventFormat))) + + + + + + + + + + + + @* Team + Individual *@ + @foreach (EventFormat format in Enum.GetValues(typeof(EventFormat))) { - + @(format.ToString()) } - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
- -
-
-
+ + + + + + + + + + + + + + + + + + + + + Back + Save + -
- Back to List -
@code { [SupplyParameterFromForm] private EventDefinition EventDefinition { get; set; } = new(); - // To protect from overposting attacks, see https://learn.microsoft.com/aspnet/core/blazor/forms/#mitigate-overposting-attacks. - private async Task AddEventDefinition() + private void OnValidSubmit() { context.Events.Add(EventDefinition); - await context.SaveChangesAsync(); + context.SaveChanges(); NavigationManager.NavigateTo("/events"); } } diff --git a/WebApp/Components/Pages/EventDefinitionPages/Delete.razor b/WebApp/Components/Pages/EventDefinitionPages/Delete.razor index 75c2ff0..d0936be 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Delete.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Delete.razor @@ -1,7 +1,5 @@ @page "/events/delete" @using Microsoft.EntityFrameworkCore -@using Core.Entities -@using Data @inject AppDbContext context @inject NavigationManager NavigationManager diff --git a/WebApp/Components/Pages/EventDefinitionPages/Details.razor b/WebApp/Components/Pages/EventDefinitionPages/Details.razor index 8a18d16..ce62a3c 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Details.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Details.razor @@ -1,7 +1,5 @@ @page "/events/details" @using Microsoft.EntityFrameworkCore -@using Core.Entities -@using Data @inject AppDbContext context @inject NavigationManager NavigationManager diff --git a/WebApp/Components/Pages/StudentPages/Create.razor b/WebApp/Components/Pages/StudentPages/Create.razor index 0ca940d..bd7c903 100644 --- a/WebApp/Components/Pages/StudentPages/Create.razor +++ b/WebApp/Components/Pages/StudentPages/Create.razor @@ -8,50 +8,34 @@ Student -
-
- - - -
- - - -
-
- - - -
-
- - - -
-
- - - -
- - -
-
-
-
- Back to List -
+ + + + + + + + + + + + + + + Back + Save + @code { [SupplyParameterFromForm] private Student Student { get; set; } = new() { TsaYear = 1 }; - private async Task AddStudent() + private void OnValidSubmit(EditContext context) { - + Context.Students.Add(Student); - await Context.SaveChangesAsync(); + Context.SaveChanges(); NavigationManager.NavigateTo("/students"); } } diff --git a/WebApp/Components/Pages/StudentPages/EventRanking.razor b/WebApp/Components/Pages/StudentPages/EventRanking.razor index c4552b8..a05d8fe 100644 --- a/WebApp/Components/Pages/StudentPages/EventRanking.razor +++ b/WebApp/Components/Pages/StudentPages/EventRanking.razor @@ -21,39 +21,19 @@ else Name Grade TSA Year - 1st - 2nd - 3rd - 4th - 5th - 6th - 7th - 8th - 9th - 10th Warnings + @for (var i = 1; i <= 10; i++) + { + var ii = i; + @AppIcons.GetOrdinal(ii) + } @context.FirstName @context.Grade @context.TsaYear - - @for (var i = 1; i <= 10; i++) - { - var st = context.EventRankings.FirstOrDefault(e => e.Rank == i); - - @if (st != null) - { - @st.EventDefinition.ShortName  - @if(st.EventDefinition.EventFormat == EventFormat.Individual) { } - @if(st.EventDefinition.RegionalEvent) {} - @if(st.EventDefinition.OnSiteActivity) {} - - } - - } Edit @if (!context.RankedEvents.Any(re => re.OnSiteActivity)) @@ -76,6 +56,22 @@ else } + @for (var i = 1; i <= 10; i++) + { + var ii = i; + var st = context.EventRankings.FirstOrDefault(e => e.Rank == i); + + @if (st != null) + { + @st.EventDefinition.ShortName  + @if(st.EventDefinition.EventFormat == EventFormat.Individual) { } + @if(st.EventDefinition.RegionalEvent) {} + @if(st.EventDefinition.OnSiteActivity) {} + + } + + } + diff --git a/WebApp/Components/Pages/TeamPages/Scheduler.razor b/WebApp/Components/Pages/TeamPages/Scheduler.razor index 0c70add..d67b49c 100644 --- a/WebApp/Components/Pages/TeamPages/Scheduler.razor +++ b/WebApp/Components/Pages/TeamPages/Scheduler.razor @@ -16,19 +16,31 @@ + @{ + var ol = TeamSchedulerSolution.GetStudentTeamOverlaps(context);} @foreach (var t in context) { - @t.ToString() - - @string.Join(", ", t.Students) + @t.ToString() - + @string.Join(", ", t.Students.Select(s => s.FirstName + " " + (ol.Any(o => o.Item1.Equals(s)) ? "*" : "" )) ) } - @foreach (var overlap in TeamSchedulerSolution.GetStudentTeamOverlaps(context)) + @* @foreach (var overlap in ol) { @string.Join(", ", overlap.Item1) + } *@ + + @{ var notInTimeSLot = TeamSchedulerSolution.GetStudentsNotInTimSlot(context, _students); } + @if (notInTimeSLot.Any()) { + + + Not scheduled: @string.Join(", ", notInTimeSLot.Select(s => s.FirstName)) + + } + @@ -93,9 +105,12 @@ ); var mustIncludeTeams = _teams; - mustIncludeTeams = mustIncludeTeams.Where(t => t.Event.EventFormat == EventFormat.Team).ToArray(); + mustIncludeTeams = mustIncludeTeams.Where(t => t.Event.EventFormat != EventFormat.Individual).ToArray(); + mustIncludeTeams = mustIncludeTeams.Where(t => !t.ToString().Contains("#1")).ToArray(); + //mustIncludeTeams = mustIncludeTeams.Where(t => !t.ToString().Contains("Photo")).ToArray(); - var teamScheduler = new TeamScheduler(mustIncludeTeams, scheduleOptions.TimeSlots); + var teamScheduler = new TeamScheduler(mustIncludeTeams, 3); + // teamScheduler // .ScheduleSeparate(