@page "/events/create" @attribute [Authorize] @using WebApp.Components.Shared.Components @using Core.Utility @using Microsoft.EntityFrameworkCore @inject AppDbContext context @inject NavigationManager NavigationManager Basic Information Event Format @foreach (EventFormat format in Enum.GetValues(typeof(EventFormat))) { @format.ToString() } Event Details Team Configuration Competition Details Create Cancel @code { [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } [SupplyParameterFromForm] private EventDefinition EventDefinition { get; set; } = new(); private FormChangeTracker? _formChangeTracker; private async Task OnValidSubmit() { _formChangeTracker?.AllowNavigation(); // Normalize and process related careers await ProcessRelatedCareersAsync(EventDefinition); context.Events.Add(EventDefinition); await context.SaveChangesAsync(); NavigationManager.NavigateTo(ReturnUrl ?? "/events"); } private async Task ProcessRelatedCareersAsync(EventDefinition eventDefinition) { if (string.IsNullOrWhiteSpace(eventDefinition.RelatedCareersText)) { eventDefinition.RelatedCareers.Clear(); return; } var normalizedNames = CareerNormalizer.NormalizeCareerNames(eventDefinition.RelatedCareersText).ToList(); if (!normalizedNames.Any()) { eventDefinition.RelatedCareers.Clear(); return; } // Get all existing careers from database (case-insensitive lookup) var existingCareers = await context.Careers.ToListAsync(); var careerLookup = existingCareers.ToDictionary( c => CareerNormalizer.GetNormalizedKey(c.Name), c => c, StringComparer.OrdinalIgnoreCase); var careersToAdd = new List(); foreach (var normalizedName in normalizedNames) { var normalizedKey = CareerNormalizer.GetNormalizedKey(normalizedName); if (careerLookup.TryGetValue(normalizedKey, out var existingCareer)) { // Use existing career (preserve original capitalization) careersToAdd.Add(existingCareer); } else { // Create new career with the normalized name (preserving capitalization from input) var newCareer = new Career { Name = normalizedName }; context.Careers.Add(newCareer); careersToAdd.Add(newCareer); careerLookup[normalizedKey] = newCareer; } } // Replace the collection eventDefinition.RelatedCareers = careersToAdd; } private void HandleCancel() { _formChangeTracker?.AllowNavigation(); NavigationManager.NavigateTo(ReturnUrl ?? "/events"); } }