feat: add age filter functionality and localization support in guess history
All checks were successful
Build Docker Image / build (push) Successful in 1m12s

This commit is contained in:
2026-03-16 22:05:09 +01:00
parent 2a3c82f777
commit 5fde54a2a7
4 changed files with 41 additions and 1 deletions

View File

@@ -211,6 +211,17 @@
</p> </p>
</div> </div>
{/if} {/if}
{#if columnVisibility.age !== false}
<div
class="flex w-16 shrink-0 items-center justify-center rounded-lg border border-amber-200/30 bg-amber-900/30 p-1 text-center sm:w-20 sm:p-2 md:w-24"
>
<p
class="text-[9px] font-semibold tracking-wider text-amber-100 uppercase sm:text-xs"
>
{$t.game.components.guessHistory.age}
</p>
</div>
{/if}
{#if columnVisibility.origin !== false} {#if columnVisibility.origin !== false}
<div <div
class="flex w-16 shrink-0 items-center justify-center rounded-lg border border-amber-200/30 bg-amber-900/30 p-1 text-center sm:w-20 sm:p-2 md:w-24" class="flex w-16 shrink-0 items-center justify-center rounded-lg border border-amber-200/30 bg-amber-900/30 p-1 text-center sm:w-20 sm:p-2 md:w-24"

View File

@@ -144,6 +144,7 @@
"withFruit": "With Fruit", "withFruit": "With Fruit",
"withoutFruit": "Without Fruit", "withoutFruit": "Without Fruit",
"heightDefined": "Height defined", "heightDefined": "Height defined",
"ageDefined": "Age defined",
"originDefined": "Origin defined", "originDefined": "Origin defined",
"availableCharactersSingular": "character available", "availableCharactersSingular": "character available",
"availableCharactersPlural": "characters available", "availableCharactersPlural": "characters available",

View File

@@ -144,6 +144,7 @@
"withFruit": "Avec Fruit", "withFruit": "Avec Fruit",
"withoutFruit": "Sans Fruit", "withoutFruit": "Sans Fruit",
"heightDefined": "Taille definie", "heightDefined": "Taille definie",
"ageDefined": "Age defini",
"originDefined": "Origine definie", "originDefined": "Origine definie",
"availableCharactersSingular": "personnage disponible", "availableCharactersSingular": "personnage disponible",
"availableCharactersPlural": "personnages disponibles", "availableCharactersPlural": "personnages disponibles",

View File

@@ -28,6 +28,7 @@
hasDevilFruit: null as boolean | null, // null = all, true = with fruit, false = without fruit hasDevilFruit: null as boolean | null, // null = all, true = with fruit, false = without fruit
status: [] as string[], status: [] as string[],
hasHeight: false, hasHeight: false,
hasAge: false,
hasOrigin: false, hasOrigin: false,
arcs: [] as string[] arcs: [] as string[]
}; };
@@ -141,6 +142,9 @@
if (!characterFilters.arcs) { if (!characterFilters.arcs) {
characterFilters.arcs = []; characterFilters.arcs = [];
} }
if (typeof characterFilters.hasAge !== 'boolean') {
characterFilters.hasAge = false;
}
} catch (e) { } catch (e) {
console.error('Failed to parse filters', e); console.error('Failed to parse filters', e);
} }
@@ -277,6 +281,11 @@
return false; return false;
} }
// Age filter
if (characterFilters.hasAge && (char.age === null || char.age === undefined)) {
return false;
}
// Origin filter // Origin filter
if (characterFilters.hasOrigin && (char.origin === null || char.origin === undefined || char.origin === '')) { if (characterFilters.hasOrigin && (char.origin === null || char.origin === undefined || char.origin === '')) {
return false; return false;
@@ -306,6 +315,7 @@
haki: $t.game.components.guessHistory.haki, haki: $t.game.components.guessHistory.haki,
bounty: $t.game.components.guessHistory.bounty, bounty: $t.game.components.guessHistory.bounty,
height: $t.game.components.guessHistory.height, height: $t.game.components.guessHistory.height,
age: $t.game.components.guessHistory.age,
origin: $t.game.components.guessHistory.origin, origin: $t.game.components.guessHistory.origin,
arc: $t.game.components.guessHistory.arc arc: $t.game.components.guessHistory.arc
}; };
@@ -424,6 +434,13 @@
} }
} }
function toggleAgeFilter() {
characterFilters.hasAge = !characterFilters.hasAge;
if (!hasWon) {
generateNewCharacter();
}
}
function toggleOriginFilter() { function toggleOriginFilter() {
characterFilters.hasOrigin = !characterFilters.hasOrigin; characterFilters.hasOrigin = !characterFilters.hasOrigin;
// Regenerate character with new filters // Regenerate character with new filters
@@ -451,6 +468,7 @@
hasDevilFruit: null, hasDevilFruit: null,
status: [], status: [],
hasHeight: false, hasHeight: false,
hasAge: false,
hasOrigin: false, hasOrigin: false,
arcs: [] arcs: []
}; };
@@ -661,7 +679,7 @@
<h3 class="text-xs font-semibold tracking-[0.2em] text-amber-200 uppercase"> <h3 class="text-xs font-semibold tracking-[0.2em] text-amber-200 uppercase">
{$t.game.infinite.filtersTitle} {$t.game.infinite.filtersTitle}
</h3> </h3>
{#if characterFilters.gender.length > 0 || characterFilters.hasHaki || characterFilters.hasDevilFruit !== null || characterFilters.status.length > 0 || characterFilters.hasHeight || characterFilters.hasOrigin || characterFilters.arcs.length > 0} {#if characterFilters.gender.length > 0 || characterFilters.hasHaki || characterFilters.hasDevilFruit !== null || characterFilters.status.length > 0 || characterFilters.hasHeight || characterFilters.hasAge || characterFilters.hasOrigin || characterFilters.arcs.length > 0}
<button <button
type="button" type="button"
onclick={clearAllFilters} onclick={clearAllFilters}
@@ -758,6 +776,15 @@
> >
{$t.game.infinite.heightDefined} {$t.game.infinite.heightDefined}
</button> </button>
<button
type="button"
onclick={toggleAgeFilter}
class="rounded-full border px-2.5 py-1 text-xs font-medium transition-colors {characterFilters.hasAge
? 'border-amber-300/50 bg-amber-300/10 text-amber-100 hover:bg-amber-300/20'
: 'border-white/20 bg-slate-900/40 text-slate-400 hover:bg-slate-900/60'}"
>
{$t.game.infinite.ageDefined}
</button>
<button <button
type="button" type="button"
onclick={toggleOriginFilter} onclick={toggleOriginFilter}