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
 
143
  On top of that, our hooks and filters allow you to extend Formidable to meet your most advanced needs. We even include hundreds of code examples in our docs to give you the confidence to get started.
144
 
145
  == Full Feature List ==
146
 
147
- Since Formidable is not your average WordPress form plugin, this feature list is going to be very long. Read through it, or just install the most powerful WordPress form maker. Your choice :)
148
 
149
- * <a href="https://formidableforms.com/features/drag-drop-form-builder/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Online drag and drop form builder</a>. Build everything from an email form to a price calculator or complex online form. Make awesome quiz forms and online forms the easy way with a simple WordPress drag and drop form maker. You don't have to be a code ninja to get fields in a row.
150
- * <a href="https://formidableforms.com/features/display-form-data-views/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Display data with Views</a>. Other WordPress form builder plugins only let you collect data. Formidable lets you format, filter, and display submissions in Formidable Views to create solutions. Think job boards, event calendars, business directories, ratings systems, management solutions, and pretty much anything else you can come up with.
151
- * <a href="https://formidableforms.com/features/dynamically-add-form-fields/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Repeating field groups (repeaters)</a>. This is great for a registration form, application, or email form.
152
  * <a href="https://formidableforms.com/features/wordpress-multiple-file-upload-form/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Drag and drop multiple file upload forms</a>. Easily upload documents, files, photos, and music, with any number of files. This is great for a job application form (resumes), WordPress User Profile Form (avatars), or get a quote form.
153
- * <a href="https://formidableforms.com/features/wordpress-multi-step-form/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Multi-step forms with progress bars</a>. Want to increase conversion rates and collect more leads? Create beautiful paged forms with rootline and progress indicators. Add conditional pages for a smart branching form.
 
154
  * <a href="https://formidableforms.com/features/cascading-dropdown-lookup-field/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Cascading lookup fields</a>. Autofill values in other fields or drill down through options to reveal a final value. Designed for year/make/model chained fields in auto forms and country/state/city fields. Lookup fields can even get a price from another product form.
155
  * Datepicker fields with advanced datepicker options including blackout dates, dynamic minimum and maximum dates, and inline calendars. Datepickers are great for email forms, basic online booking, and event registration.
156
  * Dynamic field relationships. Populate fields and link data between multiple fields. This helpful in to link employment applications to a job, quizzes to a class, an event registration to an event, or a sports registration to a team.
@@ -159,12 +168,12 @@ Since Formidable is not your average WordPress form plugin, this feature list is
159
  * Confirmation fields. Double check email addresses or passwords and prevent typos from causing lost leads.
160
  * <a href="https://formidableforms.com/features/conditional-logic-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Conditional logic for smart forms</a>. Show or hide fields based on user selections or user roles, simplify, and increase conversion rates.
161
  * <a href="https://formidableforms.com/features/email-autoresponders-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Send email notifications & autoresponders</a>. Let clients know you received their message. Then create customized email notifications for multiple recipients and get info from an email form to those who need it.
162
- * Email routing. Conditionally send multiple autoresponder emails and notifications based on values in email forms, user registration forms, and payment forms.
163
- * Pricing fields for easy eCommerce forms with automatic price calculations. Drop in a product field, quantity, and total and you're good to go.
164
  * <a href="https://formidableforms.com/wordpress-calculator-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Calculator forms</a>. Create complex calculations and combine text from multiple fields. This is great for a mortgage calculator, auto loan calculator, and more. Price calculations give site visitors easy quotes and price estimates. We recommend range sliders too, for calculator forms your clients will love.
165
- * <a href="https://formidableforms.com/features/wordpress-visual-form-styler/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Visual style creator</a>. Our form creator allows you to custom brand calculator forms, email forms, quiz forms, and other WP forms to match your site. Change colors, borders, font sizes, and more without any code.
166
  * Flexible layout design. Build mobile responsive forms and advanced layouts with multiple fields in a row with our CSS layout classes.
167
- * Mobile-friendly, responsive forms. All of our WP forms are sized for any screen size. Ensure that everyone can use your surveys, calculator forms, and Stripe forms on any device.
168
  * <a href="https://formidableforms.com/features/user-submitted-posts-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">User submitted front-end posts and pages</a>. Create and edit WordPress posts, pages, and custom post types from front-end online forms. Send user-generated content quickly from a post creation form to a page.
169
  * <a href="https://formidableforms.com/features/form-entry-management-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Simple entry management</a>. Flexibly display, edit, and delete entries. Let logged-in users can manage their personal journal entries, weight tracking, guest blog posts, RSVP status, and more.
170
  * WordPress front-end editing. Allow users to edit their entries and posts from the front-end of your site. Create an online journaling platform, member directory, classified ads, community recipes, and more.
@@ -172,102 +181,103 @@ Since Formidable is not your average WordPress form plugin, this feature list is
172
  * <a href="https://formidableforms.com/features/create-a-graph-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Graphs and charts for data visualization</a>. Display statistics from a survey, poll, and questionnaire. Or graph data in a variety of ways. Whatever you choose, it will update as new data is submitted (great for weight tracking over time).
173
  * Permissions. Lock visibility and access based on user role.
174
  * Entry limits. Limit surveys, registration forms, bookings, quizzes, or directory submissions to only allow one entry per user, IP, or cookie.
175
- * Form scheduling. Open and close event registration and signup forms on a specific date. Or close registration forms when the seat limit has been reached.
176
- * Conditionally redirect after a custom search form, payment form, feedback form, support ticket form, quiz, or other online form is submitted. Help clients find the answers they need and show a tailored result based on their selections or calculated fields.
177
- * We give you access to <a href="https://formidableforms.com/features/customize-form-html-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">customize the HTML</a> (like Contact Form 7). But you keep the ease and speed of a drag & drop form builder plugin. Our team labors for simplicity without sacrificing flexibility.
178
  * <a href="https://formidableforms.com/features/importing-exporting-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Import and export submissions, styles, and views</a>. Quickly move your work and entries to another site. Need to export leads to another service? Done.
179
- * Form templates for instant form building. Get started quickly with the most advanced form creator that includes form templates and style templates. Our WordPress form generator makes it FAST to build job application forms, calculator forms, and other types of online forms.
180
- * Import our <a href="https://formidableforms.com/form-templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">pre-built form templates</a> as a shortcut to a final product. Our growing form template library includes payment forms, a WooCommerce product creator, and more.
181
- * WCAG accessible forms with A11Y and ADA compliance. Ensure your survey, lead capture form, quizzes, and other online forms are compliant and available to everyone. Allow those using screenreaders to successfully use your WordPress site.
 
 
182
  * <a href="https://formidableforms.com/features/invisible-spam-protection/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Invisible SPAM protection</a>. Don't waste time sorting through SPAM. Get instant and powerful anti-spam features from honeypot, invisible Google reCAPTCHA, Akismet, and the WordPress comment blacklist.
183
  * <a href="https://formidableforms.com/features/fill-out-forms-automatically/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Fill fields automatically</a> with values from the user profile or posts (i.e. custom fields). When a user is logged in, fill known values like name and email address.
184
  * <a href="https://formidableforms.com/features/white-label-form-builder-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">White label</a>. Replace our branding with your own in the admin area. Plus, we never show "powered by" links in your free online form.
185
  * <a href="https://formidableforms.com/features/wordpress-user-registration/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">WordPress user registration forms</a>. Register WordPress users, edit profiles, reset passwords, and add a login form. You can even allow users to create new subdomains with WordPress multisite forms.
186
- * <a href="https://formidableforms.com/features/digital-form-signatures/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Digital signature forms</a>. Eliminate paper forms with a digital signature field in contracts, application forms and more.
187
  * <a href="https://formidableforms.com/features/form-action-automation-scheduling/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Form action automation</a>. Schedule email notifications, SMS messages, and webhooks to trigger later. You can automatically delete guest posts after 30 days, send weekly digests, or trigger happy birthday text messages from a lead form.
188
  * <a href="https://formidableforms.com/features/wordpress-form-api/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Forms API</a>. Send submissions to other REST APIs and add a set of webhooks. This includes the option to send submissions from one site to another.
189
  * <a href="https://formidableforms.com/features/quiz-maker-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Quiz maker forms</a>. Write your quiz form questions, submit an entry as the quiz key, and publish the quiz on a page. Then all the quiz grading is automatically done for you with our quiz plugin.
190
- * <a href="https://formidableforms.com/knowledgebase/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">World class support</a>. Have questions on how to use our form maker or set up your web application? We are happy to help. Our passion is to help you <strong>defy the limits</strong> to take on bigger projects, earn more clients, and grow your business.
191
 
