131 lines
3.6 KiB
Plaintext
131 lines
3.6 KiB
Plaintext
@using Core.Entities
|
|
|
|
@model Tuple<IList<Team>[], IEnumerable<Student>[], Web.Controllers.HomeController.ScheduleOptions>
|
|
|
|
@{
|
|
ViewData["Title"] = "Schedule";
|
|
var slot = 0;
|
|
|
|
var schedule = Model.Item1;
|
|
var unassignedStudents = Model.Item2;
|
|
var allStudents = schedule.SelectMany(t => t).SelectMany(t => t.Students).Distinct().ToList();
|
|
var allMeetingTeams = schedule.SelectMany(t => t).Distinct();
|
|
}
|
|
|
|
<div class="bluewhite p-5">
|
|
@{
|
|
List<(Student student, IEnumerable<Team> teams)> overlaps;
|
|
}
|
|
@foreach (var timeslot in schedule)
|
|
{
|
|
overlaps = TeamSchedulerSolution.GetStudentTeamOverlaps(timeslot).ToList();
|
|
var partialTeams = timeslot.Where(t => t is PartialTeam && t.EventDefinition.EventFormat is not EventFormat.Individual);
|
|
var fullTeams = timeslot.Where(t => !partialTeams.Contains(t));
|
|
|
|
<h3>Time Slot @(slot + 1)</h3>
|
|
<p>@Model.Item3.Date.ToShortDateString()</p>
|
|
|
|
<h4>Teams</h4>
|
|
<table class="table schedule">
|
|
<thead>
|
|
<th class="col-2"></th>
|
|
<th class="col-3"></th>
|
|
<th class="col-5"></th>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var team in fullTeams.Where(t => t.EventDefinition.EventFormat is EventFormat.Team).OrderBy(t => t.Name))
|
|
{
|
|
@await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps, Model.Item3.AbsentStudents))
|
|
}
|
|
</tbody>
|
|
</table>
|
|
|
|
if (partialTeams.Any())
|
|
{
|
|
<table class="table schedule">
|
|
<thead>
|
|
<th class="col-2"></th>
|
|
<th class="col-3"></th>
|
|
<th class="col-5"></th>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var team in partialTeams.OrderBy(t => t.Name))
|
|
{
|
|
@await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps, Model.Item3.AbsentStudents))
|
|
}
|
|
</tbody>
|
|
</table>
|
|
}
|
|
|
|
<h4>Individual</h4>
|
|
<p><i>Use time for individual eventDefinition or to <strong>work on a team eventDefinition</strong> </i></p>
|
|
<table class="table schedule">
|
|
<tbody>
|
|
|
|
<tr>
|
|
|
|
@foreach (var team in fullTeams.Where(t => t.EventDefinition.EventFormat is EventFormat.Individual).OrderBy(t => t.Name))
|
|
{
|
|
<td>
|
|
<strong>@team.Captain?.FirstName</strong> (@team.EventDefinition.Name@if(team.EventDefinition.RegionalEvent){ @* <text> (<i>Regional</i>)</text> *@})
|
|
</td>
|
|
@* @await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps)) *@
|
|
}
|
|
|
|
@foreach (var student in unassignedStudents[slot])
|
|
{
|
|
<td>
|
|
<strong>@student.FirstName</strong>
|
|
</td>
|
|
}
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
slot++;
|
|
}
|
|
|
|
<h3>Missed team eventDefinitions for today</h3>
|
|
<table class="table schedule">
|
|
@foreach (var student in allStudents.OrderBy(s => s.FirstName))
|
|
{
|
|
var studentMeetings = student.Teams.Where(t => allMeetingTeams.Any(mt => mt.Name == t.Name && mt.Students.Contains(student)));
|
|
var studentMissed = student.Teams.Where(t => studentMeetings.All(mt => mt.Name != t.Name)).ToList();
|
|
var studentMissedTeams = studentMissed.Where(t => t.EventDefinition.EventFormat is EventFormat.Team);
|
|
var studentMissedIndividual = studentMissed.Where(t => t.EventDefinition.EventFormat is EventFormat.Individual);
|
|
if (studentMissedTeams.Any())
|
|
{
|
|
<tr>
|
|
<td class="col-4">@student.FirstName</td>
|
|
<td>
|
|
@string.Join(", ", studentMissedTeams.Select(t => t.ToStringWithIndividualAndRegional()))
|
|
</td>
|
|
</tr>
|
|
}
|
|
if (studentMissedIndividual.Any())
|
|
{
|
|
<tr>
|
|
<td class="col-4">@student.FirstName</td>
|
|
<td>
|
|
@string.Join(", ", studentMissedIndividual.Select(t => t.ToStringWithIndividualAndRegional()))
|
|
</td>
|
|
</tr>
|
|
}
|
|
}
|
|
</table>
|
|
</div>
|
|
|
|
|
|
@functions
|
|
{
|
|
private void GetTeamClass(Team team)
|
|
{
|
|
if (team.EventDefinition.RegionalEvent)
|
|
{
|
|
@Html.Raw("regional")
|
|
;
|
|
}
|
|
}
|
|
}
|