From da7e1067d2a84320556f054125e4aa4845fca1b6 Mon Sep 17 00:00:00 2001 From: Hafid Nur Date: Fri, 28 Mar 2025 16:50:58 +0700 Subject: [PATCH] feat: Implement pagination - Terapkan pagination pada page Data Akun --- apps/backoffice/src/app/accounts/page.tsx | 151 ++++++++++++++++++++-- 1 file changed, 137 insertions(+), 14 deletions(-) diff --git a/apps/backoffice/src/app/accounts/page.tsx b/apps/backoffice/src/app/accounts/page.tsx index 7dc263b..aedbce5 100644 --- a/apps/backoffice/src/app/accounts/page.tsx +++ b/apps/backoffice/src/app/accounts/page.tsx @@ -5,6 +5,8 @@ import { FilterOutlined, SearchOutlined, EditOutlined, + ArrowRightOutlined, + ArrowLeftOutlined, } from '@ant-design/icons'; import { Button, Input } from '@imphnen-frontend-service/ui/atoms'; import { Pagination } from '@imphnen-frontend-service/ui/molecules'; @@ -14,6 +16,8 @@ import { ColumnDef, flexRender, getCoreRowModel, + getPaginationRowModel, + PaginationState, useReactTable, } from '@tanstack/react-table'; @@ -97,8 +101,6 @@ const columns: ColumnDef[] = [ export const Components: FC = (): ReactElement => { const [searchQuery, setSearchQuery] = useState(''); - const [currentPage, setCurrentPage] = useState(1); - const itemsPerPage = 9; // Filter data based on search query const filteredData = mockData.filter( @@ -107,31 +109,31 @@ export const Components: FC = (): ReactElement => { item.email.toLowerCase().includes(searchQuery.toLowerCase()) ); - // Paginate data - const indexOfLastItem = currentPage * itemsPerPage; - const indexOfFirstItem = indexOfLastItem - itemsPerPage; - const currentItems = filteredData.slice(indexOfFirstItem, indexOfLastItem); - // const handleEdit = (id: number) => { // console.log(`Edit item with id: ${id}`); // // Implement edit functionality // }; - const handlePageChange = (pageNumber: number) => { - setCurrentPage(pageNumber); - }; - const handleSearch = (e: React.ChangeEvent) => { setSearchQuery(e.target.value); - setCurrentPage(1); // Reset to first page when searching + // setCurrentPage(1); // Reset to first page when searching }; // const [data, _setData] = React.useState(() => [...mockData]); + const [pagination, setPagination] = React.useState({ + pageIndex: 0, + pageSize: 9, + }); const table = useReactTable({ data: mockData, columns, + state: { + pagination, + }, getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + onPaginationChange: setPagination, }); return ( @@ -240,11 +242,132 @@ export const Components: FC = (): ReactElement => { /> */} {/* Pagination */} - + /> */} +
+ + + + {/* {table.getPageCount().map((page, index) => ( + + ))} */} + {/*
+ {getPageNumbers().map((page, index) => + typeof page === 'number' ? ( + + ) : ( + + {page} + + ) + )} +
*/} + + +
+
+ {/* + + + */} + +
Page
+ + {table.getState().pagination.pageIndex + 1} of{' '} + {table.getPageCount().toLocaleString()} + +
+ + | Go to page: + { + const page = e.target.value ? Number(e.target.value) - 1 : 0; + table.setPageIndex(page); + }} + className="border p-1 rounded w-16" + /> + + +
);