192
  == Payment Forms, APIs, and Marketing Integrations ==
193
- In addition to all the features listed above, power up your email forms, surveys, and quizzes with these integrations.
194
 
195
- * <a href="https://formidableforms.com/features/paypal-wordpress-payments/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">PayPal Payment Forms</a>. Automate your business by collecting instant payments and recurring payments from clients. Collect information and calculate a total in a PayPal form or donation form.
196
- * <a href="https://formidableforms.com/features/stripe-payments-for-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Stripe Payment Forms</a>. Keep users on your site while collecting Stripe payments from a credit card form. Select from one time and recurring charges in order forms and donation forms. Stripe processes payments with simple PCI compliance.
197
- * <a href="https://formidableforms.com/features/authorize-net-payments/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Authorize.net AIM Payment Forms</a>. Process one-time payments in order forms and price calculators with Authorize.net AIM. For recurring payments or easier security compliance, we recommend Stripe.
198
  * <a href="https://formidableforms.com/features/customizable-woocommerce-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">WooCommerce product configurator</a>. Add custom fields to a WooCommerce product order form and collect extra data when a product is added to the cart. Use calculations in your WooCommerce form for variable pricing and upload files with orders.
199
- * <a href="https://formidableforms.com/features/mailchimp-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">MailChimp Forms</a>. Add and update leads in a MailChimp email marketing list from a lead form, online order, or email form.
200
- * Constant Contact. Create leads automatically in Constant Contact with a newsletter signup form.
201
- * <a href="https://formidableforms.com/features/form-entries-to-getresponse/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">GetResponse Forms</a>. Collect leads and add them to GetResponse, and trigger GetResponse marketing automations.
202
- * AWeber Forms. Subscribe users to an AWeber mailing list when a newsletter signup form is submitted.
203
  * <a href="https://formidableforms.com/features/mailpoet-newsletters-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">MailPoet Newsletters</a>. Fill your email marketing lists from newsletter signup forms. Then send WordPress newsletters from your own site using MailPoet.
204
- * Highrise. Add leads to your Highrise CRM account any time a WordPress form is submitted.
205
  * Salesforce Forms. Create leads and any other Salesforce objects automatically.
206
  * ActiveCampaign. Pull double duty with the ActiveCampaign integration. Save leads from a donation form, post creation form, user registration form, or email form.
207
  * <a href="https://formidableforms.com/features/form-entries-to-hubspot/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">HubSpot Forms</a>. Route lead data to HubSpot CRM.
208
- * Twilio for SMS Forms. Collect feedback, votes and poll responses via SMS text or send SMS notifications when entries are submitted. Get notified instantly when a payment form is completed, or let your leads know you received their message.
209
- * WPML Multilingual Forms. Translate your WordPress forms into multiple languages using our integrated multilingual forms.
 
 
210
  * Polylang. Get the form creator with Polylang bilingual or multilingual contact forms.
211
- * <a href="https://formidableforms.com/features/form-entry-routing-with-zapier/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Zapier</a>. Connect with thousands of applications through Zapier from a lead form, quote form, and other web forms. Insert a new row in a Google docs spreadsheet, post on Twitter, or upload a Dropbox file from a feedback form.
212
- * <a href="https://formidableforms.com/features/bootstrap-form-styling/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Bootstrap Form Styles</a>. Instantly add Bootstrap form styling to a survey form and registration form.
213
  * <a href="https://formidableforms.com/features/bootstrap-modal-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Bootstrap Modal Form</a>. Open login forms, Views, shortcodes, and other content in a Bootstrap modal popup.
214
 
215
  After reading this feature list, you can probably imagine why Formidable is the most advanced WordPress form plugin on the market.
216
 
217
- Give Formidable Forms a try.
218
 
219
- Want to unlock the full power? <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Upgrade to Pro</a> to get all the features for smart forms and full web applications.
220
 
221
  == Credits ==
222
- This online form builder plugin is created by Steve and Steph Wells and the amazing Strategy11 Team.
223
 
224
  Formidable is part of the <a href="https://www.wpbeginner.com/">WPBeginner</a> fund with <a href="https://syedbalkhi.com/">Syed Balkhi</a> as an Advisor to our company.
225
 
226
  == Installation ==
227
  1. Go to the Plugins -> 'Add New' page in your WP admin area
228
  2. Search for 'Formidable'
229
- 3. Click the 'Install Now' button
230
- 4. Activate Formidable through the 'Plugins' menu
231
- 5. Go to the newly added 'Formidable' menu
232
- 6. Click the 'Add New' button to go to the form generator page and create a new email form
233
- 7. Insert your newly created user registration form, quiz, or survey form on a page or post using the Embed Form pop up. Or insert it manually or into a widget using a shortcode [formidable id=x]. Alternatively use `<?php echo FrmFormsController::show_form(2); ?>` to add it in a page template.
234
 
235
  == Screenshots ==
236
- 1. Build professional WP forms without any code.
237
- 2. Form maker page for creating a survey, quote form, Stripe payment form, quiz form, and many more.
238
  3. Field Options and CSS Layout Classes
239
  4. Field Options for checkbox fields in the form maker
240
- 5. View, create, edit, and delete entries on the back end from a to do list, employment application, and more.
241
- 6. Add a contact form widget into a sidebar
242
 
243
  == Frequently Asked Questions ==
244
- = How do I get started with the best form builder for WordPress? =
245
- The fastest way to build a form is to use the template we built for you. After you activate Formidable, insert [formidable id=contact-form] on the WordPress page of your choice.
246
 
247
  Go to the Formidable page and click "add new". Choose the Contact Us form template or another free template and click "Create".
248
 
249
  Next, edit or create a WordPress contact page. Click the "Formidable" button to open the shortcode generator. Choose your new Stripe form, quiz, or web form and insert it into the WordPress page. Save the page for a beautiful WP contact form, ready to collect and store your leads. The contact form template will get you up and running fast.
250
 
251
  = Why isn't WordPress sending emails? =
252
- When you do not receive emails, try the following steps:
253
 
254
  1. Double check the email address in your Email action on the settings page. The [admin_email] shortcode uses the email address from your WordPress Settings -> General page.
255
- 2. Are receiving other emails from your site (ie comment notifications, forgot password...)? If not, notification emails will not work either.
256
  3. Check your SPAM box.
257
  4. Try a different email address in your settings.
258
- 5. Install WP Mail SMPT or another similar emailing plugin and configure the SMTP settings.
259
  6. If these steps don't fix the problem and other WP emails are not going out, please reach out to your web host.
260
 
261
  <a href="https://formidableforms.com/wordpress-not-sending-emails-smtp/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Read more about WordPress emails not sending</a> in our blog.
262
 
263
  = What types of WordPress forms can I build? =
264
- The Formidable drag & drop form builder combined with our add-ons is the most powerful form maker on the market. Here are some types of web forms you can create:
265
 
266
  * Custom Contact Form
267
  * Multi-Page Form with progress bar
268
  * Dynamic Form (where fields change based on user’s answers)
269
  * Request a Quote Form
270
- * Job Applications
271
  * Feedback Surveys
272
  * Make a Suggestion
273
  * Testimonials
@@ -279,12 +289,12 @@ The Formidable drag & drop form builder combined with our add-ons is the most po
279
  * WordPress Login Form
280
  * Custom WordPress User Profile
281
  * WordPress Post Submission (Great for guest posts)
282
- * Credit Card Payment
 
283
  * Make a Donation Form
284
  * T-Shirt Order Form
285
  * Product Purchase Form
286
  * Lead Capture
287
- * Newsletter Signup Form
288
  * Auto Form with Car Make and Model
289
  * Video Release
290
  * Partnership Agreements
@@ -292,24 +302,15 @@ The Formidable drag & drop form builder combined with our add-ons is the most po
292
  * Online Petitions
293
  * Signature Form
294
  * Maintenance Request
295
- * Scholarship Applications
296
  * File Download Form
297
  * Employment Verification
298
  * Make a Referral
299
- * Volunteer Registration
300
- * Membership Registration
301
- * Event Registration
302
- * Vendor Registration
303
- * School Class Registration
304
- * Course Registration
305
- * Customer Registration
306
- * Conference Registration
307
- * Sports Registration
308
- * Camp Registration
309
  * Custom Survey
310
  * Polls
311
  * Quizzes
312
- * Members Only Contact Form
313
  * Mortgage Calculator
314
  * Car Payment Calculator
315
  * BMI Calculator
@@ -325,12 +326,12 @@ The Formidable drag & drop form builder combined with our add-ons is the most po
325
  * Cosmos Style Quiz
326
  * Create Your Own Adventure Quiz
