Merge remote-tracking branch 'origin/svelte-main' into feature/max-exorcism-level
This commit is contained in:
commit
99b4bbe331
7 changed files with 105 additions and 102 deletions
|
|
@ -78,19 +78,27 @@
|
||||||
|
|
||||||
<DetailsContainer title="Metadata">
|
<DetailsContainer title="Metadata">
|
||||||
{#if editMode}
|
{#if editMode}
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={editData.name}
|
bind:value={editData.name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="English name"
|
placeholder="English name"
|
||||||
|
suggestion={suggestions?.nameEn}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('name')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('name', suggestions?.nameEn)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('name')}
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={editData.nameJp}
|
bind:value={editData.nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="日本語名"
|
placeholder="日本語名"
|
||||||
|
suggestion={suggestions?.nameJp}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('nameJp')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('nameJp', suggestions?.nameJp)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('nameJp')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<SuggestionDetailItem
|
||||||
label="Rarity"
|
label="Rarity"
|
||||||
|
|
@ -103,12 +111,16 @@
|
||||||
onAcceptSuggestion={() => onAcceptSuggestion?.('rarity', suggestions?.rarity)}
|
onAcceptSuggestion={() => onAcceptSuggestion?.('rarity', suggestions?.rarity)}
|
||||||
onDismissSuggestion={() => onDismissSuggestion?.('rarity')}
|
onDismissSuggestion={() => onDismissSuggestion?.('rarity')}
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Granblue ID"
|
label="Granblue ID"
|
||||||
bind:value={editData.granblueId}
|
bind:value={editData.granblueId}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Granblue ID"
|
placeholder="Granblue ID"
|
||||||
|
suggestion={suggestions?.granblueId}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('granblueId')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('granblueId', suggestions?.granblueId)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('granblueId')}
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<DetailItem
|
||||||
label="Character ID"
|
label="Character ID"
|
||||||
|
|
|
||||||
|
|
@ -34,19 +34,27 @@
|
||||||
|
|
||||||
<DetailsContainer title="Metadata">
|
<DetailsContainer title="Metadata">
|
||||||
{#if editMode}
|
{#if editMode}
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={editData.name}
|
bind:value={editData.name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="English name"
|
placeholder="English name"
|
||||||
|
suggestion={suggestions?.nameEn}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('name')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('name', suggestions?.nameEn)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('name')}
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={editData.nameJp}
|
bind:value={editData.nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="日本語名"
|
placeholder="日本語名"
|
||||||
|
suggestion={suggestions?.nameJp}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('nameJp')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('nameJp', suggestions?.nameJp)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('nameJp')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<SuggestionDetailItem
|
||||||
label="Rarity"
|
label="Rarity"
|
||||||
|
|
@ -65,6 +73,14 @@
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
/>
|
/>
|
||||||
|
<DetailItem
|
||||||
|
label="Summon ID"
|
||||||
|
sublabel="Internal game identifier (if known)"
|
||||||
|
bind:value={editData.summonId}
|
||||||
|
editable={true}
|
||||||
|
type="text"
|
||||||
|
placeholder="Optional"
|
||||||
|
/>
|
||||||
{:else}
|
{:else}
|
||||||
<DetailItem label="Name (EN)" value={summon.name?.en || '—'} />
|
<DetailItem label="Name (EN)" value={summon.name?.en || '—'} />
|
||||||
<DetailItem label="Name (JP)" value={summon.name?.ja || '—'} />
|
<DetailItem label="Name (JP)" value={summon.name?.ja || '—'} />
|
||||||
|
|
|
||||||
|
|
@ -34,19 +34,27 @@
|
||||||
|
|
||||||
<DetailsContainer title="Metadata">
|
<DetailsContainer title="Metadata">
|
||||||
{#if editMode}
|
{#if editMode}
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (EN)"
|
label="Name (EN)"
|
||||||
bind:value={editData.name}
|
bind:value={editData.name}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="English name"
|
placeholder="English name"
|
||||||
|
suggestion={suggestions?.nameEn}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('name')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('name', suggestions?.nameEn)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('name')}
|
||||||
/>
|
/>
|
||||||
<DetailItem
|
<SuggestionDetailItem
|
||||||
label="Name (JP)"
|
label="Name (JP)"
|
||||||
bind:value={editData.nameJp}
|
bind:value={editData.nameJp}
|
||||||
editable={true}
|
editable={true}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="日本語名"
|
placeholder="日本語名"
|
||||||
|
suggestion={suggestions?.nameJp}
|
||||||
|
dismissedSuggestion={dismissedSuggestions?.has('nameJp')}
|
||||||
|
onAcceptSuggestion={() => onAcceptSuggestion?.('nameJp', suggestions?.nameJp)}
|
||||||
|
onDismissSuggestion={() => onDismissSuggestion?.('nameJp')}
|
||||||
/>
|
/>
|
||||||
<SuggestionDetailItem
|
<SuggestionDetailItem
|
||||||
label="Rarity"
|
label="Rarity"
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,14 @@ export function getRarityLabel(rarity: number): string {
|
||||||
return RARITY_LABELS[rarity] || '—'
|
return RARITY_LABELS[rarity] || '—'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get rarity prefix for URL generation (e.g., "SSR", "SR", "R")
|
||||||
|
* Returns empty string for unknown rarity values
|
||||||
|
*/
|
||||||
|
export function getRarityPrefix(rarity: number): string {
|
||||||
|
return RARITY_LABELS[rarity] || ''
|
||||||
|
}
|
||||||
|
|
||||||
export function getRarityOptions() {
|
export function getRarityOptions() {
|
||||||
return Object.entries(RARITY_LABELS).map(([value, label]) => ({
|
return Object.entries(RARITY_LABELS).map(([value, label]) => ({
|
||||||
value: Number(value),
|
value: Number(value),
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
buildGamewithUrl,
|
buildGamewithUrl,
|
||||||
buildKamigameUrl
|
buildKamigameUrl
|
||||||
} from '$lib/utils/external-links'
|
} from '$lib/utils/external-links'
|
||||||
|
import { getRarityPrefix } from '$lib/utils/rarity'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import CharacterUncapSection from '$lib/features/database/characters/sections/CharacterUncapSection.svelte'
|
import CharacterUncapSection from '$lib/features/database/characters/sections/CharacterUncapSection.svelte'
|
||||||
|
|
@ -85,6 +86,23 @@
|
||||||
// Get selected entity data
|
// Get selected entity data
|
||||||
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
||||||
|
|
||||||
|
// Auto-generate wiki URLs when Name (JP) or Rarity changes
|
||||||
|
$effect(() => {
|
||||||
|
if (!selectedWikiPage) return
|
||||||
|
const formData = formDataByPage[selectedWikiPage]
|
||||||
|
if (!formData) return
|
||||||
|
|
||||||
|
const nameJp = formData.nameJp
|
||||||
|
const rarity = formData.rarity
|
||||||
|
|
||||||
|
if (nameJp) {
|
||||||
|
// Auto-generate wikiJa: "Name (JP) (SSR)"
|
||||||
|
formData.wikiJa = `${nameJp} (${getRarityPrefix(rarity)})`
|
||||||
|
// Auto-generate kamigame: "Name (JP)" for characters (no rarity prefix)
|
||||||
|
formData.kamigame = nameJp
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Entity tabs for TabbedEntitySelector
|
// Entity tabs for TabbedEntitySelector
|
||||||
const entityTabs = $derived<EntityTab[]>(
|
const entityTabs = $derived<EntityTab[]>(
|
||||||
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
||||||
|
|
@ -451,43 +469,6 @@
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
{@const suggestions = selectedEntity.suggestions}
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<!-- Basic Info: Name fields needed for import (not in MetadataSection) -->
|
|
||||||
<DetailsContainer title="Basic Info">
|
|
||||||
<SuggestionDetailItem
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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>
|
|
||||||
|
|
||||||
<CharacterMetadataSection
|
<CharacterMetadataSection
|
||||||
character={emptyCharacter}
|
character={emptyCharacter}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
buildGamewithUrl,
|
buildGamewithUrl,
|
||||||
buildKamigameUrl
|
buildKamigameUrl
|
||||||
} from '$lib/utils/external-links'
|
} from '$lib/utils/external-links'
|
||||||
|
import { getRarityPrefix } from '$lib/utils/rarity'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import SummonUncapSection from '$lib/features/database/summons/sections/SummonUncapSection.svelte'
|
import SummonUncapSection from '$lib/features/database/summons/sections/SummonUncapSection.svelte'
|
||||||
|
|
@ -84,6 +85,23 @@
|
||||||
// Get selected entity data
|
// Get selected entity data
|
||||||
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
||||||
|
|
||||||
|
// Auto-generate wiki URLs when Name (JP) or Rarity changes
|
||||||
|
$effect(() => {
|
||||||
|
if (!selectedWikiPage) return
|
||||||
|
const formData = formDataByPage[selectedWikiPage]
|
||||||
|
if (!formData) return
|
||||||
|
|
||||||
|
const nameJp = formData.nameJp
|
||||||
|
const rarity = formData.rarity
|
||||||
|
|
||||||
|
if (nameJp) {
|
||||||
|
// Auto-generate wikiJa: "Name (JP) (SSR)"
|
||||||
|
formData.wikiJa = `${nameJp} (${getRarityPrefix(rarity)})`
|
||||||
|
// Auto-generate kamigame: "SSRName (JP)" for summons
|
||||||
|
formData.kamigame = `${getRarityPrefix(rarity)}${nameJp}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Entity tabs for TabbedEntitySelector
|
// Entity tabs for TabbedEntitySelector
|
||||||
const entityTabs = $derived<EntityTab[]>(
|
const entityTabs = $derived<EntityTab[]>(
|
||||||
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
||||||
|
|
@ -430,39 +448,6 @@
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
{@const suggestions = selectedEntity.suggestions}
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<DetailsContainer title="Basic Info">
|
|
||||||
<SuggestionDetailItem
|
|
||||||
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
|
|
||||||
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"
|
|
||||||
sublabel="Internal game identifier (if known)"
|
|
||||||
bind:value={formDataByPage[selectedWikiPage].summonId}
|
|
||||||
editable={true}
|
|
||||||
type="text"
|
|
||||||
placeholder="Optional"
|
|
||||||
/>
|
|
||||||
</DetailsContainer>
|
|
||||||
|
|
||||||
<SummonMetadataSection
|
<SummonMetadataSection
|
||||||
summon={emptySummon}
|
summon={emptySummon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
buildGamewithUrl,
|
buildGamewithUrl,
|
||||||
buildKamigameUrl
|
buildKamigameUrl
|
||||||
} from '$lib/utils/external-links'
|
} from '$lib/utils/external-links'
|
||||||
|
import { getRarityPrefix } from '$lib/utils/rarity'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import WeaponUncapSection from '$lib/features/database/weapons/sections/WeaponUncapSection.svelte'
|
import WeaponUncapSection from '$lib/features/database/weapons/sections/WeaponUncapSection.svelte'
|
||||||
|
|
@ -84,6 +85,23 @@
|
||||||
// Get selected entity data
|
// Get selected entity data
|
||||||
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
const selectedEntity = $derived(selectedWikiPage ? entities.get(selectedWikiPage) : null)
|
||||||
|
|
||||||
|
// Auto-generate wiki URLs when Name (JP) or Rarity changes
|
||||||
|
$effect(() => {
|
||||||
|
if (!selectedWikiPage) return
|
||||||
|
const formData = formDataByPage[selectedWikiPage]
|
||||||
|
if (!formData) return
|
||||||
|
|
||||||
|
const nameJp = formData.nameJp
|
||||||
|
const rarity = formData.rarity
|
||||||
|
|
||||||
|
if (nameJp) {
|
||||||
|
// Auto-generate wikiJa: "Name (JP) (SSR)"
|
||||||
|
formData.wikiJa = `${nameJp} (${getRarityPrefix(rarity)})`
|
||||||
|
// Auto-generate kamigame: "SSRName (JP)" for weapons
|
||||||
|
formData.kamigame = `${getRarityPrefix(rarity)}${nameJp}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Entity tabs for TabbedEntitySelector
|
// Entity tabs for TabbedEntitySelector
|
||||||
const entityTabs = $derived<EntityTab[]>(
|
const entityTabs = $derived<EntityTab[]>(
|
||||||
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
Array.from(entities.entries()).map(([wikiPage, entity]) => ({
|
||||||
|
|
@ -446,31 +464,6 @@
|
||||||
{@const suggestions = selectedEntity.suggestions}
|
{@const suggestions = selectedEntity.suggestions}
|
||||||
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
{@const dismissed = dismissedByPage[selectedWikiPage] ?? new Set<string>()}
|
||||||
<section class="details">
|
<section class="details">
|
||||||
<DetailsContainer title="Basic Info">
|
|
||||||
<SuggestionDetailItem
|
|
||||||
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
|
|
||||||
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>
|
|
||||||
|
|
||||||
<WeaponMetadataSection
|
<WeaponMetadataSection
|
||||||
weapon={emptyWeapon}
|
weapon={emptyWeapon}
|
||||||
editMode={true}
|
editMode={true}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue