From 32c48801806f3b85df4124c780da56231268eab4 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Mon, 15 Dec 2025 12:48:51 -0800 Subject: [PATCH] refactor character section components - move series from taxonomy to metadata section - rename uncap label to "Uncap Level" - show all uncap flags in view mode --- .../sections/CharacterMetadataSection.svelte | 83 ++++- .../sections/CharacterTaxonomySection.svelte | 27 -- .../sections/CharacterUncapSection.svelte | 304 +++++++++--------- 3 files changed, 231 insertions(+), 183 deletions(-) diff --git a/src/lib/features/database/characters/sections/CharacterMetadataSection.svelte b/src/lib/features/database/characters/sections/CharacterMetadataSection.svelte index 1355fe51..7f5f3f6e 100644 --- a/src/lib/features/database/characters/sections/CharacterMetadataSection.svelte +++ b/src/lib/features/database/characters/sections/CharacterMetadataSection.svelte @@ -7,9 +7,10 @@ import SuggestionDetailItem from '$lib/components/ui/SuggestionDetailItem.svelte' import CopyableText from '$lib/components/ui/CopyableText.svelte' import Select from '$lib/components/ui/Select.svelte' + import MultiSelect from '$lib/components/ui/MultiSelect.svelte' import { getRarityLabel, getRarityOptions } from '$lib/utils/rarity' import { getWeaponImage } from '$lib/utils/images' - import { CHARACTER_SEASON_NAMES, getSeasonName } from '$lib/types/enums' + import { CHARACTER_SEASON_NAMES, CHARACTER_SERIES_NAMES, getSeasonName, getSeriesNames } from '$lib/types/enums' interface Props { character: any @@ -43,10 +44,36 @@ })) ] + // Series options for multiselect + const seriesOptions = Object.entries(CHARACTER_SERIES_NAMES).map(([value, label]) => ({ + value: Number(value), + label + })) + function formatPromotions(promotionNames: string[] | undefined): string { if (!promotionNames || promotionNames.length === 0) return '—' return promotionNames.join(', ') } + + // Format series for display - use API-provided seriesNames if available + function formatSeriesDisplay(): string { + // Use pre-computed seriesNames from API if available + if (character.seriesNames && character.seriesNames.length > 0) { + return character.seriesNames.join(', ') + } + // Fallback for legacy integer array + if (Array.isArray(character.series) && character.series.length > 0) { + const first = character.series[0] + if (typeof first === 'number') { + return getSeriesNames(character.series as number[]).join(', ') + } + // CharacterSeriesRef[] - extract names + return (character.series as Array<{ name: { en?: string } }>) + .map((s) => s.name?.en || 'Unknown') + .join(', ') + } + return '—' + } @@ -62,6 +89,47 @@ onAcceptSuggestion={() => onAcceptSuggestion?.('rarity', suggestions?.rarity)} onDismissSuggestion={() => onDismissSuggestion?.('rarity')} /> + + + {#if character.recruitedBy} + + + {character.recruitedBy.name.en + {character.recruitedBy.name.en} + + + + {/if} + + + - {:else} - {#if character.season} - - {/if} {#if character.granblueId} @@ -116,6 +173,8 @@ value={formatPromotions(character.recruitedBy.promotionNames)} /> {/if} + + {/if} diff --git a/src/lib/features/database/characters/sections/CharacterTaxonomySection.svelte b/src/lib/features/database/characters/sections/CharacterTaxonomySection.svelte index de46bbb4..b11143ab 100644 --- a/src/lib/features/database/characters/sections/CharacterTaxonomySection.svelte +++ b/src/lib/features/database/characters/sections/CharacterTaxonomySection.svelte @@ -5,14 +5,12 @@ import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte' import DetailItem from '$lib/components/ui/DetailItem.svelte' import SuggestionDetailItem from '$lib/components/ui/SuggestionDetailItem.svelte' - import MultiSelect from '$lib/components/ui/MultiSelect.svelte' import ElementLabel from '$lib/components/labels/ElementLabel.svelte' import ProficiencyLabel from '$lib/components/labels/ProficiencyLabel.svelte' import { getElementOptions } from '$lib/utils/element' import { getRaceLabel, getRaceOptions } from '$lib/utils/race' import { getGenderLabel, getGenderOptions } from '$lib/utils/gender' import { getProficiencyOptions } from '$lib/utils/proficiency' - import { CHARACTER_SERIES_NAMES, getSeriesNames } from '$lib/types/enums' interface Props { character: any @@ -39,18 +37,6 @@ const raceOptions = getRaceOptions() const genderOptions = getGenderOptions() const proficiencyOptions = getProficiencyOptions() - - // Series options for multiselect - const seriesOptions = Object.entries(CHARACTER_SERIES_NAMES).map(([value, label]) => ({ - value: Number(value), - label - })) - - // Format series for display - function formatSeriesDisplay(series: number[]): string { - if (!series || series.length === 0) return '—' - return getSeriesNames(series).join(', ') - } @@ -121,18 +107,6 @@ onAcceptSuggestion={() => onAcceptSuggestion?.('proficiency2', suggestions?.proficiency2)} onDismissSuggestion={() => onDismissSuggestion?.('proficiency2')} /> - - - {:else} @@ -146,6 +120,5 @@ - {/if} diff --git a/src/lib/features/database/characters/sections/CharacterUncapSection.svelte b/src/lib/features/database/characters/sections/CharacterUncapSection.svelte index 8e74035a..90f19c98 100644 --- a/src/lib/features/database/characters/sections/CharacterUncapSection.svelte +++ b/src/lib/features/database/characters/sections/CharacterUncapSection.svelte @@ -1,166 +1,182 @@ - {#if character?.uncap || editMode} - - - - {/if} + + + - {#if editMode} - onAcceptSuggestion?.('flb', suggestions?.flb)} - onDismissSuggestion={() => onDismissSuggestion?.('flb')} - /> - onAcceptSuggestion?.('ulb', suggestions?.ulb)} - onDismissSuggestion={() => onDismissSuggestion?.('ulb')} - /> - -
- -

This is for Story SRs. Don't check this unless something really weird happens.

-
- {/if} + {#if !editMode} + + + + + {:else} + onAcceptSuggestion?.('flb', suggestions?.flb)} + onDismissSuggestion={() => onDismissSuggestion?.('flb')} + /> + onAcceptSuggestion?.('ulb', suggestions?.ulb)} + onDismissSuggestion={() => onDismissSuggestion?.('ulb')} + /> + +
+ +

+ This is for Story SRs. Don't check this unless something really weird happens. +

+
+ {/if}
-