@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); } }