327
 
328
- To see more, visit our <a href="https://formidableforms.com/form-templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin">Form Template Gallery</a> which has over 150 pre-made templates.
329
 
330
  = How can I get access to all advanced features? =
331
  To get access to more features, integrations, and support, <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">upgrade to Formidable Pro</a>. A Pro license gives you access to the full version of Formidable for more advanced options, Formidable Views, graphs and stats, priority support, and Formidable Add-ons!
332
 
333
- = Can I create a Payment Form with Formidable? =
334
 
335
  Yes! You can create payment and donation forms. We make it easy to accept payments using Stripe, PayPal, and Authorize.net.
336
 
@@ -364,7 +365,7 @@ Here is a list of our advanced premium fields that will come in handy:
364
  * Range Slider
365
  * Toggle
366
  * Dynamic - Great for creating relationships between entries.
367
- * Repeater - Great for registering multiple kids, job history in an application, and much more.
368
  * Tags
369
  * Summary - Great to review responses before submit.
370
  * Lookup - Great for cascading lookups like country, city, state.
@@ -372,21 +373,20 @@ Here is a list of our advanced premium fields that will come in handy:
372
  * Page Break
373
  * Embed Form - Great for reusing the same set of fields in multiple places.
374
  * Password Field - Great for user registration forms.
375
- * Address Field
376
  * Signature - Great for contracts and booking.
377
- * Quiz Score
378
 
379
- Additionally, our Payment fields will help you create an order form, donation form, booking form, or other payment form.
380
 
381
  * Single Item
382
  * Multiple Items
383
  * Checkbox Items
384
  * Dropdown Items
385
  * Product Quantity
386
- * Total (Price Calculation Field)
387
- * Credit Card (Stripe Form or Authorize.net Form)
388
 
389
- = Can I import and export? =
390
 
391
  Yes, it's easy to import and export. This is incredibly useful for developers and agencies who are building websites for clients. You can also create custom form templates to use on client websites.
392
 
@@ -394,7 +394,7 @@ You can also import from other WordPress contact form plugins such as <a href="h
394
 
395
  = Can I integrate with my CRM or email marketing service? =
396
 
397
- Yes! We know that marketing is the key to grow your business. That's why Formidable allows you to connect your WP form, or payment form, with the marketing platform of your choice. You can easily send data from WordPress to your favorite CRM, email newsletter, and other marketing platforms.
398
 
399
  Here is a list of our popular marketing integrations:
400
 
@@ -408,7 +408,7 @@ Here is a list of our popular marketing integrations:
408
  * HubSpot CRM
409
  * Campaign Monitor
410
 
411
- Using our Zapier integration, you can easily connect Formidable with over 1000+ marketing apps including:
412
 
413
  * Google Sheets
414
  * SendInBlue
@@ -438,26 +438,317 @@ Using our Zapier integration, you can easily connect Formidable with over 1000+
438
  See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
439
 
440
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
441
  = 5.4.3 =
442
  * New: A pop up will trigger when a duplicate option value is added to the list of options to help avoid issues with accidental duplicate option values getting added to a field.
443
- * Fix: Prevent a null JavaScript error on some forms related to floating labels.
444
  * Updated pop up styling for a more consistent design.
445
 
446
  = 5.4.2 =
447
  * New: Autocomplete dropdowns in the back end will now include an aria-label on the options to avoid accessibility issues with screen readers only reading ID values.
448
- * New: A redirect will now happen after a form is duplicated to avoid issues with multiple duplicate actions on page refresh.
449
  * New: Added additional styling for repeaters in tables shown in email actions to show indentation for the repeated data.
450
- * New: Added a Save and Reload button that appears after installing a required add on when clicking a field with missing requirements from the form builder.
451
  * Fix: The aria-describedby attribute will now be ordered intentionally so errors get first priority by default. Checks have been added to avoid duplicate ids appearing in aria-describedby attributes as well.
452
  * Fix: A few issues with label position settings were introduced with last update that are now fixed. Labels were appearing when the "none" label position setting was set.
453
- * Fix: Automation settings were appearing for action types that don't support automation when the Form Action Automation add on wasn't active.
454
  * Fix: Fixed a caching conflict that would cause back end pages to break on some servers with an frmDom is not defined console error.
455
  * Fix: Labels were appearing overlapped over input fields when previewed from the style manager for styles with the inline label position setting.
456
  * Updated the icon for Zapier.
457
 
458
  = 5.4.1 =
459
  * New: Fields using the "Placeholder inside the field" Label Position setting will now use an animated label that moves to the top of the field when focused.
460
- * New: Added a new frm_after_destroy_entry filter that can be used to update caching after a Formidable entry is deleted.
461
- * Fix: An unexpected empty broken application template was appearing for expired licenses.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
 
463
  <a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>
1
+ === Formidable Forms - Contact Form, Survey, Quiz, Calculator & Custom Form Builder ===
2
+ Plugin Name: Formidable Forms - Contact Form, Survey & Quiz Form Builder 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, calculator, quote form, contact button, form manager, Akismet, payment form, survey form, donation form, email subscription, 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.4
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 forms plugin to create a contact form, survey, quiz, registration form, payment form, lead form, or calculator form. Build just about anything you can imagine.
16
 
17
+ At Formidable, creating the most extendable online forms 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 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
+ Speaking of quick, we’ve optimized 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 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 apps.
25
+ > With Formidable, you get far more than just a contact form plugin.
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 forms 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 or poll, subscription form, request a quote form, payment form, user registration form, or anything else. With Formidable, there’s no limit to what you can achieve! The possibilities are endless.
33
 
34
+ Formidable adapts to YOUR needs.
35
 
36
+ Want to run quizzes on your site? Formidable is your quiz maker with all the features you need to create and run both educational quizzes and the beloved (and addictive) BuzzFeed style quizzes.
37
+
38
+ Our team has worked hard to create the Swiss Army Knife for WordPress. Plus, we’ve made integrations that fit into your tech stack.
39
+
40
+ Check out some of our main features below:
41
+
42
+ == Drag & Drop Form Maker ==
43
+
44
+ Formidable drag & drop forms allow you to quickly build unlimited surveys, quizzes, price calculators, and whatever else you need.
45
 
46
  Our form maker comes with all the powerful fields that you need to create a solution-focused form, fast!
47
 
51
 
52
  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.
53
 
54
+ Need to import your leads to an external service like MailChimp? No problem. **Export leads to a CSV**, open it in Excel, or import it anywhere.
55
 
56
  You can also configure unlimited email notifications and autoresponders triggered by submissions.
57
 
58
+ On top of that, you can easily customize the success message after a form is submitted, or redirect visitors to another page.
59
 
60
  == The Only Form Maker Plugin with an Advanced Styler ==
61
 
62
+ With our built-in styler, you can instantly customize the look and feel of your website form. With just a few clicks, your email form can be transformed to match your website design.
63
 
64
  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.
65
 
67
 
68
  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.
69
 
70
+ 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 calculator.
71
 
72
  You can even showcase data on the front-end of your website. Just embed graphs in your WordPress posts or pages.
73
 
75
 
76
  == Quickly Create an Advanced WordPress Registration Form for Any Use Case ==
77
 
78
+ Whether you need to create a youth sports team, event, or church retreat registration, Formidable has you covered. Unlike other contact form plugins, Formidable comes with a repeater field that allows you to create the best registration forms.
79
 
80
  Then, our marketing integrations and APIs can send the data anywhere you want.
81
 
82
  == Accept Credit Cards and Easily Collect Payments ==
83
 
84
+ 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 and accept credit card payments right from your website.
85
 
86
+ We offer seamless integration with PayPal, Stripe, and Authorize.net, so you can create an order form, donation or purchase form.
87
 
88
+ You can even create a WooCommerce form with custom fields.
89
 
90
  == Make Data-Driven Web Applications with a Formidable View ==
91
 
92
+ Formidable Views are by far the most powerful feature that makes Formidable far more than just a contact form plugin. Views allow you to flexibly display any submitted data on the front-end of your website.
93
 
94
+ Our customers use Formidable Views to create data-driven web apps. We see real estate listings, employment listings, event calendars, business or member directories, job boards, and other searchable databases.
95
 
96
  As you can see, Formidable is not your average contact form plugin. It's a true all-in-one WordPress form solution.
97
 
101
 
102
  Our goal is to empower you to build powerful WooCommerce product order forms, so you can increase your store sales.
103
 
104
+ You can create a WooCommerce form to use as a WooCommerce product configurator with custom calculation fields. Then automatically send the order form info to the WooCommerce cart with variable pricing options.
105
 
