PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.12.0
GiveWP – Donation Plugin and Fundraising Platform v4.12.0
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 / DonationFormsAdminPage.php
give / src / DonationForms / V2 Last commit date
Actions 1 year ago DataTransferObjects 11 months ago Endpoints 8 months ago ListTable 8 months ago Models 1 year ago Properties 3 years ago Repositories 1 year ago ValueObjects 1 year ago resources 8 months ago DonationFormsAdminPage.php 1 year ago ServiceProvider.php 1 year ago
DonationFormsAdminPage.php
419 lines
1 <?php
2
3 namespace Give\DonationForms\V2;
4
5 use Give\Campaigns\CampaignsAdminPage;
6 use Give\Campaigns\Models\Campaign;
7 use Give\DonationForms\V2\ListTable\DonationFormsListTable;
8 use Give\FeatureFlags\OptionBasedFormEditor\OptionBasedFormEditor;
9 use Give\Helpers\EnqueueScript;
10 use Give\Helpers\Language;
11 use WP_Post;
12 use WP_REST_Request;
13
14 /**
15 * @since 2.19.0
16 */
17 class DonationFormsAdminPage
18 {
19 /**
20 * @var string
21 */
22 protected $apiRoot;
23 /**
24 * @var string
25 */
26 protected $apiNonce;
27 /**
28 * @var string
29 */
30 protected $adminUrl;
31 /**
32 * @var string
33 */
34 private $bannerActionUrl;
35 /**
36 * @var string
37 */
38 private $tooltipActionUrl;
39 /**
40 * @var string
41 */
42 protected $migrationApiRoot;
43
44 /**
45 * @var string
46 */
47 protected $defaultFormActionUrl;
48
49 public function __construct()
50 {
51 $this->apiRoot = esc_url_raw(rest_url('give-api/v2/admin/forms'));
52 $this->bannerActionUrl = admin_url('admin-ajax.php?action=givewp_show_onboarding_banner');
53 $this->tooltipActionUrl = admin_url('admin-ajax.php?action=givewp_show_upgraded_tooltip');
54 $this->defaultFormActionUrl = admin_url('admin-ajax.php?action=givewp_show_default_form_tooltip');
55 $this->migrationApiRoot = esc_url_raw(rest_url('give-api/v2/admin/forms/migrate'));
56 $this->apiNonce = wp_create_nonce('wp_rest');
57 $this->adminUrl = admin_url();
58 }
59
60 /**
61 * Register menu item
62 * @since 4.0.0 set submenu parent to empty string to hide "all forms" from admin menu
63 */
64 public function register()
65 {
66 remove_submenu_page('edit.php?post_type=give_forms', 'edit.php?post_type=give_forms');
67 add_submenu_page(
68 '',
69 esc_html__('Donation Forms', 'give'),
70 esc_html__('All Forms', 'give'),
71 'edit_give_forms',
72 'give-forms',
73 [$this, 'render'],
74 // Do not change the submenu position unless you have a strong reason.
75 // We use this position value to access this menu data in $submenu to add a custom class.
76 // Check DonationFormsAdminPage::highlightAllFormsMenuItem
77 0
78 );
79 }
80
81 /**
82 * @since 2.20.0
83 */
84 public function highlightAllFormsMenuItem()
85 {
86 global $submenu;
87 $pages = [
88 '/wp-admin/admin.php?page=give-forms', // Donation main menu page.
89 '/wp-admin/edit.php?post_type=give_forms', // Legacy donation form listing page.
90 ];
91
92 if (in_array($_SERVER['REQUEST_URI'], $pages)) {
93 // Add class to highlight 'All Forms' submenu.
94 $submenu['edit.php?post_type=give_forms'][0][4] = add_cssclass(
95 'current',
96 isset($submenu['edit.php?post_type=give_forms'][0][4]) ? $submenu['edit.php?post_type=give_forms'][0][4] : ''
97 );
98 }
99 }
100
101 /**
102 * Load scripts
103 *
104 * @since 3.22.0 Add locale support
105 */
106 public function loadScripts()
107 {
108 $data = [
109 'apiRoot' => $this->apiRoot,
110 'bannerActionUrl' => $this->bannerActionUrl,
111 'tooltipActionUrl' => $this->tooltipActionUrl,
112 'defaultFormActionUrl' => $this->defaultFormActionUrl,
113 'apiNonce' => $this->apiNonce,
114 'preload' => $this->preloadDonationForms(),
115 'authors' => $this->getAuthors(),
116 'table' => give(DonationFormsListTable::class)->toArray(),
117 'adminUrl' => $this->adminUrl,
118 'pluginUrl' => GIVE_PLUGIN_URL,
119 'showUpgradedTooltip' => !get_user_meta(get_current_user_id(), 'givewp-show-upgraded-tooltip', true),
120 'showDefaultFormTooltip' => !get_user_meta(get_current_user_id(), 'givewp-show-default-form-tooltip', true),
121 'supportedAddons' => $this->getSupportedAddons(),
122 'supportedGateways' => $this->getSupportedGateways(),
123 'isOptionBasedFormEditorEnabled' => OptionBasedFormEditor::isEnabled(),
124 'locale' => Language::getLocale(),
125 'swrConfig' => [
126 'revalidateOnFocus' => false
127 ],
128 ];
129
130 EnqueueScript::make('give-admin-donation-forms', 'build/assets/dist/js/give-admin-donation-forms.js')
131 ->loadInFooter()
132 ->registerTranslations()
133 ->registerLocalizeData('GiveDonationForms', $data)->enqueue();
134
135 wp_enqueue_style(
136 'give-admin-ui-font',
137 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@400..700&display=swap',
138 [],
139 null
140 );
141
142 wp_enqueue_style('givewp-design-system-foundation');
143 }
144
145 /**
146 * Load migration onboarding scripts
147 * @since 3.2.0
148 *
149 * @return void
150 */
151 public function loadMigrationScripts()
152 {
153 if ($this->isShowingAddV2FormPage()) {
154 EnqueueScript::make('give-add-v2form', 'build/assets/dist/js/give-add-v2form.js')
155 ->loadInFooter()
156 ->registerTranslations()
157 ->registerLocalizeData('GiveDonationForms', [
158 'supportedAddons' => $this->getSupportedAddons(),
159 'supportedGateways' => $this->getSupportedGateways(),
160 ])
161 ->enqueue();
162
163 wp_enqueue_style('givewp-design-system-foundation');
164 }
165
166 if ($this->isShowingEditV2FormPage()) {
167 $formId = (int)$_GET['post'];
168 $campaign = Campaign::findByFormId($formId);
169 EnqueueScript::make('give-edit-v2form', 'build/assets/dist/js/give-edit-v2form.js')
170 ->loadInFooter()
171 ->registerTranslations()
172 ->registerLocalizeData('GiveDonationForms', [
173 'supportedAddons' => $this->getSupportedAddons(),
174 'supportedGateways' => $this->getSupportedGateways(),
175 'migrationApiRoot' => $this->migrationApiRoot,
176 'apiNonce' => $this->apiNonce,
177 'isMigrated' => _give_is_form_migrated($formId),
178 'campaignUrl' => $campaign ? admin_url('edit.php?post_type=give_forms&page=give-campaigns&id=' . $campaign->id) : '',
179 ])
180 ->enqueue();
181
182 wp_enqueue_style('givewp-design-system-foundation');
183 }
184 }
185
186 /**
187 * Get first page of results from REST API to display as initial table data
188 *
189 * @since 4.0.0 Add campaignId parameter on campaigns page
190 * @since 2.20.0
191 * @return array
192 */
193 private function preloadDonationForms()
194 {
195 $queryParameters = [
196 'page' => 1,
197 'perPage' => 30,
198
199 ];
200
201 if (CampaignsAdminPage::isShowingDetailsPage()) {
202 $queryParameters['campaignId'] = isset($_GET['id']) ? absint($_GET['id']) : null;
203 }
204
205 $request = WP_REST_Request::from_url(
206 add_query_arg(
207 $queryParameters,
208 $this->apiRoot
209 )
210 );
211
212 return rest_do_request($request)->get_data();
213 }
214
215 /**
216 * Get a list of author user IDs and names
217 * @since 2.20.0
218 */
219 public function getAuthors()
220 {
221 $author_users = get_users([
222 'role__in' => ['author', 'administrator'],
223 ]);
224
225 return array_map(function ($user) {
226 return [
227 'id' => $user->ID,
228 'name' => $user->display_name,
229 ];
230 }, $author_users);
231 }
232
233 /**
234 * Render admin page
235 */
236 public function render()
237 {
238 echo '<div id="give-admin-donation-forms-root"></div>';
239 }
240
241 /**
242 * Render the migration guide box on the old edit donation form page
243 *
244 * @since 3.0.0
245 *
246 * @param WP_Post $post
247 *
248 * @return void
249 */
250 public function renderMigrationGuideBox(WP_Post $post)
251 {
252 if ($post->post_type === 'give_forms') {
253 echo '<div id="give-admin-edit-v2form"></div>';
254 }
255 }
256
257 /**
258 * Display a button on the old donation forms table that switches to the React view
259 *
260 * @since 2.20.0
261 */
262 public function renderReactSwitch()
263 {
264 ?>
265 <style>
266 .page-title-action:not(.switch-new-view) {
267 display: none;
268 }
269 </style>
270 <script type="text/javascript">
271 function showReactTable() {
272 fetch('<?php echo esc_url_raw(rest_url('give-api/v2/admin/forms/view?isLegacy=0')) ?>', {
273 method: 'GET',
274 headers: {
275 ['X-WP-Nonce']: '<?php echo wp_create_nonce('wp_rest') ?>'
276 }
277 })
278 .then((res) => {
279 window.location = window.location.href = '/wp-admin/edit.php?post_type=give_forms&page=give-forms';
280 });
281 }
282
283 jQuery(function() {
284 jQuery(jQuery('.wrap .wp-heading-inline')).after(
285 '<button class="page-title-action switch-new-view" onclick="showReactTable()"><?php _e(
286 'Switch to New View',
287 'give'
288 ) ?></button>'
289 );
290 jQuery('.page-title-action:not(.switch-new-view)').remove();
291 });
292 </script>
293 <?php
294 }
295
296 /**
297 * Helper function to determine if current page is Give Add-ons admin page
298 *
299 * @since 2.20.0
300 */
301 public static function isShowing(): bool
302 {
303 return isset($_GET['page']) && ($_GET['page'] === 'give-forms');
304 }
305
306 /**
307 * Helper function to determine if current page is the edit v2 form page
308 *
309 * @since 3.2.1 added global $post to isset
310 * @since 3.0.0
311 *
312 * @return bool
313 */
314 private function isShowingEditV2FormPage(): bool
315 {
316 return isset($_GET['action'], $GLOBALS['post']) && $_GET['action'] === 'edit' && $GLOBALS['post']->post_type === 'give_forms';
317 }
318
319 /**
320 * Helper function to determine if current page is the add v2 form page
321 *
322 * @since 3.0.0
323 *
324 * @return bool
325 */
326 private function isShowingAddV2FormPage(): bool
327 {
328 return !isset($_GET['page']) && isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms';
329 }
330
331 /**
332 * Helper function to determine if the current page is the legacy donation forms list page
333 *
334 * @since 2.20.1
335 */
336 public static function isShowingLegacyPage(): bool
337 {
338 return isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms' && empty($_GET['page']);
339 }
340
341 /**
342 * @since 2.20.0
343 * @return string
344 */
345 public static function getUrl(): string
346 {
347 return add_query_arg(['page' => 'give-forms'], admin_url('edit.php?post_type=give_forms'));
348 }
349
350 /**
351 * Get an array of supported addons
352 *
353 * @since 3.14.0 Added support for Razorpay
354 * @since 3.4.2 Added support for Gift Aid
355 * @since 3.3.0 Add support to the Funds and Designations addon
356 * @since 3.0.0
357 * @return array
358 */
359 public function getSupportedAddons(): array
360 {
361 $supportedAddons = [
362 'Recurring Donation' => class_exists('Give_Recurring'),
363 'Fee Recovery' => class_exists('Give_Fee_Recovery'),
364 'Currency Switcher' => class_exists('Give_Currency_Switcher'),
365 'Form Field Manager' => class_exists('Give_Form_Fields_Manager'),
366 'Tributes' => class_exists('Give_Tributes'),
367 'Google Analytics Donation Tracking' => class_exists('Give_Google_Analytics'),
368 'PDF Receipts' => class_exists('Give_PDF_Receipts'),
369 'Annual Receipts' => class_exists('Give_Annual_Receipts'),
370 'Webhooks' => defined('GIVE_WEBHOOKS_VERSION'),
371 'Email Reports' => defined('GIVE_EMAIL_REPORTS_VERSION'),
372 'Zapier' => defined('GIVE_ZAPIER_VERSION'),
373 'Salesforce' => defined('GIVE_SALESFORCE_VERSION'),
374 'Donation Upsells for WooCommerce' => class_exists('Give_WooCommerce'),
375 'Constant Contact' => class_exists('Give_Constant_Contact'),
376 'MailChimp' => class_exists('Give_MailChimp'),
377 'Manual Donations' => class_exists('Give_Manual_Donations'),
378 'Funds' => defined('GIVE_FUNDS_ADDON_NAME'),
379 'Peer-to-Peer' => defined('GIVE_P2P_NAME'),
380 'Gift Aid' => class_exists('Give_Gift_Aid'),
381 'Text-to-Give' => defined('GIVE_TEXT_TO_GIVE_ADDON_NAME'),
382 'Double the Donation' => defined('GIVE_DTD_NAME'),
383 'Per Form Gateways' => class_exists('Give_Per_Form_Gateways'),
384 'ConvertKit' => defined('GIVE_CONVERTKIT_VERSION'),
385 'ActiveCampaign' => class_exists('Give_ActiveCampaign'),
386 'Razorpay' => class_exists('Give_Razorpay_Gateway'),
387 ];
388
389 $output = [];
390
391 foreach ($supportedAddons as $name => $isInstalled) {
392 if ($isInstalled) {
393 $output[] = $name;
394 }
395 }
396
397 return $output;
398 }
399
400 /**
401 * Get an array of supported gateways
402 *
403 * @since 3.0.0
404 * @return array
405 */
406 public function getSupportedGateways(): array
407 {
408 $gateways = give_get_payment_gateways();
409 $supportedGateways = array_intersect_key($gateways, give()->gateways->getPaymentGateways(3));
410
411 ksort($supportedGateways);
412 unset($supportedGateways['manual']);
413
414 return array_map(function ($gateway) {
415 return $gateway['admin_label'];
416 }, $supportedGateways);
417 }
418 }
419