Files
stripstream-librarian/apps/backoffice/app/layout.tsx
Froidefond Julien d33a4b02d8 feat: add series support for book organization
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.
2026-03-05 22:58:28 +01:00

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>
);
}