106
  == Make Powerful Quiz Forms & Calculators ==
107
 
118
  * Online Quote Calculator
119
  * Finance Calculator
120
  * Booking Cost Calculator
121
+ * Product Price Calculator
122
 
123
  ... and our powerful calculated fields allow you to build just about anything.
124
 
125
  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.
126
 
127
+ Now you can create custom form-based solutions without any code.
128
 
129
  == Create a WordPress User Registration Form, Profile Form, and More ==
130
 
134
 
135
  You will not find any other WordPress form plugin offering a front-end editing solution with the same level of extendability.
136
 
137
+ == All the Advanced Fields & Features You Need to Grow Your Business ==
138
 
139
+ Formidable goes far above and beyond with features like multi-page forms, save and continue, cascading form fields, and 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 a donation form, booking form, credit card form, or other payment form.
140
 
141
+ We're on a mission to offer all-in-one solution-focused forms. This way you don't have to install 5 plugins alongside your form maker to do everything you want.
142
 
143
+ == Extend & Customize - A Developer's Dream Come True ==
144
 
145
+ Formidable is the solution 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.
146
 
147
+ Our goal is to help you build complex websites with low overhead. That's why we made Formidable the most extendable WordPress form plugin on the market. We want to make it possible for anyone to defy gravity and build anything.
148
 
149
+ A Formidable View allows you to display data anywhere, so you can quickly create data-driven web apps.
150
 
151
  On top of that, our hooks and filters allow you to extend Formidable to meet your most advanced needs. We even include hundreds of code examples in our docs to give you the confidence to get started.
152
 
153
  == Full Feature List ==
154
 
155
+ Since Formidable is not your average form plugin, this feature list is going to be very long. Read through it, or just install our powerful form maker and try it for yourself! Your choice :)
156
 
157
+ * <a href="https://formidableforms.com/features/drag-drop-form-builder/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Online drag and drop form and quiz maker</a>. Build everything from an email form to a complex online form. Make an awesome quiz form and online form the easy way with simple WordPress drag and drop form maker. You don't have to be a code ninja to get fields in a row.
158
+ * <a href="https://formidableforms.com/features/display-form-data-views/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Display data with Views</a>. Other WordPress form plugins only let you collect data. Formidable lets you format, filter, and display submissions in Formidable Views to create solutions. Think job boards, event calendars, business directories, ratings systems, management solutions, and pretty much anything else you can come up with.
159
+ * <a href="https://formidableforms.com/features/dynamically-add-form-fields/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Repeating field groups (repeaters)</a>. This is great for a registration form or email form.
160
  * <a href="https://formidableforms.com/features/wordpress-multiple-file-upload-form/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Drag and drop multiple file upload forms</a>. Easily upload documents, files, photos, and music, with any number of files. This is great for a job application form (resumes), WordPress User Profile Form (avatars), or get a quote form.
161
+ * <a href="https://formidableforms.com/features/wordpress-multi-step-form/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Multi-step forms with progress bars</a>. Want to increase conversion rates and collect more leads? Create a beautiful paged form with a rootline and progress indicator. Add conditional pages for a smart branching form.
162
+ * <a href="https://formidableforms.com/features/form-to-pdf-wordpress-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Create a PDF</a> from entries and send them along in an email.
163
  * <a href="https://formidableforms.com/features/cascading-dropdown-lookup-field/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Cascading lookup fields</a>. Autofill values in other fields or drill down through options to reveal a final value. Designed for year/make/model chained fields in auto forms and country/state/city fields. Lookup fields can even get a price from another product form.
164
  * Datepicker fields with advanced datepicker options including blackout dates, dynamic minimum and maximum dates, and inline calendars. Datepickers are great for email forms, basic online booking, and event registration.
165
  * Dynamic field relationships. Populate fields and link data between multiple fields. This helpful in to link employment applications to a job, quizzes to a class, an event registration to an event, or a sports registration to a team.
168
  * Confirmation fields. Double check email addresses or passwords and prevent typos from causing lost leads.
169
  * <a href="https://formidableforms.com/features/conditional-logic-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Conditional logic for smart forms</a>. Show or hide fields based on user selections or user roles, simplify, and increase conversion rates.
170
  * <a href="https://formidableforms.com/features/email-autoresponders-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Send email notifications & autoresponders</a>. Let clients know you received their message. Then create customized email notifications for multiple recipients and get info from an email form to those who need it.
171
+ * Email routing. Conditionally send multiple autoresponder emails and notifications based on values in an email form, user registration form, and payment form.
172
+ * Pricing fields for easy eCommerce forms with automatic product price calculations. Drop in a product field, quantity, and total and you're good to go.
173
  * <a href="https://formidableforms.com/wordpress-calculator-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Calculator forms</a>. Create complex calculations and combine text from multiple fields. This is great for a mortgage calculator, auto loan calculator, and more. Price calculations give site visitors easy quotes and price estimates. We recommend range sliders too, for calculator forms your clients will love.
174
+ * <a href="https://formidableforms.com/features/wordpress-visual-form-styler/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Visual style creator</a>. Our form creator allows you to custom brand calculator forms, email forms, lead forms, quiz forms, and other WP forms to match your site. Change colors, borders, font sizes, and more without any code.
175
  * Flexible layout design. Build mobile responsive forms and advanced layouts with multiple fields in a row with our CSS layout classes.
176
+ * Mobile-friendly, responsive forms. All of our WP forms are sized for any screen size. Ensure that everyone can use your intake form, consent form, and Stripe form on any device.
177
  * <a href="https://formidableforms.com/features/user-submitted-posts-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">User submitted front-end posts and pages</a>. Create and edit WordPress posts, pages, and custom post types from front-end online forms. Send user-generated content quickly from a post creation form to a page.
178
  * <a href="https://formidableforms.com/features/form-entry-management-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Simple entry management</a>. Flexibly display, edit, and delete entries. Let logged-in users can manage their personal journal entries, weight tracking, guest blog posts, RSVP status, and more.
179
  * WordPress front-end editing. Allow users to edit their entries and posts from the front-end of your site. Create an online journaling platform, member directory, classified ads, community recipes, and more.
181
  * <a href="https://formidableforms.com/features/create-a-graph-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Graphs and charts for data visualization</a>. Display statistics from a survey, poll, and questionnaire. Or graph data in a variety of ways. Whatever you choose, it will update as new data is submitted (great for weight tracking over time).
182
  * Permissions. Lock visibility and access based on user role.
183
  * Entry limits. Limit surveys, registration forms, bookings, quizzes, or directory submissions to only allow one entry per user, IP, or cookie.
184
+ * Form scheduling. Open and close event registration and signup forms on a specific date. Or close forms when the seat limit has been reached.
185
+ * Conditionally redirect after a custom search form, feedback form, support ticket form, quiz, or intake form is submitted. Help clients find the answers they need and show a tailored result based on their selections or calculated fields.
186
+ * We give you access to <a href="https://formidableforms.com/features/customize-form-html-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">customize the HTML</a> (like Contact Form 7). But you keep the ease and speed of drag & drop forms. Our team labors for simplicity without sacrificing flexibility.
187
  * <a href="https://formidableforms.com/features/importing-exporting-wordpress-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Import and export submissions, styles, and views</a>. Quickly move your work and entries to another site. Need to export leads to another service? Done.
188
+ * Form templates for instant form building. Get started quickly with the most advanced form creator that includes form templates and style templates. Our WordPress form generator makes it FAST to build job application forms and other types of online forms.
189
+ * Import our <a href="https://formidableforms.com/form-templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">pre-built form templates</a> as a shortcut to a final product. Our growing form template library includes payment forms (for Stripe and PayPal forms), a WooCommerce product creator, and more.
190
+ * <a href="https://formidableforms.com/conversational-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Conversational forms</a>. Show one question at a time, and automatically advance when questions are answered.
191
+ * <a href="https://formidableforms.com/landing-page-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Landing pages</a>. Get rid of all the distractions and show visitors only what they need.
192
+ * WCAG accessible forms with A11Y and ADA compliance. Ensure your survey, lead capture form, consent form, and quizzes are compliant and available to everyone. Allow those using screenreaders to successfully use your WordPress site.
193
  * <a href="https://formidableforms.com/features/invisible-spam-protection/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Invisible SPAM protection</a>. Don't waste time sorting through SPAM. Get instant and powerful anti-spam features from honeypot, invisible Google reCAPTCHA, Akismet, and the WordPress comment blacklist.
194
  * <a href="https://formidableforms.com/features/fill-out-forms-automatically/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Fill fields automatically</a> with values from the user profile or posts (i.e. custom fields). When a user is logged in, fill known values like name and email address.
