Files
chapter-organizer/Web-Original/Views/Home/State.cshtml
T
poprhythm c462ed4561 Enhance event definitions and parsing logic for new event types
Added new event definitions for "Meet the Candidates", "Chapter Officer Meeting", "Voting Delegate Meeting", and "Social Gathering". Updated the EventOccurrenceParser to handle these new event types and modified related services and views to accommodate the changes. Improved test coverage for the new event definitions and ensured proper parsing and display in the calendar components.
2025-12-27 19:32:54 -05:00

368 lines
9.5 KiB
Plaintext

@using System.Text.RegularExpressions
@using Core.Entities
@using Core.Utility
@model Tuple<Team[], Student[], IDictionary<EventDefinition, List<EventOccurrence>>>
@{
ViewData["Title"] = "Teams";
var eventOccurrences = Model.Item3;
}
<div class="container nobrk pt-5">
<h2>State EventDefinitions</h2>
<table class="table">
<thead>
<tr>
<td>Team</td>
<td>Team Members</td>
<td>Dates</td>
<td>Materials</td>
</tr>
</thead>
@foreach (var team in Model.Item1)
{
var students = team.Students;
@if (true @* team.EventDefinition.EventDefinitionFormat == EventDefinitionEventDefinitionFormat.Team *@)
{
<tr>
<td>
@* <strong class="@{ GetTeamClass(team);}">@team.Name</strong> *@
@team.Name @* #@team.TeamNumber
*@ </td>
<td>
@{
var first = true;
}
@foreach (var student in students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
{
@if (!first)
{
<text>, </text>
}
first = false;
@student.FirstNameLastName @if (team.Captain == student)
{
<text> (Cpt. @team.Captain.StateID)</text>
}
}
</td>
<td>
@if (team.EventDefinition.StatePresubmission)
{
<text>Pre-submission due Friday, March 14</text>
}
@if (team.EventDefinition.StatePretesting)
{
<text>Pre-testing Wednesday, April 2nd</text>
}
@if (team.EventDefinition.StatePreliminaryRound)
{
<text>Preliminary and Semifinalist Rounds</text>
}
</td>
<td>
@team.EventDefinition.Documentation
</td>
</tr>
}
@* else if (team.EventDefinition.EventDefinitionFormat == EventDefinitionEventDefinitionFormat.Individual)
{
foreach (var student in students)
{
<tr>
<td>
@team.EventDefinition.Name - @student.FirstNameLastName (@student.RegionalID)
</td>
<td>@team.RegionalTimeSlot</td>
<td></td>
</tr>
}
} *@
}
</table>
</div>
@{
var s = Model.Item2.OrderBy(s => s.LastNameFirstName);
@foreach (var student in s)
{
<div class="container nobrk pt-5" style="page-break-before: always;">
<h3>@student.FirstNameLastName - @student.StateID</h3>
<h4>TSA 2025 TN State Schedule</h4>
<div class="row">
<div class="col col-2">EventDefinitions</div>
<div class="col">
@foreach (var ev in student.Teams)
{
<div class="row">
<div class="col col-2">
@if (ev.EventDefinition.EventFormat is EventFormat.Team)
{
@ev.TeamNumber
}
else
{
@ev.Captain.StateID
}
</div>
<div class="col-4">
<text> @ev.Name
@if (ev.Captain == student)
{
<strong>(Cpt.)</strong>
}
</text>
</div>
<div class="col-6">
@ev.EventDefinition.SemifinalistActivity
</div>
</div>
}
</div>
</div>
<table class="table">
<thead>
<tr>
<td>Time</td>
<td>EventDefinition</td>
<td></td>
<td>Location</td>
</tr>
</thead>
@foreach (var date in
eventOccurrences
.Where(eo =>
student.Teams.Select(t => t.EventDefinition).Any(a => a == eo.Key)
|| eo.Key == EventDefinition.GeneralSchedule
|| eo.Key == EventDefinition.MeetTheCandidates
|| (eo.Key == EventDefinition.ChapterOfficerMeeting && student.OfficerRole != null)
|| (eo.Key == EventDefinition.VotingDelegateMeeting && student.VotingDelegate))
.SelectMany(eo => eo.Value.Select(v => Tuple.Create(v, eo.Key)))
.GroupBy(de => de.Item1.Date + ", " + de.Item1.StartTime.DayOfWeek)
.OrderBy(d => d.Key)
)
{
var eventsForThisDay =
date
.Where(de => de.Item1.Name != "Judging")
.Where(de => de.Item1.StartTime > new DateTime(2024, 3, 1))
// filter out occurrences where non-captain
.Where(de =>
!de.Item1.SignupSubmitPickup
|| de.Item2.EventFormat is EventFormat.Individual
|| student.Teams.Any(t => t.Captain == student && t.EventDefinition == de.Item2)
)
.OrderBy(de => de.Item1.StartTime);
@if (!eventsForThisDay.Any())
continue;
<tr>
<td colspan="4"><strong>@date.Key</strong></td>
</tr>
@foreach (var eventOccurrence in eventsForThisDay.OrderBy(de => de.Item1.StartTime))
{
<tr>
<td>@eventOccurrence.Item1.Time</td>
<td>@eventOccurrence.Item2.Name</td>
<td>@eventOccurrence.Item1.Name
@if (eventOccurrence.Item1.Name.Contains("Pick") && eventOccurrence.Item2.EventFormat is EventFormat.Team)
{
<br/>
<text>or coordinate with a teammate</text>
}
</td>
<td>@eventOccurrence.Item1.Location
@if (eventOccurrence.Item1.Location == "Online" && eventOccurrence.Item1.Name.Contains("Sign-up") ) { <text>by Advisor</text>}
</td>
</tr>
}
}
</table>
</div>
}
}
@{
<div class="container nobrk pt-5">
<h2>Combined Schedule</h2>
<table class="table">
<thead>
<tr>
<td>Time</td>
<td>Team</td>
<td></td>
<td>Location</td>
</tr>
</thead>
<tbody>
@foreach (var eventsForDate
in Model.Item3.SelectMany(eo => eo.Value.Select(e => Tuple.Create(e, eo.Key)))
.Where(de => de.Item1.Name != "Judging")
.GroupBy(eo => eo.Item1.StartTime.Date)
.OrderBy(eo => eo.Key)
)
{
<tr><td colspan="4"><strong>@eventsForDate.Key.ToString("MMMM d") </strong> </td></tr>
@foreach (var occurrence in eventsForDate.OrderBy(o => o.Item1.StartTime))
{
var teams = Model.Item1.Where(t => t.EventDefinition == occurrence.Item2);
if (occurrence.Item2 != EventDefinition.GeneralSchedule
&& occurrence.Item2 != EventDefinition.MeetTheCandidates
&& occurrence.Item2 != EventDefinition.ChapterOfficerMeeting
&& occurrence.Item2 != EventDefinition.VotingDelegateMeeting
&& !teams.Any())
continue;
<tr>
<td>@occurrence.Item1.Time</td>
<td>
@if (occurrence.Item2 == EventDefinition.GeneralSchedule || occurrence.Item2 == EventDefinition.MeetTheCandidates)
{
<text>Everyone</text>
}
else if (occurrence.Item2 == EventDefinition.ChapterOfficerMeeting)
{
<text>Chapter Officers - @string.Join(", ", Model.Item2.Where(stu => stu.OfficerRole != null).Select(stu => stu.FirstName))</text>
}
else if (occurrence.Item2 == EventDefinition.VotingDelegateMeeting)
{
<text>Voting Delegates - @string.Join(", ", Model.Item2.Where(stu => stu.VotingDelegate).Select(stu => stu.FirstName))</text>
}
@foreach (var team in teams)
{
<text>@team</text>
<text> - @string.Join(", ", team.Students.Select(stu => stu.FirstName))</text>
}
</td>
<td>
@occurrence.Item1.Name
@if (occurrence.Item1.SignupSubmitPickup)
{
<br/>
<text>1 Team Member</text>
}
@if (occurrence.Item1.Name.Contains("Semifinalist") && (occurrence.Item1.Name.Contains("Interview") || occurrence.Item1.Name.Contains("Presentation")))
{
<br/>
<text>@Regex.Match(@occurrence.Item2.SemifinalistActivity, @"(?<=\().*?(?=\))").Value</text>
}
</td>
<td>@occurrence.Item1.Location</td>
</tr>
}
}
</tbody>
</table>
</div>
}
<div class="container nobrk pt-5">
<h2>Students</h2>
<table class="table-primary">
<thead>
<tr>
<td>Student</td>
<td>ID</td>
</tr>
</thead>
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
{
var assignments
= student.Teams.Where(ea => ea.Students.Contains(student))
.Distinct()
.OrderBy(e => e.Name).ToList();
<tr>
<td>
<strong>@student.FirstNameLastName</strong> @if (!string.IsNullOrEmpty(student.Officer))
{
<text>(@student.Officer)</text>
}
</td>
<td>@student.StateID</td>
@foreach (var t in assignments)
{
<td>
@if (t.EventDefinition.EventFormat != EventFormat.Individual)
{
@t.Name
@if (t.Captain == student)
{
<text> (Captain)</text>
}
}
else
{
@t.EventDefinition.Name
}
@{
if (t.EventDefinition.EventFormat == EventFormat.Individual)
{
<sup class="activity">(ind)</sup>
}
if (t.EventDefinition.OnSiteActivity)
{
<sup class="activity">(act)</sup>
}
}
</td>
}
</tr>
}
</table>
</div>
<div class="container nobrk pt-5">
<h2>Students</h2>
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
{
var assignments
= student.Teams.Where(ea => ea.Students.Contains(student))
.Distinct()
.OrderBy(e => e.Name).ToList();
<p>
<strong>@student.FirstNameLastName</strong>
@if (!string.IsNullOrEmpty(student.Officer))
{
<text>(@student.Officer)</text>
}
<text>@student.StateID</text>
</p>
@foreach (var t in assignments)
{
<p>
@if (t.EventDefinition.EventFormat != EventFormat.Individual)
{
@t.Name
@if (t.Captain == student)
{
<text> (Captain)</text>
}
}
else
{
@t.EventDefinition.Name
}
</p>
}
}
</div>