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