Skip to content

Commit 140848c

Browse files
author
Laurie T. Malau
committed
increase page resultsand add clclickability
1 parent 3218c48 commit 140848c

File tree

3 files changed

+94
-20
lines changed

3 files changed

+94
-20
lines changed

components/dashboard/src/components/Pagination.tsx

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,55 @@
44
* See License-AGPL.txt in the project root for license information.
55
*/
66

7+
import { usePagination } from "../custom-hooks/usePagination";
78
import Arrow from "./Arrow";
89

9-
function Pagination(props: { numberOfPages: number; currentPage: number; setCurrentPage: any }) {
10-
const { numberOfPages, currentPage, setCurrentPage } = props;
11-
const availablePageNumbers = [...Array(numberOfPages + 1).keys()].slice(1);
10+
function Pagination(props: {
11+
totalResults: number;
12+
totalNumberOfPages: number;
13+
currentPage: number;
14+
setCurrentPage: any;
15+
resultsPerPage: number;
16+
}) {
17+
const { totalResults, totalNumberOfPages, currentPage, setCurrentPage, resultsPerPage } = props;
18+
const calculatedPagination = usePagination({ totalResults, totalNumberOfPages, currentPage, resultsPerPage });
1219

1320
const nextPage = () => {
14-
if (currentPage !== numberOfPages) setCurrentPage(currentPage + 1);
21+
if (currentPage !== totalNumberOfPages) setCurrentPage(currentPage + 1);
1522
};
1623
const prevPage = () => {
1724
if (currentPage !== 1) setCurrentPage(currentPage - 1);
1825
};
26+
const getClassnames = (pageNumber: string | number) => {
27+
if (pageNumber === currentPage) {
28+
return "text-gray-500 w-8 text-center rounded-md hover:bg-gray-50 bg-gray-100 disabled pointer-events-none";
29+
}
30+
if (pageNumber === "...") {
31+
return "text-gray-500 w-8 text-center rounded-md hover:bg-gray-50 disabled pointer-events-none";
32+
}
33+
return "text-gray-500 w-8 text-center rounded-md hover:bg-gray-50 cursor-pointer";
34+
};
1935

2036
return (
21-
<nav className="mt-16">
37+
<nav className="mt-16 mb-16">
2238
<ul className="flex justify-center space-x-4">
23-
<li className="text-gray-400 cursor-pointer">
39+
<li className={`text-gray-400 ${currentPage === 1 ? "disabled" : "cursor-pointer text-gray-500"}`}>
2440
<span onClick={prevPage}>
2541
<Arrow direction={"left"} />
2642
Previous
2743
</span>
2844
</li>
29-
{availablePageNumbers.map((pn) => (
30-
<li
31-
key={pn}
32-
className={`text-gray-500 cursor-pointer w-8 text-center rounded-md ${
33-
currentPage === pn ? "bg-gray-200" : ""
34-
} `}
35-
>
36-
<span onClick={() => setCurrentPage(pn)}>{pn}</span>
37-
</li>
38-
))}
39-
<li className="text-gray-400 cursor-pointer">
45+
{calculatedPagination &&
46+
calculatedPagination.map((pn) => (
47+
<li key={pn} className={getClassnames(pn)}>
48+
<span onClick={() => setCurrentPage(pn)}>{pn}</span>
49+
</li>
50+
))}
51+
<li
52+
className={`text-gray-400 ${
53+
currentPage === totalNumberOfPages ? "disabled" : "cursor-pointer text-gray-500"
54+
}`}
55+
>
4056
<span onClick={nextPage}>
4157
Next
4258
<Arrow direction={"right"} />
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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+
import { useMemo } from "react";
8+
9+
export const usePagination = (props: {
10+
totalResults: number;
11+
totalNumberOfPages: number;
12+
currentPage: number;
13+
resultsPerPage: number;
14+
}) => {
15+
const { totalResults, totalNumberOfPages, currentPage, resultsPerPage } = props;
16+
const adjacentToCurrentPage = 1; // This is the number(s) we see next to the currentPage
17+
const totalNumbersShownInPagination = 6;
18+
19+
const pageNumbersAsArray = (startRange: number, endRange: number) => {
20+
return [...Array(endRange + 1).keys()].slice(startRange);
21+
};
22+
23+
const calculatedPagination = useMemo(() => {
24+
const minimumAmountInBetweenToShowEllipsis = 2;
25+
// Without ellipsis aka normal case
26+
if (totalNumberOfPages <= totalNumbersShownInPagination) {
27+
return pageNumbersAsArray(1, totalNumberOfPages);
28+
}
29+
30+
// Otherwise, we show the ellipses
31+
const toTheRightOfCurrent = Math.min(currentPage + adjacentToCurrentPage, totalNumberOfPages);
32+
const toTheLeftOfCurrent = Math.max(currentPage - adjacentToCurrentPage, 1);
33+
34+
const showRightEllipsis = toTheRightOfCurrent < totalNumberOfPages - minimumAmountInBetweenToShowEllipsis; // e.g. "1 2 3 ... 7"
35+
const showLeftEllipsis = toTheLeftOfCurrent > minimumAmountInBetweenToShowEllipsis; // e.g. 1 ... 5 6 7"
36+
37+
if (showRightEllipsis && !showLeftEllipsis) {
38+
let leftSideNumbers = 3;
39+
let leftPageNumbersAsArray = pageNumbersAsArray(1, leftSideNumbers);
40+
return [...leftPageNumbersAsArray, "...", totalNumberOfPages];
41+
}
42+
43+
if (showLeftEllipsis && !showRightEllipsis) {
44+
let rightSideNumbers = 3;
45+
let rightPageNumbersAsArray = pageNumbersAsArray(totalNumberOfPages - rightSideNumbers, totalNumberOfPages);
46+
return [1, "...", ...rightPageNumbersAsArray];
47+
}
48+
49+
if (showRightEllipsis && showLeftEllipsis) {
50+
let middleNumbers = pageNumbersAsArray(toTheLeftOfCurrent, toTheRightOfCurrent);
51+
return [1, "...", ...middleNumbers, "...", totalNumberOfPages];
52+
}
53+
}, [totalResults, totalNumberOfPages, currentPage, adjacentToCurrentPage, pageNumbersAsArray, resultsPerPage]);
54+
55+
return calculatedPagination;
56+
};

components/dashboard/src/teams/TeamUsage.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function TeamUsage() {
3232
const team = getCurrentTeam(location, teams);
3333
const [billedUsage, setBilledUsage] = useState<BillableSession[]>([]);
3434
const [currentPage, setCurrentPage] = useState(1);
35-
const [resultsPerPage] = useState(10);
35+
const [resultsPerPage] = useState(1);
3636
const [errorMessage, setErrorMessage] = useState("");
3737
const today = new Date();
3838
const startOfCurrentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
@@ -126,7 +126,7 @@ function TeamUsage() {
126126

127127
const lastResultOnCurrentPage = currentPage * resultsPerPage;
128128
const firstResultOnCurrentPage = lastResultOnCurrentPage - resultsPerPage;
129-
const numberOfPages = Math.ceil(billedUsage.length / resultsPerPage);
129+
const totalNumberOfPages = Math.ceil(billedUsage.length / resultsPerPage);
130130
const currentPaginatedResults = billedUsage.slice(firstResultOnCurrentPage, lastResultOnCurrentPage);
131131

132132
return (
@@ -236,9 +236,11 @@ function TeamUsage() {
236236
</ItemsList>
237237
{billedUsage.length > resultsPerPage && (
238238
<Pagination
239+
totalResults={billedUsage.length}
239240
currentPage={currentPage}
240241
setCurrentPage={setCurrentPage}
241-
numberOfPages={numberOfPages}
242+
totalNumberOfPages={totalNumberOfPages}
243+
resultsPerPage={resultsPerPage}
242244
/>
243245
)}
244246
</div>

0 commit comments

Comments
 (0)