@page "/events/edit"
@attribute [Authorize]
@using Microsoft.EntityFrameworkCore
@using WebApp.Components.Shared.Components
@using Core.Utility
@using MudBlazor
@using System.ComponentModel.DataAnnotations
@using WebApp.Services
@inject AppDbContext context
@inject NavigationManager NavigationManager
@inject ISnackbar Snackbar
@inject FormValidationService ValidationService
@inject EventDefinitionService EventDefinitionService
@if (EventDefinition is null || _editContext is null)
{
Loading...
return;
}
Basic Information
Event Format
@foreach (EventFormat format in Enum.GetValues(typeof(EventFormat)))
{
@format.ToString()
}
Event Details
Team Configuration
Competition Details
Save
Cancel
@code {
[SupplyParameterFromQuery]
private int Id { get; set; }
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
[SupplyParameterFromForm]
private EventDefinition? EventDefinition { get; set; }
private FormChangeTracker? _formChangeTracker;
private EditContext? _editContext;
private List _validationErrors = new();
protected override async Task OnInitializedAsync()
{
EventDefinition ??= await context.Events
.Include(e => e.RelatedCareers)
.FirstOrDefaultAsync(m => m.Id == Id);
if (EventDefinition is null)
{
NavigationManager.NavigateTo("notfound");
}
else
{
// Populate RelatedCareersText from RelatedCareers collection
EventDefinition.RelatedCareersText = string.Join("\n", EventDefinition.RelatedCareers.Select(c => c.Name));
// Create EditContext for validation
_editContext = new EditContext(EventDefinition);
}
}
private void OnInvalidSubmit(EditContext editContext)
{
_validationErrors = ValidationService.HandleInvalidSubmit(editContext, EventDefinition!, 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 OnValidSubmit()
{
try
{
// Get the tracked entity from the database
var trackedEntity = await context.Events
.Include(e => e.RelatedCareers)
.FirstOrDefaultAsync(e => e.Id == EventDefinition!.Id);
if (trackedEntity == null)
{
Snackbar.Add("Event not found. It may have been deleted.", Severity.Error);
NavigationManager.NavigateTo("notfound");
return;
}
// Update scalar properties from the form-bound entity
context.Entry(trackedEntity).CurrentValues.SetValues(EventDefinition!);
// Normalize and process related careers
await EventDefinitionService.ProcessRelatedCareersAsync(trackedEntity);
await context.SaveChangesAsync();
_validationErrors.Clear();
Snackbar.Add($"Event '{EventDefinition!.Name}' saved successfully.", Severity.Success);
_formChangeTracker?.AllowNavigation();
NavigationManager.NavigateTo(ReturnUrl ?? "/events");
}
catch (DbUpdateConcurrencyException ex)
{
if (!ValidationService.HandleDbUpdateConcurrencyException(
ex,
() => EventDefinitionExists(EventDefinition!.Id),
"event",
() => NavigationManager.NavigateTo("notfound")))
{
throw;
}
}
catch (DbUpdateException ex)
{
ValidationService.HandleDbUpdateException(
ex,
"An error occurred while saving the event.",
"event",
"saving",
"name");
}
catch (Exception ex)
{
ValidationService.HandleException(ex);
}
}
private async Task HandleCancel()
{
// Discard all in-memory changes by reloading from database
if (EventDefinition != null)
{
await context.Entry(EventDefinition).ReloadAsync();
}
_formChangeTracker?.AllowNavigation();
NavigationManager.NavigateTo(ReturnUrl ?? "/events");
}
private bool EventDefinitionExists(int id)
{
return context.Events.Any(e => e.Id == id);
}
}