simplify import pages, remove suggestion UI
This commit is contained in:
parent
5b62a0b62e
commit
0de64e3f44
3 changed files with 112 additions and 327 deletions
|
|
@ -4,7 +4,7 @@
|
||||||
import PageMeta from '$lib/components/PageMeta.svelte'
|
import PageMeta from '$lib/components/PageMeta.svelte'
|
||||||
import * as m from '$lib/paraglide/messages'
|
import * as m from '$lib/paraglide/messages'
|
||||||
import { goto } from '$app/navigation'
|
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 { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
|
||||||
import { getGameCdnCharacterImage, getPlaceholderImage } from '$lib/utils/images'
|
import { getGameCdnCharacterImage, getPlaceholderImage } from '$lib/utils/images'
|
||||||
import {
|
import {
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
||||||
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
||||||
import DetailItem from '$lib/components/ui/DetailItem.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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
|
||||||
import Button from '$lib/components/ui/Button.svelte'
|
import Button from '$lib/components/ui/Button.svelte'
|
||||||
import Input from '$lib/components/ui/Input.svelte'
|
import Input from '$lib/components/ui/Input.svelte'
|
||||||
|
|
@ -37,7 +36,7 @@
|
||||||
wikiPage: string
|
wikiPage: string
|
||||||
status: 'loading' | 'success' | 'error'
|
status: 'loading' | 'success' | 'error'
|
||||||
granblueId?: string
|
granblueId?: string
|
||||||
suggestions?: CharacterSuggestions
|
parsedData?: ParsedCharacterData
|
||||||
wikiRaw?: string
|
wikiRaw?: string
|
||||||
error?: string
|
error?: string
|
||||||
}
|
}
|
||||||
|
|
@ -55,7 +54,6 @@
|
||||||
|
|
||||||
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
||||||
let formDataByPage = $state<Record<string, any>>({})
|
let formDataByPage = $state<Record<string, any>>({})
|
||||||
let dismissedByPage = $state<Record<string, Set<string>>>({})
|
|
||||||
let savedEntities = $state<Set<string>>(new Set())
|
let savedEntities = $state<Set<string>>(new Set())
|
||||||
|
|
||||||
// Store wiki raw data per entity for sending with create request
|
// Store wiki raw data per entity for sending with create request
|
||||||
|
|
@ -100,44 +98,44 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
// Initialize empty form data for an entity
|
// Initialize empty form data for an entity
|
||||||
function createEmptyFormData(wikiPage: string, suggestions?: CharacterSuggestions) {
|
function createEmptyFormData(wikiPage: string, parsedData?: ParsedCharacterData) {
|
||||||
return {
|
return {
|
||||||
name: suggestions?.nameEn ?? '',
|
name: parsedData?.nameEn ?? '',
|
||||||
nameJp: suggestions?.nameJp ?? '',
|
nameJp: parsedData?.nameJp ?? '',
|
||||||
granblueId: suggestions?.granblueId ?? '',
|
granblueId: parsedData?.granblueId ?? '',
|
||||||
characterId: suggestions?.characterId?.join(', ') ?? '',
|
characterId: parsedData?.characterId?.join(', ') ?? '',
|
||||||
rarity: suggestions?.rarity ?? 3,
|
rarity: parsedData?.rarity ?? 3,
|
||||||
element: suggestions?.element ?? 0,
|
element: parsedData?.element ?? 0,
|
||||||
race1: suggestions?.race1 ?? null,
|
race1: parsedData?.race1 ?? null,
|
||||||
race2: suggestions?.race2 ?? null,
|
race2: parsedData?.race2 ?? null,
|
||||||
gender: suggestions?.gender ?? 0,
|
gender: parsedData?.gender ?? 0,
|
||||||
proficiency1: suggestions?.proficiency1 ?? 0,
|
proficiency1: parsedData?.proficiency1 ?? 0,
|
||||||
proficiency2: suggestions?.proficiency2 ?? 0,
|
proficiency2: parsedData?.proficiency2 ?? 0,
|
||||||
season: suggestions?.season ?? (null as number | null),
|
season: parsedData?.season ?? (null as number | null),
|
||||||
series: suggestions?.series ?? ([] as number[]),
|
series: parsedData?.series ?? ([] as number[]),
|
||||||
minHp: suggestions?.minHp ?? 0,
|
minHp: parsedData?.minHp ?? 0,
|
||||||
maxHp: suggestions?.maxHp ?? 0,
|
maxHp: parsedData?.maxHp ?? 0,
|
||||||
maxHpFlb: suggestions?.maxHpFlb ?? 0,
|
maxHpFlb: parsedData?.maxHpFlb ?? 0,
|
||||||
maxHpUlb: 0,
|
maxHpUlb: 0,
|
||||||
minAtk: suggestions?.minAtk ?? 0,
|
minAtk: parsedData?.minAtk ?? 0,
|
||||||
maxAtk: suggestions?.maxAtk ?? 0,
|
maxAtk: parsedData?.maxAtk ?? 0,
|
||||||
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
|
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
|
||||||
maxAtkUlb: 0,
|
maxAtkUlb: 0,
|
||||||
baseDa: 0,
|
baseDa: 0,
|
||||||
baseTa: 0,
|
baseTa: 0,
|
||||||
ougiRatio: 0,
|
ougiRatio: 0,
|
||||||
ougiRatioFlb: 0,
|
ougiRatioFlb: 0,
|
||||||
flb: suggestions?.flb ?? false,
|
flb: parsedData?.flb ?? false,
|
||||||
ulb: suggestions?.ulb ?? false,
|
ulb: parsedData?.ulb ?? false,
|
||||||
transcendence: false,
|
transcendence: false,
|
||||||
special: false,
|
special: false,
|
||||||
releaseDate: suggestions?.releaseDate ?? '',
|
releaseDate: parsedData?.releaseDate ?? '',
|
||||||
flbDate: suggestions?.flbDate ?? '',
|
flbDate: parsedData?.flbDate ?? '',
|
||||||
ulbDate: suggestions?.ulbDate ?? '',
|
ulbDate: parsedData?.ulbDate ?? '',
|
||||||
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
||||||
wikiJa: '',
|
wikiJa: '',
|
||||||
gamewith: suggestions?.gamewith ?? '',
|
gamewith: parsedData?.gamewith ?? '',
|
||||||
kamigame: suggestions?.kamigame ?? '',
|
kamigame: parsedData?.kamigame ?? '',
|
||||||
nicknamesEn: [] as string[],
|
nicknamesEn: [] as string[],
|
||||||
nicknamesJp: [] as string[]
|
nicknamesJp: [] as string[]
|
||||||
}
|
}
|
||||||
|
|
@ -202,22 +200,20 @@
|
||||||
wikiPage: result.wikiPage,
|
wikiPage: result.wikiPage,
|
||||||
status: result.status,
|
status: result.status,
|
||||||
granblueId: result.granblueId,
|
granblueId: result.granblueId,
|
||||||
suggestions: result.suggestions,
|
parsedData: result.parsedData,
|
||||||
wikiRaw: result.wikiRaw,
|
wikiRaw: result.wikiRaw,
|
||||||
error: result.error
|
error: result.error
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create form data for successful results
|
// Create form data for successful results
|
||||||
if (result.status === 'success') {
|
if (result.status === 'success') {
|
||||||
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
|
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
|
||||||
dismissedByPage[result.wikiPage] = new Set<string>()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
entities = updatedEntities
|
entities = updatedEntities
|
||||||
|
|
||||||
// Trigger reactivity by reassigning
|
// Trigger reactivity by reassigning
|
||||||
formDataByPage = { ...formDataByPage }
|
formDataByPage = { ...formDataByPage }
|
||||||
dismissedByPage = { ...dismissedByPage }
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Batch preview error:', error)
|
console.error('Batch preview error:', error)
|
||||||
fetchError = 'Failed to fetch wiki data. Please try again.'
|
fetchError = 'Failed to fetch wiki data. Please try again.'
|
||||||
|
|
@ -231,24 +227,6 @@
|
||||||
selectedWikiPage = wikiPage
|
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
|
// Save current entity
|
||||||
async function saveCurrentEntity() {
|
async function saveCurrentEntity() {
|
||||||
if (!selectedWikiPage) return
|
if (!selectedWikiPage) return
|
||||||
|
|
@ -448,43 +426,29 @@
|
||||||
<p>Loading wiki data...</p>
|
<p>Loading wiki data...</p>
|
||||||
</div>
|
</div>
|
||||||
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<!-- Basic Info: Name fields needed for import (not in MetadataSection) -->
|
<!-- Basic Info: Name fields needed for import (not in MetadataSection) -->
|
||||||
<DetailsContainer title="Basic Info">
|
<DetailsContainer title="Basic Info">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].name}
|
bind:value={formDataByPage[selectedWikiPage].name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Character name"
|
placeholder="Character name"
|
||||||
suggestion={suggestions?.nameEn}
|
|
||||||
dismissedSuggestion={dismissed.has('name')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('name')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="キャラクター名"
|
placeholder="キャラクター名"
|
||||||
suggestion={suggestions?.nameJp}
|
|
||||||
dismissedSuggestion={dismissed.has('nameJp')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Granblue ID"
|
label="Granblue ID"
|
||||||
bind:value={formDataByPage[selectedWikiPage].granblueId}
|
bind:value={formDataByPage[selectedWikiPage].granblueId}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="3040001000"
|
placeholder="3040001000"
|
||||||
suggestion={suggestions?.granblueId}
|
|
||||||
dismissedSuggestion={dismissed.has('granblueId')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('granblueId', suggestions?.granblueId)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('granblueId')}
|
|
||||||
/>
|
/>
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
|
|
@ -492,40 +456,24 @@
|
||||||
character={emptyCharacter}
|
character={emptyCharacter}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<CharacterUncapSection
|
<CharacterUncapSection
|
||||||
character={emptyCharacter}
|
character={emptyCharacter}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<CharacterTaxonomySection
|
<CharacterTaxonomySection
|
||||||
character={emptyCharacter}
|
character={emptyCharacter}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<CharacterStatsSection
|
<CharacterStatsSection
|
||||||
character={emptyCharacter}
|
character={emptyCharacter}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<DetailsContainer title="Nicknames">
|
<DetailsContainer title="Nicknames">
|
||||||
|
|
@ -538,42 +486,29 @@
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
<DetailsContainer title="Dates">
|
<DetailsContainer title="Dates">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Release Date"
|
label="Release Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.releaseDate}
|
|
||||||
dismissedSuggestion={dismissed.has('releaseDate')}
|
|
||||||
onAcceptSuggestion={() =>
|
|
||||||
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
|
|
||||||
/>
|
/>
|
||||||
{#if formDataByPage[selectedWikiPage].flb}
|
{#if formDataByPage[selectedWikiPage].flb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="FLB Date"
|
label="FLB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.flbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('flbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if formDataByPage[selectedWikiPage].ulb}
|
{#if formDataByPage[selectedWikiPage].ulb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="ULB Date"
|
label="ULB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.ulbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('ulbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
@ -599,7 +534,7 @@
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'character')}
|
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'character')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Gamewith"
|
label="Gamewith"
|
||||||
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -608,12 +543,8 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
||||||
suggestion={suggestions?.gamewith}
|
|
||||||
dismissedSuggestion={dismissed.has('gamewith')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Kamigame"
|
label="Kamigame"
|
||||||
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -622,10 +553,6 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'character')}
|
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'character')}
|
||||||
suggestion={suggestions?.kamigame}
|
|
||||||
dismissedSuggestion={dismissed.has('kamigame')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('kamigame', suggestions?.kamigame)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('kamigame')}
|
|
||||||
/>
|
/>
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
import PageMeta from '$lib/components/PageMeta.svelte'
|
import PageMeta from '$lib/components/PageMeta.svelte'
|
||||||
import * as m from '$lib/paraglide/messages'
|
import * as m from '$lib/paraglide/messages'
|
||||||
import { goto } from '$app/navigation'
|
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 { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
|
||||||
import { getGameCdnSummonImage, getPlaceholderImage } from '$lib/utils/images'
|
import { getGameCdnSummonImage, getPlaceholderImage } from '$lib/utils/images'
|
||||||
import {
|
import {
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
||||||
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
||||||
import DetailItem from '$lib/components/ui/DetailItem.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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
|
||||||
import Button from '$lib/components/ui/Button.svelte'
|
import Button from '$lib/components/ui/Button.svelte'
|
||||||
import Input from '$lib/components/ui/Input.svelte'
|
import Input from '$lib/components/ui/Input.svelte'
|
||||||
|
|
@ -37,7 +36,7 @@
|
||||||
wikiPage: string
|
wikiPage: string
|
||||||
status: 'loading' | 'success' | 'error'
|
status: 'loading' | 'success' | 'error'
|
||||||
granblueId?: string
|
granblueId?: string
|
||||||
suggestions?: SummonSuggestions
|
parsedData?: ParsedSummonData
|
||||||
error?: string
|
error?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -54,7 +53,6 @@
|
||||||
|
|
||||||
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
||||||
let formDataByPage = $state<Record<string, any>>({})
|
let formDataByPage = $state<Record<string, any>>({})
|
||||||
let dismissedByPage = $state<Record<string, Set<string>>>({})
|
|
||||||
let savedEntities = $state<Set<string>>(new Set())
|
let savedEntities = $state<Set<string>>(new Set())
|
||||||
|
|
||||||
// Store wiki raw data per entity for sending with create request
|
// Store wiki raw data per entity for sending with create request
|
||||||
|
|
@ -99,40 +97,40 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
// Initialize empty form data for an entity
|
// Initialize empty form data for an entity
|
||||||
function createEmptyFormData(wikiPage: string, suggestions?: SummonSuggestions) {
|
function createEmptyFormData(wikiPage: string, parsedData?: ParsedSummonData) {
|
||||||
return {
|
return {
|
||||||
name: suggestions?.nameEn ?? '',
|
name: parsedData?.nameEn ?? '',
|
||||||
nameJp: suggestions?.nameJp ?? '',
|
nameJp: parsedData?.nameJp ?? '',
|
||||||
granblue_id: suggestions?.granblueId ?? '',
|
granblue_id: parsedData?.granblueId ?? '',
|
||||||
summonId: suggestions?.summonId ?? '',
|
summonId: parsedData?.summonId ?? '',
|
||||||
rarity: suggestions?.rarity ?? 3,
|
rarity: parsedData?.rarity ?? 3,
|
||||||
element: suggestions?.element ?? 0,
|
element: parsedData?.element ?? 0,
|
||||||
series: '',
|
series: '',
|
||||||
promotions: [] as number[],
|
promotions: [] as number[],
|
||||||
minHp: suggestions?.minHp ?? 0,
|
minHp: parsedData?.minHp ?? 0,
|
||||||
maxHp: suggestions?.maxHp ?? 0,
|
maxHp: parsedData?.maxHp ?? 0,
|
||||||
maxHpFlb: suggestions?.maxHpFlb ?? 0,
|
maxHpFlb: parsedData?.maxHpFlb ?? 0,
|
||||||
maxHpUlb: suggestions?.maxHpUlb ?? 0,
|
maxHpUlb: parsedData?.maxHpUlb ?? 0,
|
||||||
maxHpTranscendence: 0,
|
maxHpTranscendence: 0,
|
||||||
minAtk: suggestions?.minAtk ?? 0,
|
minAtk: parsedData?.minAtk ?? 0,
|
||||||
maxAtk: suggestions?.maxAtk ?? 0,
|
maxAtk: parsedData?.maxAtk ?? 0,
|
||||||
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
|
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
|
||||||
maxAtkUlb: suggestions?.maxAtkUlb ?? 0,
|
maxAtkUlb: parsedData?.maxAtkUlb ?? 0,
|
||||||
maxAtkTranscendence: 0,
|
maxAtkTranscendence: 0,
|
||||||
maxLevel: suggestions?.maxLevel ?? 100,
|
maxLevel: parsedData?.maxLevel ?? 100,
|
||||||
flb: suggestions?.flb ?? false,
|
flb: parsedData?.flb ?? false,
|
||||||
ulb: suggestions?.ulb ?? false,
|
ulb: parsedData?.ulb ?? false,
|
||||||
transcendence: suggestions?.transcendence ?? false,
|
transcendence: parsedData?.transcendence ?? false,
|
||||||
subaura: suggestions?.subaura ?? false,
|
subaura: parsedData?.subaura ?? false,
|
||||||
limit: false,
|
limit: false,
|
||||||
releaseDate: suggestions?.releaseDate ?? '',
|
releaseDate: parsedData?.releaseDate ?? '',
|
||||||
flbDate: suggestions?.flbDate ?? '',
|
flbDate: parsedData?.flbDate ?? '',
|
||||||
ulbDate: suggestions?.ulbDate ?? '',
|
ulbDate: parsedData?.ulbDate ?? '',
|
||||||
transcendenceDate: '',
|
transcendenceDate: '',
|
||||||
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
||||||
wikiJa: '',
|
wikiJa: '',
|
||||||
gamewith: suggestions?.gamewith ?? '',
|
gamewith: parsedData?.gamewith ?? '',
|
||||||
kamigame: suggestions?.kamigame ?? '',
|
kamigame: parsedData?.kamigame ?? '',
|
||||||
nicknamesEn: [] as string[],
|
nicknamesEn: [] as string[],
|
||||||
nicknamesJp: [] as string[]
|
nicknamesJp: [] as string[]
|
||||||
}
|
}
|
||||||
|
|
@ -197,21 +195,19 @@
|
||||||
wikiPage: result.wikiPage,
|
wikiPage: result.wikiPage,
|
||||||
status: result.status,
|
status: result.status,
|
||||||
granblueId: result.granblueId,
|
granblueId: result.granblueId,
|
||||||
suggestions: result.suggestions,
|
parsedData: result.parsedData,
|
||||||
error: result.error
|
error: result.error
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create form data for successful results
|
// Create form data for successful results
|
||||||
if (result.status === 'success') {
|
if (result.status === 'success') {
|
||||||
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
|
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
|
||||||
dismissedByPage[result.wikiPage] = new Set<string>()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
entities = updatedEntities
|
entities = updatedEntities
|
||||||
|
|
||||||
// Trigger reactivity by reassigning
|
// Trigger reactivity by reassigning
|
||||||
formDataByPage = { ...formDataByPage }
|
formDataByPage = { ...formDataByPage }
|
||||||
dismissedByPage = { ...dismissedByPage }
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Batch preview error:', error)
|
console.error('Batch preview error:', error)
|
||||||
fetchError = 'Failed to fetch wiki data. Please try again.'
|
fetchError = 'Failed to fetch wiki data. Please try again.'
|
||||||
|
|
@ -225,24 +221,6 @@
|
||||||
selectedWikiPage = wikiPage
|
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
|
// Save current entity
|
||||||
async function saveCurrentEntity() {
|
async function saveCurrentEntity() {
|
||||||
if (!selectedWikiPage) return
|
if (!selectedWikiPage) return
|
||||||
|
|
@ -427,31 +405,21 @@
|
||||||
<p>Loading wiki data...</p>
|
<p>Loading wiki data...</p>
|
||||||
</div>
|
</div>
|
||||||
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<DetailsContainer title="Basic Info">
|
<DetailsContainer title="Basic Info">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].name}
|
bind:value={formDataByPage[selectedWikiPage].name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Summon name"
|
placeholder="Summon name"
|
||||||
suggestion={suggestions?.nameEn}
|
|
||||||
dismissedSuggestion={dismissed.has('name')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('name')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="召喚石名"
|
placeholder="召喚石名"
|
||||||
suggestion={suggestions?.nameJp}
|
|
||||||
dismissedSuggestion={dismissed.has('nameJp')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
|
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<DetailItem
|
||||||
label="Summon ID"
|
label="Summon ID"
|
||||||
|
|
@ -467,40 +435,24 @@
|
||||||
summon={emptySummon}
|
summon={emptySummon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SummonUncapSection
|
<SummonUncapSection
|
||||||
summon={emptySummon}
|
summon={emptySummon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SummonTaxonomySection
|
<SummonTaxonomySection
|
||||||
summon={emptySummon}
|
summon={emptySummon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SummonStatsSection
|
<SummonStatsSection
|
||||||
summon={emptySummon}
|
summon={emptySummon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<DetailsContainer title="Nicknames">
|
<DetailsContainer title="Nicknames">
|
||||||
|
|
@ -513,42 +465,29 @@
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
<DetailsContainer title="Dates">
|
<DetailsContainer title="Dates">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Release Date"
|
label="Release Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.releaseDate}
|
|
||||||
dismissedSuggestion={dismissed.has('releaseDate')}
|
|
||||||
onAcceptSuggestion={() =>
|
|
||||||
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
|
|
||||||
/>
|
/>
|
||||||
{#if formDataByPage[selectedWikiPage].flb}
|
{#if formDataByPage[selectedWikiPage].flb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="FLB Date"
|
label="FLB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.flbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('flbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if formDataByPage[selectedWikiPage].ulb}
|
{#if formDataByPage[selectedWikiPage].ulb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="ULB Date"
|
label="ULB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.ulbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('ulbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if formDataByPage[selectedWikiPage].transcendence}
|
{#if formDataByPage[selectedWikiPage].transcendence}
|
||||||
|
|
@ -583,7 +522,7 @@
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'summon')}
|
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'summon')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Gamewith"
|
label="Gamewith"
|
||||||
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -592,12 +531,8 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
||||||
suggestion={suggestions?.gamewith}
|
|
||||||
dismissedSuggestion={dismissed.has('gamewith')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Kamigame"
|
label="Kamigame"
|
||||||
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -606,10 +541,6 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'summon')}
|
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'summon')}
|
||||||
suggestion={suggestions?.kamigame}
|
|
||||||
dismissedSuggestion={dismissed.has('kamigame')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('kamigame', suggestions?.kamigame)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('kamigame')}
|
|
||||||
/>
|
/>
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
import PageMeta from '$lib/components/PageMeta.svelte'
|
import PageMeta from '$lib/components/PageMeta.svelte'
|
||||||
import * as m from '$lib/paraglide/messages'
|
import * as m from '$lib/paraglide/messages'
|
||||||
import { goto } from '$app/navigation'
|
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 { fetchWikiPages, buildWikiDataMap } from '$lib/api/wiki'
|
||||||
import { getGameCdnWeaponImage, getPlaceholderImage } from '$lib/utils/images'
|
import { getGameCdnWeaponImage, getPlaceholderImage } from '$lib/utils/images'
|
||||||
import {
|
import {
|
||||||
|
|
@ -25,7 +25,6 @@
|
||||||
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
import type { EntityTab } from '$lib/features/database/import/TabbedEntitySelector.svelte'
|
||||||
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
||||||
import DetailItem from '$lib/components/ui/DetailItem.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 SidebarHeader from '$lib/components/ui/SidebarHeader.svelte'
|
||||||
import Button from '$lib/components/ui/Button.svelte'
|
import Button from '$lib/components/ui/Button.svelte'
|
||||||
import Input from '$lib/components/ui/Input.svelte'
|
import Input from '$lib/components/ui/Input.svelte'
|
||||||
|
|
@ -39,7 +38,7 @@
|
||||||
wikiPage: string
|
wikiPage: string
|
||||||
status: 'loading' | 'success' | 'error'
|
status: 'loading' | 'success' | 'error'
|
||||||
granblueId?: string
|
granblueId?: string
|
||||||
suggestions?: WeaponSuggestions
|
parsedData?: ParsedWeaponData
|
||||||
error?: string
|
error?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -56,7 +55,6 @@
|
||||||
|
|
||||||
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
// Form data per entity (keyed by wikiPage) - using Record for proper reactivity
|
||||||
let formDataByPage = $state<Record<string, any>>({})
|
let formDataByPage = $state<Record<string, any>>({})
|
||||||
let dismissedByPage = $state<Record<string, Set<string>>>({})
|
|
||||||
let savedEntities = $state<Set<string>>(new Set())
|
let savedEntities = $state<Set<string>>(new Set())
|
||||||
|
|
||||||
// Store wiki raw data per entity for sending with create request
|
// Store wiki raw data per entity for sending with create request
|
||||||
|
|
@ -99,46 +97,46 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
// Initialize empty form data for an entity
|
// Initialize empty form data for an entity
|
||||||
function createEmptyFormData(wikiPage: string, suggestions?: WeaponSuggestions) {
|
function createEmptyFormData(wikiPage: string, parsedData?: ParsedWeaponData) {
|
||||||
return {
|
return {
|
||||||
name: suggestions?.nameEn ?? '',
|
name: parsedData?.nameEn ?? '',
|
||||||
nameJp: suggestions?.nameJp ?? '',
|
nameJp: parsedData?.nameJp ?? '',
|
||||||
granblue_id: suggestions?.granblueId ?? '',
|
granblue_id: parsedData?.granblueId ?? '',
|
||||||
rarity: suggestions?.rarity ?? 3,
|
rarity: parsedData?.rarity ?? 3,
|
||||||
element: suggestions?.element ?? 0,
|
element: parsedData?.element ?? 0,
|
||||||
proficiency: suggestions?.proficiency ?? 0,
|
proficiency: parsedData?.proficiency ?? 0,
|
||||||
series: suggestions?.series ?? '',
|
series: parsedData?.series ?? '',
|
||||||
newSeries: 0,
|
newSeries: 0,
|
||||||
promotions: [] as number[],
|
promotions: [] as number[],
|
||||||
minHp: suggestions?.minHp ?? 0,
|
minHp: parsedData?.minHp ?? 0,
|
||||||
maxHp: suggestions?.maxHp ?? 0,
|
maxHp: parsedData?.maxHp ?? 0,
|
||||||
maxHpFlb: suggestions?.maxHpFlb ?? 0,
|
maxHpFlb: parsedData?.maxHpFlb ?? 0,
|
||||||
maxHpUlb: suggestions?.maxHpUlb ?? 0,
|
maxHpUlb: parsedData?.maxHpUlb ?? 0,
|
||||||
minAtk: suggestions?.minAtk ?? 0,
|
minAtk: parsedData?.minAtk ?? 0,
|
||||||
maxAtk: suggestions?.maxAtk ?? 0,
|
maxAtk: parsedData?.maxAtk ?? 0,
|
||||||
maxAtkFlb: suggestions?.maxAtkFlb ?? 0,
|
maxAtkFlb: parsedData?.maxAtkFlb ?? 0,
|
||||||
maxAtkUlb: suggestions?.maxAtkUlb ?? 0,
|
maxAtkUlb: parsedData?.maxAtkUlb ?? 0,
|
||||||
maxLevel: suggestions?.maxLevel ?? 100,
|
maxLevel: parsedData?.maxLevel ?? 100,
|
||||||
maxSkillLevel: 10,
|
maxSkillLevel: 10,
|
||||||
maxAwakeningLevel: 0,
|
maxAwakeningLevel: 0,
|
||||||
flb: suggestions?.flb ?? false,
|
flb: parsedData?.flb ?? false,
|
||||||
ulb: suggestions?.ulb ?? false,
|
ulb: parsedData?.ulb ?? false,
|
||||||
transcendence: suggestions?.transcendence ?? false,
|
transcendence: parsedData?.transcendence ?? false,
|
||||||
extraPrerequisite: '' as number | '',
|
extraPrerequisite: '' as number | '',
|
||||||
extra: false,
|
extra: false,
|
||||||
limit: false,
|
limit: false,
|
||||||
ax: false,
|
ax: false,
|
||||||
releaseDate: suggestions?.releaseDate ?? '',
|
releaseDate: parsedData?.releaseDate ?? '',
|
||||||
flbDate: suggestions?.flbDate ?? '',
|
flbDate: parsedData?.flbDate ?? '',
|
||||||
ulbDate: suggestions?.ulbDate ?? '',
|
ulbDate: parsedData?.ulbDate ?? '',
|
||||||
transcendenceDate: '',
|
transcendenceDate: '',
|
||||||
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
wikiEn: wikiPage ? wikiPage.replace(/ /g, '_') : '',
|
||||||
wikiJa: '',
|
wikiJa: '',
|
||||||
gamewith: suggestions?.gamewith ?? '',
|
gamewith: parsedData?.gamewith ?? '',
|
||||||
kamigame: suggestions?.kamigame ?? '',
|
kamigame: parsedData?.kamigame ?? '',
|
||||||
nicknamesEn: [] as string[],
|
nicknamesEn: [] as string[],
|
||||||
nicknamesJp: [] as string[],
|
nicknamesJp: [] as string[],
|
||||||
recruits: suggestions?.recruits ?? null,
|
recruits: parsedData?.recruits ?? null,
|
||||||
// Forge chain
|
// Forge chain
|
||||||
forgedFrom: null as string | null,
|
forgedFrom: null as string | null,
|
||||||
forgeOrder: null as number | null
|
forgeOrder: null as number | null
|
||||||
|
|
@ -204,21 +202,19 @@
|
||||||
wikiPage: result.wikiPage,
|
wikiPage: result.wikiPage,
|
||||||
status: result.status,
|
status: result.status,
|
||||||
granblueId: result.granblueId,
|
granblueId: result.granblueId,
|
||||||
suggestions: result.suggestions,
|
parsedData: result.parsedData,
|
||||||
error: result.error
|
error: result.error
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create form data for successful results
|
// Create form data for successful results
|
||||||
if (result.status === 'success') {
|
if (result.status === 'success') {
|
||||||
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.suggestions)
|
formDataByPage[result.wikiPage] = createEmptyFormData(result.wikiPage, result.parsedData)
|
||||||
dismissedByPage[result.wikiPage] = new Set<string>()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
entities = updatedEntities
|
entities = updatedEntities
|
||||||
|
|
||||||
// Trigger reactivity by reassigning
|
// Trigger reactivity by reassigning
|
||||||
formDataByPage = { ...formDataByPage }
|
formDataByPage = { ...formDataByPage }
|
||||||
dismissedByPage = { ...dismissedByPage }
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Batch preview error:', error)
|
console.error('Batch preview error:', error)
|
||||||
fetchError = 'Failed to fetch wiki data. Please try again.'
|
fetchError = 'Failed to fetch wiki data. Please try again.'
|
||||||
|
|
@ -232,24 +228,6 @@
|
||||||
selectedWikiPage = wikiPage
|
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
|
// Save current entity
|
||||||
async function saveCurrentEntity() {
|
async function saveCurrentEntity() {
|
||||||
if (!selectedWikiPage) return
|
if (!selectedWikiPage) return
|
||||||
|
|
@ -441,31 +419,21 @@
|
||||||
<p>Loading wiki data...</p>
|
<p>Loading wiki data...</p>
|
||||||
</div>
|
</div>
|
||||||
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
{:else if selectedWikiPage && formDataByPage[selectedWikiPage]}
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<DetailsContainer title="Basic Info">
|
<DetailsContainer title="Basic Info">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].name}
|
bind:value={formDataByPage[selectedWikiPage].name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Weapon name"
|
placeholder="Weapon name"
|
||||||
suggestion={suggestions?.nameEn}
|
|
||||||
dismissedSuggestion={dismissed.has('name')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('name', suggestions?.nameEn)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('name')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
bind:value={formDataByPage[selectedWikiPage].nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="武器名"
|
placeholder="武器名"
|
||||||
suggestion={suggestions?.nameJp}
|
|
||||||
dismissedSuggestion={dismissed.has('nameJp')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('nameJp', suggestions?.nameJp)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('nameJp')}
|
|
||||||
/>
|
/>
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
|
|
@ -473,50 +441,30 @@
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<WeaponUncapSection
|
<WeaponUncapSection
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<WeaponTaxonomySection
|
<WeaponTaxonomySection
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<WeaponStatsSection
|
<WeaponStatsSection
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<WeaponGachaSection
|
<WeaponGachaSection
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
bind:editData={formDataByPage[selectedWikiPage]}
|
bind:editData={formDataByPage[selectedWikiPage]}
|
||||||
{suggestions}
|
|
||||||
dismissedSuggestions={dismissed}
|
|
||||||
onAcceptSuggestion={handleAcceptSuggestion}
|
|
||||||
onDismissSuggestion={handleDismissSuggestion}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<WeaponForgeSection
|
<WeaponForgeSection
|
||||||
|
|
@ -535,42 +483,29 @@
|
||||||
</DetailsContainer>
|
</DetailsContainer>
|
||||||
|
|
||||||
<DetailsContainer title="Dates">
|
<DetailsContainer title="Dates">
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Release Date"
|
label="Release Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
bind:value={formDataByPage[selectedWikiPage].releaseDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.releaseDate}
|
|
||||||
dismissedSuggestion={dismissed.has('releaseDate')}
|
|
||||||
onAcceptSuggestion={() =>
|
|
||||||
handleAcceptSuggestion('releaseDate', suggestions?.releaseDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('releaseDate')}
|
|
||||||
/>
|
/>
|
||||||
{#if formDataByPage[selectedWikiPage].flb}
|
{#if formDataByPage[selectedWikiPage].flb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="FLB Date"
|
label="FLB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
bind:value={formDataByPage[selectedWikiPage].flbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.flbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('flbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('flbDate', suggestions?.flbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('flbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if formDataByPage[selectedWikiPage].ulb}
|
{#if formDataByPage[selectedWikiPage].ulb}
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="ULB Date"
|
label="ULB Date"
|
||||||
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
bind:value={formDataByPage[selectedWikiPage].ulbDate}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
suggestion={suggestions?.ulbDate}
|
|
||||||
dismissedSuggestion={dismissed.has('ulbDate')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('ulbDate', suggestions?.ulbDate)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('ulbDate')}
|
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if formDataByPage[selectedWikiPage].transcendence}
|
{#if formDataByPage[selectedWikiPage].transcendence}
|
||||||
|
|
@ -605,7 +540,7 @@
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'weapon')}
|
linkUrl={buildWikiJaUrl(formDataByPage[selectedWikiPage].wikiJa, 'weapon')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Gamewith"
|
label="Gamewith"
|
||||||
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
bind:value={formDataByPage[selectedWikiPage].gamewith}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -614,12 +549,8 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
linkUrl={buildGamewithUrl(formDataByPage[selectedWikiPage].gamewith)}
|
||||||
suggestion={suggestions?.gamewith}
|
|
||||||
dismissedSuggestion={dismissed.has('gamewith')}
|
|
||||||
onAcceptSuggestion={() => handleAcceptSuggestion('gamewith', suggestions?.gamewith)}
|
|
||||||
onDismissSuggestion={() => handleDismissSuggestion('gamewith')}
|
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<DetailItem
|
||||||
label="Kamigame"
|
label="Kamigame"
|
||||||
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
bind:value={formDataByPage[selectedWikiPage].kamigame}
|
||||||
editable={true}
|
editable={true}
|
||||||
|
|
@ -628,10 +559,6 @@
|
||||||
width="480px"
|
width="480px"
|
||||||
hasLinkButton={true}
|
hasLinkButton={true}
|
||||||
linkUrl={buildKamigameUrl(formDataByPage[selectedWikiPage].kamigame, 'weapon', formDataByPage[selectedWikiPage].rarity)}
|
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>
|
</DetailsContainer>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue