Add an empty layout for the login page.
Move some of the shared components
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
<MudButtonGroup Size="Size.Small">
|
||||
@if (DetailsHref != null)
|
||||
{
|
||||
<MudTooltip Text="Details">
|
||||
<MudIconButton Href="@DetailsHref" Icon="@Icons.Material.Filled.Description">Details</MudIconButton>
|
||||
</MudTooltip>
|
||||
}
|
||||
@if (EditHref != null)
|
||||
{
|
||||
<MudTooltip Text="Edit">
|
||||
<MudIconButton Href="@EditHref" Icon="@Icons.Material.Filled.Edit">Edit</MudIconButton>
|
||||
</MudTooltip>
|
||||
}
|
||||
@if (DeleteOnClick != null)
|
||||
{
|
||||
<MudTooltip Text="Delete">
|
||||
<MudIconButton Icon="@Icons.Material.Outlined.Delete"
|
||||
Color="Color.Error"
|
||||
OnClick="HandleDeleteClick"/>
|
||||
</MudTooltip>
|
||||
}
|
||||
</MudButtonGroup>
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter] public string? DetailsHref { get; set; }
|
||||
[Parameter] public string? EditHref { get; set; }
|
||||
[Parameter] public Func<Task>? DeleteOnClick { get; set; }
|
||||
|
||||
private async Task HandleDeleteClick()
|
||||
{
|
||||
if (DeleteOnClick != null)
|
||||
{
|
||||
await DeleteOnClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
@using WebApp.Models
|
||||
@*
|
||||
<MudTooltip Text="Level of Effort">@AppIcons.LevelOfEffortIcon(EventDefinition.LevelOfEffort)</MudTooltip>
|
||||
|
||||
@if(EventDefinition.EventFormat == EventFormat.Individual) {
|
||||
<MudTooltip Text="Individual">@AppIcons.IndividualEvent</MudTooltip>
|
||||
}
|
||||
@if (EventDefinition.OnSiteActivity)
|
||||
{
|
||||
<MudTooltip Text="On-site Activity"> @AppIcons.OnSiteActivity</MudTooltip>
|
||||
}
|
||||
|
||||
@if (EventDefinition.RegionalEvent)
|
||||
{
|
||||
<MudTooltip Text="Regional Event">@AppIcons.RegionalEvent</MudTooltip>
|
||||
}
|
||||
|
||||
@if (EventDefinition.Presubmission)
|
||||
{
|
||||
<MudTooltip Text="Presubmission Event">@AppIcons.PresubmissionEvent</MudTooltip>
|
||||
} *@
|
||||
|
||||
|
||||
@AppIcons.LevelOfEffortIcon(EventDefinition.LevelOfEffort)
|
||||
|
||||
@if (EventDefinition.EventFormat == EventFormat.Individual)
|
||||
{
|
||||
@AppIcons.IndividualEvent
|
||||
}
|
||||
@if (EventDefinition.OnSiteActivity)
|
||||
{
|
||||
@AppIcons.OnSiteActivity
|
||||
}
|
||||
|
||||
@if (EventDefinition.RegionalEvent)
|
||||
{
|
||||
@AppIcons.RegionalEvent
|
||||
}
|
||||
|
||||
@if (EventDefinition.Presubmission)
|
||||
{
|
||||
@AppIcons.PresubmissionEvent
|
||||
}
|
||||
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public EventDefinition EventDefinition { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
@if (Title != null)
|
||||
{
|
||||
<MudText Typo="Typo.h4">@Title</MudText>
|
||||
}
|
||||
|
||||
<MudAutocomplete T="Student"
|
||||
Label="@Label"
|
||||
@bind-Value="_currentStudent"
|
||||
SearchFunc="@SearchStudents"
|
||||
ToStringFunc="@(s => ShowFullName ? s?.FirstNameLastName : s?.FirstName)"
|
||||
Immediate="true"
|
||||
ResetValueOnEmptyText="true"
|
||||
CoerceText="false"
|
||||
CoerceValue="false"
|
||||
AdornmentIcon="@Icons.Material.Filled.Search"
|
||||
Clearable="true">
|
||||
<ItemTemplate Context="student">
|
||||
@if (ShowFullName)
|
||||
{
|
||||
@student.FirstNameLastName
|
||||
}
|
||||
else
|
||||
{
|
||||
@student.FirstName
|
||||
}
|
||||
@if (ShowGrade)
|
||||
{
|
||||
<MudText Typo="Typo.caption" Color="Color.Secondary"> - Grade @student.Grade</MudText>
|
||||
}
|
||||
</ItemTemplate>
|
||||
</MudAutocomplete>
|
||||
|
||||
@if (SelectedStudents.Any())
|
||||
{
|
||||
<MudChipSet T="Student" AllClosable="true" Class="mt-2">
|
||||
@foreach (var student in SelectedStudents.OrderBy(s => s.FirstName))
|
||||
{
|
||||
<MudChip T="Student"
|
||||
Value="@student"
|
||||
Text="@(ShowFullName ? student.FirstNameLastName : student.FirstName)"
|
||||
OnClose="@(() => RemoveStudent(student))" />
|
||||
}
|
||||
</MudChipSet>
|
||||
}
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public IEnumerable<Student> Students { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public IEnumerable<Student> SelectedStudents { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<IEnumerable<Student>> SelectedStudentsChanged { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string? Title { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string Label { get; set; } = "Search Students";
|
||||
|
||||
[Parameter]
|
||||
public bool ShowFullName { get; set; } = true;
|
||||
|
||||
[Parameter]
|
||||
public bool ShowGrade { get; set; } = false;
|
||||
|
||||
private Student? _currentStudent
|
||||
{
|
||||
get => _currentStudentValue;
|
||||
set
|
||||
{
|
||||
_currentStudentValue = value;
|
||||
if (value != null && !SelectedStudents.Contains(value))
|
||||
{
|
||||
var updatedList = SelectedStudents.Append(value).ToList();
|
||||
SelectedStudentsChanged.InvokeAsync(updatedList);
|
||||
_currentStudentValue = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Student? _currentStudentValue;
|
||||
|
||||
private Task<IEnumerable<Student>> SearchStudents(string? searchText, CancellationToken cancellationToken)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(searchText))
|
||||
return Task.FromResult<IEnumerable<Student>>(Students.Where(s => !SelectedStudents.Contains(s)));
|
||||
|
||||
var search = searchText.ToLower();
|
||||
return Task.FromResult<IEnumerable<Student>>(Students
|
||||
.Where(s => !SelectedStudents.Contains(s))
|
||||
.Where(s => s.FirstName.ToLower().Contains(search) ||
|
||||
s.LastName.ToLower().Contains(search))
|
||||
.OrderBy(s => s.FirstName));
|
||||
}
|
||||
|
||||
private void RemoveStudent(Student student)
|
||||
{
|
||||
var updatedList = SelectedStudents.Where(s => s.Id != student.Id).ToList();
|
||||
SelectedStudentsChanged.InvokeAsync(updatedList);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
@if (Title != null)
|
||||
{
|
||||
<MudText Typo="Typo.h4">@Title</MudText>
|
||||
}
|
||||
|
||||
<MudToggleGroup T="Student"
|
||||
SelectionMode="SelectionMode.MultiSelection"
|
||||
Values="@SelectedStudents"
|
||||
ValuesChanged="@OnSelectedStudentsChanged"
|
||||
Vertical="true"
|
||||
CheckMark>
|
||||
@foreach (var student in Students.OrderBy(e => e.FirstName))
|
||||
{
|
||||
<MudToggleItem Value="@student" Style="font-size: .75rem;">
|
||||
@if (ShowFullName)
|
||||
{
|
||||
@student.FirstNameLastName
|
||||
}
|
||||
else
|
||||
{
|
||||
@student.FirstName
|
||||
}
|
||||
</MudToggleItem>
|
||||
}
|
||||
</MudToggleGroup>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public IEnumerable<Student> Students { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public IEnumerable<Student> SelectedStudents { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<IEnumerable<Student>> SelectedStudentsChanged { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string? Title { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public bool ShowFullName { get; set; } = true;
|
||||
|
||||
private async Task OnSelectedStudentsChanged(IEnumerable<Student> value)
|
||||
{
|
||||
SelectedStudents = value;
|
||||
await SelectedStudentsChanged.InvokeAsync(value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
@if (Title != null)
|
||||
{
|
||||
<MudText Typo="@TitleTypo">@Title</MudText>
|
||||
}
|
||||
|
||||
<MudToggleGroup T="Student"
|
||||
SelectionMode="SelectionMode.ToggleSelection"
|
||||
Value="@SelectedCaptain"
|
||||
ValueChanged="@OnSelectedCaptainChanged"
|
||||
CheckMark>
|
||||
@foreach (var student in Students.OrderBy(e => e.FirstName))
|
||||
{
|
||||
<MudToggleItem Value="@student" Text="@student.Name" />
|
||||
}
|
||||
</MudToggleGroup>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public IEnumerable<Student> Students { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public Student? SelectedCaptain { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<Student?> SelectedCaptainChanged { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string? Title { get; set; } = "Captain";
|
||||
|
||||
[Parameter]
|
||||
public Typo TitleTypo { get; set; } = Typo.body1;
|
||||
|
||||
private async Task OnSelectedCaptainChanged(Student? value)
|
||||
{
|
||||
SelectedCaptain = value;
|
||||
await SelectedCaptainChanged.InvokeAsync(value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<MudSelect
|
||||
T="Team"
|
||||
MultiSelection="true"
|
||||
@bind-SelectedValues="@SelectedTeams"
|
||||
ToStringFunc="e => e.ToString()"
|
||||
Label="@Label">
|
||||
|
||||
@foreach (var evt in Teams.OrderBy(e => e.ToString()))
|
||||
{
|
||||
<MudSelectItem T="Team" Value="@evt">@evt.ToString()</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
|
||||
@code {
|
||||
[Parameter] public Team[]? Teams { get; set; }
|
||||
[Parameter] public required IEnumerable<Team> SelectedTeams { get; set; }
|
||||
[Parameter] public string Label { get; set; } = "Teams";
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
@using WebApp.Models
|
||||
@foreach (var student in
|
||||
Team.Students
|
||||
.OrderBy(e =>
|
||||
e.EventRankings
|
||||
.Find(er => er.EventDefinition == Team.Event)?.Rank ?? 10)
|
||||
.ThenBy(s => s.Grade + s.TsaYear))
|
||||
{
|
||||
var eventRank =
|
||||
student.EventRankings
|
||||
.Find(e => e.EventDefinition == Team.Event)?.Rank;
|
||||
var color = AppIcons.RankedEventColor(eventRank ?? 0);
|
||||
var captain = Team.Captain != null && Team.Captain.Equals(student);
|
||||
|
||||
<MudPaper Class="d-inline-flex pa-2 mx-3 my-1" Style="@($"background:{color};")">
|
||||
@student.FirstName
|
||||
@if (captain)
|
||||
{
|
||||
<span> (Cpt)</span>
|
||||
}
|
||||
</MudPaper>
|
||||
}
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public Team Team { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
@if (Title != null)
|
||||
{
|
||||
<MudText Typo="Typo.h4">@Title</MudText>
|
||||
}
|
||||
|
||||
<MudToggleGroup T="Team"
|
||||
SelectionMode="SelectionMode.MultiSelection"
|
||||
Values="@SelectedTeams"
|
||||
ValuesChanged="@OnSelectedTeamsChanged"
|
||||
Vertical="true"
|
||||
CheckMark>
|
||||
@foreach (var team in Teams.OrderBy(e => e.Event.Name))
|
||||
{
|
||||
<MudToggleItem Value="@team" Style="font-size: .75rem;">
|
||||
<MudTooltip Text="@team.StudentsFirstNames">
|
||||
<div class="d-flex align-center justify-space-between flex-wrap">
|
||||
<MudText Class="ellipsis">@team.ToString()</MudText>
|
||||
@if (ShowEventAttributes)
|
||||
{
|
||||
<EventAttributes EventDefinition="@team.Event"></EventAttributes>
|
||||
}
|
||||
</div>
|
||||
</MudTooltip>
|
||||
</MudToggleItem>
|
||||
}
|
||||
</MudToggleGroup>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public IEnumerable<Team> Teams { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public IEnumerable<Team> SelectedTeams { get; set; } = [];
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<IEnumerable<Team>> SelectedTeamsChanged { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string? Title { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public bool ShowEventAttributes { get; set; } = true;
|
||||
|
||||
private async Task OnSelectedTeamsChanged(IEnumerable<Team> value)
|
||||
{
|
||||
SelectedTeams = value;
|
||||
await SelectedTeamsChanged.InvokeAsync(value);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user