@page "/card-notes" @implements IDisposable Card Notes Management - Chrono DB

Card Notes Database (`CardNote`)

Browse, add, edit, and delete notes associated with Chrono CCG cards.

@if (!string.IsNullOrEmpty(alertMessage)) { }
@if (!string.IsNullOrEmpty(searchTerm)) { }
Showing @notes.Count note(s)
@if (isLoading) {
Loading card notes from database...
} else if (!notes.Any()) {
No Card Notes Found

There are currently no card notes matching your criteria.

} else {
@foreach (var note in notes) { }
Card Name (Primary Key) Note Content Actions
@note.CardName
@note.Note
}
@if (showModal) { } @if (showDeleteModal && noteToDelete != null) { } @code { private List notes = []; private List availableCardNames = []; private string searchTerm = ""; private bool isLoading = true; private bool isSaving = false; private string? alertMessage; private bool alertIsSuccess; private bool showModal; private bool isEditing; private CardNote currentNote = new(); private bool showDeleteModal; private CardNote? noteToDelete; protected override async Task OnInitializedAsync() { ConfigService.OnConfigurationChanged += HandleConfigChanged; try { availableCardNames = CardDatabase.Cards .Select(c => c.Name) .Where(n => !string.IsNullOrWhiteSpace(n)) .Distinct() .OrderBy(n => n) .ToList(); } catch { availableCardNames = []; } await LoadNotesAsync(); } private void HandleConfigChanged() { _ = LoadNotesAsync(); } private async Task LoadNotesAsync() { isLoading = true; try { notes = await DbService.GetCardNotesAsync(searchTerm); } catch (Exception ex) { alertIsSuccess = false; alertMessage = "Error loading card notes: " + ex.Message; } finally { isLoading = false; } } private async Task FilterNotes() { notes = await DbService.GetCardNotesAsync(searchTerm); } private async Task ClearSearch() { searchTerm = ""; await LoadNotesAsync(); } private void OpenAddModal() { isEditing = false; currentNote = new CardNote(); showModal = true; } private void OpenEditModal(CardNote note) { isEditing = true; currentNote = new CardNote { CardName = note.CardName, Note = note.Note }; showModal = true; } private void CloseModal() { showModal = false; } private async Task SaveNoteAsync() { if (string.IsNullOrWhiteSpace(currentNote.CardName)) { alertIsSuccess = false; alertMessage = "Card name cannot be empty."; return; } isSaving = true; var result = await DbService.SaveCardNoteAsync(currentNote, !isEditing); isSaving = false; alertIsSuccess = result.Success; alertMessage = result.Message; if (result.Success) { showModal = false; await LoadNotesAsync(); } } private void OpenDeleteModal(CardNote note) { noteToDelete = note; showDeleteModal = true; } private async Task ConfirmDeleteAsync() { if (noteToDelete == null) return; isSaving = true; var result = await DbService.DeleteCardNoteAsync(noteToDelete.CardName); isSaving = false; alertIsSuccess = result.Success; alertMessage = result.Message; showDeleteModal = false; noteToDelete = null; await LoadNotesAsync(); } private async Task SeedSampleNotesAsync() { var result = await DbService.SeedSampleDataAsync(); alertIsSuccess = result.Success; alertMessage = result.Message; await LoadNotesAsync(); } public void Dispose() { ConfigService.OnConfigurationChanged -= HandleConfigChanged; } }