Files
chapter-organizer/WebApp/Components/Features/Teams/Edit.razor
T
poprhythm 8af86e22d9 Refactor collection initializers to use C# 12 collection expressions
This commit updates various files across the Core and WebApp projects to replace traditional collection initializers with C# 12 collection expressions. Changes include modifications to EventAssignment.cs, TeamScheduler_DecisionTree.cs, CareerField.cs, EventDefinition.cs, and several components in the WebApp. These updates enhance code readability and maintainability by adhering to modern C# syntax standards.
2026-01-11 10:35:58 -05:00

189 lines
6.0 KiB
Plaintext

@page "/teams/edit"
@attribute [Authorize]
@using Microsoft.EntityFrameworkCore
@using WebApp.Components.Shared.Components
@using MudBlazor
@using WebApp.Services
@inject AppDbContext Context
@inject NavigationManager NavigationManager
@inject ISnackbar Snackbar
@inject FormValidationService ValidationService
@if (Team is null || _editContext is null)
{
<p><em>Loading...</em></p>
return;
}
<PageHeader Title="Edit Team"
Subtitle=@Team.ToString()
ShowBackButton="true"
BackButtonUrl="@(ReturnUrl ?? "/teams")" />
<EditForm method="post" EditContext="@_editContext" OnInvalidSubmit="OnInvalidSubmit" FormName="edit" Enhance>
<FormChangeTracker @ref="_formChangeTracker" />
<AntiforgeryToken />
<DataAnnotationsValidator/>
<ValidationErrorDisplay Errors="_validationErrors" />
<MudGrid>
<MudItem xs="12" sm="7">
<MudPaper Elevation="2" Class="pa-3 pa-md-6">
<StudentToggleSelector Students="@_students"
@bind-SelectedStudents="_selectedStudents"
Title="Students"
ShowFullName="true" />
<MudStack Class="mt-4">
<TeamCaptainSelector Students="@_selectedStudents"
@bind-SelectedCaptain="Team.Captain"
Title="Captain" />
</MudStack>
</MudPaper>
</MudItem>
</MudGrid>
</EditForm>
<FormActions>
<MudButton OnClick="UpdateTeam" Variant="Variant.Filled" Color="Color.Primary">Save</MudButton>
<MudButton OnClick="HandleCancel" Variant="Variant.Text">Cancel</MudButton>
</FormActions>
@code {
[SupplyParameterFromQuery]
private int Id { get; set; }
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
[SupplyParameterFromForm]
private Team? Team { get; set; }
private FormChangeTracker? _formChangeTracker;
private EditContext? _editContext;
private List<string> _validationErrors = new();
private IEnumerable<Student>? _selectedStudents = [];
private List<Student> _students = [];
protected override async Task OnInitializedAsync()
{
Team ??= await Context.Teams
.Include(e => e.Event)
.Include(e => e.Students)
.FirstOrDefaultAsync(m => m.Id == Id);
_students = await Context.Students
.AsNoTracking()
.ToListAsync();
_selectedStudents = Team?.Students.ToList();
if (Team is null)
{
NavigationManager.NavigateTo("notfound");
}
else
{
_editContext = new EditContext(Team);
switch (Team.Event.EventFormat)
{
case EventFormat.Individual when Team.Students.Count == 1:
Team.Captain ??= Team.Students[0];
Team.Identifier ??= Team.Captain.FirstName;
break;
case EventFormat.Team:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
private void OnInvalidSubmit(EditContext editContext)
{
_validationErrors = ValidationService.HandleInvalidSubmit(editContext, Team!, errors => _validationErrors = errors);
StateHasChanged();
}
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more information, see https://learn.microsoft.com/aspnet/core/blazor/forms/#mitigate-overposting-attacks.
private async Task UpdateTeam()
{
// Validate before processing
if (_editContext != null)
{
var errors = ValidationService.CollectValidationErrors(_editContext, Team!);
if (errors.Any())
{
_validationErrors = ValidationService.HandleInvalidSubmit(_editContext, Team!, err => _validationErrors = err);
StateHasChanged();
return;
}
}
_validationErrors.Clear();
//Context.Attach(Team!).Entity = EntityState.Modified;
Team?.Students.Clear();
if (_selectedStudents != null)
foreach (var s in _selectedStudents)
{
Team?.Students.Add(s);
}
// Update identifier for individual events
if (Team is { Event.EventFormat: EventFormat.Individual, Students.Count: 1 })
{
Team.Captain ??= Team.Students[0];
Team.Identifier = Team.Captain.FirstName;
}
try
{
await Context.SaveChangesAsync();
Snackbar.Add($"Team '{Team}' saved successfully.", Severity.Success);
_formChangeTracker?.AllowNavigation();
NavigationManager.NavigateTo(ReturnUrl ?? "/teams");
}
catch (DbUpdateConcurrencyException ex)
{
if (!ValidationService.HandleDbUpdateConcurrencyException(
ex,
() => TeamExists(Team!.Id),
"team",
() => NavigationManager.NavigateTo("notfound")))
{
throw;
}
}
catch (DbUpdateException ex)
{
ValidationService.HandleDbUpdateException(
ex,
"An error occurred while saving the team.",
"team",
"saving");
}
catch (Exception ex)
{
ValidationService.HandleException(ex);
}
}
private async Task HandleCancel()
{
// Discard all in-memory changes by reloading from database
if (Team != null)
{
await Context.Entry(Team).ReloadAsync();
}
_formChangeTracker?.AllowNavigation();
NavigationManager.NavigateTo(ReturnUrl ?? "/teams");
}
private bool TeamExists(int id)
{
return Context.Teams.Any(e => e.Id == id);
}
}