PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.18.0
GiveWP – Donation Plugin and Fundraising Platform v4.18.0
4.18.0 4.17.0 4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 All 257 releases
give / src / Views / Components / ListTable / Pagination / index.tsx

index.tsx in GiveWP – Donation Plugin and Fundraising Platform 4.18.0, at src/Views/Components/ListTable/Pagination/index.tsx

119 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import PropTypes from 'prop-types';
2 import React from 'react';
3 import styles from './Pagination.module.scss';
4 import cx from 'classnames';
5 import {__, sprintf} from '@wordpress/i18n';
6
7 const Pagination = ({currentPage = 1, totalPages = 0, totalItems = -1, disabled = false, setPage = (n) => {}, singleName, pluralName}) => {
8
9 // @ts-ignore
10 const nextPage = parseInt(currentPage) + 1;
11 // @ts-ignore
12 const previousPage = parseInt(currentPage) - 1;
13
14 return (
15 <nav aria-label={sprintf(__('%s table', 'give'), pluralName)} className={styles.container}>
16 {totalItems >= 1 && (
17 <span>
18 {totalItems.toString() + ' '}
19 {totalItems == 1 ? singleName : pluralName}
20 </span>
21 )}
22 {1 < totalPages && (
23 <>
24 <button
25 className={cx(styles.navDirection, styles.navElement)}
26 aria-disabled={previousPage <= 1}
27 aria-label={__('first page')}
28 onClick={(e) => {
29 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
30 setPage(1);
31 }
32 }}
33 >
34 <span aria-hidden={true}>«</span>
35 </button>
36 <button
37 className={cx(styles.navDirection, styles.navElement)}
38 aria-disabled={previousPage <= 0}
39 aria-label={__('previous page')}
40 onClick={(e) => {
41 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
42 // @ts-ignore
43 setPage(parseInt(currentPage) - 1);
44 }
45 }}
46 >
47 <span aria-hidden={true}>‹</span>
48 </button>
49 <span>
50 <label htmlFor={styles.currentPage} className={styles.visuallyHidden}>
51 {__('Current Page', 'give')}
52 </label>
53 <select
54 className={styles.navElement}
55 id={styles.currentPage}
56 name={'currentPageSelector'}
57 value={currentPage}
58 onChange={(e) => {
59 const page = Number(e.target.value);
60 setPage(page);
61 }}
62 >
63 {Array.from({length: totalPages}, (_, i) => i + 1).map((pageNumber) => (
64 <option key={pageNumber} value={pageNumber}>
65 {pageNumber}
66 </option>
67 ))}
68 </select>
69 <span>
70 {' '}
71 {__('of', 'give')} <span>{totalPages}</span>{' '}
72 </span>
73 </span>
74 <button
75 className={cx(styles.navDirection, styles.navElement)}
76 aria-disabled={nextPage > totalPages}
77 aria-label={__('next page')}
78 onClick={(e) => {
79 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
80 // @ts-ignore
81 setPage(parseInt(currentPage) + 1);
82 }
83 }}
84 >
85 <span aria-hidden={true}>›</span>
86 </button>
87 <button
88 className={cx(styles.navDirection, styles.navElement)}
89 aria-disabled={nextPage > totalPages - 1}
90 aria-label={__('final page')}
91 onClick={(e) => {
92 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
93 setPage(totalPages);
94 }
95 }}
96 >
97 <span aria-hidden={true}>»</span>
98 </button>
99 </>
100 )}
101 </nav>
102 );
103 };
104
105 Pagination.propTypes = {
106 // Current page
107 currentPage: PropTypes.number.isRequired,
108 // Total number of pages
109 totalPages: PropTypes.number.isRequired,
110 // Total number of items
111 totalItems: PropTypes.number,
112 // Function to set the next/previous page
113 setPage: PropTypes.func.isRequired,
114 // Is pagination disabled
115 disabled: PropTypes.bool.isRequired,
116 };
117
118 export default Pagination;
119