229 lines
8.6 KiB
Plaintext
229 lines
8.6 KiB
Plaintext
@page "/"
|
|
@attribute [Authorize]
|
|
@using Microsoft.EntityFrameworkCore
|
|
@using WebApp.Models
|
|
@inject IConfiguration Configuration
|
|
@inject AppDbContext Context
|
|
|
|
<PageTitle>@Configuration["ChapterSettings:Name"] - TSA Chapter Organizer</PageTitle>
|
|
|
|
<MudPaper Elevation="0" Class="mb-6">
|
|
<div class="d-flex flex-column align-center text-center mb-4">
|
|
<MudImage Fluid="true" Src="TCO_Title.png" Alt="TSA Chapter Organizer" Class="mb-4" Style="width: 100%; max-width: 600px; height: auto;" />
|
|
<MudHidden Breakpoint="Breakpoint.SmAndDown">
|
|
<MudText Typo="Typo.h3" Class="mb-2">
|
|
<strong>@Configuration["ChapterSettings:Name"]</strong>
|
|
</MudText>
|
|
</MudHidden>
|
|
<MudHidden Breakpoint="Breakpoint.MdAndUp">
|
|
<MudText Typo="Typo.h5" Class="mb-2">
|
|
<strong>@Configuration["ChapterSettings:Name"]</strong>
|
|
</MudText>
|
|
</MudHidden>
|
|
<MudText Typo="Typo.h6" Color="Color.Info">
|
|
@Configuration["ChapterSettings:CompetitionYear"] Competition Year
|
|
</MudText>
|
|
</div>
|
|
</MudPaper>
|
|
|
|
@if (!_hasStudents)
|
|
{
|
|
<!-- Getting Started: No students yet -->
|
|
<MudPaper Elevation="0" Class="mb-4">
|
|
<MudText Typo="Typo.h4" Color="Color.Primary">Getting Started</MudText>
|
|
<MudText Typo="Typo.body2" Color="Color.Secondary">Add your chapter's students to begin</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.Student"
|
|
Title="Students"
|
|
Count="@_studentCount"
|
|
Subtitle="Add Students"
|
|
NavigateUrl="/students"
|
|
Emphasized="true">
|
|
<MudText Typo="Typo.caption" Class="mt-2">Import or add your chapter roster</MudText>
|
|
</DashboardCard>
|
|
|
|
<DashboardCard Icon="@AppIcons.Events"
|
|
Title="Events"
|
|
Count="@_eventCount"
|
|
Subtitle="Total Events"
|
|
Caption="@($"{_teamEventsCount} Team | {_individualEventsCount} Individual")"
|
|
NavigateUrl="/events" />
|
|
</MudGrid>
|
|
}
|
|
else if (!_hasTeams)
|
|
{
|
|
<!-- Team Building: Students exist but no teams yet -->
|
|
<MudPaper Elevation="0" Class="mb-4">
|
|
<MudText Typo="Typo.h4" Color="Color.Primary">Team Building</MudText>
|
|
<MudText Typo="Typo.body2" Color="Color.Secondary">Collect event rankings and build your teams</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.EventRank"
|
|
Title="Event Ranking"
|
|
Caption="Collect student event preferences"
|
|
NavigateUrl="/students/event-ranking"
|
|
Emphasized="true"/>
|
|
|
|
<DashboardCard Icon="@AppIcons.TeamAssignment"
|
|
Title="Team Assignment"
|
|
Caption="Build optimal teams"
|
|
NavigateUrl="/teams/assignment"
|
|
Emphasized="true"/>
|
|
</MudGrid>
|
|
|
|
<MudPaper Elevation="0" Class="my-4">
|
|
<MudText Typo="Typo.h4">Chapter Data</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.Student"
|
|
Title="Students"
|
|
Count="@_studentCount"
|
|
Subtitle="Active Students"
|
|
NavigateUrl="/students">
|
|
@if (!string.IsNullOrEmpty(_gradeDistribution) && _gradeDistribution != "No students yet")
|
|
{
|
|
<MudStack>
|
|
<MudText Typo="Typo.caption">@((MarkupString)_gradeDistribution)</MudText>
|
|
</MudStack>
|
|
}
|
|
</DashboardCard>
|
|
|
|
<DashboardCard Icon="@AppIcons.Events"
|
|
Title="Events"
|
|
Count="@_eventCount"
|
|
Subtitle="Total Events"
|
|
Caption="@($"{_teamEventsCount} Team | {_individualEventsCount} Individual")"
|
|
NavigateUrl="/events" />
|
|
</MudGrid>
|
|
}
|
|
else
|
|
{
|
|
<!-- Normal view: Students and teams exist -->
|
|
<MudPaper Elevation="0" Class="mb-4">
|
|
<MudText Typo="Typo.h4">Scheduling</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.Scheduler"
|
|
Title="Meeting Schedule"
|
|
Caption="Optimize meeting times"
|
|
NavigateUrl="/meeting-schedule"/>
|
|
|
|
<DashboardCard Icon="@AppIcons.EventCalendar"
|
|
Title="Event Calendar"
|
|
Caption="Conference schedules"
|
|
NavigateUrl="/calendar"/>
|
|
</MudGrid>
|
|
|
|
<MudPaper Elevation="0" Class="my-4">
|
|
<MudText Typo="Typo.h4">Teams & Registration</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.Teams"
|
|
Title="Teams"
|
|
Count="@_teamCount"
|
|
Subtitle="Total Teams"
|
|
Caption="@($"{_groupTeamsCount} Team | {_individualTeamsCount} Individual")"
|
|
NavigateUrl="/teams" />
|
|
|
|
<DashboardCard Icon="@AppIcons.Registration"
|
|
Title="Registration"
|
|
Caption="View student registrations"
|
|
NavigateUrl="/students/teams"/>
|
|
</MudGrid>
|
|
|
|
<MudPaper Elevation="0" Class="my-4">
|
|
<MudText Typo="Typo.h4">Team Building</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.EventRank"
|
|
Title="Event Ranking"
|
|
Caption="Student event preferences"
|
|
NavigateUrl="/students/event-ranking"/>
|
|
|
|
<DashboardCard Icon="@AppIcons.TeamAssignment"
|
|
Title="Team Assignment"
|
|
Caption="Build optimal teams"
|
|
NavigateUrl="/teams/assignment"/>
|
|
</MudGrid>
|
|
|
|
<MudPaper Elevation="0" Class="my-4">
|
|
<MudText Typo="Typo.h4">Chapter Data</MudText>
|
|
</MudPaper>
|
|
<MudGrid>
|
|
<DashboardCard Icon="@AppIcons.Student"
|
|
Title="Students"
|
|
Count="@_studentCount"
|
|
Subtitle="Active Students"
|
|
NavigateUrl="/students">
|
|
@if (!string.IsNullOrEmpty(_gradeDistribution) && _gradeDistribution != "No students yet")
|
|
{
|
|
<MudStack>
|
|
<MudText Typo="Typo.caption">@((MarkupString)_gradeDistribution)</MudText>
|
|
</MudStack>
|
|
}
|
|
</DashboardCard>
|
|
|
|
<DashboardCard Icon="@AppIcons.Events"
|
|
Title="Events"
|
|
Count="@_eventCount"
|
|
Subtitle="Total Events"
|
|
Caption="@($"{_teamEventsCount} Team | {_individualEventsCount} Individual")"
|
|
NavigateUrl="/events" />
|
|
</MudGrid>
|
|
}
|
|
|
|
@code {
|
|
private int _eventCount;
|
|
private int _individualEventsCount;
|
|
private int _teamEventsCount;
|
|
private int _studentCount;
|
|
private string _gradeDistribution = "";
|
|
private int _teamCount;
|
|
private int _individualTeamsCount;
|
|
private int _groupTeamsCount;
|
|
|
|
private bool _hasStudents => _studentCount > 0;
|
|
private bool _hasTeams => _teamCount > 0;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await LoadStatistics();
|
|
}
|
|
|
|
private async Task LoadStatistics()
|
|
{
|
|
// Events statistics
|
|
var events = await Context.Events.ToListAsync();
|
|
_eventCount = events.Count();
|
|
_individualEventsCount = events.Count(e => e.EventFormat == EventFormat.Individual);
|
|
_teamEventsCount = events.Count(e => e.EventFormat == EventFormat.Team);
|
|
|
|
// Students statistics
|
|
_studentCount = await Context.Students.CountAsync();
|
|
|
|
// Grade distribution
|
|
var gradeGroups = await Context.Students
|
|
.GroupBy(s => s.Grade)
|
|
.Select(g => new { Grade = g.Key, Count = g.Count() })
|
|
.OrderBy(g => g.Grade)
|
|
.ToListAsync();
|
|
|
|
if (gradeGroups.Any())
|
|
{
|
|
_gradeDistribution = string.Join(" | ", gradeGroups.Select(g =>
|
|
$"<span style=\"white-space: nowrap\">{AppIcons.GetOrdinalSuperscript(g.Grade)}: <strong>{g.Count}</strong></span>"));
|
|
}
|
|
else
|
|
{
|
|
_gradeDistribution = "No students yet";
|
|
}
|
|
|
|
// Teams statistics
|
|
var contextTeams = await Context.Teams.ToListAsync();
|
|
_teamCount = contextTeams.Count;
|
|
_individualTeamsCount = contextTeams.Count(e => e.Event.EventFormat == EventFormat.Individual);
|
|
_groupTeamsCount = contextTeams.Count(e => e.Event.EventFormat == EventFormat.Team);
|
|
}
|
|
}
|