Path: blob/main/components/dashboard/src/Pagination/Pagination.tsx
2500 views
/**1* Copyright (c) 2022 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { getPaginationNumbers } from "./getPagination";7import PaginationNavigationButton from "./PaginationNavigationButton";89interface PaginationProps {10totalNumberOfPages: number;11currentPage: number;12setPage: (page: number) => void;13}1415function Pagination(props: PaginationProps) {16const { totalNumberOfPages, setPage } = props;17if (totalNumberOfPages <= 1 || props.currentPage < 1) {18return <></>;19}20const currentPage = Math.min(totalNumberOfPages, props.currentPage);21const calculatedPagination = getPaginationNumbers(totalNumberOfPages, currentPage);2223const nextPage = () => {24if (currentPage !== totalNumberOfPages) setPage(currentPage + 1);25};26const prevPage = () => {27if (currentPage !== 1) setPage(currentPage - 1);28};29const getClassnames = (pageNumber: string | number) => {30if (pageNumber === currentPage) {31return "font-semibold text-gray-500 dark:text-gray-400 max-h-9 max-w-8 flex items-center justify-center rounded-md hover:bg-gray-50 dark:hover:bg-gray-800 dark:bg-gray-700 bg-gray-100 disabled pointer-events-none px-3 py-2";32}33if (pageNumber === "...") {34return "font-semibold text-gray-500 dark:text-gray-400 max-h-9 max-w-8 flex items-center justify-center rounded-md hover:bg-gray-50 dark:hover:bg-gray-800 disabled pointer-events-none px-3 py-2";35}36return "font-semibold text-gray-500 dark:text-gray-400 max-h-9 max-w-8 flex items-center justify-center rounded-md hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer px-3 py-2";37};3839return (40<nav className="mt-16 mb-16">41<ul className="flex justify-center items-center space-x-4">42<PaginationNavigationButton43isDisabled={currentPage === 1}44onClick={prevPage}45label={"Previous"}46arrowDirection={"left"}47/>48{calculatedPagination.map((pn, i) => {49if (pn === "...") {50return (51<li key={i} className={getClassnames(pn)}>52…53</li>54);55}56return (57<li key={i} className={getClassnames(pn)} onClick={() => typeof pn === "number" && setPage(pn)}>58<span>{pn}</span>59</li>60);61})}62<PaginationNavigationButton63isDisabled={currentPage === totalNumberOfPages}64onClick={nextPage}65label={"Next"}66arrowDirection={"right"}67/>68</ul>69</nav>70);71}7273export default Pagination;747576