feat: enhance character data loading with distinct statuses and genders, optimize epithets handling
All checks were successful
Build Docker Image / build (push) Successful in 1m42s
All checks were successful
Build Docker Image / build (push) Successful in 1m42s
This commit is contained in:
@@ -65,54 +65,14 @@
|
||||
status: ''
|
||||
});
|
||||
|
||||
const availableStatuses = $derived.by(() => {
|
||||
const statuses = new Set<string>();
|
||||
for (const char of data.characters) {
|
||||
const status = char.displayValues.status;
|
||||
if (status && String(status).trim() !== '') {
|
||||
statuses.add(String(status));
|
||||
}
|
||||
}
|
||||
return Array.from(statuses).sort((a, b) => a.localeCompare(b));
|
||||
});
|
||||
|
||||
const availableGenders = $derived.by(() => {
|
||||
const genders = new Set<string>();
|
||||
for (const char of data.characters) {
|
||||
const gender = char.displayValues.gender;
|
||||
if (gender && String(gender).trim() !== '') {
|
||||
genders.add(String(gender));
|
||||
}
|
||||
}
|
||||
return Array.from(genders).sort((a, b) => a.localeCompare(b));
|
||||
});
|
||||
|
||||
const filteredCharacters = $derived.by(() => {
|
||||
return data.characters.filter((char) => {
|
||||
const normalizedQuery = searchQuery.toLowerCase().trim();
|
||||
let epithetsText = '';
|
||||
|
||||
if (char.displayValues.epithets) {
|
||||
if (typeof char.displayValues.epithets === 'string') {
|
||||
if (char.displayValues.epithets.includes('[')) {
|
||||
try {
|
||||
const parsed = JSON.parse(char.displayValues.epithets);
|
||||
epithetsText = Array.isArray(parsed) ? parsed.join(' ') : String(parsed);
|
||||
} catch {
|
||||
epithetsText = char.displayValues.epithets;
|
||||
}
|
||||
} else {
|
||||
epithetsText = char.displayValues.epithets;
|
||||
}
|
||||
} else if (Array.isArray(char.displayValues.epithets)) {
|
||||
epithetsText = char.displayValues.epithets.join(' ');
|
||||
}
|
||||
}
|
||||
|
||||
const matchesSearch =
|
||||
normalizedQuery === '' ||
|
||||
char.displayValues.name.toLowerCase().includes(normalizedQuery) ||
|
||||
epithetsText.toLowerCase().includes(normalizedQuery);
|
||||
char.displayValues.epithetsSearchText.includes(normalizedQuery);
|
||||
const matchesDaily =
|
||||
filterDaily === 'all' ||
|
||||
(filterDaily === 'daily' && char.displayValues.isInDailyMode) ||
|
||||
@@ -155,12 +115,12 @@
|
||||
epithets: override.epithets ?? '',
|
||||
pictureUrl: override.pictureUrl ?? '',
|
||||
url: override.url ?? '',
|
||||
devilFruitId: override.devilFruitId !== null && override.devilFruitId !== undefined ? override.devilFruitId : '',
|
||||
devilFruitId: override.devilFruitId !== null && override.devilFruitId !== undefined ? override.devilFruitId : (char.devilFruitId || ''),
|
||||
hakiObservation: override.hakiObservation ?? char.hakiObservation,
|
||||
hakiArmament: override.hakiArmament ?? char.hakiArmament,
|
||||
hakiConqueror: override.hakiConqueror ?? char.hakiConqueror,
|
||||
firstAppearance: override.firstAppearance ?? '',
|
||||
arcId: override.arcId !== null && override.arcId !== undefined ? override.arcId : '',
|
||||
arcId: override.arcId !== null && override.arcId !== undefined ? override.arcId : (char.arcId || ''),
|
||||
status: override.status ?? ''
|
||||
};
|
||||
showOriginalValue = {};
|
||||
@@ -261,7 +221,7 @@
|
||||
class="rounded-lg bg-slate-700 px-4 py-2 text-sm text-white outline-none transition focus:ring-2 focus:ring-amber-600"
|
||||
>
|
||||
<option value="all">All Statuses</option>
|
||||
{#each availableStatuses as status}
|
||||
{#each data.availableStatuses as status}
|
||||
<option value={status}>{status}</option>
|
||||
{/each}
|
||||
</select>
|
||||
@@ -270,7 +230,7 @@
|
||||
class="rounded-lg bg-slate-700 px-4 py-2 text-sm text-white outline-none transition focus:ring-2 focus:ring-amber-600"
|
||||
>
|
||||
<option value="all">All Genders</option>
|
||||
{#each availableGenders as gender}
|
||||
{#each data.availableGenders as gender}
|
||||
<option value={gender}>{gender}</option>
|
||||
{/each}
|
||||
</select>
|
||||
@@ -378,9 +338,9 @@
|
||||
{/if}
|
||||
{#if char.displayValues.epithets}
|
||||
<span class="text-xs text-gray-500 truncate">
|
||||
{typeof char.displayValues.epithets === 'string'
|
||||
? (char.displayValues.epithets.includes('[') ? JSON.parse(char.displayValues.epithets).join(', ') : char.displayValues.epithets)
|
||||
: char.displayValues.epithets.join(', ')}
|
||||
{Array.isArray(char.displayValues.epithets)
|
||||
? char.displayValues.epithets.join(', ')
|
||||
: char.displayValues.epithets}
|
||||
</span>
|
||||
{/if}
|
||||
</div>
|
||||
@@ -393,13 +353,10 @@
|
||||
<!-- Affiliations -->
|
||||
<td class="px-4 py-4 text-sm text-gray-400 {isFieldOverridden(char, 'affiliations') ? 'bg-amber-500/10' : ''}">
|
||||
{#if char.displayValues.affiliations}
|
||||
{@const parsedAffiliations = typeof char.displayValues.affiliations === 'string'
|
||||
? (char.displayValues.affiliations.includes('[') ? JSON.parse(char.displayValues.affiliations) : char.displayValues.affiliations.split(',').map((a: string) => a.trim()))
|
||||
: char.displayValues.affiliations}
|
||||
{#if Array.isArray(parsedAffiliations) && parsedAffiliations.length > 0}
|
||||
<span class="inline-block" title={parsedAffiliations.join(', ')}>{parsedAffiliations[0]}</span>
|
||||
{#if Array.isArray(char.displayValues.affiliations) && char.displayValues.affiliations.length > 0}
|
||||
<span class="inline-block" title={char.displayValues.affiliations.join(', ')}>{char.displayValues.affiliations[0]}</span>
|
||||
{:else}
|
||||
{parsedAffiliations}
|
||||
{char.displayValues.affiliations}
|
||||
{/if}
|
||||
{:else}
|
||||
-
|
||||
|
||||
Reference in New Issue
Block a user