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}
-
-
-
-
- | Order |
- Name (EN) |
- Name (JA) |
- Slug |
- {#if hasFlags}
- Flags |
- {/if}
-
-
-
- {#each sortedData as series (series.id)}
-
- | {series.order} |
- {series.name.en} |
- {series.name.ja} |
- {series.slug} |
- {#if hasFlags && 'extra' in series}
-
- {#if series.extra}{/if}
- {#if series.elementChangeable}Element{/if}
- {#if series.hasWeaponKeys}Keys{/if}
- {#if series.hasAwakening}Awaken{/if}
- {#if series.hasAxSkills}AX{/if}
- |
- {/if}
-
- {/each}
-
-
-
- {: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 @@