fix raid form saving + add IDs section

This commit is contained in:
Justin Edmund 2026-01-08 00:39:39 -08:00
parent 5bc1869715
commit 76ef2e575b
3 changed files with 48 additions and 28 deletions

View file

@ -45,7 +45,7 @@ export interface CreateRaidInput {
name_en: string
name_jp: string
slug: string
level: number
level?: number
element: number
group_id: string
enemy_id?: number

View file

@ -50,12 +50,12 @@
let isSaving = $state(false)
let saveError = $state<string | null>(null)
// Edit data state
// Edit data state - use undefined for nullable number fields to avoid validation issues
let editData = $state({
name_en: '',
name_jp: '',
slug: '',
level: 0,
level: undefined as number | undefined,
element: 0,
group_id: '',
enemy_id: undefined as number | undefined,
@ -70,7 +70,7 @@
name_en: raid.name.en || '',
name_jp: raid.name.ja || '',
slug: raid.slug || '',
level: raid.level ?? 0,
level: raid.level,
element: raid.element ?? 0,
group_id: raid.group?.id || '',
enemy_id: raid.enemy_id,
@ -104,6 +104,13 @@
editData.name_en.trim() !== '' && editData.slug.trim() !== '' && editData.group_id !== ''
)
// Helper to convert empty strings to undefined for number fields
function toNumberOrUndefined(value: number | string | undefined): number | undefined {
if (value === '' || value === undefined || value === null) return undefined
const num = typeof value === 'string' ? parseInt(value, 10) : value
return isNaN(num) ? undefined : num
}
// Save changes
async function handleSave() {
if (!canSave || !raid || !raidSlug) return
@ -116,12 +123,12 @@
name_en: editData.name_en,
name_jp: editData.name_jp,
slug: editData.slug,
level: editData.level,
level: toNumberOrUndefined(editData.level),
element: editData.element,
group_id: editData.group_id,
enemy_id: editData.enemy_id,
summon_id: editData.summon_id,
quest_id: editData.quest_id
enemy_id: toNumberOrUndefined(editData.enemy_id),
summon_id: toNumberOrUndefined(editData.summon_id),
quest_id: toNumberOrUndefined(editData.quest_id)
})
// Invalidate queries
@ -192,6 +199,16 @@
editable={true}
type="number"
/>
<DetailItem
label="Element"
bind:value={editData.element}
editable={true}
type="select"
options={elementOptions}
/>
</DetailsContainer>
<DetailsContainer title="IDs">
<DetailItem
label="Enemy ID"
bind:value={editData.enemy_id}
@ -210,13 +227,6 @@
editable={true}
type="number"
/>
<DetailItem
label="Element"
bind:value={editData.element}
editable={true}
type="select"
options={elementOptions}
/>
</DetailsContainer>
<DetailsContainer title="Classification">

View file

@ -37,12 +37,12 @@
let isSaving = $state(false)
let saveError = $state<string | null>(null)
// Edit data state
// Edit data state - use undefined for nullable number fields to avoid validation issues
let editData = $state({
name_en: '',
name_jp: '',
slug: '',
level: 0,
level: undefined as number | undefined,
element: 0,
group_id: '',
enemy_id: undefined as number | undefined,
@ -74,6 +74,13 @@
editData.name_en.trim() !== '' && editData.slug.trim() !== '' && editData.group_id !== ''
)
// Helper to convert empty strings to undefined for number fields
function toNumberOrUndefined(value: number | string | undefined): number | undefined {
if (value === '' || value === undefined || value === null) return undefined
const num = typeof value === 'string' ? parseInt(value, 10) : value
return isNaN(num) ? undefined : num
}
// Create raid
async function handleSave() {
if (!canSave) return
@ -86,12 +93,12 @@
name_en: editData.name_en,
name_jp: editData.name_jp,
slug: editData.slug,
level: editData.level,
level: toNumberOrUndefined(editData.level),
element: editData.element,
group_id: editData.group_id,
enemy_id: editData.enemy_id,
summon_id: editData.summon_id,
quest_id: editData.quest_id
enemy_id: toNumberOrUndefined(editData.enemy_id),
summon_id: toNumberOrUndefined(editData.summon_id),
quest_id: toNumberOrUndefined(editData.quest_id)
})
// Invalidate queries
@ -157,6 +164,16 @@
editable={true}
type="number"
/>
<DetailItem
label="Element"
bind:value={editData.element}
editable={true}
type="select"
options={elementOptions}
/>
</DetailsContainer>
<DetailsContainer title="IDs">
<DetailItem
label="Enemy ID"
bind:value={editData.enemy_id}
@ -175,13 +192,6 @@
editable={true}
type="number"
/>
<DetailItem
label="Element"
bind:value={editData.element}
editable={true}
type="select"
options={elementOptions}
/>
</DetailsContainer>
<DetailsContainer title="Classification">