@using Microsoft.EntityFrameworkCore
@using WebApp.Models
@page "/students/event-ranking"
@inject AppDbContext Context
@rendermode InteractiveServer
Student Event Ranks - TSA Chapter Organizer
Student Event Ranks
@if (_students == null)
{
Loading...
}
else
{
Name
Grade
TSA Year
Warnings
@for (var i = 1; i <= 10; i++)
{
var ii = i;
@AppIcons.GetOrdinal(ii)
}
@context.FirstName
@context.Grade
@context.TsaYear
Edit
@if (!context.RankedEvents.Any(re => re.OnSiteActivity))
{
@AppIcons.OnSiteActivity
}
@if (!context.RankedEvents.Any(re => re.RegionalEvent))
{
@AppIcons.RegionalEvent
}
@if (context.RankedEvents.All(re => re.EventFormat != EventFormat.Individual))
{
@AppIcons.IndividualEvent
}
@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
}
}
Event
Level of Effort
Individual
Regional
On-site Activity
Team Size
@for (var i = 0; i < _maxEventStudentRankings; i++)
{
var i1 = i + 1;
@i1
}
@context.Event.Name
@context.Event.LevelOfEffort
@if (context.Event.EventFormat == EventFormat.Individual) { ⓘ }
@if (context.Event.RegionalEvent) { ⓡ }
@if (context.Event.OnSiteActivity) { ⓐ }
[@context.Event.MinTeamSize-@context.Event.MaxTeamSize]
@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}" : "";
@if (student != null)
{
@student.Item1.FirstName
}
}
}
@code {
private Student[]? _students;
private class EventStudentRankings {
public EventDefinition Event {get; set; }
public Tuple [] 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>() })
.OrderBy(e => e.Event.Name)
.ToArray();
_eventStudentRankings = _eventStudentRankings.Concat(remainingEvents).ToArray();
_maxEventStudentRankings = _eventStudentRankings.Max(esr => esr.StudentRanking.Length);
}
}