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