diff --git a/src/routes/(app)/database/series/+page.svelte b/src/routes/(app)/database/series/+page.svelte deleted file mode 100644 index e233afa9..00000000 --- a/src/routes/(app)/database/series/+page.svelte +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - -
-
- - - {#if activeQuery.isPending} -
Loading {activeType} series...
- {:else if activeQuery.error} -
Failed to load {activeType} series
- {:else if sortedData.length > 0} -
- - - - - - - - {#if hasFlags} - - {/if} - - - - {#each sortedData as series (series.id)} - - - - - - {#if hasFlags && 'extra' in series} - - {/if} - - {/each} - -
OrderName (EN)Name (JA)SlugFlags
{series.order}{series.name.en}{series.name.ja}{series.slug} - {#if series.extra}Extra{/if} - {#if series.elementChangeable}Element{/if} - {#if series.hasWeaponKeys}Keys{/if} - {#if series.hasAwakening}Awaken{/if} - {#if series.hasAxSkills}AX{/if} -
-
- {:else} -
No {activeType} series found
- {/if} -
-
- - diff --git a/src/routes/(app)/database/series/weapons/[slug]/+page.server.ts b/src/routes/(app)/database/series/weapons/[slug]/+page.server.ts new file mode 100644 index 00000000..6f9dd75f --- /dev/null +++ b/src/routes/(app)/database/series/weapons/[slug]/+page.server.ts @@ -0,0 +1,28 @@ +import type { PageServerLoad } from './$types' +import { entityAdapter } from '$lib/api/adapters/entity.adapter' +import { error } from '@sveltejs/kit' + +export const load: PageServerLoad = async ({ params, parent }) => { + const parentData = await parent() + + try { + const series = await entityAdapter.getWeaponSeries(params.slug) + + if (!series) { + throw error(404, 'Weapon series not found') + } + + return { + series, + role: parentData.role + } + } catch (err) { + console.error('Failed to load weapon series:', err) + + if (err instanceof Error && 'status' in err && err.status === 404) { + throw error(404, 'Weapon series not found') + } + + throw error(500, 'Failed to load weapon series') + } +} diff --git a/src/routes/(app)/database/series/weapons/[slug]/+page.svelte b/src/routes/(app)/database/series/weapons/[slug]/+page.svelte new file mode 100644 index 00000000..2cb0c6cf --- /dev/null +++ b/src/routes/(app)/database/series/weapons/[slug]/+page.svelte @@ -0,0 +1,110 @@ + + + + + + +
+ + {#snippet rightAction()} + {#if canEdit && editUrl} + + {/if} + {/snippet} + + + {#if series} +
+ + + + + + + + + + + + + + + + {#if series.weaponCount !== undefined} + + + + {/if} +
+ {:else} +
+

Series Not Found

+

The weapon series you're looking for could not be found.

+ +
+ {/if} +
+ + diff --git a/src/routes/(app)/database/series/weapons/[slug]/edit/+page.server.ts b/src/routes/(app)/database/series/weapons/[slug]/edit/+page.server.ts new file mode 100644 index 00000000..92e1ca84 --- /dev/null +++ b/src/routes/(app)/database/series/weapons/[slug]/edit/+page.server.ts @@ -0,0 +1,33 @@ +import type { PageServerLoad } from './$types' +import { entityAdapter } from '$lib/api/adapters/entity.adapter' +import { error, redirect } from '@sveltejs/kit' + +export const load: PageServerLoad = async ({ params, parent }) => { + const parentData = await parent() + + // Role check - must be editor level (>= 7) to edit + if (!parentData.role || parentData.role < 7) { + throw redirect(303, `/database/series/weapons/${params.slug}`) + } + + try { + const series = await entityAdapter.getWeaponSeries(params.slug) + + if (!series) { + throw error(404, 'Weapon series not found') + } + + return { + series, + role: parentData.role + } + } catch (err) { + console.error('Failed to load weapon series:', err) + + if (err instanceof Error && 'status' in err && err.status === 404) { + throw error(404, 'Weapon series not found') + } + + throw error(500, 'Failed to load weapon series') + } +} diff --git a/src/routes/(app)/database/series/weapons/[slug]/edit/+page.svelte b/src/routes/(app)/database/series/weapons/[slug]/edit/+page.svelte new file mode 100644 index 00000000..ba9ecb33 --- /dev/null +++ b/src/routes/(app)/database/series/weapons/[slug]/edit/+page.svelte @@ -0,0 +1,252 @@ + + + + + + +
+ + {#snippet rightAction()} + + {/snippet} + + + {#if series} +
+ {#if saveError} +
{saveError}
+ {/if} + + + + + + + + + + + + + + + +
+ {:else} +
+

Series Not Found

+

The weapon series you're looking for could not be found.

+ +
+ {/if} +
+ + diff --git a/src/routes/(app)/database/weapons/+page.svelte b/src/routes/(app)/database/weapons/+page.svelte index 2e6b05a2..99996067 100644 --- a/src/routes/(app)/database/weapons/+page.svelte +++ b/src/routes/(app)/database/weapons/+page.svelte @@ -4,6 +4,7 @@ import PageMeta from '$lib/components/PageMeta.svelte' import * as m from '$lib/paraglide/messages' import { goto } from '$app/navigation' + import { page } from '$app/stores' import { createQuery } from '@tanstack/svelte-query' import { entityQueries } from '$lib/api/queries/entity.queries' import DatabaseGridWithProvider from '$lib/components/database/DatabaseGridWithProvider.svelte' @@ -17,8 +18,19 @@ import LastUpdatedCell from '$lib/components/database/cells/LastUpdatedCell.svelte' import { getRarityLabel } from '$lib/utils/rarity' - // View mode state - let viewMode = $state<'weapons' | 'series'>('weapons') + // View mode state - read initial value from URL + const initialView = $page.url.searchParams.get('view') + let viewMode = $state<'weapons' | 'series'>(initialView === 'series' ? 'series' : 'weapons') + + // Sync viewMode changes to URL + $effect(() => { + const currentView = $page.url.searchParams.get('view') + if (viewMode === 'series' && currentView !== 'series') { + goto('?view=series', { replaceState: true, noScroll: true }) + } else if (viewMode === 'weapons' && currentView === 'series') { + goto('/database/weapons', { replaceState: true, noScroll: true }) + } + }) // Query for weapon series const weaponSeriesQuery = createQuery(() => entityQueries.weaponSeriesList()) @@ -30,8 +42,8 @@ }) // Navigate to series detail - function handleSeriesClick(seriesId: string) { - goto(`/database/series/${seriesId}`) + function handleSeriesClick(slug: string) { + goto(`/database/series/weapons/${slug}`) } // Column configuration for weapons @@ -130,7 +142,7 @@ {#each sortedSeries as series (series.id)} - handleSeriesClick(series.id)} class="clickable"> + handleSeriesClick(series.slug)} class="clickable"> {series.order} {series.name.en} @@ -188,8 +200,7 @@ .controls { display: flex; align-items: center; - padding: spacing.$unit; - border-bottom: 1px solid #e5e5e5; + padding: spacing.$unit-2x; gap: spacing.$unit; } @@ -216,7 +227,7 @@ th, td { - padding: spacing.$unit spacing.$unit-2x; + padding: spacing.$unit-2x spacing.$unit-2x; text-align: left; border-bottom: 1px solid #e5e5e5; } @@ -262,7 +273,7 @@ } .series-name { - font-weight: typography.$bold; + font-weight: typography.$normal; } .no-flags {