PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.12.2
GiveWP – Donation Plugin and Fundraising Platform v3.12.2
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 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Views / Components / ListTable / Pagination / index.tsx
give / src / Views / Components / ListTable / Pagination Last commit date
Pagination.module.scss 3 years ago index.tsx 3 years ago
index.tsx
128 lines
1 import PropTypes from 'prop-types';
2 import {useState, useEffect} 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, totalPages, totalItems = -1, disabled, setPage, singleName, pluralName}) => {
8 const [pageInput, setPageInput] = useState(1);
9
10 useEffect(() => {
11 setPageInput(currentPage);
12 }, [currentPage]);
13
14 const nextPage = parseInt(currentPage) + 1;
15 const previousPage = parseInt(currentPage) - 1;
16
17 return (
18 <nav aria-label={sprintf(__('%s table', 'give'), pluralName)} className={styles.container}>
19 {totalItems >= 1 && (
20 <span>
21 {totalItems.toString() + ' '}
22 {totalItems == 1 ? singleName : pluralName}
23 </span>
24 )}
25 {1 < totalPages && (
26 <>
27 <button
28 className={cx(styles.navDirection, styles.navElement)}
29 aria-disabled={previousPage <= 1}
30 aria-label={__('first page')}
31 onClick={(e) => {
32 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
33 setPage(1);
34 }
35 }}
36 >
37 <span aria-hidden={true}>«</span>
38 </button>
39 <button
40 className={cx(styles.navDirection, styles.navElement)}
41 aria-disabled={previousPage <= 0}
42 aria-label={__('previous page')}
43 onClick={(e) => {
44 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
45 setPage(parseInt(currentPage) - 1);
46 }
47 }}
48 >
49 <span aria-hidden={true}></span>
50 </button>
51 <span>
52 <label htmlFor={styles.currentPage} className={styles.visuallyHidden}>
53 {__('Current Page', 'give')}
54 </label>
55 <input
56 className={styles.navElement}
57 id={styles.currentPage}
58 name={'currentPageSelector'}
59 type="number"
60 min={1}
61 max={totalPages}
62 value={pageInput}
63 onChange={(e) => {
64 const cleanValue = parseInt(e.target.value.replace(/[^0-9]/, ''));
65 const page = Number(cleanValue);
66 setPageInput(cleanValue);
67 if (totalPages >= page && page > 0) {
68 setPage(page);
69 }
70 }}
71 />
72 <span>
73 {' '}
74 {__('of', 'give')} <span>{totalPages}</span>{' '}
75 </span>
76 </span>
77 <button
78 className={cx(styles.navDirection, styles.navElement)}
79 aria-disabled={nextPage > totalPages}
80 aria-label={__('next page')}
81 onClick={(e) => {
82 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
83 setPage(parseInt(currentPage) + 1);
84 }
85 }}
86 >
87 <span aria-hidden={true}></span>
88 </button>
89 <button
90 className={cx(styles.navDirection, styles.navElement)}
91 aria-disabled={nextPage > totalPages - 1}
92 aria-label={__('final page')}
93 onClick={(e) => {
94 if (e.currentTarget.getAttribute('aria-disabled') === 'false') {
95 setPage(totalPages);
96 }
97 }}
98 >
99 <span aria-hidden={true}>»</span>
100 </button>
101 </>
102 )}
103 </nav>
104 );
105 };
106
107 Pagination.propTypes = {
108 // Current page
109 currentPage: PropTypes.number.isRequired,
110 // Total number of pages
111 totalPages: PropTypes.number.isRequired,
112 // Total number of items
113 totalItems: PropTypes.number,
114 // Function to set the next/previous page
115 setPage: PropTypes.func.isRequired,
116 // Is pagination disabled
117 disabled: PropTypes.bool.isRequired,
118 };
119
120 Pagination.defaultProps = {
121 currentPage: 1,
122 totalPages: 0,
123 setPage: () => {},
124 disabled: false,
125 };
126
127 export default Pagination;
128