forked from canada-ca/tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPaginationButtons.js
More file actions
66 lines (64 loc) · 1.66 KB
/
PaginationButtons.js
File metadata and controls
66 lines (64 loc) · 1.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import React from 'react'
import { number, func } from 'prop-types'
import { Stack, Text, IconButton, Select } from '@chakra-ui/core'
export function PaginationButtons({
perPage,
total,
paginate,
currentPage,
setPerPage,
}) {
return (
<Stack isInline align="center">
<IconButton
icon="arrow-left"
onClick={() => paginate(1)}
disabled={currentPage <= 1}
aria-label="Skip to first page"
/>
<IconButton
icon="chevron-left"
onClick={() => paginate(currentPage - 1)}
disabled={currentPage <= 1}
aria-label="Previous page"
/>
<IconButton
icon="chevron-right"
onClick={() => paginate(currentPage + 1)}
disabled={currentPage >= Math.ceil(total / perPage)}
aria-label="Next page"
/>
<IconButton
icon="arrow-right"
onClick={() => paginate(Math.ceil(total / perPage))}
disabled={currentPage >= Math.ceil(total / perPage)}
aria-label="Skip to last page"
/>
<Text fontWeight="semibold">
Page {currentPage} of {Math.ceil(total / perPage)}
</Text>
{setPerPage && (
<Select
w="30"
value={perPage}
onChange={e => {
setPerPage(Number(e.target.value))
}}
>
{[5, 10, 20].map(perPage => (
<option key={perPage} value={perPage}>
Show {perPage}
</option>
))}
</Select>
)}
</Stack>
)
}
PaginationButtons.propTypes = {
perPage: number.isRequired,
total: number.isRequired,
paginate: func.isRequired,
currentPage: number.isRequired,
setPerPage: func,
}