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
+
-
@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
+ 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(