PluginProbe
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz / 1.4.3
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz v1.4.3
2.12.6 2.12.5 2.12.4 2.12.3 2.12.2 2.12.1 2.12.0 2.11.1 2.11.0 2.10.1 2.10.0 2.9.1 2.9.0 2.8.2 2.8.1 2.7.0 2.7.1 2.8.0 trunk 0.0.10 0.0.11 0.0.12 0.0.13 0.0.2 0.0.3 All 96 releases
sureforms / admin / admin.php

admin.php in SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz 1.4.3, at admin/admin.php

868 lines 31.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Admin Class.
4 *
5 * @package sureforms.
6 */
7
8 namespace SRFM\Admin;
9
10 use SRFM\Admin\Views\Entries_List_Table;
11 use SRFM\Admin\Views\Single_Entry;
12 use SRFM\Inc\AI_Form_Builder\AI_Helper;
13 use SRFM\Inc\Database\Tables\Entries;
14 use SRFM\Inc\Helper;
15 use SRFM\Inc\Post_Types;
16 use SRFM\Inc\Traits\Get_Instance;
17
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit; // Exit if accessed directly.
20 }
21 /**
22 * Admin handler class.
23 *
24 * @since 0.0.1
25 */
26 class Admin {
27 use Get_Instance;
28
29 /**
30 * Class constructor.
31 *
32 * @return void
33 * @since 0.0.1
34 */
35 public function __construct() {
36 add_action( 'admin_menu', [ $this, 'add_menu_page' ], 9 );
37 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
38 add_action( 'admin_menu', [ $this, 'settings_page' ] );
39 add_action( 'admin_menu', [ $this, 'add_new_form' ] );
40 add_filter( 'plugin_action_links', [ $this, 'add_settings_link' ], 10, 2 );
41 add_action( 'enqueue_block_assets', [ $this, 'enqueue_styles' ] );
42 add_action( 'admin_head', [ $this, 'enqueue_header_styles' ] );
43 add_filter( 'admin_body_class', [ $this, 'admin_template_picker_body_class' ] );
44
45 // this action is used to restrict Spectra's quick action bar on SureForms CPTS.
46 add_action( 'uag_enable_quick_action_sidebar', [ $this, 'restrict_spectra_quick_action_bar' ] );
47
48 add_action( 'current_screen', [ $this, 'enable_gutenberg_for_sureforms' ], 100 );
49 add_action( 'admin_notices', [ $this, 'srfm_pro_version_compatibility' ] );
50
51 // Handle entry actions.
52 add_action( 'admin_init', [ $this, 'handle_entry_actions' ] );
53 add_action( 'admin_notices', [ Entries_List_Table::class, 'display_bulk_action_notice' ] );
54
55 // This action enqueues translations for NPS Survey library.
56 // A better solution will be required from library to resolve plugin conflict.
57 add_action(
58 'admin_footer',
59 static function() {
60 Helper::register_script_translations( 'nps-survey-script' );
61 },
62 1000
63 );
64 // Enfold theme compatibility to enable block editor for SureForms post type.
65 add_filter( 'avf_use_block_editor_for_post', [ $this, 'enable_block_editor_in_enfold_theme' ] );
66
67 // Add action links to the plugin page.
68 add_filter( 'plugin_action_links_' . SRFM_BASENAME, [ $this, 'add_action_links' ] );
69 add_filter( 'wpforms_current_user_can', [ $this, 'disable_wpforms_capabilities' ], 10, 3 );
70 }
71
72 /**
73 * Show action on plugin page.
74 *
75 * @param array $links links.
76 * @return array
77 * @since 1.4.2
78 */
79 public function add_action_links( $links ) {
80 if ( ! defined( 'SRFM_PRO_FILE' ) && ! file_exists( WP_PLUGIN_DIR . '/sureforms-pro/sureforms-pro.php' ) ) {
81 // Display upsell link if SureForms Pro is not installed.
82 $upsell_link = add_query_arg(
83 [
84 'utm_medium' => 'plugin-list',
85 ],
86 Helper::get_sureforms_website_url( 'pricing' )
87 );
88 $links[] = '<a href="' . esc_url( $upsell_link ) . '" target="_blank" rel="noreferrer" class="sureforms-plugins-go-pro">' . esc_html__( 'Get SureForms Pro', 'sureforms' ) . '</a>';
89 }
90
91 return $links;
92 }
93
94 /**
95 * Enable block editor in Enfold theme for SureForms post type.
96 *
97 * @param bool $use_block_editor Whether to use block editor.
98 * @since 1.3.1
99 */
100 public function enable_block_editor_in_enfold_theme( $use_block_editor ) {
101 // if SureForms form post type then return true.
102 if ( SRFM_FORMS_POST_TYPE === get_current_screen()->post_type ) {
103 return true;
104 }
105 return $use_block_editor;
106 }
107
108 /**
109 * Enable Gutenberg for SureForms associated post types.
110 *
111 * @since 0.0.10
112 */
113 public function enable_gutenberg_for_sureforms() {
114 /**
115 * Check if the classic editor is enabled from Classic Editor plugin settings or Divi settings.
116 */
117 if ( 'block' === get_option( 'classic-editor-replace' ) || 'on' === get_option( 'et_enable_classic_editor' ) ) {
118 return;
119 }
120
121 $srfm_post_types = apply_filters( 'srfm_enable_gutenberg_post_types', [ SRFM_FORMS_POST_TYPE ] );
122
123 if ( in_array( get_current_screen()->post_type, $srfm_post_types, true ) ) {
124 add_filter( 'use_block_editor_for_post_type', '__return_true', 110 );
125 add_filter( 'gutenberg_can_edit_post_type', '__return_true', 110 );
126 }
127 }
128
129 /**
130 * Sureforms editor header styles.
131 *
132 * @since 0.0.1
133 */
134 public function enqueue_header_styles() {
135 $current_screen = get_current_screen();
136 $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
137 $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
138
139 $css_uri = SRFM_URL . 'assets/css/' . $dir_name . '/';
140
141 /* RTL */
142 if ( is_rtl() ) {
143 $file_prefix .= '-rtl';
144 }
145
146 if ( 'sureforms_form' === $current_screen->id ) {
147 wp_enqueue_style( SRFM_SLUG . '-editor-header-styles', $css_uri . 'header-styles' . $file_prefix . '.css', [], SRFM_VER );
148 }
149 }
150
151 /**
152 * Add menu page.
153 *
154 * @return void
155 * @since 0.0.1
156 */
157 public function add_menu_page() {
158 if ( ! current_user_can( 'manage_options' ) ) {
159 return;
160 }
161
162 $capability = 'manage_options';
163 $menu_slug = 'sureforms_menu';
164
165 $logo = file_get_contents( plugin_dir_path( SRFM_FILE ) . 'images/icon.svg' );
166 add_menu_page(
167 __( 'SureForms', 'sureforms' ),
168 __( 'SureForms', 'sureforms' ),
169 'edit_others_posts',
170 $menu_slug,
171 static function () {
172 },
173 'data:image/svg+xml;base64,' . base64_encode( $logo ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
174 30
175 );
176
177 // Add the Dashboard Submenu.
178 add_submenu_page(
179 $menu_slug,
180 __( 'Dashboard', 'sureforms' ),
181 __( 'Dashboard', 'sureforms' ),
182 $capability,
183 $menu_slug,
184 [ $this, 'render_dashboard' ]
185 );
186 }
187
188 /**
189 * Add Settings page.
190 *
191 * @return void
192 * @since 0.0.1
193 */
194 public function settings_page() {
195 $callback = [ $this, 'settings_page_callback' ];
196 add_submenu_page(
197 'sureforms_menu',
198 __( 'Settings', 'sureforms' ),
199 __( 'Settings', 'sureforms' ),
200 'edit_others_posts',
201 'sureforms_form_settings',
202 $callback
203 );
204
205 // Get the current submenu page.
206 $submenu_page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- $_GET['page'] does not provide nonce.
207
208 if ( ! isset( $_GET['tab'] ) && 'sureforms_form_settings' === $submenu_page ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- $_GET['page'] does not provide nonce.
209 wp_safe_redirect( admin_url( 'admin.php?page=sureforms_form_settings&tab=general-settings' ) );
210 exit;
211 }
212 }
213
214 /**
215 * Render Admin Dashboard.
216 *
217 * @return void
218 * @since 0.0.1
219 */
220 public function render_dashboard() {
221 echo '<div id="srfm-dashboard-container"></div>';
222 }
223
224 /**
225 * Settings page callback.
226 *
227 * @return void
228 * @since 0.0.1
229 */
230 public function settings_page_callback() {
231 echo '<div id="srfm-settings-container"></div>';
232 }
233
234 /**
235 * Add new form menu item.
236 *
237 * @return void
238 * @since 0.0.1
239 */
240 public function add_new_form() {
241 add_submenu_page(
242 'sureforms_menu',
243 __( 'New Form', 'sureforms' ),
244 __( 'New Form', 'sureforms' ),
245 'edit_others_posts',
246 'add-new-form',
247 [ $this, 'add_new_form_callback' ],
248 2
249 );
250 add_submenu_page(
251 'sureforms_menu',
252 __( 'Entries', 'sureforms' ),
253 __( 'Entries', 'sureforms' ),
254 'edit_others_posts',
255 SRFM_ENTRIES,
256 [ $this, 'render_entries' ],
257 3
258 );
259 }
260
261 /**
262 * Add new form mentu item callback.
263 *
264 * @return void
265 * @since 0.0.1
266 */
267 public function add_new_form_callback() {
268 echo '<div id="srfm-add-new-form-container"></div>';
269 }
270
271 /**
272 * Entries page callback.
273 *
274 * @since 0.0.13
275 * @return void
276 */
277 public function render_entries() {
278 // Render single entry view.
279 // Adding the phpcs ignore nonce verification as no database operations are performed in this function, it is used to display the single entry view.
280 if ( isset( $_GET['entry_id'] ) && is_numeric( $_GET['entry_id'] ) && isset( $_GET['view'] ) && 'details' === $_GET['view'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce verification is not needed here and explained in the comments above as well.
281 $single_entry_view = new Single_Entry();
282 $single_entry_view->render();
283 return;
284 }
285
286 // Render all entries view.
287 $entries_table = new Entries_List_Table();
288 $entries_table->prepare_items();
289 echo '<div class="wrap"><h1 class="wp-heading-inline">' . esc_html__( 'Entries', 'sureforms' ) . '</h1>';
290 if ( empty( $entries_table->all_entries_count ) && empty( $entries_table->trash_entries_count ) ) {
291 $instance = Post_Types::get_instance();
292 $instance->sureforms_render_blank_state( SRFM_ENTRIES );
293 $instance->get_blank_state_styles();
294 return;
295 }
296 echo '<form method="get">';
297 echo '<input type="hidden" name="page" value="sureforms_entries">';
298 $entries_table->display();
299 echo '</form>';
300 echo '</div>';
301 }
302
303 /**
304 * Adds a settings link to the plugin action links on the plugins page.
305 *
306 * @param array $links An array of plugin action links.
307 * @param string $file The plugin file path.
308 * @return array The updated array of plugin action links.
309 * @since 0.0.1
310 */
311 public function add_settings_link( $links, $file ) {
312 if ( 'sureforms/sureforms.php' === $file ) {
313 $plugin_links = apply_filters(
314 'sureforms_plugin_action_links',
315 [
316 'sureforms_settings' => '<a href="' . esc_url( admin_url( 'admin.php?page=sureforms_form_settings&tab=general-settings' ) ) . '">' . esc_html__( 'Settings', 'sureforms' ) . '</a>',
317 ]
318 );
319 $links = array_merge( $plugin_links, $links );
320 }
321 return $links;
322 }
323
324 /**
325 * Sureforms block editor styles.
326 *
327 * @since 0.0.1
328 */
329 public function enqueue_styles() {
330 $current_screen = get_current_screen();
331 global $wp_version;
332
333 $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
334 $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
335
336 $css_uri = SRFM_URL . 'assets/css/' . $dir_name . '/';
337 $vendor_css_uri = SRFM_URL . 'assets/css/minified/deps/';
338
339 /* RTL */
340 if ( is_rtl() ) {
341 $file_prefix .= '-rtl';
342 }
343
344 // Enqueue editor styles for post and page.
345 if ( SRFM_FORMS_POST_TYPE === $current_screen->post_type ) {
346 wp_enqueue_style( SRFM_SLUG . '-editor', $css_uri . 'backend/editor' . $file_prefix . '.css', [], SRFM_VER );
347 wp_enqueue_style( SRFM_SLUG . '-backend-blocks', $css_uri . 'blocks/default/backend' . $file_prefix . '.css', [], SRFM_VER );
348 wp_enqueue_style( SRFM_SLUG . '-intl', $vendor_css_uri . 'intl/intlTelInput-backend.min.css', [], SRFM_VER );
349 wp_enqueue_style( SRFM_SLUG . '-common', $css_uri . 'common' . $file_prefix . '.css', [], SRFM_VER );
350 wp_enqueue_style( SRFM_SLUG . '-reactQuill', $vendor_css_uri . 'quill/quill.snow.css', [], SRFM_VER );
351 wp_enqueue_style( SRFM_SLUG . '-single-form-modal', $css_uri . 'single-form-setting' . $file_prefix . '.css', [], SRFM_VER );
352
353 // if version is equal to or lower than 6.6.2 then add compatibility css.
354 if ( version_compare( $wp_version, '6.6.2', '<=' ) ) {
355 $srfm_inline_css = '.srfm-settings-modal .srfm-setting-modal-container .components-toggle-control .components-base-control__help{
356 margin-left: 4em;
357 }';
358 wp_add_inline_style( SRFM_SLUG . '-single-form-modal', $srfm_inline_css );
359 }
360 }
361
362 wp_enqueue_style( SRFM_SLUG . '-form-selector', $css_uri . 'srfm-form-selector' . $file_prefix . '.css', [], SRFM_VER );
363 wp_enqueue_style( SRFM_SLUG . '-common-editor', SRFM_URL . 'assets/build/common-editor.css', [], SRFM_VER, 'all' );
364 }
365
366 /**
367 * Get Breadcrumbs for current page.
368 *
369 * @since 0.0.1
370 * @return array Breadcrumbs Array.
371 */
372 public function get_breadcrumbs_for_current_page() {
373 global $post, $pagenow;
374 $breadcrumbs = [];
375
376 if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We don't need nonce verification here.
377 $page_title = get_admin_page_title();
378 $breadcrumbs[] = [
379 'title' => $page_title,
380 'link' => '',
381 ];
382 } elseif ( $post && in_array( $pagenow, [ 'post.php', 'post-new.php', 'edit.php' ], true ) ) {
383 $post_type_obj = get_post_type_object( get_post_type() );
384 if ( $post_type_obj ) {
385 $post_type_plural = $post_type_obj->labels->name;
386 $breadcrumbs[] = [
387 'title' => $post_type_plural,
388 'link' => admin_url( 'edit.php?post_type=' . $post_type_obj->name ),
389 ];
390
391 if ( 'edit.php' === $pagenow && ! isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We don't need nonce verification here.
392 $breadcrumbs[ count( $breadcrumbs ) - 1 ]['link'] = '';
393 } else {
394 $breadcrumbs[] = [
395 /* Translators: Post Title. */
396 'title' => sprintf( __( 'Edit %1$s', 'sureforms' ), get_the_title() ),
397 'link' => get_edit_post_link( $post->ID ),
398 ];
399 }
400 }
401 } else {
402 $current_screen = get_current_screen();
403 if ( $current_screen && 'sureforms_form' === $current_screen->post_type ) {
404 $breadcrumbs[] = [
405 'title' => 'Forms',
406 'link' => '',
407 ];
408 } else {
409 $breadcrumbs[] = [
410 'title' => '',
411 'link' => '',
412 ];
413 }
414 }
415
416 return $breadcrumbs;
417 }
418
419 /**
420 * Enqueue Admin Scripts.
421 *
422 * @return void
423 * @since 0.0.1
424 */
425 public function enqueue_scripts() {
426 $current_screen = get_current_screen();
427 global $wp_version;
428
429 $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
430 $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
431 $js_uri = SRFM_URL . 'assets/js/' . $dir_name . '/';
432 $css_uri = SRFM_URL . 'assets/css/' . $dir_name . '/';
433 $is_rtl = is_rtl();
434 $rtl = $is_rtl ? '-rtl' : '';
435
436 /**
437 * List of the handles in which we need to add translation compatibility.
438 */
439 $script_translations_handlers = [];
440
441 $localization_data = [
442 'site_url' => get_site_url(),
443 'breadcrumbs' => $this->get_breadcrumbs_for_current_page(),
444 'sureforms_dashboard_url' => admin_url( '/admin.php?page=sureforms_menu' ),
445 'plugin_version' => SRFM_VER,
446 'global_settings_nonce' => current_user_can( 'manage_options' ) ? wp_create_nonce( 'wp_rest' ) : '',
447 'is_pro_active' => defined( 'SRFM_PRO_VER' ),
448 'pro_plugin_version' => defined( 'SRFM_PRO_VER' ) ? SRFM_PRO_VER : '',
449 'pro_plugin_name' => defined( 'SRFM_PRO_VER' ) && defined( 'SRFM_PRO_PRODUCT' ) ? SRFM_PRO_PRODUCT : 'SureForms Pro',
450 'sureforms_pricing_page' => Helper::get_sureforms_website_url( 'pricing' ),
451 'field_spacing_vars' => Helper::get_css_vars(),
452 'is_ver_lower_than_6_7' => version_compare( $wp_version, '6.6.2', '<=' ),
453 ];
454
455 $is_screen_sureforms_menu = Helper::validate_request_context( 'sureforms_menu', 'page' );
456 $is_screen_add_new_form = Helper::validate_request_context( 'add-new-form', 'page' );
457 $is_screen_sureforms_form_settings = Helper::validate_request_context( 'sureforms_form_settings', 'page' );
458 $is_screen_sureforms_entries = Helper::validate_request_context( SRFM_ENTRIES, 'page' );
459 $is_post_type_sureforms_form = SRFM_FORMS_POST_TYPE === $current_screen->post_type;
460
461 if ( $is_screen_sureforms_menu || $is_post_type_sureforms_form || $is_screen_add_new_form || $is_screen_sureforms_form_settings || $is_screen_sureforms_entries ) {
462 $asset_handle = '-dashboard';
463
464 wp_enqueue_style( SRFM_SLUG . $asset_handle . '-font', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500&display=swap', [], SRFM_VER );
465
466 $script_asset_path = SRFM_DIR . 'assets/build/dashboard.asset.php';
467 $script_info = file_exists( $script_asset_path )
468 ? include $script_asset_path
469 : [
470 'dependencies' => [],
471 'version' => SRFM_VER,
472 ];
473 wp_enqueue_script( SRFM_SLUG . $asset_handle, SRFM_URL . 'assets/build/dashboard.js', $script_info['dependencies'], SRFM_VER, true );
474
475 wp_localize_script( SRFM_SLUG . $asset_handle, 'scIcons', [ 'path' => SRFM_URL . 'assets/build/icon-assets' ] );
476
477 $script_translations_handlers[] = SRFM_SLUG . $asset_handle;
478
479 if ( class_exists( 'SRFM_PRO\Admin\Licensing' ) ) {
480 $license_active = \SRFM_PRO\Admin\Licensing::is_license_active();
481 $localization_data['is_license_active'] = $license_active;
482
483 // Updating current licensing status.
484 $srfm_pro_license_status = get_option( 'srfm_pro_license_status', '' );
485 $current_license_status = $license_active ? 'licensed' : 'unlicensed';
486 if ( $current_license_status !== $srfm_pro_license_status ) {
487 update_option( 'srfm_pro_license_status', $current_license_status );
488 }
489 }
490
491 $localization_data['security_settings_url'] = admin_url( '/admin.php?page=sureforms_form_settings&tab=security-settings' );
492 $localization_data['integration_settings_url'] = admin_url( '/admin.php?page=sureforms_form_settings&tab=integration-settings' );
493 wp_localize_script(
494 SRFM_SLUG . $asset_handle,
495 SRFM_SLUG . '_admin',
496 apply_filters(
497 SRFM_SLUG . '_admin_filter',
498 $localization_data
499 )
500 );
501 wp_enqueue_style( SRFM_SLUG . '-dashboard', SRFM_URL . 'assets/build/dashboard.css', [], SRFM_VER, 'all' );
502
503 }
504
505 if ( $is_screen_sureforms_form_settings ) {
506 wp_enqueue_style( SRFM_SLUG . '-settings', $css_uri . 'backend/settings' . $file_prefix . $rtl . '.css', [], SRFM_VER );
507
508 // if version is equal to or lower than 6.6.2 then add compatibility css.
509 if ( version_compare( $wp_version, '6.6.2', '<=' ) ) {
510 $srfm_inline_css = '
511 .srfm-settings-page-container
512 .components-toggle-control {
513 .components-base-control__help{
514 margin-left: 4em;
515 }
516 }
517 }
518 ';
519 wp_add_inline_style( SRFM_SLUG . '-settings', $srfm_inline_css );
520 }
521 }
522
523 // Enqueue styles for the entries page.
524 if ( $is_screen_sureforms_entries ) {
525 $asset_handle = '-entries';
526 wp_enqueue_script( SRFM_SLUG . $asset_handle, SRFM_URL . 'assets/build/entries.js', $script_info['dependencies'], SRFM_VER, true );
527
528 $script_translations_handlers[] = SRFM_SLUG . $asset_handle;
529 }
530
531 // Admin Submenu Styles.
532 wp_enqueue_style( SRFM_SLUG . '-admin', $css_uri . 'backend/admin' . $file_prefix . $rtl . '.css', [], SRFM_VER );
533
534 if ( 'edit-' . SRFM_FORMS_POST_TYPE === $current_screen->id ) {
535 $asset_handle = 'page_header';
536
537 $script_asset_path = SRFM_DIR . 'assets/build/' . $asset_handle . '.asset.php';
538 $script_info = file_exists( $script_asset_path )
539 ? include $script_asset_path
540 : [
541 'dependencies' => [],
542 'version' => SRFM_VER,
543 ];
544 wp_enqueue_script( SRFM_SLUG . '-form-page-header', SRFM_URL . 'assets/build/' . $asset_handle . '.js', $script_info['dependencies'], SRFM_VER, true );
545 wp_enqueue_style( SRFM_SLUG . '-form-archive-styles', $css_uri . 'form-archive-styles' . $file_prefix . $rtl . '.css', [], SRFM_VER );
546
547 $script_translations_handlers[] = SRFM_SLUG . '-form-page-header';
548 }
549
550 if ( $is_screen_sureforms_form_settings ) {
551 $asset_handle = 'settings';
552
553 $script_asset_path = SRFM_DIR . 'assets/build/' . $asset_handle . '.asset.php';
554 $script_info = file_exists( $script_asset_path )
555 ? include $script_asset_path
556 : [
557 'dependencies' => [],
558 'version' => SRFM_VER,
559 ];
560
561 wp_enqueue_script( SRFM_SLUG . '-settings', SRFM_URL . 'assets/build/' . $asset_handle . '.js', $script_info['dependencies'], SRFM_VER, true );
562 wp_enqueue_style( SRFM_SLUG . '-setting-styles', SRFM_URL . 'assets/build/' . $asset_handle . '.css', [ 'wp-components' ], SRFM_VER, 'all' );
563 wp_localize_script(
564 SRFM_SLUG . '-settings',
565 SRFM_SLUG . '_admin',
566 $localization_data
567 );
568
569 $script_translations_handlers[] = SRFM_SLUG . '-settings';
570 }
571 if ( 'edit-' . SRFM_FORMS_POST_TYPE === $current_screen->id ) {
572 wp_enqueue_script( SRFM_SLUG . '-form-archive', $js_uri . 'form-archive' . $file_prefix . '.js', [], SRFM_VER, true );
573 wp_enqueue_script( SRFM_SLUG . '-export', $js_uri . 'export' . $file_prefix . '.js', [ 'wp-i18n' ], SRFM_VER, true );
574 wp_localize_script(
575 SRFM_SLUG . '-export',
576 SRFM_SLUG . '_export',
577 [
578 'ajaxurl' => admin_url( 'admin-ajax.php' ),
579 'srfm_export_nonce' => wp_create_nonce( 'export_form_nonce' ),
580 'site_url' => get_site_url(),
581 'srfm_import_endpoint' => '/wp-json/sureforms/v1/sureforms_import',
582 'import_form_nonce' => current_user_can( 'edit_posts' ) ? wp_create_nonce( 'wp_rest' ) : '',
583 'import_btn_string' => __( 'Import Form', 'sureforms' ),
584 ]
585 );
586
587 wp_enqueue_script( SRFM_SLUG . '-backend', $js_uri . 'backend' . $file_prefix . '.js', [], SRFM_VER, true );
588 wp_localize_script(
589 SRFM_SLUG . '-backend',
590 SRFM_SLUG . '_backend',
591 [
592 'site_url' => get_site_url(),
593 ]
594 );
595
596 $script_translations_handlers[] = SRFM_SLUG . '-form-archive';
597 $script_translations_handlers[] = SRFM_SLUG . '-export';
598 $script_translations_handlers[] = SRFM_SLUG . '-backend';
599 }
600
601 if ( $is_screen_add_new_form ) {
602 wp_enqueue_style( SRFM_SLUG . '-template-picker', $css_uri . 'template-picker' . $file_prefix . $rtl . '.css', [], SRFM_VER );
603
604 $sureforms_admin = 'templatePicker';
605
606 $script_asset_path = SRFM_DIR . 'assets/build/' . $sureforms_admin . '.asset.php';
607 $script_info = file_exists( $script_asset_path )
608 ? include $script_asset_path
609 : [
610 'dependencies' => [],
611 'version' => SRFM_VER,
612 ];
613 wp_enqueue_script( SRFM_SLUG . '-template-picker', SRFM_URL . 'assets/build/' . $sureforms_admin . '.js', $script_info['dependencies'], SRFM_VER, true );
614
615 wp_localize_script(
616 SRFM_SLUG . '-template-picker',
617 SRFM_SLUG . '_admin',
618 [
619 'site_url' => get_site_url(),
620 'plugin_url' => SRFM_URL,
621 'preview_images_url' => SRFM_URL . 'images/template-previews/',
622 'admin_url' => admin_url( 'admin.php' ),
623 'new_template_picker_base_url' => admin_url( 'post-new.php?post_type=sureforms_form' ),
624 'capability' => current_user_can( 'edit_posts' ),
625 'template_picker_nonce' => current_user_can( 'edit_posts' ) ? wp_create_nonce( 'wp_rest' ) : '',
626 'is_pro_active' => defined( 'SRFM_PRO_VER' ),
627 'srfm_ai_usage_details' => AI_Helper::get_current_usage_details(),
628 'is_pro_license_active' => AI_Helper::is_pro_license_active(),
629 'srfm_ai_auth_user_email' => get_option( 'srfm_ai_auth_user_email' ),
630 'pricing_page_url' => Helper::get_sureforms_website_url( 'pricing' ),
631 ]
632 );
633
634 $script_translations_handlers[] = SRFM_SLUG . '-template-picker';
635 }
636 // Quick action sidebar.
637 $default_allowed_quick_sidebar_blocks = apply_filters(
638 'srfm_quick_sidebar_allowed_blocks',
639 [
640 'srfm/input',
641 'srfm/email',
642 'srfm/textarea',
643 'srfm/checkbox',
644 'srfm/number',
645 'srfm/inline-button',
646 'srfm/advanced-heading',
647 ]
648 );
649 if ( ! is_array( $default_allowed_quick_sidebar_blocks ) ) {
650 $default_allowed_quick_sidebar_blocks = [];
651 }
652
653 $srfm_enable_quick_action_sidebar = get_option( 'srfm_enable_quick_action_sidebar' );
654 if ( ! $srfm_enable_quick_action_sidebar ) {
655 $srfm_enable_quick_action_sidebar = 'disabled';
656 }
657 $quick_sidebar_allowed_blocks = get_option( 'srfm_quick_sidebar_allowed_blocks' );
658 $quick_sidebar_allowed_blocks = ! empty( $quick_sidebar_allowed_blocks ) && is_array( $quick_sidebar_allowed_blocks ) ? $quick_sidebar_allowed_blocks : $default_allowed_quick_sidebar_blocks;
659 $srfm_ajax_nonce = wp_create_nonce( 'srfm_ajax_nonce' );
660 wp_enqueue_script( SRFM_SLUG . '-quick-action-siderbar', SRFM_URL . 'assets/build/quickActionSidebar.js', [], SRFM_VER, true );
661 wp_localize_script(
662 SRFM_SLUG . '-quick-action-siderbar',
663 SRFM_SLUG . '_quick_sidebar_blocks',
664 [
665 'allowed_blocks' => $quick_sidebar_allowed_blocks,
666 'srfm_enable_quick_action_sidebar' => $srfm_enable_quick_action_sidebar,
667 'srfm_ajax_nonce' => $srfm_ajax_nonce,
668 'srfm_ajax_url' => admin_url( 'admin-ajax.php' ),
669 ]
670 );
671
672 $script_translations_handlers[] = SRFM_SLUG . '-quick-action-siderbar';
673
674 /**
675 * Enqueuing SureTriggers Integration script.
676 * This script loads suretriggers iframe in Intergations tab.
677 */
678 if ( $is_post_type_sureforms_form ) {
679 wp_enqueue_script( SRFM_SLUG . '-suretriggers-integration', SRFM_SURETRIGGERS_INTEGRATION_BASE_URL . 'js/v2/embed.js', [], SRFM_VER, true );
680 }
681
682 // Check $script_translations_handlers is not empty before calling the function.
683 if ( ! empty( $script_translations_handlers ) ) {
684 // Remove duplicates values from the array.
685 $script_translations_handlers = array_unique( $script_translations_handlers );
686
687 foreach ( $script_translations_handlers as $script_handle ) {
688 Helper::register_script_translations( $script_handle );
689 }
690 }
691 }
692
693 /**
694 * Form Template Picker Admin Body Classes
695 * WordPress sometimes translates class names in the admin body tag, which can result in
696 * incorrect or missing class names when rendering the admin pages. This function ensures
697 * that essential class names are manually added to the body tag to maintain proper functionality.
698 *
699 * @since 0.0.1
700 * @param string $classes Space separated class string.
701 */
702 public function admin_template_picker_body_class( $classes = '' ) {
703 // Define an associative array of class names and their corresponding conditions.
704 // Each condition checks whether a specific request context matches.
705 $srfm_classes = [
706 'sureforms_page_sureforms_entries' => Helper::validate_request_context( SRFM_ENTRIES, 'page' ),
707 'sureforms_page_sureforms_form_settings' => Helper::validate_request_context( 'sureforms_form_settings', 'page' ),
708 'srfm-template-picker' => Helper::validate_request_context( 'add-new-form', 'page' ),
709 ];
710
711 $add_srfm_classes = '';
712
713 // Loop through the defined classes and conditions.
714 foreach ( $srfm_classes as $class => $condition ) {
715 // Check if the condition evaluates to true.
716 if ( $condition ) {
717 // Append the class to the existing classes string, followed by a space.
718 $add_srfm_classes .= empty( $add_srfm_classes ) ? $class : ' ' . $class;
719 }
720 }
721
722 // Append the new classes to the existing classes string.
723 if ( ! empty( $add_srfm_classes ) ) {
724 $classes .= ' ' . $add_srfm_classes;
725 }
726
727 // Return the updated list of classes.
728 return $classes;
729 }
730
731 /**
732 * Disable spectra's quick action bar in sureforms CPT.
733 *
734 * @param string $status current status of the quick action bar.
735 * @since 0.0.2
736 * @return string
737 */
738 public function restrict_spectra_quick_action_bar( $status ) {
739 $screen = get_current_screen();
740 if ( 'disabled' !== $status && isset( $screen->id ) && 'sureforms_form' === $screen->id ) {
741 $status = 'disabled';
742 }
743
744 return $status;
745 }
746
747 // Entries methods.
748
749 /**
750 * Handle entry actions.
751 *
752 * @since 0.0.13
753 * @return void
754 */
755 public function handle_entry_actions() {
756 Entries_List_Table::process_bulk_actions();
757
758 if ( ! isset( $_GET['page'] ) || SRFM_ENTRIES !== $_GET['page'] ) {
759 return;
760 }
761 if ( ! isset( $_GET['entry_id'] ) || ! isset( $_GET['action'] ) ) {
762 return;
763 }
764 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'srfm_entries_action' ) ) {
765 wp_die( esc_html__( 'Nonce verification failed.', 'sureforms' ) );
766 }
767 $action = isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : '';
768 $entry_id = Helper::get_integer_value( sanitize_text_field( wp_unslash( $_GET['entry_id'] ) ) );
769 $view = isset( $_GET['view'] ) ? sanitize_text_field( wp_unslash( $_GET['view'] ) ) : '';
770 if ( $entry_id > 0 ) {
771 if ( 'read' === $action && 'details' === $view ) {
772 $entry_status = Entries::get( $entry_id )['status'];
773 if ( 'trash' === $entry_status ) {
774 wp_die( esc_html__( 'You cannot view this entry because it is in trash.', 'sureforms' ) );
775 }
776 }
777 Entries_List_Table::handle_entry_status( $entry_id, $action, $view );
778 }
779 }
780
781 /**
782 * Admin Notice Callback if sureforms pro is out of date.
783 *
784 * Hooked - admin_notices
785 *
786 * @return void
787 * @since 1.0.4
788 */
789 public function srfm_pro_version_compatibility() {
790 $plugin_file = 'sureforms-pro/sureforms-pro.php';
791 if ( ! is_plugin_active( $plugin_file ) || ! defined( 'SRFM_PRO_VER' ) ) {
792 return;
793 }
794
795 if ( empty( get_current_screen() ) ) {
796 return;
797 }
798
799 if ( ! current_user_can( 'update_plugins' ) ) {
800 return;
801 }
802
803 $srfm_pro_license_status = get_option( 'srfm_pro_license_status', '' );
804 /**
805 * If the license status is not set then get the license status and update the option accordingly.
806 * This will be executed only once. Subsequently, the option status is updated by the licensing class on license activation or deactivation.
807 */
808 if ( empty( $srfm_pro_license_status ) && class_exists( 'SRFM_PRO\Admin\Licensing' ) ) {
809 $srfm_pro_license_status = \SRFM_PRO\Admin\Licensing::is_license_active() ? 'licensed' : 'unlicensed';
810 update_option( 'srfm_pro_license_status', $srfm_pro_license_status );
811 }
812
813 $pro_plugin_name = defined( 'SRFM_PRO_PRODUCT' ) ? SRFM_PRO_PRODUCT : 'SureForms Pro';
814 $message = '';
815 $url = admin_url( 'admin.php?page=sureforms_form_settings&tab=account-settings' );
816 if ( 'unlicensed' === $srfm_pro_license_status ) {
817 $message = '<p>' . sprintf(
818 // translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name.
819 esc_html__( 'Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more.', 'sureforms' ),
820 '<a href="' . esc_url( $url ) . '">',
821 '</a>',
822 '<i>' . esc_html( $pro_plugin_name ) . '</i>'
823 ) . '</p>';
824 }
825
826 if ( ! version_compare( SRFM_PRO_VER, SRFM_PRO_RECOMMENDED_VER, '>=' ) ) {
827 $message .= '<p>' . sprintf(
828 // translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag.
829 esc_html__( 'SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s.', 'sureforms' ),
830 esc_html( SRFM_VER ),
831 esc_html( $pro_plugin_name ),
832 esc_html( SRFM_PRO_RECOMMENDED_VER ),
833 '<a href=' . esc_url( admin_url( 'update-core.php' ) ) . '>',
834 '</a>'
835 ) . '</p>';
836 }
837
838 if ( ! empty( $message ) ) {
839 // Phpcs ignore comment is required as $message variable is already escaped.
840 echo '<div class="notice notice-warning">' . wp_kses_post( $message ) . '</div>';
841 }
842 }
843
844 /**
845 * Disables the capabilities for WPForms to avoid conflicts when enqueueing
846 * scripts and styles for WPForms.
847 *
848 * This function is intended to prevent any potential conflicts that may arise
849 * when WPForms scripts and styles are enqueued. By disabling certain capabilities,
850 * it ensures that WPForms does not interfere with other functionalities.
851 *
852 * @param bool $user_can A boolean indicating whether the user has the capability.
853 * @return bool Returns true if the capabilities are successfully disabled, false otherwise.
854 * @since 1.4.2
855 */
856 public function disable_wpforms_capabilities( $user_can ) {
857 // Note: Nonce verification is intentionally omitted here as no database operations are performed.
858 // The values of the $_REQUEST variables are strictly validated, ensuring security without the need for nonce verification.
859
860 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
861 $post_id = ! empty( $_REQUEST['post'] ) && ! empty( $_REQUEST['action'] ) ? absint( $_REQUEST['post'] ) : 0;
862
863 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
864 $post_type = $post_id ? get_post_type( $post_id ) : sanitize_text_field( wp_unslash( $_REQUEST['post_type'] ?? '' ) );
865 return SRFM_FORMS_POST_TYPE === $post_type ? false : $user_can;
866 }
867 }
868