Skip to content

Commit dba7eba

Browse files
committed
feat: membership list
1 parent 44a2836 commit dba7eba

File tree

10 files changed

+667
-13
lines changed

10 files changed

+667
-13
lines changed

app/books/new/error.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"use client"; // Error boundaries must be Client Components
2+
3+
import { useEffect } from "react";
4+
5+
export default function Error({
6+
error,
7+
reset,
8+
}: {
9+
error: Error & { digest?: string };
10+
reset: () => void;
11+
}) {
12+
useEffect(() => {
13+
// Log the error to an error reporting service
14+
console.error(error);
15+
}, [error]);
16+
17+
return (
18+
<div>
19+
<h2>Something went wrong!</h2>
20+
<button
21+
onClick={
22+
// Attempt to recover by trying to re-render the segment
23+
() => reset()
24+
}
25+
>
26+
Try again
27+
</button>
28+
</div>
29+
);
30+
}

app/books/new/page.tsx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { Button } from "@/components/ui/button";
2+
import { Input } from "@/components/ui/input";
3+
import { createBook } from "@/lib/api/book";
4+
5+
import {
6+
Breadcrumb,
7+
BreadcrumbItem,
8+
BreadcrumbLink,
9+
BreadcrumbList,
10+
BreadcrumbPage,
11+
BreadcrumbSeparator,
12+
} from "@/components/ui/breadcrumb";
13+
import Link from "next/link";
14+
import { redirect } from "next/navigation";
15+
16+
export default function NewBook() {
17+
async function create(formData: FormData) {
18+
"use server";
19+
20+
const title = formData.get("title") as string;
21+
const author = formData.get("author") as string;
22+
const year = formData.get("year") as string;
23+
const code = formData.get("code") as string;
24+
const library_id = formData.get("library_id") as string;
25+
26+
await createBook({
27+
title,
28+
author,
29+
year: Number(year),
30+
code,
31+
library_id,
32+
});
33+
34+
redirect("/books");
35+
}
36+
37+
return (
38+
<div className="space-y-4">
39+
<h1 className="text-2xl font-semibold">Books</h1>
40+
<Breadcrumb>
41+
<BreadcrumbList>
42+
<BreadcrumbItem>
43+
<Link href="/" passHref legacyBehavior>
44+
<BreadcrumbLink>Home</BreadcrumbLink>
45+
</Link>
46+
</BreadcrumbItem>
47+
<BreadcrumbSeparator />
48+
<BreadcrumbItem>
49+
<Link href="/books" passHref legacyBehavior>
50+
<BreadcrumbLink>books</BreadcrumbLink>
51+
</Link>
52+
</BreadcrumbItem>
53+
<BreadcrumbSeparator />
54+
<BreadcrumbItem>
55+
<BreadcrumbPage>Register a book</BreadcrumbPage>
56+
</BreadcrumbItem>
57+
</BreadcrumbList>
58+
</Breadcrumb>
59+
60+
<form action={create} className="space-y-4 md:max-w-[40%]">
61+
<Input name="title" placeholder="Title" required />
62+
<Input name="author" placeholder="Author" required />
63+
<Input name="year" type="number" placeholder="Year" required />
64+
<Input name="code" placeholder="Code" required />
65+
<Input name="library_id" placeholder="Library ID" required />
66+
<Button type="submit">Create</Button>
67+
</form>
68+
</div>
69+
);
70+
}

app/books/page.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
BreadcrumbPage,
77
BreadcrumbSeparator,
88
} from "@/components/ui/breadcrumb";
9+
import { Button } from "@/components/ui/button";
910
import {
1011
Pagination,
1112
PaginationContent,
@@ -58,27 +59,33 @@ export default async function Borrows({
5859
return (
5960
<div>
6061
<h1 className="text-2xl font-semibold">Books</h1>
61-
<Breadcrumb>
62-
<BreadcrumbList>
63-
<BreadcrumbItem>
64-
<Link href="/" passHref legacyBehavior>
65-
<BreadcrumbLink>Home</BreadcrumbLink>
66-
</Link>
67-
</BreadcrumbItem>
68-
<BreadcrumbSeparator />
62+
<div className="flex justify-between items-center">
63+
<Breadcrumb>
64+
<BreadcrumbList>
65+
<BreadcrumbItem>
66+
<Link href="/" passHref legacyBehavior>
67+
<BreadcrumbLink>Home</BreadcrumbLink>
68+
</Link>
69+
</BreadcrumbItem>
70+
<BreadcrumbSeparator />
6971

70-
<BreadcrumbItem>
71-
<BreadcrumbPage>Borrows</BreadcrumbPage>
72-
</BreadcrumbItem>
73-
</BreadcrumbList>
74-
</Breadcrumb>
72+
<BreadcrumbItem>
73+
<BreadcrumbPage>Books</BreadcrumbPage>
74+
</BreadcrumbItem>
75+
</BreadcrumbList>
76+
</Breadcrumb>
77+
<Button asChild>
78+
<Link href="/books/new">Register New Book</Link>
79+
</Button>
80+
</div>
7581

7682
<Table>
7783
{/* <TableCaption>List of books available in the library.</TableCaption> */}
7884
<TableHeader>
7985
<TableRow>
8086
<TableHead>Code</TableHead>
8187
<TableHead>Title</TableHead>
88+
<TableHead>Library</TableHead>
8289
<TableHead>Author</TableHead>
8390
<TableHead>Year</TableHead>
8491
</TableRow>
@@ -88,6 +95,7 @@ export default async function Borrows({
8895
<TableRow key={b.id}>
8996
<TableCell>{b.code}</TableCell>
9097
<TableCell>{b.title}</TableCell>
98+
<TableCell>{b.library?.name}</TableCell>
9199
<TableCell>{b.author}</TableCell>
92100
<TableCell>{b.year}</TableCell>
93101
</TableRow>

0 commit comments

Comments
 (0)