@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 && false) // Server-only feature. Redesign project structure {
Personal Note @if (isSaving) { Saving... }
}
} @code { private List allCards = []; private IEnumerable filteredCards => ApplyFilters(); private string search = ""; private string categoryFilter = ""; private string immortalFilter = ""; private bool agentOnly = true; private bool agentLink = true; private string factionFilter = ""; private string costFilter = ""; private string sortBy = "Name"; private bool sortDescending; private bool showDetailedView; private CardData? selectedCard; private List factions = []; private string currentNote = ""; private bool isSaving; private bool HasActiveFilters => categoryFilter != "" || factionFilter != "" || costFilter != "" || immortalFilter != ""; 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 filtered = allCards.Where(c => c.MatchesSearch(search) && (categoryFilter == "" || c.Category == categoryFilter) && (factionFilter == "" || c.Faction == factionFilter) && (costFilter == "" || c.Cost?.ToString() == costFilter) ); return sortBy switch { "Cost" => sortDescending ? filtered.OrderByDescending(c => c.Cost) : filtered.OrderBy(c => c.Cost), "Efficiency" => sortDescending ? filtered.OrderByDescending(c => c.StatEfficiency) : filtered.OrderBy(c => c.StatEfficiency), "Attack" => sortDescending ? filtered.OrderByDescending(c => c.Attack) : filtered.OrderBy(c => c.Attack), "Health" => sortDescending ? filtered.OrderByDescending(c => c.Health) : filtered.OrderBy(c => c.Health), _ => sortDescending ? filtered.OrderByDescending(c => c.Name) : filtered.OrderBy(c => c.Name) }; } private void SetImmortal(string imm) { immortalFilter = immortalFilter == imm ? "" : imm; } private void ClearImmortalFilter() { immortalFilter = ""; } private void SetCategory(string cat) { categoryFilter = categoryFilter == cat ? "" : cat; } private void ClearCategoryFilter() { categoryFilter = ""; } private void ClearFactionFilter() { factionFilter = ""; } private void ToggleAgentLink() { agentLink = !agentLink; } 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 = ""; } }