PluginProbe
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz / 1.4.2
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz v1.4.2
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
← All changes | admin/admin.php +355 -68 0.0.121.4.2 View file →
@@ -6,11 +6,15 @@
6 6 */
7 7
8 8 namespace SRFM\Admin;
9 9
10 -use SRFM\Inc\Traits\Get_Instance;
10 +use SRFM\Admin\Views\Entries_List_Table;
11 +use SRFM\Admin\Views\Single_Entry;
11 12 use SRFM\Inc\AI_Form_Builder\AI_Helper;
13 +use SRFM\Inc\Database\Tables\Entries;
12 14 use SRFM\Inc\Helper;
15 +use SRFM\Inc\Post_Types;
16 +use SRFM\Inc\Traits\Get_Instance;
13 17
14 18 if ( ! defined( 'ABSPATH' ) ) {
15 19 exit; // Exit if accessed directly.
16 20 }
@@ -19,9 +23,8 @@
19 23 *
20 24 * @since 0.0.1
21 25 */
22 26 class Admin {
23 -
24 27 use Get_Instance;
25 28
26 29 /**
27 30 * Class constructor.
@@ -36,25 +39,83 @@
36 39 add_action( 'admin_menu', [ $this, 'add_new_form' ] );
37 40 add_filter( 'plugin_action_links', [ $this, 'add_settings_link' ], 10, 2 );
38 41 add_action( 'enqueue_block_assets', [ $this, 'enqueue_styles' ] );
39 42 add_action( 'admin_head', [ $this, 'enqueue_header_styles' ] );
40 - add_action( 'admin_body_class', [ $this, 'admin_template_picker_body_class' ] );
43 + add_filter( 'admin_body_class', [ $this, 'admin_template_picker_body_class' ] );
41 44
42 45 // this action is used to restrict Spectra's quick action bar on SureForms CPTS.
43 46 add_action( 'uag_enable_quick_action_sidebar', [ $this, 'restrict_spectra_quick_action_bar' ] );
44 47
45 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 );
46 70 }
47 71
48 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 + /**
49 109 * Enable Gutenberg for SureForms associated post types.
50 110 *
51 111 * @since 0.0.10
52 112 */
53 113 public function enable_gutenberg_for_sureforms() {
54 -
55 - // Check if the Classic Editor plugin is active and if it is set to replace the block editor.
56 - if ( ! class_exists( 'Classic_Editor' ) || 'block' === get_option( 'classic-editor-replace' ) ) {
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' ) ) {
57 118 return;
58 119 }
59 120
60 121 $srfm_post_types = apply_filters( 'srfm_enable_gutenberg_post_types', [ SRFM_FORMS_POST_TYPE ] );
@@ -64,9 +125,8 @@
64 125 add_filter( 'gutenberg_can_edit_post_type', '__return_true', 110 );
65 126 }
66 127 }
67 128
68 -
69 129 /**
70 130 * Sureforms editor header styles.
71 131 *
72 132 * @since 0.0.1
@@ -107,9 +167,10 @@
107 167 __( 'SureForms', 'sureforms' ),
108 168 __( 'SureForms', 'sureforms' ),
109 169 'edit_others_posts',
110 170 $menu_slug,
111 - function () {},
171 + static function () {
172 + },
112 173 'data:image/svg+xml;base64,' . base64_encode( $logo ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
113 174 30
114 175 );
115 176
@@ -185,8 +246,17 @@
185 246 'add-new-form',
186 247 [ $this, 'add_new_form_callback' ],
187 248 2
188 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 + );
189 259 }
190 260
191 261 /**
192 262 * Add new form mentu item callback.
@@ -198,8 +268,40 @@
198 268 echo '<div id="srfm-add-new-form-container"></div>';
199 269 }
200 270
201 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 + /**
202 304 * Adds a settings link to the plugin action links on the plugins page.
203 305 *
204 306 * @param array $links An array of plugin action links.
205 307 * @param string $file The plugin file path.
@@ -225,8 +327,9 @@
225 327 * @since 0.0.1
226 328 */
227 329 public function enqueue_styles() {
228 330 $current_screen = get_current_screen();
331 + global $wp_version;
229 332
230 333 $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
231 334 $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
232 335
@@ -245,8 +348,16 @@
245 348 wp_enqueue_style( SRFM_SLUG . '-intl', $vendor_css_uri . 'intl/intlTelInput-backend.min.css', [], SRFM_VER );
246 349 wp_enqueue_style( SRFM_SLUG . '-common', $css_uri . 'common' . $file_prefix . '.css', [], SRFM_VER );
247 350 wp_enqueue_style( SRFM_SLUG . '-reactQuill', $vendor_css_uri . 'quill/quill.snow.css', [], SRFM_VER );
248 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 + }
249 360 }
250 361
251 362 wp_enqueue_style( SRFM_SLUG . '-form-selector', $css_uri . 'srfm-form-selector' . $file_prefix . '.css', [], SRFM_VER );
252 363 wp_enqueue_style( SRFM_SLUG . '-common-editor', SRFM_URL . 'assets/build/common-editor.css', [], SRFM_VER, 'all' );
@@ -261,9 +372,9 @@
261 372 public function get_breadcrumbs_for_current_page() {
262 373 global $post, $pagenow;
263 374 $breadcrumbs = [];
264 375
265 - if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
376 + if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We don't need nonce verification here.
266 377 $page_title = get_admin_page_title();
267 378 $breadcrumbs[] = [
268 379 'title' => $page_title,
269 380 'link' => '',
@@ -276,9 +387,9 @@
276 387 'title' => $post_type_plural,
277 388 'link' => admin_url( 'edit.php?post_type=' . $post_type_obj->name ),
278 389 ];
279 390
280 - if ( 'edit.php' === $pagenow && ! isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
391 + if ( 'edit.php' === $pagenow && ! isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We don't need nonce verification here.
281 392 $breadcrumbs[ count( $breadcrumbs ) - 1 ]['link'] = '';
282 393 } else {
283 394 $breadcrumbs[] = [
284 395 /* Translators: Post Title. */
@@ -293,13 +404,8 @@
293 404 $breadcrumbs[] = [
294 405 'title' => 'Forms',
295 406 'link' => '',
296 407 ];
297 - } elseif ( $current_screen && 'sureforms_entry' === $current_screen->post_type ) {
298 - $breadcrumbs[] = [
299 - 'title' => 'Entries',
300 - 'link' => '',
301 - ];
302 408 } else {
303 409 $breadcrumbs[] = [
304 410 'title' => '',
305 411 'link' => '',
@@ -309,9 +415,8 @@
309 415
310 416 return $breadcrumbs;
311 417 }
312 418
313 -
314 419 /**
315 420 * Enqueue Admin Scripts.
316 421 *
317 422 * @return void
@@ -318,18 +423,21 @@
318 423 * @since 0.0.1
319 424 */
320 425 public function enqueue_scripts() {
321 426 $current_screen = get_current_screen();
427 + global $wp_version;
322 428
323 - $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
324 - $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
325 - $js_uri = SRFM_URL . 'assets/js/' . $dir_name . '/';
326 - $css_uri = SRFM_URL . 'assets/css/' . $dir_name . '/';
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' : '';
327 435
328 - /* RTL */
329 - if ( is_rtl() ) {
330 - $file_prefix .= '-rtl';
331 - }
436 + /**
437 + * List of the handles in which we need to add translation compatibility.
438 + */
439 + $script_translations_handlers = [];
332 440
333 441 $localization_data = [
334 442 'site_url' => get_site_url(),
335 443 'breadcrumbs' => $this->get_breadcrumbs_for_current_page(),
@@ -337,20 +445,21 @@
337 445 'plugin_version' => SRFM_VER,
338 446 'global_settings_nonce' => current_user_can( 'manage_options' ) ? wp_create_nonce( 'wp_rest' ) : '',
339 447 'is_pro_active' => defined( 'SRFM_PRO_VER' ),
340 448 'pro_plugin_version' => defined( 'SRFM_PRO_VER' ) ? SRFM_PRO_VER : '',
341 - 'sureforms_pricing_page' => $this->get_sureforms_website_url( 'pricing' ),
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' ),
342 451 'field_spacing_vars' => Helper::get_css_vars(),
452 + 'is_ver_lower_than_6_7' => version_compare( $wp_version, '6.6.2', '<=' ),
343 453 ];
344 454
345 - if ( class_exists( 'SRFM_PRO\Admin\Licensing' ) ) {
346 - $license_active = \SRFM_PRO\Admin\Licensing::is_license_active();
347 - $localization_data['is_license_active'] = $license_active;
348 - }
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;
349 460
350 - if ( SRFM_FORMS_POST_TYPE === $current_screen->post_type || 'toplevel_page_sureforms_menu' === $current_screen->base || SRFM_ENTRIES_POST_TYPE === $current_screen->post_type
351 - || 'sureforms_page_sureforms_form_settings' === $current_screen->id
352 - ) {
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 ) {
353 462 $asset_handle = '-dashboard';
354 463
355 464 wp_enqueue_style( SRFM_SLUG . $asset_handle . '-font', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500&display=swap', [], SRFM_VER );
356 465
@@ -364,9 +473,24 @@
364 473 wp_enqueue_script( SRFM_SLUG . $asset_handle, SRFM_URL . 'assets/build/dashboard.js', $script_info['dependencies'], SRFM_VER, true );
365 474
366 475 wp_localize_script( SRFM_SLUG . $asset_handle, 'scIcons', [ 'path' => SRFM_URL . 'assets/build/icon-assets' ] );
367 476
368 - $localization_data['security_settings_url'] = admin_url( '/admin.php?page=sureforms_form_settings&tab=security-settings' );
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' );
369 493 wp_localize_script(
370 494 SRFM_SLUG . $asset_handle,
371 495 SRFM_SLUG . '_admin',
372 496 apply_filters(
@@ -377,16 +501,38 @@
377 501 wp_enqueue_style( SRFM_SLUG . '-dashboard', SRFM_URL . 'assets/build/dashboard.css', [], SRFM_VER, 'all' );
378 502
379 503 }
380 504
381 - if ( 'sureforms_page_sureforms_form_settings' === $current_screen->id ) {
382 - wp_enqueue_style( SRFM_SLUG . '-settings', $css_uri . 'backend/settings' . $file_prefix . '.css', [], SRFM_VER );
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 + }
383 521 }
384 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 +
385 531 // Admin Submenu Styles.
386 - wp_enqueue_style( SRFM_SLUG . '-admin', $css_uri . 'backend/admin' . $file_prefix . '.css', [], SRFM_VER );
532 + wp_enqueue_style( SRFM_SLUG . '-admin', $css_uri . 'backend/admin' . $file_prefix . $rtl . '.css', [], SRFM_VER );
387 533
388 - if ( 'edit-' . SRFM_FORMS_POST_TYPE === $current_screen->id || 'edit-' . SRFM_ENTRIES_POST_TYPE === $current_screen->id ) {
534 + if ( 'edit-' . SRFM_FORMS_POST_TYPE === $current_screen->id ) {
389 535 $asset_handle = 'page_header';
390 536
391 537 $script_asset_path = SRFM_DIR . 'assets/build/' . $asset_handle . '.asset.php';
392 538 $script_info = file_exists( $script_asset_path )
@@ -395,11 +541,14 @@
395 541 'dependencies' => [],
396 542 'version' => SRFM_VER,
397 543 ];
398 544 wp_enqueue_script( SRFM_SLUG . '-form-page-header', SRFM_URL . 'assets/build/' . $asset_handle . '.js', $script_info['dependencies'], SRFM_VER, true );
399 - wp_enqueue_style( SRFM_SLUG . '-form-archive-styles', $css_uri . 'form-archive-styles' . $file_prefix . '.css', [], SRFM_VER );
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';
400 548 }
401 - if ( 'sureforms_page_' . SRFM_FORMS_POST_TYPE . '_settings' === $current_screen->base ) {
549 +
550 + if ( $is_screen_sureforms_form_settings ) {
402 551 $asset_handle = 'settings';
403 552
404 553 $script_asset_path = SRFM_DIR . 'assets/build/' . $asset_handle . '.asset.php';
405 554 $script_info = file_exists( $script_asset_path )
@@ -415,8 +564,10 @@
415 564 SRFM_SLUG . '-settings',
416 565 SRFM_SLUG . '_admin',
417 566 $localization_data
418 567 );
568 +
569 + $script_translations_handlers[] = SRFM_SLUG . '-settings';
419 570 }
420 571 if ( 'edit-' . SRFM_FORMS_POST_TYPE === $current_screen->id ) {
421 572 wp_enqueue_script( SRFM_SLUG . '-form-archive', $js_uri . 'form-archive' . $file_prefix . '.js', [], SRFM_VER, true );
422 573 wp_enqueue_script( SRFM_SLUG . '-export', $js_uri . 'export' . $file_prefix . '.js', [ 'wp-i18n' ], SRFM_VER, true );
@@ -427,9 +578,10 @@
427 578 'ajaxurl' => admin_url( 'admin-ajax.php' ),
428 579 'srfm_export_nonce' => wp_create_nonce( 'export_form_nonce' ),
429 580 'site_url' => get_site_url(),
430 581 'srfm_import_endpoint' => '/wp-json/sureforms/v1/sureforms_import',
431 - 'import_form_nonce' => ( current_user_can( 'edit_posts' ) ) ? wp_create_nonce( 'wp_rest' ) : '',
582 + 'import_form_nonce' => current_user_can( 'edit_posts' ) ? wp_create_nonce( 'wp_rest' ) : '',
583 + 'import_btn_string' => __( 'Import Form', 'sureforms' ),
432 584 ]
433 585 );
434 586
435 587 wp_enqueue_script( SRFM_SLUG . '-backend', $js_uri . 'backend' . $file_prefix . '.js', [], SRFM_VER, true );
@@ -440,24 +592,16 @@
440 592 'site_url' => get_site_url(),
441 593 ]
442 594 );
443 595
596 + $script_translations_handlers[] = SRFM_SLUG . '-form-archive';
597 + $script_translations_handlers[] = SRFM_SLUG . '-export';
598 + $script_translations_handlers[] = SRFM_SLUG . '-backend';
444 599 }
445 600
446 - if ( 'sureforms_page_add-new-form' === $current_screen->id ) {
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 );
447 603
448 - $file_prefix = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? '' : '.min';
449 - $dir_name = defined( 'SRFM_DEBUG' ) && SRFM_DEBUG ? 'unminified' : 'minified';
450 -
451 - $css_uri = SRFM_URL . 'assets/css/' . $dir_name . '/';
452 -
453 - /* RTL */
454 - if ( is_rtl() ) {
455 - $file_prefix .= '-rtl';
456 - }
457 -
458 - wp_enqueue_style( SRFM_SLUG . '-template-picker', $css_uri . 'template-picker' . $file_prefix . '.css', [], SRFM_VER );
459 -
460 604 $sureforms_admin = 'templatePicker';
461 605
462 606 $script_asset_path = SRFM_DIR . 'assets/build/' . $sureforms_admin . '.asset.php';
463 607 $script_info = file_exists( $script_asset_path )
@@ -482,11 +626,13 @@
482 626 'is_pro_active' => defined( 'SRFM_PRO_VER' ),
483 627 'srfm_ai_usage_details' => AI_Helper::get_current_usage_details(),
484 628 'is_pro_license_active' => AI_Helper::is_pro_license_active(),
485 629 'srfm_ai_auth_user_email' => get_option( 'srfm_ai_auth_user_email' ),
486 - 'pricing_page_url' => $this->get_sureforms_website_url( 'pricing' ),
630 + 'pricing_page_url' => Helper::get_sureforms_website_url( 'pricing' ),
487 631 ]
488 632 );
633 +
634 + $script_translations_handlers[] = SRFM_SLUG . '-template-picker';
489 635 }
490 636 // Quick action sidebar.
491 637 $default_allowed_quick_sidebar_blocks = apply_filters(
492 638 'srfm_quick_sidebar_allowed_blocks',
@@ -522,29 +668,65 @@
522 668 'srfm_ajax_url' => admin_url( 'admin-ajax.php' ),
523 669 ]
524 670 );
525 671
672 + $script_translations_handlers[] = SRFM_SLUG . '-quick-action-siderbar';
673 +
526 674 /**
527 675 * Enqueuing SureTriggers Integration script.
528 676 * This script loads suretriggers iframe in Intergations tab.
529 677 */
530 - if ( SRFM_FORMS_POST_TYPE === $current_screen->post_type ) {
531 - wp_enqueue_script( SRFM_SLUG . '-suretriggers-integration', SRFM_SURETRIGGERS_INTERGATION_BASE_URL . 'js/v2/embed.js', [], SRFM_VER, true );
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 );
532 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 + }
533 691 }
534 692
535 693 /**
536 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.
537 698 *
538 699 * @since 0.0.1
539 700 * @param string $classes Space separated class string.
540 701 */
541 702 public function admin_template_picker_body_class( $classes = '' ) {
542 - $theme_builder_class = isset( $_GET['page'] ) && 'add-new-form' === $_GET['page'] ? 'srfm-template-picker' : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Fetching a $_GET value, no nonce available to validate.
543 - $classes .= ' ' . $theme_builder_class . ' ';
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 + ];
544 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.
545 728 return $classes;
546 -
547 729 }
548 730
549 731 /**
550 732 * Disable spectra's quick action bar in sureforms CPT.
@@ -561,20 +743,125 @@
561 743
562 744 return $status;
563 745 }
564 746
747 + // Entries methods.
748 +
565 749 /**
566 - * Get SureForms Website URL.
750 + * Handle entry actions.
567 751 *
568 - * @param string $trail The URL trail to append to SureForms website URL. The parameter should not include a leading slash as the base URL already ends with a trailing slash.
569 - * @since 0.0.7
570 - * @return string
752 + * @since 0.0.13
753 + * @return void
571 754 */
572 - public static function get_sureforms_website_url( $trail ) {
573 - $url = SRFM_WEBSITE;
574 - if ( ! empty( $trail ) && is_string( $trail ) ) {
575 - $url = SRFM_WEBSITE . $trail;
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;
576 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 + }
577 780
578 - return esc_url( $url );
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;
579 866 }
580 867 }