Fix database pages to use camelCase field names

- Update database grid navigation to use granblueId
- Update column definitions to use granblueId
- Fix all detail pages to use camelCase field names from transformed API responses
- Fix field names for HP/ATK stats, abilities, and metadata
This commit is contained in:
Justin Edmund 2025-09-20 02:57:27 -07:00
parent 0797892ea4
commit 2cf29275b6
7 changed files with 86 additions and 86 deletions

View file

@ -72,11 +72,11 @@
console.log('Row selected:', ev) console.log('Row selected:', ev)
const rowId = ev.id const rowId = ev.id
if (rowId) { if (rowId) {
// Find the row data to get the granblue_id // Find the row data to get the granblueId
const rowData = data.find((item: any) => item.id === rowId) const rowData = data.find((item: any) => item.id === rowId)
if (rowData && rowData.granblue_id) { if (rowData && rowData.granblueId) {
console.log(`Navigating to: /database/${resource}/${rowData.granblue_id}`) console.log(`Navigating to: /database/${resource}/${rowData.granblueId}`)
goto(`/database/${resource}/${rowData.granblue_id}`) goto(`/database/${resource}/${rowData.granblueId}`)
} }
} }
}) })

View file

@ -13,7 +13,7 @@
const columns = [ const columns = [
{ {
id: 'granblue_id', id: 'granblueId',
header: 'Image', header: 'Image',
width: 80, width: 80,
cell: CharacterImageCell cell: CharacterImageCell

View file

@ -38,7 +38,7 @@
// Editable fields - create reactive state for each field // Editable fields - create reactive state for each field
let editData = $state({ let editData = $state({
name: character?.name || '', name: character?.name || '',
granblue_id: character?.granblue_id || '', granblueId: character?.granblueId || '',
rarity: character?.rarity || 1, rarity: character?.rarity || 1,
element: character?.element || 0, element: character?.element || 0,
race1: character?.race?.[0] ?? null, race1: character?.race?.[0] ?? null,
@ -46,12 +46,12 @@
gender: character?.gender || 0, gender: character?.gender || 0,
proficiency1: character?.proficiency?.[0] || 0, proficiency1: character?.proficiency?.[0] || 0,
proficiency2: character?.proficiency?.[1] || 0, proficiency2: character?.proficiency?.[1] || 0,
min_hp: character?.hp?.min_hp || 0, minHp: character?.hp?.minHp || 0,
max_hp: character?.hp?.max_hp || 0, maxHp: character?.hp?.maxHp || 0,
max_hp_flb: character?.hp?.max_hp_flb || 0, maxHpFlb: character?.hp?.maxHpFlb || 0,
min_atk: character?.atk?.min_atk || 0, minAtk: character?.atk?.minAtk || 0,
max_atk: character?.atk?.max_atk || 0, maxAtk: character?.atk?.maxAtk || 0,
max_atk_flb: character?.atk?.max_atk_flb || 0, maxAtkFlb: character?.atk?.maxAtkFlb || 0,
flb: character?.uncap?.flb || false, flb: character?.uncap?.flb || false,
ulb: character?.uncap?.ulb || false, ulb: character?.uncap?.ulb || false,
transcendence: character?.uncap?.transcendence || false, transcendence: character?.uncap?.transcendence || false,
@ -63,7 +63,7 @@
if (character) { if (character) {
editData = { editData = {
name: character.name || '', name: character.name || '',
granblue_id: character.granblue_id || '', granblueId: character.granblueId || '',
rarity: character.rarity || 1, rarity: character.rarity || 1,
element: character.element || 0, element: character.element || 0,
race1: character.race?.[0] ?? null, race1: character.race?.[0] ?? null,
@ -71,12 +71,12 @@
gender: character.gender || 0, gender: character.gender || 0,
proficiency1: character.proficiency?.[0] || 0, proficiency1: character.proficiency?.[0] || 0,
proficiency2: character.proficiency?.[1] || 0, proficiency2: character.proficiency?.[1] || 0,
min_hp: character.hp?.min_hp || 0, minHp: character.hp?.minHp || 0,
max_hp: character.hp?.max_hp || 0, maxHp: character.hp?.maxHp || 0,
max_hp_flb: character.hp?.max_hp_flb || 0, maxHpFlb: character.hp?.maxHpFlb || 0,
min_atk: character.atk?.min_atk || 0, minAtk: character.atk?.minAtk || 0,
max_atk: character.atk?.max_atk || 0, maxAtk: character.atk?.maxAtk || 0,
max_atk_flb: character.atk?.max_atk_flb || 0, maxAtkFlb: character.atk?.maxAtkFlb || 0,
flb: character.uncap?.flb || false, flb: character.uncap?.flb || false,
ulb: character.uncap?.ulb || false, ulb: character.uncap?.ulb || false,
transcendence: character.uncap?.transcendence || false, transcendence: character.uncap?.transcendence || false,
@ -101,7 +101,7 @@
if (!editMode && character) { if (!editMode && character) {
editData = { editData = {
name: character.name || '', name: character.name || '',
granblue_id: character.granblue_id || '', granblueId: character.granblueId || '',
rarity: character.rarity || 1, rarity: character.rarity || 1,
element: character.element || 0, element: character.element || 0,
race1: character.race?.[0] ?? null, race1: character.race?.[0] ?? null,
@ -109,12 +109,12 @@
gender: character.gender || 0, gender: character.gender || 0,
proficiency1: character.proficiency?.[0] || 0, proficiency1: character.proficiency?.[0] || 0,
proficiency2: character.proficiency?.[1] || 0, proficiency2: character.proficiency?.[1] || 0,
min_hp: character.hp?.min_hp || 0, minHp: character.hp?.minHp || 0,
max_hp: character.hp?.max_hp || 0, maxHp: character.hp?.maxHp || 0,
max_hp_flb: character.hp?.max_hp_flb || 0, maxHpFlb: character.hp?.maxHpFlb || 0,
min_atk: character.atk?.min_atk || 0, minAtk: character.atk?.minAtk || 0,
max_atk: character.atk?.max_atk || 0, maxAtk: character.atk?.maxAtk || 0,
max_atk_flb: character.atk?.max_atk_flb || 0, maxAtkFlb: character.atk?.maxAtkFlb || 0,
flb: character.uncap?.flb || false, flb: character.uncap?.flb || false,
ulb: character.uncap?.ulb || false, ulb: character.uncap?.ulb || false,
transcendence: character.uncap?.transcendence || false, transcendence: character.uncap?.transcendence || false,
@ -132,21 +132,21 @@
// Prepare the data for API // Prepare the data for API
const payload = { const payload = {
name: editData.name, name: editData.name,
granblue_id: editData.granblue_id, granblue_id: editData.granblueId,
rarity: editData.rarity, rarity: editData.rarity,
element: editData.element, element: editData.element,
race: [editData.race1, editData.race2].filter(r => r !== null && r !== undefined), race: [editData.race1, editData.race2].filter(r => r !== null && r !== undefined),
gender: editData.gender, gender: editData.gender,
proficiency: [editData.proficiency1, editData.proficiency2], proficiency: [editData.proficiency1, editData.proficiency2],
hp: { hp: {
min_hp: editData.min_hp, min_hp: editData.minHp,
max_hp: editData.max_hp, max_hp: editData.maxHp,
max_hp_flb: editData.max_hp_flb max_hp_flb: editData.maxHpFlb
}, },
atk: { atk: {
min_atk: editData.min_atk, min_atk: editData.minAtk,
max_atk: editData.max_atk, max_atk: editData.maxAtk,
max_atk_flb: editData.max_atk_flb max_atk_flb: editData.maxAtkFlb
}, },
uncap: { uncap: {
flb: editData.flb, flb: editData.flb,
@ -183,8 +183,8 @@
// Helper function to get character image // Helper function to get character image
function getCharacterImage(character: any): string { function getCharacterImage(character: any): string {
if (!character?.granblue_id) return '/images/placeholders/placeholder-character-main.png' if (!character?.granblueId) return '/images/placeholders/placeholder-character-main.png'
return `/images/character-grid/${character.granblue_id}_01.jpg` return `/images/character-grid/${character.granblueId}_01.jpg`
} }
// Calculate uncap properties for the indicator // Calculate uncap properties for the indicator
@ -240,13 +240,13 @@
/> />
<DetailItem <DetailItem
label="Granblue ID" label="Granblue ID"
bind:value={editData.granblue_id} bind:value={editData.granblueId}
editable={true} editable={true}
type="text" type="text"
/> />
{:else} {:else}
<DetailItem label="Rarity" value={getRarityLabel(character.rarity)} /> <DetailItem label="Rarity" value={getRarityLabel(character.rarity)} />
<DetailItem label="Granblue ID" value={character.granblue_id} /> <DetailItem label="Granblue ID" value={character.granblueId} />
{/if} {/if}
</DetailsContainer> </DetailsContainer>
<DetailsContainer title="Details"> <DetailsContainer title="Details">
@ -341,30 +341,30 @@
{#if editMode} {#if editMode}
<DetailItem <DetailItem
label="Base HP" label="Base HP"
bind:value={editData.min_hp} bind:value={editData.minHp}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
<DetailItem <DetailItem
label="Max HP" label="Max HP"
bind:value={editData.max_hp} bind:value={editData.maxHp}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
<DetailItem <DetailItem
label="Max HP (FLB)" label="Max HP (FLB)"
bind:value={editData.max_hp_flb} bind:value={editData.maxHpFlb}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
{:else} {:else}
<DetailItem label="Base HP" value={character.hp?.min_hp} /> <DetailItem label="Base HP" value={character.hp?.minHp} />
<DetailItem label="Max HP" value={character.hp?.max_hp} /> <DetailItem label="Max HP" value={character.hp?.maxHp} />
{#if flb} {#if flb}
<DetailItem label="Max HP (FLB)" value={character.hp?.max_hp_flb} /> <DetailItem label="Max HP (FLB)" value={character.hp?.maxHpFlb} />
{/if} {/if}
{/if} {/if}
</DetailsContainer> </DetailsContainer>
@ -373,30 +373,30 @@
{#if editMode} {#if editMode}
<DetailItem <DetailItem
label="Base Attack" label="Base Attack"
bind:value={editData.min_atk} bind:value={editData.minAtk}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
<DetailItem <DetailItem
label="Max Attack" label="Max Attack"
bind:value={editData.max_atk} bind:value={editData.maxAtk}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
<DetailItem <DetailItem
label="Max Attack (FLB)" label="Max Attack (FLB)"
bind:value={editData.max_atk_flb} bind:value={editData.maxAtkFlb}
editable={true} editable={true}
type="number" type="number"
placeholder="0" placeholder="0"
/> />
{:else} {:else}
<DetailItem label="Base Attack" value={character.atk?.min_atk} /> <DetailItem label="Base Attack" value={character.atk?.minAtk} />
<DetailItem label="Max Attack" value={character.atk?.max_atk} /> <DetailItem label="Max Attack" value={character.atk?.maxAtk} />
{#if flb} {#if flb}
<DetailItem label="Max Attack (FLB)" value={character.atk?.max_atk_flb} /> <DetailItem label="Max Attack (FLB)" value={character.atk?.maxAtkFlb} />
{/if} {/if}
{/if} {/if}
</DetailsContainer> </DetailsContainer>

View file

@ -12,7 +12,7 @@
// Column configuration for summons // Column configuration for summons
const columns: IColumn[] = [ const columns: IColumn[] = [
{ {
id: 'granblue_id', id: 'granblueId',
header: 'Image', header: 'Image',
width: 80, width: 80,
cell: SummonImageCell cell: SummonImageCell

View file

@ -17,8 +17,8 @@
// Helper function to get summon image // Helper function to get summon image
function getSummonImage(summon: any): string { function getSummonImage(summon: any): string {
if (!summon?.granblue_id) return '/images/placeholders/placeholder-summon-main.png' if (!summon?.granblueId) return '/images/placeholders/placeholder-summon-main.png'
return `/images/summon-grid/${summon.granblue_id}.jpg` return `/images/summon-grid/${summon.granblueId}.jpg`
} }
// Calculate uncap properties for the indicator // Calculate uncap properties for the indicator
@ -44,30 +44,30 @@
<DetailsHeader type="summon" item={summon} image={getSummonImage(summon)} /> <DetailsHeader type="summon" item={summon} image={getSummonImage(summon)} />
<DetailsContainer title="HP Stats"> <DetailsContainer title="HP Stats">
<DetailItem label="Base HP" value={summon.hp?.min_hp} /> <DetailItem label="Base HP" value={summon.hp?.minHp} />
<DetailItem label="Max HP" value={summon.hp?.max_hp} /> <DetailItem label="Max HP" value={summon.hp?.maxHp} />
{#if flb} {#if flb}
<DetailItem label="Max HP (FLB)" value={summon.hp?.max_hp_flb} /> <DetailItem label="Max HP (FLB)" value={summon.hp?.maxHpFlb} />
{/if} {/if}
{#if ulb} {#if ulb}
<DetailItem label="Max HP (ULB)" value={summon.hp?.max_hp_ulb} /> <DetailItem label="Max HP (ULB)" value={summon.hp?.maxHpUlb} />
{/if} {/if}
{#if transcendence} {#if transcendence}
<DetailItem label="Max HP (XLB)" value={summon.hp?.max_hp_xlb} /> <DetailItem label="Max HP (XLB)" value={summon.hp?.maxHpXlb} />
{/if} {/if}
</DetailsContainer> </DetailsContainer>
<DetailsContainer title="Attack Stats"> <DetailsContainer title="Attack Stats">
<DetailItem label="Base Attack" value={summon.atk?.min_atk} /> <DetailItem label="Base Attack" value={summon.atk?.minAtk} />
<DetailItem label="Max Attack" value={summon.atk?.max_atk} /> <DetailItem label="Max Attack" value={summon.atk?.maxAtk} />
{#if flb} {#if flb}
<DetailItem label="Max Attack (FLB)" value={summon.atk?.max_atk_flb} /> <DetailItem label="Max Attack (FLB)" value={summon.atk?.maxAtkFlb} />
{/if} {/if}
{#if ulb} {#if ulb}
<DetailItem label="Max Attack (ULB)" value={summon.atk?.max_atk_ulb} /> <DetailItem label="Max Attack (ULB)" value={summon.atk?.maxAtkUlb} />
{/if} {/if}
{#if transcendence} {#if transcendence}
<DetailItem label="Max Attack (XLB)" value={summon.atk?.max_atk_xlb} /> <DetailItem label="Max Attack (XLB)" value={summon.atk?.maxAtkXlb} />
{/if} {/if}
</DetailsContainer> </DetailsContainer>
@ -91,11 +91,11 @@
<div class="summon-abilities"> <div class="summon-abilities">
<h3>Call Effect</h3> <h3>Call Effect</h3>
<div class="abilities-section"> <div class="abilities-section">
{#if summon.call_name || summon.call_description} {#if summon.callName || summon.callDescription}
<div class="ability-item"> <div class="ability-item">
<h4 class="ability-name">{summon.call_name || 'Call Effect'}</h4> <h4 class="ability-name">{summon.callName || 'Call Effect'}</h4>
<p class="ability-description"> <p class="ability-description">
{summon.call_description || 'No description available'} {summon.callDescription || 'No description available'}
</p> </p>
</div> </div>
{:else} {:else}
@ -105,11 +105,11 @@
<h3>Aura Effect</h3> <h3>Aura Effect</h3>
<div class="abilities-section"> <div class="abilities-section">
{#if summon.aura_name || summon.aura_description} {#if summon.auraName || summon.auraDescription}
<div class="ability-item"> <div class="ability-item">
<h4 class="ability-name">{summon.aura_name || 'Aura Effect'}</h4> <h4 class="ability-name">{summon.auraName || 'Aura Effect'}</h4>
<p class="ability-description"> <p class="ability-description">
{summon.aura_description || 'No description available'} {summon.auraDescription || 'No description available'}
</p> </p>
</div> </div>
{:else} {:else}
@ -117,13 +117,13 @@
{/if} {/if}
</div> </div>
{#if summon.sub_aura_name || summon.sub_aura_description} {#if summon.subAuraName || summon.subAuraDescription}
<h3>Sub Aura Effect</h3> <h3>Sub Aura Effect</h3>
<div class="abilities-section"> <div class="abilities-section">
<div class="ability-item"> <div class="ability-item">
<h4 class="ability-name">{summon.sub_aura_name || 'Sub Aura Effect'}</h4> <h4 class="ability-name">{summon.subAuraName || 'Sub Aura Effect'}</h4>
<p class="ability-description"> <p class="ability-description">
{summon.sub_aura_description || 'No description available'} {summon.subAuraDescription || 'No description available'}
</p> </p>
</div> </div>
</div> </div>

View file

@ -13,7 +13,7 @@
// Column configuration for weapons // Column configuration for weapons
const columns: IColumn[] = [ const columns: IColumn[] = [
{ {
id: 'granblue_id', id: 'granblueId',
header: 'Image', header: 'Image',
width: 80, width: 80,
cell: WeaponImageCell cell: WeaponImageCell

View file

@ -18,13 +18,13 @@
// Helper function to get weapon image // Helper function to get weapon image
function getWeaponImage(weapon: any): string { function getWeaponImage(weapon: any): string {
if (!weapon?.granblue_id) return '/images/placeholders/placeholder-weapon-main.png' if (!weapon?.granblueId) return '/images/placeholders/placeholder-weapon-main.png'
// Handle element-specific weapons (primal weapons) // Handle element-specific weapons (primal weapons)
if (weapon.element === 0 && weapon.instance_element) { if (weapon.element === 0 && weapon.instanceElement) {
return `/images/weapon-grid/${weapon.granblue_id}_${weapon.instance_element}.jpg` return `/images/weapon-grid/${weapon.granblueId}_${weapon.instanceElement}.jpg`
} }
return `/images/weapon-grid/${weapon.granblue_id}.jpg` return `/images/weapon-grid/${weapon.granblueId}.jpg`
} }
// Calculate uncap properties for the indicator // Calculate uncap properties for the indicator
@ -50,8 +50,8 @@
<DetailsHeader type="weapon" item={weapon} image={getWeaponImage(weapon)} /> <DetailsHeader type="weapon" item={weapon} image={getWeaponImage(weapon)} />
<DetailsContainer title="Level & Skill"> <DetailsContainer title="Level & Skill">
<DetailItem label="Max Level" value={weapon.max_level} /> <DetailItem label="Max Level" value={weapon.maxLevel} />
<DetailItem label="Max Skill Level" value={weapon.skill_level_cap} /> <DetailItem label="Max Skill Level" value={weapon.skillLevelCap} />
{#if weapon.uncap} {#if weapon.uncap}
<DetailItem label="Uncap"> <DetailItem label="Uncap">
<UncapIndicator <UncapIndicator
@ -68,24 +68,24 @@
</DetailsContainer> </DetailsContainer>
<DetailsContainer title="HP Stats"> <DetailsContainer title="HP Stats">
<DetailItem label="Base HP" value={weapon.hp?.min_hp} /> <DetailItem label="Base HP" value={weapon.hp?.minHp} />
<DetailItem label="Max HP" value={weapon.hp?.max_hp} /> <DetailItem label="Max HP" value={weapon.hp?.maxHp} />
{#if flb} {#if flb}
<DetailItem label="Max HP (FLB)" value={weapon.hp?.max_hp_flb} /> <DetailItem label="Max HP (FLB)" value={weapon.hp?.maxHpFlb} />
{/if} {/if}
{#if ulb} {#if ulb}
<DetailItem label="Max HP (ULB)" value={weapon.hp?.max_hp_ulb} /> <DetailItem label="Max HP (ULB)" value={weapon.hp?.maxHpUlb} />
{/if} {/if}
</DetailsContainer> </DetailsContainer>
<DetailsContainer title="Attack Stats"> <DetailsContainer title="Attack Stats">
<DetailItem label="Base Attack" value={weapon.atk?.min_atk} /> <DetailItem label="Base Attack" value={weapon.atk?.minAtk} />
<DetailItem label="Max Attack" value={weapon.atk?.max_atk} /> <DetailItem label="Max Attack" value={weapon.atk?.maxAtk} />
{#if flb} {#if flb}
<DetailItem label="Max Attack (FLB)" value={weapon.atk?.max_atk_flb} /> <DetailItem label="Max Attack (FLB)" value={weapon.atk?.maxAtkFlb} />
{/if} {/if}
{#if ulb} {#if ulb}
<DetailItem label="Max Attack (ULB)" value={weapon.atk?.max_atk_ulb} /> <DetailItem label="Max Attack (ULB)" value={weapon.atk?.maxAtkUlb} />
{/if} {/if}
</DetailsContainer> </DetailsContainer>