2d5d075879
1. Created feature-based folder structure - Components now organized by domain feature 2. Moved all components - 20+ files moved to new locations 3. Updated _Imports.razor - Added all new namespace paths for global component access 4. Updated CustomThemes.cs namespace - Changed from WebApp.Components.Layout to WebApp.Components.Shared.Layout 5. Removed old using directives - Cleaned up Login.razor and Routes.razor 6. Removed empty directories - Cleaned up old folder structure
158 lines
6.0 KiB
Plaintext
158 lines
6.0 KiB
Plaintext
@page "/students/event-ranking"
|
|
@attribute [Authorize]
|
|
@using Microsoft.EntityFrameworkCore
|
|
@using WebApp.Models
|
|
@inject AppDbContext Context
|
|
@rendermode InteractiveServer
|
|
|
|
<PageTitle>Student Event Ranks - TSA Chapter Organizer</PageTitle>
|
|
|
|
<MudText Typo="Typo.h3"><MudIcon Icon="@AppIcons.EventRank"></MudIcon> Student Event Ranks</MudText>
|
|
|
|
@if (_students == null)
|
|
{
|
|
<p><em>Loading...</em></p>
|
|
}
|
|
else
|
|
{
|
|
|
|
<MudTable Items="_students" Hover="true" Breakpoint="Breakpoint.Sm" LoadingProgressColor="Color.Info">
|
|
<HeaderContent>
|
|
|
|
<MudTh>Name</MudTh>
|
|
<MudTh>Grade</MudTh>
|
|
<MudTh>TSA Year</MudTh>
|
|
<MudTh></MudTh>
|
|
<MudTh>Warnings</MudTh>
|
|
@for (var i = 1; i <= 10; i++)
|
|
{
|
|
var ii = i;
|
|
<MudTh>@AppIcons.GetOrdinal(ii)</MudTh>
|
|
}
|
|
</HeaderContent>
|
|
<RowTemplate>
|
|
|
|
<MudTd>@context.FirstName</MudTd>
|
|
<MudTh>@context.Grade</MudTh>
|
|
<MudTh>@context.TsaYear</MudTh>
|
|
<MudTd><MudButton StartIcon="@Icons.Material.Filled.TableChart" Href="@($"students/event-ranking-edit/{context.Id}")">Edit</MudButton></MudTd>
|
|
<MudTd>
|
|
@if (!context.RankedEvents.Any(re => re.OnSiteActivity))
|
|
{
|
|
<MudTooltip Text="No On-Site Activity">
|
|
<MudText Style="font-weight:bolder" Color="Color.Warning">@AppIcons.OnSiteActivity</MudText>
|
|
</MudTooltip>
|
|
}
|
|
@if (!context.RankedEvents.Any(re => re.RegionalEvent))
|
|
{
|
|
<MudTooltip Text="No Regional Event">
|
|
<MudText Style="font-weight:bolder" Color="Color.Warning">@AppIcons.RegionalEvent</MudText>
|
|
</MudTooltip>
|
|
}
|
|
|
|
@if (context.RankedEvents.All(re => re.EventFormat != EventFormat.Individual))
|
|
{
|
|
<MudTooltip Text="No Individual Event">
|
|
<MudText Style="font-weight:bolder" Color="Color.Warning">@AppIcons.IndividualEvent</MudText>
|
|
</MudTooltip>
|
|
}
|
|
</MudTd>
|
|
@for (var i = 1; i <= 10; i++)
|
|
{
|
|
var ii = i;
|
|
var st = context.EventRankings.FirstOrDefault(e => e.Rank == i);
|
|
<MudTd Class="@($"event-rank-{ii})")">
|
|
@if (st != null)
|
|
{
|
|
<span>@st.EventDefinition.ShortName
|
|
<EventAttributes EventDefinition="@st.EventDefinition"></EventAttributes>
|
|
</span>
|
|
}
|
|
</MudTd>
|
|
}
|
|
|
|
</RowTemplate>
|
|
</MudTable>
|
|
<MudTable Items="_eventStudentRankings" Hover="true" Breakpoint="Breakpoint.Sm" LoadingProgressColor="Color.Info">
|
|
<HeaderContent>
|
|
<MudTh>Event</MudTh>
|
|
<MudTh>Level of Effort</MudTh>
|
|
<MudTh>Individual</MudTh>
|
|
<MudTh>Regional</MudTh>
|
|
<MudTh>On-site Activity</MudTh>
|
|
<MudTh>Team Size</MudTh>
|
|
@for (var i = 0; i < _maxEventStudentRankings; i++)
|
|
{
|
|
var i1 = i + 1;
|
|
<MudTh>@i1</MudTh>
|
|
}
|
|
</HeaderContent>
|
|
<RowTemplate>
|
|
<MudTd>@context.Event.Name</MudTd>
|
|
<MudTd>@context.Event.LevelOfEffort</MudTd>
|
|
<MudTd>@if (context.Event.EventFormat == EventFormat.Individual) { <span>ⓘ</span> }</MudTd >
|
|
<MudTd>@if (context.Event.RegionalEvent) { <span>ⓡ</span> }</MudTd >
|
|
<MudTd>@if (context.Event.OnSiteActivity) { <span>ⓐ</span> }</MudTd >
|
|
<MudTd>[@context.Event.MinTeamSize-@context.Event.MaxTeamSize]</MudTd >
|
|
@for (var j = 0; j < _maxEventStudentRankings; j++)
|
|
{
|
|
var student = j < context.StudentRanking.Length ? context.StudentRanking[j] : null;
|
|
var eventClass = student != null ? $"event-rank-{student.Item2}" : "";
|
|
<MudTd Class="@eventClass">
|
|
@if (student != null)
|
|
{
|
|
@student.Item1.FirstName
|
|
}
|
|
</MudTd>
|
|
}
|
|
</RowTemplate>
|
|
</MudTable>
|
|
}
|
|
@code {
|
|
private Student[]? _students;
|
|
|
|
private class EventStudentRankings {
|
|
public EventDefinition Event {get; set; }
|
|
public Tuple<Student,int> [] StudentRanking { get; set; }
|
|
}
|
|
|
|
private EventStudentRankings[] _eventStudentRankings;
|
|
private int _maxEventStudentRankings;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
_students =
|
|
await Context.Students
|
|
.Include(e => e.EventRankings)
|
|
.ThenInclude(e => e.EventDefinition)
|
|
.OrderBy(e => e.FirstName).ToArrayAsync();
|
|
|
|
_eventStudentRankings =
|
|
_students.SelectMany(s =>
|
|
s.EventRankings,
|
|
(student, ranking) => new { e = ranking.EventDefinition, a = Tuple.Create(student, ranking.Rank) }
|
|
)
|
|
.GroupBy(e => e.e)
|
|
.Select(e =>
|
|
new EventStudentRankings
|
|
{
|
|
Event = e.Key,
|
|
StudentRanking = e.Select(er => er.a).OrderBy(ser => ser.Item2).ThenByDescending(ser => ser.Item1.Grade + ser.Item1.TsaYear).ToArray()
|
|
})
|
|
.OrderBy(e => e.Event.Name)
|
|
.ToArray();
|
|
|
|
var events = await Context.Events.ToArrayAsync();
|
|
var remainingEvents =
|
|
events
|
|
.Where(e => _eventStudentRankings.All(est => est.Event.Id != e.Id))
|
|
.Select(e => new EventStudentRankings { Event = e, StudentRanking = Array.Empty<Tuple<Student, int>>() })
|
|
.OrderBy(e => e.Event.Name)
|
|
.ToArray();
|
|
|
|
_eventStudentRankings = _eventStudentRankings.Concat(remainingEvents).ToArray();
|
|
|
|
_maxEventStudentRankings = _eventStudentRankings.Max(esr => esr.StudentRanking.Length);
|
|
}
|
|
}
|