195
  * <a href="https://formidableforms.com/features/white-label-form-builder-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">White label</a>. Replace our branding with your own in the admin area. Plus, we never show "powered by" links in your free online form.
196
  * <a href="https://formidableforms.com/features/wordpress-user-registration/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">WordPress user registration forms</a>. Register WordPress users, edit profiles, reset passwords, and add a login form. You can even allow users to create new subdomains with WordPress multisite forms.
197
+ * <a href="https://formidableforms.com/features/digital-form-signatures/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Digital signature forms</a>. Eliminate paper forms with a digital signature field for a contract, application form and more.
198
  * <a href="https://formidableforms.com/features/form-action-automation-scheduling/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Form action automation</a>. Schedule email notifications, SMS messages, and webhooks to trigger later. You can automatically delete guest posts after 30 days, send weekly digests, or trigger happy birthday text messages from a lead form.
199
  * <a href="https://formidableforms.com/features/wordpress-form-api/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Forms API</a>. Send submissions to other REST APIs and add a set of webhooks. This includes the option to send submissions from one site to another.
200
  * <a href="https://formidableforms.com/features/quiz-maker-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Quiz maker forms</a>. Write your quiz form questions, submit an entry as the quiz key, and publish the quiz on a page. Then all the quiz grading is automatically done for you with our quiz plugin.
201
+ * <a href="https://formidableforms.com/knowledgebase/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">World class support</a>. Have questions on how to use our form maker? We are happy to help. Our passion is to help you <strong>defy the limits</strong> to take on bigger projects, earn more clients, and grow your business.
202
 
203
  == Payment Forms, APIs, and Marketing Integrations ==
204
+ In addition to all the features listed above, add power ups with these integrations.
205
 
206
+ * <a href="https://formidableforms.com/features/paypal-wordpress-payments/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">PayPal Forms</a>. Automate your business by collecting instant payments and recurring payments from clients. Collect information and calculate a total in a PayPal form or donation form.
207
+ * <a href="https://formidableforms.com/features/stripe-payments-for-wordpress/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Stripe Forms</a>. Keep users on your site while collecting Stripe payments from a credit card form. Select from one time and recurring charges in donation and order forms. Stripe processes payments with simple PCI compliance.
208
+ * <a href="https://formidableforms.com/features/authorize-net-payments/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Authorize.net AIM</a>. Process one-time payments in order forms and price calculators with Authorize.net AIM. For recurring payments or easier security compliance, we recommend Stripe.
209
  * <a href="https://formidableforms.com/features/customizable-woocommerce-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">WooCommerce product configurator</a>. Add custom fields to a WooCommerce product order form and collect extra data when a product is added to the cart. Use calculations in your WooCommerce form for variable pricing and upload files with orders.
210
+ * <a href="https://formidableforms.com/features/mailchimp-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">MailChimp Contact Forms</a>. Add and update leads in a MailChimp email marketing list from a lead form, online order, or email form.
211
+ * Constant Contact. Create leads automatically with a newsletter signup form.
212
+ * AWeber Forms. Subscribe users to an AWeber mailing list when a signup form is submitted.
 
213
  * <a href="https://formidableforms.com/features/mailpoet-newsletters-addon/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">MailPoet Newsletters</a>. Fill your email marketing lists from newsletter signup forms. Then send WordPress newsletters from your own site using MailPoet.
 
214
  * Salesforce Forms. Create leads and any other Salesforce objects automatically.
215
  * ActiveCampaign. Pull double duty with the ActiveCampaign integration. Save leads from a donation form, post creation form, user registration form, or email form.
216
  * <a href="https://formidableforms.com/features/form-entries-to-hubspot/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">HubSpot Forms</a>. Route lead data to HubSpot CRM.
217
+ * <a href="https://formidableforms.com/features/form-entries-to-getresponse/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">GetResponse Forms</a>. Collect leads and add them to GetResponse and trigger marketing automations.
218
+ * Highrise. Add leads to your Highrise CRM account.
219
+ * Twilio for SMS Forms. Collect feedback, votes and poll responses via SMS text or send SMS notifications when entries are submitted. Get notified instantly when a payment or order form is completed, or let your leads know you received their message.
220
+ * WPML Multilingual Forms. Translate your WP forms into multiple languages using our integrated multilingual forms.
221
  * Polylang. Get the form creator with Polylang bilingual or multilingual contact forms.
222
+ * <a href="https://formidableforms.com/features/form-entry-routing-with-zapier/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Zapier</a>. Connect with thousands of services through Zapier from a lead form, quote form, and other web forms. Insert a new row in a Google docs spreadsheet, post on Twitter, or upload a Dropbox file from a feedback form.
223
+ * <a href="https://formidableforms.com/features/bootstrap-form-styling/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Bootstrap Form Styles</a>. Instantly add Bootstrap form styling to a survey form and payment form.
224
  * <a href="https://formidableforms.com/features/bootstrap-modal-forms/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Bootstrap Modal Form</a>. Open login forms, Views, shortcodes, and other content in a Bootstrap modal popup.
225
 
226
  After reading this feature list, you can probably imagine why Formidable is the most advanced WordPress form plugin on the market.
227
 
228
+ Give Formidable a try.
229
 
230
+ Want to unlock the full power? <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Upgrade to Pro</a> to get all the features for smart forms and full web apps.
231
 
232
  == Credits ==
233
+ This online form and quiz builder plugin is created by Steve and Steph Wells and the amazing Strategy11 Team.
234
 
235
  Formidable is part of the <a href="https://www.wpbeginner.com/">WPBeginner</a> fund with <a href="https://syedbalkhi.com/">Syed Balkhi</a> as an Advisor to our company.
236
 
237
  == Installation ==
238
  1. Go to the Plugins -> 'Add New' page in your WP admin area
239
  2. Search for 'Formidable'
240
+ 3. Click the 'Install Now' button, then 'Activate'
241
+ 4. Go to the newly added 'Formidable' menu
242
+ 5. Click the 'Add New' button to go to the form generator page and create a new email form
243
+ 6. Insert your newly created user registration form, lead form, quiz form, or survey form on a page or post using the Embed Form pop up. Or insert it manually or into a widget using a shortcode [formidable id=x]. Alternatively use `<?php echo FrmFormsController::show_form(2); ?>` to add it in a theme file.
 
244
 
245
  == Screenshots ==
246
+ 1. Build a professional WP form without any code.
247
+ 2. Page for creating a quote form, Stripe payment form, quiz form, and many more.
248
  3. Field Options and CSS Layout Classes
249
  4. Field Options for checkbox fields in the form maker
250
+ 5. View, create, edit, and delete entries on the back end from a to do list, employment application form, and more.
251
+ 6. Add a form widget into a sidebar
252
 
253
  == Frequently Asked Questions ==
254
+ = How do I get started with the best forms for WordPress? =
255
+ The fastest way to build a form is to use the contact form example we built for you. After you activate Formidable, insert [formidable id=contact-form] on the WordPress page of your choice.
256
 
257
  Go to the Formidable page and click "add new". Choose the Contact Us form template or another free template and click "Create".
258
 
259
  Next, edit or create a WordPress contact page. Click the "Formidable" button to open the shortcode generator. Choose your new Stripe form, quiz, or web form and insert it into the WordPress page. Save the page for a beautiful WP contact form, ready to collect and store your leads. The contact form template will get you up and running fast.
260
 
261
  = Why isn't WordPress sending emails? =
262
+ When you do not receive emails from your email form, try the following steps:
263
 
264
  1. Double check the email address in your Email action on the settings page. The [admin_email] shortcode uses the email address from your WordPress Settings -> General page.
265
+ 2. Are you receiving other emails from your site (ie comment notifications, forgot password...)? If not, notification emails will not work either.
266
  3. Check your SPAM box.
267
  4. Try a different email address in your settings.
268
+ 5. Install WP Mail SMPT or another similar emailing alternative and configure the SMTP settings.
269
  6. If these steps don't fix the problem and other WP emails are not going out, please reach out to your web host.
270
 
271
  <a href="https://formidableforms.com/wordpress-not-sending-emails-smtp/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Read more about WordPress emails not sending</a> in our blog.
272
 
273
  = What types of WordPress forms can I build? =
274
+ Combined with our add-ons, Formidable is the most powerful form maker on the market. Here are some types of web forms you can create:
275
 
276
  * Custom Contact Form
277
  * Multi-Page Form with progress bar
278
  * Dynamic Form (where fields change based on user’s answers)
279
  * Request a Quote Form
280
+ * Job Application Form
281
  * Feedback Surveys
282
  * Make a Suggestion
