@page "/calendar/event-occurrences/import" @attribute [Authorize] @using Core.Entities @using Core.Models @using Core.Services @using Microsoft.EntityFrameworkCore @using WebApp.Components.Shared.Components @using MudBlazor @inject IEventOccurrenceParserService ParserService @inject AppDbContext Context @inject NavigationManager NavigationManager @inject ISnackbar Snackbar Paste Event Occurrence Data Parse Clear Parsed Results @if (_isParsing) { Parsing... } else if (_parseResult == null) { Parse text to see results here } else { @* Errors *@ @if (_parseResult.Errors.Any()) { @foreach (var error in _parseResult.Errors) { @error } } @* Warnings *@ @if (_parseResult.Warnings.Any()) { @foreach (var warning in _parseResult.Warnings) { @warning } } @* Summary *@ @if (_parseResult.IsSuccess && _parseResult.TotalParsed > 0) { Successfully parsed @_parseResult.TotalParsed occurrence(s) from @_parseResult.Occurrences.Count event definition(s) } @* Parsed Occurrences List *@ @if (_parseResult.IsSuccess && _parseResult.Occurrences.Any()) { Occurrences by Event: @foreach (var kvp in _parseResult.Occurrences.OrderBy(x => GetEventName(x.Key))) { Name Date Time Location @context.Name @context.Date @context.Time @(context.Location ?? "-") } Save to Database Clear Results } else if (_parseResult.IsSuccess && _parseResult.TotalParsed == 0) { No occurrences were parsed from the text. Please check the format. } } @code { private string _inputText = string.Empty; private EventOccurrenceParseResult? _parseResult; private bool _isParsing = false; private bool _isSaving = false; private async Task HandleParse() { if (string.IsNullOrWhiteSpace(_inputText)) { Snackbar.Add("Please enter text to parse", Severity.Warning); return; } _isParsing = true; try { // Get EventDefinitions from database var events = await Context.Events.ToListAsync(); // Parse the text _parseResult = ParserService.ParseFromText(_inputText, events); } catch (Exception ex) { Snackbar.Add($"Error parsing text: {ex.Message}", Severity.Error); _parseResult = new EventOccurrenceParseResult { Errors = { $"Error: {ex.Message}" } }; } finally { _isParsing = false; } } private void HandleClear() { _inputText = string.Empty; _parseResult = null; } private void HandleClearResults() { _parseResult = null; } private async Task HandleSaveToDatabase() { if (_parseResult == null || !_parseResult.IsSuccess || _parseResult.TotalParsed == 0) { Snackbar.Add("No valid parsed occurrences to save", Severity.Warning); return; } _isSaving = true; try { var savedCount = 0; foreach (var kvp in _parseResult.Occurrences) { foreach (var occurrence in kvp.Value) { // Add each occurrence to the database await Context.EventOccurrences.AddAsync(occurrence); savedCount++; } } await Context.SaveChangesAsync(); Snackbar.Add($"Successfully saved {savedCount} occurrence(s) to database", Severity.Success); // Navigate back to the calendar index after a short delay await Task.Delay(1000); NavigationManager.NavigateTo("/calendar/event-occurrences"); } catch (Exception ex) { Snackbar.Add($"Error saving to database: {ex.Message}", Severity.Error); } finally { _isSaving = false; } } private string GetEventName(EventDefinition eventDefinition) { if (eventDefinition == EventDefinition.GeneralSchedule) return "General Schedule"; if (eventDefinition == EventDefinition.MeetTheCandidates) return "Meet the Candidates"; if (eventDefinition == EventDefinition.ChapterOfficerMeeting) return "Chapter Officer Meeting"; if (eventDefinition == EventDefinition.VotingDelegateMeeting) return "Voting Delegate Meeting"; if (eventDefinition == EventDefinition.SocialGathering) return "Social Gathering"; return eventDefinition.Name; } }