Skip to content

Commit ad5d5bc

Browse files
committed
make the pagination controls compatible with both react table props and local props criteria
1 parent dd1b013 commit ad5d5bc

6 files changed

Lines changed: 90 additions & 86 deletions

File tree

src/components/PaginationControl/PaginationControl.jsx

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
11
import { FormattedMessage, injectIntl } from "react-intl";
22
import messages from "./Messages";
33

4-
function PaginationControl({ currentPage, totalPages, pageSize, gotoPage, setPageSize, intl }) {
5-
const canPreviousPage = currentPage > 0;
6-
const canNextPage = currentPage < totalPages - 1;
7-
8-
const previousPage = () => gotoPage(Math.max(currentPage - 1, 0));
9-
const nextPage = () => gotoPage(Math.min(currentPage + 1, totalPages - 1));
10-
4+
function PaginationControl({
5+
currentPage,
6+
pageCount,
7+
pageSize,
8+
gotoPage,
9+
setPageSize,
10+
previousPage,
11+
nextPage,
12+
intl,
13+
}) {
1114
return (
1215
<div className="mr-flex mr-flex-wrap mr-justify-center mr-items-center mr-gap-2 md:mr-gap-3 mr-mt-6 mr-text-white">
1316
<button
1417
className="mr-button mr-button--small mr-mb-2"
1518
onClick={() => gotoPage(0)}
16-
disabled={!canPreviousPage}
19+
disabled={!(currentPage > 0)}
1720
>
1821
{"<< "}
1922
<FormattedMessage {...messages.first} />
2023
</button>
2124
<button
2225
className="mr-button mr-button--small mr-mb-2"
23-
onClick={() => previousPage()}
24-
disabled={!canPreviousPage}
26+
onClick={previousPage}
27+
disabled={!(currentPage > 0)}
2528
>
2629
{"< "}
2730
<FormattedMessage {...messages.previous} />
@@ -32,24 +35,24 @@ function PaginationControl({ currentPage, totalPages, pageSize, gotoPage, setPag
3235
className="mr-input mr-px-1 mr-py-0 mr-w-12 md:mr-w-16"
3336
type="number"
3437
min={1}
35-
max={totalPages}
38+
max={pageCount}
3639
value={currentPage + 1}
3740
onChange={(e) => gotoPage(e.target.value ? Number(e.target.value) - 1 : 0)}
3841
/>{" "}
39-
<FormattedMessage {...messages.of} /> {totalPages}
42+
<FormattedMessage {...messages.of} /> {pageCount}
4043
</span>
4144
<button
4245
className="mr-button mr-button--small mr-mb-2"
43-
onClick={() => nextPage()}
44-
disabled={!canNextPage}
46+
onClick={nextPage}
47+
disabled={!(currentPage < pageCount - 1)}
4548
>
4649
<FormattedMessage {...messages.next} />
4750
{" >"}
4851
</button>
4952
<button
5053
className="mr-button mr-button--small mr-mb-2"
51-
onClick={() => gotoPage(totalPages - 1)}
52-
disabled={!canNextPage}
54+
onClick={() => gotoPage(pageCount - 1)}
55+
disabled={!(currentPage < pageCount - 1)}
5356
>
5457
<FormattedMessage {...messages.last} />
5558
{" >>"}
@@ -72,4 +75,4 @@ function PaginationControl({ currentPage, totalPages, pageSize, gotoPage, setPag
7275
);
7376
}
7477

75-
export default injectIntl(PaginationControl);
78+
export default injectIntl(PaginationControl);

src/components/SuperAdmin/MetricsTable.jsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,14 @@ const MetricsTable = (props) => {
136136
</table>
137137
</TableWrapper>
138138
<PaginationControl
139-
currentPage={pageIndex}
140-
totalPages={Math.ceil(data.length / pageSize)}
141-
pageSize={pageSize}
142-
gotoPage={gotoPage}
143-
setPageSize={setPageSize}
139+
currentPage={pageIndex}
140+
pageCount={Math.ceil(data.length / pageSize)}
141+
pageSize={pageSize}
142+
gotoPage={gotoPage}
143+
setPageSize={setPageSize}
144+
previousPage={() => gotoPage(pageIndex - 1)}
145+
nextPage={() => gotoPage(pageIndex + 1)}
146+
intl={props.intl}
144147
/>
145148
</section>
146149
);

src/components/TaskAnalysisTable/TaskAnalysisTable.jsx

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { Link } from "react-router-dom";
1010
import {
1111
useExpanded,
1212
useFilters,
13-
usePagination,
1413
useResizeColumns,
1514
useSortBy,
1615
useTable,
@@ -94,7 +93,7 @@ export const TaskAnalysisTableInternal = (props) => {
9493
const [showConfigureColumns, setShowConfigureColumns] = useState(false);
9594

9695
const handleStateChange = useCallback(
97-
({ sortBy, filters, pageIndex }) => {
96+
({ sortBy, filters }) => {
9897
const newCriteria = {
9998
sortCriteria:
10099
sortBy.length > 0
@@ -124,7 +123,6 @@ export const TaskAnalysisTableInternal = (props) => {
124123
[filter.id]: value,
125124
};
126125
}, {}),
127-
page: pageIndex,
128126
};
129127

130128
const currentCriteria = _pick(props.criteria, Object.keys(newCriteria));
@@ -227,7 +225,7 @@ export const TaskAnalysisTableInternal = (props) => {
227225
getTableProps,
228226
getTableBodyProps,
229227
headerGroups,
230-
page,
228+
rows,
231229
prepareRow,
232230
state: { sortBy, filters },
233231
} = useTable(
@@ -257,7 +255,6 @@ export const TaskAnalysisTableInternal = (props) => {
257255
},
258256
]
259257
: [],
260-
pageIndex: props.page ?? 0,
261258
},
262259
disableResizing: false,
263260
disableMultiSort: true,
@@ -267,13 +264,12 @@ export const TaskAnalysisTableInternal = (props) => {
267264
useSortBy,
268265
useResizeColumns,
269266
useExpanded,
270-
usePagination,
271267
);
272268

273269
// Update parent when table state changes
274270
useEffect(() => {
275-
handleStateChange({ sortBy, filters, pageIndex: props.page ?? 0 });
276-
}, [sortBy, filters, props.page]);
271+
handleStateChange({ sortBy, filters });
272+
}, [sortBy, filters]);
277273

278274
return (
279275
<Fragment>
@@ -297,7 +293,7 @@ export const TaskAnalysisTableInternal = (props) => {
297293
<table {...getTableProps()} className={tableStyles}>
298294
<thead>{renderTableHeader(headerGroups)}</thead>
299295
<tbody {...getTableBodyProps()}>
300-
{page.map((row) => {
296+
{rows.map((row) => {
301297
prepareRow(row);
302298
return (
303299
<Fragment key={row.original.id}>
@@ -325,12 +321,20 @@ export const TaskAnalysisTableInternal = (props) => {
325321
</TableWrapper>
326322

327323
<PaginationControl
328-
currentPage={props.page ?? 0}
329-
totalPages={Math.ceil((props.totalTaskCount ?? 0) / props.pageSize)}
330-
pageSize={props.pageSize}
331-
gotoPage={(page) => handleStateChange({ sortBy, filters, pageIndex: page })}
332-
setPageSize={props.changePageSize}
333-
/>
324+
currentPage={props.criteria?.page || 0}
325+
pageCount={Math.ceil((props.totalTaskCount || 0) / (props.criteria?.pageSize || 20))}
326+
pageSize={props.criteria?.pageSize || 20}
327+
gotoPage={(page) => props.updateCriteria({ page })}
328+
setPageSize={(pageSize) => props.updateCriteria({ pageSize, page: 0 })}
329+
previousPage={() =>
330+
props.updateCriteria({ page: Math.max(0, (props.criteria?.page || 0) - 1) })
331+
}
332+
nextPage={() => {
333+
const maxPage =
334+
Math.ceil((props.totalTaskCount || 0) / (props.criteria?.pageSize || 20)) - 1;
335+
props.updateCriteria({ page: Math.min(maxPage, (props.criteria?.page || 0) + 1) });
336+
}}
337+
/>
334338
</section>
335339

336340
{Number.isFinite(openComments) && (

src/pages/Inbox/Inbox.jsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,14 @@ const Inbox = (props) => {
479479
</table>
480480
</TableWrapper>
481481
<PaginationControl
482-
currentPage={pageIndex}
483-
totalPages={totalPages}
484-
pageSize={pageSize}
485-
gotoPage={gotoPage}
486-
setPageSize={setPageSize}
482+
currentPage= {pageIndex}
483+
pageCount={totalPages}
484+
pageSize={pageSize}
485+
gotoPage={gotoPage}
486+
setPageSize={setPageSize}
487+
previousPage={() => gotoPage(pageIndex - 1)}
488+
nextPage={() => gotoPage(pageIndex + 1)}
489+
intl={props.intl}
487490
/>
488491
</section>
489492

src/pages/Review/TasksReview/TasksReviewTable.jsx

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import _pull from "lodash/pull";
1111
import { Fragment, useCallback, useEffect, useMemo, useState } from "react";
1212
import { FormattedDate, FormattedMessage, FormattedTime } from "react-intl";
1313
import { Link } from "react-router-dom";
14-
import { useFilters, usePagination, useResizeColumns, useSortBy, useTable } from "react-table";
14+
import { useFilters, useResizeColumns, useSortBy, useTable } from "react-table";
1515
import ConfigureColumnsModal from "../../../components/ConfigureColumnsModal/ConfigureColumnsModal";
1616
import Dropdown from "../../../components/Dropdown/Dropdown";
1717
import MapPane from "../../../components/EnhancedMap/MapPane/MapPane";
@@ -179,14 +179,12 @@ export const TaskReviewTable = (props) => {
179179
},
180180
(taskId) => setOpenComments(taskId),
181181
props.reviewCriteria,
182-
props.pageSize,
183182
),
184183
[
185184
updateChallengeFilterIds,
186185
updateProjectFilterIds,
187186
challengeFilterIds,
188187
projectFilterIds,
189-
props.pageSize,
190188
invertFieldsOnLength,
191189
],
192190
);
@@ -222,21 +220,17 @@ export const TaskReviewTable = (props) => {
222220
filter.value !== null && filter.value !== undefined && filter.value !== "",
223221
)
224222
: [],
225-
pageSize: props.pageSize,
226-
pageIndex: props.reviewCriteria?.page || 0,
227223
}),
228-
[initialSort, props.reviewCriteria?.filters, props.reviewCriteria?.page, props.pageSize],
224+
[initialSort, props.reviewCriteria?.filters, props.reviewCriteria?.page],
229225
);
230226

231227
const {
232228
getTableProps,
233229
getTableBodyProps,
234230
headerGroups,
235-
page,
231+
rows,
236232
prepareRow,
237-
state: { sortBy, filters, pageIndex, pageSize },
238-
gotoPage,
239-
setPageSize,
233+
state: { sortBy, filters },
240234
setAllFilters,
241235
setSortBy,
242236
} = useTable(
@@ -252,8 +246,6 @@ export const TaskReviewTable = (props) => {
252246
manualFilters: true,
253247
manualPagination: true,
254248
disableSortRemove: true,
255-
pageCount: Math.ceil((props.reviewData?.totalCount ?? 0) / props.pageSize),
256-
pageSize: props.pageSize,
257249
initialState,
258250
disableResizing: false,
259251
disableMultiSort: true,
@@ -262,7 +254,6 @@ export const TaskReviewTable = (props) => {
262254
useFilters,
263255
useSortBy,
264256
useResizeColumns,
265-
usePagination,
266257
);
267258

268259
const handleClearFilters = () => {
@@ -277,7 +268,6 @@ export const TaskReviewTable = (props) => {
277268

278269
setChallengeFilterIds([FILTER_SEARCH_ALL]);
279270
setProjectFilterIds([FILTER_SEARCH_ALL]);
280-
gotoPage(0);
281271

282272
const defaultSort = {
283273
sortCriteria: {
@@ -362,29 +352,24 @@ export const TaskReviewTable = (props) => {
362352
sortCriteria,
363353
filters,
364354
page: tableState?.page || 0,
365-
pageSize: tableState?.pageSize || pageSize,
366355
boundingBox: props.reviewCriteria?.boundingBox,
367356
includeTags: !!props.addedColumns?.tags,
368357
savedChallengesOnly: props.reviewCriteria?.savedChallengesOnly || false,
369358
excludeOtherReviewers: props.reviewCriteria?.excludeOtherReviewers || false,
370359
invertFields: props.reviewCriteria?.invertFields || {},
371360
});
372361
},
373-
[challengeFilterIds, projectFilterIds, props.updateReviewTasks, props.addedColumns, pageSize],
362+
[challengeFilterIds, projectFilterIds, props.updateReviewTasks, props.addedColumns],
374363
);
375364

376365
useEffect(() => {
377366
handleTableStateUpdate({
378367
sorted: sortBy.map((sort) => ({ id: sort.id, desc: sort.desc })),
379368
filtered: filters.map((filter) => ({ id: filter.id, value: filter.value })),
380-
page: pageIndex,
381-
pageSize: pageSize,
382369
});
383370
}, [
384371
sortBy,
385372
filters,
386-
pageIndex,
387-
pageSize,
388373
challengeFilterIds,
389374
projectFilterIds,
390375
handleTableStateUpdate,
@@ -534,7 +519,7 @@ export const TaskReviewTable = (props) => {
534519
<table {...getTableProps()} className={tableStyles}>
535520
<thead>{renderTableHeader(headerGroups)}</thead>
536521
<tbody {...getTableBodyProps()}>
537-
{page.map((row) => {
522+
{rows.map((row) => {
538523
prepareRow(row);
539524
return (
540525
<tr className={rowStyles} {...row.getRowProps()} key={row.id}>
@@ -562,21 +547,20 @@ export const TaskReviewTable = (props) => {
562547
</table>
563548
</TableWrapper>
564549
<PaginationControl
565-
currentPage={pageIndex}
566-
totalPages={Math.ceil((props.reviewData?.totalCount ?? 0) / props.pageSize)}
567-
pageSize={pageSize}
568-
gotoPage={gotoPage}
569-
setPageSize={(size) => {
570-
setPageSize(size);
571-
gotoPage(0);
572-
handleTableStateUpdate({
573-
sorted: sortBy.map((sort) => ({ id: sort.id, desc: sort.desc })),
574-
filtered: filters.map((filter) => ({ id: filter.id, value: filter.value })),
575-
page: 0,
576-
pageSize: size,
577-
});
578-
}}
579-
/>
550+
currentPage={props.reviewCriteria?.page || 0}
551+
pageCount={Math.ceil((props.reviewData?.totalCount || 0) / (props.reviewCriteria?.pageSize || 20))}
552+
pageSize={props.reviewCriteria?.pageSize || 20}
553+
gotoPage={(page) => props.updateReviewTasks({ page })}
554+
setPageSize={(pageSize) => props.updateReviewTasks({ pageSize, page: 0 })}
555+
previousPage={() =>
556+
props.updateReviewTasks({ page: Math.max(0, (props.reviewCriteria?.page || 0) - 1) })
557+
}
558+
nextPage={() => {
559+
const maxPage =
560+
Math.ceil((props.reviewData?.totalCount || 0) / (props.reviewCriteria?.pageSize || 20)) - 1;
561+
props.updateReviewTasks({ page: Math.min(maxPage, (props.reviewCriteria?.page || 0) + 1) });
562+
}}
563+
/>
580564
</div>
581565
</div>
582566
{Number.isFinite(openComments) && (

0 commit comments

Comments
 (0)