diff --git a/apps/hub/app/_components/PaginatedTable.tsx b/apps/hub/app/_components/PaginatedTable.tsx index 18b81113..bc54e3b8 100644 --- a/apps/hub/app/_components/PaginatedTable.tsx +++ b/apps/hub/app/_components/PaginatedTable.tsx @@ -1,27 +1,41 @@ -import SortableTable, { SortableTableProps } from './Table'; +'use client'; +import { useEffect, useState } from 'react'; +import SortableTable, { Pagination, SortableTableProps } from './Table'; +import { PrismaClient } from '@repo/db'; +import { getData } from './pagiantedTableActions'; interface PaginatedTableProps extends Omit, 'data'> { - prismaGetter: ( - fnProps: { - cursor: number; - take: number; - } & any - ) => Promise; + prismaModel: keyof PrismaClient; + rowsPerPage?: number; } -export async function PaginatedTable({ - prismaGetter, +export function PaginatedTable({ + prismaModel, + rowsPerPage = 10, ...restProps }: PaginatedTableProps) { - const data = await prismaGetter({ - cursor: 0, - take: 10, - }); + const [data, setData] = useState([]); + const [page, setPage] = useState(0); + const [total, setTotal] = useState(0); + + useEffect(() => { + getData(prismaModel, rowsPerPage, page * rowsPerPage).then((result) => { + if (result) { + setData(result.data); + setTotal(result.total); + } + }); + }, [page]); return ( -
+
+
); } diff --git a/apps/hub/app/_components/Table.tsx b/apps/hub/app/_components/Table.tsx index 56781285..4b33f6d6 100644 --- a/apps/hub/app/_components/Table.tsx +++ b/apps/hub/app/_components/Table.tsx @@ -8,7 +8,7 @@ import { SortingState, flexRender, } from '@tanstack/react-table'; -import { ChevronDown, ChevronUp } from 'lucide-react'; // Icons for sorting +import { ArrowLeft, ArrowRight, ChevronDown, ChevronUp } from 'lucide-react'; // Icons for sorting export interface SortableTableProps { data: TData[]; @@ -73,3 +73,44 @@ export default function SortableTable({
); } + +export const Pagination = ({ + page, + totalPages, + setPage, +}: { + page: number; + totalPages: number; + setPage: (page: number) => void; +}) => { + if (totalPages === 0) return null; + return ( +
+ + + +
+ ); +}; diff --git a/apps/hub/app/_components/pagiantedTableActions.ts b/apps/hub/app/_components/pagiantedTableActions.ts new file mode 100644 index 00000000..297e4235 --- /dev/null +++ b/apps/hub/app/_components/pagiantedTableActions.ts @@ -0,0 +1,24 @@ +'use server'; +import { PrismaClient } from '@repo/db'; + +export const getData = async ( + prismaModelName: keyof PrismaClient, + take: number, + skip: number +) => { + const prisma = new PrismaClient(); + if ( + !prismaModelName || + !prisma[prismaModelName] || + !('findMany' in prisma[prismaModelName]) + ) + return; + const model = prisma[prismaModelName] as any; + if (!model.findMany || !model.count) return; + const data = await model.findMany({ + take, + skip, + }); + const total = await model.count(); + return { data, total }; +}; diff --git a/apps/hub/app/page.tsx b/apps/hub/app/page.tsx index fec363b5..0e93079a 100644 --- a/apps/hub/app/page.tsx +++ b/apps/hub/app/page.tsx @@ -1,6 +1,6 @@ import Link from 'next/link'; import { PrismaClient } from '@repo/db'; -import { PaginatedTable } from '../app/_components/PaginatedTable'; +import { PaginatedTable } from './_components/PaginatedTable'; export default async function Home() { const prisma = new PrismaClient(); @@ -12,12 +12,17 @@ export default async function Home() {