...
This commit is contained in:
@@ -13,6 +13,11 @@
|
|||||||
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="nav-item px-3">
|
||||||
|
<NavLink class="nav-link" href="database">
|
||||||
|
<span class="bi bi-database-fill-nav-menu" aria-hidden="true"></span> Database
|
||||||
|
</NavLink>
|
||||||
|
</div>
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link" href="counter">
|
<NavLink class="nav-link" href="counter">
|
||||||
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
|
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
|
||||||
|
|||||||
@@ -0,0 +1,191 @@
|
|||||||
|
@page "/database"
|
||||||
|
@using Model.Entity
|
||||||
|
@using Model.Entity.Data
|
||||||
|
@using Model.Entity.Parts
|
||||||
|
|
||||||
|
<PageTitle>Database</PageTitle>
|
||||||
|
|
||||||
|
<div class="container-fluid py-3">
|
||||||
|
<h1 class="mb-3">Database</h1>
|
||||||
|
|
||||||
|
<div class="card mb-4 shadow-sm filters-card">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row g-3 align-items-end">
|
||||||
|
<div class="col-12 col-md-6 col-lg-4">
|
||||||
|
<label for="factionSelect" class="form-label fw-semibold">Faction</label>
|
||||||
|
<select id="factionSelect" class="form-select" @bind="selectedFaction" @bind:after="OnFactionChanged">
|
||||||
|
<option value="@DataType.Any">Any</option>
|
||||||
|
<option value="@DataType.FACTION_QRath">Q'Rath</option>
|
||||||
|
<option value="@DataType.FACTION_Aru">Aru</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6 col-lg-4">
|
||||||
|
<label for="immortalSelect" class="form-label fw-semibold">Immortal</label>
|
||||||
|
<select id="immortalSelect" class="form-select" @bind="selectedImmortal" @bind:after="OnImmortalChanged">
|
||||||
|
<option value="@DataType.Any">Any</option>
|
||||||
|
@foreach (var choice in immortalChoices)
|
||||||
|
{
|
||||||
|
<option value="@choice.Key">@choice.Name</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-2 text-muted small">
|
||||||
|
Showing @filteredEntities.Count @(filteredEntities.Count == 1 ? "entity" : "entities")
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-3">
|
||||||
|
@foreach (var entity in filteredEntities)
|
||||||
|
{
|
||||||
|
<div class="col-12 col-sm-6 col-lg-4 col-xl-3">
|
||||||
|
<div class="card h-100 shadow-sm entity-card">
|
||||||
|
<div class="card-body d-flex flex-column">
|
||||||
|
<div class="d-flex justify-content-between align-items-start mb-2 gap-2">
|
||||||
|
<h5 class="card-title mb-0 text-break">@entity.Info().Name</h5>
|
||||||
|
@{
|
||||||
|
var vanguard = entity.VanguardAdded();
|
||||||
|
if (vanguard != null)
|
||||||
|
{
|
||||||
|
<span class="immortal-badge">@(EntityData.Get().TryGetValue(vanguard!.ImmortalId, out var imm) ? imm.Info().Name : "")</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<h6 class="card-subtitle mb-2">
|
||||||
|
<span class="badge bg-secondary me-1">@entity.EntityType.Replace("_", " ")</span>
|
||||||
|
@if (entity.Faction() != null)
|
||||||
|
{
|
||||||
|
<span class="badge bg-dark-subtle text-dark-emphasis">@(EntityData.Get().TryGetValue(entity.Faction().Faction, out var fac) ? fac.Info().Name : "")</span>
|
||||||
|
}
|
||||||
|
</h6>
|
||||||
|
@if (!string.IsNullOrEmpty(entity.Info().Description))
|
||||||
|
{
|
||||||
|
<p class="card-text flex-grow-1 small">
|
||||||
|
@(entity.Info().Description.Length > 120
|
||||||
|
? entity.Info().Description[..117] + "..."
|
||||||
|
: entity.Info().Description)
|
||||||
|
</p>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (filteredEntities.Count == 0)
|
||||||
|
{
|
||||||
|
<div class="alert alert-info mt-3" role="alert">No entities match the selected filters.</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.filters-card {
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.125);
|
||||||
|
}
|
||||||
|
|
||||||
|
.entity-card {
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.125);
|
||||||
|
transition: box-shadow 0.15s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entity-card:hover {
|
||||||
|
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.immortal-badge {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0.25em 0.65em;
|
||||||
|
font-size: 0.75em;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1;
|
||||||
|
color: #000;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: baseline;
|
||||||
|
border-radius: 0.375rem;
|
||||||
|
background-color: #cff4fc;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private string selectedFaction = DataType.Any;
|
||||||
|
private string selectedImmortal = DataType.Any;
|
||||||
|
private List<ImmortalChoice> immortalChoices = new();
|
||||||
|
|
||||||
|
private List<EntityModel> allEntities = new();
|
||||||
|
private List<EntityModel> filteredEntities = new();
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
allEntities = EntityModel.GetList()
|
||||||
|
.Where(e => !e.IsSpeculative)
|
||||||
|
.ToList();
|
||||||
|
RefreshImmortalChoices();
|
||||||
|
ApplyFilters();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnFactionChanged()
|
||||||
|
{
|
||||||
|
if (selectedFaction != DataType.FACTION_QRath && selectedFaction != DataType.FACTION_Aru)
|
||||||
|
{
|
||||||
|
selectedFaction = DataType.Any;
|
||||||
|
}
|
||||||
|
selectedImmortal = DataType.Any;
|
||||||
|
RefreshImmortalChoices();
|
||||||
|
ApplyFilters();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnImmortalChanged()
|
||||||
|
{
|
||||||
|
ApplyFilters();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshImmortalChoices()
|
||||||
|
{
|
||||||
|
immortalChoices.Clear();
|
||||||
|
|
||||||
|
if (selectedFaction == DataType.FACTION_QRath || selectedFaction == DataType.Any)
|
||||||
|
{
|
||||||
|
AddImmortalChoice(DataType.IMMORTAL_Orzum);
|
||||||
|
AddImmortalChoice(DataType.IMMORTAL_Ajari);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedFaction == DataType.FACTION_Aru || selectedFaction == DataType.Any)
|
||||||
|
{
|
||||||
|
AddImmortalChoice(DataType.IMMORTAL_Atzlan);
|
||||||
|
AddImmortalChoice(DataType.IMMORTAL_Mala);
|
||||||
|
AddImmortalChoice(DataType.IMMORTAL_Xol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddImmortalChoice(string id)
|
||||||
|
{
|
||||||
|
var name = EntityData.Get().TryGetValue(id, out var model)
|
||||||
|
? model.Info().Name
|
||||||
|
: id.Replace("IMMORTAL_", "");
|
||||||
|
immortalChoices.Add(new ImmortalChoice(id, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyFilters()
|
||||||
|
{
|
||||||
|
var query = allEntities.AsEnumerable();
|
||||||
|
|
||||||
|
if (selectedFaction != DataType.Any)
|
||||||
|
{
|
||||||
|
query = query.Where(e =>
|
||||||
|
e.Faction() != null && e.Faction().Faction == selectedFaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedImmortal != DataType.Any)
|
||||||
|
{
|
||||||
|
query = query.Where(e =>
|
||||||
|
e.VanguardAdded() != null && e.VanguardAdded().ImmortalId == selectedImmortal);
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredEntities = query.OrderBy(e => e.Info().Name).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private record ImmortalChoice(string Key, string Name);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user