283
  * Testimonials
289
  * WordPress Login Form
290
  * Custom WordPress User Profile
291
  * WordPress Post Submission (Great for guest posts)
292
+ * WooCommerce Form for Products
293
+ * Credit Card Form
294
  * Make a Donation Form
295
  * T-Shirt Order Form
296
  * Product Purchase Form
297
  * Lead Capture
 
298
  * Auto Form with Car Make and Model
299
  * Video Release
300
  * Partnership Agreements
302
  * Online Petitions
303
  * Signature Form
304
  * Maintenance Request
305
+ * Scholarship Application Form
306
  * File Download Form
307
  * Employment Verification
308
  * Make a Referral
309
+ * Membership, Customer, Vendor, Conference, and Volunteer Registration
310
+ * Camp, Course, School Class, and other Event Registration
 
 
 
 
 
 
 
 
311
  * Custom Survey
312
  * Polls
313
  * Quizzes
 
314
  * Mortgage Calculator
315
  * Car Payment Calculator
316
  * BMI Calculator
326
  * Cosmos Style Quiz
327
  * Create Your Own Adventure Quiz
328
 
329
+ To see more, visit our <a href="https://formidableforms.com/form-templates/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">Form Template Gallery</a> which has over 175 pre-made templates.
330
 
331
  = How can I get access to all advanced features? =
332
  To get access to more features, integrations, and support, <a href="https://formidableforms.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">upgrade to Formidable Pro</a>. A Pro license gives you access to the full version of Formidable for more advanced options, Formidable Views, graphs and stats, priority support, and Formidable Add-ons!
333
 
334
+ = Can I create a payment form? =
335
 
336
  Yes! You can create payment and donation forms. We make it easy to accept payments using Stripe, PayPal, and Authorize.net.
337
 
365
  * Range Slider
366
  * Toggle
367
  * Dynamic - Great for creating relationships between entries.
368
+ * Repeater - Great for registering multiple kids, job history, and much more.
369
  * Tags
370
  * Summary - Great to review responses before submit.
371
  * Lookup - Great for cascading lookups like country, city, state.
373
  * Page Break
374
  * Embed Form - Great for reusing the same set of fields in multiple places.
375
  * Password Field - Great for user registration forms.
376
+ * Address Field - Power it up with Google address autofill and geolocation.
377
  * Signature - Great for contracts and booking.
 
378
 
379
+ Additionally, our Payment fields will help you create an order form, donation form, or booking form.
380
 
381
  * Single Item
382
  * Multiple Items
383
  * Checkbox Items
384
  * Dropdown Items
385
  * Product Quantity
386
+ * Total
387
+ * Credit Card (Stripe or Authorize.net)
388
 
389
+ = Can I import and export submissions? =
390
 
391
  Yes, it's easy to import and export. This is incredibly useful for developers and agencies who are building websites for clients. You can also create custom form templates to use on client websites.
392
 
394
 
395
  = Can I integrate with my CRM or email marketing service? =
396
 
397
+ Yes! We know that marketing is the key to growing your business. That's why Formidable allows you to connect your WP form (email form, payment form, etc.) with the marketing platform of your choice. You can easily send data from WordPress to your favorite CRM, email newsletter, and other marketing platforms.
398
 
399
  Here is a list of our popular marketing integrations:
400
 
408
  * HubSpot CRM
409
  * Campaign Monitor
410
 
411
+ Using our Zapier integration, you can easily connect your website with over 1000+ marketing apps including:
412
 
413
  * Google Sheets
414
  * SendInBlue
438
  See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
439
 
440
  == Changelog ==
441
+ = 5.4.4 =
442
+ * 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.
443
+ * New: Added a new frm_before_duplicate_entry_values filter for customizing the data of a duplicated entry before it is saved.
444
+ * New: Maximum character length is now validated server side on submit.
445
+ * Fix: The duplicate option pop up was triggering incorrectly when dragging new options in Chrome.
446
+ * Fix: Prevent a "Trying to get property 'post_status' of non-object" PHP Notice that happens in some cases when updating actions.
447
+ * Fix: Imported view detail page URLs were returning 404 errors. New imported views will now update permalinks to avoid this issue.
448
+ * Fix: The disallowed list check was not being applied when no data was submitted.
449
+ * Fix: Placeholder add on pages were showing messages to upgrade for supported licenses.
450
+ * Fix: Apps were not properly loading in WordPress 5.6.
451
+
452
  = 5.4.3 =
453
  * New: A pop up will trigger when a duplicate option value is added to the list of options to help avoid issues with accidental duplicate option values getting added to a field.
454
+ * Fix: Prevent a null JavaScript error in some cases related to floating labels.
455
  * Updated pop up styling for a more consistent design.
456
 
457
  = 5.4.2 =
458
  * New: Autocomplete dropdowns in the back end will now include an aria-label on the options to avoid accessibility issues with screen readers only reading ID values.
459
+ * New: A redirect will now happen after duplication to avoid issues with multiple duplicate actions on page refresh.
460
  * New: Added additional styling for repeaters in tables shown in email actions to show indentation for the repeated data.
461
+ * New: Added a Save and Reload button that appears after installing a required add on when clicking a field with missing requirements.
462
  * Fix: The aria-describedby attribute will now be ordered intentionally so errors get first priority by default. Checks have been added to avoid duplicate ids appearing in aria-describedby attributes as well.
463
  * Fix: A few issues with label position settings were introduced with last update that are now fixed. Labels were appearing when the "none" label position setting was set.
464
+ * Fix: Automation settings were appearing for action types that don't support automation when the Action Automation add on wasn't active.
465
  * Fix: Fixed a caching conflict that would cause back end pages to break on some servers with an frmDom is not defined console error.
466
  * Fix: Labels were appearing overlapped over input fields when previewed from the style manager for styles with the inline label position setting.
467
  * Updated the icon for Zapier.
468
 
469
  = 5.4.1 =
470
  * New: Fields using the "Placeholder inside the field" Label Position setting will now use an animated label that moves to the top of the field when focused.
