PluginProbe
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz / 1.6.0
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz v1.6.0
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.6.0, at admin/admin.php

867 lines 31.2 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 'import_form_nonce' => current_user_can( 'edit_posts' ) ? wp_create_nonce( 'wp_rest' ) : '',
582 'import_btn_string' => __( 'Import Form', 'sureforms' ),
583 ]
584 );
585
586 wp_enqueue_script( SRFM_SLUG . '-backend', $js_uri . 'backend' . $file_prefix . '.js', [], SRFM_VER, true );
587 wp_localize_script(
588 SRFM_SLUG . '-backend',
589 SRFM_SLUG . '_backend',
590 [
591 'site_url' => get_site_url(),
592 ]
593 );
594
595 $script_translations_handlers[] = SRFM_SLUG . '-form-archive';
596 $script_translations_handlers[] = SRFM_SLUG . '-export';
597 $script_translations_handlers[] = SRFM_SLUG . '-backend';
598 }
599
600 if ( $is_screen_add_new_form ) {
601 wp_enqueue_style( SRFM_SLUG . '-template-picker', $css_uri . 'template-picker' . $file_prefix . $rtl . '.css', [], SRFM_VER );
602
603 $sureforms_admin = 'templatePicker';
604
605 $script_asset_path = SRFM_DIR . 'assets/build/' . $sureforms_admin . '.asset.php';
606 $script_info = file_exists( $script_asset_path )
607 ? include $script_asset_path
608 : [
609 'dependencies' => [],
610 'version' => SRFM_VER,
611 ];
612 wp_enqueue_script( SRFM_SLUG . '-template-picker', SRFM_URL . 'assets/build/' . $sureforms_admin . '.js', $script_info['dependencies'], SRFM_VER, true );
613
614 wp_localize_script(
615 SRFM_SLUG . '-template-picker',
616 SRFM_SLUG . '_admin',
617 [
618 'site_url' => get_site_url(),
619 'plugin_url' => SRFM_URL,
620 'preview_images_url' => SRFM_URL . 'images/template-previews/',
621 'admin_url' => admin_url( 'admin.php' ),
622 'new_template_picker_base_url' => admin_url( 'post-new.php?post_type=sureforms_form' ),
623 'capability' => current_user_can( 'edit_posts' ),
624 'template_picker_nonce' => current_user_can( 'edit_posts' ) ? wp_create_nonce( 'wp_rest' ) : '',
625 'is_pro_active' => defined( 'SRFM_PRO_VER' ),
626 'srfm_ai_usage_details' => AI_Helper::get_current_usage_details(),
627 'is_pro_license_active' => AI_Helper::is_pro_license_active(),
628 'srfm_ai_auth_user_email' => get_option( 'srfm_ai_auth_user_email' ),
629 'pricing_page_url' => Helper::get_sureforms_website_url( 'pricing' ),
630 ]
631 );
632
633 $script_translations_handlers[] = SRFM_SLUG . '-template-picker';
634 }
635 // Quick action sidebar.
636 $default_allowed_quick_sidebar_blocks = apply_filters(
637 'srfm_quick_sidebar_allowed_blocks',
638 [
639 'srfm/input',
640 'srfm/email',
641 'srfm/textarea',
642 'srfm/checkbox',
643 'srfm/number',
644 'srfm/inline-button',
645 'srfm/advanced-heading',
646 ]
647 );
648 if ( ! is_array( $default_allowed_quick_sidebar_blocks ) ) {
649 $default_allowed_quick_sidebar_blocks = [];
650 }
651
652 $srfm_enable_quick_action_sidebar = get_option( 'srfm_enable_quick_action_sidebar' );
653 if ( ! $srfm_enable_quick_action_sidebar ) {
654 $srfm_enable_quick_action_sidebar = 'disabled';
655 }
656 $quick_sidebar_allowed_blocks = get_option( 'srfm_quick_sidebar_allowed_blocks' );
657 $quick_sidebar_allowed_blocks = ! empty( $quick_sidebar_allowed_blocks ) && is_array( $quick_sidebar_allowed_blocks ) ? $quick_sidebar_allowed_blocks : $default_allowed_quick_sidebar_blocks;
658 $srfm_ajax_nonce = wp_create_nonce( 'srfm_ajax_nonce' );
659 wp_enqueue_script( SRFM_SLUG . '-quick-action-siderbar', SRFM_URL . 'assets/build/quickActionSidebar.js', [], SRFM_VER, true );
660 wp_localize_script(
661 SRFM_SLUG . '-quick-action-siderbar',
662 SRFM_SLUG . '_quick_sidebar_blocks',
663 [
664 'allowed_blocks' => $quick_sidebar_allowed_blocks,
665 'srfm_enable_quick_action_sidebar' => $srfm_enable_quick_action_sidebar,
666 'srfm_ajax_nonce' => $srfm_ajax_nonce,
667 'srfm_ajax_url' => admin_url( 'admin-ajax.php' ),
668 ]
669 );
670
671 $script_translations_handlers[] = SRFM_SLUG . '-quick-action-siderbar';
672
673 /**
674 * Enqueuing SureTriggers Integration script.
675 * This script loads suretriggers iframe in Intergations tab.
676 */
677 if ( $is_post_type_sureforms_form ) {
678 wp_enqueue_script( SRFM_SLUG . '-suretriggers-integration', SRFM_SURETRIGGERS_INTEGRATION_BASE_URL . 'js/v2/embed.js', [], SRFM_VER, true );
679 }
680
681 // Check $script_translations_handlers is not empty before calling the function.
682 if ( ! empty( $script_translations_handlers ) ) {
683 // Remove duplicates values from the array.
684 $script_translations_handlers = array_unique( $script_translations_handlers );
685
686 foreach ( $script_translations_handlers as $script_handle ) {
687 Helper::register_script_translations( $script_handle );
688 }
689 }
690 }
691
692 /**
693 * Form Template Picker Admin Body Classes
694 * WordPress sometimes translates class names in the admin body tag, which can result in
695 * incorrect or missing class names when rendering the admin pages. This function ensures
696 * that essential class names are manually added to the body tag to maintain proper functionality.
697 *
698 * @since 0.0.1
699 * @param string $classes Space separated class string.
700 */
701 public function admin_template_picker_body_class( $classes = '' ) {
702 // Define an associative array of class names and their corresponding conditions.
703 // Each condition checks whether a specific request context matches.
704 $srfm_classes = [
705 'sureforms_page_sureforms_entries' => Helper::validate_request_context( SRFM_ENTRIES, 'page' ),
706 'sureforms_page_sureforms_form_settings' => Helper::validate_request_context( 'sureforms_form_settings', 'page' ),
707 'srfm-template-picker' => Helper::validate_request_context( 'add-new-form', 'page' ),
708 ];
709
710 $add_srfm_classes = '';
711
712 // Loop through the defined classes and conditions.
713 foreach ( $srfm_classes as $class => $condition ) {
714 // Check if the condition evaluates to true.
715 if ( $condition ) {
716 // Append the class to the existing classes string, followed by a space.
717 $add_srfm_classes .= empty( $add_srfm_classes ) ? $class : ' ' . $class;
718 }
719 }
720
721 // Append the new classes to the existing classes string.
722 if ( ! empty( $add_srfm_classes ) ) {
723 $classes .= ' ' . $add_srfm_classes;
724 }
725
726 // Return the updated list of classes.
727 return $classes;
728 }
729
730 /**
731 * Disable spectra's quick action bar in sureforms CPT.
732 *
733 * @param string $status current status of the quick action bar.
734 * @since 0.0.2
735 * @return string
736 */
737 public function restrict_spectra_quick_action_bar( $status ) {
738 $screen = get_current_screen();
739 if ( 'disabled' !== $status && isset( $screen->id ) && 'sureforms_form' === $screen->id ) {
740 $status = 'disabled';
741 }
742
743 return $status;
744 }
745
746 // Entries methods.
747
748 /**
749 * Handle entry actions.
750 *
751 * @since 0.0.13
752 * @return void
753 */
754 public function handle_entry_actions() {
755 Entries_List_Table::process_bulk_actions();
756
757 if ( ! isset( $_GET['page'] ) || SRFM_ENTRIES !== $_GET['page'] ) {
758 return;
759 }
760 if ( ! isset( $_GET['entry_id'] ) || ! isset( $_GET['action'] ) ) {
761 return;
762 }
763 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'srfm_entries_action' ) ) {
764 wp_die( esc_html__( 'Nonce verification failed.', 'sureforms' ) );
765 }
766 $action = isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : '';
767 $entry_id = Helper::get_integer_value( sanitize_text_field( wp_unslash( $_GET['entry_id'] ) ) );
768 $view = isset( $_GET['view'] ) ? sanitize_text_field( wp_unslash( $_GET['view'] ) ) : '';
769 if ( $entry_id > 0 ) {
770 if ( 'read' === $action && 'details' === $view ) {
771 $entry_status = Entries::get( $entry_id )['status'];
772 if ( 'trash' === $entry_status ) {
773 wp_die( esc_html__( 'You cannot view this entry because it is in trash.', 'sureforms' ) );
774 }
775 }
776 Entries_List_Table::handle_entry_status( $entry_id, $action, $view );
777 }
778 }
779
780 /**
781 * Admin Notice Callback if sureforms pro is out of date.
782 *
783 * Hooked - admin_notices
784 *
785 * @return void
786 * @since 1.0.4
787 */
788 public function srfm_pro_version_compatibility() {
789 $plugin_file = 'sureforms-pro/sureforms-pro.php';
790 if ( ! is_plugin_active( $plugin_file ) || ! defined( 'SRFM_PRO_VER' ) ) {
791 return;
792 }
793
794 if ( empty( get_current_screen() ) ) {
795 return;
796 }
797
798 if ( ! current_user_can( 'update_plugins' ) ) {
799 return;
800 }
801
802 $srfm_pro_license_status = get_option( 'srfm_pro_license_status', '' );
803 /**
804 * If the license status is not set then get the license status and update the option accordingly.
805 * This will be executed only once. Subsequently, the option status is updated by the licensing class on license activation or deactivation.
806 */
807 if ( empty( $srfm_pro_license_status ) && class_exists( 'SRFM_PRO\Admin\Licensing' ) ) {
808 $srfm_pro_license_status = \SRFM_PRO\Admin\Licensing::is_license_active() ? 'licensed' : 'unlicensed';
809 update_option( 'srfm_pro_license_status', $srfm_pro_license_status );
810 }
811
812 $pro_plugin_name = defined( 'SRFM_PRO_PRODUCT' ) ? SRFM_PRO_PRODUCT : 'SureForms Pro';
813 $message = '';
814 $url = admin_url( 'admin.php?page=sureforms_form_settings&tab=account-settings' );
815 if ( 'unlicensed' === $srfm_pro_license_status ) {
816 $message = '<p>' . sprintf(
817 // translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name.
818 esc_html__( 'Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more.', 'sureforms' ),
819 '<a href="' . esc_url( $url ) . '">',
820 '</a>',
821 '<i>' . esc_html( $pro_plugin_name ) . '</i>'
822 ) . '</p>';
823 }
824
825 if ( ! version_compare( SRFM_PRO_VER, SRFM_PRO_RECOMMENDED_VER, '>=' ) ) {
826 $message .= '<p>' . sprintf(
827 // 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.
828 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' ),
829 esc_html( SRFM_VER ),
830 esc_html( $pro_plugin_name ),
831 esc_html( SRFM_PRO_RECOMMENDED_VER ),
832 '<a href=' . esc_url( admin_url( 'update-core.php' ) ) . '>',
833 '</a>'
834 ) . '</p>';
835 }
836
837 if ( ! empty( $message ) ) {
838 // Phpcs ignore comment is required as $message variable is already escaped.
839 echo '<div class="notice notice-warning">' . wp_kses_post( $message ) . '</div>';
840 }
841 }
842
843 /**
844 * Disables the capabilities for WPForms to avoid conflicts when enqueueing
845 * scripts and styles for WPForms.
846 *
847 * This function is intended to prevent any potential conflicts that may arise
848 * when WPForms scripts and styles are enqueued. By disabling certain capabilities,
849 * it ensures that WPForms does not interfere with other functionalities.
850 *
851 * @param bool $user_can A boolean indicating whether the user has the capability.
852 * @return bool Returns true if the capabilities are successfully disabled, false otherwise.
853 * @since 1.4.2
854 */
855 public function disable_wpforms_capabilities( $user_can ) {
856 // Note: Nonce verification is intentionally omitted here as no database operations are performed.
857 // The values of the $_REQUEST variables are strictly validated, ensuring security without the need for nonce verification.
858
859 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
860 $post_id = ! empty( $_REQUEST['post'] ) && ! empty( $_REQUEST['action'] ) ? absint( $_REQUEST['post'] ) : 0;
861
862 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
863 $post_type = $post_id ? get_post_type( $post_id ) : sanitize_text_field( wp_unslash( $_REQUEST['post_type'] ?? '' ) );
864 return SRFM_FORMS_POST_TYPE === $post_type ? false : $user_can;
865 }
866 }
867