PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.16.2
GiveWP – Donation Plugin and Fundraising Platform v3.16.2
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 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 / DonationForms / V2 / resources / components / DonationFormsListTable.tsx
give / src / DonationForms / V2 / resources / components Last commit date
Migration 1 year ago Onboarding 1 year ago DonationFormsListTable.tsx 1 year ago DonationFormsRowActions.tsx 1 year ago
DonationFormsListTable.tsx
281 lines
1 import {useState} from 'react';
2 import {__} from '@wordpress/i18n';
3 import {ListTableApi, ListTablePage} from '@givewp/components';
4 import {DonationFormsRowActions} from './DonationFormsRowActions';
5 import Onboarding, {OnboardingContext, OnboardingStateProps} from './Onboarding';
6 import styles from '@givewp/components/ListTable/ListTablePage/ListTablePage.module.scss';
7 import {BulkActionsConfig, ColumnFilterConfig, FilterConfig} from '@givewp/components/ListTable/ListTablePage';
8 import Select from '@givewp/components/ListTable/Select';
9 import {Interweave} from 'interweave';
10 import InterweaveSSR from '@givewp/components/ListTable/InterweaveSSR';
11 import BlankSlate from '@givewp/components/ListTable/BlankSlate';
12 import {CubeIcon} from '@givewp/components/AdminUI/Icons';
13
14 declare global {
15 interface Window {
16 GiveDonationForms: {
17 apiNonce: string;
18 bannerActionUrl: string;
19 tooltipActionUrl: string;
20 migrationApiRoot: string;
21 apiRoot: string;
22 authors: Array<{id: string | number; name: string}>;
23 table: {columns: Array<object>};
24 pluginUrl: string;
25 showUpgradedTooltip: boolean;
26 isMigrated: boolean;
27 supportedAddons: Array<string>;
28 supportedGateways: Array<string>;
29 };
30
31 GiveNextGen?: {
32 newFormUrl: string;
33 };
34 }
35 }
36
37 const API = new ListTableApi(window.GiveDonationForms);
38
39 const donationStatus = [
40 {
41 value: 'any',
42 text: __('All', 'give'),
43 },
44 {
45 value: 'publish',
46 text: __('Published', 'give'),
47 },
48 {
49 value: 'pending',
50 text: __('Pending', 'give'),
51 },
52 {
53 value: 'draft',
54 text: __('Draft', 'give'),
55 },
56 {
57 value: 'trash',
58 text: __('Trash', 'give'),
59 },
60 {
61 value: 'upgraded',
62 text: __('Upgraded', 'give'),
63 },
64 ];
65
66 const donationFormsFilters: Array<FilterConfig> = [
67 {
68 name: 'search',
69 type: 'search',
70 text: __('Search by name or ID', 'give'),
71 ariaLabel: __('Search donation forms', 'give'),
72 },
73 {
74 name: 'status',
75 type: 'select',
76 text: __('status', 'give'),
77 ariaLabel: __('Filter donation forms by status', 'give'),
78 options: donationStatus,
79 },
80 ];
81
82 const columnFilters: Array<ColumnFilterConfig> = [
83 {
84 column: 'title',
85 filter: (item) => {
86 if (item?.v3form) {
87 return (
88 <div className={styles.migratedForm}>
89 <div className={styles.tooltipContainer}>
90 <CubeIcon />
91 <div className={styles.tooltip}>{__('Uses the Visual Form Builder', 'give')}</div>
92 </div>
93 <Interweave attributes={{className: 'interweave'}} content={item?.title} />
94 </div>
95 );
96 }
97
98 return <Interweave attributes={{className: 'interweave'}} content={item?.title} />;
99 },
100 },
101 {
102 column: 'status',
103 filter: (item, column) => {
104 if (window.GiveDonationForms.showUpgradedTooltip && item?.status_raw === 'upgraded') {
105 return (
106 <div className={styles.upgradedForm}>
107 <div className={styles.tooltipContainer}>
108 <div className={styles.tooltip}>
109 {__(
110 'The name of this form is already associated with an upgraded form. You can safely delete this form',
111 'give'
112 )}
113 .
114 <div
115 className={styles.link}
116 onClick={(e) => {
117 e.currentTarget.parentElement.remove();
118 fetch(window.GiveDonationForms.tooltipActionUrl, {method: 'POST'});
119 }}
120 >
121 {__('Got it', 'give')}
122 </div>
123 </div>
124 </div>
125 <InterweaveSSR column={column} item={item} />
126 </div>
127 );
128 }
129
130 return <InterweaveSSR column={column} item={item} />;
131 },
132 },
133 ];
134
135 const donationFormsBulkActions: Array<BulkActionsConfig> = [
136 {
137 label: __('Edit', 'give'),
138 value: 'edit',
139 action: async (selected) => {
140 const authorSelect = document.getElementById('giveDonationFormsTableSetAuthor') as HTMLSelectElement;
141 const author = authorSelect.value;
142 const statusSelect = document.getElementById('giveDonationFormsTableSetStatus') as HTMLSelectElement;
143 const status = statusSelect.value;
144 if (!(author || status)) {
145 return {errors: [], successes: []};
146 }
147 const editParams = {
148 ids: selected.join(','),
149 author,
150 status,
151 };
152 return await API.fetchWithArgs('/edit', editParams, 'UPDATE');
153 },
154 confirm: (selected, names) => (
155 <>
156 <p>Donation forms to be edited:</p>
157 <ul role="document" tabIndex={0}>
158 {selected.map((id, index) => (
159 <li key={id}>
160 <Interweave content={names[index]} />
161 </li>
162 ))}
163 </ul>
164 <div className={styles.flexRow}>
165 <label htmlFor="giveDonationFormsTableSetAuthor">{__('Set form author', 'give')}</label>
166 <Select id="giveDonationFormsTableSetAuthor" style={{paddingInlineEnd: '2rem'}}>
167 <option value="">{__('Keep current author', 'give')}</option>
168 {window.GiveDonationForms.authors.map((author) => (
169 <option key={author.id} value={author.id}>
170 {author.name}
171 </option>
172 ))}
173 </Select>
174 </div>
175 <div className={styles.flexRow}>
176 <label htmlFor="giveDonationFormsTableSetStatus">{__('Set form status', 'give')}</label>
177 <Select id="giveDonationFormsTableSetStatus" style={{paddingInlineEnd: '2rem'}}>
178 <option value="">{__('Keep current status')}</option>
179 <option value="publish">{__('Published', 'give')}</option>
180 <option value="private">{__('Private', 'give')}</option>
181 <option value="pending">{__('Pending Review', 'give')}</option>
182 <option value="draft">{__('Draft', 'give')}</option>
183 </Select>
184 </div>
185 </>
186 ),
187 },
188 {
189 label: __('Delete', 'give'),
190 value: 'delete',
191 type: 'danger',
192 isVisible: (data, parameters) => parameters.status === 'trash' || !data?.trash,
193 action: async (selected) => await API.fetchWithArgs('/delete', {ids: selected.join(',')}, 'DELETE'),
194 confirm: (selected, names) => (
195 <div>
196 <p>{__('Really delete the following donation forms?', 'give')}</p>
197 <ul role="document" tabIndex={0}>
198 {selected.map((id, index) => (
199 <li key={id}>
200 <Interweave content={names[index]} />
201 </li>
202 ))}
203 </ul>
204 </div>
205 ),
206 },
207 {
208 label: __('Move to Trash', 'give'),
209 value: 'trash',
210 type: 'danger',
211 isVisible: (data, parameters) => parameters.status !== 'trash' && data?.trash,
212 action: async (selected) => await API.fetchWithArgs('/trash', {ids: selected.join(',')}, 'DELETE'),
213 confirm: (selected, names) => (
214 <div>
215 <p>{__('Really trash the following donation forms?', 'give')}</p>
216 <ul role="document" tabIndex={0}>
217 {selected.map((id, index) => (
218 <li key={id}>
219 <Interweave content={names[index]} />
220 </li>
221 ))}
222 </ul>
223 </div>
224 ),
225 },
226 ];
227
228 /**
229 * Displays a blank slate for the Forms table.
230 * @since 2.27.0
231 */
232 const ListTableBlankSlate = (
233 <BlankSlate
234 imagePath={`${window.GiveDonationForms.pluginUrl}/assets/dist/images/list-table/blank-slate-donation-forms-icon.svg`}
235 description={__('No donation forms', 'give')}
236 href={'https://docs.givewp.com/forms'}
237 linkText={__('GiveWP Forms', 'give')}
238 />
239 );
240
241 export default function DonationFormsListTable() {
242 const [state, setState] = useState<OnboardingStateProps>({
243 showFeatureNoticeDialog: false,
244 });
245
246 return (
247 <OnboardingContext.Provider value={[state, setState]}>
248 <ListTablePage
249 title={__('Donation Forms', 'give')}
250 singleName={__('donation form', 'give')}
251 pluralName={__('donation forms', 'give')}
252 rowActions={DonationFormsRowActions}
253 bulkActions={donationFormsBulkActions}
254 apiSettings={window.GiveDonationForms}
255 filterSettings={donationFormsFilters}
256 listTableBlankSlate={ListTableBlankSlate}
257 columnFilters={columnFilters}
258 banner={Onboarding}
259 >
260 <button
261 className={`button button-secondary ${styles.button} ${styles.buttonSecondary}`}
262 onClick={showLegacyDonationForms}
263 >
264 {__('Switch to Legacy View', 'give')}
265 </button>
266 <a
267 href={'edit.php?post_type=give_forms&page=givewp-form-builder'}
268 className={`button button-primary ${styles.button}`}
269 >
270 {__('Add Form', 'give')}
271 </a>
272 </ListTablePage>
273 </OnboardingContext.Provider>
274 );
275 }
276
277 const showLegacyDonationForms = async (event) => {
278 await API.fetchWithArgs('/view', {isLegacy: 1});
279 window.location.href = '/wp-admin/edit.php?post_type=give_forms';
280 };
281