Skip to content

Commit d655ee9

Browse files
authored
Add support to go back to prev page (#397)
1 parent dc418ec commit d655ee9

File tree

3 files changed

+62
-24
lines changed

3 files changed

+62
-24
lines changed

components/Pagination.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { HStack, Text, IconButton, Input } from '@chakra-ui/react'; // Chakra UI
22
import { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons'; // Chakra UI Icons
3-
import { useState } from 'react';
3+
import { useEffect, useState } from 'react';
44

55
type Props = {
66
readonly pageSize: number; // Number of items per page
@@ -25,6 +25,10 @@ export default function Pagination(props: Props) {
2525

2626
const [inputValue, setInputValue] = useState<string | number>(pageNumber + 1); // Display page number as 1-based index
2727

28+
useEffect(() => {
29+
setInputValue(pageNumber + 1);
30+
}, [pageNumber]);
31+
2832
/**
2933
* Go to the next page if possible, and invoke callback if defined
3034
* `pageNumber + 1` moves to the next page (zero-based index)

components/admin/requests/Header.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,10 @@ export default function RequestHeader({
9393

9494
const [backLink, setBackLink] = useState('/admin');
9595
const generateBackLink = () => {
96-
let status;
9796
const routerQuery = router.query;
98-
if (routerQuery === undefined || routerQuery.origin === undefined) {
99-
status = applicationStatus;
100-
} else {
101-
status = routerQuery.origin;
102-
}
103-
setBackLink(`/admin?tab=${status}`);
97+
const status = typeof routerQuery.tab === 'string' ? routerQuery.tab : applicationStatus;
98+
const page = typeof routerQuery.page === 'string' ? routerQuery.page : '0';
99+
setBackLink(`/admin?tab=${status}&page=${page}`);
104100
};
105101

106102
useEffect(() => {

pages/admin/index.tsx

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import Table from '@components/Table'; // Table component
2929
import Pagination from '@components/Pagination'; // Pagination component
3030
import RequestStatusBadge from '@components/admin/RequestStatusBadge'; //Status badge component
3131
import { useQuery } from '@tools/hooks/graphql'; //Apollo client
32-
import { useEffect, useState } from 'react'; // React
32+
import { useEffect, useRef, useState, useMemo } from 'react'; // React
3333
import {
3434
ApplicationRow,
3535
GetApplicationsRequest,
@@ -46,27 +46,42 @@ import EmptyMessage from '@components/EmptyMessage';
4646

4747
interface RouterQuery {
4848
tab?: string;
49+
page?: number;
4950
}
5051

51-
export const getTabIndex = (routerQuery: RouterQuery): number => {
52-
if (routerQuery === undefined || routerQuery.tab === undefined) {
53-
return 1;
52+
export const getTabPageIndex = (routerQuery: RouterQuery): [number, number] => {
53+
if (
54+
routerQuery === undefined ||
55+
routerQuery.tab === undefined ||
56+
routerQuery.page === undefined
57+
) {
58+
return [1, 0];
5459
}
60+
5561
const tabName = routerQuery.tab;
62+
let tabIndex = 1;
63+
5664
switch (tabName) {
5765
case 'ALL':
58-
return 0;
66+
tabIndex = 0;
67+
break;
5968
case 'PENDING':
60-
return 1;
69+
tabIndex = 1;
70+
break;
6171
case 'IN_PROGRESS':
62-
return 2;
72+
tabIndex = 2;
73+
break;
6374
case 'COMPLETED':
64-
return 3;
75+
tabIndex = 3;
76+
break;
6577
case 'REJECTED':
66-
return 4;
78+
tabIndex = 4;
79+
break;
6780
default:
68-
return 1;
81+
tabIndex = 1;
6982
}
83+
84+
return [tabIndex, Number(routerQuery.page)];
7085
};
7186

7287
const tabIndexToStatus: { [key: number]: ApplicationStatus | 'ALL' } = {
@@ -174,23 +189,37 @@ const Requests: NextPage = () => {
174189
// This will avoid firing a query for each key the user presses
175190
const debouncedSearchFilter = useDebounce<string>(searchFilter, 500);
176191

192+
const filters = useMemo(
193+
() => ({
194+
statusFilter,
195+
permitTypeFilter,
196+
requestTypeFilter,
197+
searchFilter,
198+
sortOrder,
199+
}),
200+
[statusFilter, permitTypeFilter, requestTypeFilter, searchFilter, sortOrder]
201+
);
202+
203+
const debouncedFilters = useDebounce(filters, 500);
204+
177205
// Data & pagination
178206
const [requestsData, setRequestsData] = useState<Array<ApplicationRow>>([]);
179207
const [pageNumber, setPageNumber] = useState(0);
180208
const [recordsCount, setRecordsCount] = useState(0);
181209

182210
// Tabs
183211
const [tabIndex, setTabIndex] = useState(0);
184-
const getTabFromRoute = (): number => {
185-
const index = getTabIndex(routerQuery);
212+
const getTabPageFromRoute = () => {
213+
const [index, page] = getTabPageIndex(routerQuery);
186214
setTabIndex(index);
215+
setPageNumber(page);
187216
return index;
188217
};
189218

190219
const handleTabChange = () => {
191220
const status = tabIndexToStatus[tabIndex];
192221
setStatusFilter(status === 'ALL' ? null : status);
193-
router.push({ query: { tab: status } });
222+
router.push({ query: { tab: status, page: pageNumber } });
194223
};
195224

196225
// Make query to applications resolver
@@ -239,9 +268,11 @@ const Requests: NextPage = () => {
239268
}
240269
);
241270

271+
const firstRender = useRef(true);
272+
242273
// Determine the active tab on page load based on the route
243274
useEffect(() => {
244-
getTabFromRoute();
275+
getTabPageFromRoute();
245276
}, []);
246277

247278
useEffect(() => {
@@ -251,9 +282,13 @@ const Requests: NextPage = () => {
251282

252283
// Set page number to 0 after every filter or sort change
253284
useEffect(() => {
285+
if (firstRender.current) {
286+
firstRender.current = false;
287+
return; // Skip resetting on first mount to allow resetting state
288+
}
254289
setPageNumber(0);
255290
refetch();
256-
}, [statusFilter, permitTypeFilter, requestTypeFilter, debouncedSearchFilter, sortOrder]);
291+
}, debouncedFilters);
257292

258293
return (
259294
<Layout>
@@ -291,6 +326,7 @@ const Requests: NextPage = () => {
291326
index={tabIndex}
292327
onChange={index => {
293328
setTabIndex(index);
329+
setPageNumber(0);
294330
}}
295331
>
296332
<TabList paddingX="24px" defaultIndex={1}>
@@ -423,7 +459,9 @@ const Requests: NextPage = () => {
423459
initialSort={sortOrder}
424460
onChangeSortOrder={setSortOrder}
425461
onRowClick={({ id }) =>
426-
router.push(`/admin/request/${id}?origin=${tabIndexToStatus[tabIndex]}`)
462+
router.push(
463+
`/admin/request/${id}?tab=${tabIndexToStatus[tabIndex]}&page=${pageNumber}`
464+
)
427465
}
428466
/>
429467
<Flex justifyContent="flex-end">

0 commit comments

Comments
 (0)