Formidable Forms – Form Builder for WordPress - Version 5.4.5

Version Description

  • New: Added support for several new language options for datepicker localization and for reCAPTCHA.
  • New: Updated deprecated code in Elementor widget for better compatibility with new versions of Elementor.
  • Fix: Actions that trigger when an entry is deleted were not properly working when conditional logic would check item meta values.
  • Fix: An imported application page's parent page ID was not updating to match the new imported parent page ID.
  • Fix: Clicking save while a field was still being inserted would cause an error pop up to appear with a missing message.
  • Removed a restriction that was preventing a second summary field from being added after adding the first.
Download this release

Release Info

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

Code changes from version 5.4.4 to 5.4.5

classes/controllers/FrmElementorController.php CHANGED
@@ -10,7 +10,7 @@ class FrmElementorController {
10
 
11
  public static function register_elementor_hooks() {
12
  require_once FrmAppHelper::plugin_path() . '/classes/widgets/FrmElementorWidget.php';
13
- \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new \FrmElementorWidget() );
14
 
15
  if ( is_admin() ) {
16
  add_action(
10
 
11
  public static function register_elementor_hooks() {
12
  require_once FrmAppHelper::plugin_path() . '/classes/widgets/FrmElementorWidget.php';
13
+ \Elementor\Plugin::instance()->widgets_manager->register( new \FrmElementorWidget() );
14
 
15
  if ( is_admin() ) {
16
  add_action(
classes/controllers/FrmHooksController.php CHANGED
@@ -94,7 +94,7 @@ class FrmHooksController {
94
  add_filter( 'frm_keep_name_value_array', '__return_true' );
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
 
94
  add_filter( 'frm_keep_name_value_array', '__return_true' );
95
 
96
  // Elementor.
97
+ add_action( 'elementor/widgets/register', 'FrmElementorController::register_elementor_hooks' );
98
  add_filter( 'frm_fields_in_form_builder', 'FrmFormsController::update_form_builder_fields', 10, 2 );
99
  }
100
 
classes/helpers/FrmAppHelper.php CHANGED
@@ -16,7 +16,7 @@ class FrmAppHelper {
16
  /**
17
  * @since 2.0
18
  */
19
- public static $plug_version = '5.4.4';
20
 
21
  /**
22
  * @since 1.07.02
@@ -2980,15 +2980,23 @@ class FrmAppHelper {
2980
  }
2981
  }
2982
 
 
 
 
 
2983
  public static function locales( $type = 'date' ) {
2984
  $locales = array(
2985
  'en' => __( 'English', 'formidable' ),
2986
  'af' => __( 'Afrikaans', 'formidable' ),
2987
  'sq' => __( 'Albanian', 'formidable' ),
 
 
2988
  'ar' => __( 'Arabic', 'formidable' ),
2989
  'hy' => __( 'Armenian', 'formidable' ),
2990
  'az' => __( 'Azerbaijani', 'formidable' ),
2991
  'eu' => __( 'Basque', 'formidable' ),
 
 
2992
  'bs' => __( 'Bosnian', 'formidable' ),
2993
  'bg' => __( 'Bulgarian', 'formidable' ),
2994
  'ca' => __( 'Catalan', 'formidable' ),
@@ -3009,10 +3017,13 @@ class FrmAppHelper {
3009
  'fr' => __( 'French', 'formidable' ),
3010
  'fr-CA' => __( 'French/Canadian', 'formidable' ),
3011
  'fr-CH' => __( 'French/Swiss', 'formidable' ),
 
 
3012
  'de' => __( 'German', 'formidable' ),
3013
  'de-AT' => __( 'German/Austria', 'formidable' ),
3014
  'de-CH' => __( 'German/Switzerland', 'formidable' ),
3015
  'el' => __( 'Greek', 'formidable' ),
 
3016
  'he' => __( 'Hebrew', 'formidable' ),
3017
  'iw' => __( 'Hebrew', 'formidable' ),
3018
  'hi' => __( 'Hindi', 'formidable' ),
@@ -3021,41 +3032,71 @@ class FrmAppHelper {
3021
  'id' => __( 'Indonesian', 'formidable' ),
3022
  'it' => __( 'Italian', 'formidable' ),
3023
  'ja' => __( 'Japanese', 'formidable' ),
 
 
 
3024
  'ko' => __( 'Korean', 'formidable' ),
 
 
3025
  'lv' => __( 'Latvian', 'formidable' ),
3026
  'lt' => __( 'Lithuanian', 'formidable' ),
 
 
 
3027
  'ms' => __( 'Malaysian', 'formidable' ),
 
3028
  'no' => __( 'Norwegian', 'formidable' ),
 
 
3029
  'pl' => __( 'Polish', 'formidable' ),
3030
  'pt' => __( 'Portuguese', 'formidable' ),
3031
  'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3032
  'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
 
3033
  'ro' => __( 'Romanian', 'formidable' ),
3034
  'ru' => __( 'Russian', 'formidable' ),
3035
  'sr' => __( 'Serbian', 'formidable' ),
3036
  'sr-SR' => __( 'Serbian', 'formidable' ),
 
3037
  'sk' => __( 'Slovak', 'formidable' ),
3038
  'sl' => __( 'Slovenian', 'formidable' ),
3039
  'es' => __( 'Spanish', 'formidable' ),
3040
  'es-419' => __( 'Spanish/Latin America', 'formidable' ),
 
3041
  'sv' => __( 'Swedish', 'formidable' ),
3042
  'ta' => __( 'Tamil', 'formidable' ),
 
3043
  'th' => __( 'Thai', 'formidable' ),
 
3044
  'tr' => __( 'Turkish', 'formidable' ),
3045
  'uk' => __( 'Ukrainian', 'formidable' ),
 
3046
  'vi' => __( 'Vietnamese', 'formidable' ),
 
 
3047
  );
3048
 
3049
  if ( $type === 'captcha' ) {
3050
  // remove the languages unavailable for the captcha
3051
- $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
3052
  } else {
3053
  // remove the languages unavailable for the datepicker
3054
- $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
3055
  }
3056
 
3057
  $locales = array_diff_key( $locales, array_flip( $unset ) );
3058
- $locales = apply_filters( 'frm_locales', $locales );
 
 
 
 
 
 
 
 
 
 
 
3059
 
3060
  return $locales;
3061
  }
16
  /**
17
  * @since 2.0
18
  */
19
+ public static $plug_version = '5.4.5';
20
 
21
  /**
22
  * @since 1.07.02
2980
  }
2981
  }
2982
 
2983
+ /**
2984
+ * @param string $type
2985
+ * @return array<string,string>
2986
+ */
2987
  public static function locales( $type = 'date' ) {
2988
  $locales = array(
2989
  'en' => __( 'English', 'formidable' ),
2990
  'af' => __( 'Afrikaans', 'formidable' ),
2991
  'sq' => __( 'Albanian', 'formidable' ),
2992
+ 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
2993
+ 'am' => __( 'Amharic', 'formidable' ),
2994
  'ar' => __( 'Arabic', 'formidable' ),
2995
  'hy' => __( 'Armenian', 'formidable' ),
2996
  'az' => __( 'Azerbaijani', 'formidable' ),
2997
  'eu' => __( 'Basque', 'formidable' ),
2998
+ 'be' => __( 'Belarusian', 'formidable' ),
2999
+ 'bn' => __( 'Bengali', 'formidable' ),
3000
  'bs' => __( 'Bosnian', 'formidable' ),
3001
  'bg' => __( 'Bulgarian', 'formidable' ),
3002
  'ca' => __( 'Catalan', 'formidable' ),
3017
  'fr' => __( 'French', 'formidable' ),
3018
  'fr-CA' => __( 'French/Canadian', 'formidable' ),
3019
  'fr-CH' => __( 'French/Swiss', 'formidable' ),
3020
+ 'gl' => __( 'Galician', 'formidable' ),
3021
+ 'ka' => __( 'Georgian', 'formidable' ),
3022
  'de' => __( 'German', 'formidable' ),
3023
  'de-AT' => __( 'German/Austria', 'formidable' ),
3024
  'de-CH' => __( 'German/Switzerland', 'formidable' ),
3025
  'el' => __( 'Greek', 'formidable' ),
3026
+ 'gu' => __( 'Gujarati', 'formidable' ),
3027
  'he' => __( 'Hebrew', 'formidable' ),
3028
  'iw' => __( 'Hebrew', 'formidable' ),
3029
  'hi' => __( 'Hindi', 'formidable' ),
3032
  'id' => __( 'Indonesian', 'formidable' ),
3033
  'it' => __( 'Italian', 'formidable' ),
3034
  'ja' => __( 'Japanese', 'formidable' ),
3035
+ 'kn' => __( 'Kannada', 'formidable' ),
3036
+ 'kk' => __( 'Kazakh', 'formidable' ),
3037
+ 'km' => __( 'Khmer', 'formidable' ),
3038
  'ko' => __( 'Korean', 'formidable' ),
3039
+ 'ky' => __( 'Kyrgyz', 'formidable' ),
3040
+ 'lo' => __( 'Laothian', 'formidable' ),
3041
  'lv' => __( 'Latvian', 'formidable' ),
3042
  'lt' => __( 'Lithuanian', 'formidable' ),
3043
+ 'lb' => __( 'Luxembourgish', 'formidable' ),
3044
+ 'mk' => __( 'Macedonian', 'formidable' ),
3045
+ 'ml' => __( 'Malayalam', 'formidable' ),
3046
  'ms' => __( 'Malaysian', 'formidable' ),
3047
+ 'mr' => __( 'Marathi', 'formidable' ),
3048
  'no' => __( 'Norwegian', 'formidable' ),
3049
+ 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
3050
+ 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
3051
  'pl' => __( 'Polish', 'formidable' ),
3052
  'pt' => __( 'Portuguese', 'formidable' ),
3053
  'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3054
  'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
3055
+ 'rm' => __( 'Romansh', 'formidable' ),
3056
  'ro' => __( 'Romanian', 'formidable' ),
3057
  'ru' => __( 'Russian', 'formidable' ),
3058
  'sr' => __( 'Serbian', 'formidable' ),
3059
  'sr-SR' => __( 'Serbian', 'formidable' ),
3060
+ 'si' => __( 'Sinhalese', 'formidable' ),
3061
  'sk' => __( 'Slovak', 'formidable' ),
3062
  'sl' => __( 'Slovenian', 'formidable' ),
3063
  'es' => __( 'Spanish', 'formidable' ),
3064
  'es-419' => __( 'Spanish/Latin America', 'formidable' ),
3065
+ 'sw' => __( 'Swahili', 'formidable' ),
3066
  'sv' => __( 'Swedish', 'formidable' ),
3067
  'ta' => __( 'Tamil', 'formidable' ),
3068
+ 'te' => __( 'Telugu', 'formidable' ),
3069
  'th' => __( 'Thai', 'formidable' ),
3070
+ 'tj' => __( 'Tajiki', 'formidable' ),
3071
  'tr' => __( 'Turkish', 'formidable' ),
3072
  'uk' => __( 'Ukrainian', 'formidable' ),
3073
+ 'ur' => __( 'Urdu', 'formidable' ),
3074
  'vi' => __( 'Vietnamese', 'formidable' ),
3075
+ 'cy-GB' => __( 'Welsh', 'formidable' ),
3076
+ 'zu' => __( 'Zulu', 'formidable' ),
3077
  );
3078
 
3079
  if ( $type === 'captcha' ) {
3080
  // remove the languages unavailable for the captcha
3081
+ $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
3082
  } else {
3083
  // remove the languages unavailable for the datepicker
3084
+ $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
3085
  }
3086
 
3087
  $locales = array_diff_key( $locales, array_flip( $unset ) );
3088
+
3089
+ /**
3090
+ * Filter available locale options.
3091
+ *
3092
+ * @since x.x Added $args parameter with type.
3093
+ *
3094
+ * @param array<string,string> $locales
3095
+ * @param array $args {
3096
+ * @type string $type
3097
+ * }
3098
+ */
3099
+ $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3100
 
3101
  return $locales;
3102
  }
classes/helpers/FrmXMLHelper.php CHANGED
@@ -799,6 +799,8 @@ class FrmXMLHelper {
799
  } else {
800
  if ( $post['post_type'] === 'frm_display' ) {
801
  $post['post_content'] = self::maybe_prepare_json_view_content( $post['post_content'] );
 
 
802
  }
803
  // Create/update post now
804
  $post_id = wp_insert_post( $post );
799
  } else {
800
  if ( $post['post_type'] === 'frm_display' ) {
801
  $post['post_content'] = self::maybe_prepare_json_view_content( $post['post_content'] );
802
+ } elseif ( 'page' === $post['post_type'] && isset( $imported['posts'][ $post['post_parent'] ] ) ) {
803
+ $post['post_parent'] = $imported['posts'][ $post['post_parent'] ];
804
  }
805
  // Create/update post now
806
  $post_id = wp_insert_post( $post );
classes/models/FrmEntry.php CHANGED
@@ -261,7 +261,7 @@ class FrmEntry {
261
  global $wpdb;
262
  $id = (int) $id;
263
 
264
- $entry = self::getOne( $id );
265
  if ( ! $entry ) {
266
  $result = false;
267
  return $result;
261
  global $wpdb;
262
  $id = (int) $id;
263
 
264
+ $entry = self::getOne( $id, true ); // Item meta is required for conditional logic in actions with 'delete' events.
265
  if ( ! $entry ) {
266
  $result = false;
267
  return $result;
classes/models/FrmPluginSearch.php CHANGED
@@ -83,6 +83,10 @@ class FrmPluginSearch {
83
  'version' => $addon_list[ $matching_addon ]['version'],
84
  );
85
 
 
 
 
 
86
  // Splice in the base addon data.
87
  $inject = array_merge( $inject, $addon_list[ $matching_addon ], $overrides );
88
 
@@ -108,20 +112,15 @@ class FrmPluginSearch {
108
  continue;
109
  }
110
 
111
- /*
112
- * Does the site's current plan support the feature?
113
- */
114
- $is_supported_by_plan = ! empty( $addon_opts['url'] );
115
-
116
  if ( ! isset( $addon_opts['search_terms'] ) ) {
117
  $addon_opts['search_terms'] = '';
118
  }
119
 
120
- $addon_terms = $this->search_to_array( $addon_opts['search_terms'] . ', ' . $addon_opts['name'] );
121
 
122
  $matches = ! empty( array_intersect( $addon_terms, $normalized_term ) );
123
 
124
- if ( $matches && $is_supported_by_plan ) {
125
  $matching_addon = $addon_id;
126
  break;
127
  }
@@ -137,7 +136,8 @@ class FrmPluginSearch {
137
  */
138
  private function get_addons() {
139
  $api = new FrmFormApi();
140
- return $api->get_api_info();
 
141
  }
142
 
143
  /**
@@ -271,7 +271,7 @@ class FrmPluginSearch {
271
  */
272
  private function search_to_array( $terms ) {
273
  $terms = $this->sanitize_search_term( $terms );
274
- return array_filter( explode( ',', $terms ) );
275
  }
276
 
277
  /**
@@ -291,7 +291,6 @@ class FrmPluginSearch {
291
  $links = array();
292
  $is_installed = $this->is_installed( $plugin['plugin'] );
293
  $is_active = is_plugin_active( $plugin['plugin'] );
294
- $has_access = ! empty( $plugin['url'] );
295
 
296
  // Plugin installed, active, feature not enabled; prompt to enable.
297
  if ( ! $is_active && $is_installed ) {
83
  'version' => $addon_list[ $matching_addon ]['version'],
84
  );
85
 
86
+ if ( ! empty( $addon_list[ $matching_addon ]['external'] ) ) {
87
+ unset( $overrides['name'] );
88
+ }
89
+
90
  // Splice in the base addon data.
91
  $inject = array_merge( $inject, $addon_list[ $matching_addon ], $overrides );
92
 
112
  continue;
113
  }
114
 
 
 
 
 
 
115
  if ( ! isset( $addon_opts['search_terms'] ) ) {
116
  $addon_opts['search_terms'] = '';
117
  }
118
 
119
+ $addon_terms = $this->search_to_array( $addon_opts['search_terms'] . ' ' . $addon_opts['name'] );
120
 
121
  $matches = ! empty( array_intersect( $addon_terms, $normalized_term ) );
122
 
123
+ if ( $matches ) {
124
  $matching_addon = $addon_id;
125
  break;
126
  }
136
  */
137
  private function get_addons() {
138
  $api = new FrmFormApi();
139
+ $addons = $api->get_api_info();
140
+ return apply_filters( 'frm_plugin_search', $addons );
141
  }
142
 
143
  /**
271
  */
272
  private function search_to_array( $terms ) {
273
  $terms = $this->sanitize_search_term( $terms );
274
+ return array_filter( explode( ' ', $terms ) );
275
  }
276
 
277
  /**
291
  $links = array();
292
  $is_installed = $this->is_installed( $plugin['plugin'] );
293
  $is_active = is_plugin_active( $plugin['plugin'] );
 
294
 
295
  // Plugin installed, active, feature not enabled; prompt to enable.
296
  if ( ! $is_active && $is_installed ) {
css/frm_admin.css CHANGED
@@ -5817,7 +5817,8 @@ ul.start_divider {
5817
  cursor: not-allowed;
5818
  }
5819
 
5820
- .edit_field_type_summary .frm_clone_field {
 
5821
  display: none !important;
5822
  }
5823
 
5817
  cursor: not-allowed;
5818
  }
5819
 
5820
+ /* Hide the Duplicate summary option because we are missing the logic that also adds a new page */
5821
+ .edit_field_type_summary .frm_more_options_li:nth-child(2) {
5822
  display: none !important;
5823
  }
5824
 
formidable.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
- Version: 5.4.4
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11 Form Builder Team
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
+ Version: 5.4.5
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11 Form Builder Team
js/admin/dom.js CHANGED
@@ -388,6 +388,96 @@
388
  }
389
  };
390
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  function getModalHelper( modal, appendTo ) {
392
  return function( child, uniqueClassName ) {
393
  let element = modal.querySelector( '.' + uniqueClassName );
@@ -538,5 +628,5 @@
538
  element.appendChild( child );
539
  }
540
 
541
- window.frmDom = { tag, div, span, a, img, svg, setAttributes, modal, ajax, bootstrap, autocomplete, search, util };
542
  }() );
388
  }
389
  };
390
 
391
+ const wysiwyg = {
392
+ init( editor, { setupCallback } = {}) {
393
+ if ( isTinyMceActive() ) {
394
+ setTimeout( resetTinyMce, 0 );
395
+ } else {
396
+ initQuickTagsButtons();
397
+ }
398
+
399
+ setUpTinyMceVisualButtonListener();
400
+ setUpTinyMceHtmlButtonListener();
401
+
402
+ function initQuickTagsButtons() {
403
+ if ( 'function' !== typeof window.quicktags || typeof window.QTags.instances[ editor.id ] !== 'undefined' ) {
404
+ return;
405
+ }
406
+
407
+ const id = editor.id;
408
+ window.quicktags({
409
+ name: 'qt_' + id,
410
+ id: id,
411
+ canvas: editor,
412
+ settings: { id },
413
+ toolbar: document.getElementById( 'qt_' + id + '_toolbar' ),
414
+ theButtons: {}
415
+ });
416
+ }
417
+
418
+ function initRichText() {
419
+ const key = Object.keys( tinyMCEPreInit.mceInit )[0];
420
+ const orgSettings = tinyMCEPreInit.mceInit[ key ];
421
+
422
+ const settings = Object.assign(
423
+ {},
424
+ orgSettings,
425
+ {
426
+ selector: '#' + editor.id,
427
+ body_class: orgSettings.body_class.replace( key, editor.id )
428
+ }
429
+ );
430
+
431
+ if ( setupCallback ) {
432
+ settings.setup = setupCallback;
433
+ }
434
+
435
+ tinymce.init( settings );
436
+ }
437
+
438
+ function removeRichText() {
439
+ tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, editor.id );
440
+ }
441
+
442
+ function resetTinyMce() {
443
+ removeRichText();
444
+ initRichText();
445
+ }
446
+
447
+ function isTinyMceActive() {
448
+ const id = editor.id;
449
+ const wrapper = document.getElementById( 'wp-' + id + '-wrap' );
450
+ return null !== wrapper && wrapper.classList.contains( 'tmce-active' );
451
+ }
452
+
453
+ function setUpTinyMceVisualButtonListener() {
454
+ jQuery( document ).on(
455
+ 'click', '#' + editor.id + '-html',
456
+ function() {
457
+ editor.style.visibility = 'visible';
458
+ initQuickTagsButtons( editor );
459
+ }
460
+ );
461
+ }
462
+
463
+ function setUpTinyMceHtmlButtonListener() {
464
+ jQuery( '#' + editor.id + '-tmce' ).on( 'click', handleTinyMceHtmlButtonClick );
465
+ }
466
+
467
+ function handleTinyMceHtmlButtonClick() {
468
+ if ( isTinyMceActive() ) {
469
+ resetTinyMce();
470
+ } else {
471
+ initRichText();
472
+ }
473
+
474
+ const wrap = document.getElementById( 'wp-' + editor.id + '-wrap' );
475
+ wrap.classList.add( 'tmce-active' );
476
+ wrap.classList.remove( 'html-active' );
477
+ }
478
+ }
479
+ };
480
+
481
  function getModalHelper( modal, appendTo ) {
482
  return function( child, uniqueClassName ) {
483
  let element = modal.querySelector( '.' + uniqueClassName );
628
  element.appendChild( child );
629
  }
630
 
631
+ window.frmDom = { tag, div, span, a, img, svg, setAttributes, modal, ajax, bootstrap, autocomplete, search, util, wysiwyg };
632
  }() );
js/formidable_admin.js CHANGED
@@ -605,30 +605,27 @@ function frmAdminBuildJS() {
605
 
606
  function removeThisTag() {
607
  /*jshint validthis:true */
608
- var show, hide, removeMore,
609
- id = '',
610
- deleteButton = jQuery( this ),
611
- continueRemove = confirmLinkClick( this );
612
 
613
- if ( parseInt( this.getAttribute( 'data-skip-frm-js' ) ) ) {
614
  return;
615
  }
616
 
617
- if ( continueRemove === false ) {
618
- return;
619
- } else {
620
- id = deleteButton.attr( 'data-removeid' );
621
- show = deleteButton.attr( 'data-showlast' );
622
- removeMore = deleteButton.attr( 'data-removemore' );
623
- if ( typeof show === 'undefined' ) {
624
- show = '';
625
- }
626
- hide = deleteButton.attr( 'data-hidelast' );
627
- if ( typeof hide === 'undefined' ) {
628
- hide = '';
629
- }
630
  }
631
 
 
 
632
  if ( show !== '' ) {
633
  if ( deleteButton.closest( '.frm_add_remove' ).find( '.frm_remove_tag:visible' ).length > 1 ) {
634
  show = '';
@@ -646,7 +643,7 @@ function frmAdminBuildJS() {
646
  }
647
  }
648
 
649
- var $fadeEle = jQuery( document.getElementById( id ) );
650
  $fadeEle.fadeOut( 400, function() {
651
  $fadeEle.remove();
652
  fieldUpdated();
@@ -659,10 +656,9 @@ function frmAdminBuildJS() {
659
  jQuery( show + ' a,' + show ).removeClass( 'frm_hidden' ).fadeIn( 'slow' );
660
  }
661
 
662
- var action = jQuery( this ).closest( '.frm_form_action_settings' );
663
- if ( typeof action !== 'undefined' ) {
664
- var type = jQuery( this ).closest( '.frm_form_action_settings' ).find( '.frm_action_name' ).val();
665
- checkActiveAction( type );
666
  }
667
  });
668
 
@@ -680,6 +676,14 @@ function frmAdminBuildJS() {
680
  return false;
681
  }
682
 
 
 
 
 
 
 
 
 
683
  function clickWidget( event, b ) {
684
  /*jshint validthis:true */
685
  var target = event.target;
@@ -1427,31 +1431,23 @@ function frmAdminBuildJS() {
1427
  * @param {object} opts
1428
  */
1429
  function insertNewFieldByDragging( selectedItem, fieldButton ) {
1430
- var fieldType, addBtn, sortableData, currentItem, insertAtIndex, section, formId, sectionId, loadingID, hasBreak, $placeholder;
1431
-
1432
- fieldType = fieldButton.attr( 'id' );
1433
-
1434
- // We'll optimistically disable the button now. We'll re-enable if AJAX fails
1435
- if ( 'summary' === fieldType ) {
1436
- addBtn = fieldButton.children( '.frm_add_field' );
1437
- disableSummaryBtnBeforeAJAX( addBtn, fieldButton );
1438
- }
1439
 
1440
- sortableData = jQuery( selectedItem ).data().uiSortable;
1441
- currentItem = sortableData.currentItem;
1442
- insertAtIndex = determineIndexBasedOffOfMousePositionInRow( currentItem.parent(), currentItem.offset().left );
1443
  jQuery( getFieldsInRow( currentItem.parent() ).get( insertAtIndex ) ).before( currentItem );
1444
- section = getSectionForFieldPlacement( currentItem );
1445
- formId = getFormIdForFieldPlacement( section );
1446
- sectionId = getSectionIdForFieldPlacement( section );
1447
 
1448
- loadingID = fieldType.replace( '|', '-' ) + '_' + getAutoId();
1449
- $placeholder = jQuery( '<li class="frm-wait frmbutton_loadingnow" id="' + loadingID + '" ></li>' );
1450
  currentItem.replaceWith( $placeholder );
1451
 
1452
  syncLayoutClasses( $placeholder );
1453
 
1454
- hasBreak = 0;
1455
  if ( 'summary' === fieldType ) {
1456
  // see if we need to insert a page break before this newly-added summary field. Check for at least 1 page break
1457
  hasBreak = jQuery( '.frmbutton_loadingnow#' + loadingID ).prevAll( 'li[data-type="break"]' ).length ? 1 : 0;
@@ -1468,9 +1464,9 @@ function frmAdminBuildJS() {
1468
  has_break: hasBreak
1469
  },
1470
  success: function( msg ) {
1471
- var $siblings, replaceWith;
1472
  document.getElementById( 'frm_form_editor_container' ).classList.add( 'frm-has-fields' );
1473
- $siblings = $placeholder.siblings( 'li.form-field' ).not( '.edit_field_type_end_divider' );
1474
  if ( ! $siblings.length ) {
1475
  // if dragging into a new row, we need to wrap the li first.
1476
  replaceWith = wrapFieldLi( msg );
@@ -1485,12 +1481,24 @@ function frmAdminBuildJS() {
1485
  }
1486
  toggleSectionHolder();
1487
  },
1488
- error: function( jqXHR, textStatus, errorThrown ) {
1489
- maybeReenableSummaryBtnAfterAJAX( fieldType, addBtn, fieldButton, errorThrown );
1490
- }
1491
  });
1492
  }
1493
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1494
  /**
1495
  * Get a unique id that automatically increments with every function call.
1496
  * Can be used for any UI that requires a unique id.
@@ -1674,25 +1682,21 @@ function frmAdminBuildJS() {
1674
 
1675
  function addFieldClick() {
1676
  /*jshint validthis:true */
1677
- var $thisObj = jQuery( this );
1678
  // there is no real way to disable a <a> (with a valid href attribute) in HTML - https://css-tricks.com/how-to-disable-links/
1679
  if ( $thisObj.hasClass( 'disabled' ) ) {
1680
  return false;
1681
  }
1682
 
1683
- var $button = $thisObj.closest( '.frmbutton' );
1684
- var fieldType = $button.attr( 'id' );
1685
 
1686
- var hasBreak = 0;
1687
  if ( 'summary' === fieldType ) {
1688
- // We'll optimistically disable $button now. We'll re-enable if AJAX fails
1689
- disableSummaryBtnBeforeAJAX( $thisObj, $button );
1690
-
1691
  hasBreak = $newFields.children( 'li[data-type="break"]' ).length > 0 ? 1 : 0;
1692
  }
1693
 
1694
- var formId = thisFormId;
1695
-
1696
  jQuery.ajax({
1697
  type: 'POST',
1698
  url: ajaxurl,
@@ -1709,52 +1713,11 @@ function frmAdminBuildJS() {
1709
  $newFields.append( wrapFieldLi( msg ) );
1710
  afterAddField( msg, true );
1711
  },
1712
- error: function( jqXHR, textStatus, errorThrown ) {
1713
- maybeReenableSummaryBtnAfterAJAX( fieldType, $thisObj, $button, errorThrown );
1714
- }
1715
  });
1716
  return false;
1717
  }
1718
 
1719
- function disableSummaryBtnBeforeAJAX( addBtn, fieldButton ) {
1720
- addBtn.addClass( 'disabled' );
1721
- fieldButton.draggable( 'disable' );
1722
- }
1723
-
1724
- function reenableAddSummaryBtn() {
1725
- var frmBtn = jQuery( 'li#summary' );
1726
- var addFieldLink = frmBtn.children( '.frm_add_field' );
1727
- frmBtn.draggable( 'enable' );
1728
- addFieldLink.removeClass( 'disabled' );
1729
- }
1730
-
1731
- function maybeDisableAddSummaryBtn() {
1732
- var summary = document.getElementById( 'summary' );
1733
- if ( summary && ! summary.classList.contains( 'frm_show_upgrade' ) && formHasSummaryField() ) {
1734
- disableAddSummaryBtn();
1735
- }
1736
- }
1737
-
1738
- function disableAddSummaryBtn() {
1739
- var frmBtn = jQuery( 'li#summary' );
1740
- var addFieldLink = frmBtn.children( '.frm_add_field' );
1741
- frmBtn.draggable( 'disable' );
1742
- addFieldLink.addClass( 'disabled' );
1743
- }
1744
-
1745
- function maybeReenableSummaryBtnAfterAJAX( fieldType, addBtn, fieldButton, errorThrown ) {
1746
- infoModal( errorThrown + '. Please try again.' );
1747
- if ( 'summary' === fieldType ) {
1748
- addBtn.removeClass( 'disabled' );
1749
- fieldButton.draggable( 'enable' );
1750
- }
1751
- }
1752
-
1753
- function formHasSummaryField() {
1754
- // .edit_field_type_summary is a better selector here in order to also cover fields loaded by AJAX
1755
- return $newFields.children( 'li.edit_field_type_summary' ).length > 0;
1756
- }
1757
-
1758
  function maybeHideQuantityProductFieldOption() {
1759
  var hide = true,
1760
  opts = document.querySelectorAll( '.frmjs_prod_field_opt_cont' );
@@ -3055,16 +3018,13 @@ function frmAdminBuildJS() {
3055
  }
3056
 
3057
  function addImageToOption( event ) {
3058
- var fileFrame,
3059
- $this = jQuery( this ),
3060
- $imagePreview = $this.closest( '.frm_image_preview_wrapper' ),
3061
- postID = 0;
3062
 
3063
  event.preventDefault();
3064
 
3065
- wp.media.model.settings.post.id = postID;
3066
 
3067
- fileFrame = wp.media.frames.file_frame = wp.media({
3068
  multiple: false,
3069
  library: {
3070
  type: [ 'image' ]
@@ -3073,13 +3033,20 @@ function frmAdminBuildJS() {
3073
 
3074
  fileFrame.on( 'select', function() {
3075
  const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
3076
- $imagePreview.find( 'img' ).attr( 'src', attachment.url ).removeClass( 'frm_hidden' );
3077
- $imagePreview.find( '.frm_image_preview_frame' ).show();
3078
- $imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
 
 
 
 
 
 
 
 
3079
  $imagePreview.siblings( 'input[name*="[label]"]' ).data( 'frmimgurl', attachment.url );
3080
- $imagePreview.find( '.frm_choose_image_box' ).hide();
3081
  $imagePreview.find( 'input.frm_image_id' ).val( attachment.id ).trigger( 'change' );
3082
- wp.media.model.settings.post.id = postID;
3083
  });
3084
 
3085
  fileFrame.open();
@@ -4186,9 +4153,6 @@ function frmAdminBuildJS() {
4186
  if ( type === 'break' ) {
4187
  renumberPageBreaks();
4188
  }
4189
- if ( type === 'summary' ) {
4190
- reenableAddSummaryBtn();
4191
- }
4192
  if ( type === 'product' ) {
4193
  maybeHideQuantityProductFieldOption();
4194
  // a product field attached to a quantity field earlier might be the one deleted, so re-populate
@@ -6005,39 +5969,70 @@ function frmAdminBuildJS() {
6005
  }
6006
  }
6007
 
6008
- function copyFormAction() {
6009
- /*jshint validthis:true */
6010
- if ( waitForActionToLoadBeforeCopy( this ) ) {
6011
  return;
6012
  }
6013
 
6014
- var action = jQuery( this ).closest( '.frm_form_action_settings' ).clone();
6015
- var currentID = action.attr( 'id' ).replace( 'frm_form_action_', '' );
6016
- var newID = newActionId( currentID );
6017
- action.find( '.frm_action_id, .frm-btn-group' ).remove();
6018
- action.find( 'input[name$="[' + currentID + '][ID]"]' ).val( '' );
6019
- action.find( '.widget-inside' ).hide();
 
 
 
 
 
 
 
 
6020
 
6021
  // the .html() gets original values, so they need to be set
6022
- action.find( 'input[type=text], textarea, input[type=number]' ).prop( 'defaultValue', function() {
6023
  return this.value;
6024
  });
6025
 
6026
- action.find( 'input[type=checkbox], input[type=radio]' ).prop( 'defaultChecked', function() {
6027
  return this.checked;
6028
  });
6029
 
6030
- var rename = new RegExp( '\\[' + currentID + '\\]', 'g' );
6031
- var reid = new RegExp( '_' + currentID + '"', 'g' );
6032
- var reclass = new RegExp( '-' + currentID + '"', 'g' );
6033
- var revalue = new RegExp( '"' + currentID + '"', 'g' ); // if a field id matches, this could cause trouble
6034
 
6035
- var html = action.html().replace( rename, '[' + newID + ']' ).replace( reid, '_' + newID + '"' );
6036
  html = html.replace( reclass, '-' + newID + '"' ).replace( revalue, '"' + newID + '"' );
6037
- var div = '<div id="frm_form_action_' + newID + '" class="widget frm_form_action_settings frm_single_email_settings" data-actionkey="' + newID + '">';
6038
 
6039
- jQuery( '#frm_notification_settings' ).append( div + html + '</div>' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6040
  initiateMultiselect();
 
 
 
6041
  }
6042
 
6043
  function waitForActionToLoadBeforeCopy( element ) {
@@ -6072,21 +6067,19 @@ function frmAdminBuildJS() {
6072
 
6073
  function addFormAction() {
6074
  /*jshint validthis:true */
6075
- var type, actionId, formId, placeholderSetting, actionsList;
6076
-
6077
- type = jQuery( this ).data( 'actiontype' );
6078
 
6079
  if ( isAtLimitForActionType( type ) ) {
6080
  return;
6081
  }
6082
 
6083
- actionId = getNewActionId();
6084
- formId = thisFormId;
6085
 
6086
- placeholderSetting = document.createElement( 'div' );
6087
  placeholderSetting.classList.add( 'frm_single_' + type + '_settings' );
6088
 
6089
- actionsList = document.getElementById( 'frm_notification_settings' );
6090
  actionsList.appendChild( placeholderSetting );
6091
 
6092
  jQuery.ajax({
@@ -6099,31 +6092,48 @@ function frmAdminBuildJS() {
6099
  form_id: formId,
6100
  nonce: frmGlobal.nonce
6101
  },
6102
- success: function( html ) {
6103
- fieldUpdated();
6104
- placeholderSetting.remove();
6105
 
6106
- // Close any open actions first.
6107
- jQuery( '.frm_form_action_settings.open' ).removeClass( 'open' );
 
6108
 
6109
- jQuery( actionsList ).append( html );
6110
- jQuery( '.frm_form_action_settings' ).fadeIn( 'slow' );
6111
 
6112
- var newAction = document.getElementById( 'frm_form_action_' + actionId );
 
6113
 
6114
- newAction.classList.add( 'open' );
6115
- document.getElementById( 'post-body-content' ).scroll({
6116
- top: newAction.offsetTop + 10,
6117
- left: 0,
6118
- behavior: 'smooth'
6119
- });
6120
 
6121
- //check if icon should be active
6122
- checkActiveAction( type );
6123
- initiateMultiselect();
6124
- showInputIcon( '#frm_form_action_' + actionId );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6125
  }
6126
- });
 
 
 
 
 
 
6127
  }
6128
 
6129
  function toggleActionGroups() {
@@ -6195,129 +6205,15 @@ function frmAdminBuildJS() {
6195
  singleField.classList.remove( 'frm_hidden' );
6196
  document.getElementById( 'frm-options-panel-tab' ).click();
6197
 
6198
- setUpTinyMceVisualButtonListener( singleField );
6199
- setUpTinyMceHtmlButtonListener( singleField );
6200
-
6201
- if ( isTinyMceActive() ) {
6202
- setTimeout( resetTinyMce, 0 );
6203
- } else {
6204
- initQuickTagsButtons( singleField );
6205
- }
6206
- }
6207
-
6208
- function setUpTinyMceVisualButtonListener( fieldSettings ) {
6209
- var editor = fieldSettings.querySelector( '.wp-editor-area' );
6210
  if ( editor ) {
6211
- jQuery( document ).on(
6212
- 'click', '#' + editor.id + '-html',
6213
- function() {
6214
- editor.style.visibility = 'visible';
6215
- initQuickTagsButtons( fieldSettings );
6216
- }
6217
  );
6218
  }
6219
  }
6220
 
6221
- function setUpTinyMceHtmlButtonListener( fieldSettings ) {
6222
- var editor, hasResetTinyMce;
6223
-
6224
- editor = fieldSettings.querySelector( '.wp-editor-area' );
6225
- if ( ! editor ) {
6226
- return;
6227
- }
6228
-
6229
- hasResetTinyMce = false;
6230
-
6231
- jQuery( '#' + editor.id + '-tmce' )
6232
- .on(
6233
- 'click',
6234
- function() {
6235
- var wrap;
6236
-
6237
- if ( ! hasResetTinyMce ) {
6238
- resetTinyMce();
6239
- hasResetTinyMce = true;
6240
- }
6241
-
6242
- wrap = document.getElementById( 'wp-' + editor.id + '-wrap' );
6243
- wrap.classList.add( 'tmce-active' );
6244
- wrap.classList.remove( 'html-active' );
6245
- }
6246
- );
6247
- }
6248
-
6249
- function initQuickTagsButtons( fieldSettings ) {
6250
- var editor, settings;
6251
-
6252
- editor = fieldSettings.querySelector( '.wp-editor-area' );
6253
-
6254
- if ( ! editor || 'function' !== typeof window.quicktags || typeof window.QTags.instances[ editor.id ] !== 'undefined' ) {
6255
- return;
6256
- }
6257
-
6258
- settings = {
6259
- name: 'qt_' + editor.id,
6260
- id: editor.id,
6261
- canvas: editor,
6262
- settings: {
6263
- buttons: 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close',
6264
- id: editor.id
6265
- },
6266
- toolbar: document.getElementById( 'qt_' + editor.id + '_toolbar' ),
6267
- theButtons: {}
6268
- };
6269
- window.quicktags( settings );
6270
- }
6271
-
6272
- function resetTinyMce() {
6273
- document.querySelectorAll( '.frm-single-settings:not(.frm_hidden) .wp-editor-area' ).forEach(
6274
- function( editor ) {
6275
- var isInitialized, isVisible;
6276
-
6277
- isInitialized = 'undefined' !== typeof tinyMCE.editors[ editor.id ];
6278
- isVisible = isInitialized && ! tinyMCE.editors[ editor.id ].isHidden();
6279
-
6280
- if ( isVisible ) {
6281
- removeRichText( editor.id );
6282
- }
6283
-
6284
- if ( isVisible || ! isInitialized ) {
6285
- initRichText( editor.id );
6286
- }
6287
- }
6288
- );
6289
- }
6290
-
6291
- function removeRichText( id ) {
6292
- tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, id );
6293
- tinymce.remove( id );
6294
- }
6295
-
6296
- function initRichText( id ) {
6297
- var defaultSettings = getDefaultTinyMceSettings(),
6298
- newValues = {
6299
- selector: '#' + id,
6300
- body_class: defaultSettings.body_class.replace( getDefaultSettingsKey(), id ),
6301
- setup: setupTinyMceEventHandlers
6302
- },
6303
- newSettings = Object.assign(
6304
- {}, defaultSettings, newValues
6305
- );
6306
- if ( 'undefined' !== typeof newSettings.toolbar1 ) {
6307
- // the link option does not work in the modal, so exclude it.
6308
- newSettings.toolbar1 = newSettings.toolbar1.replace( ',wp_more', '' );
6309
- }
6310
- tinymce.init( newSettings );
6311
- }
6312
-
6313
- function getDefaultSettingsKey() {
6314
- return Object.keys( tinyMCEPreInit.mceInit )[0];
6315
- }
6316
-
6317
- function getDefaultTinyMceSettings() {
6318
- return tinyMCEPreInit.mceInit[ getDefaultSettingsKey() ];
6319
- }
6320
-
6321
  function setupTinyMceEventHandlers( editor ) {
6322
  editor.on( 'Change', function() {
6323
  handleTinyMceChange( editor );
@@ -6325,10 +6221,12 @@ function frmAdminBuildJS() {
6325
  }
6326
 
6327
  function handleTinyMceChange( editor ) {
6328
- if ( isTinyMceActive() && ! tinyMCE.activeEditor.isHidden() ) {
6329
- editor.targetElm.value = editor.getContent();
6330
- jQuery( editor.targetElm ).trigger( 'change' );
6331
  }
 
 
 
6332
  }
6333
 
6334
  function isTinyMceActive() {
@@ -6397,23 +6295,46 @@ function frmAdminBuildJS() {
6397
  }
6398
 
6399
  function checkActiveAction( type ) {
6400
- var $actionTriggers, limitClass;
6401
-
6402
- $actionTriggers = jQuery( '.frm_' + type + '_action' );
6403
 
6404
  if ( isAtLimitForActionType( type ) ) {
6405
- limitClass = 'frm_inactive_action';
6406
- if ( getLimitForActionType( type ) > 0 ) {
6407
- limitClass += ' frm_already_used';
6408
- }
6409
- $actionTriggers.removeClass( 'frm_active_action' ).addClass( limitClass );
6410
- } else {
6411
- $actionTriggers.removeClass( 'frm_inactive_action frm_already_used' ).addClass( 'frm_active_action' );
6412
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6413
  }
6414
 
6415
  function isAtLimitForActionType( type ) {
6416
- return getNumberOfActionsForType( type ) >= getLimitForActionType( type );
 
 
 
 
 
 
6417
  }
6418
 
6419
  function getLimitForActionType( type ) {
@@ -8025,9 +7946,6 @@ function frmAdminBuildJS() {
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(
@@ -9540,16 +9458,17 @@ function frmAdminBuildJS() {
9540
 
9541
  initBulkOptionsOverlay();
9542
  hideEmptyEle();
9543
- maybeDisableAddSummaryBtn();
9544
  maybeHideQuantityProductFieldOption();
9545
  handleNameFieldOnFormBuilder();
9546
  toggleSectionHolder();
9547
  },
9548
 
9549
  settingsInit: function() {
9550
- var formSettings, $loggedIn, $cookieExp, $editable,
9551
- $formActions = jQuery( document.getElementById( 'frm_notification_settings' ) );
9552
- //BCC, CC, and Reply To button functionality
 
 
9553
  $formActions.on( 'click', '.frm_email_buttons', showEmailRow );
9554
  $formActions.on( 'click', '.frm_remove_field', hideEmailRow );
9555
  $formActions.on( 'change', '.frm_to_row, .frm_from_row', showEmailWarning );
@@ -9572,7 +9491,7 @@ function frmAdminBuildJS() {
9572
  checkActiveAction( jQuery( this ).children( 'a' ).data( 'actiontype' ) );
9573
 
9574
  // If the icon is a background image, don't add BG color.
9575
- var icon = jQuery( this ).find( 'i' );
9576
  if ( icon.css( 'background-image' ) !== 'none' ) {
9577
  icon.addClass( 'frm-inverse' );
9578
  }
@@ -9589,23 +9508,45 @@ function frmAdminBuildJS() {
9589
  formSettings.on( 'click', '.frm_add_submit_logic', addSubmitLogic );
9590
  formSettings.on( 'change', '.frm_submit_logic_field_opts', addSubmitLogicOpts );
9591
 
9592
- jQuery( '.frm_image_preview_wrapper' ).on( 'click', '.frm_choose_image_box', addImageToOption );
9593
- jQuery( '.frm_image_preview_wrapper' ).on( 'click', '.frm_remove_image_option', removeImageFromOption );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9594
 
9595
  // Close shortcode modal on click.
9596
  formSettings.on( 'mouseup', '*:not(.frm-show-box)', function( e ) {
9597
  e.stopPropagation();
 
9598
  if ( e.target.classList.contains( 'frm-show-box' ) ) {
9599
  return;
9600
  }
9601
- var sidebar = document.getElementById( 'frm_adv_info' ),
9602
- isChild = jQuery( e.target ).closest( '#frm_adv_info' ).length > 0;
 
 
 
9603
 
9604
  if ( sidebar.getAttribute( 'data-fills' ) === e.target.id && typeof e.target.id !== 'undefined' ) {
9605
  return;
9606
  }
9607
 
9608
- if ( sidebar !== null && ! isChild && sidebar.display !== 'none' ) {
 
9609
  hideShortcodes( sidebar );
9610
  }
9611
  });
605
 
606
  function removeThisTag() {
607
  /*jshint validthis:true */
608
+ let show, hide, removeMore;
 
 
 
609
 
610
+ if ( parseInt( this.getAttribute( 'data-skip-frm-js' ) ) || confirmLinkClick( this ) === false ) {
611
  return;
612
  }
613
 
614
+ const deleteButton = jQuery( this );
615
+ const id = deleteButton.attr( 'data-removeid' );
616
+
617
+ show = deleteButton.attr( 'data-showlast' );
618
+ if ( typeof show === 'undefined' ) {
619
+ show = '';
620
+ }
621
+
622
+ hide = deleteButton.attr( 'data-hidelast' );
623
+ if ( typeof hide === 'undefined' ) {
624
+ hide = '';
 
 
625
  }
626
 
627
+ removeMore = deleteButton.attr( 'data-removemore' );
628
+
629
  if ( show !== '' ) {
630
  if ( deleteButton.closest( '.frm_add_remove' ).find( '.frm_remove_tag:visible' ).length > 1 ) {
631
  show = '';
643
  }
644
  }
645
 
646
+ const $fadeEle = jQuery( document.getElementById( id ) );
647
  $fadeEle.fadeOut( 400, function() {
648
  $fadeEle.remove();
649
  fieldUpdated();
656
  jQuery( show + ' a,' + show ).removeClass( 'frm_hidden' ).fadeIn( 'slow' );
657
  }
658
 
659
+ if ( this.closest( '.frm_form_action_settings' ) ) {
660
+ const type = this.closest( '.frm_form_action_settings' ).querySelector( '.frm_action_name' ).value;
661
+ afterActionRemoved( type );
 
662
  }
663
  });
664
 
676
  return false;
677
  }
678
 
679
+ function afterActionRemoved( type ) {
680
+ checkActiveAction( type );
681
+
682
+ const hookName = 'frm_after_action_removed';
683
+ const hookArgs = { type };
684
+ wp.hooks.doAction( hookName, hookArgs );
685
+ }
686
+
687
  function clickWidget( event, b ) {
688
  /*jshint validthis:true */
689
  var target = event.target;
1431
  * @param {object} opts
1432
  */
1433
  function insertNewFieldByDragging( selectedItem, fieldButton ) {
1434
+ const fieldType = fieldButton.attr( 'id' );
 
 
 
 
 
 
 
 
1435
 
1436
+ const sortableData = jQuery( selectedItem ).data().uiSortable;
1437
+ const currentItem = sortableData.currentItem;
1438
+ const insertAtIndex = determineIndexBasedOffOfMousePositionInRow( currentItem.parent(), currentItem.offset().left );
1439
  jQuery( getFieldsInRow( currentItem.parent() ).get( insertAtIndex ) ).before( currentItem );
1440
+ const section = getSectionForFieldPlacement( currentItem );
1441
+ const formId = getFormIdForFieldPlacement( section );
1442
+ const sectionId = getSectionIdForFieldPlacement( section );
1443
 
1444
+ const loadingID = fieldType.replace( '|', '-' ) + '_' + getAutoId();
1445
+ const $placeholder = jQuery( '<li class="frm-wait frmbutton_loadingnow" id="' + loadingID + '" ></li>' );
1446
  currentItem.replaceWith( $placeholder );
1447
 
1448
  syncLayoutClasses( $placeholder );
1449
 
1450
+ let hasBreak = 0;
1451
  if ( 'summary' === fieldType ) {
1452
  // see if we need to insert a page break before this newly-added summary field. Check for at least 1 page break
1453
  hasBreak = jQuery( '.frmbutton_loadingnow#' + loadingID ).prevAll( 'li[data-type="break"]' ).length ? 1 : 0;
1464
  has_break: hasBreak
1465
  },
1466
  success: function( msg ) {
1467
+ let replaceWith;
1468
  document.getElementById( 'frm_form_editor_container' ).classList.add( 'frm-has-fields' );
1469
+ const $siblings = $placeholder.siblings( 'li.form-field' ).not( '.edit_field_type_end_divider' );
1470
  if ( ! $siblings.length ) {
1471
  // if dragging into a new row, we need to wrap the li first.
1472
  replaceWith = wrapFieldLi( msg );
1481
  }
1482
  toggleSectionHolder();
1483
  },
1484
+ error: handleInsertFieldError
 
 
1485
  });
1486
  }
1487
 
1488
+ function handleInsertFieldError( jqXHR, _, errorThrown ) {
1489
+ maybeShowInsertFieldError( errorThrown, jqXHR );
1490
+ }
1491
+
1492
+ function maybeShowInsertFieldError( errorThrown, jqXHR ) {
1493
+ if ( ! jqXHRAborted( jqXHR ) ) {
1494
+ infoModal( errorThrown + '. Please try again.' );
1495
+ }
1496
+ }
1497
+
1498
+ function jqXHRAborted( jqXHR ) {
1499
+ return jqXHR.status === 0 || jqXHR.readyState === 0;
1500
+ }
1501
+
1502
  /**
1503
  * Get a unique id that automatically increments with every function call.
1504
  * Can be used for any UI that requires a unique id.
1682
 
1683
  function addFieldClick() {
1684
  /*jshint validthis:true */
1685
+ const $thisObj = jQuery( this );
1686
  // there is no real way to disable a <a> (with a valid href attribute) in HTML - https://css-tricks.com/how-to-disable-links/
1687
  if ( $thisObj.hasClass( 'disabled' ) ) {
1688
  return false;
1689
  }
1690
 
1691
+ const $button = $thisObj.closest( '.frmbutton' );
1692
+ const fieldType = $button.attr( 'id' );
1693
 
1694
+ let hasBreak = 0;
1695
  if ( 'summary' === fieldType ) {
 
 
 
1696
  hasBreak = $newFields.children( 'li[data-type="break"]' ).length > 0 ? 1 : 0;
1697
  }
1698
 
1699
+ const formId = thisFormId;
 
1700
  jQuery.ajax({
1701
  type: 'POST',
1702
  url: ajaxurl,
1713
  $newFields.append( wrapFieldLi( msg ) );
1714
  afterAddField( msg, true );
1715
  },
1716
+ error: handleInsertFieldError
 
 
1717
  });
1718
  return false;
1719
  }
1720
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1721
  function maybeHideQuantityProductFieldOption() {
1722
  var hide = true,
1723
  opts = document.querySelectorAll( '.frmjs_prod_field_opt_cont' );
3018
  }
3019
 
3020
  function addImageToOption( event ) {
3021
+ const imagePreview = event.target.closest( '.frm_image_preview_wrapper' );
 
 
 
3022
 
3023
  event.preventDefault();
3024
 
3025
+ wp.media.model.settings.post.id = 0;
3026
 
3027
+ const fileFrame = wp.media.frames.file_frame = wp.media({
3028
  multiple: false,
3029
  library: {
3030
  type: [ 'image' ]
3033
 
3034
  fileFrame.on( 'select', function() {
3035
  const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
3036
+ const img = imagePreview.querySelector( 'img' );
3037
+
3038
+ img.setAttribute( 'src', attachment.url );
3039
+ img.classList.remove( 'frm_hidden' );
3040
+ img.removeAttribute( 'srcset' ); // Prevent the old image from sticking around.
3041
+
3042
+ imagePreview.querySelector( '.frm_image_preview_frame' ).style.display = 'block';
3043
+ imagePreview.querySelector( '.frm_image_preview_title' ).textContent = attachment.filename;
3044
+ imagePreview.querySelector( '.frm_choose_image_box' ).style.display = 'none';
3045
+
3046
+ const $imagePreview = jQuery( imagePreview );
3047
  $imagePreview.siblings( 'input[name*="[label]"]' ).data( 'frmimgurl', attachment.url );
 
3048
  $imagePreview.find( 'input.frm_image_id' ).val( attachment.id ).trigger( 'change' );
3049
+ wp.media.model.settings.post.id = 0;
3050
  });
3051
 
3052
  fileFrame.open();
4153
  if ( type === 'break' ) {
4154
  renumberPageBreaks();
4155
  }
 
 
 
4156
  if ( type === 'product' ) {
4157
  maybeHideQuantityProductFieldOption();
4158
  // a product field attached to a quantity field earlier might be the one deleted, so re-populate
5969
  }
5970
  }
5971
 
5972
+ function copyFormAction( event ) {
5973
+ if ( waitForActionToLoadBeforeCopy( event.target ) ) {
 
5974
  return;
5975
  }
5976
 
5977
+ const targetSettings = event.target.closest( '.frm_form_action_settings' );
5978
+ const wysiwyg = targetSettings.querySelector( '.wp-editor-area' );
5979
+ if ( wysiwyg ) {
5980
+ // Temporary remove TinyMCE before cloning to avoid TinyMCE conflicts.
5981
+ tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, wysiwyg.id );
5982
+ }
5983
+
5984
+ const $action = jQuery( targetSettings ).clone();
5985
+ const currentID = $action.attr( 'id' ).replace( 'frm_form_action_', '' );
5986
+ const newID = newActionId( currentID );
5987
+
5988
+ $action.find( '.frm_action_id, .frm-btn-group' ).remove();
5989
+ $action.find( 'input[name$="[' + currentID + '][ID]"]' ).val( '' );
5990
+ $action.find( '.widget-inside' ).hide();
5991
 
5992
  // the .html() gets original values, so they need to be set
5993
+ $action.find( 'input[type=text], textarea, input[type=number]' ).prop( 'defaultValue', function() {
5994
  return this.value;
5995
  });
5996
 
5997
+ $action.find( 'input[type=checkbox], input[type=radio]' ).prop( 'defaultChecked', function() {
5998
  return this.checked;
5999
  });
6000
 
6001
+ const rename = new RegExp( '\\[' + currentID + '\\]', 'g' );
6002
+ const reid = new RegExp( '_' + currentID + '"', 'g' );
6003
+ const reclass = new RegExp( '-' + currentID + '"', 'g' );
6004
+ const revalue = new RegExp( '"' + currentID + '"', 'g' ); // if a field id matches, this could cause trouble
6005
 
6006
+ let html = $action.html().replace( rename, '[' + newID + ']' ).replace( reid, '_' + newID + '"' );
6007
  html = html.replace( reclass, '-' + newID + '"' ).replace( revalue, '"' + newID + '"' );
 
6008
 
6009
+ const newAction = div({
6010
+ id: 'frm_form_action_' + newID,
6011
+ className: $action.get( 0 ).className
6012
+ });
6013
+ newAction.setAttribute( 'data-actionkey', newID );
6014
+ newAction.innerHTML = html;
6015
+ newAction.querySelectorAll( '.wp-editor-wrap, .wp-editor-wrap *' ).forEach(
6016
+ element => {
6017
+ if ( 'string' === typeof element.className ) {
6018
+ element.className = element.className.replace( currentID, newID );
6019
+ }
6020
+ element.id = element.id.replace( currentID, newID );
6021
+ }
6022
+ );
6023
+ newAction.classList.remove( 'open' );
6024
+ document.getElementById( 'frm_notification_settings' ).appendChild( newAction );
6025
+
6026
+ if ( wysiwyg ) {
6027
+ // Re-initialize the original wysiwyg which was removed before cloning.
6028
+ frmDom.wysiwyg.init( wysiwyg );
6029
+ }
6030
+ frmDom.wysiwyg.init( newAction.querySelector( '.wp-editor-area' ) );
6031
+
6032
  initiateMultiselect();
6033
+
6034
+ const hookName = 'frm_after_duplicate_action';
6035
+ wp.hooks.doAction( hookName, newAction );
6036
  }
6037
 
6038
  function waitForActionToLoadBeforeCopy( element ) {
6067
 
6068
  function addFormAction() {
6069
  /*jshint validthis:true */
6070
+ const type = jQuery( this ).data( 'actiontype' );
 
 
6071
 
6072
  if ( isAtLimitForActionType( type ) ) {
6073
  return;
6074
  }
6075
 
6076
+ const actionId = getNewActionId();
6077
+ const formId = thisFormId;
6078
 
6079
+ const placeholderSetting = document.createElement( 'div' );
6080
  placeholderSetting.classList.add( 'frm_single_' + type + '_settings' );
6081
 
6082
+ const actionsList = document.getElementById( 'frm_notification_settings' );
6083
  actionsList.appendChild( placeholderSetting );
6084
 
6085
  jQuery.ajax({
6092
  form_id: formId,
6093
  nonce: frmGlobal.nonce
6094
  },
6095
+ success: handleAddFormActionSuccess
6096
+ });
 
6097
 
6098
+ function handleAddFormActionSuccess( html ) {
6099
+ fieldUpdated();
6100
+ placeholderSetting.remove();
6101
 
6102
+ closeOpenActions();
 
6103
 
6104
+ const newActionContainer = div();
6105
+ newActionContainer.innerHTML = html;
6106
 
6107
+ const widgetTop = newActionContainer.querySelector( '.widget-top' );
6108
+ Array.from( newActionContainer.children ).forEach( child => actionsList.appendChild( child ) );
 
 
 
 
6109
 
6110
+ jQuery( '.frm_form_action_settings' ).fadeIn( 'slow' );
6111
+
6112
+ const newAction = document.getElementById( 'frm_form_action_' + actionId );
6113
+
6114
+ newAction.classList.add( 'open' );
6115
+ document.getElementById( 'post-body-content' ).scroll({
6116
+ top: newAction.offsetTop + 10,
6117
+ left: 0,
6118
+ behavior: 'smooth'
6119
+ });
6120
+
6121
+ // Check if icon should be active
6122
+ checkActiveAction( type );
6123
+ showInputIcon( '#frm_form_action_' + actionId );
6124
+
6125
+ initiateMultiselect();
6126
+
6127
+ if ( widgetTop ) {
6128
+ jQuery( widgetTop ).trigger( 'frm-action-loaded' );
6129
  }
6130
+ }
6131
+ }
6132
+
6133
+ function closeOpenActions() {
6134
+ document.querySelectorAll( '.frm_form_action_settings.open' ).forEach(
6135
+ setting => setting.classList.remove( 'open' )
6136
+ );
6137
  }
6138
 
6139
  function toggleActionGroups() {
6205
  singleField.classList.remove( 'frm_hidden' );
6206
  document.getElementById( 'frm-options-panel-tab' ).click();
6207
 
6208
+ const editor = singleField.querySelector( '.wp-editor-area' );
 
 
 
 
 
 
 
 
 
 
 
6209
  if ( editor ) {
6210
+ frmDom.wysiwyg.init(
6211
+ editor,
6212
+ { setupCallback: setupTinyMceEventHandlers }
 
 
 
6213
  );
6214
  }
6215
  }
6216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6217
  function setupTinyMceEventHandlers( editor ) {
6218
  editor.on( 'Change', function() {
6219
  handleTinyMceChange( editor );
6221
  }
6222
 
6223
  function handleTinyMceChange( editor ) {
6224
+ if ( ! isTinyMceActive() || tinyMCE.activeEditor.isHidden() ) {
6225
+ return;
 
6226
  }
6227
+
6228
+ editor.targetElm.value = editor.getContent();
6229
+ jQuery( editor.targetElm ).trigger( 'change' );
6230
  }
6231
 
6232
  function isTinyMceActive() {
6295
  }
6296
 
6297
  function checkActiveAction( type ) {
6298
+ const actionTriggers = document.querySelectorAll( '.frm_' + type + '_action' );
 
 
6299
 
6300
  if ( isAtLimitForActionType( type ) ) {
6301
+ const addAlreadyUsedClass = getLimitForActionType( type ) > 0;
6302
+ markActionTriggersInactive( actionTriggers, addAlreadyUsedClass );
6303
+ return;
 
 
 
 
6304
  }
6305
+
6306
+ markActionTriggersActive( actionTriggers );
6307
+ }
6308
+
6309
+ function markActionTriggersActive( triggers ) {
6310
+ triggers.forEach(
6311
+ trigger => {
6312
+ trigger.classList.remove( 'frm_inactive_action', 'frm_already_used' );
6313
+ trigger.classList.add( 'frm_active_action' );
6314
+ }
6315
+ );
6316
+ }
6317
+
6318
+ function markActionTriggersInactive( triggers, addAlreadyUsedClass ) {
6319
+ triggers.forEach(
6320
+ trigger => {
6321
+ trigger.classList.remove( 'frm_active_action' );
6322
+ trigger.classList.add( 'frm_inactive_action' );
6323
+ if ( addAlreadyUsedClass ) {
6324
+ trigger.classList.add( 'frm_already_used' );
6325
+ }
6326
+ }
6327
+ );
6328
  }
6329
 
6330
  function isAtLimitForActionType( type ) {
6331
+ let atLimit = getNumberOfActionsForType( type ) >= getLimitForActionType( type );
6332
+
6333
+ const hookName = 'frm_action_at_limit';
6334
+ const hookArgs = { type };
6335
+ atLimit = wp.hooks.applyFilters( hookName, atLimit, hookArgs );
6336
+
6337
+ return atLimit;
6338
  }
6339
 
6340
  function getLimitForActionType( type ) {
7946
  });
7947
  }
7948
 
 
 
 
7949
  function afterAddonInstall( response, button, message, el, saveAndReload ) {
7950
  const addonStatuses = document.querySelectorAll( '.frm-addon-status' );
7951
  addonStatuses.forEach(
9458
 
9459
  initBulkOptionsOverlay();
9460
  hideEmptyEle();
 
9461
  maybeHideQuantityProductFieldOption();
9462
  handleNameFieldOnFormBuilder();
9463
  toggleSectionHolder();
9464
  },
9465
 
9466
  settingsInit: function() {
9467
+ const $formActions = jQuery( document.getElementById( 'frm_notification_settings' ) );
9468
+
9469
+ let formSettings, $loggedIn, $cookieExp, $editable;
9470
+
9471
+ // BCC, CC, and Reply To button functionality
9472
  $formActions.on( 'click', '.frm_email_buttons', showEmailRow );
9473
  $formActions.on( 'click', '.frm_remove_field', hideEmailRow );
9474
  $formActions.on( 'change', '.frm_to_row, .frm_from_row', showEmailWarning );
9491
  checkActiveAction( jQuery( this ).children( 'a' ).data( 'actiontype' ) );
9492
 
9493
  // If the icon is a background image, don't add BG color.
9494
+ const icon = jQuery( this ).find( 'i' );
9495
  if ( icon.css( 'background-image' ) !== 'none' ) {
9496
  icon.addClass( 'frm-inverse' );
9497
  }
9508
  formSettings.on( 'click', '.frm_add_submit_logic', addSubmitLogic );
9509
  formSettings.on( 'change', '.frm_submit_logic_field_opts', addSubmitLogicOpts );
9510
 
9511
+ document.addEventListener(
9512
+ 'click',
9513
+ function handleImageUploadClickEvents( event ) {
9514
+ const { target } = event;
9515
+
9516
+ if ( ! target.closest( '.frm_image_preview_wrapper' ) ) {
9517
+ return;
9518
+ }
9519
+
9520
+ if ( target.closest( '.frm_choose_image_box' ) ) {
9521
+ addImageToOption.bind( target )( event );
9522
+ return;
9523
+ }
9524
+
9525
+ if ( target.closest( '.frm_remove_image_option' ) ) {
9526
+ removeImageFromOption.bind( target )( event );
9527
+ }
9528
+ }
9529
+ );
9530
 
9531
  // Close shortcode modal on click.
9532
  formSettings.on( 'mouseup', '*:not(.frm-show-box)', function( e ) {
9533
  e.stopPropagation();
9534
+
9535
  if ( e.target.classList.contains( 'frm-show-box' ) ) {
9536
  return;
9537
  }
9538
+
9539
+ const sidebar = document.getElementById( 'frm_adv_info' );
9540
+ if ( ! sidebar ) {
9541
+ return;
9542
+ }
9543
 
9544
  if ( sidebar.getAttribute( 'data-fills' ) === e.target.id && typeof e.target.id !== 'undefined' ) {
9545
  return;
9546
  }
9547
 
9548
+ const isChild = jQuery( e.target ).closest( '#frm_adv_info' ).length > 0;
9549
+ if ( ! isChild && sidebar.display !== 'none' ) {
9550
  hideShortcodes( sidebar );
9551
  }
9552
  });
languages/formidable.pot CHANGED
@@ -1,15 +1,15 @@
1
- # Copyright (C) 2022 Strategy11
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"
@@ -128,7 +128,7 @@ msgid "Quickly and easily create drag-and-drop forms"
128
  msgstr ""
129
 
130
  #. Author of the plugin
131
- msgid "Strategy11"
132
  msgstr ""
133
 
134
  #: classes/controllers/FrmAddonsController.php:21
@@ -884,9 +884,9 @@ msgid "Activate WP Mail SMTP"
884
  msgstr ""
885
 
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,7 +1234,7 @@ msgstr ""
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,7 +1261,7 @@ msgstr ""
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
 
@@ -1401,257 +1401,361 @@ msgstr ""
1401
  msgid "You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome)."
1402
  msgstr ""
1403
 
1404
- #: classes/helpers/FrmAppHelper.php:2985
1405
  msgid "English"
1406
  msgstr ""
1407
 
1408
- #: classes/helpers/FrmAppHelper.php:2986
1409
  msgid "Afrikaans"
1410
  msgstr ""
1411
 
1412
- #: classes/helpers/FrmAppHelper.php:2987
1413
  msgid "Albanian"
1414
  msgstr ""
1415
 
1416
- #: classes/helpers/FrmAppHelper.php:2988
 
 
 
 
 
 
 
 
1417
  msgid "Arabic"
1418
  msgstr ""
1419
 
1420
- #: classes/helpers/FrmAppHelper.php:2989
1421
  msgid "Armenian"
1422
  msgstr ""
1423
 
1424
- #: classes/helpers/FrmAppHelper.php:2990
1425
  msgid "Azerbaijani"
1426
  msgstr ""
1427
 
1428
- #: classes/helpers/FrmAppHelper.php:2991
1429
  msgid "Basque"
1430
  msgstr ""
1431
 
1432
- #: classes/helpers/FrmAppHelper.php:2992
 
 
 
 
 
 
 
 
1433
  msgid "Bosnian"
1434
  msgstr ""
1435
 
1436
- #: classes/helpers/FrmAppHelper.php:2993
1437
  msgid "Bulgarian"
1438
  msgstr ""
1439
 
1440
- #: classes/helpers/FrmAppHelper.php:2994
1441
  msgid "Catalan"
1442
  msgstr ""
1443
 
1444
- #: classes/helpers/FrmAppHelper.php:2995
1445
  msgid "Chinese Hong Kong"
1446
  msgstr ""
1447
 
1448
- #: classes/helpers/FrmAppHelper.php:2996
1449
  msgid "Chinese Simplified"
1450
  msgstr ""
1451
 
1452
- #: classes/helpers/FrmAppHelper.php:2997
1453
  msgid "Chinese Traditional"
1454
  msgstr ""
1455
 
1456
- #: classes/helpers/FrmAppHelper.php:2998
1457
  msgid "Croatian"
1458
  msgstr ""
1459
 
1460
- #: classes/helpers/FrmAppHelper.php:2999
1461
  msgid "Czech"
1462
  msgstr ""
1463
 
1464
- #: classes/helpers/FrmAppHelper.php:3000
1465
  msgid "Danish"
1466
  msgstr ""
1467
 
1468
- #: classes/helpers/FrmAppHelper.php:3001
1469
  msgid "Dutch"
1470
  msgstr ""
1471
 
1472
- #: classes/helpers/FrmAppHelper.php:3002
1473
  msgid "English/UK"
1474
  msgstr ""
1475
 
1476
- #: classes/helpers/FrmAppHelper.php:3003
1477
  msgid "Esperanto"
1478
  msgstr ""
1479
 
1480
- #: classes/helpers/FrmAppHelper.php:3004
1481
  msgid "Estonian"
1482
  msgstr ""
1483
 
1484
- #: classes/helpers/FrmAppHelper.php:3005
1485
  msgid "Faroese"
1486
  msgstr ""
1487
 
1488
- #: classes/helpers/FrmAppHelper.php:3006
1489
  msgid "Farsi/Persian"
1490
  msgstr ""
1491
 
1492
- #: classes/helpers/FrmAppHelper.php:3007
1493
  msgid "Filipino"
1494
  msgstr ""
1495
 
1496
- #: classes/helpers/FrmAppHelper.php:3008
1497
  msgid "Finnish"
1498
  msgstr ""
1499
 
1500
- #: classes/helpers/FrmAppHelper.php:3009
1501
  msgid "French"
1502
  msgstr ""
1503
 
1504
- #: classes/helpers/FrmAppHelper.php:3010
1505
  msgid "French/Canadian"
1506
  msgstr ""
1507
 
1508
- #: classes/helpers/FrmAppHelper.php:3011
1509
  msgid "French/Swiss"
1510
  msgstr ""
1511
 
1512
- #: classes/helpers/FrmAppHelper.php:3012
 
 
 
 
 
 
 
 
1513
  msgid "German"
1514
  msgstr ""
1515
 
1516
- #: classes/helpers/FrmAppHelper.php:3013
1517
  msgid "German/Austria"
1518
  msgstr ""
1519
 
1520
- #: classes/helpers/FrmAppHelper.php:3014
1521
  msgid "German/Switzerland"
1522
  msgstr ""
1523
 
1524
- #: classes/helpers/FrmAppHelper.php:3015
1525
  msgid "Greek"
1526
  msgstr ""
1527
 
1528
- #: classes/helpers/FrmAppHelper.php:3016
1529
- #: classes/helpers/FrmAppHelper.php:3017
 
 
 
 
1530
  msgid "Hebrew"
1531
  msgstr ""
1532
 
1533
- #: classes/helpers/FrmAppHelper.php:3018
1534
  msgid "Hindi"
1535
  msgstr ""
1536
 
1537
- #: classes/helpers/FrmAppHelper.php:3019
1538
  msgid "Hungarian"
1539
  msgstr ""
1540
 
1541
- #: classes/helpers/FrmAppHelper.php:3020
1542
  msgid "Icelandic"
1543
  msgstr ""
1544
 
1545
- #: classes/helpers/FrmAppHelper.php:3021
1546
  msgid "Indonesian"
1547
  msgstr ""
1548
 
1549
- #: classes/helpers/FrmAppHelper.php:3022
1550
  msgid "Italian"
1551
  msgstr ""
1552
 
1553
- #: classes/helpers/FrmAppHelper.php:3023
1554
  msgid "Japanese"
1555
  msgstr ""
1556
 
1557
- #: classes/helpers/FrmAppHelper.php:3024
 
 
 
 
 
 
 
 
 
 
 
 
1558
  msgid "Korean"
1559
  msgstr ""
1560
 
1561
- #: classes/helpers/FrmAppHelper.php:3025
 
 
 
 
 
 
 
 
1562
  msgid "Latvian"
1563
  msgstr ""
1564
 
1565
- #: classes/helpers/FrmAppHelper.php:3026
1566
  msgid "Lithuanian"
1567
  msgstr ""
1568
 
1569
- #: classes/helpers/FrmAppHelper.php:3027
 
 
 
 
 
 
 
 
 
 
 
 
1570
  msgid "Malaysian"
1571
  msgstr ""
1572
 
1573
- #: classes/helpers/FrmAppHelper.php:3028
 
 
 
 
1574
  msgid "Norwegian"
1575
  msgstr ""
1576
 
1577
- #: classes/helpers/FrmAppHelper.php:3029
 
 
 
 
 
 
 
 
1578
  msgid "Polish"
1579
  msgstr ""
1580
 
1581
- #: classes/helpers/FrmAppHelper.php:3030
1582
  msgid "Portuguese"
1583
  msgstr ""
1584
 
1585
- #: classes/helpers/FrmAppHelper.php:3031
1586
  msgid "Portuguese/Brazilian"
1587
  msgstr ""
1588
 
1589
- #: classes/helpers/FrmAppHelper.php:3032
1590
  msgid "Portuguese/Portugal"
1591
  msgstr ""
1592
 
1593
- #: classes/helpers/FrmAppHelper.php:3033
 
 
 
 
1594
  msgid "Romanian"
1595
  msgstr ""
1596
 
1597
- #: classes/helpers/FrmAppHelper.php:3034
1598
  msgid "Russian"
1599
  msgstr ""
1600
 
1601
- #: classes/helpers/FrmAppHelper.php:3035
1602
- #: classes/helpers/FrmAppHelper.php:3036
1603
  msgid "Serbian"
1604
  msgstr ""
1605
 
1606
- #: classes/helpers/FrmAppHelper.php:3037
 
 
 
 
1607
  msgid "Slovak"
1608
  msgstr ""
1609
 
1610
- #: classes/helpers/FrmAppHelper.php:3038
1611
  msgid "Slovenian"
1612
  msgstr ""
1613
 
1614
- #: classes/helpers/FrmAppHelper.php:3039
1615
  msgid "Spanish"
1616
  msgstr ""
1617
 
1618
- #: classes/helpers/FrmAppHelper.php:3040
1619
  msgid "Spanish/Latin America"
1620
  msgstr ""
1621
 
1622
- #: classes/helpers/FrmAppHelper.php:3041
 
 
 
 
1623
  msgid "Swedish"
1624
  msgstr ""
1625
 
1626
- #: classes/helpers/FrmAppHelper.php:3042
1627
  msgid "Tamil"
1628
  msgstr ""
1629
 
1630
- #: classes/helpers/FrmAppHelper.php:3043
 
 
 
 
1631
  msgid "Thai"
1632
  msgstr ""
1633
 
1634
- #: classes/helpers/FrmAppHelper.php:3044
 
 
 
 
1635
  msgid "Turkish"
1636
  msgstr ""
1637
 
1638
- #: classes/helpers/FrmAppHelper.php:3045
1639
  msgid "Ukrainian"
1640
  msgstr ""
1641
 
1642
- #: classes/helpers/FrmAppHelper.php:3046
 
 
 
 
1643
  msgid "Vietnamese"
1644
  msgstr ""
1645
 
1646
- #: classes/helpers/FrmAppHelper.php:3368
 
 
 
 
 
 
 
 
1647
  msgid "Form Landing Pages"
1648
  msgstr ""
1649
 
1650
- #: classes/helpers/FrmAppHelper.php:3369
1651
  msgid "Easily manage a landing page for your form. Upgrade to get form landing pages."
1652
  msgstr ""
1653
 
1654
- #: classes/helpers/FrmAppHelper.php:3462
1655
  msgid "NEW"
1656
  msgstr ""
1657
 
@@ -1778,7 +1882,7 @@ msgstr ""
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,7 +1894,7 @@ msgstr ""
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,21 +3761,21 @@ 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,7 +3783,7 @@ msgstr[1] ""
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,56 +3791,56 @@ msgstr[0] ""
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
 
@@ -4171,19 +4275,19 @@ msgctxt "Formidable Addon Name"
4171
  msgid "Formidable %s"
4172
  msgstr ""
4173
 
4174
- #: classes/models/FrmPluginSearch.php:314
4175
  msgid "Install Now"
4176
  msgstr ""
4177
 
4178
- #: classes/models/FrmPluginSearch.php:323
4179
  msgid "Learn more"
4180
  msgstr ""
4181
 
4182
- #: classes/models/FrmPluginSearch.php:332
4183
  msgid "Hide this suggestion"
4184
  msgstr ""
4185
 
4186
- #: classes/models/FrmPluginSearch.php:356
4187
  msgid "This suggestion was made by Formidable Forms, the form builder and application plugin already installed on your site."
4188
  msgstr ""
4189
 
@@ -4519,7 +4623,7 @@ msgstr ""
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
 
@@ -4812,7 +4916,7 @@ msgstr ""
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
 
@@ -4941,9 +5045,9 @@ msgid "Move Field"
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,71 +6584,71 @@ msgstr ""
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 ""
1
+ # Copyright (C) 2022 Strategy11 Form Builder Team
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.5\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-31T14:03:22+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"
128
  msgstr ""
129
 
130
  #. Author of the plugin
131
+ msgid "Strategy11 Form Builder Team"
132
  msgstr ""
133
 
134
  #: classes/controllers/FrmAddonsController.php:21
884
  msgstr ""
885
 
886
  #: classes/controllers/FrmSMTPController.php:322
887
+ #: classes/models/FrmPluginSearch.php:306
888
  #: classes/views/addons/settings.php:31
889
+ #: js/formidable_admin.js:5901
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:3668
1238
  msgid "Cancel"
1239
  msgstr ""
1240
 
1261
 
1262
  #: classes/helpers/FrmAppHelper.php:2822
1263
  #: classes/helpers/FrmListHelper.php:412
1264
+ #: js/formidable_admin.js:4060
1265
  msgid "Heads up"
1266
  msgstr ""
1267
 
1401
  msgid "You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome)."
1402
  msgstr ""
1403
 
1404
+ #: classes/helpers/FrmAppHelper.php:2989
1405
  msgid "English"
1406
  msgstr ""
1407
 
1408
+ #: classes/helpers/FrmAppHelper.php:2990
1409
  msgid "Afrikaans"
1410
  msgstr ""
1411
 
1412
+ #: classes/helpers/FrmAppHelper.php:2991
1413
  msgid "Albanian"
1414
  msgstr ""
1415
 
1416
+ #: classes/helpers/FrmAppHelper.php:2992
1417
+ msgid "Algerian Arabic"
1418
+ msgstr ""
1419
+
1420
+ #: classes/helpers/FrmAppHelper.php:2993
1421
+ msgid "Amharic"
1422
+ msgstr ""
1423
+
1424
+ #: classes/helpers/FrmAppHelper.php:2994
1425
  msgid "Arabic"
1426
  msgstr ""
1427
 
1428
+ #: classes/helpers/FrmAppHelper.php:2995
1429
  msgid "Armenian"
1430
  msgstr ""
1431
 
1432
+ #: classes/helpers/FrmAppHelper.php:2996
1433
  msgid "Azerbaijani"
1434
  msgstr ""
1435
 
1436
+ #: classes/helpers/FrmAppHelper.php:2997
1437
  msgid "Basque"
1438
  msgstr ""
1439
 
1440
+ #: classes/helpers/FrmAppHelper.php:2998
1441
+ msgid "Belarusian"
1442
+ msgstr ""
1443
+
1444
+ #: classes/helpers/FrmAppHelper.php:2999
1445
+ msgid "Bengali"
1446
+ msgstr ""
1447
+
1448
+ #: classes/helpers/FrmAppHelper.php:3000
1449
  msgid "Bosnian"
1450
  msgstr ""
1451
 
1452
+ #: classes/helpers/FrmAppHelper.php:3001
1453
  msgid "Bulgarian"
1454
  msgstr ""
1455
 
1456
+ #: classes/helpers/FrmAppHelper.php:3002
1457
  msgid "Catalan"
1458
  msgstr ""
1459
 
1460
+ #: classes/helpers/FrmAppHelper.php:3003
1461
  msgid "Chinese Hong Kong"
1462
  msgstr ""
1463
 
1464
+ #: classes/helpers/FrmAppHelper.php:3004
1465
  msgid "Chinese Simplified"
1466
  msgstr ""
1467
 
1468
+ #: classes/helpers/FrmAppHelper.php:3005
1469
  msgid "Chinese Traditional"
1470
  msgstr ""
1471
 
1472
+ #: classes/helpers/FrmAppHelper.php:3006
1473
  msgid "Croatian"
1474
  msgstr ""
1475
 
1476
+ #: classes/helpers/FrmAppHelper.php:3007
1477
  msgid "Czech"
1478
  msgstr ""
1479
 
1480
+ #: classes/helpers/FrmAppHelper.php:3008
1481
  msgid "Danish"
1482
  msgstr ""
1483
 
1484
+ #: classes/helpers/FrmAppHelper.php:3009
1485
  msgid "Dutch"
1486
  msgstr ""
1487
 
1488
+ #: classes/helpers/FrmAppHelper.php:3010
1489
  msgid "English/UK"
1490
  msgstr ""
1491
 
1492
+ #: classes/helpers/FrmAppHelper.php:3011
1493
  msgid "Esperanto"
1494
  msgstr ""
1495
 
1496
+ #: classes/helpers/FrmAppHelper.php:3012
1497
  msgid "Estonian"
1498
  msgstr ""
1499
 
1500
+ #: classes/helpers/FrmAppHelper.php:3013
1501
  msgid "Faroese"
1502
  msgstr ""
1503
 
1504
+ #: classes/helpers/FrmAppHelper.php:3014
1505
  msgid "Farsi/Persian"
1506
  msgstr ""
1507
 
1508
+ #: classes/helpers/FrmAppHelper.php:3015
1509
  msgid "Filipino"
1510
  msgstr ""
1511
 
1512
+ #: classes/helpers/FrmAppHelper.php:3016
1513
  msgid "Finnish"
1514
  msgstr ""
1515
 
1516
+ #: classes/helpers/FrmAppHelper.php:3017
1517
  msgid "French"
1518
  msgstr ""
1519
 
1520
+ #: classes/helpers/FrmAppHelper.php:3018
1521
  msgid "French/Canadian"
1522
  msgstr ""
1523
 
1524
+ #: classes/helpers/FrmAppHelper.php:3019
1525
  msgid "French/Swiss"
1526
  msgstr ""
1527
 
1528
+ #: classes/helpers/FrmAppHelper.php:3020
1529
+ msgid "Galician"
1530
+ msgstr ""
1531
+
1532
+ #: classes/helpers/FrmAppHelper.php:3021
1533
+ msgid "Georgian"
1534
+ msgstr ""
1535
+
1536
+ #: classes/helpers/FrmAppHelper.php:3022
1537
  msgid "German"
1538
  msgstr ""
1539
 
1540
+ #: classes/helpers/FrmAppHelper.php:3023
1541
  msgid "German/Austria"
1542
  msgstr ""
1543
 
1544
+ #: classes/helpers/FrmAppHelper.php:3024
1545
  msgid "German/Switzerland"
1546
  msgstr ""
1547
 
1548
+ #: classes/helpers/FrmAppHelper.php:3025
1549
  msgid "Greek"
1550
  msgstr ""
1551
 
1552
+ #: classes/helpers/FrmAppHelper.php:3026
1553
+ msgid "Gujarati"
1554
+ msgstr ""
1555
+
1556
+ #: classes/helpers/FrmAppHelper.php:3027
1557
+ #: classes/helpers/FrmAppHelper.php:3028
1558
  msgid "Hebrew"
1559
  msgstr ""
1560
 
1561
+ #: classes/helpers/FrmAppHelper.php:3029
1562
  msgid "Hindi"
1563
  msgstr ""
1564
 
1565
+ #: classes/helpers/FrmAppHelper.php:3030
1566
  msgid "Hungarian"
1567
  msgstr ""
1568
 
1569
+ #: classes/helpers/FrmAppHelper.php:3031
1570
  msgid "Icelandic"
1571
  msgstr ""
1572
 
1573
+ #: classes/helpers/FrmAppHelper.php:3032
1574
  msgid "Indonesian"
1575
  msgstr ""
1576
 
1577
+ #: classes/helpers/FrmAppHelper.php:3033
1578
  msgid "Italian"
1579
  msgstr ""
1580
 
1581
+ #: classes/helpers/FrmAppHelper.php:3034
1582
  msgid "Japanese"
1583
  msgstr ""
1584
 
1585
+ #: classes/helpers/FrmAppHelper.php:3035
1586
+ msgid "Kannada"
1587
+ msgstr ""
1588
+
1589
+ #: classes/helpers/FrmAppHelper.php:3036
1590
+ msgid "Kazakh"
1591
+ msgstr ""
1592
+
1593
+ #: classes/helpers/FrmAppHelper.php:3037
1594
+ msgid "Khmer"
1595
+ msgstr ""
1596
+
1597
+ #: classes/helpers/FrmAppHelper.php:3038
1598
  msgid "Korean"
1599
  msgstr ""
1600
 
1601
+ #: classes/helpers/FrmAppHelper.php:3039
1602
+ msgid "Kyrgyz"
1603
+ msgstr ""
1604
+
1605
+ #: classes/helpers/FrmAppHelper.php:3040
1606
+ msgid "Laothian"
1607
+ msgstr ""
1608
+
1609
+ #: classes/helpers/FrmAppHelper.php:3041
1610
  msgid "Latvian"
1611
  msgstr ""
1612
 
1613
+ #: classes/helpers/FrmAppHelper.php:3042
1614
  msgid "Lithuanian"
1615
  msgstr ""
1616
 
1617
+ #: classes/helpers/FrmAppHelper.php:3043
1618
+ msgid "Luxembourgish"
1619
+ msgstr ""
1620
+
1621
+ #: classes/helpers/FrmAppHelper.php:3044
1622
+ msgid "Macedonian"
1623
+ msgstr ""
1624
+
1625
+ #: classes/helpers/FrmAppHelper.php:3045
1626
+ msgid "Malayalam"
1627
+ msgstr ""
1628
+
1629
+ #: classes/helpers/FrmAppHelper.php:3046
1630
  msgid "Malaysian"
1631
  msgstr ""
1632
 
1633
+ #: classes/helpers/FrmAppHelper.php:3047
1634
+ msgid "Marathi"
1635
+ msgstr ""
1636
+
1637
+ #: classes/helpers/FrmAppHelper.php:3048
1638
  msgid "Norwegian"
1639
  msgstr ""
1640
 
1641
+ #: classes/helpers/FrmAppHelper.php:3049
1642
+ msgid "Norwegian Bokmål"
1643
+ msgstr ""
1644
+
1645
+ #: classes/helpers/FrmAppHelper.php:3050
1646
+ msgid "Norwegian Nynorsk"
1647
+ msgstr ""
1648
+
1649
+ #: classes/helpers/FrmAppHelper.php:3051
1650
  msgid "Polish"
1651
  msgstr ""
1652
 
1653
+ #: classes/helpers/FrmAppHelper.php:3052
1654
  msgid "Portuguese"
1655
  msgstr ""
1656
 
1657
+ #: classes/helpers/FrmAppHelper.php:3053
1658
  msgid "Portuguese/Brazilian"
1659
  msgstr ""
1660
 
1661
+ #: classes/helpers/FrmAppHelper.php:3054
1662
  msgid "Portuguese/Portugal"
1663
  msgstr ""
1664
 
1665
+ #: classes/helpers/FrmAppHelper.php:3055
1666
+ msgid "Romansh"
1667
+ msgstr ""
1668
+
1669
+ #: classes/helpers/FrmAppHelper.php:3056
1670
  msgid "Romanian"
1671
  msgstr ""
1672
 
1673
+ #: classes/helpers/FrmAppHelper.php:3057
1674
  msgid "Russian"
1675
  msgstr ""
1676
 
1677
+ #: classes/helpers/FrmAppHelper.php:3058
1678
+ #: classes/helpers/FrmAppHelper.php:3059
1679
  msgid "Serbian"
1680
  msgstr ""
1681
 
1682
+ #: classes/helpers/FrmAppHelper.php:3060
1683
+ msgid "Sinhalese"
1684
+ msgstr ""
1685
+
1686
+ #: classes/helpers/FrmAppHelper.php:3061
1687
  msgid "Slovak"
1688
  msgstr ""
1689
 
1690
+ #: classes/helpers/FrmAppHelper.php:3062
1691
  msgid "Slovenian"
1692
  msgstr ""
1693
 
1694
+ #: classes/helpers/FrmAppHelper.php:3063
1695
  msgid "Spanish"
1696
  msgstr ""
1697
 
1698
+ #: classes/helpers/FrmAppHelper.php:3064
1699
  msgid "Spanish/Latin America"
1700
  msgstr ""
1701
 
1702
+ #: classes/helpers/FrmAppHelper.php:3065
1703
+ msgid "Swahili"
1704
+ msgstr ""
1705
+
1706
+ #: classes/helpers/FrmAppHelper.php:3066
1707
  msgid "Swedish"
1708
  msgstr ""
1709
 
1710
+ #: classes/helpers/FrmAppHelper.php:3067
1711
  msgid "Tamil"
1712
  msgstr ""
1713
 
1714
+ #: classes/helpers/FrmAppHelper.php:3068
1715
+ msgid "Telugu"
1716
+ msgstr ""
1717
+
1718
+ #: classes/helpers/FrmAppHelper.php:3069
1719
  msgid "Thai"
1720
  msgstr ""
1721
 
1722
+ #: classes/helpers/FrmAppHelper.php:3070
1723
+ msgid "Tajiki"
1724
+ msgstr ""
1725
+
1726
+ #: classes/helpers/FrmAppHelper.php:3071
1727
  msgid "Turkish"
1728
  msgstr ""
1729
 
1730
+ #: classes/helpers/FrmAppHelper.php:3072
1731
  msgid "Ukrainian"
1732
  msgstr ""
1733
 
1734
+ #: classes/helpers/FrmAppHelper.php:3073
1735
+ msgid "Urdu"
1736
+ msgstr ""
1737
+
1738
+ #: classes/helpers/FrmAppHelper.php:3074
1739
  msgid "Vietnamese"
1740
  msgstr ""
1741
 
1742
+ #: classes/helpers/FrmAppHelper.php:3075
1743
+ msgid "Welsh"
1744
+ msgstr ""
1745
+
1746
+ #: classes/helpers/FrmAppHelper.php:3076
1747
+ msgid "Zulu"
1748
+ msgstr ""
1749
+
1750
+ #: classes/helpers/FrmAppHelper.php:3409
1751
  msgid "Form Landing Pages"
1752
  msgstr ""
1753
 
1754
+ #: classes/helpers/FrmAppHelper.php:3410
1755
  msgid "Easily manage a landing page for your form. Upgrade to get form landing pages."
1756
  msgstr ""
1757
 
1758
+ #: classes/helpers/FrmAppHelper.php:3503
1759
  msgid "NEW"
1760
  msgstr ""
1761
 
1882
  #: classes/helpers/FrmFormsHelper.php:1188
1883
  #: classes/helpers/FrmFormsListHelper.php:133
1884
  #: classes/views/frm-form-actions/form_action.php:25
1885
+ #: js/formidable_admin.js:2033
1886
  msgid "Delete"
1887
  msgstr ""
1888
 
1894
  #. translators: %s: The field name.
1895
  #: classes/helpers/FrmFieldsHelper.php:167
1896
  #: classes/helpers/FrmFieldsHelper.php:294
1897
+ #: classes/helpers/FrmXMLHelper.php:1396
1898
  #: classes/models/fields/FrmFieldType.php:583
1899
  msgid "%s is invalid"
1900
  msgstr ""
3761
  msgid "Your server is missing the simplexml_import_dom function"
3762
  msgstr ""
3763
 
3764
+ #: classes/helpers/FrmXMLHelper.php:1209
3765
  #: classes/views/solutions/_import.php:51
3766
  msgid "Imported"
3767
  msgstr ""
3768
 
3769
+ #: classes/helpers/FrmXMLHelper.php:1210
3770
  msgid "Updated"
3771
  msgstr ""
3772
 
3773
+ #: classes/helpers/FrmXMLHelper.php:1235
3774
  msgid "Nothing was imported or updated"
3775
  msgstr ""
3776
 
3777
  #. translators: %1$s: Number of items
3778
+ #: classes/helpers/FrmXMLHelper.php:1262
3779
  msgid "%1$s Form"
3780
  msgid_plural "%1$s Forms"
3781
  msgstr[0] ""
3783
 
3784
  #. translators: %1$s: Number of items
3785
  #. translators: %1$s - field type
3786
+ #: classes/helpers/FrmXMLHelper.php:1264
3787
  #: classes/models/FrmFormMigrator.php:584
3788
  msgid "%1$s Field"
3789
  msgid_plural "%1$s Fields"
3791
  msgstr[1] ""
3792
 
3793
  #. translators: %1$s: Number of items
3794
+ #: classes/helpers/FrmXMLHelper.php:1266
3795
  msgid "%1$s Entry"
3796
  msgid_plural "%1$s Entries"
3797
  msgstr[0] ""
3798
  msgstr[1] ""
3799
 
3800
  #. translators: %1$s: Number of items
3801
+ #: classes/helpers/FrmXMLHelper.php:1268
3802
  msgid "%1$s View"
3803
  msgid_plural "%1$s Views"
3804
  msgstr[0] ""
3805
  msgstr[1] ""
3806
 
3807
  #. translators: %1$s: Number of items
3808
+ #: classes/helpers/FrmXMLHelper.php:1270
3809
  msgid "%1$s Page/Post"
3810
  msgid_plural "%1$s Pages/Posts"
3811
  msgstr[0] ""
3812
  msgstr[1] ""
3813
 
3814
  #. translators: %1$s: Number of items
3815
+ #: classes/helpers/FrmXMLHelper.php:1272
3816
  msgid "%1$s Style"
3817
  msgid_plural "%1$s Styles"
3818
  msgstr[0] ""
3819
  msgstr[1] ""
3820
 
3821
  #. translators: %1$s: Number of items
3822
+ #: classes/helpers/FrmXMLHelper.php:1274
3823
  msgid "%1$s Term"
3824
  msgid_plural "%1$s Terms"
3825
  msgstr[0] ""
3826
  msgstr[1] ""
3827
 
3828
  #. translators: %1$s: Number of items
3829
+ #: classes/helpers/FrmXMLHelper.php:1276
3830
  msgid "%1$s Form Action"
3831
  msgid_plural "%1$s Form Actions"
3832
  msgstr[0] ""
3833
  msgstr[1] ""
3834
 
3835
+ #: classes/helpers/FrmXMLHelper.php:1314
3836
  msgid "Go to imported form"
3837
  msgstr ""
3838
 
3839
+ #: classes/helpers/FrmXMLHelper.php:1515
3840
  msgid "Create Posts"
3841
  msgstr ""
3842
 
3843
+ #: classes/helpers/FrmXMLHelper.php:1644
3844
  msgid "Email Notification"
3845
  msgstr ""
3846
 
4275
  msgid "Formidable %s"
4276
  msgstr ""
4277
 
4278
+ #: classes/models/FrmPluginSearch.php:313
4279
  msgid "Install Now"
4280
  msgstr ""
4281
 
4282
+ #: classes/models/FrmPluginSearch.php:322
4283
  msgid "Learn more"
4284
  msgstr ""
4285
 
4286
+ #: classes/models/FrmPluginSearch.php:331
4287
  msgid "Hide this suggestion"
4288
  msgstr ""
4289
 
4290
+ #: classes/models/FrmPluginSearch.php:355
4291
  msgid "This suggestion was made by Formidable Forms, the form builder and application plugin already installed on your site."
4292
  msgstr ""
4293
 
4623
  #: classes/views/frm-fields/back-end/inline-modal.php:7
4624
  #: classes/views/frm-fields/back-end/inline-modal.php:8
4625
  #: classes/views/shared/admin-header.php:11
4626
+ #: js/formidable_admin.js:8020
4627
  msgid "Close"
4628
  msgstr ""
4629
 
4916
 
4917
  #: classes/views/frm-form-actions/form_action.php:21
4918
  #: classes/views/styles/_upsell-multiple-styles.php:15
4919
+ #: js/formidable_admin.js:2039
4920
  msgid "Duplicate"
4921
  msgstr ""
4922
 
5045
  msgstr ""
5046
 
5047
  #: classes/views/frm-forms/add_field.php:29
5048
+ #: js/formidable_admin.js:1250
5049
+ #: js/formidable_admin.js:1253
5050
+ #: js/formidable_admin.js:1977
5051
  msgid "More Options"
5052
  msgstr ""
5053
 
6584
  msgid "Successfully copied embed example"
6585
  msgstr ""
6586
 
6587
+ #: js/formidable_admin.js:1211
6588
  msgid "Set Row Layout"
6589
  msgstr ""
6590
 
6591
+ #: js/formidable_admin.js:1218
6592
  msgid "Move Field Group"
6593
  msgstr ""
6594
 
6595
+ #: js/formidable_admin.js:2005
6596
  msgid "Field settings"
6597
  msgstr ""
6598
 
6599
+ #: js/formidable_admin.js:2033
6600
  msgid "Delete Group"
6601
  msgstr ""
6602
 
6603
+ #: js/formidable_admin.js:2039
6604
  msgid "Duplicate Group"
6605
  msgstr ""
6606
 
6607
+ #: js/formidable_admin.js:3375
6608
  msgid "Custom layout"
6609
  msgstr ""
6610
 
6611
+ #: js/formidable_admin.js:3398
6612
  msgid "Break into rows"
6613
  msgstr ""
6614
 
6615
+ #: js/formidable_admin.js:3408
6616
  msgid "Row Layout"
6617
  msgstr ""
6618
 
6619
+ #: js/formidable_admin.js:3653
6620
  msgid "Enter number of columns for each field"
6621
  msgstr ""
6622
 
6623
+ #: js/formidable_admin.js:3657
6624
  msgid "Layouts are based on a 12-column grid system"
6625
  msgstr ""
6626
 
6627
+ #: js/formidable_admin.js:3673
6628
  msgid "Save"
6629
  msgstr ""
6630
 
6631
+ #: js/formidable_admin.js:3974
6632
  msgid "Merge into row"
6633
  msgstr ""
6634
 
6635
  #. translators: %1$s: Number of fields that are selected to be deleted.
6636
+ #: js/formidable_admin.js:4062
6637
  msgid "Are you sure you want to delete these %1$s selected fields?"
6638
  msgstr ""
6639
 
6640
+ #: js/formidable_admin.js:5186
6641
  msgid "Duplicate option value \"%s\" detected"
6642
  msgstr ""
6643
 
6644
+ #: js/formidable_admin.js:7287
6645
  msgid "Ready Made Solution"
6646
  msgstr ""
6647
 
6648
+ #: js/formidable_admin.js:7290
6649
  msgid "Check all applications"
6650
  msgstr ""
6651
 
6652
+ #: js/formidable_admin.js:8005
6653
  msgid "Save and Reload"
6654
  msgstr ""
readme.txt CHANGED
@@ -1,31 +1,33 @@
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
 
@@ -41,19 +43,19 @@ 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
 
 
 
48
  == Complete Entry Management for Web Forms and Surveys ==
49
 
50
- Formidable allows you to view all your quiz and survey entries right from your WordPress dashboard. When a user submits a web form, it's stored in your WordPress database so you won’t lose any leads.
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
 
@@ -65,9 +67,9 @@ By default, a single styling template is created. If you want a custom form styl
65
 
66
  == Build Smart Surveys with Beautiful Reports ==
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
 
@@ -83,7 +85,7 @@ Then, our marketing integrations and APIs can send the data anywhere you want.
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
 
@@ -182,14 +184,14 @@ Since Formidable is not your average form plugin, this feature list is going to
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.
@@ -438,6 +440,14 @@ Using our Zapier integration, you can easily connect your website with over 1000
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.
@@ -501,7 +511,7 @@ See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zap
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
 
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, form builder, survey, free, custom form, contact form, 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, drag and drop, mailchimp form
5
  Requires at least: 5.2
6
+ Tested up to: 6.0.2
7
  Requires PHP: 5.6
8
+ Stable tag: 5.4.5
9
 
10
+ The most advanced WordPress forms plugin. Go beyond contact forms with our drag and 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. You can use our drag and 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 WP 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 powerful features, 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 Pro 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, and cascading dropdown fields. Don't forget the calculated fields, front-end form editing, and powerful web application builder.
25
+ >
26
+ > With Formidable Pro, you get far more than just a contact form plugin. <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
+ > Or start by checking out the <a href="https://formidableforms.com/knowledgebase/what-is-the-difference-between-the-lite-free-and-pro-version/?utm_source=wprepo&utm_medium=link&utm_campaign=liteversion">full feature comparison</a> for Lite vs Pro.
29
 
30
+ You can start with our pre-built templates or create totally custom forms from scratch. All with an easy-to-use drag and drop form maker interface.
31
 
32
  https://youtu.be/7X2BqhRsXcg
33
 
43
 
44
  == Drag & Drop Form Maker ==
45
 
 
 
46
  Our form maker comes with all the powerful fields that you need to create a solution-focused form, fast!
47
 
48
+ Formidable drag and drop forms allow you to quickly build unlimited surveys, quizzes, price calculators, and whatever else you need.
49
+
50
  == Complete Entry Management for Web Forms and Surveys ==
51
 
52
+ When a user submits a web form, it's stored in your WordPress database so you won’t lose any leads. Formidable allows you to view all your quiz and survey entries right from your WordPress dashboard (even in the free version!).
53
 
54
+ Even though the entries are saved, it's still a **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.
55
 
56
  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.
57
 
58
+ You can also configure unlimited email notifications and autoresponders triggered by submissions.
59
 
60
  On top of that, you can easily customize the success message after a form is submitted, or redirect visitors to another page.
61
 
67
 
68
  == Build Smart Surveys with Beautiful Reports ==
69
 
70
+ Formidable Pro includes an intuitive 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.
71
 
72
+ 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. Beautiful reports will be waiting for you, or create your own customized graphs. Our graphs and reports will help you analyze and showcase data.
73
 
74
  You can even showcase data on the front-end of your website. Just embed graphs in your WordPress posts or pages.
75
 
85
 
86
  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.
87
 
88
+ We offer seamless integration with PayPal, Stripe, and Authorize.net, so you can create an order form, donation form, or purchase form.
89
 
90
  You can even create a WooCommerce form with custom fields.
91
 
184
  * Permissions. Lock visibility and access based on user role.
185
  * Entry limits. Limit surveys, registration forms, bookings, quizzes, or directory submissions to only allow one entry per user, IP, or cookie.
186
  * Form scheduling. Open and close event registration and signup forms on a specific date. Or close forms when the seat limit has been reached.
187
+ * Conditionally redirect after a custom search form, feedback form, support ticket form, registration 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.
188
+ * 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 and drop forms. Our team labors for simplicity without sacrificing flexibility.
189
  * <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.
190
  * 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.
191
  * 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.
192
  * <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.
193
  * <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.
194
+ * WCAG accessible forms with A11Y and ADA compliance. Ensure your survey, lead capture form, consent form, donation form, and quizzes are compliant and available to everyone. Allow those using screenreaders to successfully use your WordPress site.
195
  * <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.
196
  * <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.
197
  * <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.
440
  See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
441
 
442
  == Changelog ==
443
+ = 5.4.5 =
444
+ * New: Added support for several new language options for datepicker localization and for reCAPTCHA.
445
+ * New: Updated deprecated code in Elementor widget for better compatibility with new versions of Elementor.
446
+ * Fix: Actions that trigger when an entry is deleted were not properly working when conditional logic would check item meta values.
447
+ * Fix: An imported application page's parent page ID was not updating to match the new imported parent page ID.
448
+ * Fix: Clicking save while a field was still being inserted would cause an error pop up to appear with a missing message.
449
+ * Removed a restriction that was preventing a second summary field from being added after adding the first.
450
+
451
  = 5.4.4 =
452
  * 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.
453
  * New: Added a new frm_before_duplicate_entry_values filter for customizing the data of a duplicated entry before it is saved.
511
  = 5.2.06 =
512
  * New: The step value for number fields is now validated server side on submission.
513
 
514
+ = 5.2.05 =
515
  * 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.
516
  * New: Added a new frm_include_alert_role_on_field_errors filter to toggle the alert role that gets added to field errors.
517