From 971bc77b6e4f71dcc1c81a478d2741b6d740401e Mon Sep 17 00:00:00 2001 From: Varun Raj Date: Sun, 18 Aug 2024 01:15:25 +0530 Subject: [PATCH] feat: added grid layout for person list Signed-off-by: Varun Raj --- bun.lockb | Bin 185493 -> 188706 bytes next.config.mjs | 2 +- package.json | 3 + src/components/layouts/RootLayout.tsx | 6 - src/components/people/PeopleList.tsx | 34 +++- src/components/people/PeoplePagination.tsx | 47 +++++ src/components/people/PersonBirthdayCell.tsx | 6 +- src/components/people/PersonHideCell.tsx | 45 +++++ src/components/people/PersonItem.tsx | 41 ++++- src/components/people/PersonMergeDropdown.tsx | 1 - src/components/ui/datepicker.tsx | 2 +- src/components/ui/label.tsx | 24 +++ src/components/ui/loader.tsx | 2 + src/components/ui/pagination.tsx | 121 ++++++++++++ src/components/ui/scroll-area.tsx | 46 +++++ src/components/ui/switch.tsx | 27 +++ src/components/ui/table.tsx | 173 ++++++++++-------- src/handlers/api/people.handler.ts | 7 +- src/pages/api/immich-proxy/[...path].ts | 3 +- src/styles/globals.scss | 2 + tailwind.config.ts | 2 +- 21 files changed, 477 insertions(+), 117 deletions(-) create mode 100644 src/components/people/PeoplePagination.tsx create mode 100644 src/components/people/PersonHideCell.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/scroll-area.tsx create mode 100644 src/components/ui/switch.tsx diff --git a/bun.lockb b/bun.lockb index 9045f2d3c388e7336a87dfdadbfa8cb8c6241328..1bae1f3ca3d5714ce83fe4acc29d8349e5b1a8fd 100755 GIT binary patch delta 35164 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 delta 33525 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 CIV+3+ diff --git a/next.config.mjs b/next.config.mjs index d5456a1..61cd5ed 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,6 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: true, + reactStrictMode: false, }; export default nextConfig; diff --git a/package.json b/package.json index e2ee7ae..48e8c91 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,11 @@ "@radix-ui/react-avatar": "^1.1.0", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.0", "@tanstack/react-table": "^8.20.1", "@types/qs": "^6.9.15", "axios": "^1.7.4", diff --git a/src/components/layouts/RootLayout.tsx b/src/components/layouts/RootLayout.tsx index 4b5e578..90ac2eb 100644 --- a/src/components/layouts/RootLayout.tsx +++ b/src/components/layouts/RootLayout.tsx @@ -1,11 +1,6 @@ -import { Inter as FontSans } from "next/font/google" import { cn } from "@/lib/utils" -const fontSans = FontSans({ - subsets: ["latin"], - variable: "--font-sans", -}) type RootLayoutProps = { children: React.ReactNode @@ -15,7 +10,6 @@ export default function RootLayout({ children }: RootLayoutProps) { return (
{children}
diff --git a/src/components/people/PeopleList.tsx b/src/components/people/PeopleList.tsx index 6a3c48e..975af48 100644 --- a/src/components/people/PeopleList.tsx +++ b/src/components/people/PeopleList.tsx @@ -1,5 +1,4 @@ import { listPeople } from "@/handlers/api/people.handler"; -import { IListData } from "@/types/common"; import { IPerson } from "@/types/person"; import React, { useEffect, useState } from "react"; import Loader from "../ui/loader"; @@ -9,6 +8,9 @@ import { Table } from "../ui/table"; import PersonBirthdayCell from "./PersonBirthdayCell"; import Link from "next/link"; import { ENV } from "@/config/environment"; +import PersonHideCell from "./PersonHideCell"; +import { PeoplePagination } from "./PeoplePagination"; +import { useRouter } from "next/router"; const columns: ColumnDef[] = [ { @@ -25,7 +27,7 @@ const columns: ColumnDef[] = [ header: "Hidden", accessorKey: "isHidden", cell: ({ row }) => ( - {row.original.isHidden ? "Yes" : "No"} + ), }, { @@ -46,15 +48,18 @@ const columns: ColumnDef[] = [ }, ]; - - export default function PeopleList() { + const router = useRouter() + const { page = 1 } = router.query as { page: string } const [people, setPeople] = useState([]); const [loading, setLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(null); const fetchData = async () => { - return listPeople() + setLoading(true); + return listPeople({ + page + }) .then((response) => { setPeople(response.people); }) @@ -67,17 +72,28 @@ export default function PeopleList() { }; useEffect(() => { + if (!router.isReady) return; fetchData(); - }, []); + }, [page]); + + const renderContent = () => { if (loading) return ; - if (errorMessage) return
{errorMessage}
; + return ( +
+ {people.map((person) => ( + + ))} +
+ ) +} return (
-
- columns={columns} data={people} /> + {renderContent()} +
+
); diff --git a/src/components/people/PeoplePagination.tsx b/src/components/people/PeoplePagination.tsx new file mode 100644 index 0000000..caf264c --- /dev/null +++ b/src/components/people/PeoplePagination.tsx @@ -0,0 +1,47 @@ + +import { useRouter } from "next/router" +import { useMemo } from "react" +import { Button } from "../ui/button" +import { ArrowLeft, ArrowRight } from "lucide-react" +import Link from "next/link" + +export function PeoplePagination() { + const router = useRouter() + const { pathname } = router; + const { page = 1 } = router.query as { page: string } + + const [nextPage, prevPage] = useMemo(() => { + const pageNum = parseInt(page.toString() || "1", 10) + return [pageNum + 1, pageNum - 1] + + }, [page]) + + return ( +
+ + + + + + + +
+ ) +} diff --git a/src/components/people/PersonBirthdayCell.tsx b/src/components/people/PersonBirthdayCell.tsx index 2b9da47..2004952 100644 --- a/src/components/people/PersonBirthdayCell.tsx +++ b/src/components/people/PersonBirthdayCell.tsx @@ -33,9 +33,5 @@ export default function PersonBirthdayCell( - return ( -
- -
- ) + return } diff --git a/src/components/people/PersonHideCell.tsx b/src/components/people/PersonHideCell.tsx new file mode 100644 index 0000000..3bf43ce --- /dev/null +++ b/src/components/people/PersonHideCell.tsx @@ -0,0 +1,45 @@ +import { IPerson } from "@/types/person"; +import React, { useState } from "react"; +import { DatePicker } from "../ui/datepicker"; +import { updatePerson } from "@/handlers/api/people.handler"; +import { formatDate } from "@/helpers/date.helper"; +import { Button } from "../ui/button"; +import { Switch } from "../ui/switch"; +import { Label } from "../ui/label"; + +interface IProps { + person: IPerson; + onUpdate?: (person: IPerson) => any; +} + +export default function PersonHideCell({ person, onUpdate }: IProps) { + const [loading, setLoading] = useState(false); + const [hidden, setHidden] = useState(person.isHidden); + + const handleEdit = (hidden: boolean) => { + setLoading(true); + return updatePerson(person.id, { + isHidden: hidden, + }) + .then(() => { + setHidden(hidden); + onUpdate?.({ + ...person, + isHidden: hidden, + }) + }) + .catch(() => {}) + .finally(() => { + setLoading(false); + }); + }; + + return ( + + ); +} diff --git a/src/components/people/PersonItem.tsx b/src/components/people/PersonItem.tsx index 29ddc86..0d52b67 100644 --- a/src/components/people/PersonItem.tsx +++ b/src/components/people/PersonItem.tsx @@ -3,6 +3,9 @@ import React, { useState } from "react"; import { Avatar } from "../ui/avatar"; import { updatePerson } from "@/handlers/api/people.handler"; import { PersonMergeDropdown } from "./PersonMergeDropdown"; +import PersonBirthdayCell from "./PersonBirthdayCell"; +import PersonHideCell from "./PersonHideCell"; +import clsx from "clsx"; interface IProps { person: IPerson; @@ -27,25 +30,44 @@ export default function PersonItem({ person }: IProps) { }; return ( -
- +
+
+ +
+ { + setFormData(newData); + }} + /> +
+
{!editMode ? (

{ setEditMode((prev) => !prev); }} > - {formData.name ? formData.name : Unknown} + {formData.name ? ( + formData.name + ) : ( + Unknown + )}

) : ( { @@ -56,6 +78,7 @@ export default function PersonItem({ person }: IProps) { /> )} +
); } diff --git a/src/components/people/PersonMergeDropdown.tsx b/src/components/people/PersonMergeDropdown.tsx index dfec675..118fa41 100644 --- a/src/components/people/PersonMergeDropdown.tsx +++ b/src/components/people/PersonMergeDropdown.tsx @@ -90,7 +90,6 @@ export function PersonMergeDropdown( }) }; - console.log(searchedPeople); return (
diff --git a/src/components/ui/datepicker.tsx b/src/components/ui/datepicker.tsx index 6ccd136..3053e3e 100644 --- a/src/components/ui/datepicker.tsx +++ b/src/components/ui/datepicker.tsx @@ -32,7 +32,7 @@ export function DatePicker(