simplify import pages, remove suggestion UI

This commit is contained in:
Justin Edmund 2026-01-04 00:16:22 -08:00
parent 5b62a0b62e
commit 0de64e3f44
3 changed files with 112 additions and 327 deletions

View file

@ -4,7 +4,7 @@
import PageMeta from '$lib/components/PageMeta.svelte'
import * as m from '$lib/paraglide/messages'
import { goto } from '$app/navigation'
import { entityAdapter, type CharacterSuggestions } from '$lib/api/adapters/entity.adapter'
import { entityAdapter, type ParsedCharacterData } from '$lib/api/adapters/entity.adapter'
import { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
import { getGameCdnCharacterImage, getPlaceholderImage } from '$lib/utils/images'
import {
@ -23,7 +23,6 @@
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
import Button from '$lib/components/ui/Button.svelte'
import Input from '$lib/components/ui/Input.svelte'
@ -37,7 +36,7 @@
wikiPage: string
status: 'loading' | 'success' | 'error'
granblueId?: string
suggestions?: CharacterSuggestions
parsedData?: ParsedCharacterData
wikiRaw?: string
error?: string
}
@ -55,7 +54,6 @@
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
let formDataByPage = $state<Record<string, any>>({})
let dismissedByPage = $state<Record<string, Set<string>>>({})
let savedEntities = $state<Set<string>>(new Set())
// Store wiki raw data per entity for sending with create request
@ -100,44 +98,44 @@
)
// Initialize empty form data for an entity
function createEmptyFormData(wikiPage: string, suggestions?: CharacterSuggestions) {
function createEmptyFormData(wikiPage: string, parsedData?: ParsedCharacterData) {
return {
name: suggestions?.nameEn ?? '',
nameJp: suggestions?.nameJp ?? '',
granblueId: suggestions?.granblueId ?? '',
characterId: suggestions?.characterId?.join(', ') ?? '',
rarity: suggestions?.rarity ?? 3,
element: suggestions?.element ?? 0,
race1: suggestions?.race1 ?? null,
race2: suggestions?.race2 ?? null,
gender: suggestions?.gender ?? 0,
proficiency1: suggestions?.proficiency1 ?? 0,
proficiency2: suggestions?.proficiency2 ?? 0,
season: suggestions?.season ?? (null as number | null),
series: suggestions?.series ?? ([] as number[]),
minHp: suggestions?.minHp ?? 0,
maxHp: suggestions?.maxHp ?? 0,
maxHpFlb: suggestions?.maxHpFlb ?? 0,
name: parsedData?.nameEn ?? '',
nameJp: parsedData?.nameJp ?? '',
granblueId: parsedData?.granblueId ?? '',
characterId: parsedData?.characterId?.join(', ') ?? '',
rarity: parsedData?.rarity ?? 3,
element: parsedData?.element ?? 0,
race1: parsedData?.race1 ?? null,
race2: parsedData?.race2 ?? null,
gender: parsedData?.gender ?? 0,
proficiency1: parsedData?.proficiency1 ?? 0,
proficiency2: parsedData?.proficiency2 ?? 0,
season: parsedData?.season ?? (null as number | null),
series: parsedData?.series ?? ([] as number[]),
minHp: parsedData?.minHp ?? 0,
maxHp: parsedData?.maxHp ?? 0,
maxHpFlb: parsedData?.maxHpFlb ?? 0,
maxHpUlb: 0,
minAtk: suggestions?.minAtk ?? 0,
maxAtk: suggestions?.maxAtk ?? 0,
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
minAtk: parsedData?.minAtk ?? 0,
maxAtk: parsedData?.maxAtk ?? 0,
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
maxAtkUlb: 0,
baseDa: 0,
baseTa: 0,
ougiRatio: 0,
ougiRatioFlb: 0,
flb: suggestions?.flb ?? false,
ulb: suggestions?.ulb ?? false,
flb: parsedData?.flb ?? false,
ulb: parsedData?.ulb ?? false,
transcendence: false,
special: false,
releaseDate: suggestions?.releaseDate ?? '',
flbDate: suggestions?.flbDate ?? '',
ulbDate: suggestions?.ulbDate ?? '',
releaseDate: parsedData?.releaseDate ?? '',
flbDate: parsedData?.flbDate ?? '',
ulbDate: parsedData?.ulbDate ?? '',
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
wikiJa: '',
gamewith: suggestions?.gamewith ?? '',
kamigame: suggestions?.kamigame ?? '',
gamewith: parsedData?.gamewith ?? '',
kamigame: parsedData?.kamigame ?? '',
nicknamesEn: [] as string[],
nicknamesJp: [] as string[]
}
@ -202,22 +200,20 @@
wikiPage: result.wikiPage,
status: result.status,
granblueId: result.granblueId,
suggestions: result.suggestions,
parsedData: result.parsedData,
wikiRaw: result.wikiRaw,
error: result.error
})
// Create form data for successful results
if (result.status === 'success') {
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
dismissedByPage[result.wikiPage] = new Set<string>()
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
}
})
entities = updatedEntities
// Trigger reactivity by reassigning
formDataByPage = { ...formDataByPage }
dismissedByPage = { ...dismissedByPage }
} catch (error) {
console.error('Batch preview error:', error)
fetchError = 'Failed to fetch wiki data. Please try again.'
@ -231,24 +227,6 @@
selectedWikiPage = wikiPage
}
// Accept a suggestion
function handleAcceptSuggestion(field: string, value: any) {
if (!selectedWikiPage || !formDataByPage[selectedWikiPage]) return
formDataByPage[selectedWikiPage][field] = value
formDataByPage = { ...formDataByPage }
}
// Dismiss a suggestion
function handleDismissSuggestion(field: string) {
if (!selectedWikiPage) return
const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()
dismissed.add(field)
dismissedByPage[selectedWikiPage] = dismissed
dismissedByPage = { ...dismissedByPage }
}
// Save current entity
async function saveCurrentEntity() {
if (!selectedWikiPage) return
@ -448,43 +426,29 @@
<p>Loading wiki data...</p>
</div>
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
{@const suggestions = selectedEntity.suggestions}
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
<section class="details">
<!-- Basic Info: Name fields needed for import (not in MetadataSection) -->
<DetailsContainer title="Basic Info">
<SuggestionDetailItem
<DetailItem
label="Name (EN)"
bind:value={formDataByPage[selectedWikiPage].name}
editable={true}
type="text"
placeholder="Character name"
suggestion={suggestions?.nameEn}
dismissedSuggestion={dismissed.has('name')}
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
onDismissSuggestion={() => handleDismissSuggestion('name')}
/>
<SuggestionDetailItem
<DetailItem
label="Name (JP)"
bind:value={formDataByPage[selectedWikiPage].nameJp}
editable={true}
type="text"
placeholder="キャラクター名"
suggestion={suggestions?.nameJp}
dismissedSuggestion={dismissed.has('nameJp')}
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
/>
<SuggestionDetailItem
<DetailItem
label="Granblue ID"
bind:value={formDataByPage[selectedWikiPage].granblueId}
editable={true}
type="text"
placeholder="3040001000"
suggestion={suggestions?.granblueId}
dismissedSuggestion={dismissed.has('granblueId')}
onAcceptSuggestion={() => handleAcceptSuggestion('granblueId', suggestions?.granblueId)}
onDismissSuggestion={() => handleDismissSuggestion('granblueId')}
/>
</DetailsContainer>
@ -492,40 +456,24 @@
character={emptyCharacter}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<CharacterUncapSection
character={emptyCharacter}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<CharacterTaxonomySection
character={emptyCharacter}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<CharacterStatsSection
character={emptyCharacter}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<DetailsContainer title="Nicknames">
@ -538,42 +486,29 @@
</DetailsContainer>
<DetailsContainer title="Dates">
<SuggestionDetailItem
<DetailItem
label="Release Date"
bind:value={formDataByPage[selectedWikiPage].releaseDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.releaseDate}
dismissedSuggestion={dismissed.has('releaseDate')}
onAcceptSuggestion={() =>
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
/>
{#if formDataByPage[selectedWikiPage].flb}
<SuggestionDetailItem
<DetailItem
label="FLB Date"
bind:value={formDataByPage[selectedWikiPage].flbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.flbDate}
dismissedSuggestion={dismissed.has('flbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
/>
{/if}
{#if formDataByPage[selectedWikiPage].ulb}
<SuggestionDetailItem
<DetailItem
label="ULB Date"
bind:value={formDataByPage[selectedWikiPage].ulbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.ulbDate}
dismissedSuggestion={dismissed.has('ulbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
/>
{/if}
</DetailsContainer>
@ -599,7 +534,7 @@
hasLinkButton={true}
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'character')}
/>
<SuggestionDetailItem
<DetailItem
label="Gamewith"
bind:value={formDataByPage[selectedWikiPage].gamewith}
editable={true}
@ -608,12 +543,8 @@
width="480px"
hasLinkButton={true}
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
suggestion={suggestions?.gamewith}
dismissedSuggestion={dismissed.has('gamewith')}
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
/>
<SuggestionDetailItem
<DetailItem
label="Kamigame"
bind:value={formDataByPage[selectedWikiPage].kamigame}
editable={true}
@ -622,10 +553,6 @@
width="480px"
hasLinkButton={true}
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'character')}
suggestion={suggestions?.kamigame}
dismissedSuggestion={dismissed.has('kamigame')}
onAcceptSuggestion={() => handleAcceptSuggestion('kamigame', suggestions?.kamigame)}
onDismissSuggestion={() => handleDismissSuggestion('kamigame')}
/>
</DetailsContainer>

View file

@ -4,7 +4,7 @@
import PageMeta from '$lib/components/PageMeta.svelte'
import * as m from '$lib/paraglide/messages'
import { goto } from '$app/navigation'
import { entityAdapter, type SummonSuggestions } from '$lib/api/adapters/entity.adapter'
import { entityAdapter, type ParsedSummonData } from '$lib/api/adapters/entity.adapter'
import { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
import { getGameCdnSummonImage, getPlaceholderImage } from '$lib/utils/images'
import {
@ -23,7 +23,6 @@
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
import Button from '$lib/components/ui/Button.svelte'
import Input from '$lib/components/ui/Input.svelte'
@ -37,7 +36,7 @@
wikiPage: string
status: 'loading' | 'success' | 'error'
granblueId?: string
suggestions?: SummonSuggestions
parsedData?: ParsedSummonData
error?: string
}
@ -54,7 +53,6 @@
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
let formDataByPage = $state<Record<string, any>>({})
let dismissedByPage = $state<Record<string, Set<string>>>({})
let savedEntities = $state<Set<string>>(new Set())
// Store wiki raw data per entity for sending with create request
@ -99,40 +97,40 @@
)
// Initialize empty form data for an entity
function createEmptyFormData(wikiPage: string, suggestions?: SummonSuggestions) {
function createEmptyFormData(wikiPage: string, parsedData?: ParsedSummonData) {
return {
name: suggestions?.nameEn ?? '',
nameJp: suggestions?.nameJp ?? '',
granblue_id: suggestions?.granblueId ?? '',
summonId: suggestions?.summonId ?? '',
rarity: suggestions?.rarity ?? 3,
element: suggestions?.element ?? 0,
name: parsedData?.nameEn ?? '',
nameJp: parsedData?.nameJp ?? '',
granblue_id: parsedData?.granblueId ?? '',
summonId: parsedData?.summonId ?? '',
rarity: parsedData?.rarity ?? 3,
element: parsedData?.element ?? 0,
series: '',
promotions: [] as number[],
minHp: suggestions?.minHp ?? 0,
maxHp: suggestions?.maxHp ?? 0,
maxHpFlb: suggestions?.maxHpFlb ?? 0,
maxHpUlb: suggestions?.maxHpUlb ?? 0,
minHp: parsedData?.minHp ?? 0,
maxHp: parsedData?.maxHp ?? 0,
maxHpFlb: parsedData?.maxHpFlb ?? 0,
maxHpUlb: parsedData?.maxHpUlb ?? 0,
maxHpTranscendence: 0,
minAtk: suggestions?.minAtk ?? 0,
maxAtk: suggestions?.maxAtk ?? 0,
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
maxAtkUlb: suggestions?.maxAtkUlb ?? 0,
minAtk: parsedData?.minAtk ?? 0,
maxAtk: parsedData?.maxAtk ?? 0,
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
maxAtkUlb: parsedData?.maxAtkUlb ?? 0,
maxAtkTranscendence: 0,
maxLevel: suggestions?.maxLevel ?? 100,
flb: suggestions?.flb ?? false,
ulb: suggestions?.ulb ?? false,
transcendence: suggestions?.transcendence ?? false,
subaura: suggestions?.subaura ?? false,
maxLevel: parsedData?.maxLevel ?? 100,
flb: parsedData?.flb ?? false,
ulb: parsedData?.ulb ?? false,
transcendence: parsedData?.transcendence ?? false,
subaura: parsedData?.subaura ?? false,
limit: false,
releaseDate: suggestions?.releaseDate ?? '',
flbDate: suggestions?.flbDate ?? '',
ulbDate: suggestions?.ulbDate ?? '',
releaseDate: parsedData?.releaseDate ?? '',
flbDate: parsedData?.flbDate ?? '',
ulbDate: parsedData?.ulbDate ?? '',
transcendenceDate: '',
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
wikiJa: '',
gamewith: suggestions?.gamewith ?? '',
kamigame: suggestions?.kamigame ?? '',
gamewith: parsedData?.gamewith ?? '',
kamigame: parsedData?.kamigame ?? '',
nicknamesEn: [] as string[],
nicknamesJp: [] as string[]
}
@ -197,21 +195,19 @@
wikiPage: result.wikiPage,
status: result.status,
granblueId: result.granblueId,
suggestions: result.suggestions,
parsedData: result.parsedData,
error: result.error
})
// Create form data for successful results
if (result.status === 'success') {
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
dismissedByPage[result.wikiPage] = new Set<string>()
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
}
})
entities = updatedEntities
// Trigger reactivity by reassigning
formDataByPage = { ...formDataByPage }
dismissedByPage = { ...dismissedByPage }
} catch (error) {
console.error('Batch preview error:', error)
fetchError = 'Failed to fetch wiki data. Please try again.'
@ -225,24 +221,6 @@
selectedWikiPage = wikiPage
}
// Accept a suggestion
function handleAcceptSuggestion(field: string, value: any) {
if (!selectedWikiPage || !formDataByPage[selectedWikiPage]) return
formDataByPage[selectedWikiPage][field] = value
formDataByPage = { ...formDataByPage }
}
// Dismiss a suggestion
function handleDismissSuggestion(field: string) {
if (!selectedWikiPage) return
const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()
dismissed.add(field)
dismissedByPage[selectedWikiPage] = dismissed
dismissedByPage = { ...dismissedByPage }
}
// Save current entity
async function saveCurrentEntity() {
if (!selectedWikiPage) return
@ -427,31 +405,21 @@
<p>Loading wiki data...</p>
</div>
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
{@const suggestions = selectedEntity.suggestions}
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
<section class="details">
<DetailsContainer title="Basic Info">
<SuggestionDetailItem
<DetailItem
label="Name (EN)"
bind:value={formDataByPage[selectedWikiPage].name}
editable={true}
type="text"
placeholder="Summon name"
suggestion={suggestions?.nameEn}
dismissedSuggestion={dismissed.has('name')}
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
onDismissSuggestion={() => handleDismissSuggestion('name')}
/>
<SuggestionDetailItem
<DetailItem
label="Name (JP)"
bind:value={formDataByPage[selectedWikiPage].nameJp}
editable={true}
type="text"
placeholder="召喚石名"
suggestion={suggestions?.nameJp}
dismissedSuggestion={dismissed.has('nameJp')}
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
/>
<DetailItem
label="Summon ID"
@ -467,40 +435,24 @@
summon={emptySummon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<SummonUncapSection
summon={emptySummon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<SummonTaxonomySection
summon={emptySummon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<SummonStatsSection
summon={emptySummon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<DetailsContainer title="Nicknames">
@ -513,42 +465,29 @@
</DetailsContainer>
<DetailsContainer title="Dates">
<SuggestionDetailItem
<DetailItem
label="Release Date"
bind:value={formDataByPage[selectedWikiPage].releaseDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.releaseDate}
dismissedSuggestion={dismissed.has('releaseDate')}
onAcceptSuggestion={() =>
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
/>
{#if formDataByPage[selectedWikiPage].flb}
<SuggestionDetailItem
<DetailItem
label="FLB Date"
bind:value={formDataByPage[selectedWikiPage].flbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.flbDate}
dismissedSuggestion={dismissed.has('flbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
/>
{/if}
{#if formDataByPage[selectedWikiPage].ulb}
<SuggestionDetailItem
<DetailItem
label="ULB Date"
bind:value={formDataByPage[selectedWikiPage].ulbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.ulbDate}
dismissedSuggestion={dismissed.has('ulbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
/>
{/if}
{#if formDataByPage[selectedWikiPage].transcendence}
@ -583,7 +522,7 @@
hasLinkButton={true}
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'summon')}
/>
<SuggestionDetailItem
<DetailItem
label="Gamewith"
bind:value={formDataByPage[selectedWikiPage].gamewith}
editable={true}
@ -592,12 +531,8 @@
width="480px"
hasLinkButton={true}
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
suggestion={suggestions?.gamewith}
dismissedSuggestion={dismissed.has('gamewith')}
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
/>
<SuggestionDetailItem
<DetailItem
label="Kamigame"
bind:value={formDataByPage[selectedWikiPage].kamigame}
editable={true}
@ -606,10 +541,6 @@
width="480px"
hasLinkButton={true}
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'summon')}
suggestion={suggestions?.kamigame}
dismissedSuggestion={dismissed.has('kamigame')}
onAcceptSuggestion={() => handleAcceptSuggestion('kamigame', suggestions?.kamigame)}
onDismissSuggestion={() => handleDismissSuggestion('kamigame')}
/>
</DetailsContainer>
</section>

View file

@ -4,7 +4,7 @@
import PageMeta from '$lib/components/PageMeta.svelte'
import * as m from '$lib/paraglide/messages'
import { goto } from '$app/navigation'
import { entityAdapter, type WeaponSuggestions } from '$lib/api/adapters/entity.adapter'
import { entityAdapter, type ParsedWeaponData } from '$lib/api/adapters/entity.adapter'
import { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
import { getGameCdnWeaponImage, getPlaceholderImage } from '$lib/utils/images'
import {
@ -25,7 +25,6 @@
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
import Button from '$lib/components/ui/Button.svelte'
import Input from '$lib/components/ui/Input.svelte'
@ -39,7 +38,7 @@
wikiPage: string
status: 'loading' | 'success' | 'error'
granblueId?: string
suggestions?: WeaponSuggestions
parsedData?: ParsedWeaponData
error?: string
}
@ -56,7 +55,6 @@
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
let formDataByPage = $state<Record<string, any>>({})
let dismissedByPage = $state<Record<string, Set<string>>>({})
let savedEntities = $state<Set<string>>(new Set())
// Store wiki raw data per entity for sending with create request
@ -99,46 +97,46 @@
)
// Initialize empty form data for an entity
function createEmptyFormData(wikiPage: string, suggestions?: WeaponSuggestions) {
function createEmptyFormData(wikiPage: string, parsedData?: ParsedWeaponData) {
return {
name: suggestions?.nameEn ?? '',
nameJp: suggestions?.nameJp ?? '',
granblue_id: suggestions?.granblueId ?? '',
rarity: suggestions?.rarity ?? 3,
element: suggestions?.element ?? 0,
proficiency: suggestions?.proficiency ?? 0,
series: suggestions?.series ?? '',
name: parsedData?.nameEn ?? '',
nameJp: parsedData?.nameJp ?? '',
granblue_id: parsedData?.granblueId ?? '',
rarity: parsedData?.rarity ?? 3,
element: parsedData?.element ?? 0,
proficiency: parsedData?.proficiency ?? 0,
series: parsedData?.series ?? '',
newSeries: 0,
promotions: [] as number[],
minHp: suggestions?.minHp ?? 0,
maxHp: suggestions?.maxHp ?? 0,
maxHpFlb: suggestions?.maxHpFlb ?? 0,
maxHpUlb: suggestions?.maxHpUlb ?? 0,
minAtk: suggestions?.minAtk ?? 0,
maxAtk: suggestions?.maxAtk ?? 0,
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
maxAtkUlb: suggestions?.maxAtkUlb ?? 0,
maxLevel: suggestions?.maxLevel ?? 100,
minHp: parsedData?.minHp ?? 0,
maxHp: parsedData?.maxHp ?? 0,
maxHpFlb: parsedData?.maxHpFlb ?? 0,
maxHpUlb: parsedData?.maxHpUlb ?? 0,
minAtk: parsedData?.minAtk ?? 0,
maxAtk: parsedData?.maxAtk ?? 0,
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
maxAtkUlb: parsedData?.maxAtkUlb ?? 0,
maxLevel: parsedData?.maxLevel ?? 100,
maxSkillLevel: 10,
maxAwakeningLevel: 0,
flb: suggestions?.flb ?? false,
ulb: suggestions?.ulb ?? false,
transcendence: suggestions?.transcendence ?? false,
flb: parsedData?.flb ?? false,
ulb: parsedData?.ulb ?? false,
transcendence: parsedData?.transcendence ?? false,
extraPrerequisite: '' as number | '',
extra: false,
limit: false,
ax: false,
releaseDate: suggestions?.releaseDate ?? '',
flbDate: suggestions?.flbDate ?? '',
ulbDate: suggestions?.ulbDate ?? '',
releaseDate: parsedData?.releaseDate ?? '',
flbDate: parsedData?.flbDate ?? '',
ulbDate: parsedData?.ulbDate ?? '',
transcendenceDate: '',
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
wikiJa: '',
gamewith: suggestions?.gamewith ?? '',
kamigame: suggestions?.kamigame ?? '',
gamewith: parsedData?.gamewith ?? '',
kamigame: parsedData?.kamigame ?? '',
nicknamesEn: [] as string[],
nicknamesJp: [] as string[],
recruits: suggestions?.recruits ?? null,
recruits: parsedData?.recruits ?? null,
// Forge chain
forgedFrom: null as string | null,
forgeOrder: null as number | null
@ -204,21 +202,19 @@
wikiPage: result.wikiPage,
status: result.status,
granblueId: result.granblueId,
suggestions: result.suggestions,
parsedData: result.parsedData,
error: result.error
})
// Create form data for successful results
if (result.status === 'success') {
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
dismissedByPage[result.wikiPage] = new Set<string>()
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
}
})
entities = updatedEntities
// Trigger reactivity by reassigning
formDataByPage = { ...formDataByPage }
dismissedByPage = { ...dismissedByPage }
} catch (error) {
console.error('Batch preview error:', error)
fetchError = 'Failed to fetch wiki data. Please try again.'
@ -232,24 +228,6 @@
selectedWikiPage = wikiPage
}
// Accept a suggestion
function handleAcceptSuggestion(field: string, value: any) {
if (!selectedWikiPage || !formDataByPage[selectedWikiPage]) return
formDataByPage[selectedWikiPage][field] = value
formDataByPage = { ...formDataByPage }
}
// Dismiss a suggestion
function handleDismissSuggestion(field: string) {
if (!selectedWikiPage) return
const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()
dismissed.add(field)
dismissedByPage[selectedWikiPage] = dismissed
dismissedByPage = { ...dismissedByPage }
}
// Save current entity
async function saveCurrentEntity() {
if (!selectedWikiPage) return
@ -441,31 +419,21 @@
<p>Loading wiki data...</p>
</div>
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
{@const suggestions = selectedEntity.suggestions}
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
<section class="details">
<DetailsContainer title="Basic Info">
<SuggestionDetailItem
<DetailItem
label="Name (EN)"
bind:value={formDataByPage[selectedWikiPage].name}
editable={true}
type="text"
placeholder="Weapon name"
suggestion={suggestions?.nameEn}
dismissedSuggestion={dismissed.has('name')}
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
onDismissSuggestion={() => handleDismissSuggestion('name')}
/>
<SuggestionDetailItem
<DetailItem
label="Name (JP)"
bind:value={formDataByPage[selectedWikiPage].nameJp}
editable={true}
type="text"
placeholder="武器名"
suggestion={suggestions?.nameJp}
dismissedSuggestion={dismissed.has('nameJp')}
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
/>
</DetailsContainer>
@ -473,50 +441,30 @@
weapon={emptyWeapon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<WeaponUncapSection
weapon={emptyWeapon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<WeaponTaxonomySection
weapon={emptyWeapon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<WeaponStatsSection
weapon={emptyWeapon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<WeaponGachaSection
weapon={emptyWeapon}
editMode={true}
bind:editData={formDataByPage[selectedWikiPage]}
{suggestions}
dismissedSuggestions={dismissed}
onAcceptSuggestion={handleAcceptSuggestion}
onDismissSuggestion={handleDismissSuggestion}
/>
<WeaponForgeSection
@ -535,42 +483,29 @@
</DetailsContainer>
<DetailsContainer title="Dates">
<SuggestionDetailItem
<DetailItem
label="Release Date"
bind:value={formDataByPage[selectedWikiPage].releaseDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.releaseDate}
dismissedSuggestion={dismissed.has('releaseDate')}
onAcceptSuggestion={() =>
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
/>
{#if formDataByPage[selectedWikiPage].flb}
<SuggestionDetailItem
<DetailItem
label="FLB Date"
bind:value={formDataByPage[selectedWikiPage].flbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.flbDate}
dismissedSuggestion={dismissed.has('flbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
/>
{/if}
{#if formDataByPage[selectedWikiPage].ulb}
<SuggestionDetailItem
<DetailItem
label="ULB Date"
bind:value={formDataByPage[selectedWikiPage].ulbDate}
editable={true}
type="text"
placeholder="YYYY-MM-DD"
suggestion={suggestions?.ulbDate}
dismissedSuggestion={dismissed.has('ulbDate')}
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
/>
{/if}
{#if formDataByPage[selectedWikiPage].transcendence}
@ -605,7 +540,7 @@
hasLinkButton={true}
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'weapon')}
/>
<SuggestionDetailItem
<DetailItem
label="Gamewith"
bind:value={formDataByPage[selectedWikiPage].gamewith}
editable={true}
@ -614,12 +549,8 @@
width="480px"
hasLinkButton={true}
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
suggestion={suggestions?.gamewith}
dismissedSuggestion={dismissed.has('gamewith')}
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
/>
<SuggestionDetailItem
<DetailItem
label="Kamigame"
bind:value={formDataByPage[selectedWikiPage].kamigame}
editable={true}
@ -628,10 +559,6 @@
width="480px"
hasLinkButton={true}
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'weapon', formDataByPage[selectedWikiPage].rarity)}
suggestion={suggestions?.kamigame}
dismissedSuggestion={dismissed.has('kamigame')}
onAcceptSuggestion={() => handleAcceptSuggestion('kamigame', suggestions?.kamigame)}
onDismissSuggestion={() => handleDismissSuggestion('kamigame')}
/>
</DetailsContainer>
</section>