Formidable Forms – Form Builder for WordPress - Version 4.09.01

Version Description

  • Don't include a link in the entries list to the form page when the user doesn't have permission to see anything there.
Download this release

Release Info

Developer sswells
Plugin Icon 128x128 Formidable Forms – Form Builder for WordPress
Version 4.09.01
Comparing to
See all releases

Code changes from version 4.09 to 4.09.01

classes/controllers/FrmAddonsController.php CHANGED
@@ -65,7 +65,7 @@ class FrmAddonsController {
65
  include( FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php' );
66
  }
67
 
68
- private static function get_api_addons() {
69
  $api = new FrmFormApi();
70
  $addons = $api->get_api_info();
71
 
@@ -88,7 +88,7 @@ class FrmAddonsController {
88
  * @since 3.04.03
89
  * @return array
90
  */
91
- private static function fallback_plugin_list() {
92
  $list = array(
93
  'formidable-pro' => array(
94
  'title' => 'Formidable Forms',
@@ -221,7 +221,7 @@ class FrmAddonsController {
221
  /**
222
  * @since 4.08
223
  */
224
- private static function get_pro_from_addons( $addons ) {
225
  return isset( $addons['93790'] ) ? $addons['93790'] : array();
226
  }
227
 
@@ -229,32 +229,11 @@ class FrmAddonsController {
229
  * @since 4.06
230
  */
231
  public static function license_type() {
232
- $api = new FrmFormApi();
233
- $addons = $api->get_api_info();
234
- $type = 'free';
235
-
236
- if ( isset( $addons['error'] ) ) {
237
- if ( isset( $addons['error']['code'] ) && $addons['error']['code'] === 'expired' ) {
238
- return $addons['error']['code'];
239
- }
240
- $type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : $type;
241
- }
242
-
243
- $pro = self::get_pro_from_addons( $addons );
244
- if ( $type === 'free' ) {
245
- $type = isset( $pro['type'] ) ? $pro['type'] : $type;
246
- if ( $type === 'free' ) {
247
- return $type;
248
- }
249
  }
250
 
251
- if ( isset( $pro['code'] ) && $pro['code'] === 'grandfathered' ) {
252
- return $pro['code'];
253
- }
254
-
255
- $expires = isset( $pro['expires'] ) ? $pro['expires'] : '';
256
- $expired = $expires ? $expires < time() : false;
257
- return $expired ? 'expired' : strtolower( $type );
258
  }
259
 
260
  /**
@@ -275,30 +254,17 @@ class FrmAddonsController {
275
  * @return boolean|int false or the number of days until expiration.
276
  */
277
  public static function is_license_expiring() {
278
- $version_info = self::get_primary_license_info();
279
- if ( ! isset( $version_info['active_sub'] ) || $version_info['active_sub'] !== 'no' ) {
280
- // Check for a subscription first.
281
- return false;
282
  }
283
 
284
- if ( isset( $version_info['error'] ) || empty( $version_info['expires'] ) ) {
285
- // It's either invalid or already expired.
286
- return false;
287
- }
288
-
289
- $expiration = $version_info['expires'];
290
- $days_left = ( $expiration - time() ) / DAY_IN_SECONDS;
291
- if ( $days_left > 30 ) {
292
- return false;
293
- }
294
-
295
- return $days_left;
296
  }
297
 
298
  /**
299
  * @since 4.08
300
  */
301
- private static function get_primary_license_info() {
302
  $installed_addons = apply_filters( 'frm_installed_addons', array() );
303
  if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
304
  return false;
@@ -314,6 +280,11 @@ class FrmAddonsController {
314
  * @since 3.04.03
315
  */
316
  public static function check_update( $transient ) {
 
 
 
 
 
317
  if ( ! is_object( $transient ) ) {
318
  $transient = new stdClass();
319
  }
@@ -374,7 +345,7 @@ class FrmAddonsController {
374
  *
375
  * @return bool - True if installed
376
  */
377
- private static function is_installed( $plugin ) {
378
  if ( ! function_exists( 'get_plugins' ) ) {
379
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
380
  }
@@ -391,7 +362,7 @@ class FrmAddonsController {
391
  *
392
  * @return array
393
  */
394
- private static function fill_update_addon_info( $installed_addons ) {
395
  $checked_licenses = array();
396
  $version_info = array();
397
 
@@ -478,7 +449,7 @@ class FrmAddonsController {
478
  * @param string $plugin The plugin slug
479
  * @return array|false
480
  */
481
- private static function get_addon( $plugin ) {
482
  $addons = self::get_api_addons();
483
  self::prepare_addons( $addons );
484
  foreach ( $addons as $addon ) {
@@ -494,7 +465,7 @@ class FrmAddonsController {
494
  * @since 4.09
495
  * @return string
496
  */
497
- private static function get_license_type() {
498
  $license_type = '';
499
  $addons = self::get_api_addons();
500
  if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
@@ -527,7 +498,7 @@ class FrmAddonsController {
527
  return $plugin;
528
  }
529
 
530
- private static function prepare_addons( &$addons ) {
531
  $activate_url = '';
532
  if ( current_user_can( 'activate_plugins' ) ) {
533
  $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
@@ -582,7 +553,7 @@ class FrmAddonsController {
582
  /**
583
  * @since 3.04.02
584
  */
585
- private static function prepare_addon_link( &$link ) {
586
  $site_url = 'https://formidableforms.com/';
587
  if ( strpos( $link, 'http' ) !== 0 ) {
588
  $link = $site_url . $link;
@@ -602,7 +573,7 @@ class FrmAddonsController {
602
  *
603
  * @since 3.04.02
604
  */
605
- private static function set_addon_status( &$addon ) {
606
  if ( ! empty( $addon['activate_url'] ) ) {
607
  $addon['status'] = array(
608
  'type' => 'installed',
@@ -858,24 +829,10 @@ class FrmAddonsController {
858
  wp_die();
859
  }
860
 
861
- /**
862
- * @since 3.04.02
863
- */
864
- public static function ajax_install_addon() {
865
-
866
- self::install_addon_permissions();
867
-
868
- self::download_and_activate();
869
-
870
- // Send back a response.
871
- echo json_encode( __( 'Your plugin has been installed. Please reload the page to see more options.', 'formidable' ) );
872
- wp_die();
873
- }
874
-
875
  /**
876
  * @since 4.08
877
  */
878
- private static function download_and_activate() {
879
  // Set the current screen to avoid undefined notices.
880
  if ( is_admin() ) {
881
  global $hook_suffix;
@@ -894,7 +851,7 @@ class FrmAddonsController {
894
  /**
895
  * @since 3.04.02
896
  */
897
- private static function maybe_show_cred_form() {
898
  if ( ! function_exists( 'request_filesystem_credentials' ) ) {
899
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
900
  }
@@ -936,7 +893,7 @@ class FrmAddonsController {
936
  *
937
  * @since 3.04.02
938
  */
939
- private static function install_addon() {
940
  require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
941
 
942
  $download_url = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
@@ -977,44 +934,11 @@ class FrmAddonsController {
977
  wp_die();
978
  }
979
 
980
- /**
981
- * @since 4.06.02
982
- */
983
- public static function ajax_multiple_addons() {
984
- self::install_addon_permissions();
985
-
986
- // Set the current screen to avoid undefined notices.
987
- global $hook_suffix;
988
- set_current_screen();
989
-
990
- $download_urls = FrmAppHelper::get_param( 'plugin', '', 'post' );
991
- $download_urls = explode( ',', $download_urls );
992
- FrmAppHelper::sanitize_value( 'esc_url_raw', $download_urls );
993
-
994
- foreach ( $download_urls as $download_url ) {
995
- $_POST['plugin'] = $download_url;
996
- if ( strpos( $download_url, 'http' ) !== false ) {
997
- // Installing.
998
- self::maybe_show_cred_form();
999
-
1000
- $installed = self::install_addon();
1001
- self::maybe_activate_addon( $installed );
1002
- } else {
1003
- // Activating.
1004
- self::maybe_activate_addon( $download_url );
1005
- }
1006
- }
1007
-
1008
- echo json_encode( __( 'Your plugins have been installed and activated.', 'formidable' ) );
1009
-
1010
- wp_die();
1011
- }
1012
-
1013
  /**
1014
  * @since 3.04.02
1015
  * @param string $installed The plugin folder name with file name
1016
  */
1017
- private static function maybe_activate_addon( $installed ) {
1018
  if ( ! $installed ) {
1019
  return;
1020
  }
@@ -1040,7 +964,7 @@ class FrmAddonsController {
1040
  *
1041
  * @since 3.04.02
1042
  */
1043
- private static function install_addon_permissions() {
1044
  check_ajax_referer( 'frm_ajax', 'nonce' );
1045
 
1046
  if ( ! current_user_can( 'activate_plugins' ) || ! isset( $_POST['plugin'] ) ) {
@@ -1151,11 +1075,65 @@ class FrmAddonsController {
1151
  * @since 4.09
1152
  */
1153
  public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1154
- $addon = self::get_addon( $plugin );
1155
- $license_type = self::get_license_type();
1156
- $plan_required = FrmFormsHelper::get_plan_required( $addon );
1157
- $upgrade_link = FrmAppHelper::admin_upgrade_link( $upgrade_link_args );
1158
- FrmAppHelper::conditional_action_button( $addon, $license_type, $plan_required, $upgrade_link );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1159
  }
1160
 
1161
  /**
65
  include( FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php' );
66
  }
67
 
68
+ protected static function get_api_addons() {
69
  $api = new FrmFormApi();
70
  $addons = $api->get_api_info();
71
 
88
  * @since 3.04.03
89
  * @return array
90
  */
91
+ protected static function fallback_plugin_list() {
92
  $list = array(
93
  'formidable-pro' => array(
94
  'title' => 'Formidable Forms',
221
  /**
222
  * @since 4.08
223
  */
224
+ protected static function get_pro_from_addons( $addons ) {
225
  return isset( $addons['93790'] ) ? $addons['93790'] : array();
226
  }
227
 
229
  * @since 4.06
230
  */
231
  public static function license_type() {
232
+ if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
233
+ return FrmProAddonsController::license_type();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  }
235
 
236
+ return 'free';
 
 
 
 
 
 
237
  }
238
 
239
  /**
254
  * @return boolean|int false or the number of days until expiration.
255
  */
256
  public static function is_license_expiring() {
257
+ if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
258
+ return FrmProAddonsController::is_license_expiring();
 
 
259
  }
260
 
261
+ return false;
 
 
 
 
 
 
 
 
 
 
 
262
  }
263
 
264
  /**
265
  * @since 4.08
266
  */
267
+ protected static function get_primary_license_info() {
268
  $installed_addons = apply_filters( 'frm_installed_addons', array() );
269
  if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
270
  return false;
280
  * @since 3.04.03
281
  */
282
  public static function check_update( $transient ) {
283
+ if ( ! FrmAppHelper::pro_is_installed() ) {
284
+ // Don't make any changes if only Lite is installed.
285
+ return $transient;
286
+ }
287
+
288
  if ( ! is_object( $transient ) ) {
289
  $transient = new stdClass();
290
  }
345
  *
346
  * @return bool - True if installed
347
  */
348
+ protected static function is_installed( $plugin ) {
349
  if ( ! function_exists( 'get_plugins' ) ) {
350
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
351
  }
362
  *
363
  * @return array
364
  */
365
+ protected static function fill_update_addon_info( $installed_addons ) {
366
  $checked_licenses = array();
367
  $version_info = array();
368
 
449
  * @param string $plugin The plugin slug
450
  * @return array|false
451
  */
452
+ protected static function get_addon( $plugin ) {
453
  $addons = self::get_api_addons();
454
  self::prepare_addons( $addons );
455
  foreach ( $addons as $addon ) {
465
  * @since 4.09
466
  * @return string
467
  */
468
+ protected static function get_license_type() {
469
  $license_type = '';
470
  $addons = self::get_api_addons();
471
  if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
498
  return $plugin;
499
  }
500
 
501
+ protected static function prepare_addons( &$addons ) {
502
  $activate_url = '';
503
  if ( current_user_can( 'activate_plugins' ) ) {
504
  $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
553
  /**
554
  * @since 3.04.02
555
  */
556
+ protected static function prepare_addon_link( &$link ) {
557
  $site_url = 'https://formidableforms.com/';
558
  if ( strpos( $link, 'http' ) !== 0 ) {
559
  $link = $site_url . $link;
573
  *
574
  * @since 3.04.02
575
  */
576
+ protected static function set_addon_status( &$addon ) {
577
  if ( ! empty( $addon['activate_url'] ) ) {
578
  $addon['status'] = array(
579
  'type' => 'installed',
829
  wp_die();
830
  }
831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
  /**
833
  * @since 4.08
834
  */
835
+ protected static function download_and_activate() {
836
  // Set the current screen to avoid undefined notices.
837
  if ( is_admin() ) {
838
  global $hook_suffix;
851
  /**
852
  * @since 3.04.02
853
  */
854
+ protected static function maybe_show_cred_form() {
855
  if ( ! function_exists( 'request_filesystem_credentials' ) ) {
856
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
857
  }
893
  *
894
  * @since 3.04.02
895
  */
896
+ protected static function install_addon() {
897
  require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
898
 
899
  $download_url = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
934
  wp_die();
935
  }
936
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
937
  /**
938
  * @since 3.04.02
939
  * @param string $installed The plugin folder name with file name
940
  */
941
+ protected static function maybe_activate_addon( $installed ) {
942
  if ( ! $installed ) {
943
  return;
944
  }
964
  *
965
  * @since 3.04.02
966
  */
967
+ protected static function install_addon_permissions() {
968
  check_ajax_referer( 'frm_ajax', 'nonce' );
969
 
970
  if ( ! current_user_can( 'activate_plugins' ) || ! isset( $_POST['plugin'] ) ) {
1075
  * @since 4.09
1076
  */
1077
  public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1078
+ if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
1079
+ return FrmProAddonsController::conditional_action_button( $plugin, $upgrade_link_args );
1080
+ }
1081
+
1082
+ $addon = self::get_addon( $plugin );
1083
+ $upgrade_link = FrmAppHelper::admin_upgrade_link( $upgrade_link_args );
1084
+ self::addon_upgrade_link( $addon, $upgrade_link );
1085
+ }
1086
+
1087
+ /**
1088
+ * Render a conditional action button for an add on
1089
+ *
1090
+ * @since 4.09.01
1091
+ * @param array $addon
1092
+ * @param string|false $license_type
1093
+ * @param string $plan_required
1094
+ * @param string $upgrade_link
1095
+ */
1096
+ public static function show_conditional_action_button( $atts ) {
1097
+ if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
1098
+ return FrmProAddonsController::show_conditional_action_button( $atts );
1099
+ }
1100
+
1101
+ self::addon_upgrade_link( $atts['addon'], $atts['upgrade_link'] );
1102
+ }
1103
+
1104
+ /**
1105
+ * @since 4.09.01
1106
+ */
1107
+ protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1108
+ if ( $addon ) {
1109
+ $upgrade_link .= '&utm_content=' . $addon['slug'];
1110
+ }
1111
+
1112
+ if ( $addon && isset( $addon['categories'] ) && in_array( 'Solution', $addon['categories'], true ) ) {
1113
+ // Solutions will go to a separate page.
1114
+ $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1115
+ }
1116
+ ?>
1117
+ <a class="install-now button button-secondary frm-button-secondary" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
1118
+ <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1119
+ </a>
1120
+ <?php
1121
+ }
1122
+
1123
+ /**
1124
+ * @since 3.04.02
1125
+ * @deprecated 4.09.01
1126
+ */
1127
+ public static function ajax_install_addon() {
1128
+ FrmDeprecated::ajax_install_addon();
1129
+ }
1130
+
1131
+ /**
1132
+ * @since 4.06.02
1133
+ * @deprecated 4.09.01
1134
+ */
1135
+ public static function ajax_multiple_addons() {
1136
+ FrmDeprecated::ajax_multiple_addons();
1137
  }
1138
 
1139
  /**
classes/controllers/FrmAppController.php CHANGED
@@ -339,6 +339,11 @@ class FrmAppController {
339
  remove_action( 'frm_after_settings', 'FrmSettingsController::settings_cta' );
340
  remove_action( 'frm_add_form_style_tab_options', 'FrmFormsController::add_form_style_tab_options' );
341
  remove_action( 'frm_after_field_options', 'FrmFormsController::logic_tip' );
 
 
 
 
 
342
  }
343
 
344
  /**
339
  remove_action( 'frm_after_settings', 'FrmSettingsController::settings_cta' );
340
  remove_action( 'frm_add_form_style_tab_options', 'FrmFormsController::add_form_style_tab_options' );
341
  remove_action( 'frm_after_field_options', 'FrmFormsController::logic_tip' );
342
+
343
+ if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
344
+ // These functions moved to Pro in 4.09.01
345
+ remove_action( 'frm_page_footer', 'FrmAppHelper::renewal_message' );
346
+ }
347
  }
348
 
349
  /**
classes/controllers/FrmFormsController.php CHANGED
@@ -819,7 +819,6 @@ class FrmFormsController {
819
 
820
  public static function list_templates() {
821
  global $frm_templates;
822
- global $frm_expired;
823
  global $frm_license_type;
824
 
825
  $templates = $frm_templates;
@@ -861,7 +860,6 @@ class FrmFormsController {
861
  $my_templates_translation = __( 'My Templates', 'formidable' );
862
  $categories = array_merge( array( $my_templates_translation ), $categories );
863
  $pricing = FrmAppHelper::admin_upgrade_link( 'form-templates' );
864
- $expired = $frm_expired;
865
  $license_type = $frm_license_type;
866
  $args = compact( 'pricing', 'license_type' );
867
  $where = apply_filters( 'frm_forms_dropdown', array(), '' );
819
 
820
  public static function list_templates() {
821
  global $frm_templates;
 
822
  global $frm_license_type;
823
 
824
  $templates = $frm_templates;
860
  $my_templates_translation = __( 'My Templates', 'formidable' );
861
  $categories = array_merge( array( $my_templates_translation ), $categories );
862
  $pricing = FrmAppHelper::admin_upgrade_link( 'form-templates' );
 
863
  $license_type = $frm_license_type;
864
  $args = compact( 'pricing', 'license_type' );
865
  $where = apply_filters( 'frm_forms_dropdown', array(), '' );
classes/controllers/FrmHooksController.php CHANGED
@@ -99,6 +99,7 @@ class FrmHooksController {
99
  // Addons Controller.
100
  add_action( 'admin_menu', 'FrmAddonsController::menu', 100 );
101
  add_filter( 'pre_set_site_transient_update_plugins', 'FrmAddonsController::check_update' );
 
102
 
103
  // Entries Controller.
104
  add_action( 'admin_menu', 'FrmEntriesController::menu', 12 );
@@ -159,9 +160,7 @@ class FrmHooksController {
159
  // Addons.
160
  add_action( 'wp_ajax_frm_addon_activate', 'FrmAddon::activate' );
161
  add_action( 'wp_ajax_frm_addon_deactivate', 'FrmAddon::deactivate' );
162
- add_action( 'wp_ajax_frm_install_addon', 'FrmAddonsController::ajax_install_addon' );
163
  add_action( 'wp_ajax_frm_activate_addon', 'FrmAddonsController::ajax_activate_addon' );
164
- add_action( 'wp_ajax_frm_multiple_addons', 'FrmAddonsController::ajax_multiple_addons' );
165
  add_action( 'wp_ajax_frm_connect', 'FrmAddonsController::connect_pro' );
166
 
167
  // Fields Controller.
99
  // Addons Controller.
100
  add_action( 'admin_menu', 'FrmAddonsController::menu', 100 );
101
  add_filter( 'pre_set_site_transient_update_plugins', 'FrmAddonsController::check_update' );
102
+ add_action( 'frm_page_footer', 'FrmAppHelper::renewal_message' );
103
 
104
  // Entries Controller.
105
  add_action( 'admin_menu', 'FrmEntriesController::menu', 12 );
160
  // Addons.
161
  add_action( 'wp_ajax_frm_addon_activate', 'FrmAddon::activate' );
162
  add_action( 'wp_ajax_frm_addon_deactivate', 'FrmAddon::deactivate' );
 
163
  add_action( 'wp_ajax_frm_activate_addon', 'FrmAddonsController::ajax_activate_addon' );
 
164
  add_action( 'wp_ajax_frm_connect', 'FrmAddonsController::connect_pro' );
165
 
166
  // Fields Controller.
classes/helpers/FrmAppHelper.php CHANGED
@@ -11,7 +11,7 @@ class FrmAppHelper {
11
  /**
12
  * @since 2.0
13
  */
14
- public static $plug_version = '4.09';
15
 
16
  /**
17
  * @since 1.07.02
@@ -73,56 +73,6 @@ class FrmAppHelper {
73
  return absint( apply_filters( 'frm_affiliate_id', 0 ) );
74
  }
75
 
76
- /**
77
- * Render a conditional action button for an add on
78
- *
79
- * @since 4.09
80
- * @param array $addon
81
- * @param string|false $license_type
82
- * @param string $plan_required
83
- * @param string $upgrade_link
84
- */
85
- public static function conditional_action_button( $addon, $license_type, $plan_required, $upgrade_link ) {
86
- if ( ! $addon ) {
87
- ?>
88
- <a class="install-now button button-secondary frm-button-secondary" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
89
- <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
90
- </a>
91
- <?php
92
- return;
93
- }
94
-
95
- if ( $addon['status']['type'] === 'installed' ) {
96
- ?>
97
- <a rel="<?php echo esc_attr( $addon['plugin'] ); ?>" class="button button-primary frm-button-primary frm-activate-addon <?php echo esc_attr( empty( $addon['activate_url'] ) ? 'frm_hidden' : '' ); ?>">
98
- <?php esc_html_e( 'Activate', 'formidable' ); ?>
99
- </a>
100
- <?php
101
- } elseif ( ! empty( $addon['url'] ) ) {
102
- ?>
103
- <a class="frm-install-addon button button-primary frm-button-primary" rel="<?php echo esc_attr( $addon['url'] ); ?>" aria-label="<?php esc_attr_e( 'Install', 'formidable' ); ?>">
104
- <?php esc_html_e( 'Install', 'formidable' ); ?>
105
- </a>
106
- <?php
107
- } elseif ( $license_type && $license_type === strtolower( $plan_required ) ) {
108
- ?>
109
- <a class="install-now button button-secondary frm-button-secondary" href="<?php echo esc_url( self::admin_upgrade_link( 'addons', 'account/downloads/' ) . '&utm_content=' . $addon['slug'] ); ?>" target="_blank" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
110
- <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
111
- </a>
112
- <?php
113
- } else {
114
- if ( isset( $addon['categories'] ) && in_array( 'Solution', $addon['categories'], true ) ) {
115
- // Solutions will go to a separate page.
116
- $upgrade_link = self::admin_upgrade_link( 'addons', $addon['link'] );
117
- }
118
- ?>
119
- <a class="install-now button button-secondary frm-button-secondary" href="<?php echo esc_url( $upgrade_link . '&utm_content=' . $addon['slug'] ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
120
- <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
121
- </a>
122
- <?php
123
- }
124
- }
125
-
126
  /**
127
  * @since 3.04.02
128
  * @param array|string $args
@@ -165,64 +115,6 @@ class FrmAppHelper {
165
  return self::make_affiliate_url( $link );
166
  }
167
 
168
- /**
169
- * @since 4.07
170
- */
171
- public static function renewal_message() {
172
- if ( ! FrmAddonsController::is_license_expired() ) {
173
- self::expiring_message();
174
- return;
175
- }
176
- ?>
177
- <div class="frm_error_style" style="text-align:left">
178
- <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
179
- &nbsp;
180
- <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
181
- <div style="float:right">
182
- <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
183
- Renew Now
184
- </a>
185
- </div>
186
- </div>
187
- <?php
188
- }
189
-
190
- /**
191
- * @since 4.08
192
- */
193
- public static function expiring_message() {
194
- $expiring = FrmAddonsController::is_license_expiring();
195
- if ( ! $expiring ) {
196
- return;
197
- }
198
- ?>
199
- <div class="frm_warning_style" style="text-align:left">
200
- <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
201
- &nbsp;
202
- <?php
203
- printf(
204
- esc_html(
205
- /* translators: %1$s: start HTML tag, %2$s: end HTML tag */
206
- _n(
207
- 'Your form subscription expires in %1$s day%2$s.',
208
- 'Your form subscription expires in %1$s days%2$s.',
209
- intval( $expiring ),
210
- 'formidable'
211
- )
212
- ),
213
- '<strong>' . esc_html( number_format_i18n( $expiring ) ),
214
- '</strong>'
215
- );
216
- ?>
217
- <div style="float:right">
218
- <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-renew', 'account/downloads/' ) ); ?>">
219
- <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
220
- </a>
221
- </div>
222
- </div>
223
- <?php
224
- }
225
-
226
  /**
227
  * Get the Formidable settings
228
  *
@@ -2622,7 +2514,7 @@ class FrmAppHelper {
2622
  if ( empty( $expired ) ) {
2623
  echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2624
  } else {
2625
- echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest Pro version or <a href="https://downloads.wordpress.org/plugin/formidable.<?php echo esc_attr( $pro_version ); ?>.zip">download the previous Lite version</a> to revert.';
2626
  }
2627
  ?>
2628
  </div>
@@ -2751,6 +2643,45 @@ class FrmAppHelper {
2751
  include_once self::plugin_path() . '/classes/views/frm-forms/multiselect-accessibility.php';
2752
  }
2753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2754
  /**
2755
  * Use the WP 4.7 wp_doing_ajax function
2756
  *
11
  /**
12
  * @since 2.0
13
  */
14
+ public static $plug_version = '4.09.01';
15
 
16
  /**
17
  * @since 1.07.02
73
  return absint( apply_filters( 'frm_affiliate_id', 0 ) );
74
  }
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  /**
77
  * @since 3.04.02
78
  * @param array|string $args
115
  return self::make_affiliate_url( $link );
116
  }
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  /**
119
  * Get the Formidable settings
120
  *
2514
  if ( empty( $expired ) ) {
2515
  echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2516
  } else {
2517
+ echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
2518
  }
2519
  ?>
2520
  </div>
2643
  include_once self::plugin_path() . '/classes/views/frm-forms/multiselect-accessibility.php';
2644
  }
2645
 
2646
+ /**
2647
+ * @since 4.07
2648
+ * @deprecated 4.09.01
2649
+ */
2650
+ public static function renewal_message() {
2651
+ if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
2652
+ FrmProAddonsController::renewal_message();
2653
+ return;
2654
+ }
2655
+
2656
+ if ( ! FrmAddonsController::is_license_expired() ) {
2657
+ return;
2658
+ }
2659
+
2660
+ ?>
2661
+ <div class="frm_error_style" style="text-align:left">
2662
+ <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
2663
+ &nbsp;
2664
+ <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
2665
+ <div style="float:right">
2666
+ <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
2667
+ <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
2668
+ </a>
2669
+ </div>
2670
+ </div>
2671
+ <?php
2672
+ }
2673
+
2674
+ /**
2675
+ * @since 4.08
2676
+ * @deprecated 4.09.01
2677
+ */
2678
+ public static function expiring_message() {
2679
+ _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
2680
+ if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
2681
+ FrmProAddonsController::expiring_message();
2682
+ }
2683
+ }
2684
+
2685
  /**
2686
  * Use the WP 4.7 wp_doing_ajax function
2687
  *
classes/helpers/FrmCSVExportHelper.php CHANGED
@@ -143,22 +143,18 @@ class FrmCSVExportHelper {
143
  $repeater_ids = array();
144
 
145
  foreach ( self::$fields as $col ) {
146
- if ( $col->form_id === self::$form_id || ! $col->field_options['in_section'] ) {
147
- $headings += self::field_headings( $col );
148
- } else {
149
- $repeater_id = $col->field_options['in_section'];
150
- $section = FrmField::getOne( $repeater_id );
151
-
152
- if ( $section && FrmField::is_repeating_field( $section ) ) {
153
- $headings[ 'repeater' . $repeater_id ] = array(); // set a placeholder to maintain order for repeater fields
154
-
155
- if ( ! isset( $fields_by_repeater_id[ $repeater_id ] ) ) {
156
- $fields_by_repeater_id[ $repeater_id ] = array();
157
- $repeater_ids[] = $repeater_id;
158
- }
159
 
160
- $fields_by_repeater_id[ $repeater_id ][] = $col;
 
 
161
  }
 
 
 
 
162
  }
163
  }
164
  unset( $repeater_id, $col );
@@ -226,6 +222,25 @@ class FrmCSVExportHelper {
226
  }
227
  }
228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  private static function has_parent_id() {
230
  return self::$has_parent_id;
231
  }
143
  $repeater_ids = array();
144
 
145
  foreach ( self::$fields as $col ) {
146
+ if ( self::is_the_child_of_a_repeater( $col ) ) {
147
+ $repeater_id = $col->field_options['in_section'];
148
+ $headings[ 'repeater' . $repeater_id ] = array(); // set a placeholder to maintain order for repeater fields
 
 
 
 
 
 
 
 
 
 
149
 
150
+ if ( ! isset( $fields_by_repeater_id[ $repeater_id ] ) ) {
151
+ $fields_by_repeater_id[ $repeater_id ] = array();
152
+ $repeater_ids[] = $repeater_id;
153
  }
154
+
155
+ $fields_by_repeater_id[ $repeater_id ][] = $col;
156
+ } else {
157
+ $headings += self::field_headings( $col );
158
  }
159
  }
160
  unset( $repeater_id, $col );
222
  }
223
  }
224
 
225
+ /**
226
+ * @param object $field
227
+ * @return bool
228
+ */
229
+ private static function is_the_child_of_a_repeater( $field ) {
230
+ if ( $field->form_id === self::$form_id || ! $field->field_options['in_section'] ) {
231
+ return false;
232
+ }
233
+
234
+ $section_id = $field->field_options['in_section'];
235
+ $section = FrmField::getOne( $section_id );
236
+
237
+ if ( ! $section ) {
238
+ return false;
239
+ }
240
+
241
+ return FrmField::is_repeating_field( $section );
242
+ }
243
+
244
  private static function has_parent_id() {
245
  return self::$has_parent_id;
246
  }
classes/helpers/FrmEntriesListHelper.php CHANGED
@@ -190,7 +190,8 @@ class FrmEntriesListHelper extends FrmListHelper {
190
  $r = "<tr id='item-action-{$item->id}'$style>";
191
 
192
  list( $columns, $hidden, , $primary ) = $this->get_column_info();
193
- $action_col = false;
 
194
 
195
  foreach ( $columns as $column_name => $column_display_name ) {
196
  $class = $column_name . ' column-' . $column_name;
@@ -199,9 +200,9 @@ class FrmEntriesListHelper extends FrmListHelper {
199
  $class .= ' column-primary';
200
  }
201
 
202
- if ( in_array( $column_name, $hidden ) ) {
203
  $class .= ' frm_hidden';
204
- } elseif ( ! $action_col && ! in_array( $column_name, array( 'cb', 'id', 'form_id', 'post_id' ) ) ) {
205
  $action_col = $column_name;
206
  }
207
 
@@ -215,7 +216,7 @@ class FrmEntriesListHelper extends FrmListHelper {
215
  if ( $this->column_name == 'cb' ) {
216
  $r .= "<th scope='row' class='check-column'>$checkbox</th>";
217
  } else {
218
- if ( in_array( $column_name, $hidden ) ) {
219
  $val = '';
220
  } else {
221
  $val = $this->column_value( $item );
@@ -238,6 +239,13 @@ class FrmEntriesListHelper extends FrmListHelper {
238
  return $r;
239
  }
240
 
 
 
 
 
 
 
 
241
  private function column_value( $item ) {
242
  $col_name = $this->column_name;
243
 
@@ -260,7 +268,13 @@ class FrmEntriesListHelper extends FrmListHelper {
260
  $val = empty( $item->is_draft ) ? esc_html__( 'No', 'formidable' ) : esc_html__( 'Yes', 'formidable' );
261
  break;
262
  case 'form_id':
263
- $val = FrmFormsHelper::edit_form_link( $item->form_id );
 
 
 
 
 
 
264
  break;
265
  case 'post_id':
266
  $val = FrmAppHelper::post_edit_link( $item->post_id );
190
  $r = "<tr id='item-action-{$item->id}'$style>";
191
 
192
  list( $columns, $hidden, , $primary ) = $this->get_column_info();
193
+ $action_col = false;
194
+ $action_columns = $this->get_action_columns();
195
 
196
  foreach ( $columns as $column_name => $column_display_name ) {
197
  $class = $column_name . ' column-' . $column_name;
200
  $class .= ' column-primary';
201
  }
202
 
203
+ if ( in_array( $column_name, $hidden, true ) ) {
204
  $class .= ' frm_hidden';
205
+ } elseif ( ! $action_col && ! in_array( $column_name, $action_columns, true ) ) {
206
  $action_col = $column_name;
207
  }
208
 
216
  if ( $this->column_name == 'cb' ) {
217
  $r .= "<th scope='row' class='check-column'>$checkbox</th>";
218
  } else {
219
+ if ( in_array( $column_name, $hidden, true ) ) {
220
  $val = '';
221
  } else {
222
  $val = $this->column_value( $item );
239
  return $r;
240
  }
241
 
242
+ /**
243
+ * Get the column names that the logged in user can action on
244
+ */
245
+ private function get_action_columns() {
246
+ return array( 'cb', 'form_id', 'id', 'post_id' );
247
+ }
248
+
249
  private function column_value( $item ) {
250
  $col_name = $this->column_name;
251
 
268
  $val = empty( $item->is_draft ) ? esc_html__( 'No', 'formidable' ) : esc_html__( 'Yes', 'formidable' );
269
  break;
270
  case 'form_id':
271
+ $form_id = $item->form_id;
272
+ $user_can_edit_forms = false === FrmAppHelper::permission_nonce_error( 'frm_edit_forms' );
273
+ if ( $user_can_edit_forms ) {
274
+ $val = FrmFormsHelper::edit_form_link( $form_id );
275
+ } else {
276
+ $val = FrmFormsHelper::edit_form_link_label( $form_id );
277
+ }
278
  break;
279
  case 'post_id':
280
  $val = FrmAppHelper::post_edit_link( $item->post_id );
classes/helpers/FrmFormsHelper.php CHANGED
@@ -1006,22 +1006,51 @@ BEFORE_HTML;
1006
  return $actions;
1007
  }
1008
 
1009
- public static function edit_form_link( $form_id ) {
1010
- if ( is_object( $form_id ) ) {
1011
- $form = $form_id;
1012
- $name = $form->name;
1013
- $form_id = $form->id;
1014
- } else {
1015
- $name = FrmForm::getName( $form_id );
1016
  }
1017
 
1018
- if ( $form_id ) {
1019
- $val = '<a href="' . esc_url( FrmForm::get_edit_link( $form_id ) ) . '">' . ( '' == $name ? __( '(no title)', 'formidable' ) : FrmAppHelper::truncate( $name, 40 ) ) . '</a>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1020
  } else {
1021
- $val = '';
1022
  }
 
 
1023
 
1024
- return $val;
 
 
 
 
 
 
 
 
 
 
 
1025
  }
1026
 
1027
  public static function delete_trash_link( $id, $status, $length = 'label' ) {
1006
  return $actions;
1007
  }
1008
 
1009
+ public static function edit_form_link( $data ) {
1010
+ $form_id = self::get_form_id_from_data( $data );
1011
+
1012
+ if ( ! $form_id ) {
1013
+ return '';
 
 
1014
  }
1015
 
1016
+ $label = self::edit_form_link_label( $data );
1017
+ $link = '<a href="' . esc_url( FrmForm::get_edit_link( $form_id ) ) . '">' . esc_html( $label ) . '</a>';
1018
+ return $link;
1019
+ }
1020
+
1021
+ public static function edit_form_link_label( $data ) {
1022
+ $name = self::get_form_name_from_data( $data );
1023
+ if ( ! $name ) {
1024
+ return __( '(no title)', 'formidable' );
1025
+ }
1026
+ return FrmAppHelper::truncate( $name, 40 );
1027
+ }
1028
+
1029
+ /**
1030
+ * @param mixed data
1031
+ * @return int
1032
+ */
1033
+ private static function get_form_id_from_data( $data ) {
1034
+ if ( is_object( $data ) ) {
1035
+ $form_id = $data->id;
1036
  } else {
1037
+ $form_id = $data;
1038
  }
1039
+ return $form_id;
1040
+ }
1041
 
1042
+ /**
1043
+ * @param mixed $data
1044
+ * @return string
1045
+ */
1046
+ private static function get_form_name_from_data( $data ) {
1047
+ if ( is_object( $data ) ) {
1048
+ $form_name = $data->name;
1049
+ } else {
1050
+ $form_id = $data;
1051
+ $form_name = FrmForm::getName( $form_id );
1052
+ }
1053
+ return $form_name;
1054
  }
1055
 
1056
  public static function delete_trash_link( $id, $status, $length = 'label' ) {
classes/models/FrmFormApi.php CHANGED
@@ -68,7 +68,19 @@ class FrmFormApi {
68
  return $addons;
69
  }
70
 
71
- $response = wp_remote_get( $url );
 
 
 
 
 
 
 
 
 
 
 
 
72
  if ( is_array( $response ) && ! is_wp_error( $response ) ) {
73
  $addons = $response['body'];
74
  if ( ! empty( $addons ) ) {
68
  return $addons;
69
  }
70
 
71
+ // We need to know the version number to allow different downloads.
72
+ $agent = 'formidable/' . FrmAppHelper::plugin_version();
73
+ if ( class_exists( 'FrmProDb' ) ) {
74
+ $agent = 'formidable-pro/' . FrmProDb::$plug_version;
75
+ }
76
+
77
+ $response = wp_remote_get(
78
+ $url,
79
+ array(
80
+ 'timeout' => 25,
81
+ 'user-agent' => $agent . '; ' . get_bloginfo( 'url' ),
82
+ )
83
+ );
84
  if ( is_array( $response ) && ! is_wp_error( $response ) ) {
85
  $addons = $response['body'];
86
  if ( ! empty( $addons ) ) {
classes/models/fields/FrmFieldType.php CHANGED
@@ -1082,13 +1082,70 @@ DEFAULT_HTML;
1082
  // Override in a child class.
1083
  }
1084
 
 
 
 
 
 
 
 
1085
  public function is_not_unique( $value, $entry_id ) {
1086
- $exists = false;
1087
- if ( FrmAppHelper::pro_is_installed() ) {
1088
- $exists = FrmProEntryMetaHelper::value_exists( $this->get_field_column( 'id' ), $value, $entry_id );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1089
  }
1090
 
1091
- return $exists;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1092
  }
1093
 
1094
  public function get_value_to_save( $value, $atts ) {
1082
  // Override in a child class.
1083
  }
1084
 
1085
+ /**
1086
+ * A field is not unique if it has already been passed to this function, or if it exists in meta for this field but another entry id
1087
+ *
1088
+ * @param mixed $value
1089
+ * @param int $entry_id
1090
+ * @return bool
1091
+ */
1092
  public function is_not_unique( $value, $entry_id ) {
1093
+ if ( $this->value_has_already_been_validated_as_unique( $value ) ) {
1094
+ return true;
1095
+ }
1096
+
1097
+ if ( $this->value_exists_in_meta_for_another_entry( $value, $entry_id ) ) {
1098
+ return true;
1099
+ }
1100
+
1101
+ $this->value_validated_as_unique( $value );
1102
+ return false;
1103
+ }
1104
+
1105
+ /**
1106
+ * @param mixed $value
1107
+ * @return bool
1108
+ */
1109
+ private function value_has_already_been_validated_as_unique( $value ) {
1110
+ global $frm_validated_unique_values;
1111
+
1112
+ if ( empty( $frm_validated_unique_values ) ) {
1113
+ $frm_validated_unique_values = array();
1114
+ return false;
1115
  }
1116
 
1117
+ $field_id = $this->get_field_column( 'id' );
1118
+ if ( ! array_key_exists( $field_id, $frm_validated_unique_values ) ) {
1119
+ $frm_validated_unique_values[ $field_id ] = array();
1120
+ return false;
1121
+ }
1122
+
1123
+ $already_validated_this_value = in_array( $value, $frm_validated_unique_values[ $field_id ], true );
1124
+ return $already_validated_this_value;
1125
+ }
1126
+
1127
+ /**
1128
+ * @param mixed $value
1129
+ * @param int $entry_id
1130
+ * @return bool
1131
+ */
1132
+ private function value_exists_in_meta_for_another_entry( $value, $entry_id ) {
1133
+ if ( ! FrmAppHelper::pro_is_installed() ) {
1134
+ return false;
1135
+ }
1136
+ $field_id = $this->get_field_column( 'id' );
1137
+ return FrmProEntryMetaHelper::value_exists( $field_id, $value, $entry_id );
1138
+ }
1139
+
1140
+ /**
1141
+ * Track that a value has been flagged as unique so that no other iterations can be for the same value for this field
1142
+ *
1143
+ * @param mixed $value
1144
+ */
1145
+ private function value_validated_as_unique( $value ) {
1146
+ global $frm_validated_unique_values;
1147
+ $field_id = $this->get_field_column( 'id' );
1148
+ $frm_validated_unique_values[ $field_id ][] = $value;
1149
  }
1150
 
1151
  public function get_value_to_save( $value, $atts ) {
classes/views/addons/list.php CHANGED
@@ -77,7 +77,15 @@ if ( ! defined( 'ABSPATH' ) ) {
77
  );
78
  ?>
79
  </span>
80
- <?php FrmAppHelper::conditional_action_button( $addon, ! empty( $license_type ) ? $license_type : false, $plan_required, $pricing ); ?>
 
 
 
 
 
 
 
 
81
  </div>
82
  </div>
83
  <?php } ?>
77
  );
78
  ?>
79
  </span>
80
+ <?php
81
+ $passing = array(
82
+ 'addon' => $addon,
83
+ 'license_type' => ! empty( $license_type ) ? $license_type : false,
84
+ 'plan_required' => 'plan_required',
85
+ 'upgrade_link' => $pricing,
86
+ );
87
+ FrmAddonsController::show_conditional_action_button( $passing );
88
+ ?>
89
  </div>
90
  </div>
91
  <?php } ?>
classes/views/frm-entries/list.php CHANGED
@@ -51,8 +51,8 @@ if ( ! defined( 'ABSPATH' ) ) {
51
  <div class="clear"></div>
52
  <?php require( FrmAppHelper::plugin_path() . '/classes/views/shared/errors.php' ); ?>
53
  <?php $wp_list_table->display(); ?>
54
- <?php FrmAppHelper::renewal_message(); ?>
55
  </form>
 
56
  </div>
57
  <?php if ( $form ) { ?>
58
  </div>
51
  <div class="clear"></div>
52
  <?php require( FrmAppHelper::plugin_path() . '/classes/views/shared/errors.php' ); ?>
53
  <?php $wp_list_table->display(); ?>
 
54
  </form>
55
+ <?php do_action( 'frm_page_footer', array( 'table' => $wp_list_table ) ); ?>
56
  </div>
57
  <?php if ( $form ) { ?>
58
  </div>
classes/views/frm-forms/form.php CHANGED
@@ -36,7 +36,7 @@ if ( ! defined( 'ABSPATH' ) ) {
36
  }
37
  ?>
38
  </ul>
39
- <?php FrmAppHelper::renewal_message(); ?>
40
  <p id="frm-form-button">
41
  <button class="frm_button_submit" disabled="disabled">
42
  <?php echo esc_attr( isset( $form->options['submit_value'] ) ? $form->options['submit_value'] : __( 'Submit', 'formidable' ) ); ?>
@@ -53,6 +53,8 @@ if ( ! defined( 'ABSPATH' ) ) {
53
  </p>
54
  <div class="clear"></div>
55
  </div>
 
 
56
  </div>
57
  <?php
58
  FrmFieldsHelper::bulk_options_overlay();
36
  }
37
  ?>
38
  </ul>
39
+
40
  <p id="frm-form-button">
41
  <button class="frm_button_submit" disabled="disabled">
42
  <?php echo esc_attr( isset( $form->options['submit_value'] ) ? $form->options['submit_value'] : __( 'Submit', 'formidable' ) ); ?>
53
  </p>
54
  <div class="clear"></div>
55
  </div>
56
+
57
+ <?php do_action( 'frm_page_footer', array( 'table' => 'form-builder' ) ); ?>
58
  </div>
59
  <?php
60
  FrmFieldsHelper::bulk_options_overlay();
classes/views/frm-forms/list.php CHANGED
@@ -40,9 +40,9 @@ if ( $wp_list_table->total_items === 1 && empty( $_REQUEST['s'] ) && $wp_list_ta
40
  }
41
  }
42
 
43
- FrmAppHelper::renewal_message();
44
  ?>
45
  </form>
46
 
 
47
  </div>
48
  </div>
40
  }
41
  }
42
 
 
43
  ?>
44
  </form>
45
 
46
+ <?php do_action( 'frm_page_footer', array( 'table' => $wp_list_table ) ); ?>
47
  </div>
48
  </div>
classes/views/frm-forms/new-form-overlay.php CHANGED
@@ -85,15 +85,8 @@ if ( ! defined( 'ABSPATH' ) ) {
85
  <?php require $view_path . 'renew-account.php'; ?>
86
  </div>
87
  <?php } ?>
88
- <?php if ( $expired ) { ?>
89
- <div id="frm-create-footer" class="frm_modal_footer">
90
- <?php FrmAppHelper::renewal_message(); ?>
91
- </div>
92
- <?php } elseif ( $expiring ) { ?>
93
- <div id="frm-create-footer" class="frm_modal_footer">
94
- <?php FrmAppHelper::expiring_message(); ?>
95
- </div>
96
- <?php } ?>
97
  <div id="frm-preview-footer" class="frm_modal_footer">
98
  <a href="#" class="button button-secondary frm-button-secondary frm-back-to-all-templates">
99
  <?php esc_html_e( 'Back to all templates', 'formidable' ); ?>
85
  <?php require $view_path . 'renew-account.php'; ?>
86
  </div>
87
  <?php } ?>
88
+ <?php do_action( 'frm_overlay_footer', array( 'type' => 'form' ) ); ?>
89
+
 
 
 
 
 
 
 
90
  <div id="frm-preview-footer" class="frm_modal_footer">
91
  <a href="#" class="button button-secondary frm-button-secondary frm-back-to-all-templates">
92
  <?php esc_html_e( 'Back to all templates', 'formidable' ); ?>
classes/views/frm-forms/settings.php CHANGED
@@ -56,6 +56,7 @@ if ( ! defined( 'ABSPATH' ) ) {
56
  <?php do_action( 'frm_add_form_option_section', $values ); ?>
57
  <div class="clear"></div>
58
  <?php include( FrmAppHelper::plugin_path() . '/classes/views/frm-forms/mb_insert_fields.php' ); ?>
 
59
  </div>
60
  </div>
61
  </div>
56
  <?php do_action( 'frm_add_form_option_section', $values ); ?>
57
  <div class="clear"></div>
58
  <?php include( FrmAppHelper::plugin_path() . '/classes/views/frm-forms/mb_insert_fields.php' ); ?>
59
+ <?php do_action( 'frm_page_footer', array( 'table' => 'form-settings' ) ); ?>
60
  </div>
61
  </div>
62
  </div>
deprecated/FrmDeprecated.php CHANGED
@@ -166,6 +166,27 @@ class FrmDeprecated {
166
  return $api->get_pro_updater();
167
  }
168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  /**
170
  * @since 3.04.03
171
  * @deprecated 3.06
166
  return $api->get_pro_updater();
167
  }
168
 
169
+ /**
170
+ * @since 3.04.02
171
+ * @deprecated 4.09.01
172
+ */
173
+ public static function ajax_install_addon() {
174
+ _deprecated_function( __FUNCTION__, '4.09.01', 'FrmProAddonsController::' . __METHOD__ );
175
+ echo json_encode( __( 'Your plugin has been not been installed. Please update Formidable Pro to get downloads.', 'formidable' ) );
176
+ wp_die();
177
+ }
178
+
179
+ /**
180
+ * @since 4.06.02
181
+ * @deprecated 4.09.01
182
+ * @codeCoverageIgnore
183
+ */
184
+ public static function ajax_multiple_addons() {
185
+ _deprecated_function( __FUNCTION__, '4.09.01', 'FrmProAddonsController::' . __METHOD__ );
186
+ echo json_encode( __( 'Your plugin has been not been installed. Please update Formidable Pro to get downloads.', 'formidable' ) );
187
+ wp_die();
188
+ }
189
+
190
  /**
191
  * @since 3.04.03
192
  * @deprecated 3.06
formidable.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
- Version: 4.09
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
+ Version: 4.09.01
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11
js/formidable_admin.js CHANGED
@@ -2237,6 +2237,7 @@ function frmAdminBuildJS() {
2237
  function maybeClearOptText() {
2238
  /*jshint validthis:true */
2239
  if ( this.value === frm_admin_js.new_option ) {
 
2240
  this.value = '';
2241
  }
2242
  }
@@ -2446,7 +2447,9 @@ function frmAdminBuildJS() {
2446
  }
2447
  }
2448
 
2449
- this.setAttribute( 'data-value-on-focus', this.value );
 
 
2450
  }
2451
 
2452
  function onOptionTextBlur() {
@@ -2504,7 +2507,12 @@ function frmAdminBuildJS() {
2504
 
2505
  logicId = row.id.split( '_' )[ 2 ];
2506
  valueSelect = row.querySelector( 'select[name="field_options[hide_opt_' + logicId + '][]"]' );
2507
- optionMatches = valueSelect.querySelectorAll( 'option[value="' + oldValue + '"]' );
 
 
 
 
 
2508
 
2509
  if ( ! optionMatches.length ) {
2510
  optionMatches = valueSelect.querySelectorAll( 'option[value="' + newValue + '"]' );
@@ -2968,6 +2976,64 @@ function frmAdminBuildJS() {
2968
  container.append( addRadioCheckboxOpt( type, opts[ i ], fieldId, fieldInfo.fieldKey, isProduct, imageOptionClass ) );
2969
  }
2970
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2971
  }
2972
 
2973
  function addRadioCheckboxOpt( type, opt, fieldId, fieldKey, isProduct, classes ) {
2237
  function maybeClearOptText() {
2238
  /*jshint validthis:true */
2239
  if ( this.value === frm_admin_js.new_option ) {
2240
+ this.setAttribute( 'data-value-on-focus', this.value );
2241
  this.value = '';
2242
  }
2243
  }
2447
  }
2448
  }
2449
 
2450
+ if ( '' !== this.value || frm_admin_js.new_option !== this.getAttribute( 'data-value-on-focus' ) ) {
2451
+ this.setAttribute( 'data-value-on-focus', this.value );
2452
+ }
2453
  }
2454
 
2455
  function onOptionTextBlur() {
2507
 
2508
  logicId = row.id.split( '_' )[ 2 ];
2509
  valueSelect = row.querySelector( 'select[name="field_options[hide_opt_' + logicId + '][]"]' );
2510
+
2511
+ if ( '' === oldValue ) {
2512
+ optionMatches = [];
2513
+ } else {
2514
+ optionMatches = valueSelect.querySelectorAll( 'option[value="' + oldValue + '"]' );
2515
+ }
2516
 
2517
  if ( ! optionMatches.length ) {
2518
  optionMatches = valueSelect.querySelectorAll( 'option[value="' + newValue + '"]' );
2976
  container.append( addRadioCheckboxOpt( type, opts[ i ], fieldId, fieldInfo.fieldKey, isProduct, imageOptionClass ) );
2977
  }
2978
  }
2979
+
2980
+ adjustConditionalLogicOptionOrders( fieldId );
2981
+ }
2982
+
2983
+ function adjustConditionalLogicOptionOrders( fieldId ) {
2984
+ var row, opts, logicId, valueSelect, rowOptions, expectedOrder, optionLength, optionIndex, expectedOption, optionMatch,
2985
+ rows = document.getElementById( 'frm_builder_page' ).querySelectorAll( '.frm_logic_row' ),
2986
+ rowLength = rows.length,
2987
+ fieldOptions = getFieldOptions( fieldId ),
2988
+ optionLength = fieldOptions.length;
2989
+
2990
+ for ( rowIndex = 0; rowIndex < rowLength; rowIndex++ ) {
2991
+ row = rows[ rowIndex ];
2992
+ opts = row.querySelector( '.frm_logic_field_opts' );
2993
+
2994
+ if ( opts.value != fieldId ) {
2995
+ continue;
2996
+ }
2997
+
2998
+ logicId = row.id.split( '_' )[ 2 ];
2999
+ valueSelect = row.querySelector( 'select[name="field_options[hide_opt_' + logicId + '][]"]' );
3000
+
3001
+ for ( optionIndex = optionLength - 1; optionIndex >= 0; optionIndex-- ) {
3002
+ expectedOption = fieldOptions[ optionIndex ];
3003
+ optionMatch = valueSelect.querySelector( 'option[value="' + expectedOption + '"]' );
3004
+
3005
+ if ( optionMatch === null ) {
3006
+ optionMatch = document.createElement( 'option' );
3007
+ optionMatch.setAttribute( 'value', expectedOption );
3008
+ optionMatch.textContent = expectedOption;
3009
+ }
3010
+
3011
+ valueSelect.prepend( optionMatch );
3012
+ }
3013
+ }
3014
+
3015
+ optionMatch = valueSelect.querySelector( 'option[value=""]' );
3016
+ if ( optionMatch !== null ) {
3017
+ valueSelect.prepend( optionMatch );
3018
+ }
3019
+ }
3020
+
3021
+ function getFieldOptions( fieldId ) {
3022
+ var index, input, li,
3023
+ listItems = document.getElementById( 'frm_field_' + fieldId + '_opts' ).querySelectorAll( '.frm_single_option' ),
3024
+ options = [],
3025
+ length = listItems.length;
3026
+ for ( index = 0; index < length; index++ ) {
3027
+ li = listItems[ index ];
3028
+
3029
+ if ( li.classList.contains( 'frm_hidden' ) ) {
3030
+ continue;
3031
+ }
3032
+
3033
+ input = li.querySelector( '.field_' + fieldId + '_option' );
3034
+ options.push( input.value );
3035
+ }
3036
+ return options;
3037
  }
3038
 
3039
  function addRadioCheckboxOpt( type, opt, fieldId, fieldKey, isProduct, classes ) {
languages/formidable.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Formidable Forms 4.09\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/formidable\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2020-11-02T21:20:05+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.1.0\n"
15
  "X-Domain: formidable\n"
@@ -262,7 +262,7 @@ msgid "Dropdown"
262
  msgstr ""
263
 
264
  #: classes/models/FrmField.php:34
265
- #: classes/controllers/FrmFormsController.php:1227
266
  msgid "Email"
267
  msgstr ""
268
 
@@ -287,7 +287,7 @@ msgid "Hidden"
287
  msgstr ""
288
 
289
  #: classes/models/FrmField.php:58
290
- #: classes/controllers/FrmFormsController.php:1222
291
  msgid "User ID"
292
  msgstr ""
293
 
@@ -398,7 +398,7 @@ msgid "Quantity"
398
  msgstr ""
399
 
400
  #: classes/models/FrmField.php:189
401
- #: classes/helpers/FrmFormsHelper.php:1118
402
  msgid "Total"
403
  msgstr ""
404
 
@@ -721,7 +721,7 @@ msgstr ""
721
  #: classes/controllers/FrmAddonsController.php:23
722
  #: classes/views/shared/admin-header.php:23
723
  #: classes/views/frm-fields/back-end/smart-values.php:16
724
- #: classes/helpers/FrmFormsHelper.php:1297
725
  msgid "Upgrade"
726
  msgstr ""
727
 
@@ -729,37 +729,36 @@ msgstr ""
729
  msgid "There are no plugins on your site that require a license"
730
  msgstr ""
731
 
732
- #: classes/controllers/FrmAddonsController.php:609
733
  msgid "Installed"
734
  msgstr ""
735
 
736
- #: classes/controllers/FrmAddonsController.php:614
737
- #: classes/helpers/FrmAppHelper.php:2564
738
  msgid "Active"
739
  msgstr ""
740
 
741
- #: classes/controllers/FrmAddonsController.php:619
742
  msgid "Not Installed"
743
  msgstr ""
744
 
745
- #: classes/controllers/FrmAddonsController.php:871
746
- msgid "Your plugin has been installed. Please reload the page to see more options."
747
- msgstr ""
748
-
749
- #: classes/controllers/FrmAddonsController.php:920
750
  msgid "Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually."
751
  msgstr ""
752
 
753
- #: classes/controllers/FrmAddonsController.php:976
754
  msgid "Your plugin has been activated. Please reload the page to see more options."
755
  msgstr ""
756
 
757
- #: classes/controllers/FrmAddonsController.php:1008
758
- msgid "Your plugins have been installed and activated."
759
  msgstr ""
760
 
761
- #: classes/controllers/FrmAddonsController.php:1108
762
- msgid "Could not install an upgrade. Please download from formidableforms.com and install manually."
 
 
 
763
  msgstr ""
764
 
765
  #: classes/controllers/FrmAppController.php:150
@@ -1033,9 +1032,7 @@ msgstr ""
1033
  #: classes/controllers/FrmSMTPController.php:305
1034
  #: classes/views/shared/upgrade_overlay.php:32
1035
  #: classes/helpers/FrmFormMigratorsHelper.php:131
1036
- #: classes/helpers/FrmAppHelper.php:103
1037
- #: classes/helpers/FrmAppHelper.php:104
1038
- #: classes/helpers/FrmAppHelper.php:2563
1039
  msgid "Install"
1040
  msgstr ""
1041
 
@@ -1049,7 +1046,6 @@ msgstr ""
1049
 
1050
  #: classes/controllers/FrmSMTPController.php:322
1051
  #: classes/views/addons/settings.php:31
1052
- #: classes/helpers/FrmAppHelper.php:98
1053
  msgid "Activate"
1054
  msgstr ""
1055
 
@@ -1101,7 +1097,7 @@ msgid "Your form styles have been saved."
1101
  msgstr ""
1102
 
1103
  #: classes/controllers/FrmStylesController.php:393
1104
- #: classes/controllers/FrmFormsController.php:1013
1105
  msgid "General"
1106
  msgstr ""
1107
 
@@ -1174,7 +1170,7 @@ msgid "Settings Successfully Updated"
1174
  msgstr ""
1175
 
1176
  #: classes/controllers/FrmFormsController.php:168
1177
- #: classes/controllers/FrmFormsController.php:947
1178
  msgid "Form was successfully updated."
1179
  msgstr ""
1180
 
@@ -1184,7 +1180,7 @@ msgid "However, your form is very long and may be %1$sreaching server limits%2$s
1184
  msgstr ""
1185
 
1186
  #: classes/controllers/FrmFormsController.php:227
1187
- #: deprecated/FrmDeprecated.php:403
1188
  msgid "Form template was Successfully Created"
1189
  msgstr ""
1190
 
@@ -1272,7 +1268,7 @@ msgstr ""
1272
  #: classes/controllers/FrmFormsController.php:732
1273
  #: classes/controllers/FrmFormsController.php:736
1274
  #: classes/views/shared/mb_adv_info.php:98
1275
- #: classes/helpers/FrmCSVExportHelper.php:223
1276
  msgid "Key"
1277
  msgstr ""
1278
 
@@ -1280,167 +1276,167 @@ msgstr ""
1280
  msgid "Shortcodes"
1281
  msgstr ""
1282
 
1283
- #: classes/controllers/FrmFormsController.php:861
1284
- #: classes/helpers/FrmFormsHelper.php:1240
1285
  msgid "My Templates"
1286
  msgstr ""
1287
 
1288
- #: classes/controllers/FrmFormsController.php:921
1289
  msgid "You are trying to edit a form that does not exist."
1290
  msgstr ""
1291
 
1292
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
1293
- #: classes/controllers/FrmFormsController.php:926
1294
  msgid "You are trying to edit a child form. Please edit from %1$shere%2$s"
1295
  msgstr ""
1296
 
1297
- #: classes/controllers/FrmFormsController.php:949
1298
  msgid "Template was successfully updated."
1299
  msgstr ""
1300
 
1301
- #: classes/controllers/FrmFormsController.php:1014
1302
  msgid "General Form Settings"
1303
  msgstr ""
1304
 
1305
- #: classes/controllers/FrmFormsController.php:1019
1306
  msgid "Actions & Notifications"
1307
  msgstr ""
1308
 
1309
- #: classes/controllers/FrmFormsController.php:1025
1310
- #: classes/controllers/FrmFormsController.php:1030
1311
  msgid "Form Permissions"
1312
  msgstr ""
1313
 
1314
- #: classes/controllers/FrmFormsController.php:1031
1315
  msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
1316
  msgstr ""
1317
 
1318
- #: classes/controllers/FrmFormsController.php:1035
1319
  msgid "Form Scheduling"
1320
  msgstr ""
1321
 
1322
- #: classes/controllers/FrmFormsController.php:1040
1323
  msgid "Form scheduling settings"
1324
  msgstr ""
1325
 
1326
- #: classes/controllers/FrmFormsController.php:1044
1327
  msgid "Styling & Buttons"
1328
  msgstr ""
1329
 
1330
- #: classes/controllers/FrmFormsController.php:1050
1331
  msgid "Customize HTML"
1332
  msgstr ""
1333
 
1334
- #: classes/controllers/FrmFormsController.php:1159
1335
  msgid "Customize field values with the following parameters."
1336
  msgstr ""
1337
 
1338
- #: classes/controllers/FrmFormsController.php:1196
1339
  msgid "Separator"
1340
  msgstr ""
1341
 
1342
- #: classes/controllers/FrmFormsController.php:1197
1343
  msgid "Use a different separator for checkbox fields"
1344
  msgstr ""
1345
 
1346
- #: classes/controllers/FrmFormsController.php:1200
1347
  msgid "Date Format"
1348
  msgstr ""
1349
 
1350
- #: classes/controllers/FrmFormsController.php:1203
1351
  #: classes/views/frm-fields/back-end/settings.php:27
1352
  msgid "Field Label"
1353
  msgstr ""
1354
 
1355
- #: classes/controllers/FrmFormsController.php:1206
1356
  msgid "No Auto P"
1357
  msgstr ""
1358
 
1359
- #: classes/controllers/FrmFormsController.php:1207
1360
  msgid "Do not automatically add any paragraphs or line breaks"
1361
  msgstr ""
1362
 
1363
- #: classes/controllers/FrmFormsController.php:1223
1364
  msgid "First Name"
1365
  msgstr ""
1366
 
1367
- #: classes/controllers/FrmFormsController.php:1224
1368
  msgid "Last Name"
1369
  msgstr ""
1370
 
1371
- #: classes/controllers/FrmFormsController.php:1225
1372
  msgid "Display Name"
1373
  msgstr ""
1374
 
1375
- #: classes/controllers/FrmFormsController.php:1226
1376
  msgid "User Login"
1377
  msgstr ""
1378
 
1379
- #: classes/controllers/FrmFormsController.php:1228
1380
  msgid "Avatar"
1381
  msgstr ""
1382
 
1383
- #: classes/controllers/FrmFormsController.php:1229
1384
  msgid "Author Link"
1385
  msgstr ""
1386
 
1387
- #: classes/controllers/FrmFormsController.php:1242
1388
  #: classes/views/frm-entries/sidebar-shared.php:51
1389
  msgid "Entry ID"
1390
  msgstr ""
1391
 
1392
- #: classes/controllers/FrmFormsController.php:1243
1393
  #: classes/controllers/FrmEntriesController.php:79
1394
  #: classes/views/frm-entries/sidebar-shared.php:57
1395
  #: classes/views/frm-entries/form.php:54
1396
  msgid "Entry Key"
1397
  msgstr ""
1398
 
1399
- #: classes/controllers/FrmFormsController.php:1244
1400
  msgid "Post ID"
1401
  msgstr ""
1402
 
1403
- #: classes/controllers/FrmFormsController.php:1245
1404
  msgid "User IP"
1405
  msgstr ""
1406
 
1407
- #: classes/controllers/FrmFormsController.php:1246
1408
  msgid "Entry created"
1409
  msgstr ""
1410
 
1411
- #: classes/controllers/FrmFormsController.php:1247
1412
  msgid "Entry updated"
1413
  msgstr ""
1414
 
1415
- #: classes/controllers/FrmFormsController.php:1249
1416
  msgid "Site URL"
1417
  msgstr ""
1418
 
1419
- #: classes/controllers/FrmFormsController.php:1250
1420
  msgid "Site Name"
1421
  msgstr ""
1422
 
1423
- #: classes/controllers/FrmFormsController.php:1258
1424
  msgid "Default Msg"
1425
  msgstr ""
1426
 
1427
- #: classes/controllers/FrmFormsController.php:1259
1428
  msgid "Default HTML"
1429
  msgstr ""
1430
 
1431
- #: classes/controllers/FrmFormsController.php:1260
1432
  msgid "Default Plain"
1433
  msgstr ""
1434
 
1435
- #: classes/controllers/FrmFormsController.php:1349
1436
  msgid "No forms were specified"
1437
  msgstr ""
1438
 
1439
- #: classes/controllers/FrmFormsController.php:1461
1440
  msgid "Abnormal HTML characters prevented your form from saving correctly"
1441
  msgstr ""
1442
 
1443
- #: classes/controllers/FrmFormsController.php:1576
1444
  #: classes/views/frm-forms/create-template-from-an-existing-form.php:25
1445
  #: classes/views/xml/import_form.php:133
1446
  #: classes/views/styles/manage.php:59
@@ -1448,21 +1444,21 @@ msgstr ""
1448
  #: classes/helpers/FrmFormsHelper.php:57
1449
  #: classes/helpers/FrmFormsHelper.php:112
1450
  #: classes/helpers/FrmFormsHelper.php:166
1451
- #: classes/helpers/FrmFormsHelper.php:1019
1452
  msgid "(no title)"
1453
  msgstr ""
1454
 
1455
- #: classes/controllers/FrmFormsController.php:1622
1456
- #: classes/controllers/FrmFormsController.php:1636
1457
  msgid "Please select a valid form"
1458
  msgstr ""
1459
 
1460
- #: classes/controllers/FrmFormsController.php:1858
1461
  msgid "Please wait while you are redirected."
1462
  msgstr ""
1463
 
1464
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
1465
- #: classes/controllers/FrmFormsController.php:1894
1466
  msgid "%1$sClick here%2$s if you are not automatically redirected."
1467
  msgstr ""
1468
 
@@ -1514,7 +1510,7 @@ msgid "Entry Name"
1514
  msgstr ""
1515
 
1516
  #: classes/controllers/FrmEntriesController.php:86
1517
- #: classes/helpers/FrmCSVExportHelper.php:218
1518
  msgid "Created By"
1519
  msgstr ""
1520
 
@@ -1646,14 +1642,14 @@ msgid "Renew your account"
1646
  msgstr ""
1647
 
1648
  #: classes/views/frm-forms/new-form-overlay.php:33
1649
- #: classes/views/frm-forms/new-form-overlay.php:107
1650
- #: classes/views/frm-forms/new-form-overlay.php:116
1651
- #: classes/views/frm-forms/new-form-overlay.php:126
1652
- #: classes/views/frm-forms/new-form-overlay.php:136
1653
- #: classes/views/frm-forms/new-form-overlay.php:146
1654
  #: classes/views/shared/confirm-overlay.php:19
1655
  #: classes/views/shared/admin-header.php:54
1656
- #: classes/helpers/FrmAppHelper.php:2524
1657
  msgid "Cancel"
1658
  msgstr ""
1659
 
@@ -1672,54 +1668,44 @@ msgid "(optional)"
1672
  msgstr ""
1673
 
1674
  #: classes/views/frm-forms/new-form-overlay.php:64
1675
- #: classes/views/frm-forms/new-form-overlay.php:110
1676
  #: deprecated/FrmDeprecated.php:66
1677
  msgid "Create"
1678
  msgstr ""
1679
 
1680
- #: classes/views/frm-forms/new-form-overlay.php:99
1681
  msgid "Back to all templates"
1682
  msgstr ""
1683
 
1684
- #: classes/views/frm-forms/new-form-overlay.php:102
1685
  msgid "Use this template"
1686
  msgstr ""
1687
 
1688
- #: classes/views/frm-forms/new-form-overlay.php:119
1689
- #: classes/views/shared/reports-info.php:24
1690
- #: classes/helpers/FrmAppHelper.php:88
1691
- #: classes/helpers/FrmAppHelper.php:89
1692
- #: classes/helpers/FrmAppHelper.php:109
1693
- #: classes/helpers/FrmAppHelper.php:119
1694
- #: classes/helpers/FrmAppHelper.php:120
1695
- msgid "Upgrade Now"
1696
- msgstr ""
1697
-
1698
- #: classes/views/frm-forms/new-form-overlay.php:129
1699
  msgid "Get Code"
1700
  msgstr ""
1701
 
1702
- #: classes/views/frm-forms/new-form-overlay.php:139
1703
  msgid "Save Code"
1704
  msgstr ""
1705
 
1706
- #: classes/views/frm-forms/new-form-overlay.php:149
1707
  msgid "Renew my account"
1708
  msgstr ""
1709
 
1710
- #: classes/views/frm-forms/new-form-overlay.php:165
1711
  msgid "Delete form"
1712
  msgstr ""
1713
 
1714
- #: classes/views/frm-forms/new-form-overlay.php:169
1715
  msgid "Preview form"
1716
  msgstr ""
1717
 
1718
- #: classes/views/frm-forms/new-form-overlay.php:173
1719
  msgid "Create form"
1720
  msgstr ""
1721
 
1722
- #: classes/views/frm-forms/new-form-overlay.php:177
1723
  msgid "Unlock form"
1724
  msgstr ""
1725
 
@@ -1731,7 +1717,7 @@ msgstr ""
1731
  #: classes/views/shared/mb_adv_info.php:40
1732
  #: classes/views/shared/mb_adv_info.php:183
1733
  #: classes/views/frm-entries/list.php:47
1734
- #: classes/helpers/FrmAppHelper.php:1039
1735
  msgid "Search"
1736
  msgstr ""
1737
 
@@ -1987,7 +1973,7 @@ msgid "Show Page Content"
1987
  msgstr ""
1988
 
1989
  #: classes/views/frm-forms/settings-advanced.php:98
1990
- #: classes/helpers/FrmAppHelper.php:1164
1991
  msgid "Select a Page"
1992
  msgstr ""
1993
 
@@ -2226,9 +2212,9 @@ msgid "Duplicate"
2226
  msgstr ""
2227
 
2228
  #: classes/views/frm-form-actions/form_action.php:25
2229
- #: classes/helpers/FrmEntriesListHelper.php:295
2230
  #: classes/helpers/FrmFormsListHelper.php:133
2231
- #: classes/helpers/FrmFormsHelper.php:1103
2232
  msgid "Delete"
2233
  msgstr ""
2234
 
@@ -2335,7 +2321,7 @@ msgstr ""
2335
 
2336
  #: classes/views/shared/confirm-overlay.php:15
2337
  #: classes/views/shared/info-overlay.php:15
2338
- #: classes/helpers/FrmAppHelper.php:2531
2339
  msgid "Are you sure?"
2340
  msgstr ""
2341
 
@@ -2448,8 +2434,8 @@ msgid "Keys"
2448
  msgstr ""
2449
 
2450
  #: classes/views/shared/mb_adv_info.php:95
2451
- #: classes/helpers/FrmCSVExportHelper.php:222
2452
- #: classes/helpers/FrmAppHelper.php:2503
2453
  msgid "ID"
2454
  msgstr ""
2455
 
@@ -2459,7 +2445,7 @@ msgstr ""
2459
 
2460
  #: classes/views/shared/mb_adv_info.php:113
2461
  #: classes/views/shared/mb_adv_info.php:127
2462
- #: classes/helpers/FrmAppHelper.php:2565
2463
  msgid "Select a Field"
2464
  msgstr ""
2465
 
@@ -3083,7 +3069,7 @@ msgid "Label Position"
3083
  msgstr ""
3084
 
3085
  #: classes/views/frm-fields/back-end/settings.php:270
3086
- #: classes/helpers/FrmAppHelper.php:2525
3087
  msgid "Default"
3088
  msgstr ""
3089
 
@@ -3471,7 +3457,7 @@ msgid "Post"
3471
  msgstr ""
3472
 
3473
  #: classes/views/frm-entries/sidebar-shared.php:43
3474
- #: classes/helpers/FrmEntriesListHelper.php:290
3475
  msgid "View"
3476
  msgstr ""
3477
 
@@ -3772,19 +3758,19 @@ msgstr ""
3772
  msgid "Filter"
3773
  msgstr ""
3774
 
3775
- #: classes/helpers/FrmEntriesListHelper.php:260
3776
  msgid "No"
3777
  msgstr ""
3778
 
3779
- #: classes/helpers/FrmEntriesListHelper.php:260
3780
  msgid "Yes"
3781
  msgstr ""
3782
 
3783
- #: classes/helpers/FrmEntriesListHelper.php:295
3784
  msgid "Permanently delete this entry?"
3785
  msgstr ""
3786
 
3787
- #: classes/helpers/FrmEntriesListHelper.php:344
3788
  msgid "ALL selected entries in this form will be permanently deleted. Want to proceed?"
3789
  msgstr ""
3790
 
@@ -3797,12 +3783,12 @@ msgid "See all forms."
3797
  msgstr ""
3798
 
3799
  #: classes/helpers/FrmFormsListHelper.php:124
3800
- #: classes/helpers/FrmFormsHelper.php:1091
3801
  msgid "Restore"
3802
  msgstr ""
3803
 
3804
  #: classes/helpers/FrmFormsListHelper.php:128
3805
- #: classes/helpers/FrmFormsHelper.php:1102
3806
  msgid "Delete Permanently"
3807
  msgstr ""
3808
 
@@ -3823,8 +3809,8 @@ msgid "Drafts"
3823
  msgstr ""
3824
 
3825
  #: classes/helpers/FrmFormsListHelper.php:158
3826
- #: classes/helpers/FrmFormsHelper.php:1096
3827
- #: classes/helpers/FrmFormsHelper.php:1199
3828
  msgid "Trash"
3829
  msgstr ""
3830
 
@@ -3838,8 +3824,8 @@ msgid "Saving entries is disabled for this form"
3838
  msgstr ""
3839
 
3840
  #: classes/helpers/FrmFormsListHelper.php:342
3841
- #: classes/helpers/FrmFormsHelper.php:1198
3842
- #: classes/helpers/FrmCSVExportHelper.php:220
3843
  msgid "Draft"
3844
  msgstr ""
3845
 
@@ -3848,7 +3834,7 @@ msgid "ALL selected forms and their entries will be permanently deleted. Want to
3848
  msgstr ""
3849
 
3850
  #: classes/helpers/FrmFieldsHelper.php:286
3851
- #: classes/helpers/FrmAppHelper.php:2536
3852
  msgid "The entered values do not match"
3853
  msgstr ""
3854
 
@@ -3859,7 +3845,7 @@ msgstr ""
3859
 
3860
  #: classes/helpers/FrmFieldsHelper.php:456
3861
  #: classes/helpers/FrmFieldsHelper.php:457
3862
- #: classes/helpers/FrmAppHelper.php:2540
3863
  msgid "New Option"
3864
  msgstr ""
3865
 
@@ -5030,7 +5016,7 @@ msgid "Left"
5030
  msgstr ""
5031
 
5032
  #: classes/helpers/FrmStylesHelper.php:113
5033
- #: classes/helpers/FrmFormsHelper.php:1133
5034
  msgid "Right"
5035
  msgstr ""
5036
 
@@ -5059,7 +5045,7 @@ msgid "Excerpt View"
5059
  msgstr ""
5060
 
5061
  #: classes/helpers/FrmListHelper.php:262
5062
- #: classes/helpers/FrmAppHelper.php:2566
5063
  msgid "No items found."
5064
  msgstr ""
5065
 
@@ -5072,7 +5058,7 @@ msgid "Bulk Actions"
5072
  msgstr ""
5073
 
5074
  #: classes/helpers/FrmListHelper.php:405
5075
- #: classes/helpers/FrmAppHelper.php:2530
5076
  msgid "Heads up"
5077
  msgstr ""
5078
 
@@ -5243,114 +5229,114 @@ msgstr ""
5243
  msgid "Duplicate Form"
5244
  msgstr ""
5245
 
5246
- #: classes/helpers/FrmFormsHelper.php:1090
5247
  msgid "Restore from Trash"
5248
  msgstr ""
5249
 
5250
- #: classes/helpers/FrmFormsHelper.php:1095
5251
  msgid "Move Form to Trash"
5252
  msgstr ""
5253
 
5254
- #: classes/helpers/FrmFormsHelper.php:1099
5255
  msgid "Do you want to move this form to the trash?"
5256
  msgstr ""
5257
 
5258
- #: classes/helpers/FrmFormsHelper.php:1105
5259
  msgid "Are you sure you want to delete this form and all its entries?"
5260
  msgstr ""
5261
 
5262
- #: classes/helpers/FrmFormsHelper.php:1107
5263
  msgid "This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?"
5264
  msgstr ""
5265
 
5266
- #: classes/helpers/FrmFormsHelper.php:1119
5267
  msgid "Add this to a read-only field to display the text in bold without a border or background."
5268
  msgstr ""
5269
 
5270
- #: classes/helpers/FrmFormsHelper.php:1122
5271
  msgid "Big Total"
5272
  msgstr ""
5273
 
5274
- #: classes/helpers/FrmFormsHelper.php:1123
5275
  msgid "Add this to a read-only field to display the text in large, bold text without a border or background."
5276
  msgstr ""
5277
 
5278
- #: classes/helpers/FrmFormsHelper.php:1126
5279
  msgid "Scroll Box"
5280
  msgstr ""
5281
 
5282
- #: classes/helpers/FrmFormsHelper.php:1127
5283
  msgid "If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field."
5284
  msgstr ""
5285
 
5286
- #: classes/helpers/FrmFormsHelper.php:1130
5287
  msgid "First"
5288
  msgstr ""
5289
 
5290
- #: classes/helpers/FrmFormsHelper.php:1131
5291
  msgid "Add this to the first field in each row along with a width. ie frm_first frm4"
5292
  msgstr ""
5293
 
5294
- #: classes/helpers/FrmFormsHelper.php:1134
5295
  msgid "First Grid Row"
5296
  msgstr ""
5297
 
5298
- #: classes/helpers/FrmFormsHelper.php:1135
5299
  msgid "Even Grid Row"
5300
  msgstr ""
5301
 
5302
- #: classes/helpers/FrmFormsHelper.php:1136
5303
  msgid "Odd Grid Row"
5304
  msgstr ""
5305
 
5306
- #: classes/helpers/FrmFormsHelper.php:1138
5307
  msgid "Color Block"
5308
  msgstr ""
5309
 
5310
- #: classes/helpers/FrmFormsHelper.php:1139
5311
  msgid "Add a background color to the field or section."
5312
  msgstr ""
5313
 
5314
- #: classes/helpers/FrmFormsHelper.php:1142
5315
  msgid "Capitalize"
5316
  msgstr ""
5317
 
5318
- #: classes/helpers/FrmFormsHelper.php:1143
5319
  msgid "Automatically capitalize the first letter in each word."
5320
  msgstr ""
5321
 
5322
- #: classes/helpers/FrmFormsHelper.php:1200
5323
  msgid "Published"
5324
  msgstr ""
5325
 
5326
- #: classes/helpers/FrmFormsHelper.php:1284
5327
  msgid "Create Form"
5328
  msgstr ""
5329
 
5330
- #: classes/helpers/FrmFormsHelper.php:1292
5331
  msgid "Renew"
5332
  msgstr ""
5333
 
5334
- #: classes/helpers/FrmFormsHelper.php:1356
5335
  msgid "License plan required:"
5336
  msgstr ""
5337
 
5338
- #: classes/helpers/FrmFormsHelper.php:1470
5339
  msgid "Is this intentional?"
5340
  msgstr ""
5341
 
5342
- #: classes/helpers/FrmFormsHelper.php:1471
5343
- #: classes/helpers/FrmAppHelper.php:2560
5344
  msgid "See the list of reserved words in WordPress."
5345
  msgstr ""
5346
 
5347
  #. translators: %s: the name of a single parameter in the redirect URL
5348
- #: classes/helpers/FrmFormsHelper.php:1480
5349
  msgid "The redirect URL is using the parameter \"%s\", which is reserved by WordPress. "
5350
  msgstr ""
5351
 
5352
  #. translators: %s: the names of two or more parameters in the redirect URL, separated by commas
5353
- #: classes/helpers/FrmFormsHelper.php:1486
5354
  msgid "The redirect URL is using the parameters \"%s\", which are reserved by WordPress. "
5355
  msgstr ""
5356
 
@@ -5358,605 +5344,598 @@ msgstr ""
5358
  msgid "(label)"
5359
  msgstr ""
5360
 
5361
- #: classes/helpers/FrmCSVExportHelper.php:209
5362
  msgid "Comment"
5363
  msgstr ""
5364
 
5365
- #: classes/helpers/FrmCSVExportHelper.php:210
5366
  msgid "Comment User"
5367
  msgstr ""
5368
 
5369
- #: classes/helpers/FrmCSVExportHelper.php:211
5370
  msgid "Comment Date"
5371
  msgstr ""
5372
 
5373
- #: classes/helpers/FrmCSVExportHelper.php:216
5374
  msgid "Timestamp"
5375
  msgstr ""
5376
 
5377
- #: classes/helpers/FrmCSVExportHelper.php:217
5378
  msgid "Last Updated"
5379
  msgstr ""
5380
 
5381
- #: classes/helpers/FrmCSVExportHelper.php:219
5382
  msgid "Updated By"
5383
  msgstr ""
5384
 
5385
- #: classes/helpers/FrmCSVExportHelper.php:221
5386
  msgid "IP"
5387
  msgstr ""
5388
 
5389
- #: classes/helpers/FrmCSVExportHelper.php:225
5390
  msgid "Parent ID"
5391
  msgstr ""
5392
 
5393
- #: classes/helpers/FrmAppHelper.php:110
5394
- #: classes/helpers/FrmAppHelper.php:219
5395
- msgid "Renew Now"
5396
- msgstr ""
5397
-
5398
- #: classes/helpers/FrmAppHelper.php:180
5399
- msgid "Your account has expired"
5400
- msgstr ""
5401
-
5402
- #. translators: %1$s: start HTML tag, %2$s: end HTML tag
5403
- #: classes/helpers/FrmAppHelper.php:206
5404
- msgid "Your form subscription expires in %1$s day%2$s."
5405
- msgid_plural "Your form subscription expires in %1$s days%2$s."
5406
- msgstr[0] ""
5407
-
5408
- #: classes/helpers/FrmAppHelper.php:1015
5409
- #: classes/helpers/FrmAppHelper.php:1023
5410
  msgid "Add New"
5411
  msgstr ""
5412
 
5413
- #: classes/helpers/FrmAppHelper.php:1315
5414
  msgid "View Forms"
5415
  msgstr ""
5416
 
5417
- #: classes/helpers/FrmAppHelper.php:1316
5418
  msgid "Add and Edit Forms"
5419
  msgstr ""
5420
 
5421
- #: classes/helpers/FrmAppHelper.php:1317
5422
  msgid "Delete Forms"
5423
  msgstr ""
5424
 
5425
- #: classes/helpers/FrmAppHelper.php:1318
5426
  msgid "Access this Settings Page"
5427
  msgstr ""
5428
 
5429
- #: classes/helpers/FrmAppHelper.php:1319
5430
  msgid "View Entries from Admin Area"
5431
  msgstr ""
5432
 
5433
- #: classes/helpers/FrmAppHelper.php:1320
5434
  msgid "Delete Entries from Admin Area"
5435
  msgstr ""
5436
 
5437
- #: classes/helpers/FrmAppHelper.php:1327
5438
  msgid "Add Entries from Admin Area"
5439
  msgstr ""
5440
 
5441
- #: classes/helpers/FrmAppHelper.php:1328
5442
  msgid "Edit Entries from Admin Area"
5443
  msgstr ""
5444
 
5445
- #: classes/helpers/FrmAppHelper.php:1329
5446
  msgid "View Reports"
5447
  msgstr ""
5448
 
5449
- #: classes/helpers/FrmAppHelper.php:1330
5450
  msgid "Add/Edit Views"
5451
  msgstr ""
5452
 
5453
- #: classes/helpers/FrmAppHelper.php:1996
5454
  msgid "at"
5455
  msgstr ""
5456
 
5457
- #: classes/helpers/FrmAppHelper.php:2140
5458
  msgid "year"
5459
  msgstr ""
5460
 
5461
- #: classes/helpers/FrmAppHelper.php:2141
5462
  msgid "years"
5463
  msgstr ""
5464
 
5465
- #: classes/helpers/FrmAppHelper.php:2145
5466
  msgid "month"
5467
  msgstr ""
5468
 
5469
- #: classes/helpers/FrmAppHelper.php:2146
5470
  msgid "months"
5471
  msgstr ""
5472
 
5473
- #: classes/helpers/FrmAppHelper.php:2150
5474
  msgid "week"
5475
  msgstr ""
5476
 
5477
- #: classes/helpers/FrmAppHelper.php:2151
5478
  msgid "weeks"
5479
  msgstr ""
5480
 
5481
- #: classes/helpers/FrmAppHelper.php:2155
5482
  msgid "day"
5483
  msgstr ""
5484
 
5485
- #: classes/helpers/FrmAppHelper.php:2156
5486
  msgid "days"
5487
  msgstr ""
5488
 
5489
- #: classes/helpers/FrmAppHelper.php:2160
5490
  msgid "hour"
5491
  msgstr ""
5492
 
5493
- #: classes/helpers/FrmAppHelper.php:2161
5494
  msgid "hours"
5495
  msgstr ""
5496
 
5497
- #: classes/helpers/FrmAppHelper.php:2165
5498
  msgid "minute"
5499
  msgstr ""
5500
 
5501
- #: classes/helpers/FrmAppHelper.php:2166
5502
  msgid "minutes"
5503
  msgstr ""
5504
 
5505
- #: classes/helpers/FrmAppHelper.php:2170
5506
  msgid "second"
5507
  msgstr ""
5508
 
5509
- #: classes/helpers/FrmAppHelper.php:2171
5510
  msgid "seconds"
5511
  msgstr ""
5512
 
5513
- #: classes/helpers/FrmAppHelper.php:2265
5514
  msgid "Give this action a label for easy reference."
5515
  msgstr ""
5516
 
5517
- #: classes/helpers/FrmAppHelper.php:2266
5518
  msgid "Add one or more recipient addresses separated by a \",\". FORMAT: Name <name@email.com> or name@email.com. [admin_email] is the address set in WP General Settings."
5519
  msgstr ""
5520
 
5521
- #: classes/helpers/FrmAppHelper.php:2267
5522
  msgid "Add CC addresses separated by a \",\". FORMAT: Name <name@email.com> or name@email.com."
5523
  msgstr ""
5524
 
5525
- #: classes/helpers/FrmAppHelper.php:2268
5526
  msgid "Add BCC addresses separated by a \",\". FORMAT: Name <name@email.com> or name@email.com."
5527
  msgstr ""
5528