@page "/cards" @inject HttpClient Http Card Gallery @if (selectedCard != null) {
@selectedCard.Name

@selectedCard.Name

@selectedCard.Category @if (selectedCard.Cost.HasValue) { @selectedCard.Cost } @if (selectedCard.Attack.HasValue) { @selectedCard.Attack } @if (selectedCard.Health.HasValue) { @selectedCard.Health } @if (selectedCard.Speed != null) { @selectedCard.Speed }
@if (selectedCard.Faction != null) {
Faction @selectedCard.Faction
} @if (selectedCard.Description != null) {
@selectedCard.Description
} @if (selectedCard.Set != null) {
Set @selectedCard.Set
} @if (selectedCard.Archetypes is { Count: > 0 }) {
Archetypes @string.Join(", ", selectedCard.Archetypes)
} @if (selectedCard.ImmortalizeWhen != null) {
Immortalize When @selectedCard.ImmortalizeWhen
} @if (selectedCard.HasImmortalize) {
Immortalizes To @string.Join(", ", selectedCard.ImmortalizeTo!)
} @if (selectedCard.ImmortalizeFrom != null) {
Immortalizes From @selectedCard.ImmortalizeFrom
} @if (selectedCard.IsAgent) {
Personal Note @if (isSaving) { Saving... }
}
} @code { private List allCards = []; private IEnumerable filteredCards => ApplyFilters(); private string search = ""; private string categoryFilter = ""; private string factionFilter = ""; private string costFilter = ""; private CardData? selectedCard; private List factions = []; private string currentNote = ""; private bool isSaving = false; private bool HasActiveFilters => categoryFilter != "" || factionFilter != "" || costFilter != ""; protected override void OnInitialized() { allCards = CardDatabase.Cards; factions = allCards .Select(c => c.Faction) .Where(f => f != null) .Distinct() .OrderBy(f => f) .ToList()!; } private IEnumerable ApplyFilters() { var q = search?.Trim().ToLowerInvariant() ?? ""; return allCards.Where(c => (q.Length == 0 || c.Name.ToLowerInvariant().Contains(q) || (c.Description?.ToLowerInvariant().Contains(q) ?? false)) && (categoryFilter == "" || c.Category == categoryFilter) && (factionFilter == "" || c.Faction == factionFilter) && (costFilter == "" || c.Cost?.ToString() == costFilter) ); } private void SetCategory(string cat) { categoryFilter = categoryFilter == cat ? "" : cat; } private void ClearCategoryFilter() { categoryFilter = ""; } private void ClearFactionFilter() { factionFilter = ""; } private void ClearCostFilter() { costFilter = ""; } private void ClearSearch() { search = ""; } private async Task SelectCard(CardData card) { selectedCard = card; if (card.IsAgent) { currentNote = ""; try { var note = await Http.GetFromJsonAsync($"api/notes/{Uri.EscapeDataString(card.Name)}"); currentNote = note?.Note ?? ""; } catch { currentNote = ""; } } } private async Task SaveNote() { if (selectedCard == null || !selectedCard.IsAgent) return; isSaving = true; try { await Http.PostAsJsonAsync("api/notes", new CardNote { CardName = selectedCard.Name, Note = currentNote }); } catch { // Error handling } finally { isSaving = false; } } private void CloseDetail() { selectedCard = null; } private void ClearFilters() { search = ""; categoryFilter = ""; factionFilter = ""; costFilter = ""; } }