Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/Pagination/getPagination.ts
2500 views
1
/**
2
* Copyright (c) 2022 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
export function getPaginationNumbers(totalNumberOfPages: number, currentPage: number) {
8
const adjacentToCurrentPage = 1; // This is the number(s) we see next to the currentPage
9
const numberOfPagesToShowOnTheSide = 3;
10
const totalNumbersShownInPagination = 6;
11
let calculatedPagination: number[] = [];
12
13
const pageNumbersAsArray = (startRange: number, endRange: number) => {
14
return [...Array(endRange + 1).keys()].slice(startRange);
15
};
16
17
const minimumAmountInBetweenToShowEllipsis = 2;
18
// Without ellipsis aka normal case
19
if (totalNumberOfPages <= totalNumbersShownInPagination) {
20
return (calculatedPagination = pageNumbersAsArray(1, totalNumberOfPages));
21
}
22
23
// Otherwise, we show the ellipses
24
const toTheRightOfCurrent = Math.min(currentPage + adjacentToCurrentPage, totalNumberOfPages);
25
const toTheLeftOfCurrent = Math.max(currentPage - adjacentToCurrentPage, 1);
26
27
const showRightEllipsis = toTheRightOfCurrent < totalNumberOfPages - minimumAmountInBetweenToShowEllipsis; // e.g. "1 2 3 ... 7"
28
const showLeftEllipsis =
29
currentPage > numberOfPagesToShowOnTheSide + adjacentToCurrentPage &&
30
toTheLeftOfCurrent > minimumAmountInBetweenToShowEllipsis; // e.g. 1 ... 5 6 7"
31
32
if (showRightEllipsis && !showLeftEllipsis) {
33
let leftSideNumbers = Math.max(numberOfPagesToShowOnTheSide, currentPage + adjacentToCurrentPage);
34
let leftPageNumbersAsArray = pageNumbersAsArray(1, leftSideNumbers);
35
return [...leftPageNumbersAsArray, "...", totalNumberOfPages];
36
}
37
38
if (showLeftEllipsis && !showRightEllipsis) {
39
let rightSideNumbers = Math.max(
40
numberOfPagesToShowOnTheSide,
41
totalNumberOfPages - currentPage + adjacentToCurrentPage,
42
);
43
let rightPageNumbersAsArray = pageNumbersAsArray(totalNumberOfPages - rightSideNumbers, totalNumberOfPages);
44
return [1, "...", ...rightPageNumbersAsArray];
45
}
46
47
if (showRightEllipsis && showLeftEllipsis) {
48
let middleNumbers = pageNumbersAsArray(toTheLeftOfCurrent, toTheRightOfCurrent);
49
return [1, "...", ...middleNumbers, "...", totalNumberOfPages];
50
}
51
52
return calculatedPagination;
53
}
54
55