471
+ * New: Added a new frm_after_destroy_entry filter that can be used to update caching after an entry is deleted.
472
+ * Fix: An unexpected empty broken app shortcut was appearing for expired licenses.
473
+
474
+ = 5.4 =
475
+ * New: Added a new frm_new_form_values filter for customizing default values.
476
+ * New: Added a new frm_ajax_loaded_field event for listening for loaded fields loaded via AJAX on a long form in the back-end.
477
+ * Fix: Aria-describedby attribute values in HTML were not properly merging with the aria-describedby values added by field descriptions and errors.
478
+ * Fix: Imported field data would occasionally break if the new field ids had a different number of digits than the previously imported values.
479
+ * Fix: Placeholder text was appearing more transparent in Firefox than in other browsers and has been updated for consistency.
480
+ * Fix: Prevent a conflict that was causing the new Form modal to appear on some websites as a blank box without any content.
481
+
482
+ = 5.3.2 =
483
+ * New: RGB and RGBA color values will now be fixed automatically on save if incomplete to avoid broken CSS.
484
+
485
+ = 5.3.1 =
486
+ * New: Unlocked apps now appear at the top of the list.
487
+ * New: Improved the responsiveness of the cards on the App dashboard page.
488
+ * Fix: Prevent a conflict with All in One SEO that was preventing CSS from loading at all when the only on applicable pages setting is selected.
489
+ * Fix: An unexpected add new button was appearing on a few pages and has been removed.
490
+ * Fix: Prevent a fatal error in PHP8 that happens on sites with an unexpected empty string gmt_offset option set.
491
+
492
+ = 5.3 =
493
+ * New: Added a new page for displaying apps.
494
+ * New: Imported views and pages with [formidable] and [display-frm-data] shortcodes will now replace old ids with the new imported ids.
495
+ * New: Importing will now replace the old field ids with new field ids when the id is used in a field_id shortcode option.
496
+ * Fix: Field id values were not always properly updating when after duplication depending on the order of the fields.
497
+
498
+ = 5.2.07 =
499
+ * Fix: Step value validation was occasionally breaking in some cases due to rounding precision issues.
500
+
501
+ = 5.2.06 =
502
+ * New: The step value for number fields is now validated server side on submission.
503
+
504
+ = 5.2.05 =
505
+ * New: Added a new frm_focus_first_error filter to toggle of the behavior of the auto-focus that gets triggered on the first field with an error.
506
+ * New: Added a new frm_include_alert_role_on_field_errors filter to toggle the alert role that gets added to field errors.
507
+
508
+ = 5.2.04 =
509
+ * New: Defined field option data will no longer be sent to Akismet, to help improve accuracy with Akismet API.
510
+ * Fix: Updated Elementor widget so it no longer uses the deprecated _register_controls method.
511
+
512
+ = 5.2.03 =
513
+ * New: Updated how unique keys are generated for shorter unique keys.
514
+ * New: Added a new frm_unique_field_key_separator filter for unique field keys.
515
+ * New: Added a new frm_saved_errors filter for extending validation.
516
+ * Fix: Fixed a conflict with All in One SEO that was causing multiselect dropdowns to appear larger than expected.
517
+
518
+ = 5.2.02.01 =
519
+ * Fix: Fixed a conflict with Duplicator Pro that was causing dropdowns to break after updating to Bootstrap 4.
520
+ * Fix: Importing multiple forms was importing the wrong name.
521
+ * Fix: Clicking to install a template was copying the NEW html into the name input.
522
+
523
+ = 5.2.02 =
524
+ * Updated Bootstrap to version 4.6.1.
525
+ * New: Name fields will be automatically used to define entry names if available.
526
+ * New: Added setting to update privileged access message.
527
+ * Fix: Section icon dropdown toggles were not displaying updated changes.
528
+ * Fix: Prevent a PHP 8.1 deprecation message where null was being passed to substr.
529
+ * Fix: Name fields with no descriptions were still displaying bottom margins.
530
+
531
+ = 5.2.01 =
532
+ * New: Added new checkboxes to toggle title and description visibility. The preview page will no longer always show title and description by default, and will use these checkboxes instead.
533
+ * Fix: In-Theme Previews trigger a fatal error in WordPress 5.9.1.
534
+ * Fix: Checkbox fields were appearing as broken vertical lines when using the Enfold theme.
535
+ * Fix: A deprecation message was occasionally logged in PHP8 when trying to decode null values.
536
+
537
+ = 5.2 =
538
+ * Increased WP version requirement to 5.2.
539
+ * New: Added a new Embed Form modal and a new Embed button that appears in the settings pages beside Preview and Update. Now it can be embedded into a new page or an existing page with just a few clicks.
540
+ * Fix: A Notice was being logged that wp_enqueue_script() was called incorrectly when loading the new Widgets editor since WordPress 5.8.
541
+ * Fix: An unexpected array value in submitted data would cause some text fields to break in PHP8.
542
+ * Fix: Some AJAX calls for an API loaded form was occasionally targeting the wrong site, causing unwanted redirects.
543
+ * Fix: Dropdown field options were including redundant class="" HTML that has been removed.
544
+
545
+ = 5.1 =
546
+ * Updated Bootstrap Multiselect to version 1.1.1, fixing issues with the accessibility of backend multiselect dropdowns for blind users.
547
+ * New: Inputs with errors will now add the aria-describedby attribute during JavaScript validation for more accessible errors.
548
+ * New: Error messages will now always include the role="alert" attribute for more accessible errors. New fields will now also include role="alert" in field HTML.
549
+ * New: Added a new frm_entries_column_value filter hook.
550
+
551
+ = 5.0.17 =
552
+ * The embedded CodeMirror code for compatibility with versions of WordPress before 4.9 has been removed.
553
+ * New: The ctype PHP extension is no longer a requirement.
554
+ * Fix: The CSS page would appear without any textarea on some configurations where CodeMirror may be disabled.
555
+ * Fix: Removed padding styles from radio buttons because of a conflict with the Sensational theme.
556
+
557
+ = 5.0.16 =
558
+ * New: Field shortcodes now support sanitize_url=1 and sanitize=1 options which were previously only processed in Pro.
559
+ * New: The sanitize_url=1 option will now be inserted automatically when inserting most field shortcodes to a redirect url. This is to avoid issues with redirects stripping characters like ' and @ which may cause a redirect to fail in some cases.
560
+ * New: Updated styling for radio buttons and checkboxes, with improvements to appearance on mobile devices as well.
561
+ * New: Extended the FrmCSVExportHelper::generate_csv function so it has the option to generate a CSV file in a temporary directory, and pass along an array of meta information to most CSV filter hooks.
562
+ * New: A new action_id variable has been added to the arguments passed to the frm_notification_attachment filter to make it easier to filter attachments by email action ID.
563
+ * New: Added new frm_entry_formatter_class, frm_prepend_and_or_where, frm_entry_formatter_format, frm_formatted_entry_values_content, and frm_entries_show_args filter hooks.
564
+ * New: Allow more colors in the styler to be transparent including background colors and border colors for active, hovered, and disabled inputs.
565
+ * Fix: Selected radio buttons were appearing incorrectly when using the Twenty Twenty One theme in Chrome or Safari.
566
+ * Fix: Radio buttons and checkboxes were appearing overlapped with labels when using the H-Code theme.
567
+ * Fix: Field pop ups were displaying upgrade messages even for licenses that had access to the add on.
568
+
569
+ = 5.0.10 =
570
+ * Security: Improved how data is sanitized when previewing in the style manager.
571
+ * Fix: Prevent a warning when trying to get inbox messages from the API when no messages are being returned.
572
+ * Fix: The frm_alignright class was being stripped, preventing the right alignment from appearing in the back end.
573
+ * Fix: The frm_alignright class was causing fields to shift to the wrong row. The style definition has been updated so it will stay in the same row as other fields.
574
+ * Fix: Required messages were not properly appearing for empty radio buttons when an other option was selected but left empty and JavaScript validation was on.
575
+
576
+ = 5.0.09 =
577
+ * The option to check entries for spam using JavaScript is now on by default. We recommend turning this on for older forms that may be receiving spam entries, especially those that include file uploads. After turning this feature on, make sure to also clear any caching to avoid issues with cached pages with missing tokens.
578
+ * New: Pre-determined option data will no longer be sent to Akismet to help reduce the number of false positive results.
579
+ * Fix: Significantly reduced the amount of memory required to load settings for websites with fewer than 50 pages with a lot of data.
580
+ * Fix: Author email, url, or name are no longer included in comment info when sending data to Akismet so that duplicate information is not sent.
581
+ * Fix: Field groups could not be moved because of a missing class on the drag handle.
582
+
583
+ = 5.0.08 =
584
+ * Deprecated: Calls to FrmFormsController::preview will no longer try to load WordPress if it is not already initialized. This could cause issues for users that still use old preview links (see https://formidableforms.com/knowledgebase/php-examples/#kb-use-the-old-preview-links for an example).
585
+ * Security: Unsafe HTML will now be stripped from global message defaults, whitelabel settings, and when importing with XML if the user saving HTML does not have the unfiltered_html permission or if the DISALLOW_UNFILTERED_HTML constant is set.
586
+ * Updated Bootstrap used in back end to version 3.4.1.
587
+ * A few images that were being loaded from S3 and CDN urls are now included instead.
588
+
589
+ = 5.0.07 =
590
+ * Security: Unsafe HTML will now be stripped from field labels, descriptions, and custom HTML, as well as titles, descriptions, custom submit text, custom submit HTML, before HTML, after HTML, and success message if the user saving HTML does not have the unfiltered_html permission or if the DISALLOW_UNFILTERED_HTML constant is set.
591
+ * New: Added new frm_akismet_values filter to help improve Akismet integration.
592
+ * Fix: The Akismet API was getting called if Akismet was set up even if Akismet was turned off.
593
+ * Fix: Updated the styling when a field option is being dragged and dropped.
594
+
595
+ = 5.0.06 =
596
+ * New: Added new frm_export_csv_headings filter to make it easier to add and remove exported CSV headings.
597
+ * New: When clicking an inactive action that requires pro, the required pro license will be properly shown in the popup.
598
+ * New: Added new frm_fields_to_validate, frm_submit_button_html, and frm_fields_for_csv_export filters.
599
+ * Fix: Improved the accessibility of field group dropdowns and field group row layout pop ups.
600
+ * Fix: The caret icon on the dropdown was not positioned properly for the Gutenberg block.
601
+ * Fix: When clicking the media button in Elementor, the pop up was appearing as empty with no content.
602
+ * Fix: Required radio, checkbox, and name fields were not including the aria-required="true" attribute or the aria-invalid attribute when JavaScript validation was enabled.
603
+ * Fix: Required name fields were not showing error messages when JavaScript validation was enabled.
604
+
605
+ = 5.0.05 =
606
+ * Deprecated the option to disable CSS Grids.
607
+ * Fix: JavaScript validation was failing to validate for many fields with custom patterns because extra conflicting HTML was sometimes being added to the check.
608
+ * Fix: Field dropdowns are now more accessible and it should be easier to delete and duplicate fields with a screen reader.
609
+ * Fix: Updated padding on admin page so styles with custom padding don't appear small in the back end.
610
+
611
+ = 5.0.04 =
612
+ * New: Custom HTML for errors is now also applied when validating with JavaScript.
613
+ * New: Added a button to quickly save and reload after activating a new add-on from the settings page.
614
+ * New: Added several new filters required to support the new surveys add on.
615
+
616
+ = 5.0.03 =
617
+ * New: Added an Elementor widget.
618
+ * New: When duplicating fields, most unsaved changes will now duplicate as well.
619
+ * New: Next button label and slider field label previews will now update as soon as the setting is changed.
620
+ * New: Slider field previews will now update when the min and max values are updated.
621
+ * Fix: The search dropdown was getting cut off on pages with no search results.
622
+ * Fix: When legacy views or visual views are active, both versions were appearing active on the add ons page.
623
+
624
+ = 5.0.02 =
625
+ * New: Field groups can now be duplicated and deleted.
626
+
627
+ = 5.0.01 =
628
+ * New: Updated styling and icons in the back end.
629
+ * New: Added search when adding fields to make finding a specific field easier.
630
+ * Fix: Added truncation to long keys during duplication to avoid issues with duplicating when the generated key was too long.
631
+
632
+ = 5.0 =
633
+ * Increased WP version requirement to 5.0.
634
+ * New: Fields can now be dragged beside each other and grid layouts will be automatically applied.
635
+ * New: Added the option to quickly set layouts for a full row of fields at once.
636
+ * New: Fields can now be multiselected using the command, control, and shift keys. Selected field groups can be merged into rows and deleted in batches.
637
+ * New: Permissions are now updated right away when a license is activated to avoid issues with certain pro features not being available right away.
638
+ * Fix: Updated styling for new fields that are about to be dropped.
639
+
640
+ = 4.11.05 =
641
+ * New: Improved support for importing grid and table view content.
642
+ * Fix: The update and preview buttons would wrap to two lines for some longer translations including German and Dutch.
643
+
644
+ = 4.11.04 =
645
+ * New: The first field with an error will now automatically get focus when an entry is submitted for better accessibility and improved user experience.
646
+ * Fix: The reply to value of an email would default to the admin email instead of the from email when a shortcode with an empty result was used.
647
+ * Fix: When switching between the dropdown and text lookup types, the watch lookup option did not properly toggle back on.
648
+ * Fix: The autocomplete page dropdown was not consistent with other styles.
649
+
650
+ = 4.11.03 =
651
+ * New: Name fields now work in the To and From settings for email actions.
652
+ * Fix: Images were not properly loading when styles were loading via an AJAX request.
653
+ * Fix: Zeros were not appearing in the entries list for repeaters.
654
+
655
+ = 4.11.02 =
656
+ * New: The padding for descriptions can now be customized when editing styles.
657
+
658
+ = 4.11.01 =
659
+ * New: Added a new frm_duplicate_check_val filter for customizing the duplicate entry check. This can be used to remove IP to help prevent duplicate entries for longer periods of time when using frm_time_to_check_duplicates filter.
660
+ * New: Added visibility option to the Name field.
661
+ * Fix: The honeypot setting would still appear as on after it was turned off.
662
+
663
+ = 4.11 =
664
+ * New: Added a quick and easy Name field with options for First, Middle, and Last names.
665
+ * New: Added a more powerful spam protection using JavaScript. This can be turned on in the settings.
666
+ * New: Added Honeypot options to settings and changed the default Honeypot behavior to avoid the false positives some people are seeing on mobile devices.
667
+ * New: Added a frm_process_honeypot filter for gracefully handling honeypot spam.
668
+ * Fix: A warning was getting logged when exporting as XML.
669
+
670
+ = 4.10.03 =
671
+ * New: Improved the performance of the style editor preview.
672
+ * New: You can now sign up for free templates directly from your inbox.
673
+ * Fix: Date fields were not properly detecting duplicate entries.
674
+ * Fix: Conditionals were not properly fading in when the block was added to a page.
675
+ * Fix: Actions would occasionally conflict if multiple were added too quickly.
676
+
677
+ = 4.09.08 =
678
+ * New: If you add or remove an action and try to leave the page without saving, there will be a warning.
679
+ * Fix: The style editor save button was hidden in WordPress 5.7.
680
+ * Fix: There were a couple of words misspelled on the welcome page.
681
+
682
+ = 4.09.07 =
683
+ * Fix: Duplicated fields would occasionally generate long field keys that were preventing fields from being created.
684
+ * Fix: Fields for controlling radio options in the back-end were not using unique id attribute values.
685
+
686
+ = 4.09.06 =
687
+ * New: Added a new welcome screen to introduce new users.
688
+ * Fix: Make sure that Site Health exists when upgrading.
689
+ * Fix: Invalid message data was occasionally appearing in the Inbox.
690
+ * Fix: Excluded checkbox options were not properly toggling for Action Taxonomies.
691
+ * Fix: Some pop ups were occasionally including outdated text.
692
+
693
+ = 4.09.05 =
694
+ * Fix: Autofill was flagging submissions as spam with Honeypot in some browsers.
695
+ * Fix: Important security update that adds better escaping when text is used from attribute data.
696
+
697
+ = 4.09.04 =
698
+ * Fix: The back-end page wasn't always loading all fields correctly when loaded with ajax.
699
+ * New: frm_global_switch_fields and frm_maybe_switch_field_ids hooks for changing field ids in an action when a form is duplicated.
700
+
701
+ = 4.09.03 =
702
+ * New: Added frm_run_honeypot hook to turn off honeypot. Return false to disable or 'limit' to hide from screenreader.
703
+ * Moved honeypot back to the top to catch more spam.
704
+ * Fix: Dropdown fields were cut off in the admin area in WordPress 5.6.
705
+ * Fix: Update a few deprecated jQuery functions.
706
+ * Fix: Prevent some duplicate database queries on the back end.
707
+
708
+ = 4.09.02 =
709
+ * Show a warning when leaving the settings page with unsaved changes.
710
+ * Make the process for using free templates more clear.
711
+
712
+ = 4.08 =
713
+ * New: Added confirmation before deleting in bulk.
714
+ * Allow a value to pass validation if the entered value matches the placeholder setting.
715
+ * Fix: Email addresses were not being sent to Akismet for logged out users, and resulting in some false positive spam.
716
+ * Fix: Some sites have been getting duplicate entries days apart. This issue should be fixed.
717
+ * Fix: Searching when switching between forms no longer triggers the confirmation message when leaving the page.
718
+
719
+ = 4.07.01 =
720
+ * New: Show a warning when leaving a back-end page with unsaved changes.
721
+ * Fix: Make any multiselect dropdowns in admin settings accessible.
722
+ * Fix: aria-invalid attribute was missing on elements for accessibility.
723
+
724
+ = 4.07 =
725
+ * New: Use frm_inline_success for the class in the customized HTML to move the success message next to the submit button. "frm_inline_success frm_alignright_success" will right-align the message.
726
+ * Tweak: Improve the admin listing pages when nothing has been created.
727
+ * Fix: Update the recaptcha for better reliability to catch more spam.
728
+
729
+ = 4.06.03 =
730
+ * More consistent dropdown styling with multiselect dropdowns.
731
+ * Prepare the code for handling permissions options as an array of roles.
732
+ * Fix: WP 5.5 - Email subject lines were coming through encoded.
733
+ * Fix: WP 5.5 - When WP Mail SMTP was installed, the Formidable SMTP page has an error.
734
+
735
+ = 4.05.02 =
736
+ * New: Added frm_message_placement hook to show the message below the form
737
+ * New: New classes that can be used in the class setting: frm_plain_success (Removes styling from the success message) and frm_below_success (Moves the success message below).
738
+ * Add Formidable back to the admin bar. This is now a setting if the default WordPress v5.2+ behavior is desired.
739
+ * Fix: Review requests were added to the inbox too frequently for sites with multiple admins.
740
+ * Fix: Elementor conflict by using the glost $post in the admin area.
741
+ * Fix: The color picker position in the styling settings was off for some options.
742
+
743
+ = 4.05.01 =
744
+ * Fix: The entry list wasn't always showing the entries.
745
+ * Better sync between review requests in inbox and message.
746
+
747
+ = 4.05 =
748
+ * Updates to the default styling.
749
+ * New: Added an inbox as a centralized place for notices and communication.
750
+ * New: Added frm_color_block and frm_total_big classes for more beautiful forms.
751
+ * Help prevent common email issues by showing a warning in the email settings when the from and to email addresses are the same.
752
+ * Fix: Forms edited after export and reimported were losing the required indicator in some cases.
753
 
754
  <a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>