Formidable Forms – Form Builder for WordPress - Version 5.4.4

Version Description

  • New: Option icons are now be added dynamically when a field is selected to reduce the HTML required on load. This significantly improves performance for fields with many options.
  • New: Added a new frm_before_duplicate_entry_values filter for customizing the data of a duplicated entry before it is saved.
  • New: Maximum character length is now validated server side on submit.
  • Fix: The duplicate option pop up was triggering incorrectly when dragging new options in Chrome.
  • Fix: Prevent a "Trying to get property 'post_status' of non-object" PHP Notice that happens in some cases when updating actions.
  • Fix: Imported view detail page URLs were returning 404 errors. New imported views will now update permalinks to avoid this issue.
  • Fix: The disallowed list check was not being applied when no data was submitted.
  • Fix: Placeholder add on pages were showing messages to upgrade for supported licenses.
  • Fix: Apps were not properly loading in WordPress 5.6.
Download this release

Release Info

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

Code changes from version 5.4.3 to 5.4.4

classes/controllers/FrmAppController.php CHANGED
@@ -494,6 +494,7 @@ class FrmAppController {
494
  'bootstrap_tooltip',
495
  'bootstrap-multiselect',
496
  'wp-i18n',
 
497
  'formidable_dom',
498
  'formidable_embed',
499
  );
494
  'bootstrap_tooltip',
495
  'bootstrap-multiselect',
496
  'wp-i18n',
497
+ 'wp-hooks', // Required in WP versions older than 5.7
498
  'formidable_dom',
499
  'formidable_embed',
500
  );
classes/controllers/FrmApplicationsController.php CHANGED
@@ -171,6 +171,7 @@ class FrmApplicationsController {
171
 
172
  $js_dependencies = array(
173
  'wp-i18n',
 
174
  'formidable_dom',
175
  );
176
  wp_register_script( 'formidable_applications', $plugin_url . '/js/admin/applications.js', $js_dependencies, $version, true );
171
 
172
  $js_dependencies = array(
173
  'wp-i18n',
174
+ 'wp-hooks', // This prevents a console error "wp.hooks is undefined" in WP versions older than 5.7.
175
  'formidable_dom',
176
  );
177
  wp_register_script( 'formidable_applications', $plugin_url . '/js/admin/applications.js', $js_dependencies, $version, true );
classes/controllers/FrmFormsController.php CHANGED
@@ -1071,6 +1071,13 @@ class FrmFormsController {
1071
  }
1072
  }
1073
 
 
 
 
 
 
 
 
1074
  public static function maybe_update_form_builder_message( &$message ) {
1075
  if ( 'form_duplicated' === FrmAppHelper::simple_get( 'message' ) ) {
1076
  $message = __( 'Form was Successfully Copied', 'formidable' );
1071
  }
1072
  }
1073
 
1074
+ public static function update_form_builder_fields( $fields, $form ) {
1075
+ foreach ( $fields as $field ) {
1076
+ $field->do_not_include_icons = true;
1077
+ }
1078
+ return $fields;
1079
+ }
1080
+
1081
  public static function maybe_update_form_builder_message( &$message ) {
1082
  if ( 'form_duplicated' === FrmAppHelper::simple_get( 'message' ) ) {
1083
  $message = __( 'Form was Successfully Copied', 'formidable' );
classes/controllers/FrmHooksController.php CHANGED
@@ -95,6 +95,7 @@ class FrmHooksController {
95
 
96
  // Elementor.
97
  add_action( 'elementor/widgets/widgets_registered', 'FrmElementorController::register_elementor_hooks' );
 
98
  }
99
 
100
  public static function load_admin_hooks() {
95
 
96
  // Elementor.
97
  add_action( 'elementor/widgets/widgets_registered', 'FrmElementorController::register_elementor_hooks' );
98
+ add_filter( 'frm_fields_in_form_builder', 'FrmFormsController::update_form_builder_fields', 10, 2 );
99
  }
100
 
101
  public static function load_admin_hooks() {
classes/helpers/FrmAppHelper.php CHANGED
@@ -16,7 +16,7 @@ class FrmAppHelper {
16
  /**
17
  * @since 2.0
18
  */
19
- public static $plug_version = '5.4.3';
20
 
21
  /**
22
  * @since 1.07.02
16
  /**
17
  * @since 2.0
18
  */
19
+ public static $plug_version = '5.4.4';
20
 
21
  /**
22
  * @since 1.07.02
classes/helpers/FrmEntriesHelper.php CHANGED
@@ -502,6 +502,7 @@ class FrmEntriesHelper {
502
  * Add submitted values to a string for spam checking.
503
  *
504
  * @param array $values
 
505
  */
506
  public static function entry_array_to_string( $values ) {
507
  $content = '';
502
  * Add submitted values to a string for spam checking.
503
  *
504
  * @param array $values
505
+ * @return string
506
  */
507
  public static function entry_array_to_string( $values ) {
508
  $content = '';
classes/helpers/FrmXMLHelper.php CHANGED
@@ -844,6 +844,8 @@ class FrmXMLHelper {
844
 
845
  self::maybe_update_stylesheet( $imported );
846
 
 
 
847
  return $imported;
848
  }
849
 
@@ -1104,22 +1106,38 @@ class FrmXMLHelper {
1104
  }
1105
  }
1106
 
 
 
 
 
 
1107
  private static function update_postmeta( &$post, $post_id ) {
1108
  foreach ( $post['postmeta'] as $k => $v ) {
1109
- if ( '_edit_last' == $k ) {
1110
- $v = FrmAppHelper::get_user_id_param( $v );
1111
- } elseif ( '_thumbnail_id' == $k && FrmAppHelper::pro_is_installed() ) {
1112
- // Change the attachment ID.
1113
- $field_obj = FrmFieldFactory::get_field_type( 'file' );
1114
- $v = $field_obj->get_file_id( $v );
1115
- }
1116
 
1117
- if ( 'frm_dyncontent' === $k && is_array( $v ) ) {
1118
- $v = json_encode( $v );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1119
  }
1120
 
1121
  update_post_meta( $post_id, $k, $v );
1122
-
1123
  unset( $k, $v );
1124
  }
1125
  }
844
 
845
  self::maybe_update_stylesheet( $imported );
846
 
847
+ flush_rewrite_rules();
848
+
849
  return $imported;
850
  }
851
 
1106
  }
1107
  }
1108
 
1109
+ /**
1110
+ * @param array $post
1111
+ * @param int $post_id
1112
+ * @return void
1113
+ */
1114
  private static function update_postmeta( &$post, $post_id ) {
1115
  foreach ( $post['postmeta'] as $k => $v ) {
1116
+ switch ( $k ) {
1117
+ case '_edit_last':
1118
+ $v = FrmAppHelper::get_user_id_param( $v );
1119
+ break;
 
 
 
1120
 
1121
+ case '_thumbnail_id':
1122
+ if ( FrmAppHelper::pro_is_installed() ) {
1123
+ // Change the attachment ID.
1124
+ $field_obj = FrmFieldFactory::get_field_type( 'file' );
1125
+ $v = $field_obj->get_file_id( $v );
1126
+ }
1127
+ break;
1128
+
1129
+ case 'frm_dyncontent':
1130
+ if ( is_array( $v ) ) {
1131
+ $v = json_encode( $v );
1132
+ }
1133
+ break;
1134
+
1135
+ case 'frm_param':
1136
+ add_rewrite_endpoint( $v, EP_PERMALINK | EP_PAGES );
1137
+ break;
1138
  }
1139
 
1140
  update_post_meta( $post_id, $k, $v );
 
1141
  unset( $k, $v );
1142
  }
1143
  }
classes/models/FrmAddon.php CHANGED
@@ -480,7 +480,7 @@ class FrmAddon {
480
  }
481
 
482
  $response = $this->get_license_status();
483
- if ( 'revoked' === $response['status'] || 'blocked' === $response['status'] || 'disabled' === $response['status'] ) {
484
  $this->clear_license();
485
  }
486
  }
480
  }
481
 
482
  $response = $this->get_license_status();
483
+ if ( 'revoked' === $response['status'] || 'blocked' === $response['status'] || 'disabled' === $response['status'] || 'missing' === $response['status'] ) {
484
  $this->clear_license();
485
  }
486
  }
