From fd024fdb8f70582a037bab7e70ae8395ff3550c2 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Thu, 4 Dec 2025 22:44:43 +0700 Subject: [PATCH] chore: update Pagination component --- src/components/Pagination.tsx | 508 ++++++++++++++++++++-------------- 1 file changed, 299 insertions(+), 209 deletions(-) diff --git a/src/components/Pagination.tsx b/src/components/Pagination.tsx index e47e480d..8b80abf3 100644 --- a/src/components/Pagination.tsx +++ b/src/components/Pagination.tsx @@ -1,7 +1,9 @@ 'use client'; -import { ReactNode } from 'react'; +import { ChangeEventHandler, ReactNode } from 'react'; + import { Icon } from '@iconify/react'; +import Button from '@/components/Button'; import { cn } from '@/lib/helper'; @@ -17,16 +19,18 @@ const PaginationButton = ({ disabled?: boolean; onClick?: () => void; }) => ( - + ); const EtcPaginationButton = ({ @@ -90,16 +94,20 @@ const Pagination = ({ currentPage = 1, totalItems = 0, itemsPerPage = 10, + rowOptions = [10, 20, 50, 100], onPageChange, onPrevPage = () => {}, onNextPage = () => {}, + onRowChange, }: { currentPage: number; totalItems: number; itemsPerPage: number; + rowOptions?: number[]; onPageChange: (pageNumber: number) => void; onPrevPage: () => void; onNextPage: () => void; + onRowChange?: (row: number) => void; }) => { const totalPages = Math.ceil(totalItems / itemsPerPage) === 0 @@ -107,30 +115,139 @@ const Pagination = ({ : Math.ceil(totalItems / itemsPerPage); const pageChangeHandler = (pageNumber: number) => onPageChange(pageNumber); + const firstPageClickHandler = () => onPageChange(1); + const lastPageClickHandler = () => onPageChange(totalPages); + + const rowChangeHandler: ChangeEventHandler = (e) => { + onRowChange?.(Number(e.target.value)); + }; + + const DisplayedRowCountSelect = () => ( +
+ Showing + + +
+ ); + + const GoToFirstPageButton = () => ( + + ); + + const PrevPageButton = () => ( + + ); + + const GoToLastPageButton = () => ( + + ); + + const NextPageButton = () => ( + + ); + + const PageInfo = () => ( + + Page {currentPage} of {totalPages} + + ); return ( -
-
- +
+
+
+ +
- {totalPages <= 7 && ( -
- {range(1, totalPages).map((pageNumber) => ( +
+
+ +
+ +
+ +
+ + {totalPages <= 7 && + range(1, totalPages).map((pageNumber) => ( pageChangeHandler(pageNumber)} /> ))} -
- )} - {totalPages > 7 && ( -
- pageChangeHandler(1)} - /> - - {totalPages >= 2 && - (currentPage <= 3 || currentPage >= totalPages - 2) && ( - pageChangeHandler(2)} - /> - )} - - {totalPages >= 2 && - currentPage > 3 && - currentPage < totalPages - 2 && ( - - )} - - {totalPages >= 3 && - (currentPage <= 4 || currentPage >= totalPages - 2) && - currentPage !== totalPages - 2 && ( - pageChangeHandler(3)} - /> - )} - - {totalPages >= 7 && - (currentPage <= 2 || currentPage >= totalPages - 2) && ( - = totalPages - 1 - ? 4 - : 1 - } - endPage={ - currentPage <= 2 || currentPage >= totalPages - 1 - ? totalPages - 3 - : currentPage === totalPages - 2 - ? totalPages - 4 - : 2 - } - onPageItemClick={pageChangeHandler} - /> - )} - - {totalPages >= 3 && - currentPage > 4 && - currentPage < totalPages - 1 && ( - pageChangeHandler(currentPage - 1)} - /> - )} - - {totalPages >= 7 && - currentPage > 3 && - currentPage < totalPages - 2 && ( - - )} - - {totalPages >= 5 && - currentPage > 2 && - currentPage < totalPages - 2 && ( - pageChangeHandler(currentPage + 1)} - /> - )} - - {totalPages >= 5 && - (currentPage <= 2 || currentPage >= totalPages - 2) && ( - pageChangeHandler(totalPages - 2)} - /> - )} - - {totalPages >= 6 && - currentPage > 2 && - currentPage < totalPages - 3 && ( - = 4 - ? currentPage + 2 - : 1 - } - endPage={ - currentPage <= 3 - ? totalPages - 2 - : currentPage >= 4 - ? totalPages - 1 - : 0 - } - onPageItemClick={pageChangeHandler} - /> - )} - - {totalPages >= 6 && - (currentPage <= 3 || currentPage >= totalPages - 3) && ( - pageChangeHandler(totalPages - 1)} - /> - )} - - {totalPages >= 7 && ( + {totalPages > 7 && ( + <> pageChangeHandler(totalPages)} + content={1} + disabled={currentPage === 1} + onClick={() => pageChangeHandler(1)} /> - )} -
- )} - + +
+ +
+ +
+ +
+
+ +
+ +
-
- +
+
+ + + + +
- +
+ + + +
);