Bundle of small UI/UX fixes plus a build hygiene tweak.
* List pagination — Home (`/`) and `/authors/[id]` silently capped at
the backend default of 50 with no UI to advance. New reusable
`Pager.svelte` (Prev/Next + numbered with ellipsis), URL-synced
`?page=N`, and filter/search/sort reset to page 1 so users aren't
stranded on an out-of-range page. Count label now shows a range
("Showing 51–100 of 237").
* Stale page title — Pages without a `<svelte:head><title>` left the
document title at whatever the last manga / author / collection page
set it to. Move static-route titles into a route-id → title map in
the root layout and invert every dynamic title to brand-first
(`Mangalord | {X}`) for consistency.
* Admin filter bar — `/admin/mangas` search input had `flex: 1` and
ballooned across the row, shoving the sync-state select + Search
button to the far right. Cap at 24rem, vertical-align the row, and
promote the previously aria-only "Sync state" label to visible text.
* Build hygiene — `backend/target` had grown to 68 GiB. Cleaned and
added `[profile.dev] debug = "line-tables-only"` (and `[profile.test]`
too) to cut future dev builds by ~50–70% while keeping line numbers
in backtraces.
Also: configure vitest to resolve Svelte's browser entry so
`@testing-library/svelte` can mount components in jsdom — needed for
the new `Pager.svelte.test.ts`.
Bump 0.48.0 -> 0.49.1.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { error } from '@sveltejs/kit';
|
|
import { ApiError } from '$lib/api/client';
|
|
import { getAuthor, listAuthorMangas } from '$lib/api/authors';
|
|
import type { PageLoad } from './$types';
|
|
|
|
export const ssr = false;
|
|
|
|
const PAGE_SIZE = 50;
|
|
|
|
export const load: PageLoad = async ({ params, url }) => {
|
|
const pageParam = Number(url.searchParams.get('page') ?? '1');
|
|
const currentPage =
|
|
Number.isFinite(pageParam) && pageParam >= 1 ? Math.floor(pageParam) : 1;
|
|
try {
|
|
const [author, mangas] = await Promise.all([
|
|
getAuthor(params.id),
|
|
listAuthorMangas(params.id, {
|
|
limit: PAGE_SIZE,
|
|
offset: (currentPage - 1) * PAGE_SIZE
|
|
})
|
|
]);
|
|
return {
|
|
author,
|
|
mangas: mangas.items,
|
|
total: mangas.page.total,
|
|
currentPage,
|
|
pageSize: PAGE_SIZE
|
|
};
|
|
} catch (e) {
|
|
// 404 surfaces as a real SvelteKit error so the framework shell
|
|
// renders the standard not-found page instead of the route's
|
|
// happy-path markup with undefined data.
|
|
if (e instanceof ApiError && e.status === 404) {
|
|
error(404, 'Author not found');
|
|
}
|
|
throw e;
|
|
}
|
|
};
|