classes/models/FrmEntryMeta.php CHANGED
@@ -166,6 +166,15 @@ class FrmEntryMeta {
166
 
167
  public static function duplicate_entry_metas( $old_id, $new_id ) {
168
  $metas = self::get_entry_meta_info( $old_id );
 
 
 
 
 
 
 
 
 
169
  foreach ( $metas as $meta ) {
170
  self::add_entry_meta( $new_id, $meta->field_id, '', $meta->meta_value );
171
  unset( $meta );
166
 
167
  public static function duplicate_entry_metas( $old_id, $new_id ) {
168
  $metas = self::get_entry_meta_info( $old_id );
169
+
170
+ /**
171
+ * Allows changing entry duplicate values before save.
172
+ *
173
+ * @since x.x
174
+ *
175
+ * @param array $metas The list of entry meta values.
176
+ */
177
+ $metas = apply_filters( 'frm_before_duplicate_entry_values', $metas );
178
  foreach ( $metas as $meta ) {
179
  self::add_entry_meta( $new_id, $meta->field_id, '', $meta->meta_value );
180
  unset( $meta );
classes/models/FrmEntryValidate.php CHANGED
@@ -360,9 +360,6 @@ class FrmEntryValidate {
360
  }
361
 
362
  $content = FrmEntriesHelper::entry_array_to_string( $values );
363
- if ( empty( $content ) ) {
364
- return false;
365
- }
366
 
367
  self::prepare_values_for_spam_check( $values );
368
  $ip = FrmAppHelper::get_ip_address();
360
  }
361
 
362
  $content = FrmEntriesHelper::entry_array_to_string( $values );
 
 
 
363
 
364
  self::prepare_values_for_spam_check( $values );
365
  $ip = FrmAppHelper::get_ip_address();
classes/models/FrmFormAction.php CHANGED
@@ -106,7 +106,7 @@ class FrmFormAction {
106
  $action_options['color'] = 'var(--' . reset( $colors ) . ')';
107
  }
108
 
109
- $upgrade_class = $action_options['classes'] === 'frm_show_upgrade';
110
  if ( $action_options['group'] === $id_base ) {
111
  $upgrade_class = strpos( $action_options['classes'], 'frm_show_upgrade' ) !== false;
112
  $action_options['classes'] = $group['icon'];
@@ -420,17 +420,23 @@ class FrmFormAction {
420
  * If the status of the action has changed, update it
421
  *
422
  * @since 3.04
 
 
 
 
423
  */
424
  protected function maybe_update_status( $new_instance, $old_instance ) {
425
- if ( $new_instance['post_status'] !== $old_instance->post_status ) {
426
- self::clear_cache();
427
- wp_update_post(
428
- array(
429
- 'ID' => $new_instance['ID'],
430
- 'post_status' => $new_instance['post_status'],
431
- )
432
- );
433
  }
 
 
 
 
 
 
 
 
434
  }
435
 
436
  public function save_settings( $settings ) {
106
  $action_options['color'] = 'var(--' . reset( $colors ) . ')';
107
  }
108
 
109
+ $upgrade_class = isset( $action_options['classes'] ) && $action_options['classes'] === 'frm_show_upgrade';
110
  if ( $action_options['group'] === $id_base ) {
111
  $upgrade_class = strpos( $action_options['classes'], 'frm_show_upgrade' ) !== false;
112
  $action_options['classes'] = $group['icon'];
420
  * If the status of the action has changed, update it
421
  *
422
  * @since 3.04
423
+ *
424
+ * @param array $new_instance
425
+ * @param stdClass|array $old_instance
426
+ * @return void
427
  */
428
  protected function maybe_update_status( $new_instance, $old_instance ) {
429
+ if ( ! is_object( $old_instance ) || $new_instance['post_status'] === $old_instance->post_status ) {
430
+ return;
 
 
 
 
 
 
431
  }
432
+
433
+ self::clear_cache();
434
+ wp_update_post(
435
+ array(
436
+ 'ID' => $new_instance['ID'],
437
+ 'post_status' => $new_instance['post_status'],
438
+ )
439
+ );
440
  }
441
 
442
  public function save_settings( $settings ) {
classes/models/fields/FrmFieldText.php CHANGED
@@ -28,4 +28,15 @@ class FrmFieldText extends FrmFieldType {
28
  'invalid' => true,
29
  );
30
  }
 
 
 
 
 
 
 
 
 
 
 
31
  }
28
  'invalid' => true,
29
  );
30
  }
31
+
32
+ public function validate( $args ) {
33
+ $errors = parent::validate( $args );
34
+ $max_length = intval( FrmField::get_option( $this->field, 'max' ) );
35
+
36
+ if ( $max_length && strlen( $args['value'] ) > $max_length ) {
37
+ $errors[ 'field' . $args['id'] ] = FrmFieldsHelper::get_error_msg( $this->field, 'invalid' );
38
+ }
39
+
40
+ return $errors;
41
+ }
42
  }
classes/views/frm-fields/back-end/max.php CHANGED
@@ -13,5 +13,5 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  }
14
  ?>
15
  </label>
16
- <input type="text" name="field_options[max_<?php echo esc_attr( $field['id'] ); ?>]" value="<?php echo esc_attr( $field['max'] ); ?>" id="field_options_max_<?php echo esc_attr( $field['id'] ); ?>" size="5" />
17
  </p>
13
  }
14
  ?>
15
  </label>
16
+ <input type="text" class="frm_max_length_opt" name="field_options[max_<?php echo esc_attr( $field['id'] ); ?>]" value="<?php echo esc_attr( $field['max'] ); ?>" id="field_options_max_<?php echo esc_attr( $field['id'] ); ?>" size="5" data-fid="<?php echo intval( $field['id'] ); ?>" />
17
  </p>
classes/views/frm-fields/back-end/settings.php CHANGED
@@ -334,7 +334,7 @@ do_action( 'frm_before_field_options', $field, compact( 'field_obj', 'display',
334
 
335
  <?php if ( $display['required'] || $display['invalid'] || $display['unique'] || $display['conf_field'] ) { ?>
336
  <?php
337
- $hidden_invalid = FrmField::is_field_type( $field, 'text' ) && ! FrmField::is_option_true( $field, 'format' );
338
  $has_validation = ( ( $display['invalid'] && ! $hidden_invalid ) || $field['required'] || FrmField::is_option_true( $field, 'unique' ) || FrmField::is_option_true( $field, 'conf_field' ) );
339
  ?>
340
  <div class="frm_validation_msg <?php echo esc_attr( $has_validation ? '' : 'frm_hidden' ); ?>">
334
 
335
  <?php if ( $display['required'] || $display['invalid'] || $display['unique'] || $display['conf_field'] ) { ?>
336
  <?php
337
+ $hidden_invalid = FrmField::is_field_type( $field, 'text' ) && ! FrmField::is_option_true( $field, 'format' ) && FrmField::is_option_empty( $field, 'max' );
338
  $has_validation = ( ( $display['invalid'] && ! $hidden_invalid ) || $field['required'] || FrmField::is_option_true( $field, 'unique' ) || FrmField::is_option_true( $field, 'conf_field' ) );
339
  ?>
340
  <div class="frm_validation_msg <?php echo esc_attr( $has_validation ? '' : 'frm_hidden' ); ?>">
classes/views/frm-fields/back-end/value-format.php CHANGED
@@ -17,6 +17,6 @@ if ( ! defined( 'ABSPATH' ) ) {
17
  )
18
  );
19
  ?>
20
- <input type="text" class="frm_long_input frm_format_opt" value="<?php echo esc_attr( $field['format'] ); ?>" name="field_options[format_<?php echo absint( $field['id'] ); ?>]" id="frm_format_<?php echo absint( $field['id'] ); ?>" />
21
  </span>
22
  </p>
17
  )
18
  );
19
  ?>
20
+ <input type="text" class="frm_long_input frm_format_opt" value="<?php echo esc_attr( $field['format'] ); ?>" name="field_options[format_<?php echo absint( $field['id'] ); ?>]" id="frm_format_<?php echo absint( $field['id'] ); ?>" data-fid="<?php echo intval( $field['id'] ); ?>" />
21
  </span>
22
  </p>
classes/views/frm-fields/single-option.php CHANGED
@@ -4,7 +4,14 @@ if ( ! defined( 'ABSPATH' ) ) {
4
  }
5
  ?>
6
  <li id="frm_delete_field_<?php echo esc_attr( $field['id'] . '-' . $opt_key ); ?>_container" data-optkey="<?php echo esc_attr( $opt_key ); ?>" class="frm_single_option <?php echo $opt_key === '000' ? 'frm_hidden frm_option_template' : ''; ?>">
7
- <?php FrmAppHelper::icon_by_class( 'frmfont frm_drag_icon frm-drag' ); ?>
 
 
 
 
 
 
 
8
  <input type="<?php echo esc_attr( $default_type ); ?>" name="<?php echo esc_attr( $field_name ); ?>" <?php echo ( isset( $checked ) && $checked ? 'checked="checked"' : '' ); ?> value="<?php echo esc_attr( $field_val ); ?>"/>
9
 
10
  <input type="text" name="field_options[options_<?php echo esc_attr( $field['id'] ); ?>][<?php echo esc_attr( $opt_key ); ?>][label]" value="<?php echo esc_attr( $opt ); ?>" class="field_<?php echo esc_attr( $field['id'] ); ?>_option <?php echo esc_attr( $field['separate_value'] ? 'frm_with_key' : '' ); ?>" id="<?php echo esc_attr( $html_id . '-' . $opt_key . '-label' ); ?>" data-frmchange="trim,updateOption,checkUniqueOpt" />
@@ -14,7 +21,11 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  <span class="frm_option_key frm-with-right-icon field_<?php echo esc_attr( $field['id'] ); ?>_option_key<?php echo esc_attr( $field['separate_value'] ? '' : ' frm_hidden' ); ?>">
15
  <input type="<?php echo esc_attr( $default_type ); ?>" class="frm_invisible" />
16
  <input type="text" name="field_options[options_<?php echo esc_attr( $field['id'] ); ?>][<?php echo esc_attr( $opt_key ); ?>][value]" id="field_key_<?php echo esc_attr( $field['id'] . '-' . $opt_key ); ?>" value="<?php echo esc_attr( $field_val ); ?>" placeholder="<?php esc_attr_e( 'Saved Value', 'formidable' ); ?>" data-frmchange="trim,updateDefault,checkUniqueOpt" />
17
- <?php FrmAppHelper::icon_by_class( 'frmfont frm_save_icon' ); ?>
 
 
 
 
18
  </span>
19
 
20
  <?php do_action( 'frm_admin_single_opt', compact( 'field', 'opt', 'opt_key' ) ); ?>
4
  }
5
  ?>
6
  <li id="frm_delete_field_<?php echo esc_attr( $field['id'] . '-' . $opt_key ); ?>_container" data-optkey="<?php echo esc_attr( $opt_key ); ?>" class="frm_single_option <?php echo $opt_key === '000' ? 'frm_hidden frm_option_template' : ''; ?>">
7
+ <?php
8
+ $show_icons = empty( $field['do_not_include_icons'] );
9
+
10
+ if ( $show_icons ) {
11
+ FrmAppHelper::icon_by_class( 'frmfont frm_drag_icon frm-drag' );
12
+ }
13
+
14
+ ?>
15
  <input type="<?php echo esc_attr( $default_type ); ?>" name="<?php echo esc_attr( $field_name ); ?>" <?php echo ( isset( $checked ) && $checked ? 'checked="checked"' : '' ); ?> value="<?php echo esc_attr( $field_val ); ?>"/>
16
 
17
  <input type="text" name="field_options[options_<?php echo esc_attr( $field['id'] ); ?>][<?php echo esc_attr( $opt_key ); ?>][label]" value="<?php echo esc_attr( $opt ); ?>" class="field_<?php echo esc_attr( $field['id'] ); ?>_option <?php echo esc_attr( $field['separate_value'] ? 'frm_with_key' : '' ); ?>" id="<?php echo esc_attr( $html_id . '-' . $opt_key . '-label' ); ?>" data-frmchange="trim,updateOption,checkUniqueOpt" />
21
  <span class="frm_option_key frm-with-right-icon field_<?php echo esc_attr( $field['id'] ); ?>_option_key<?php echo esc_attr( $field['separate_value'] ? '' : ' frm_hidden' ); ?>">
22
  <input type="<?php echo esc_attr( $default_type ); ?>" class="frm_invisible" />
23
  <input type="text" name="field_options[options_<?php echo esc_attr( $field['id'] ); ?>][<?php echo esc_attr( $opt_key ); ?>][value]" id="field_key_<?php echo esc_attr( $field['id'] . '-' . $opt_key ); ?>" value="<?php echo esc_attr( $field_val ); ?>" placeholder="<?php esc_attr_e( 'Saved Value', 'formidable' ); ?>" data-frmchange="trim,updateDefault,checkUniqueOpt" />
24
+ <?php
25
+ if ( $show_icons ) {
26
+ FrmAppHelper::icon_by_class( 'frmfont frm_save_icon' );
27
+ }
28
+ ?>
29
  </span>
30
 
31
  <?php do_action( 'frm_admin_single_opt', compact( 'field', 'opt', 'opt_key' ) ); ?>
classes/views/frm-form-actions/_action_inside.php CHANGED
@@ -68,7 +68,7 @@ if ( ! FrmAppHelper::pro_is_installed() ) {
68
  if ( 'email' === $form_action->post_excerpt ) {
69
  ?>
70
  <h3>
71
- <a href="javascript:void(0)" class="frm_show_upgrade frm_noallow" data-upgrade="<?php esc_attr_e( 'Email attachments', 'formidable' ); ?>" data-medium="email-attachment">
72
  <?php esc_html_e( 'Attachment', 'formidable' ); ?>
73
  </a>
74
  </h3>
68
  if ( 'email' === $form_action->post_excerpt ) {
69
  ?>
70
  <h3>
71
+ <a href="javascript:void(0)" class="frm_show_upgrade frm_noallow" data-upgrade="<?php esc_attr_e( 'Email attachments', 'formidable' ); ?>" data-message="<?php esc_attr_e( 'Email a CSV or a PDF of each new entry, or attach a file of your choice.', 'formidable' ); ?>" data-medium="email-attachment">
72
  <?php esc_html_e( 'Attachment', 'formidable' ); ?>
73
  </a>
74
  </h3>
classes/views/shared/upgrade_overlay.php CHANGED
@@ -25,12 +25,12 @@ if ( ! defined( 'ABSPATH' ) ) {
25
  </h2>
26
  <div class="cta-inside">
27
 
28
- <p id="frm-oneclick" class="frm_hidden">
29
  <?php esc_html_e( 'That add-on is not installed. Would you like to install it now?', 'formidable' ); ?>
30
  </p>
31
- <p id="frm-addon-status"></p>
32
 
33
- <a class="button button-primary frm-button-primary frm_hidden" id="frm-oneclick-button">
34
  <?php esc_html_e( 'Install', 'formidable' ); ?>
35
  </a>
36
 
@@ -44,11 +44,11 @@ if ( ! defined( 'ABSPATH' ) ) {
44
  }
45
  $message = sprintf( esc_html( $message ), '<span class="frm_feature_label"></span>' );
46
  ?>
47
- <p id="frm-upgrade-message" data-default="<?php echo esc_attr( $message ); ?>">
48
  <?php echo FrmAppHelper::kses( $message, array( 'span' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
49
  </p>
50
  <?php if ( $is_pro ) { ?>
51
- <a href="<?php echo esc_url( $default_link ); ?>" class="button button-primary frm-button-primary" id="frm-upgrade-modal-link" data-default="<?php echo esc_url( $default_link ); ?>">
52
  <?php
53
  printf(
54
  /* translators: %s: Plan name */
@@ -58,7 +58,7 @@ if ( ! defined( 'ABSPATH' ) ) {
58
  ?>
59
  </a>
60
  <?php } else { ?>
61
- <a href="<?php echo esc_url( $default_link ); ?>" class="button button-primary frm-button-primary" target="_blank" rel="noopener noreferrer" id="frm-upgrade-modal-link" data-default="<?php echo esc_url( $default_link ); ?>">
62
  <?php
63
  printf(
64
  /* translators: %s: Plan name */
25
  </h2>
26
  <div class="cta-inside">
27
 
28
+ <p class="frm-oneclick frm_hidden">
29
  <?php esc_html_e( 'That add-on is not installed. Would you like to install it now?', 'formidable' ); ?>
30
  </p>
31
+ <p class="frm-addon-status"></p>
32
 
33
+ <a class="button button-primary frm-button-primary frm_hidden frm-oneclick-button">
34
  <?php esc_html_e( 'Install', 'formidable' ); ?>
35
  </a>
36
 
44
  }
45
  $message = sprintf( esc_html( $message ), '<span class="frm_feature_label"></span>' );
46
  ?>
47
+ <p class="frm-upgrade-message" data-default="<?php echo esc_attr( $message ); ?>">
48
  <?php echo FrmAppHelper::kses( $message, array( 'span' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
49
  </p>
50
  <?php if ( $is_pro ) { ?>
51
+ <a href="<?php echo esc_url( $default_link ); ?>" class="button button-primary frm-button-primary frm-upgrade-link" data-default="<?php echo esc_url( $default_link ); ?>">
52
  <?php
53
  printf(
54
  /* translators: %s: Plan name */
58
  ?>
59
  </a>
60
  <?php } else { ?>
61
+ <a href="<?php echo esc_url( $default_link ); ?>" class="button button-primary frm-button-primary frm-upgrade-link" target="_blank" rel="noopener noreferrer" data-default="<?php echo esc_url( $default_link ); ?>">
62
  <?php
63
  printf(
64
  /* translators: %s: Plan name */
css/frm_admin.css CHANGED
@@ -1778,13 +1778,14 @@ h2.frm-h2 + .howto {
1778
  visibility: hidden;
1779
  }
1780
 
1781
- #frm_save_and_reload_options {
1782
  margin-top: 10px;
1783
  font-size: 13px;
1784
  }
1785
 
1786
- #frm_save_and_reload, #frm_save_and_reload + .frm-button-secondary {
1787
- visibility: visible;
 
1788
  }
1789
 
1790
  .addon-status-label {
@@ -2581,6 +2582,7 @@ a.frm_pro_tip .frmsvg {
2581
 
2582
  .frm-tip-info {
2583
  flex: 1;
 
2584
  }
2585
 
2586
  .frm-tip-cta {
@@ -4012,8 +4014,8 @@ li.frm_field_box > ul.frm_grid_container {
4012
  object-fit: cover;
4013
  }
4014
 
4015
- .frm_list_entry_page .frm_file_link img {
4016
- max-width: 75px;
4017
  height: auto;
4018
  }
4019
 
@@ -7337,7 +7339,7 @@ h2 .frm-sub-label {
7337
  padding-bottom: 20px;
7338
  }
7339
 
7340
- #frm-upgrade-message img {
7341
  max-width: 100%;
7342
  }
7343
 
1778
  visibility: hidden;
1779
  }
1780
 
1781
+ .frm-save-and-reload-options {
1782
  margin-top: 10px;
1783
  font-size: 13px;
1784
  }
1785
 
1786
+ .frm-save-and-reload,
1787
+ .frm-save-and-reload + .frm-button-secondary {
1788
+ visibility: visible !important;
1789
  }
1790
 
1791
  .addon-status-label {
2582
 
2583
  .frm-tip-info {
2584
  flex: 1;
2585
+ text-align: left;
2586
  }
2587
 
2588
  .frm-tip-cta {
4014
  object-fit: cover;
4015
  }
4016
 
4017
+ .frm_list_entry_page img {
4018
+ max-width: 100%;
4019
  height: auto;
4020
  }
4021
 
7339
  padding-bottom: 20px;
7340
  }
7341
 
7342
+ .frm-upgrade-message img {
7343
  max-width: 100%;
7344
  }
7345
 
formidable.php CHANGED
@@ -2,10 +2,10 @@
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
- Version: 5.4.3
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
- Author: Strategy11
9
  Text Domain: formidable
10
  */
11
 
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
+ Version: 5.4.4
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
+ Author: Strategy11 Form Builder Team
9
  Text Domain: formidable
10
  */
11
 
js/admin/dom.js CHANGED
@@ -267,7 +267,7 @@
267
  jQuery( this ).autocomplete( 'search', this.value );
268
  }
269
  })
270
- .data('ui-autocomplete')._renderItem = function( ul, item ) {
271
  return jQuery( '<li>' )
272
  .attr( 'aria-label', item.label )
273
  .append( jQuery( '<div>' ).text( item.label ) )
@@ -511,9 +511,13 @@
511
  return output;
512
  }
513
 
514
- function svg({ href } = {}) {
515
  const namespace = 'http://www.w3.org/2000/svg';
516
  const output = document.createElementNS( namespace, 'svg' );
 
 
 
 
517
  if ( href ) {
518
  const use = document.createElementNS( namespace, 'use' );
519
  use.setAttribute( 'href', href );
267
  jQuery( this ).autocomplete( 'search', this.value );
268
  }
269
  })
270
+ .data( 'ui-autocomplete' )._renderItem = function( ul, item ) {
271
  return jQuery( '<li>' )
272
  .attr( 'aria-label', item.label )
273
  .append( jQuery( '<div>' ).text( item.label ) )
511
  return output;
512
  }
513
 
514
+ function svg({ href, classList } = {}) {
515
  const namespace = 'http://www.w3.org/2000/svg';
516
  const output = document.createElementNS( namespace, 'svg' );
517
+ if ( classList ) {
518
+ output.classList.add( ...classList );
519
+ }
520
+
521
  if ( href ) {
522
  const use = document.createElementNS( namespace, 'use' );
523
  use.setAttribute( 'href', href );
js/formidable_admin.js CHANGED
@@ -319,6 +319,10 @@ function frmAdminBuildJS() {
319
 
320
  const { tag, div, span, a, svg, img } = frmDom;
321
  const { doJsonFetch } = frmDom.ajax;
 
 
 
 
322
 
323
  var $newFields = jQuery( document.getElementById( 'frm-show-fields' ) ),
324
  builderForm = document.getElementById( 'new_fields' ),
@@ -1390,6 +1394,10 @@ function frmAdminBuildJS() {
1390
  wrapFieldLiInPlace( currentItem );
1391
  }
1392
 
 
 
 
 
1393
  jQuery.ajax({
1394
  type: 'POST', url: ajaxurl,
1395
  data: {
@@ -2684,14 +2692,23 @@ function frmAdminBuildJS() {
2684
  function toggleInvalidMsg() {
2685
  /*jshint validthis:true */
2686
  var typeDropdown, fieldType,
2687
- fieldId = this.id.replace( 'frm_format_', '' ),
2688
- hasValue = this.value !== '';
 
 
 
 
 
 
 
 
 
2689
 
2690
  typeDropdown = document.getElementsByName( 'field_options[type_' + fieldId + ']' )[0];
2691
  fieldType = typeDropdown.options[typeDropdown.selectedIndex].value;
2692
 
2693
  if ( fieldType === 'text' ) {
2694
- toggleValidationBox( hasValue, '.frm_invalid_msg' + fieldId );
2695
  }
2696
  }
2697
 
@@ -2919,7 +2936,9 @@ function frmAdminBuildJS() {
2919
  newOption = newOption.replace( new RegExp( '-' + oldKey + '"', 'g' ), '-' + optKey + '"' );
2920
  newOption = newOption.replace( new RegExp( '\\[' + oldKey + '\\]', 'g' ), '[' + optKey + ']' );
2921
  newOption = newOption.replace( 'frm_hidden frm_option_template', '' );
2922
- jQuery( document.getElementById( 'frm_field_' + fieldId + '_opts' ) ).append( newOption );
 
 
2923
  resetDisplayedOpts( fieldId );
2924
  }
2925
  }
@@ -5194,16 +5213,13 @@ function frmAdminBuildJS() {
5194
  }
5195
 
5196
  const container = document.getElementById( 'frm_field_' + fieldId + '_opts' );
5197
- const inputs = Array.from( container.querySelectorAll( 'input[type="text"]' ) ).filter(
5198
- input => input !== targetInput && areValuesSeparate === input.name.endsWith( '[value]' )
 
 
5199
  );
5200
-
5201
- const length = inputs.length;
5202
- for ( let index = 0; index < length; ++index ) {
5203
- if ( inputs[ index ].value === targetInput.value ) {
5204
- infoModal( __( 'Duplicate option value "%s" detected', 'formidable' ).replace( '%s', targetInput.value ) );
5205
- break;
5206
- }
5207
  }
5208
  }
5209
 
@@ -5743,16 +5759,16 @@ function frmAdminBuildJS() {
5743
  }
5744
 
5745
  // If one click upgrade, hide other content
5746
- addOneClickModal( element );
5747
 
5748
- modal.querySelector( '.frm_are_not_installed' ).style.display = element.dataset.image ? 'none' : 'block';
5749
  modal.querySelector( '.frm_feature_label' ).textContent = upgradeLabel;
5750
  modal.querySelector( 'h2' ).style.display = 'block';
5751
 
5752
  $info.dialog( 'open' );
5753
 
5754
  // set the utm medium
5755
- const button = modal.querySelector( '.button-primary:not(#frm-oneclick-button)' );
5756
  link = button.getAttribute( 'href' ).replace( /(medium=)[a-z_-]+/ig, '$1' + element.getAttribute( 'data-medium' ) );
5757
  content = element.getAttribute( 'data-content' );
5758
  if ( content === null ) {
@@ -5788,12 +5804,6 @@ function frmAdminBuildJS() {
5788
 
5789
  function populateUpgradeTab( element ) {
5790
  const title = element.dataset.upgrade;
5791
- let message = element.dataset.message;
5792
-
5793
- if ( ! message ) {
5794
- message = document.getElementById( 'frm-upgrade-message' ).dataset.default;
5795
- message = message.replace( '<span class="frm_feature_label"></span>', title );
5796
- }
5797
 
5798
  const tab = element.getAttribute( 'href' ).replace( '#', '' );
5799
  const container = document.querySelector( '.frm_' + tab ) || document.querySelector( '.' + tab );
@@ -5802,7 +5812,7 @@ function frmAdminBuildJS() {
5802
  return;
5803
  }
5804
 
5805
- if ( container.querySelector( '.frm-tab-message' ) ) {
5806
  // Tab has already been populated.
5807
  return;
5808
  }
@@ -5814,24 +5824,16 @@ function frmAdminBuildJS() {
5814
  h2.textContent = __( '%s are not installed' ).replace( '%s', title );
5815
 
5816
  container.classList.add( 'frmcenter' );
5817
- container.appendChild(
5818
- tag(
5819
- 'p',
5820
- {
5821
- className: 'frm-tab-message',
5822
- text: message
5823
- }
5824
- )
5825
- );
5826
 
5827
- const upgradeModalLink = document.getElementById( 'frm-upgrade-modal-link' );
 
 
5828
 
5829
- // Borrow the call to action from the Upgrade modal which should exist on the settings page (it is still used for other upgrades including Actions).
 
5830
  if ( upgradeModalLink ) {
5831
  const upgradeButton = upgradeModalLink.cloneNode( true );
5832
- upgradeButton.id = 'frm_upgrade_link_' + getAutoId();
5833
-
5834
- const level = upgradeButton.querySelector( '.license-level' );
5835
 
5836
  if ( level ) {
5837
  level.textContent = getRequiredLicenseFromTrigger( element );
@@ -5839,20 +5841,24 @@ function frmAdminBuildJS() {
5839
 
5840
  container.appendChild( upgradeButton );
5841
 
5842
- // Maybe append the secondary "Already purchased?" link from the modal as well.
5843
  if ( upgradeModalLink.nextElementSibling && upgradeModalLink.nextElementSibling.querySelector( '.frm-link-secondary' ) ) {
5844
  container.appendChild( upgradeModalLink.nextElementSibling.cloneNode( true ) );
5845
  }
5846
 
5847
- const oneClickButton = document.getElementById( 'frm-oneclick-button' ).cloneNode( true );
5848
- oneClickButton.id = 'frm_one_click_' + getAutoId();
5849
- container.appendChild( oneClickButton );
5850
- addOneClickModal( element, oneClickButton, upgradeButton );
5851
  }
5852
 
 
 
 
5853
  if ( element.dataset.screenshot ) {
5854
  container.appendChild( getScreenshotWrapper( element.dataset.screenshot ) );
5855
  }
 
 
 
 
5856
  }
5857
 
5858
  function getScreenshotWrapper( screenshot ) {
@@ -5889,24 +5895,34 @@ function frmAdminBuildJS() {
5889
 
5890
  /**
5891
  * Allow addons to be installed from the upgrade modal.
 
 
 
 
5892
  */
5893
- function addOneClickModal( link, button, showLink ) {
5894
- var oneclickMessage = document.getElementById( 'frm-oneclick' ),
5895
- oneclick = link.getAttribute( 'data-oneclick' ),
5896
- customLink = link.getAttribute( 'data-link' ),
5897
- upgradeMessage = document.getElementById( 'frm-upgrade-message' ),
5898
- newMessage = link.getAttribute( 'data-message' ),
5899
- showIt = 'block',
5900
- showMsg = 'block',
5901
- hideIt = 'none';
5902
 
5903
- if ( undefined === button ) {
5904
- button = document.getElementById( 'frm-oneclick-button' );
5905
- }
5906
- if ( undefined === showLink ) {
5907
- showLink = document.getElementById( 'frm-upgrade-modal-link' );
 
5908
  }
5909
 
 
 
 
 
 
 
 
 
 
 
 
 
5910
  // If one click upgrade, hide other content.
5911
  if ( oneclickMessage !== null && typeof oneclick !== 'undefined' && oneclick ) {
5912
  if ( newMessage === null ) {
@@ -5916,30 +5932,40 @@ function frmAdminBuildJS() {
5916
  hideIt = 'block';
5917
  oneclick = JSON.parse( oneclick );
5918
 
5919
- button.className = button.className.replace( ' frm-install-addon', '' ).replace( ' frm-activate-addon', '' );
5920
- button.className = button.className + ' ' + oneclick.class;
 
5921
  button.rel = oneclick.url;
5922
  }
5923
 
5924
- // Use a custom message in the modal.
5925
- if ( newMessage === null || typeof newMessage === 'undefined' || newMessage === '' ) {
5926
  newMessage = upgradeMessage.getAttribute( 'data-default' );
5927
  }
 
 
 
 
5928
  upgradeMessage.innerHTML = newMessage;
5929
 
5930
  // Either set the link or use the default.
5931
- if ( customLink === null || typeof customLink === 'undefined' || customLink === '' ) {
5932
- customLink = showLink.getAttribute( 'data-default' );
5933
- }
5934
- showLink.href = customLink;
5935
 
5936
- document.getElementById( 'frm-addon-status' ).style.display = 'none';
5937
  oneclickMessage.style.display = hideIt;
5938
  button.style.display = hideIt === 'block' ? 'inline-block' : hideIt;
5939
  upgradeMessage.style.display = showMsg;
5940
  showLink.style.display = showIt === 'block' ? 'inline-block' : showIt;
5941
  }
5942
 
 
 
 
 
 
 
 
 
5943
  /* Form settings */
5944
 
5945
  function showInputIcon( parentClass ) {
@@ -7912,13 +7938,13 @@ function frmAdminBuildJS() {
7912
  }
7913
 
7914
  function installOrActivate( clicked, action ) {
7915
- var button, plugin, el, message;
7916
 
7917
  // Remove any leftover error messages, output an icon and get the plugin basename that needs to be activated.
7918
  jQuery( '.frm-addon-error' ).remove();
7919
- button = jQuery( clicked );
7920
- plugin = button.attr( 'rel' );
7921
- el = button.parent();
7922
  message = el.parent().find( '.addon-status-label' );
7923
 
7924
  button.addClass( 'frm_loading_button' );
@@ -7936,7 +7962,7 @@ function frmAdminBuildJS() {
7936
  plugin: plugin
7937
  },
7938
  success: function( response ) {
7939
- var saveAndReload, error;
7940
 
7941
  if ( 'string' !== typeof response && 'string' === typeof response.message ) {
7942
  if ( 'undefined' !== typeof response.saveAndReload ) {
@@ -7945,8 +7971,7 @@ function frmAdminBuildJS() {
7945
  response = response.message;
7946
  }
7947
 
7948
- error = extractErrorFromAddOnResponse( response );
7949
-
7950
  if ( error ) {
7951
  addonError( error, el, button );
7952
  return;
@@ -7965,9 +7990,9 @@ function frmAdminBuildJS() {
7965
  e.preventDefault();
7966
 
7967
  // Now let's make another Ajax request once the user has submitted their credentials.
7968
- var proceed = jQuery( this ),
7969
- el = proceed.parent().parent(),
7970
- plugin = proceed.attr( 'rel' );
7971
 
7972
  proceed.addClass( 'frm_loading_button' );
7973
 
@@ -7986,8 +8011,7 @@ function frmAdminBuildJS() {
7986
  password: el.find( '#password' ).val()
7987
  },
7988
  success: function( response ) {
7989
- var error = extractErrorFromAddOnResponse( response );
7990
-
7991
  if ( error ) {
7992
  addonError( error, el, proceed );
7993
  return;
@@ -8001,15 +8025,28 @@ function frmAdminBuildJS() {
8001
  });
8002
  }
8003
 
 
 
 
8004
  function afterAddonInstall( response, button, message, el, saveAndReload ) {
8005
- var $addonStatus, refreshPage;
 
 
 
 
 
 
8006
 
8007
- $addonStatus = jQuery( document.getElementById( 'frm-addon-status' ) );
8008
  // The Ajax request was successful, so let's update the output.
8009
  button.css({ opacity: '0' });
8010
  message.text( frm_admin_js.active );
8011
- jQuery( '#frm-oneclick' ).hide();
8012
- $addonStatus.text( response ).show();
 
 
 
 
 
8013
  jQuery( '#frm_upgrade_modal h2' ).hide();
8014
  jQuery( '#frm_upgrade_modal .frm_lock_icon' ).addClass( 'frm_lock_open_icon' );
8015
  jQuery( '#frm_upgrade_modal .frm_lock_icon use' ).attr( 'xlink:href', '#frm_lock_open_icon' );
@@ -8019,25 +8056,34 @@ function frmAdminBuildJS() {
8019
  button.removeClass( 'frm_loading_button' );
8020
 
8021
  // Maybe refresh import and SMTP pages
8022
- refreshPage = document.querySelectorAll( '.frm-admin-page-import, #frm-admin-smtp, #frm-welcome' );
8023
  if ( refreshPage.length > 0 ) {
8024
  window.location.reload();
8025
- } else if ([ 'settings', 'form_builder' ].includes( saveAndReload ) ) {
8026
- $addonStatus.append( getSaveAndReloadSettingsOptions( saveAndReload ) );
 
 
 
 
 
 
 
 
8027
  }
8028
  }
8029
 
8030
- function getSaveAndReloadSettingsOptions( saveAndReload ) {
8031
- var wrapper = div({ id: 'frm_save_and_reload_options' });
8032
- wrapper.appendChild( saveAndReloadSettingsButton( saveAndReload ) );
8033
- wrapper.appendChild( closePopupButton() );
8034
- return wrapper;
 
 
8035
  }
8036
 
8037
  function saveAndReloadSettingsButton( saveAndReload ) {
8038
  var button = document.createElement( 'button' );
8039
- button.id = 'frm_save_and_reload';
8040
- button.classList.add( 'button', 'button-primary', 'frm-button-primary' );
8041
  button.textContent = __( 'Save and Reload', 'formidable' );
8042
  button.addEventListener( 'click', () => {
8043
  if ( saveAndReload === 'form_builder' ) {
@@ -9094,6 +9140,65 @@ function frmAdminBuildJS() {
9094
  return frmDom.util.debounce( func, wait );
9095
  }
9096
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9097
  /**
9098
  * Does the same as jQuery( document ).on( 'event', 'selector', handler ).
9099
  *
@@ -9285,6 +9390,13 @@ function frmAdminBuildJS() {
9285
  return [ formId, formKey ];
9286
  }
9287
  );
 
 
 
 
 
 
 
9288
  },
9289
 
9290
  buildInit: function() {
@@ -9339,7 +9451,7 @@ function frmAdminBuildJS() {
9339
  jQuery( document.getElementById( 'frm-insert-fields' ) ).on( 'click', '.frm_add_field', addFieldClick );
9340
  $newFields.on( 'click', '.frm_clone_field', duplicateField );
9341
  $builderForm.on( 'blur', 'input[id^="frm_calc"]', checkCalculationCreatedByUser );
9342
- $builderForm.on( 'change', 'input.frm_format_opt', toggleInvalidMsg );
9343
  $builderForm.on( 'change click', '[data-changeme]', liveChanges );
9344
  $builderForm.on( 'click', 'input.frm_req_field', markRequired );
9345
  $builderForm.on( 'click', '.frm_mark_unique', markUnique );
@@ -9450,7 +9562,7 @@ function frmAdminBuildJS() {
9450
  $formActions.on( 'click', '.frm_add_posttax_row', addPosttaxRow );
9451
  $formActions.on( 'click', '.frm_toggle_cf_opts', toggleCfOpts );
9452
  $formActions.on( 'click', '.frm_duplicate_form_action', copyFormAction );
9453
- jQuery( 'select[data-toggleclass], input[data-toggleclass]' ).on( 'change', toggleFormOpts );
9454
  jQuery( '.frm_actions_list' ).on( 'click', '.frm_active_action', addFormAction );
9455
  jQuery( '#frm-show-groups, #frm-hide-groups' ).on( 'click', toggleActionGroups );
9456
  initiateMultiselect();
319
 
320
  const { tag, div, span, a, svg, img } = frmDom;
321
  const { doJsonFetch } = frmDom.ajax;
322
+ const icons = {
323
+ save: svg({ href: '#frm_save_icon' }),
324
+ drag: svg({ href: '#frm_drag_icon', classList: [ 'frm_drag_icon', 'frm-drag' ] })
325
+ };
326
 
327
  var $newFields = jQuery( document.getElementById( 'frm-show-fields' ) ),
328
  builderForm = document.getElementById( 'new_fields' ),
1394
  wrapFieldLiInPlace( currentItem );
1395
  }
1396
 
1397
+ currentItem[0].addEventListener( 'click', function() {
1398
+ maybeAddSaveAndDragIcons( this.dataset.fid );
1399
+ });
1400
+
1401
  jQuery.ajax({
1402
  type: 'POST', url: ajaxurl,
1403
  data: {
2692
  function toggleInvalidMsg() {
2693
  /*jshint validthis:true */
2694
  var typeDropdown, fieldType,
2695
+ fieldId = this.getAttribute( 'data-fid' ),
2696
+ value = '';
2697
+
2698
+ [ 'field_options_max_', 'frm_format_' ].forEach( function( id ) {
2699
+ var input = document.getElementById( id + fieldId );
2700
+ if ( ! input ) {
2701
+ return;
2702
+ }
2703
+
2704
+ value += input.value;
2705
+ });
2706
 
2707
  typeDropdown = document.getElementsByName( 'field_options[type_' + fieldId + ']' )[0];
2708
  fieldType = typeDropdown.options[typeDropdown.selectedIndex].value;
2709
 
2710
  if ( fieldType === 'text' ) {
2711
+ toggleValidationBox( '' !== value, '.frm_invalid_msg' + fieldId );
2712
  }
2713
  }
2714
 
2936
  newOption = newOption.replace( new RegExp( '-' + oldKey + '"', 'g' ), '-' + optKey + '"' );
2937
  newOption = newOption.replace( new RegExp( '\\[' + oldKey + '\\]', 'g' ), '[' + optKey + ']' );
2938
  newOption = newOption.replace( 'frm_hidden frm_option_template', '' );
2939
+ newOption = { newOption };
2940
+ addSaveAndDragIconsToOption( fieldId, newOption );
2941
+ jQuery( document.getElementById( 'frm_field_' + fieldId + '_opts' ) ).append( newOption.newOption );
2942
  resetDisplayedOpts( fieldId );
2943
  }
2944
  }
5213
  }
5214
 
5215
  const container = document.getElementById( 'frm_field_' + fieldId + '_opts' );
5216
+ const conflicts = Array.from( container.querySelectorAll( 'input[type="text"]' ) ).filter(
5217
+ input => input.id !== targetInput.id &&
5218
+ areValuesSeparate === input.name.endsWith( '[value]' ) &&
5219
+ input.value === targetInput.value
5220
  );
5221
+ if ( conflicts.length ) {
5222
+ infoModal( __( 'Duplicate option value "%s" detected', 'formidable' ).replace( '%s', targetInput.value ) );
 
 
 
 
 
5223
  }
5224
  }
5225
 
5759
  }
5760
 
5761
  // If one click upgrade, hide other content
5762
+ addOneClick( element, 'modal', upgradeLabel );
5763
 
5764
+ modal.querySelector( '.frm_are_not_installed' ).style.display = element.dataset.image ? 'none' : 'inline-block';
5765
  modal.querySelector( '.frm_feature_label' ).textContent = upgradeLabel;
5766
  modal.querySelector( 'h2' ).style.display = 'block';
5767
 
5768
  $info.dialog( 'open' );
5769
 
5770
  // set the utm medium
5771
+ const button = modal.querySelector( '.button-primary:not(.frm-oneclick-button)' );
5772
  link = button.getAttribute( 'href' ).replace( /(medium=)[a-z_-]+/ig, '$1' + element.getAttribute( 'data-medium' ) );
5773
  content = element.getAttribute( 'data-content' );
5774
  if ( content === null ) {
5804
 
5805
  function populateUpgradeTab( element ) {
5806
  const title = element.dataset.upgrade;
 
 
 
 
 
 
5807
 
5808
  const tab = element.getAttribute( 'href' ).replace( '#', '' );
5809
  const container = document.querySelector( '.frm_' + tab ) || document.querySelector( '.' + tab );
5812
  return;
5813
  }
5814
 
5815
+ if ( container.querySelector( '.frm-upgrade-message' ) ) {
5816
  // Tab has already been populated.
5817
  return;
5818
  }
5824
  h2.textContent = __( '%s are not installed' ).replace( '%s', title );
5825
 
5826
  container.classList.add( 'frmcenter' );
 
 
 
 
 
 
 
 
 
5827
 
5828
+ const upgradeModal = document.getElementById( 'frm_upgrade_modal' );
5829
+ appendClonedModalElementToContainer( 'frm-oneclick' );
5830
+ appendClonedModalElementToContainer( 'frm-addon-status' );
5831
 
5832
+ // Borrow the call to action from the Upgrade upgradeModal which should exist on the settings page (it is still used for other upgrades including Actions).
5833
+ const upgradeModalLink = upgradeModal.querySelector( '.frm-upgrade-link' );
5834
  if ( upgradeModalLink ) {
5835
  const upgradeButton = upgradeModalLink.cloneNode( true );
5836
+ const level = upgradeButton.querySelector( '.license-level' );
 
 
5837
 
5838
  if ( level ) {
5839
  level.textContent = getRequiredLicenseFromTrigger( element );
5841
 
5842
  container.appendChild( upgradeButton );
5843
 
5844
+ // Maybe append the secondary "Already purchased?" link from the upgradeModal as well.
5845
  if ( upgradeModalLink.nextElementSibling && upgradeModalLink.nextElementSibling.querySelector( '.frm-link-secondary' ) ) {
5846
  container.appendChild( upgradeModalLink.nextElementSibling.cloneNode( true ) );
5847
  }
5848
 
5849
+ appendClonedModalElementToContainer( 'frm-oneclick-button' );
 
 
 
5850
  }
5851
 
5852
+ appendClonedModalElementToContainer( 'frm-upgrade-message' );
5853
+ addOneClick( element, 'tab', element.dataset.message );
5854
+
5855
  if ( element.dataset.screenshot ) {
5856
  container.appendChild( getScreenshotWrapper( element.dataset.screenshot ) );
5857
  }
5858
+
5859
+ function appendClonedModalElementToContainer( className ) {
5860
+ container.appendChild( upgradeModal.querySelector( '.' + className ).cloneNode( true ) );
5861
+ }
5862
  }
5863
 
5864
  function getScreenshotWrapper( screenshot ) {
5895
 
5896
  /**
5897
  * Allow addons to be installed from the upgrade modal.
5898
+ *
5899
+ * @param {Element} link
5900
+ * @param {String} context Either 'modal' or 'tab'.
5901
+ * @param {String|undefined} upgradeLabel
5902
  */
5903
+ function addOneClick( link, context, upgradeLabel ) {
5904
+ let container;
 
 
 
 
 
 
 
5905
 
5906
+ if ( 'modal' === context ) {
5907
+ container = document.getElementById( 'frm_upgrade_modal' );
5908
+ } else if ( 'tab' === context ) {
5909
+ container = document.getElementById( link.getAttribute( 'href' ).substr( 1 ) );
5910
+ } else {
5911
+ return;
5912
  }
5913
 
5914
+ const oneclickMessage = container.querySelector( '.frm-oneclick' );
5915
+ const upgradeMessage = container.querySelector( '.frm-upgrade-message' );
5916
+ const showLink = container.querySelector( '.frm-upgrade-link' );
5917
+ const button = container.querySelector( '.frm-oneclick-button' );
5918
+ const addonStatus = container.querySelector( '.frm-addon-status' );
5919
+
5920
+ let oneclick = link.getAttribute( 'data-oneclick' );
5921
+ let newMessage = link.getAttribute( 'data-message' );
5922
+ let showIt = 'block';
5923
+ let showMsg = 'block';
5924
+ let hideIt = 'none';
5925
+
5926
  // If one click upgrade, hide other content.
5927
  if ( oneclickMessage !== null && typeof oneclick !== 'undefined' && oneclick ) {
5928
  if ( newMessage === null ) {
5932
  hideIt = 'block';
5933
  oneclick = JSON.parse( oneclick );
5934
 
5935
+ button.className = button.className.replace( ' frm-install-addon', '' ).replace( ' frm-activate-addon', '' );
5936
+ button.className = button.className + ' ' + oneclick.class;
5937
+ button.textContent = __( 'Activate', 'formidable' );
5938
  button.rel = oneclick.url;
5939
  }
5940
 
5941
+ if ( ! newMessage ) {
 
5942
  newMessage = upgradeMessage.getAttribute( 'data-default' );
5943
  }
5944
+ if ( undefined !== upgradeLabel ) {
5945
+ newMessage = newMessage.replace( '<span class="frm_feature_label"></span>', upgradeLabel );
5946
+ }
5947
+
5948
  upgradeMessage.innerHTML = newMessage;
5949
 
5950
  // Either set the link or use the default.
5951
+ showLink.href = getShowLinkHrefValue( link, showLink );
5952
+
5953
+ addonStatus.style.display = 'none';
 
5954
 
 
5955
  oneclickMessage.style.display = hideIt;
5956
  button.style.display = hideIt === 'block' ? 'inline-block' : hideIt;
5957
  upgradeMessage.style.display = showMsg;
5958
  showLink.style.display = showIt === 'block' ? 'inline-block' : showIt;
5959
  }
5960
 
5961
+ function getShowLinkHrefValue( link, showLink ) {
5962
+ let customLink = link.getAttribute( 'data-link' );
5963
+ if ( customLink === null || typeof customLink === 'undefined' || customLink === '' ) {
5964
+ customLink = showLink.getAttribute( 'data-default' );
5965
+ }
5966
+ return customLink;
5967
+ }
5968
+
5969
  /* Form settings */
5970
 
5971
  function showInputIcon( parentClass ) {
7938
  }
7939
 
7940
  function installOrActivate( clicked, action ) {
7941
+ let button, plugin, el, message;
7942
 
7943
  // Remove any leftover error messages, output an icon and get the plugin basename that needs to be activated.
7944
  jQuery( '.frm-addon-error' ).remove();
7945
+ button = jQuery( clicked );
7946
+ plugin = button.attr( 'rel' );
7947
+ el = button.parent();
7948
  message = el.parent().find( '.addon-status-label' );
7949
 
7950
  button.addClass( 'frm_loading_button' );
7962
  plugin: plugin
7963
  },
7964
  success: function( response ) {
7965
+ let saveAndReload;
7966
 
7967
  if ( 'string' !== typeof response && 'string' === typeof response.message ) {
7968
  if ( 'undefined' !== typeof response.saveAndReload ) {
7971
  response = response.message;
7972
  }
7973
 
7974
+ const error = extractErrorFromAddOnResponse( response );
 
7975
  if ( error ) {
7976
  addonError( error, el, button );
7977
  return;
7990
  e.preventDefault();
7991
 
7992
  // Now let's make another Ajax request once the user has submitted their credentials.
7993
+ const proceed = jQuery( this );
7994
+ const el = proceed.parent().parent();
7995
+ const plugin = proceed.attr( 'rel' );
7996
 
7997
  proceed.addClass( 'frm_loading_button' );
7998
 
8011
  password: el.find( '#password' ).val()
8012
  },
8013
  success: function( response ) {
8014
+ const error = extractErrorFromAddOnResponse( response );
 
8015
  if ( error ) {
8016
  addonError( error, el, proceed );
8017
  return;
8025
  });
8026
  }
8027
 
8028
+ /**
8029
+ * TODO stop addressing oneclick stuff by ID as this may happen in a tab as well.
8030
+ */
8031
  function afterAddonInstall( response, button, message, el, saveAndReload ) {
8032
+ const addonStatuses = document.querySelectorAll( '.frm-addon-status' );
8033
+ addonStatuses.forEach(
8034
+ addonStatus => {
8035
+ addonStatus.textContent = response;
8036
+ addonStatus.style.display = 'block';
8037
+ }
8038
+ );
8039
 
 
8040
  // The Ajax request was successful, so let's update the output.
8041
  button.css({ opacity: '0' });
8042
  message.text( frm_admin_js.active );
8043
+
8044
+ document.querySelectorAll( '.frm-oneclick' ).forEach(
8045
+ oneClick => {
8046
+ oneClick.style.display = 'none';
8047
+ }
8048
+ );
8049
+
8050
  jQuery( '#frm_upgrade_modal h2' ).hide();
8051
  jQuery( '#frm_upgrade_modal .frm_lock_icon' ).addClass( 'frm_lock_open_icon' );
8052
  jQuery( '#frm_upgrade_modal .frm_lock_icon use' ).attr( 'xlink:href', '#frm_lock_open_icon' );
8056
  button.removeClass( 'frm_loading_button' );
8057
 
8058
  // Maybe refresh import and SMTP pages
8059
+ const refreshPage = document.querySelectorAll( '.frm-admin-page-import, #frm-admin-smtp, #frm-welcome' );
8060
  if ( refreshPage.length > 0 ) {
8061
  window.location.reload();
8062
+ return;
8063
+ }
8064
+
8065
+ if ([ 'settings', 'form_builder' ].includes( saveAndReload ) ) {
8066
+ addonStatuses.forEach(
8067
+ addonStatus => {
8068
+ const inModal = null !== addonStatus.closest( '#frm_upgrade_modal' );
8069
+ addonStatus.appendChild( getSaveAndReloadSettingsOptions( saveAndReload, inModal ) );
8070
+ }
8071
+ );
8072
  }
8073
  }
8074
 
8075
+ function getSaveAndReloadSettingsOptions( saveAndReload, inModal ) {
8076
+ const className = 'frm-save-and-reload-options';
8077
+ const children = [ saveAndReloadSettingsButton( saveAndReload ) ];
8078
+ if ( inModal ) {
8079
+ children.push( closePopupButton() );
8080
+ }
8081
+ return div({ className, children });
8082
  }
8083
 
8084
  function saveAndReloadSettingsButton( saveAndReload ) {
8085
  var button = document.createElement( 'button' );
8086
+ button.classList.add( 'frm-save-and-reload', 'button', 'button-primary', 'frm-button-primary' );
 
8087
  button.textContent = __( 'Save and Reload', 'formidable' );
8088
  button.addEventListener( 'click', () => {
8089
  if ( saveAndReload === 'form_builder' ) {
9140
  return frmDom.util.debounce( func, wait );
9141
  }
9142
 
9143
+ function addSaveAndDragIconsToOption( fieldId, liObject ) {
9144
+ let li, useTag, useTagHref;
9145
+ let hasDragIcon = false;
9146
+ let hasSaveIcon = false;
9147
+
9148
+ if ( liObject.newOption ) {
9149
+ const parser = new DOMParser();
9150
+ li = parser.parseFromString( liObject.newOption, 'text/html' ).body.childNodes[0];
9151
+ } else {
9152
+ li = liObject;
9153
+ }
9154
+
9155
+ const liIcons = li.querySelectorAll( 'svg' );
9156
+
9157
+ liIcons.forEach( ( svg, key ) => {
9158
+ useTag = svg.getElementsByTagNameNS( 'http://www.w3.org/2000/svg', 'use' )[0];
9159
+ if ( ! useTag ) {
9160
+ return;
9161
+ }
9162
+ useTagHref = useTag.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || useTag.getAttribute( 'href' );
9163
+
9164
+ if ( useTagHref === '#frm_drag_icon' ) {
9165
+ hasDragIcon = true;
9166
+ }
9167
+
9168
+ if ( useTagHref === '#frm_save_icon' ) {
9169
+ hasSaveIcon = true;
9170
+ }
9171
+ });
9172
+
9173
+ if ( ! hasDragIcon ) {
9174
+ li.prepend( icons.drag.cloneNode( true ) );
9175
+ }
9176
+
9177
+ if ( li.querySelector( `[id^=field_key_${fieldId}-]` ) && ! hasSaveIcon ) {
9178
+ li.querySelector( `[id^=field_key_${fieldId}-]` ).after( icons.save.cloneNode( true ) );
9179
+ }
9180
+
9181
+ if ( liObject.newOption ) {
9182
+ liObject.newOption = li;
9183
+ }
9184
+ }
9185
+
9186
+ function maybeAddSaveAndDragIcons( fieldId ) {
9187
+ fieldOptions = document.querySelectorAll( `[id^=frm_delete_field_${fieldId}-]` );
9188
+ // return if there are no options.
9189
+ if ( fieldOptions.length < 2 ) {
9190
+ return;
9191
+ }
9192
+
9193
+ let options = [ ...fieldOptions ].slice( 1 );
9194
+ options.forEach( ( li, _key ) => {
9195
+ if ( li.classList.contains( 'frm_other_option' ) ) {
9196
+ return;
9197
+ }
9198
+ addSaveAndDragIconsToOption( fieldId, li );
9199
+ });
9200
+ }
9201
+
9202
  /**
9203
  * Does the same as jQuery( document ).on( 'event', 'selector', handler ).
9204
  *
9390
  return [ formId, formKey ];
9391
  }
9392
  );
9393
+
9394
+ document.querySelectorAll( '#frm-show-fields > li, .frm_grid_container li' ).forEach( ( el, _key ) => {
9395
+ el.addEventListener( 'click', function() {
9396
+ let fieldId = this.querySelector( 'li' )?.dataset.fid || this.dataset.fid;
9397
+ maybeAddSaveAndDragIcons( fieldId );
9398
+ });
9399
+ });
9400
  },
9401
 
9402
  buildInit: function() {
9451
  jQuery( document.getElementById( 'frm-insert-fields' ) ).on( 'click', '.frm_add_field', addFieldClick );
9452
  $newFields.on( 'click', '.frm_clone_field', duplicateField );
9453
  $builderForm.on( 'blur', 'input[id^="frm_calc"]', checkCalculationCreatedByUser );
9454
+ $builderForm.on( 'change', 'input.frm_format_opt, input.frm_max_length_opt', toggleInvalidMsg );
9455
  $builderForm.on( 'change click', '[data-changeme]', liveChanges );
9456
  $builderForm.on( 'click', 'input.frm_req_field', markRequired );
9457
  $builderForm.on( 'click', '.frm_mark_unique', markUnique );
9562
  $formActions.on( 'click', '.frm_add_posttax_row', addPosttaxRow );
9563
  $formActions.on( 'click', '.frm_toggle_cf_opts', toggleCfOpts );
9564
  $formActions.on( 'click', '.frm_duplicate_form_action', copyFormAction );
9565
+ jQuery( document ).on( 'change', 'select[data-toggleclass], input[data-toggleclass]', toggleFormOpts );
9566
  jQuery( '.frm_actions_list' ).on( 'click', '.frm_active_action', addFormAction );
9567
  jQuery( '#frm-show-groups, #frm-hide-groups' ).on( 'click', toggleActionGroups );
9568
  initiateMultiselect();
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 5.4.3\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: 2022-08-03T17:14:38+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: formidable\n"
@@ -229,7 +229,7 @@ msgid "Applications"
229
  msgstr ""
230
 
231
  #: classes/controllers/FrmEntriesController.php:79
232
- #: classes/controllers/FrmFormsController.php:1420
233
  #: classes/views/frm-entries/form.php:63
234
  #: classes/views/frm-entries/sidebar-shared.php:57
235
  msgid "Entry Key"
@@ -471,178 +471,178 @@ msgstr ""
471
  msgid "Template was successfully updated."
472
  msgstr ""
473
 
474
- #: classes/controllers/FrmFormsController.php:1076
475
  msgid "Form was Successfully Copied"
476
  msgstr ""
477
 
478
- #: classes/controllers/FrmFormsController.php:1141
479
  #: classes/controllers/FrmStylesController.php:400
480
  msgid "General"
481
  msgstr ""
482
 
483
- #: classes/controllers/FrmFormsController.php:1142
484
  msgid "General Form Settings"
485
  msgstr ""
486
 
487
- #: classes/controllers/FrmFormsController.php:1147
488
  msgid "Actions & Notifications"
489
  msgstr ""
490
 
491
- #: classes/controllers/FrmFormsController.php:1153
492
- #: classes/controllers/FrmFormsController.php:1158
493
  msgid "Form Permissions"
494
  msgstr ""
495
 
496
- #: classes/controllers/FrmFormsController.php:1159
497
  msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
498
  msgstr ""
499
 
500
- #: classes/controllers/FrmFormsController.php:1164
501
  msgid "Form Scheduling"
502
  msgstr ""
503
 
504
- #: classes/controllers/FrmFormsController.php:1169
505
  msgid "Form scheduling settings"
506
  msgstr ""
507
 
508
- #: classes/controllers/FrmFormsController.php:1174
509
  msgid "Styling & Buttons"
510
  msgstr ""
511
 
512
- #: classes/controllers/FrmFormsController.php:1180
513
  msgid "Form Landing Page"
514
  msgstr ""
515
 
516
- #: classes/controllers/FrmFormsController.php:1186
517
- #: classes/controllers/FrmFormsController.php:1192
518
  msgid "Conversational Forms"
519
  msgstr ""
520
 
521
- #: classes/controllers/FrmFormsController.php:1193
522
  msgid "Ask one question at a time for automated conversations."
523
  msgstr ""
524
 
525
- #: classes/controllers/FrmFormsController.php:1199
526
  msgid "Customize HTML"
527
  msgstr ""
528
 
529
- #: classes/controllers/FrmFormsController.php:1335
530
  msgid "Customize field values with the following parameters."
531
  msgstr ""
532
 
533
- #: classes/controllers/FrmFormsController.php:1373
534
  msgid "Separator"
535
  msgstr ""
536
 
537
- #: classes/controllers/FrmFormsController.php:1374
538
  msgid "Use a different separator for checkbox fields"
539
  msgstr ""
540
 
541
- #: classes/controllers/FrmFormsController.php:1377
542
  msgid "Date Format"
543
  msgstr ""
544
 
545
- #: classes/controllers/FrmFormsController.php:1380
546
  #: classes/views/frm-fields/back-end/settings.php:27
547
  msgid "Field Label"
548
  msgstr ""
549
 
550
- #: classes/controllers/FrmFormsController.php:1383
551
  msgid "No Auto P"
552
  msgstr ""
553
 
554
- #: classes/controllers/FrmFormsController.php:1384
555
  msgid "Do not automatically add any paragraphs or line breaks"
556
  msgstr ""
557
 
558
- #: classes/controllers/FrmFormsController.php:1399
559
  #: classes/models/FrmField.php:62
560
  msgid "User ID"
561
  msgstr ""
562
 
563
- #: classes/controllers/FrmFormsController.php:1400
564
  msgid "First Name"
565
  msgstr ""
566
 
567
- #: classes/controllers/FrmFormsController.php:1401
568
  msgid "Last Name"
569
  msgstr ""
570
 
571
- #: classes/controllers/FrmFormsController.php:1402
572
  msgid "Display Name"
573
  msgstr ""
574
 
575
- #: classes/controllers/FrmFormsController.php:1403
576
  msgid "User Login"
577
  msgstr ""
578
 
579
- #: classes/controllers/FrmFormsController.php:1404
580
  #: classes/models/FrmField.php:34
581
  msgid "Email"
582
  msgstr ""
583
 
584
- #: classes/controllers/FrmFormsController.php:1405
585
  msgid "Avatar"
586
  msgstr ""
587
 
588
- #: classes/controllers/FrmFormsController.php:1406
589
  msgid "Author Link"
590
  msgstr ""
591
 
592
- #: classes/controllers/FrmFormsController.php:1419
593
  #: classes/views/frm-entries/sidebar-shared.php:51
594
  msgid "Entry ID"
595
  msgstr ""
596
 
597
- #: classes/controllers/FrmFormsController.php:1421
598
  msgid "Post ID"
599
  msgstr ""
600
 
601
- #: classes/controllers/FrmFormsController.php:1422
602
  msgid "User IP"
603
  msgstr ""
604
 
605
- #: classes/controllers/FrmFormsController.php:1423
606
  msgid "Entry created"
607
  msgstr ""
608
 
609
- #: classes/controllers/FrmFormsController.php:1424
610
  msgid "Entry updated"
611
  msgstr ""
612
 
613
- #: classes/controllers/FrmFormsController.php:1426
614
  msgid "Site URL"
615
  msgstr ""
616
 
617
- #: classes/controllers/FrmFormsController.php:1427
618
  msgid "Site Name"
619
  msgstr ""
620
 
621
- #: classes/controllers/FrmFormsController.php:1435
622
  msgid "Default Msg"
623
  msgstr ""
624
 
625
- #: classes/controllers/FrmFormsController.php:1436
626
  msgid "Default HTML"
627
  msgstr ""
628
 
629
- #: classes/controllers/FrmFormsController.php:1437
630
  msgid "Default Plain"
631
  msgstr ""
632
 
633
- #: classes/controllers/FrmFormsController.php:1540
634
  msgid "No forms were specified"
635
  msgstr ""
636
 
637
- #: classes/controllers/FrmFormsController.php:1649
638
  msgid "There was a problem duplicating the form"
639
  msgstr ""
640
 
641
- #: classes/controllers/FrmFormsController.php:1660
642
  msgid "Abnormal HTML characters prevented your form from saving correctly"
643
  msgstr ""
644
 
645
- #: classes/controllers/FrmFormsController.php:1775
646
  #: classes/helpers/FrmFormsHelper.php:57
647
  #: classes/helpers/FrmFormsHelper.php:112
648
  #: classes/helpers/FrmFormsHelper.php:166
@@ -655,21 +655,21 @@ msgstr ""
655
  msgid "(no title)"
656
  msgstr ""
657
 
658
- #: classes/controllers/FrmFormsController.php:1841
659
- #: classes/controllers/FrmFormsController.php:1863
660
  msgid "Please select a valid form"
661
  msgstr ""
662
 
663
- #: classes/controllers/FrmFormsController.php:2097
664
  msgid "Please wait while you are redirected."
665
  msgstr ""
666
 
667
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
668
- #: classes/controllers/FrmFormsController.php:2132
669
  msgid "%1$sClick here%2$s if you are not automatically redirected."
670
  msgstr ""
671
 
672
- #: classes/controllers/FrmFormsController.php:2492
673
  #: classes/helpers/FrmAppHelper.php:1395
674
  #: classes/views/frm-forms/settings-advanced.php:93
675
  msgid "Select a Page"
@@ -886,6 +886,7 @@ msgstr ""
886
  #: classes/controllers/FrmSMTPController.php:322
887
  #: classes/models/FrmPluginSearch.php:307
888
  #: classes/views/addons/settings.php:31
 
889
  msgid "Activate"
890
  msgstr ""
891
 
@@ -1233,7 +1234,7 @@ msgstr ""
1233
  #: classes/views/frm-forms/new-form-overlay.php:132
1234
  #: classes/views/shared/admin-header.php:56
1235
  #: classes/views/shared/confirm-overlay.php:19
1236
- #: js/formidable_admin.js:3682
1237
  msgid "Cancel"
1238
  msgstr ""
1239
 
@@ -1260,7 +1261,7 @@ msgstr ""
1260
 
1261
  #: classes/helpers/FrmAppHelper.php:2822
1262
  #: classes/helpers/FrmListHelper.php:412
1263
- #: js/formidable_admin.js:4074
1264
  msgid "Heads up"
1265
  msgstr ""
1266
 
@@ -1696,42 +1697,42 @@ msgstr ""
1696
  msgid "Parent ID"
1697
  msgstr ""
1698
 
1699
- #: classes/helpers/FrmEntriesHelper.php:534
1700
  #: classes/helpers/FrmEntriesHelper.php:535
 
1701
  msgid "Unknown"
1702
  msgstr ""
1703
 
1704
- #: classes/helpers/FrmEntriesHelper.php:644
1705
  #: classes/views/frm-entries/show.php:12
1706
  msgid "View Entry"
1707
  msgstr ""
1708
 
1709
- #: classes/helpers/FrmEntriesHelper.php:652
1710
  msgid "Delete Entry"
1711
  msgstr ""
1712
 
1713
- #: classes/helpers/FrmEntriesHelper.php:655
1714
  msgid "Delete this form entry?"
1715
  msgstr ""
1716
 
1717
- #: classes/helpers/FrmEntriesHelper.php:663
1718
  msgid "Print Entry"
1719
  msgstr ""
1720
 
1721
- #: classes/helpers/FrmEntriesHelper.php:673
1722
- #: classes/helpers/FrmEntriesHelper.php:676
1723
  msgid "Resend Emails"
1724
  msgstr ""
1725
 
1726
- #: classes/helpers/FrmEntriesHelper.php:685
1727
  msgid "Edit Entry"
1728
  msgstr ""
1729
 
1730
- #: classes/helpers/FrmEntriesHelper.php:688
1731
  msgid "Entry edits"
1732
  msgstr ""
1733
 
1734
- #: classes/helpers/FrmEntriesHelper.php:714
1735
  msgid "reCAPTCHA Score"
1736
  msgstr ""
1737
 
@@ -1777,7 +1778,7 @@ msgstr ""
1777
  #: classes/helpers/FrmFormsHelper.php:1188
1778
  #: classes/helpers/FrmFormsListHelper.php:133
1779
  #: classes/views/frm-form-actions/form_action.php:25
1780
- #: js/formidable_admin.js:2062
1781
  msgid "Delete"
1782
  msgstr ""
1783
 
@@ -1789,7 +1790,7 @@ msgstr ""
1789
  #. translators: %s: The field name.
1790
  #: classes/helpers/FrmFieldsHelper.php:167
1791
  #: classes/helpers/FrmFieldsHelper.php:294
1792
- #: classes/helpers/FrmXMLHelper.php:1376
1793
  #: classes/models/fields/FrmFieldType.php:583
1794
  msgid "%s is invalid"
1795
  msgstr ""
@@ -3656,21 +3657,21 @@ msgstr ""
3656
  msgid "Your server is missing the simplexml_import_dom function"
3657
  msgstr ""
3658
 
3659
- #: classes/helpers/FrmXMLHelper.php:1189
3660
  #: classes/views/solutions/_import.php:51
3661
  msgid "Imported"
3662
  msgstr ""
3663
 
3664
- #: classes/helpers/FrmXMLHelper.php:1190
3665
  msgid "Updated"
3666
  msgstr ""
3667
 
3668
- #: classes/helpers/FrmXMLHelper.php:1215
3669
  msgid "Nothing was imported or updated"
3670
  msgstr ""
3671
 
3672
  #. translators: %1$s: Number of items
3673
- #: classes/helpers/FrmXMLHelper.php:1242
3674
  msgid "%1$s Form"
3675
  msgid_plural "%1$s Forms"
3676
  msgstr[0] ""
@@ -3678,7 +3679,7 @@ msgstr[1] ""
3678
 
3679
  #. translators: %1$s: Number of items
3680
  #. translators: %1$s - field type
3681
- #: classes/helpers/FrmXMLHelper.php:1244
3682
  #: classes/models/FrmFormMigrator.php:584
3683
  msgid "%1$s Field"
3684
  msgid_plural "%1$s Fields"
@@ -3686,56 +3687,56 @@ msgstr[0] ""
3686
  msgstr[1] ""
3687
 
3688
  #. translators: %1$s: Number of items
3689
- #: classes/helpers/FrmXMLHelper.php:1246
3690
  msgid "%1$s Entry"
3691
  msgid_plural "%1$s Entries"
3692
  msgstr[0] ""
3693
  msgstr[1] ""
3694
 
3695
  #. translators: %1$s: Number of items
3696
- #: classes/helpers/FrmXMLHelper.php:1248
3697
  msgid "%1$s View"
3698
  msgid_plural "%1$s Views"
3699
  msgstr[0] ""
3700
  msgstr[1] ""
3701
 
3702
  #. translators: %1$s: Number of items
3703
- #: classes/helpers/FrmXMLHelper.php:1250
3704
  msgid "%1$s Page/Post"
3705
  msgid_plural "%1$s Pages/Posts"
3706
  msgstr[0] ""
3707
  msgstr[1] ""
3708
 
3709
  #. translators: %1$s: Number of items
3710
- #: classes/helpers/FrmXMLHelper.php:1252
3711
  msgid "%1$s Style"
3712
  msgid_plural "%1$s Styles"
3713
  msgstr[0] ""
3714
  msgstr[1] ""
3715
 
3716
  #. translators: %1$s: Number of items
3717
- #: classes/helpers/FrmXMLHelper.php:1254
3718
  msgid "%1$s Term"
3719
  msgid_plural "%1$s Terms"
3720
  msgstr[0] ""
3721
  msgstr[1] ""
3722
 
3723
  #. translators: %1$s: Number of items
3724
- #: classes/helpers/FrmXMLHelper.php:1256
3725
  msgid "%1$s Form Action"
3726
  msgid_plural "%1$s Form Actions"
3727
  msgstr[0] ""
3728
  msgstr[1] ""
3729
 
3730
- #: classes/helpers/FrmXMLHelper.php:1294
3731
  msgid "Go to imported form"
3732
  msgstr ""
3733
 
3734
- #: classes/helpers/FrmXMLHelper.php:1495
3735
  msgid "Create Posts"
3736
  msgstr ""
3737
 
3738
- #: classes/helpers/FrmXMLHelper.php:1624
3739
  msgid "Email Notification"
3740
  msgstr ""
3741
 
@@ -4100,31 +4101,31 @@ msgstr ""
4100
  msgid "There are no options for this action."
4101
  msgstr ""
4102
 
4103
- #: classes/models/FrmFormAction.php:846
4104
  msgid "Draft is saved"
4105
  msgstr ""
4106
 
4107
- #: classes/models/FrmFormAction.php:847
4108
  msgid "Entry is created"
4109
  msgstr ""
4110
 
4111
- #: classes/models/FrmFormAction.php:848
4112
  msgid "Entry is updated"
4113
  msgstr ""
4114
 
4115
- #: classes/models/FrmFormAction.php:849
4116
  msgid "Entry is deleted"
4117
  msgstr ""
4118
 
4119
- #: classes/models/FrmFormAction.php:850
4120
  msgid "Entry is imported"
4121
  msgstr ""
4122
 
4123
- #: classes/models/FrmFormAction.php:860
4124
  msgid "Use Conditional Logic"
4125
  msgstr ""
4126
 
4127
- #: classes/models/FrmFormAction.php:867
4128
  msgid "Conditional form actions"
4129
  msgstr ""
4130
 
@@ -4518,7 +4519,7 @@ msgstr ""
4518
  #: classes/views/frm-fields/back-end/inline-modal.php:7
4519
  #: classes/views/frm-fields/back-end/inline-modal.php:8
4520
  #: classes/views/shared/admin-header.php:11
4521
- #: js/formidable_admin.js:8056
4522
  msgid "Close"
4523
  msgstr ""
4524
 
@@ -4773,7 +4774,7 @@ msgstr ""
4773
  msgid "Format"
4774
  msgstr ""
4775
 
4776
- #: classes/views/frm-fields/single-option.php:16
4777
  msgid "Saved Value"
4778
  msgstr ""
4779
 
@@ -4811,7 +4812,7 @@ msgstr ""
4811
 
4812
  #: classes/views/frm-form-actions/form_action.php:21
4813
  #: classes/views/styles/_upsell-multiple-styles.php:15
4814
- #: js/formidable_admin.js:2068
4815
  msgid "Duplicate"
4816
  msgstr ""
4817
 
@@ -4851,6 +4852,10 @@ msgstr ""
4851
  msgid "Email attachments"
4852
  msgstr ""
4853
 
 
 
 
 
4854
  #: classes/views/frm-form-actions/_action_inside.php:72
4855
  msgid "Attachment"
4856
  msgstr ""
@@ -4936,9 +4941,9 @@ msgid "Move Field"
4936
  msgstr ""
4937
 
4938
  #: classes/views/frm-forms/add_field.php:29
4939
- #: js/formidable_admin.js:1242
4940
- #: js/formidable_admin.js:1245
4941
- #: js/formidable_admin.js:2006
4942
  msgid "More Options"
4943
  msgstr ""
4944
 
@@ -6475,71 +6480,71 @@ msgstr ""
6475
  msgid "Successfully copied embed example"
6476
  msgstr ""
6477
 
6478
- #: js/formidable_admin.js:1203
6479
  msgid "Set Row Layout"
6480
  msgstr ""
6481
 
6482
- #: js/formidable_admin.js:1210
6483
  msgid "Move Field Group"
6484
  msgstr ""
6485
 
6486
- #: js/formidable_admin.js:2034
6487
  msgid "Field settings"
6488
  msgstr ""
6489
 
6490
- #: js/formidable_admin.js:2062
6491
  msgid "Delete Group"
6492
  msgstr ""
6493
 
6494
- #: js/formidable_admin.js:2068
6495
  msgid "Duplicate Group"
6496
  msgstr ""
6497
 
6498
- #: js/formidable_admin.js:3389
6499
  msgid "Custom layout"
6500
  msgstr ""
6501
 
6502
- #: js/formidable_admin.js:3412
6503
  msgid "Break into rows"
6504
  msgstr ""
6505
 
6506
- #: js/formidable_admin.js:3422
6507
  msgid "Row Layout"
6508
  msgstr ""
6509
 
6510
- #: js/formidable_admin.js:3667
6511
  msgid "Enter number of columns for each field"
6512
  msgstr ""
6513
 
6514
- #: js/formidable_admin.js:3671
6515
  msgid "Layouts are based on a 12-column grid system"
6516
  msgstr ""
6517
 
6518
- #: js/formidable_admin.js:3687
6519
  msgid "Save"
6520
  msgstr ""
6521
 
6522
- #: js/formidable_admin.js:3988
6523
  msgid "Merge into row"
6524
  msgstr ""
6525
 
6526
  #. translators: %1$s: Number of fields that are selected to be deleted.
6527
- #: js/formidable_admin.js:4076
6528
  msgid "Are you sure you want to delete these %1$s selected fields?"
6529
  msgstr ""
6530
 
6531
- #: js/formidable_admin.js:5204
6532
  msgid "Duplicate option value \"%s\" detected"
6533
  msgstr ""
6534
 
6535
- #: js/formidable_admin.js:7340
6536
  msgid "Ready Made Solution"
6537
  msgstr ""
6538
 
6539
- #: js/formidable_admin.js:7343
6540
  msgid "Check all applications"
6541
  msgstr ""
6542
 
6543
- #: js/formidable_admin.js:8041
6544
  msgid "Save and Reload"
6545
  msgstr ""
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Formidable Forms 5.4.4\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: 2022-08-17T18:16:35+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: formidable\n"
229
  msgstr ""
230
 
231
  #: classes/controllers/FrmEntriesController.php:79
232
+ #: classes/controllers/FrmFormsController.php:1427
233
  #: classes/views/frm-entries/form.php:63
234
  #: classes/views/frm-entries/sidebar-shared.php:57
235
  msgid "Entry Key"
471
  msgid "Template was successfully updated."
472
  msgstr ""
473
 
474
+ #: classes/controllers/FrmFormsController.php:1083
475
  msgid "Form was Successfully Copied"
476
  msgstr ""
477
 
478
+ #: classes/controllers/FrmFormsController.php:1148
479
  #: classes/controllers/FrmStylesController.php:400
480
  msgid "General"
481
  msgstr ""
482
 
483
+ #: classes/controllers/FrmFormsController.php:1149
484
  msgid "General Form Settings"
485
  msgstr ""
486
 
487
+ #: classes/controllers/FrmFormsController.php:1154
488
  msgid "Actions & Notifications"
489
  msgstr ""
490
 
491
+ #: classes/controllers/FrmFormsController.php:1160
492
+ #: classes/controllers/FrmFormsController.php:1165
493
  msgid "Form Permissions"
494
  msgstr ""
495
 
496
+ #: classes/controllers/FrmFormsController.php:1166
497
  msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
498
  msgstr ""
499
 
500
+ #: classes/controllers/FrmFormsController.php:1171
501
  msgid "Form Scheduling"
502
  msgstr ""
503
 
504
+ #: classes/controllers/FrmFormsController.php:1176
505
  msgid "Form scheduling settings"
506
  msgstr ""
507
 
508
+ #: classes/controllers/FrmFormsController.php:1181
509
  msgid "Styling & Buttons"
510
  msgstr ""
511
 
512
+ #: classes/controllers/FrmFormsController.php:1187
513
  msgid "Form Landing Page"
514
  msgstr ""
515
 
516
+ #: classes/controllers/FrmFormsController.php:1193
517
+ #: classes/controllers/FrmFormsController.php:1199
518
  msgid "Conversational Forms"
519
  msgstr ""
520
 
521
+ #: classes/controllers/FrmFormsController.php:1200
522
  msgid "Ask one question at a time for automated conversations."
523
  msgstr ""
524
 
525
+ #: classes/controllers/FrmFormsController.php:1206
526
  msgid "Customize HTML"
527
  msgstr ""
528
 
529
+ #: classes/controllers/FrmFormsController.php:1342
530
  msgid "Customize field values with the following parameters."
531
  msgstr ""
532
 
533
+ #: classes/controllers/FrmFormsController.php:1380
534
  msgid "Separator"
535
  msgstr ""
536
 
537
+ #: classes/controllers/FrmFormsController.php:1381
538
  msgid "Use a different separator for checkbox fields"
539
  msgstr ""
540
 
541
+ #: classes/controllers/FrmFormsController.php:1384
542
  msgid "Date Format"
543
  msgstr ""
544
 
545
+ #: classes/controllers/FrmFormsController.php:1387
546
  #: classes/views/frm-fields/back-end/settings.php:27
547
  msgid "Field Label"
548
  msgstr ""
549
 
550
+ #: classes/controllers/FrmFormsController.php:1390
551
  msgid "No Auto P"
552
  msgstr ""
553
 
554
+ #: classes/controllers/FrmFormsController.php:1391
555
  msgid "Do not automatically add any paragraphs or line breaks"
556
  msgstr ""
557
 
558
+ #: classes/controllers/FrmFormsController.php:1406
559
  #: classes/models/FrmField.php:62
560
  msgid "User ID"
561
  msgstr ""
562
 
563
+ #: classes/controllers/FrmFormsController.php:1407
564
  msgid "First Name"
565
  msgstr ""
566
 
567
+ #: classes/controllers/FrmFormsController.php:1408
568
  msgid "Last Name"
569
  msgstr ""
570
 
571
+ #: classes/controllers/FrmFormsController.php:1409
572
  msgid "Display Name"
573
  msgstr ""
574
 
575
+ #: classes/controllers/FrmFormsController.php:1410
576
  msgid "User Login"
577
  msgstr ""
578
 
579
+ #: classes/controllers/FrmFormsController.php:1411
580
  #: classes/models/FrmField.php:34
581
  msgid "Email"
582
  msgstr ""
583
 
584
+ #: classes/controllers/FrmFormsController.php:1412
585
  msgid "Avatar"
586
  msgstr ""
587
 
588
+ #: classes/controllers/FrmFormsController.php:1413
589
  msgid "Author Link"
590
  msgstr ""
591
 
592
+ #: classes/controllers/FrmFormsController.php:1426
593
  #: classes/views/frm-entries/sidebar-shared.php:51
594
  msgid "Entry ID"
595
  msgstr ""
596
 
597
+ #: classes/controllers/FrmFormsController.php:1428
598
  msgid "Post ID"
599
  msgstr ""
600
 
601
+ #: classes/controllers/FrmFormsController.php:1429
602
  msgid "User IP"
603
  msgstr ""
604
 
605
+ #: classes/controllers/FrmFormsController.php:1430
606
  msgid "Entry created"
607
  msgstr ""
608
 
609
+ #: classes/controllers/FrmFormsController.php:1431
610
  msgid "Entry updated"
611
  msgstr ""
612
 
613
+ #: classes/controllers/FrmFormsController.php:1433
614
  msgid "Site URL"
615
  msgstr ""
616
 
617
+ #: classes/controllers/FrmFormsController.php:1434
618
  msgid "Site Name"
619
  msgstr ""
620
 
621
+ #: classes/controllers/FrmFormsController.php:1442
622
  msgid "Default Msg"
623
  msgstr ""
624
 
625
+ #: classes/controllers/FrmFormsController.php:1443
626
  msgid "Default HTML"
627
  msgstr ""
628
 
629
+ #: classes/controllers/FrmFormsController.php:1444
630
  msgid "Default Plain"
631
  msgstr ""
632
 
633
+ #: classes/controllers/FrmFormsController.php:1547
634
  msgid "No forms were specified"
635
  msgstr ""
636
 
637
+ #: classes/controllers/FrmFormsController.php:1656
638
  msgid "There was a problem duplicating the form"
639
  msgstr ""
640
 
641
+ #: classes/controllers/FrmFormsController.php:1667
642
  msgid "Abnormal HTML characters prevented your form from saving correctly"
643
  msgstr ""
644
 
645
+ #: classes/controllers/FrmFormsController.php:1782
646
  #: classes/helpers/FrmFormsHelper.php:57
647
  #: classes/helpers/FrmFormsHelper.php:112
648
  #: classes/helpers/FrmFormsHelper.php:166
655
  msgid "(no title)"
656
  msgstr ""
657
 
658
+ #: classes/controllers/FrmFormsController.php:1848
659
+ #: classes/controllers/FrmFormsController.php:1870
660
  msgid "Please select a valid form"
661
  msgstr ""
662
 
663
+ #: classes/controllers/FrmFormsController.php:2104
664
  msgid "Please wait while you are redirected."
665
  msgstr ""
666
 
667
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
668
+ #: classes/controllers/FrmFormsController.php:2139
669
  msgid "%1$sClick here%2$s if you are not automatically redirected."
670
  msgstr ""
671
 
672
+ #: classes/controllers/FrmFormsController.php:2499
673
  #: classes/helpers/FrmAppHelper.php:1395
674
  #: classes/views/frm-forms/settings-advanced.php:93
675
  msgid "Select a Page"
886
  #: classes/controllers/FrmSMTPController.php:322
887
  #: classes/models/FrmPluginSearch.php:307
888
  #: classes/views/addons/settings.php:31
889
+ #: js/formidable_admin.js:5937
890
  msgid "Activate"
891
  msgstr ""
892
 
1234
  #: classes/views/frm-forms/new-form-overlay.php:132
1235
  #: classes/views/shared/admin-header.php:56
1236
  #: classes/views/shared/confirm-overlay.php:19
1237
+ #: js/formidable_admin.js:3701
1238
  msgid "Cancel"
1239
  msgstr ""
1240
 
1261
 
1262
  #: classes/helpers/FrmAppHelper.php:2822
1263
  #: classes/helpers/FrmListHelper.php:412
1264
+ #: js/formidable_admin.js:4093
1265
  msgid "Heads up"
1266
  msgstr ""
1267
 
1697
  msgid "Parent ID"
1698
  msgstr ""
1699
 
 
1700
  #: classes/helpers/FrmEntriesHelper.php:535
1701
+ #: classes/helpers/FrmEntriesHelper.php:536
1702
  msgid "Unknown"
1703
  msgstr ""
1704
 
1705
+ #: classes/helpers/FrmEntriesHelper.php:645
1706
  #: classes/views/frm-entries/show.php:12
1707
  msgid "View Entry"
1708
  msgstr ""
1709
 
1710
+ #: classes/helpers/FrmEntriesHelper.php:653
1711
  msgid "Delete Entry"
1712
  msgstr ""
1713
 
1714
+ #: classes/helpers/FrmEntriesHelper.php:656
1715
  msgid "Delete this form entry?"
1716
  msgstr ""
1717
 
1718
+ #: classes/helpers/FrmEntriesHelper.php:664
1719
  msgid "Print Entry"
1720
  msgstr ""
1721
 
1722
+ #: classes/helpers/FrmEntriesHelper.php:674
1723
+ #: classes/helpers/FrmEntriesHelper.php:677
1724
  msgid "Resend Emails"
1725
  msgstr ""
1726
 
1727
+ #: classes/helpers/FrmEntriesHelper.php:686
1728
  msgid "Edit Entry"
1729
  msgstr ""
1730
 
1731
+ #: classes/helpers/FrmEntriesHelper.php:689
1732
  msgid "Entry edits"
1733
  msgstr ""
1734
 
1735
+ #: classes/helpers/FrmEntriesHelper.php:715
1736
  msgid "reCAPTCHA Score"
1737
  msgstr ""
1738
 
1778
  #: classes/helpers/FrmFormsHelper.php:1188
1779
  #: classes/helpers/FrmFormsListHelper.php:133
1780
  #: classes/views/frm-form-actions/form_action.php:25
1781
+ #: js/formidable_admin.js:2070
1782
  msgid "Delete"
1783
  msgstr ""
1784
 
1790
  #. translators: %s: The field name.
1791
  #: classes/helpers/FrmFieldsHelper.php:167
1792
  #: classes/helpers/FrmFieldsHelper.php:294
1793
+ #: classes/helpers/FrmXMLHelper.php:1394
1794
  #: classes/models/fields/FrmFieldType.php:583
1795
  msgid "%s is invalid"
1796
  msgstr ""
3657
  msgid "Your server is missing the simplexml_import_dom function"
3658
  msgstr ""
3659
 
3660
+ #: classes/helpers/FrmXMLHelper.php:1207
3661
  #: classes/views/solutions/_import.php:51
3662
  msgid "Imported"
3663
  msgstr ""
3664
 
3665
+ #: classes/helpers/FrmXMLHelper.php:1208
3666
  msgid "Updated"
3667
  msgstr ""
3668
 
3669
+ #: classes/helpers/FrmXMLHelper.php:1233
3670
  msgid "Nothing was imported or updated"
3671
  msgstr ""
3672
 
3673
  #. translators: %1$s: Number of items
3674
+ #: classes/helpers/FrmXMLHelper.php:1260
3675
  msgid "%1$s Form"
3676
  msgid_plural "%1$s Forms"
3677
  msgstr[0] ""
3679
 
3680
  #. translators: %1$s: Number of items
3681
  #. translators: %1$s - field type
3682
+ #: classes/helpers/FrmXMLHelper.php:1262
3683
  #: classes/models/FrmFormMigrator.php:584
3684
  msgid "%1$s Field"
3685
  msgid_plural "%1$s Fields"
3687
  msgstr[1] ""
3688
 
3689
  #. translators: %1$s: Number of items
3690
+ #: classes/helpers/FrmXMLHelper.php:1264
3691
  msgid "%1$s Entry"
3692
  msgid_plural "%1$s Entries"
3693
  msgstr[0] ""
3694
  msgstr[1] ""
3695
 
3696
  #. translators: %1$s: Number of items
3697
+ #: classes/helpers/FrmXMLHelper.php:1266
3698
  msgid "%1$s View"
3699
  msgid_plural "%1$s Views"
3700
  msgstr[0] ""
3701
  msgstr[1] ""
3702
 
3703
  #. translators: %1$s: Number of items
3704
+ #: classes/helpers/FrmXMLHelper.php:1268
3705
  msgid "%1$s Page/Post"
3706
  msgid_plural "%1$s Pages/Posts"
3707
  msgstr[0] ""
3708
  msgstr[1] ""
3709
 
3710
  #. translators: %1$s: Number of items
3711
+ #: classes/helpers/FrmXMLHelper.php:1270
3712
  msgid "%1$s Style"
3713
  msgid_plural "%1$s Styles"
3714
  msgstr[0] ""
3715
  msgstr[1] ""
3716
 
3717
  #. translators: %1$s: Number of items
3718
+ #: classes/helpers/FrmXMLHelper.php:1272
3719
  msgid "%1$s Term"
3720
  msgid_plural "%1$s Terms"
3721
  msgstr[0] ""
3722
  msgstr[1] ""
3723
 
3724
  #. translators: %1$s: Number of items
3725
+ #: classes/helpers/FrmXMLHelper.php:1274
3726
  msgid "%1$s Form Action"
3727
  msgid_plural "%1$s Form Actions"
3728
  msgstr[0] ""
3729
  msgstr[1] ""
3730
 
3731
+ #: classes/helpers/FrmXMLHelper.php:1312
3732
  msgid "Go to imported form"
3733
  msgstr ""
3734
 
3735
+ #: classes/helpers/FrmXMLHelper.php:1513
3736
  msgid "Create Posts"
3737
  msgstr ""
3738
 
3739
+ #: classes/helpers/FrmXMLHelper.php:1642
3740
  msgid "Email Notification"
3741
  msgstr ""
3742
 
4101
  msgid "There are no options for this action."
4102
  msgstr ""
4103
 
4104
+ #: classes/models/FrmFormAction.php:852
4105
  msgid "Draft is saved"
4106
  msgstr ""
4107
 
4108
+ #: classes/models/FrmFormAction.php:853
4109
  msgid "Entry is created"
4110
  msgstr ""
4111
 
4112
+ #: classes/models/FrmFormAction.php:854
4113
  msgid "Entry is updated"
4114
  msgstr ""
4115
 
4116
+ #: classes/models/FrmFormAction.php:855
4117
  msgid "Entry is deleted"
4118
  msgstr ""
4119
 
4120
+ #: classes/models/FrmFormAction.php:856
4121
  msgid "Entry is imported"
4122
  msgstr ""
4123
 
4124
+ #: classes/models/FrmFormAction.php:866
4125
  msgid "Use Conditional Logic"
4126
  msgstr ""
4127
 
4128
+ #: classes/models/FrmFormAction.php:873
4129
  msgid "Conditional form actions"
4130
  msgstr ""
4131
 
4519
  #: classes/views/frm-fields/back-end/inline-modal.php:7
4520
  #: classes/views/frm-fields/back-end/inline-modal.php:8
4521
  #: classes/views/shared/admin-header.php:11
4522
+ #: js/formidable_admin.js:8102
4523
  msgid "Close"
4524
  msgstr ""
4525
 
4774
  msgid "Format"
4775
  msgstr ""
4776
 
4777
+ #: classes/views/frm-fields/single-option.php:23
4778
  msgid "Saved Value"
4779
  msgstr ""
4780
 
4812
 
4813
  #: classes/views/frm-form-actions/form_action.php:21
4814
  #: classes/views/styles/_upsell-multiple-styles.php:15
4815
+ #: js/formidable_admin.js:2076
4816
  msgid "Duplicate"
4817
  msgstr ""
4818
 
4852
  msgid "Email attachments"
4853
  msgstr ""
4854
 
4855
+ #: classes/views/frm-form-actions/_action_inside.php:71
4856
+ msgid "Email a CSV or a PDF of each new entry, or attach a file of your choice."
4857
+ msgstr ""
4858
+
4859
  #: classes/views/frm-form-actions/_action_inside.php:72
4860
  msgid "Attachment"
4861
  msgstr ""
4941
  msgstr ""
4942
 
4943
  #: classes/views/frm-forms/add_field.php:29
4944
+ #: js/formidable_admin.js:1246
4945
+ #: js/formidable_admin.js:1249
4946
+ #: js/formidable_admin.js:2014
4947
  msgid "More Options"
4948
  msgstr ""
4949
 
6480
  msgid "Successfully copied embed example"
6481
  msgstr ""
6482
 
6483
+ #: js/formidable_admin.js:1207
6484
  msgid "Set Row Layout"
6485
  msgstr ""
6486
 
6487
+ #: js/formidable_admin.js:1214
6488
  msgid "Move Field Group"
6489
  msgstr ""
6490
 
6491
+ #: js/formidable_admin.js:2042
6492
  msgid "Field settings"
6493
  msgstr ""
6494
 
6495
+ #: js/formidable_admin.js:2070
6496
  msgid "Delete Group"
6497
  msgstr ""
6498
 
6499
+ #: js/formidable_admin.js:2076
6500
  msgid "Duplicate Group"
6501
  msgstr ""
6502
 
6503
+ #: js/formidable_admin.js:3408
6504
  msgid "Custom layout"
6505
  msgstr ""
6506
 
6507
+ #: js/formidable_admin.js:3431
6508
  msgid "Break into rows"
6509
  msgstr ""
6510
 
6511
+ #: js/formidable_admin.js:3441
6512
  msgid "Row Layout"
6513
  msgstr ""
6514
 
6515
+ #: js/formidable_admin.js:3686
6516
  msgid "Enter number of columns for each field"
6517
  msgstr ""
6518
 
6519
+ #: js/formidable_admin.js:3690
6520
  msgid "Layouts are based on a 12-column grid system"
6521
  msgstr ""
6522
 
6523
+ #: js/formidable_admin.js:3706
6524
  msgid "Save"
6525
  msgstr ""
6526
 
6527
+ #: js/formidable_admin.js:4007
6528
  msgid "Merge into row"
6529
  msgstr ""
6530
 
6531
  #. translators: %1$s: Number of fields that are selected to be deleted.
6532
+ #: js/formidable_admin.js:4095
6533
  msgid "Are you sure you want to delete these %1$s selected fields?"
6534
  msgstr ""
6535
 
6536
+ #: js/formidable_admin.js:5222
6537
  msgid "Duplicate option value \"%s\" detected"
6538
  msgstr ""
6539
 
6540
+ #: js/formidable_admin.js:7366
6541
  msgid "Ready Made Solution"
6542
  msgstr ""
6543
 
6544
+ #: js/formidable_admin.js:7369
6545
  msgid "Check all applications"
6546
  msgstr ""
6547
 
6548
+ #: js/formidable_admin.js:8087
6549
  msgid "Save and Reload"
6550
  msgstr ""
readme.txt CHANGED
@@ -1,39 +1,47 @@
1
- === Formidable Form Builder - Contact Form, Survey & Quiz Forms Plugin for WordPress ===
2
- Plugin Name: Formidable Forms - Contact Form, Survey & Quiz Forms Plugin for WordPress
3
  Contributors: formidableforms, sswells, srwells
4
- Tags: forms, contact form, form builder, survey, free, form maker, form creator, paypal form, paypal, stripe, stripe form, aweber, aweber form, getresponse, getresponse form, calculator, price calculator, quote form, contact button, form manager, Akismet, payment form, survey form, donation form, email subscription, contact form widget, user registration form, wordpress registration, wordpress login form, constant contact, mailpoet, active campaign, salesforce, hubspot, campaign monitor, quiz builder, quiz, feedback form, mailchimp form
5
  Requires at least: 5.2
6
  Tested up to: 6.0.1
7
  Requires PHP: 5.6
8
- Stable tag: 5.4.3
9
 
10
  The most advanced WordPress forms plugin. Go beyond contact forms with our drag & drop form builder for surveys, quizzes, and more.
11
 
12
  == Description ==
13
 
14
  == The Most Powerful WordPress form builder plugin on the market ==
15
- We built <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Formidable Forms</a> to offer the "first-ever" solutions-focused WordPress form plugin on the market. You can use our drag & drop WordPress form builder plugin to create a contact form, survey, quiz, registration form, payment form, email marketing, or calculator form. Build just about anything you can imagine.
16
 
17
- At Formidable, creating the most extendable online form builder plugin is our #1 priority. Unlike other WordPress form maker plugins, we believe in pushing the limits. We want to give you the tools to save time and create complex custom forms quickly!
18
 
19
- Before we explore the features of the powerful Formidable contact form builder plugin, you should know that Formidable is 100% mobile responsive. Your WordPress forms will always look great on all devices (desktop, laptop, tablets, and smartphones).
20
 
21
- Plus, we have optimized Formidable for speed and maximum server performance. We can confidently say that this is one of the FASTEST WordPress form builders on the market.
22
 
23
- > <strong>Formidable Forms Pro</strong><br />
24
- > This form builder plugin is the free version of Formidable that comes with all the features you will ever need. Build an advanced email subscription form, multi-page form, file upload form, quiz, or a smart form with conditional logic. Stack on repeater fields, payment integrations, form templates, relationships, cascading dropdown fields. Don't forget the calculated fields, front-end form editing, and powerful WordPress Views to display data in web applications.
25
- > With Formidable, you get far more than just a contact form.
26
- > <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion" rel="friend">Click here to purchase the most advanced premium WordPress form builder plugin now!</a>
27
 
28
  You can start with our pre-built templates or create totally custom forms from scratch. All with an easy-to-use drag & drop form maker interface.
29
 
30
  https://youtu.be/7X2BqhRsXcg
31
 
32
- Let’s take a look at all the powerful features for making an amazing lead form, survey form, poll, subscription form, request a quote form, donation form, user registration form, or payment form.
33
 
34
- == Drag & Drop Form Maker and Advanced Form Builder ==
35
 
36
- The Formidable drag & drop form builder allows you to quickly build unlimited surveys, quizzes, price calculators, and whatever else you want.
 
 
 
 
 
 
 
 
37
 
38
  Our form maker comes with all the powerful fields that you need to create a solution-focused form, fast!
39
 
@@ -43,15 +51,15 @@ Formidable allows you to view all your quiz and survey entries right from your W
43
 
44
  It's a **100% GDPR-friendly** form generator. You can turn off IP tracking or stop saving submissions entirely. Or add a GDPR checkbox field to your lead forms and payment forms to collect consent.
45
 
46
- Need to import your leads to an external service like MailChimp? No problem. **Export leads to a CSV**, open it in Excel, or import anywhere.
47
 
48
  You can also configure unlimited email notifications and autoresponders triggered by submissions.
49
 
50
- On top of that, you can easily customize the success message after a contact form is submitted, or redirect visitors to another page.
51
 
52
  == The Only Form Maker Plugin with an Advanced Styler ==
53
 
54
- With our built-in styler, you can instantly customize the look and feel of your contact form. With just a few clicks, your email form can be transformed to match your website design.
55
 
56
  By default, a single styling template is created. If you want a custom form style for each footer and sidebar form, check out the premium version of Formidable.
57
 
@@ -59,7 +67,7 @@ By default, a single styling template is created. If you want a custom form styl
59
 
60
  Formidable comes with a built-in survey feature (like Survey Monkey, but without the high costs), so you can quickly create powerful surveys with Net Promoter Scores (NPS), Likert fields, star ratings, image radio buttons, and more.
61
 
62
- Beautiful reports will be waiting, or create your own customized graphs. Our graphs and reports will help you analyze and showcase data. We believe that data alone does no good if you can't analyze it. That’s why we make it easy to analyze data from a survey, quiz, or price calculator.
63
 
64
  You can even showcase data on the front-end of your website. Just embed graphs in your WordPress posts or pages.
65
 
@@ -67,23 +75,23 @@ The best part is that you can do this all without any third-party tools.
67
 
68
  == Quickly Create an Advanced WordPress Registration Form for Any Use Case ==
69
 
70
- Whether you need to create a youth sports team, event, or church retreat registration, Formidable has you covered. Unlike other form plugins, Formidable comes with a repeater field that allows you to create the best registration forms.
71
 
72
  Then, our marketing integrations and APIs can send the data anywhere you want.
73
 
74
  == Accept Credit Cards and Easily Collect Payments ==
75
 
76
- By now, you probably already realize the theme that Formidable is more than just a WordPress contact form plugin. You can use it to create a payment form to accept credit card payments right from your website.
77
 
78
- We offer seamless integration with PayPal, Stripe, and Authorize.net, so you can create an order form, donation form, or purchase form with our drag & drop form builder.
79
 
80
- You can even use the plugin to create a WooCommerce form with custom fields.
81
 
82
  == Make Data-Driven Web Applications with a Formidable View ==
83
 
84
- Formidable Views are by far the most powerful feature that makes Formidable far more than just a contact form builder plugin. Views allow you to flexibly display any submitted data on the front-end of your website.
85
 
86
- Our customers use Formidable Views to create data-driven web applications. We see real estate listings, employment listings, event calendars, business or member directories, job boards, and other searchable databases.
87
 
88
  As you can see, Formidable is not your average contact form plugin. It's a true all-in-one WordPress form solution.
89
 
@@ -93,7 +101,7 @@ Formidable is the only WordPress form builder plugin that offers extensive integ
93
 
94
  Our goal is to empower you to build powerful WooCommerce product order forms, so you can increase your store sales.
95
 
96
- You can add a WooCommerce product configurator with custom calculation fields. Then automatically send the order info to the WooCommerce cart with variable pricing options.
97
 
98
  == Make Powerful Quiz Forms & Calculators ==
99
 
@@ -110,13 +118,13 @@ More on quizzes later, but here are some example online calculators that you can
110
  * Online Quote Calculator
111
  * Finance Calculator
112
  * Booking Cost Calculator
113
- * Price Calculator
114
 
115
  ... and our powerful calculated fields allow you to build just about anything.
116
 
117
  You can also create a poll, or survey on your WordPress site and display the results. This is great for membership sites, LMS, or just for viral quizzes to grow your email list.
118
 
119
- Now you can go beyond a simple contact form plugin and create custom form-based solutions without any code.
120
 
121
  == Create a WordPress User Registration Form, Profile Form, and More ==
122
 
@@ -126,31 +134,32 @@ With our front-end editing, you can build a custom profile form for users to kee
126
 
127
  You will not find any other WordPress form plugin offering a front-end editing solution with the same level of extendability.
128
 
129
- == All the Advanced Fields and Features You Need to Grow Your Business ==
130
 
131
- Formidable goes far above and beyond with features like multi-page forms, save and continue, cascading form fields, powerful conditional logic. Then add partial submissions, invisible spam protection, front-end user post submission, calculated fields, user-tracking, quizzes, and so much more. Additionally, our Payment fields will help you create an order form, donation form, booking form, or other payment form.
132
 
133
- We're on a mission to offer an all-in-one solution-focused WordPress form plugin. This way you don't have to install 5 plugins alongside your form maker to do everything you want.
134
 
135
- == Extend and Customize - Developer's Dream Come True ==
136
 
137
- Formidable is the WordPress form plugin of choice for smart developers, freelancers, and agencies. It helps you build complex solutions and simple forms quickly to defy the limits imposed by time and knowledge.
138
 
139
- Our goal is to help you build complex websites with low overhead. That's why we made Formidable the most extendable WordPress form builder plugin on the market. We want to make it possible for anyone to defy gravity and build anything.
140
 
141
- A Formidable View allows you to display data anywhere, so you can quickly create data-driven web applications.
142
 
<