API:
- Add /libraries/{id}/series endpoint to list series with book counts
- Add series filter to /books endpoint
- Fix SeriesItem to return first_book_id properly (using CTE with ROW_NUMBER)
Indexer:
- Parse series from parent folder name relative to library root
- Store series in database when indexing books
Backoffice:
- Add Books page with grid view, search, and pagination
- Add Series page showing series with cover images
- Add Library books page filtered by series
- Add book detail page
- Add Series column in libraries list with clickable link
- Create BookCard component for reusable book display
- Add CSS styles for books grid, series grid, and book details
- Add proxy API route for book cover images (fixing CORS issues)
Parser:
- Add series field to ParsedMetadata
- Extract series from file path relative to library root
Books without a parent folder are categorized as 'unclassified' series.
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import type { Metadata } from "next";
|
|
import Image from "next/image";
|
|
import Link from "next/link";
|
|
import type { ReactNode } from "react";
|
|
import "./globals.css";
|
|
import { ThemeProvider } from "./theme-provider";
|
|
import { ThemeToggle } from "./theme-toggle";
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Stripstream Backoffice",
|
|
description: "Backoffice administration for Stripstream Librarian"
|
|
};
|
|
|
|
export default function RootLayout({ children }: { children: ReactNode }) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<body>
|
|
<ThemeProvider>
|
|
<nav className="top-nav">
|
|
<Link href="/" className="brand">
|
|
<Image src="/logo.png" alt="Stripstream" width={36} height={36} />
|
|
<span className="brand-name">StripStream</span>
|
|
<span className="brand-subtitle">backoffice</span>
|
|
</Link>
|
|
<div className="links-wrap">
|
|
<div className="links">
|
|
<Link href="/">Dashboard</Link>
|
|
<Link href="/books">Books</Link>
|
|
<Link href="/libraries">Libraries</Link>
|
|
<Link href="/jobs">Jobs</Link>
|
|
<Link href="/tokens">Tokens</Link>
|
|
</div>
|
|
<ThemeToggle />
|
|
</div>
|
|
</nav>
|
|
<main>{children}</main>
|
|
</ThemeProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|