Path: blob/main/components/dashboard/src/Pagination/getPagination.ts
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*/56export function getPaginationNumbers(totalNumberOfPages: number, currentPage: number) {7const adjacentToCurrentPage = 1; // This is the number(s) we see next to the currentPage8const numberOfPagesToShowOnTheSide = 3;9const totalNumbersShownInPagination = 6;10let calculatedPagination: number[] = [];1112const pageNumbersAsArray = (startRange: number, endRange: number) => {13return [...Array(endRange + 1).keys()].slice(startRange);14};1516const minimumAmountInBetweenToShowEllipsis = 2;17// Without ellipsis aka normal case18if (totalNumberOfPages <= totalNumbersShownInPagination) {19return (calculatedPagination = pageNumbersAsArray(1, totalNumberOfPages));20}2122// Otherwise, we show the ellipses23const toTheRightOfCurrent = Math.min(currentPage + adjacentToCurrentPage, totalNumberOfPages);24const toTheLeftOfCurrent = Math.max(currentPage - adjacentToCurrentPage, 1);2526const showRightEllipsis = toTheRightOfCurrent < totalNumberOfPages - minimumAmountInBetweenToShowEllipsis; // e.g. "1 2 3 ... 7"27const showLeftEllipsis =28currentPage > numberOfPagesToShowOnTheSide + adjacentToCurrentPage &&29toTheLeftOfCurrent > minimumAmountInBetweenToShowEllipsis; // e.g. 1 ... 5 6 7"3031if (showRightEllipsis && !showLeftEllipsis) {32let leftSideNumbers = Math.max(numberOfPagesToShowOnTheSide, currentPage + adjacentToCurrentPage);33let leftPageNumbersAsArray = pageNumbersAsArray(1, leftSideNumbers);34return [...leftPageNumbersAsArray, "...", totalNumberOfPages];35}3637if (showLeftEllipsis && !showRightEllipsis) {38let rightSideNumbers = Math.max(39numberOfPagesToShowOnTheSide,40totalNumberOfPages - currentPage + adjacentToCurrentPage,41);42let rightPageNumbersAsArray = pageNumbersAsArray(totalNumberOfPages - rightSideNumbers, totalNumberOfPages);43return [1, "...", ...rightPageNumbersAsArray];44}4546if (showRightEllipsis && showLeftEllipsis) {47let middleNumbers = pageNumbersAsArray(toTheLeftOfCurrent, toTheRightOfCurrent);48return [1, "...", ...middleNumbers, "...", totalNumberOfPages];49}5051return calculatedPagination;52}535455