diff --git a/src/lib/types/api/raid.ts b/src/lib/types/api/raid.ts index a0208e17..7c885a1a 100644 --- a/src/lib/types/api/raid.ts +++ b/src/lib/types/api/raid.ts @@ -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 diff --git a/src/routes/(app)/database/raids/[slug]/edit/+page.svelte b/src/routes/(app)/database/raids/[slug]/edit/+page.svelte index 30ab6798..38f13040 100644 --- a/src/routes/(app)/database/raids/[slug]/edit/+page.svelte +++ b/src/routes/(app)/database/raids/[slug]/edit/+page.svelte @@ -50,12 +50,12 @@ let isSaving = $state(false) let saveError = $state(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" /> + + + + - diff --git a/src/routes/(app)/database/raids/new/+page.svelte b/src/routes/(app)/database/raids/new/+page.svelte index bcfec874..15b0f5dd 100644 --- a/src/routes/(app)/database/raids/new/+page.svelte +++ b/src/routes/(app)/database/raids/new/+page.svelte @@ -37,12 +37,12 @@ let isSaving = $state(false) let saveError = $state(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" /> + + + + -