Formidable Forms – Form Builder for WordPress - Version 4.11

Version Description

  • New: Added a quick and easy Name field with options for First, Middle, and Last names.
  • New: Added a more powerful spam protection using JavaScript. This can be turned on in the settings for each form.
  • New: Added Honeypot options to form settings and changed the default Honeypot behaviour to avoid the false positives some people are seeing on mobile devices.
  • New: Added a frm_process_honeypot filter for gracefully handling honeypot spam.
  • Fix: A warning was getting logged when exporting a form as XML.
Download this release

Release Info

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

Code changes from version 4.10.03 to 4.11

classes/controllers/FrmFormsController.php CHANGED
@@ -136,13 +136,29 @@ class FrmFormsController {
136
 
137
  do_action( 'frm_before_update_form_settings', $id );
138
 
 
 
139
  FrmForm::update( $id, $_POST );
140
 
 
 
 
 
 
141
  $message = __( 'Settings Successfully Updated', 'formidable' );
142
 
143
  return self::get_settings_vars( $id, array(), compact( 'message', 'warnings' ) );
144
  }
145
 
 
 
 
 
 
 
 
 
 
146
  public static function update( $values = array() ) {
147
  if ( empty( $values ) ) {
148
  $values = $_POST;
@@ -1116,7 +1132,18 @@ class FrmFormsController {
1116
  public static function advanced_settings( $values ) {
1117
  $first_h3 = 'frm_first_h3';
1118
 
1119
- include( FrmAppHelper::plugin_path() . '/classes/views/frm-forms/settings-advanced.php' );
 
 
 
 
 
 
 
 
 
 
 
1120
  }
1121
 
1122
  /**
136
 
137
  do_action( 'frm_before_update_form_settings', $id );
138
 
139
+ $antispam_was_on = self::antispam_was_on( $id );
140
+
141
  FrmForm::update( $id, $_POST );
142
 
143
+ $antispam_is_on = ! empty( $_POST['options']['antispam'] );
144
+ if ( $antispam_is_on !== $antispam_was_on ) {
145
+ FrmAntiSpam::clear_caches();
146
+ }
147
+
148
  $message = __( 'Settings Successfully Updated', 'formidable' );
149
 
150
  return self::get_settings_vars( $id, array(), compact( 'message', 'warnings' ) );
151
  }
152
 
153
+ /**
154
+ * @param int $form_id
155
+ * @return bool
156
+ */
157
+ private static function antispam_was_on( $form_id ) {
158
+ $form = FrmForm::getOne( $form_id );
159
+ return ! empty( $form->options['antispam'] );
160
+ }
161
+
162
  public static function update( $values = array() ) {
163
  if ( empty( $values ) ) {
164
  $values = $_POST;
1132
  public static function advanced_settings( $values ) {
1133
  $first_h3 = 'frm_first_h3';
1134
 
1135
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/settings-advanced.php';
1136
+ }
1137
+
1138
+ /**
1139
+ * @param array $values
1140
+ */
1141
+ private static function render_spam_settings( $values ) {
1142
+ if ( function_exists( 'akismet_http_post' ) ) {
1143
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/akismet.php';
1144
+ }
1145
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/honeypot.php';
1146
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/antispam.php';
1147
  }
1148
 
1149
  /**
classes/controllers/FrmHooksController.php CHANGED
@@ -84,6 +84,12 @@ class FrmHooksController {
84
 
85
  add_filter( 'cron_schedules', 'FrmUsageController::add_schedules' );
86
  add_action( 'formidable_send_usage', 'FrmUsageController::send_snapshot' );
 
 
 
 
 
 
87
  }
88
 
89
  public static function load_admin_hooks() {
84
 
85
  add_filter( 'cron_schedules', 'FrmUsageController::add_schedules' );
86
  add_action( 'formidable_send_usage', 'FrmUsageController::send_snapshot' );
87
+
88
+ /**
89
+ * Make name field work with View.
90
+ * FrmProContent::replace_single_shortcode() applies this filter like 'frm_keep_' . $field->type . '_value_array'
91
+ */
92
+ add_filter( 'frm_keep_name_value_array', '__return_true' );
93
  }
94
 
95
  public static function load_admin_hooks() {
classes/factories/FrmFieldFactory.php CHANGED
@@ -99,6 +99,7 @@ class FrmFieldFactory {
99
  'html' => 'FrmFieldHTML',
100
  'hidden' => 'FrmFieldHidden',
101
  'captcha' => 'FrmFieldCaptcha',
 
102
  );
103
 
104
  $class = isset( $type_classes[ $field_type ] ) ? $type_classes[ $field_type ] : '';
99
  'html' => 'FrmFieldHTML',
100
  'hidden' => 'FrmFieldHidden',
101
  'captcha' => 'FrmFieldCaptcha',
102
+ 'name' => 'FrmFieldName',
103
  );
104
 
105
  $class = isset( $type_classes[ $field_type ] ) ? $type_classes[ $field_type ] : '';
classes/helpers/FrmAppHelper.php CHANGED
@@ -11,7 +11,7 @@ class FrmAppHelper {
11
  /**
12
  * @since 2.0
13
  */
14
- public static $plug_version = '4.10.03';
15
 
16
  /**
17
  * @since 1.07.02
11
  /**
12
  * @since 2.0
13
  */
14
+ public static $plug_version = '4.11';
15
 
16
  /**
17
  * @since 1.07.02
classes/helpers/FrmCSVExportHelper.php CHANGED
@@ -121,6 +121,11 @@ class FrmCSVExportHelper {
121
  }
122
 
123
  private static function field_headings( $col ) {
 
 
 
 
 
124
  $field_headings = array();
125
  $separate_values = array( 'user_id', 'file', 'data', 'date' );
126
  if ( isset( $col->field_options['separate_value'] ) && $col->field_options['separate_value'] && ! in_array( $col->type, $separate_values, true ) ) {
@@ -154,9 +159,11 @@ class FrmCSVExportHelper {
154
  }
155
 
156
  $fields_by_repeater_id[ $repeater_id ][] = $col;
157
- } else {
158
- $headings += self::field_headings( $col );
159
  }
 
 
160
  }
161
  unset( $repeater_id, $col );
162
 
@@ -413,6 +420,18 @@ class FrmCSVExportHelper {
413
  private static function add_array_values_to_columns( &$row, $atts ) {
414
  if ( is_array( $atts['field_value'] ) ) {
415
  foreach ( $atts['field_value'] as $key => $sub_value ) {
 
 
 
 
 
 
 
 
 
 
 
 
416
  $column_key = $atts['col']->id . '_' . $key;
417
  if ( ! is_numeric( $key ) && isset( self::$headings[ $column_key ] ) ) {
418
  $row[ $column_key ] = $sub_value;
121
  }
122
 
123
  private static function field_headings( $col ) {
124
+ $field_type_obj = FrmFieldFactory::get_field_factory( $col );
125
+ if ( ! empty( $field_type_obj->is_combo_field ) ) { // This is combo field.
126
+ return $field_type_obj->get_export_headings();
127
+ }
128
+
129
  $field_headings = array();
130
  $separate_values = array( 'user_id', 'file', 'data', 'date' );
131
  if ( isset( $col->field_options['separate_value'] ) && $col->field_options['separate_value'] && ! in_array( $col->type, $separate_values, true ) ) {
159
  }
160
 
161
  $fields_by_repeater_id[ $repeater_id ][] = $col;
162
+
163
+ continue;
164
  }
165
+
166
+ $headings += self::field_headings( $col );
167
  }
168
  unset( $repeater_id, $col );
169
 
420
  private static function add_array_values_to_columns( &$row, $atts ) {
421
  if ( is_array( $atts['field_value'] ) ) {
422
  foreach ( $atts['field_value'] as $key => $sub_value ) {
423
+ if ( is_array( $sub_value ) ) {
424
+ // This is combo field inside repeater. The heading key has this format: [86_first[0]].
425
+ foreach ( $sub_value as $sub_key => $sub_sub_value ) {
426
+ $column_key = $atts['col']->id . '_' . $sub_key . '[' . $key . ']';
427
+ if ( ! is_numeric( $sub_key ) && isset( self::$headings[ $column_key ] ) ) {
428
+ $row[ $column_key ] = $sub_sub_value;
429
+ }
430
+ }
431
+
432
+ continue;
433
+ }
434
+
435
  $column_key = $atts['col']->id . '_' . $key;
436
  if ( ! is_numeric( $key ) && isset( self::$headings[ $column_key ] ) ) {
437
  $row[ $column_key ] = $sub_value;
classes/helpers/FrmFormsHelper.php CHANGED
@@ -365,6 +365,8 @@ class FrmFormsHelper {
365
  'success_msg' => $frm_settings->success_msg,
366
  'show_form' => 0,
367
  'akismet' => '',
 
 
368
  'no_save' => 0,
369
  'ajax_load' => 0,
370
  'js_validate' => 0,
365
  'success_msg' => $frm_settings->success_msg,
366
  'show_form' => 0,
367
  'akismet' => '',
368
+ 'honeypot' => 'basic',
369
+ 'antispam' => 0,
370
  'no_save' => 0,
371
  'ajax_load' => 0,
372
  'js_validate' => 0,
classes/helpers/FrmXMLHelper.php CHANGED
@@ -1202,15 +1202,11 @@ class FrmXMLHelper {
1202
  * @since 3.06
1203
  */
1204
  private static function remove_defaults( $defaults, &$saved ) {
1205
- $array_defaults = array_filter( $defaults, 'is_array' );
1206
- foreach ( $array_defaults as $d => $default ) {
1207
- // compare array defaults
1208
- if ( $default == $saved[ $d ] ) {
1209
- unset( $saved[ $d ] );
1210
  }
1211
- unset( $defaults[ $d ] );
1212
  }
1213
- $saved = array_diff_assoc( (array) $saved, $defaults );
1214
  }
1215
 
1216
  /**
1202
  * @since 3.06
1203
  */
1204
  private static function remove_defaults( $defaults, &$saved ) {
1205
+ foreach ( $saved as $key => $value ) {
1206
+ if ( isset( $defaults[ $key ] ) && $defaults[ $key ] === $value ) {
1207
+ unset( $saved[ $key ] );
 
 
1208
  }
 
1209
  }
 
1210
  }
1211
 
1212
  /**
classes/models/FrmAntiSpam.php ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+
6
+ /**
7
+ * Class FrmAntiSpam.
8
+ *
9
+ * This token class generates tokens that are used in our Anti-Spam checking.
10
+ *
11
+ * @since xx.xx
12
+ */
13
+ class FrmAntiSpam extends FrmValidate {
14
+
15
+ /**
16
+ * @return string
17
+ */
18
+ protected function get_option_key() {
19
+ return 'antispam';
20
+ }
21
+
22
+ /**
23
+ * @param int $form_id
24
+ */
25
+ public static function maybe_init( $form_id ) {
26
+ $antispam = new self( $form_id );
27
+ if ( $antispam->run_antispam() ) {
28
+ $antispam->init();
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Initialise the actions for the Anti-spam.
34
+ *
35
+ * @since xx.xx
36
+ */
37
+ public function init() {
38
+ add_filter( 'frm_form_attributes', array( $this, 'add_token_to_form' ), 10, 1 );
39
+ add_filter( 'frm_form_div_attributes', array( $this, 'add_token_to_form' ), 10, 1 );
40
+ }
41
+
42
+ /**
43
+ * Return a valid token.
44
+ *
45
+ * @since xx.xx
46
+ *
47
+ * @param mixed $current True to use current time, otherwise a timestamp string.
48
+ *
49
+ * @return string Token.
50
+ */
51
+ private function get( $current = true ) {
52
+ // If $current was not passed, or it is true, we use the current timestamp.
53
+ // If $current was passed in as a string, we'll use that passed in timestamp.
54
+ if ( $current !== true ) {
55
+ $time = $current;
56
+ } else {
57
+ $time = time();
58
+ }
59
+
60
+ // Format the timestamp to be less exact, as we want to deal in days.
61
+ // June 19th, 2020 would get formatted as: 1906202017125.
62
+ // Day of the month, month number, year, day number of the year, week number of the year.
63
+ $token_date = gmdate( 'dmYzW', $time );
64
+
65
+ // Combine our token date and our token salt, and md5 it.
66
+ $form_token_string = md5( $token_date . $this->get_antispam_secret_key() );
67
+
68
+ return $form_token_string;
69
+ }
70
+
71
+ private function get_antispam_secret_key() {
72
+ $secret_key = get_option( 'frm_antispam_secret_key' );
73
+
74
+ // If we already have the secret, send it back.
75
+ if ( false !== $secret_key ) {
76
+ return base64_decode( $secret_key ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
77
+ }
78
+
79
+ // We don't have a secret, so let's generate one.
80
+ $secret_key = is_callable( 'sodium_crypto_secretbox_keygen' ) ? sodium_crypto_secretbox_keygen() : wp_generate_password( 32, true, true );
81
+ add_option( 'frm_antispam_secret_key', base64_encode( $secret_key ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
82
+
83
+ return $secret_key;
84
+ }
85
+
86
+ /**
87
+ * Generate the array of valid tokens to check for. These include two days
88
+ * before the current date to account for long cache times.
89
+ *
90
+ * These two filters are available if a user wants to extend the times.
91
+ * 'frm_form_token_check_before_today'
92
+ * 'frm_form_token_check_after_today'
93
+ *
94
+ * @since xx.xx
95
+ *
96
+ * @return array Array of all valid tokens to check against.
97
+ */
98
+ private function get_valid_tokens() {
99
+ $current_date = time();
100
+
101
+ // Create our array of times to check before today. A user with a longer
102
+ // cache time can extend this. A user with a shorter cache time can remove times.
103
+ $valid_token_times_before = apply_filters(
104
+ 'frm_form_token_check_before_today',
105
+ array(
106
+ ( 2 * DAY_IN_SECONDS ), // Two days ago.
107
+ ( 1 * DAY_IN_SECONDS ), // One day ago.
108
+ )
109
+ );
110
+
111
+ // Mostly to catch edge cases like the form page loading and submitting on two different days.
112
+ // This probably won't be filtered by users too much, but they could extend it.
113
+ $valid_token_times_after = apply_filters(
114
+ 'frm_form_token_check_after_today',
115
+ array(
116
+ ( 45 * MINUTE_IN_SECONDS ), // Add in 45 minutes past today to catch some midnight edge cases.
117
+ )
118
+ );
119
+
120
+ // Built up our valid tokens.
121
+ $valid_tokens = array();
122
+
123
+ // Add in all the previous times we check.
124
+ foreach ( $valid_token_times_before as $time ) {
125
+ $valid_tokens[] = $this->get( $current_date - $time );
126
+ }
127
+
128
+ // Add in our current date.
129
+ $valid_tokens[] = $this->get( $current_date );
130
+
131
+ // Add in the times after our check.
132
+ foreach ( $valid_token_times_after as $time ) {
133
+ $valid_tokens[] = $this->get( $current_date + $time );
134
+ }
135
+
136
+ return $valid_tokens;
137
+ }
138
+
139
+ /**
140
+ * Check if the given token is valid or not.
141
+ *
142
+ * Tokens are valid for some period of time (see frm_token_validity_in_hours
143
+ * and frm_token_validity_in_days to extend the validation period).
144
+ * By default tokens are valid for day.
145
+ *
146
+ * @since xx.xx
147
+ *
148
+ * @param string $token Token to validate.
149
+ *
150
+ * @return bool Whether the token is valid or not.
151
+ */
152
+ private function verify( $token ) {
153
+ // Check to see if our token is inside of the valid tokens.
154
+ return in_array( $token, $this->get_valid_tokens(), true );
155
+ }
156
+
157
+ /**
158
+ * Add the token field to the form.
159
+ *
160
+ * @since xx.xx
161
+ *
162
+ * @param string $attributes
163
+ *
164
+ * @return string
165
+ */
166
+ public function add_token_to_form( $attributes ) {
167
+ $attributes .= ' data-token="' . esc_attr( $this->get() ) . '"';
168
+ return $attributes;
169
+ }
170
+
171
+ /**
172
+ * @param int $form_id
173
+ */
174
+ public static function maybe_echo_token( $form_id ) {
175
+ $antispam = new self( $form_id );
176
+ if ( $antispam->run_antispam() ) {
177
+ echo 'data-token="' . esc_attr( $antispam->get() ) . '"';
178
+ }
179
+ }
180
+
181
+ /**
182
+ * @return bool
183
+ */
184
+ public function run_antispam() {
185
+ return $this->is_option_on() && apply_filters( 'frm_run_antispam', true, $this->form_id );
186
+ }
187
+
188
+ /**
189
+ * Validate Anti-spam if enabled.
190
+ *
191
+ * @since xx.xx
192
+ *
193
+ * @return bool|string True or a string with the error.
194
+ */
195
+ public function validate() {
196
+ if ( ! $this->run_antispam() ) {
197
+ return true;
198
+ }
199
+
200
+ $token = FrmAppHelper::get_param( 'antispam_token', '', 'post', 'sanitize_text_field' );
201
+
202
+ // If the antispam setting is enabled and we don't have a token, bail.
203
+ if ( ! $token ) {
204
+ if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) ) {
205
+ // add an exception for the entries page.
206
+ return true;
207
+ }
208
+ return $this->process_antispam_filter( $this->get_missing_token_message() );
209
+ }
210
+
211
+ // Verify the token.
212
+ if ( ! $this->verify( $token ) ) {
213
+ return $this->process_antispam_filter( $this->get_invalid_token_message() );
214
+ }
215
+
216
+ return $this->process_antispam_filter( true );
217
+ }
218
+
219
+ /**
220
+ * @return bool True if saving a draft.
221
+ */
222
+ private function is_saving_a_draft() {
223
+ global $frm_vars;
224
+ if ( empty( $frm_vars['form_params'] ) ) {
225
+ return false;
226
+ }
227
+ $form_params = $frm_vars['form_params'];
228
+ if ( ! isset( $form_params[ $this->form_id ] ) ) {
229
+ return false;
230
+ }
231
+ $this_form_params = $form_params[ $this->form_id ];
232
+ return ! empty( $this_form_params['action'] ) && 'update' === $this_form_params['action'];
233
+ }
234
+
235
+ /**
236
+ * Helper to run our filter on all the responses for the antispam checks.
237
+ *
238
+ * @since xx.xx
239
+ *
240
+ * @param bool|string $is_valid Is valid entry or not.
241
+ *
242
+ * @return bool|string Is valid or message.
243
+ */
244
+ private function process_antispam_filter( $is_valid ) {
245
+ return apply_filters( 'frm_process_antispam', $is_valid );
246
+ }
247
+
248
+ /**
249
+ * Helper to get the missing token message.
250
+ *
251
+ * @since xx.xx
252
+ *
253
+ * @return string missing token message.
254
+ */
255
+ private function get_missing_token_message() {
256
+ return esc_html__( 'This page isn\'t loading JavaScript properly, and the form will not be able to submit.', 'formidable' ) . $this->maybe_get_support_text();
257
+ }
258
+
259
+ /**
260
+ * Helper to get the invalid token message.
261
+ *
262
+ * @since xx.xx
263
+ *
264
+ * @return string Invalid token message.
265
+ */
266
+ private function get_invalid_token_message() {
267
+ return esc_html__( 'Form token is invalid. Please refresh the page.', 'formidable' ) . $this->maybe_get_support_text();
268
+ }
269
+
270
+ /**
271
+ * If a user is a super admin, add a support link to the message.
272
+ *
273
+ * @since xx.xx
274
+ *
275
+ * @return string Support text if super admin, empty string if not.
276
+ */
277
+ private function maybe_get_support_text() {
278
+ // If user isn't a super admin, don't return any text.
279
+ if ( ! is_super_admin() ) {
280
+ return '';
281
+ }
282
+
283
+ // If the user is an admin, return text with a link to support.
284
+ // We add a space here to seperate the sentences, but outside of the localized
285
+ // text to avoid it being removed.
286
+ return ' ' . sprintf(
287
+ // translators: %1$s start link, %2$s end link.
288
+ esc_html__( 'Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue.', 'formidable' ),
289
+ '<a href="https://formidableforms.com/knowledgebase/add-spam-protection/">',
290
+ '</a>'
291
+ );
292
+ }
293
+
294
+ /**
295
+ * Clear third party cache plugins to avoid data-tokens missing or appearing when the antispam setting is changed.
296
+ */
297
+ public static function clear_caches() {
298
+ self::clear_w3_total_cache();
299
+ self::clear_wp_fastest_cache();
300
+ self::clear_wp_super_cache();
301
+ self::clear_wp_optimize();
302
+ }
303
+
304
+ private static function clear_w3_total_cache() {
305
+ if ( is_callable( 'w3tc_flush_all' ) ) {
306
+ w3tc_flush_all();
307
+ }
308
+ }
309
+
310
+ private static function clear_wp_fastest_cache() {
311
+ do_action( 'wpfc_clear_all_cache' );
312
+ }
313
+
314
+ private static function clear_wp_super_cache() {
315
+ if ( function_exists( 'wp_cache_clean_cache' ) ) {
316
+ global $file_prefix;
317
+ wp_cache_clean_cache( $file_prefix, true );
318
+ }
319
+ }
320
+
321
+ private static function clear_wp_optimize() {
322
+ if ( class_exists( 'WP_Optimize' ) ) {
323
+ WP_Optimize()->get_page_cache()->purge();
324
+ }
325
+ }
326
+ }
classes/models/FrmEntryValidate.php CHANGED
@@ -229,43 +229,63 @@ class FrmEntryValidate {
229
  return;
230
  }
231
 
232
- if ( self::is_honeypot_spam() || self::is_spam_bot() ) {
 
 
 
233
  $errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
234
- }
235
-
236
- if ( self::blacklist_check( $values ) ) {
237
  $errors['spam'] = __( 'Your entry appears to be blocked spam!', 'formidable' );
238
- }
239
-
240
- if ( self::is_akismet_spam( $values ) ) {
241
- if ( self::is_akismet_enabled_for_user( $values['form_id'] ) ) {
242
- $errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
243
- }
244
  }
245
  }
246
 
247
- private static function is_honeypot_spam() {
248
- $honeypot_value = FrmAppHelper::get_param( 'frm_verify', '', 'get', 'sanitize_text_field' );
 
 
 
 
 
 
249
 
250
- return ( $honeypot_value !== '' );
 
 
 
 
 
 
251
  }
252
 
 
 
 
253
  private static function is_spam_bot() {
254
  $ip = FrmAppHelper::get_ip_address();
255
 
256
  return empty( $ip );
257
  }
258
 
 
 
 
 
259
  private static function is_akismet_spam( $values ) {
260
  global $wpcom_api_key;
261
 
262
  return ( is_callable( 'Akismet::http_post' ) && ( get_option( 'wordpress_api_key' ) || $wpcom_api_key ) && self::akismet( $values ) );
263
  }
264
 
 
 
 
 
265
  private static function is_akismet_enabled_for_user( $form_id ) {
266
  $form = FrmForm::getOne( $form_id );
267
 
268
- return ( isset( $form->options['akismet'] ) && ! empty( $form->options['akismet'] ) && ( $form->options['akismet'] != 'logged' || ! is_user_logged_in() ) );
269
  }
270
 
271
  public static function blacklist_check( $values ) {
229
  return;
230
  }
231
 
232
+ $antispam_check = self::is_antispam_check( $values['form_id'] );
233
+ if ( is_string( $antispam_check ) ) {
234
+ $errors['spam'] = $antispam_check;
235
+ } elseif ( self::is_honeypot_spam( $values ) || self::is_spam_bot() ) {
236
  $errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
237
+ } elseif ( self::blacklist_check( $values ) ) {
 
 
238
  $errors['spam'] = __( 'Your entry appears to be blocked spam!', 'formidable' );
239
+ } elseif ( self::is_akismet_spam( $values ) && self::is_akismet_enabled_for_user( $values['form_id'] ) ) {
240
+ $errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
 
 
 
 
241
  }
242
  }
243
 
244
+ /**
245
+ * @param int $form_id
246
+ * @return boolean
247
+ */
248
+ private static function is_antispam_check( $form_id ) {
249
+ $aspm = new FrmAntiSpam( $form_id );
250
+ return $aspm->validate();
251
+ }
252
 
253
+ /**
254
+ * @param array $values
255
+ * @return boolean
256
+ */
257
+ private static function is_honeypot_spam( $values ) {
258
+ $honeypot = new FrmHoneypot( $values['form_id'] );
259
+ return ! $honeypot->validate();
260
  }
261
 
262
+ /**
263
+ * @return boolean
264
+ */
265
  private static function is_spam_bot() {
266
  $ip = FrmAppHelper::get_ip_address();
267
 
268
  return empty( $ip );
269
  }
270
 
271
+ /**
272
+ * @param array $values
273
+ * @return boolean
274
+ */
275
  private static function is_akismet_spam( $values ) {
276
  global $wpcom_api_key;
277
 
278
  return ( is_callable( 'Akismet::http_post' ) && ( get_option( 'wordpress_api_key' ) || $wpcom_api_key ) && self::akismet( $values ) );
279
  }
280
 
281
+ /**
282
+ * @param int $form_id
283
+ * @return bool
284
+ */
285
  private static function is_akismet_enabled_for_user( $form_id ) {
286
  $form = FrmForm::getOne( $form_id );
287
 
288
+ return ( isset( $form->options['akismet'] ) && ! empty( $form->options['akismet'] ) && ( $form->options['akismet'] !== 'logged' || ! is_user_logged_in() ) );
289
  }
290
 
291
  public static function blacklist_check( $values ) {
classes/models/FrmField.php CHANGED
@@ -42,6 +42,10 @@ class FrmField {
42
  'name' => __( 'Number', 'formidable' ),
43
  'icon' => 'frm_icon_font frm_hashtag_icon',
44
  ),
 
 
 
 
45
  'phone' => array(
46
  'name' => __( 'Phone', 'formidable' ),
47
  'icon' => 'frm_icon_font frm_phone_icon',
@@ -1069,4 +1073,18 @@ class FrmField {
1069
  */
1070
  return apply_filters( 'frm_is_field_type', $is_field_type, compact( 'field', 'is_type' ) );
1071
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1072
  }
42
  'name' => __( 'Number', 'formidable' ),
43
  'icon' => 'frm_icon_font frm_hashtag_icon',
44
  ),
45
+ 'name' => array(
46
+ 'name' => __( 'Name', 'formidable' ),
47
+ 'icon' => 'frm_icon_font frm_user_name_icon',
48
+ ),
49
  'phone' => array(
50
  'name' => __( 'Phone', 'formidable' ),
51
  'icon' => 'frm_icon_font frm_phone_icon',
1073
  */
1074
  return apply_filters( 'frm_is_field_type', $is_field_type, compact( 'field', 'is_type' ) );
1075
  }
1076
+
1077
+ /**
1078
+ * Checks if the given field array is a combo field.
1079
+ *
1080
+ * @since 4.10.02
1081
+ *
1082
+ * @param array $field Field array.
1083
+ * @return bool
1084
+ */
1085
+ public static function is_combo_field( $field ) {
1086
+ $field_type_obj = FrmFieldFactory::get_field_factory( $field );
1087
+
1088
+ return ! empty( $field_type_obj->is_combo_field );
1089
+ }
1090
  }
classes/models/FrmHoneypot.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+
6
+ class FrmHoneypot extends FrmValidate {
7
+
8
+ /**
9
+ * @return string
10
+ */
11
+ protected function get_option_key() {
12
+ return 'honeypot';
13
+ }
14
+
15
+ /**
16
+ * @return bool
17
+ */
18
+ public function validate() {
19
+ if ( ! $this->is_option_on() || ! $this->check_honeypot_filter() ) {
20
+ // never flag as honeypot spam if disabled.
21
+ return true;
22
+ }
23
+ return ! $this->is_honeypot_spam();
24
+ }
25
+
26
+ /**
27
+ * @return boolean
28
+ */
29
+ private function is_honeypot_spam() {
30
+ $honeypot_value = FrmAppHelper::get_param( 'frm_verify', '', 'get', 'sanitize_text_field' );
31
+ $is_honeypot_spam = $honeypot_value !== '';
32
+ $form = $this->get_form();
33
+ $atts = compact( 'form' );
34
+ return apply_filters( 'frm_process_honeypot', $is_honeypot_spam, $atts );
35
+ }
36
+
37
+ /**
38
+ * @return mixed either true, or false.
39
+ */
40
+ private function check_honeypot_filter() {
41
+ $form = $this->get_form();
42
+ return apply_filters( 'frm_run_honeypot', true, compact( 'form' ) );
43
+ }
44
+
45
+ /**
46
+ * @return string
47
+ */
48
+ private function check_honeypot_setting() {
49
+ $form = $this->get_form();
50
+ $key = $this->get_option_key();
51
+ return $form->options[ $key ];
52
+ }
53
+
54
+ /**
55
+ * @param int $form_id
56
+ */
57
+ public static function maybe_render_field( $form_id ) {
58
+ $honeypot = new self( $form_id );
59
+ if ( $honeypot->should_render_field() ) {
60
+ $honeypot->render_field();
61
+ }
62
+ }
63
+
64
+ /**
65
+ * @return bool
66
+ */
67
+ public function should_render_field() {
68
+ return $this->is_option_on() && $this->check_honeypot_filter();
69
+ }
70
+
71
+ public function render_field() {
72
+ $honeypot = $this->check_honeypot_setting();
73
+ $form = $this->get_form();
74
+ ?>
75
+ <div class="frm_verify" <?php echo in_array( $honeypot, array( true, 'strict' ), true ) ? '' : 'aria-hidden="true"'; ?>>
76
+ <label for="frm_email_<?php echo esc_attr( $form->id ); ?>">
77
+ <?php esc_html_e( 'If you are human, leave this field blank.', 'formidable' ); ?>
78
+ </label>
79
+ <input type="<?php echo esc_attr( 'strict' === $honeypot ? 'email' : 'text' ); ?>" class="frm_verify" id="frm_email_<?php echo esc_attr( $form->id ); ?>" name="frm_verify" value="<?php echo esc_attr( FrmAppHelper::get_param( 'frm_verify', '', 'get', 'wp_kses_post' ) ); ?>" <?php FrmFormsHelper::maybe_hide_inline(); ?> />
80
+ </div>
81
+ <?php
82
+ }
83
+ }
classes/models/FrmUsage.php CHANGED
@@ -215,6 +215,8 @@ class FrmUsage {
215
  $settings = array(
216
  'form_class',
217
  'akismet',
 
 
218
  'custom_style',
219
  'success_action',
220
  'show_form',
215
  $settings = array(
216
  'form_class',
217
  'akismet',
218
+ 'honeypot',
219
+ 'antispam',
220
  'custom_style',
221
  'success_action',
222
  'show_form',
classes/models/FrmValidate.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+
6
+ abstract class FrmValidate {
7
+
8
+ /**
9
+ * @var int $form_id
10
+ */
11
+ protected $form_id;
12
+
13
+ /**
14
+ * @var object $form
15
+ */
16
+ protected $form;
17
+
18
+ /**
19
+ * @param int $form_id
20
+ */
21
+ public function __construct( $form_id ) {
22
+ $this->form_id = $form_id;
23
+ }
24
+
25
+ /**
26
+ * @return object $form
27
+ */
28
+ protected function get_form() {
29
+ if ( ! isset( $this->form ) ) {
30
+ $this->form = FrmForm::getOne( $this->form_id );
31
+ }
32
+ return $this->form;
33
+ }
34
+
35
+ /**
36
+ * @return bool
37
+ */
38
+ protected function is_option_on() {
39
+ $form = $this->get_form();
40
+ $key = $this->get_option_key();
41
+ return ! empty( $form->options[ $key ] ) && 'off' !== $form->options[ $key ];
42
+ }
43
+
44
+ /**
45
+ * @return bool
46
+ */
47
+ abstract public function validate();
48
+
49
+ /**
50
+ * Track the form option key used for is_option_on function.
51
+ *
52
+ * @return string
53
+ */
54
+ abstract protected function get_option_key();
55
+ }
classes/models/fields/FrmFieldCombo.php ADDED
@@ -0,0 +1,466 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Combo field - Field contains sub fields
4
+ *
5
+ * @package Formidable
6
+ * @since 4.11
7
+ */
8
+
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ die( 'You are not allowed to call this page directly.' );
11
+ }
12
+
13
+ class FrmFieldCombo extends FrmFieldType {
14
+
15
+ /**
16
+ * Does the html for this field label need to include "for"?
17
+ *
18
+ * @var bool
19
+ * @since 3.0
20
+ */
21
+ protected $has_for_label = false;
22
+
23
+ /**
24
+ * Sub fields.
25
+ *
26
+ * @var array
27
+ */
28
+ protected $sub_fields = array();
29
+
30
+ /**
31
+ * This is used to check if field is combo field.
32
+ *
33
+ * @var bool
34
+ */
35
+ public $is_combo_field = true;
36
+
37
+ /**
38
+ * Gets ALL subfields.
39
+ *
40
+ * @return array
41
+ */
42
+ public function get_sub_fields() {
43
+ return $this->sub_fields;
44
+ }
45
+
46
+ /**
47
+ * Registers sub fields.
48
+ *
49
+ * @param array $sub_fields Sub fields. Accepts array or array or array of string.
50
+ */
51
+ protected function register_sub_fields( array $sub_fields ) {
52
+ $defaults = $this->get_default_sub_field();
53
+
54
+ foreach ( $sub_fields as $name => $sub_field ) {
55
+ if ( empty( $sub_field ) ) {
56
+ continue;
57
+ }
58
+
59
+ if ( is_array( $sub_field ) ) {
60
+ $sub_field = wp_parse_args( $sub_field, $defaults );
61
+ $sub_field['name'] = $name;
62
+ $this->sub_fields[ $name ] = $sub_field;
63
+ continue;
64
+ }
65
+
66
+ if ( is_string( $sub_field ) ) {
67
+ $this->sub_fields[ $name ] = wp_parse_args(
68
+ array(
69
+ 'name' => $name,
70
+ 'label' => $sub_field,
71
+ ),
72
+ $defaults
73
+ );
74
+ }
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Gets default sub field.
80
+ *
81
+ * @return array
82
+ */
83
+ protected function get_default_sub_field() {
84
+ return array(
85
+ 'type' => 'text',
86
+ 'label' => '',
87
+ 'classes' => '',
88
+ 'wrapper_classes' => '',
89
+ 'options' => array(
90
+ 'default_value',
91
+ 'placeholder',
92
+ 'desc',
93
+ ),
94
+ 'optional' => false,
95
+ 'atts' => array(),
96
+ );
97
+ }
98
+
99
+ /**
100
+ * Registers extra options for saving.
101
+ *
102
+ * @return array
103
+ */
104
+ protected function extra_field_opts() {
105
+ $extra_options = parent::extra_field_opts();
106
+
107
+ // Register for sub field options.
108
+ foreach ( $this->sub_fields as $key => $sub_field ) {
109
+ if ( empty( $sub_field['options'] ) || ! is_array( $sub_field['options'] ) ) {
110
+ continue;
111
+ }
112
+
113
+ foreach ( $sub_field['options'] as $option ) {
114
+ if ( 'default_value' === $option ) { // We parse default value from field column.
115
+ continue;
116
+ }
117
+
118
+ if ( is_string( $option ) ) {
119
+ $extra_options[ $key . '_' . $option ] = '';
120
+ } elseif ( ! empty( $option['name'] ) ) {
121
+ $extra_options[ $key . '_' . $option['name'] ] = '';
122
+ }
123
+ }
124
+ }
125
+
126
+ return $extra_options;
127
+ }
128
+
129
+ /**
130
+ * Include the settings for placeholder, default value, and sub labels for each
131
+ * of the individual field labels.
132
+ *
133
+ * @since 4.0
134
+ * @param array $args Includes 'field', 'display'.
135
+ */
136
+ public function show_after_default( $args ) {
137
+ $field = (array) $args['field'];
138
+ $default_value = $this->get_default_value();
139
+ $processed_sub_fields = $this->get_processed_sub_fields();
140
+
141
+ foreach ( $this->sub_fields as $name => $sub_field ) {
142
+ $sub_field['name'] = $name;
143
+ $wrapper_classes = 'frm_grid_container frm_sub_field_options frm_sub_field_options-' . $sub_field['name'];
144
+ if ( ! isset( $processed_sub_fields[ $name ] ) ) {
145
+ // Options for this subfield should be hidden.
146
+ $wrapper_classes .= ' frm_hidden';
147
+ }
148
+
149
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/combo-field/sub-field-options.php';
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Gets default value of field.
155
+ * This should return an array of default value of sub fields.
156
+ *
157
+ * @return array
158
+ */
159
+ protected function get_default_value() {
160
+ $default_value = $this->get_field_column( 'default_value' );
161
+
162
+ if ( is_array( $default_value ) ) {
163
+ return $default_value;
164
+ }
165
+
166
+ if ( is_object( $default_value ) ) {
167
+ return (array) $default_value;
168
+ }
169
+
170
+ if ( ! $default_value ) {
171
+ $default_value = array();
172
+
173
+ foreach ( $this->sub_fields as $name => $sub_field ) {
174
+ $default_value[ $name ] = '';
175
+ }
176
+
177
+ return $default_value;
178
+ }
179
+
180
+ return json_decode( $default_value, true ); // We store default value as JSON string in db.
181
+ }
182
+
183
+ /**
184
+ * Gets labels for built-in options of fields or sub fields.
185
+ *
186
+ * @return array
187
+ */
188
+ protected function get_built_in_option_labels() {
189
+ return array(
190
+ 'default_value' => __( 'Default Value', 'formidable' ),
191
+ 'placeholder' => __( 'Placeholder Text', 'formidable' ),
192
+ 'desc' => __( 'Description', 'formidable' ),
193
+ );
194
+ }
195
+
196
+ /**
197
+ * Which built-in settings this field supports?
198
+ *
199
+ * @return array
200
+ */
201
+ protected function field_settings_for_type() {
202
+ $settings = array(
203
+ 'description' => false,
204
+ 'default' => false,
205
+ 'clear_on_focus' => false, // Don't use the regular placeholder option.
206
+ 'logic' => true,
207
+ );
208
+
209
+ return $settings;
210
+ }
211
+
212
+ /**
213
+ * Shows field on the form builder.
214
+ *
215
+ * @param string $name Field name.
216
+ */
217
+ public function show_on_form_builder( $name = '' ) {
218
+ $field = FrmFieldsHelper::setup_edit_vars( $this->field );
219
+
220
+ $field['default_value'] = $this->get_default_value();
221
+ $field['value'] = $field['default_value'];
222
+
223
+ $field_name = $this->html_name( $name );
224
+
225
+ $this->load_field_output( compact( 'field', 'field_name' ) );
226
+ }
227
+
228
+ /**
229
+ * Gets processed sub fields.
230
+ * This should return the list of sub fields after sorting or show/hide based of some options.
231
+ *
232
+ * @return array
233
+ */
234
+ protected function get_processed_sub_fields() {
235
+ return $this->sub_fields;
236
+ }
237
+
238
+ /**
239
+ * Shows field in the frontend.
240
+ *
241
+ * @param array $args Arguments.
242
+ * @param array $shortcode_atts Shortcode attributes.
243
+ * @return string
244
+ */
245
+ public function front_field_input( $args, $shortcode_atts ) {
246
+ $field = (array) $this->field;
247
+
248
+ $field['default_value'] = $this->get_default_value();
249
+ if ( empty( $field['value'] ) ) {
250
+ $field['value'] = $field['default_value'];
251
+ }
252
+
253
+ $args['field'] = $field;
254
+ $args['shortcode_atts'] = $shortcode_atts;
255
+
256
+ ob_start();
257
+ $this->load_field_output( $args );
258
+ $input_html = ob_get_clean();
259
+
260
+ return $input_html;
261
+ }
262
+
263
+ /**
264
+ * Loads field output.
265
+ *
266
+ * @param array $args {
267
+ * Arguments.
268
+ *
269
+ * @type array $field Field array.
270
+ * @type string $html_id HTML ID.
271
+ * @type string $field_name Field name attribute.
272
+ * @type array $shortcode_atts Shortcode attributes.
273
+ * @type array $errors Field errors.
274
+ * @type bool $remove_names Remove name attribute or not.
275
+ * }
276
+ */
277
+ protected function load_field_output( $args ) {
278
+ if ( empty( $args['field'] ) ) {
279
+ return;
280
+ }
281
+
282
+ $this->process_args_for_field_output( $args );
283
+
284
+ $include_paths = array(
285
+ FrmAppHelper::plugin_path() . "/classes/views/frm-fields/front-end/{$args['field']['type']}-field/{$args['field']['type']}-field.php",
286
+ FrmAppHelper::plugin_path() . '/classes/views/frm-fields/front-end/combo-field/combo-field.php',
287
+ );
288
+
289
+ foreach ( $include_paths as $include_path ) {
290
+ if ( file_exists( $include_path ) ) {
291
+ include $include_path;
292
+ return;
293
+ }
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Loads processed args for field output.
299
+ *
300
+ * @param array $args {
301
+ * Arguments.
302
+ *
303
+ * @type array $field Field array.
304
+ * @type string $html_id HTML ID.
305
+ * @type string $field_name Field name attribute.
306
+ * @type array $shortcode_atts Shortcode attributes.
307
+ * @type array $errors Field errors.
308
+ * @type bool $remove_names Remove name attribute or not.
309
+ * }
310
+ */
311
+ protected function process_args_for_field_output( &$args ) {
312
+ $args['field'] = (array) $args['field'];
313
+
314
+ if ( ! isset( $args['html_id'] ) ) {
315
+ $args['html_id'] = $this->html_id();
316
+ }
317
+
318
+ if ( ! isset( $args['field_name'] ) ) {
319
+ $args['field_name'] = $this->html_name( $args['field']['name'] );
320
+ }
321
+
322
+ $args['sub_fields'] = $this->get_processed_sub_fields();
323
+
324
+ if ( ! isset( $args['shortcode_atts'] ) ) {
325
+ $args['shortcode_atts'] = array();
326
+ }
327
+
328
+ if ( ! isset( $args['errors'] ) ) {
329
+ $args['errors'] = array();
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Prints sub field input atts.
335
+ *
336
+ * @param array $args Arguments. Includes `field`, `sub_field`.
337
+ */
338
+ protected function print_input_atts( $args ) {
339
+ $field = $args['field'];
340
+ $sub_field = $args['sub_field'];
341
+ $atts = array();
342
+
343
+ // Placeholder.
344
+ if ( in_array( 'placeholder', $sub_field['options'], true ) ) {
345
+ $placeholders = FrmField::get_option( $field, 'placeholder' );
346
+ if ( ! empty( $placeholders[ $sub_field['name'] ] ) ) {
347
+ $atts[] = 'placeholder="' . esc_attr( $placeholders[ $sub_field['name'] ] ) . '"';
348
+ }
349
+ }
350
+
351
+ // Add optional class.
352
+ $classes = isset( $sub_field['classes'] ) ? $sub_field['classes'] : '';
353
+ if ( is_array( $classes ) ) {
354
+ $classes = implode( ' ', $classes );
355
+ }
356
+
357
+ if ( ! empty( $sub_field['optional'] ) ) {
358
+ $classes .= ' frm_optional';
359
+ }
360
+
361
+ if ( $classes ) {
362
+ $atts[] = 'class="' . esc_attr( $classes ) . '"';
363
+ }
364
+
365
+ // Print custom attributes.
366
+ if ( ! empty( $sub_field['atts'] ) && is_array( $sub_field['atts'] ) ) {
367
+ foreach ( $sub_field['atts'] as $att_name => $att_value ) {
368
+ $atts[] = esc_attr( trim( $att_name ) ) . '="' . esc_attr( trim( $att_value ) ) . '"';
369
+ }
370
+ }
371
+
372
+ echo implode( ' ', $atts ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
373
+ }
374
+
375
+ /**
376
+ * Validate field.
377
+ *
378
+ * @param array $args Arguments. Includes `errors`, `value`.
379
+ * @return array Errors array.
380
+ */
381
+ public function validate( $args ) {
382
+ $errors = isset( $args['errors'] ) ? $args['errors'] : array();
383
+
384
+ if ( ! $this->field->required ) {
385
+ return $errors;
386
+ }
387
+
388
+ if ( class_exists( 'FrmProEntryMeta' ) && FrmProEntryMeta::skip_required_validation( $this->field ) ) {
389
+ return $errors;
390
+ }
391
+
392
+ $blank_msg = FrmFieldsHelper::get_error_msg( $this->field, 'blank' );
393
+
394
+ $sub_fields = $this->get_processed_sub_fields();
395
+
396
+ // Validate not empty.
397
+ foreach ( $sub_fields as $name => $sub_field ) {
398
+ if ( empty( $sub_field['optional'] ) && empty( $args['value'][ $name ] ) ) {
399
+ $errors[ 'field' . $args['id'] . '-' . $name ] = '';
400
+ $errors[ 'field' . $args['id'] ] = $blank_msg;
401
+ }
402
+ }
403
+
404
+ return $errors;
405
+ }
406
+
407
+ /**
408
+ * Gets export headings.
409
+ *
410
+ * @return array
411
+ */
412
+ public function get_export_headings() {
413
+ $headings = array();
414
+ $field_id = isset( $this->field->id ) ? $this->field->id : $this->field['id'];
415
+ $field_name = isset( $this->field->name ) ? $this->field->name : $this->field['name'];
416
+ $field_key = isset( $this->field->field_key ) ? $this->field->field_key : $this->field['field_key'];
417
+ $sub_fields = $this->get_processed_sub_fields();
418
+ foreach ( $sub_fields as $name => $sub_field ) {
419
+ $headings[ $field_id . '_' . $name ] = $field_name . ' (' . $field_key . ') - ' . $sub_field['label'];
420
+ }
421
+
422
+ return $headings;
423
+ }
424
+
425
+ /**
426
+ *
427
+ * Get a list of all field settings that should be translated
428
+ * on a multilingual site.
429
+ *
430
+ * @since 3.06.01
431
+ *
432
+ * @return array
433
+ */
434
+ public function translatable_strings() {
435
+ $strings = parent::translatable_strings();
436
+
437
+ foreach ( $this->sub_fields as $name => $sub_field ) {
438
+ if ( in_array( 'desc', $sub_field['options'], true ) ) {
439
+ $strings[] = $name . '_desc';
440
+ }
441
+ }
442
+
443
+ return $strings;
444
+ }
445
+
446
+ /**
447
+ * Checks if should print hidden subfields and hide them. This is useful to use js to show or hide sub fields.
448
+ *
449
+ * @return bool
450
+ */
451
+ protected function should_print_hidden_sub_fields() {
452
+ return false;
453
+ }
454
+
455
+ /**
456
+ * Gets inputs container attributes.
457
+ *
458
+ * @return array
459
+ */
460
+ protected function get_inputs_container_attrs() {
461
+ return array(
462
+ 'class' => 'frm_combo_inputs_container',
463
+ 'id' => 'frm_combo_inputs_container_' . $this->field_id,
464
+ );
465
+ }
466
+ }
classes/models/fields/FrmFieldName.php ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Name field
4
+ *
5
+ * @package Formidable
6
+ * @since 4.11
7
+ */
8
+
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ die( 'You are not allowed to call this page directly.' );
11
+ }
12
+
13
+ class FrmFieldName extends FrmFieldCombo {
14
+
15
+ /**
16
+ * Field name.
17
+ *
18
+ * @var string
19
+ * @since 3.0
20
+ */
21
+ protected $type = 'name';
22
+
23
+ public function __construct( $field = '', $type = '' ) {
24
+ parent::__construct( $field, $type );
25
+
26
+ $this->register_sub_fields(
27
+ array(
28
+ 'first' => __( 'First', 'formidable' ),
29
+ 'middle' => __( 'Middle', 'formidable' ),
30
+ 'last' => __( 'Last', 'formidable' ),
31
+ )
32
+ );
33
+ }
34
+
35
+ /**
36
+ * Gets processed sub fields.
37
+ * This should return the list of sub fields after sorting or show/hide based of some options.
38
+ *
39
+ * @return array
40
+ */
41
+ protected function get_processed_sub_fields() {
42
+ $name_layout = $this->get_name_layout();
43
+ $names = explode( '_', $name_layout );
44
+ $col_class = 'frm' . intval( 12 / count( $names ) );
45
+
46
+ $result = array();
47
+
48
+ foreach ( $names as $name ) {
49
+ if ( empty( $this->sub_fields[ $name ] ) ) {
50
+ continue;
51
+ }
52
+
53
+ if ( ! isset( $this->sub_fields[ $name ]['wrapper_classes'] ) ) {
54
+ $this->sub_fields[ $name ]['wrapper_classes'] = $col_class;
55
+ } elseif ( is_array( $this->sub_fields[ $name ]['wrapper_classes'] ) ) {
56
+ $this->sub_fields[ $name ]['wrapper_classes'] = implode( ' ', $this->sub_fields[ $name ]['wrapper_classes'] ) . ' ' . $col_class;
57
+ } else {
58
+ $this->sub_fields[ $name ]['wrapper_classes'] .= ' ' . $col_class;
59
+ }
60
+
61
+ $result[ $name ] = $this->sub_fields[ $name ];
62
+ }
63
+
64
+ return $result;
65
+ }
66
+
67
+ /**
68
+ * Gets name layout option value.
69
+ *
70
+ * @return string
71
+ */
72
+ protected function get_name_layout() {
73
+ $name_layout = FrmField::get_option( $this->field, 'name_layout' );
74
+ if ( ! $name_layout ) {
75
+ $name_layout = 'first_last';
76
+ }
77
+ return $name_layout;
78
+ }
79
+
80
+ /**
81
+ * Gets extra field options.
82
+ *
83
+ * @return string[]
84
+ */
85
+ protected function extra_field_opts() {
86
+ $extra_options = parent::extra_field_opts();
87
+
88
+ $extra_options['name_layout'] = 'first_last';
89
+
90
+ // Default desc.
91
+ foreach ( $this->sub_fields as $name => $sub_field ) {
92
+ $extra_options[ $name . '_desc' ] = $sub_field['label'];
93
+ }
94
+
95
+ return $extra_options;
96
+ }
97
+
98
+ /**
99
+ * Shows primary options.
100
+ *
101
+ * @since 4.0
102
+ *
103
+ * @param array $args Includes 'field', 'display', and 'values'.
104
+ */
105
+ public function show_primary_options( $args ) {
106
+ $field = (array) $args['field'];
107
+ include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/name/primary-options.php';
108
+
109
+ parent::show_primary_options( $args );
110
+ }
111
+
112
+ /**
113
+ * Prepares the display value.
114
+ * This also handles the shortcode output. Support [id], [id show=first], [id show=last], [id show=middle].
115
+ *
116
+ * @param mixed $value Field value before processing.
117
+ * @param array $atts Shortcode attributes.
118
+ * @return string Most of cases, this will return string.
119
+ */
120
+ protected function prepare_display_value( $value, $atts ) {
121
+ if ( ! is_array( $value ) ) {
122
+ return $value;
123
+ }
124
+
125
+ $name_layout = $this->get_name_layout();
126
+
127
+ if ( ! empty( $atts['show'] ) ) {
128
+ return isset( $value[ $atts['show'] ] ) ? $value[ $atts['show'] ] : '';
129
+ }
130
+
131
+ $value = wp_parse_args(
132
+ $value,
133
+ array(
134
+ 'first' => '',
135
+ 'middle' => '',
136
+ 'last' => '',
137
+ )
138
+ );
139
+
140
+ switch ( $name_layout ) {
141
+ case 'last_first':
142
+ $value = $value['last'] . ' ' . $value['first'];
143
+ break;
144
+
145
+ case 'first_middle_last':
146
+ $value = $value['first'] . ' ' . $value['middle'] . ' ' . $value['last'];
147
+ break;
148
+
149
+ default:
150
+ $value = $value['first'] . ' ' . $value['last'];
151
+ }
152
+
153
+ return trim( $value );
154
+ }
155
+
156
+ /**
157
+ * @since 4.0.04
158
+ */
159
+ public function sanitize_value( &$value ) {
160
+ FrmAppHelper::sanitize_value( 'sanitize_text_field', $value );
161
+ }
162
+
163
+ /**
164
+ * Validate field.
165
+ *
166
+ * @param array $args Arguments. Includes `errors`, `value`.
167
+ * @return array Errors array.
168
+ */
169
+ public function validate( $args ) {
170
+ /**
171
+ * If users fill just HTML tag, it passes the validation but value is empty in the database because of the
172
+ * sanitization. So we need to sanitize the value before validating.
173
+ */
174
+ $this->sanitize_value( $args['value'] );
175
+ return parent::validate( $args );
176
+ }
177
+
178
+ /**
179
+ * Loads processed args for field output.
180
+ *
181
+ * @param array $args {
182
+ * Arguments.
183
+ *
184
+ * @type array $field Field array.
185
+ * @type string $html_id HTML ID.
186
+ * @type string $field_name Field name attribute.
187
+ * @type array $shortcode_atts Shortcode attributes.
188
+ * @type array $errors Field errors.
189
+ * @type bool $remove_names Remove name attribute or not.
190
+ * }
191
+ */
192
+ protected function process_args_for_field_output( &$args ) {
193
+ parent::process_args_for_field_output( $args );
194
+
195
+ // Show all subfields in form builder then use JS to show or hide them.
196
+ if ( $this->should_print_hidden_sub_fields() && count( $args['sub_fields'] ) !== count( $this->sub_fields ) ) {
197
+ $hidden_fields = array_diff_key( $this->sub_fields, $args['sub_fields'] );
198
+ $args['sub_fields'] = $this->sub_fields;
199
+
200
+ foreach ( $hidden_fields as $name => $hidden_field ) {
201
+ $args['sub_fields'][ $name ]['wrapper_classes'] .= ' frm_hidden';
202
+ }
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Checks if should print hidden subfields and hide them. This is useful to use js to show or hide sub fields.
208
+ *
209
+ * @return bool
210
+ */
211
+ protected function should_print_hidden_sub_fields() {
212
+ // phpcs:ignore WordPress.Security.NonceVerification.Missing
213
+ return FrmAppHelper::is_form_builder_page() || FrmAppHelper::doing_ajax() && isset( $_POST['action'] ) && 'frm_insert_field' === $_POST['action'];
214
+ }
215
+
216
+ /**
217
+ * Gets inputs container attributes.
218
+ *
219
+ * @return array
220
+ */
221
+ protected function get_inputs_container_attrs() {
222
+ $attrs = parent::get_inputs_container_attrs();
223
+
224
+ $attrs['data-name-layout'] = $this->get_name_layout();
225
+ return $attrs;
226
+ }
227
+ }
classes/views/frm-entries/form.php CHANGED
@@ -50,24 +50,16 @@ if ( $values['fields'] ) {
50
  $frm_settings = FrmAppHelper::get_settings();
51
  if ( FrmAppHelper::is_admin() ) {
52
  ?>
53
- <div class="frm_form_field form-field">
54
- <label class="frm_primary_label"><?php esc_html_e( 'Entry Key', 'formidable' ); ?></label>
55
- <input type="text" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
56
- </div>
57
- <?php } else { ?>
58
- <input type="hidden" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
59
  <?php
60
- $honeypot = apply_filters( 'frm_run_honeypot', true, compact( 'form' ) );
61
- if ( $honeypot ) {
62
- ?>
63
- <div class="frm_verify" <?php echo ( $honeypot === true ) ? '' : 'aria-hidden="true"'; ?>>
64
- <label for="frm_email_<?php echo esc_attr( $form->id ); ?>">
65
- <?php esc_html_e( 'If you are human, leave this field blank.', 'formidable' ); ?>
66
- </label>
67
- <input type="email" class="frm_verify" id="frm_email_<?php echo esc_attr( $form->id ); ?>" name="frm_verify" value="<?php echo esc_attr( FrmAppHelper::get_param( 'frm_verify', '', 'get', 'wp_kses_post' ) ); ?>" <?php FrmFormsHelper::maybe_hide_inline(); ?> />
68
- </div>
69
- <?php
70
- }
71
  }
72
 
73
  do_action( 'frm_entry_form', $form, $form_action, $errors );
50
  $frm_settings = FrmAppHelper::get_settings();
51
  if ( FrmAppHelper::is_admin() ) {
52
  ?>
53
+ <div class="frm_form_field form-field">
54
+ <label class="frm_primary_label"><?php esc_html_e( 'Entry Key', 'formidable' ); ?></label>
55
+ <input type="text" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
56
+ </div>
 
 
57
  <?php
58
+ } else {
59
+ ?>
60
+ <input type="hidden" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
61
+ <?php
62
+ FrmHoneypot::maybe_render_field( $form->id );
 
 
 
 
 
 
63
  }
64
 
65
  do_action( 'frm_entry_form', $form, $form_action, $errors );
classes/views/frm-entries/new.php CHANGED
@@ -2,6 +2,8 @@
2
  if ( ! defined( 'ABSPATH' ) ) {
3
  die( 'You are not allowed to call this page directly.' );
4
  }
 
 
5
  ?>
6
  <div class="frm_forms <?php echo esc_attr( FrmFormsHelper::get_form_style_class( $values ) ); ?>" id="frm_form_<?php echo esc_attr( $form->id ); ?>_container" <?php echo wp_strip_all_tags( apply_filters( 'frm_form_div_attributes', '', $form ) ); // WPCS: XSS ok. ?>>
7
  <?php if ( ! isset( $include_form_tag ) || $include_form_tag ) { ?>
2
  if ( ! defined( 'ABSPATH' ) ) {
3
  die( 'You are not allowed to call this page directly.' );
4
  }
5
+
6
+ FrmAntiSpam::maybe_init( $form->id );
7
  ?>
8
  <div class="frm_forms <?php echo esc_attr( FrmFormsHelper::get_form_style_class( $values ) ); ?>" id="frm_form_<?php echo esc_attr( $form->id ); ?>_container" <?php echo wp_strip_all_tags( apply_filters( 'frm_form_div_attributes', '', $form ) ); // WPCS: XSS ok. ?>>
9
  <?php if ( ! isset( $include_form_tag ) || $include_form_tag ) { ?>
classes/views/frm-fields/back-end/combo-field/sub-field-options.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sub field options
4
+ *
5
+ * @package Formidable
6
+ * @since 4.10.02
7
+ *
8
+ * @var FrmFieldCombo $this Field type object.
9
+ * @var array $field Field array.
10
+ * @var array $sub_field Sub field array.
11
+ * @var array $default_value Default value of all sub fields.
12
+ * @var array $wrapper_classes CSS classes of wrapper element of subfield options.
13
+ */
14
+
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ die( 'You are not allowed to call this page directly.' );
17
+ }
18
+
19
+ $field_id = $field['id'];
20
+ $field_key = $field['field_key'];
21
+ $uniq_str = $sub_field['name'] . '_' . $field_id;
22
+ $labels = $this->get_built_in_option_labels();
23
+ ?>
24
+ <div
25
+ class="<?php echo esc_attr( $wrapper_classes ); ?>"
26
+ data-sub-field-name="<?php echo esc_attr( $sub_field['name'] ); ?>"
27
+ data-field-id="<?php echo intval( $field_id ); ?>"
28
+ >
29
+ <label id="<?php echo esc_attr( $uniq_str ); ?>" class="frm_primary_label">
30
+ <?php echo esc_html( $sub_field['label'] ); ?>
31
+ </label>
32
+
33
+ <?php
34
+ // Loop through $sub_field['options'] to show options.
35
+ foreach ( $sub_field['options'] as $option ) {
36
+ switch ( $option ) {
37
+ case 'default_value':
38
+ $input_name = sprintf( '%1$s_%2$s[%3$s]', $option, $field_id, $sub_field['name'] );
39
+ $input_id = $option . '_' . $uniq_str;
40
+ ?>
41
+ <p class="frm6 frm_form_field">
42
+ <span class="frm-with-right-icon">
43
+ <?php
44
+ FrmAppHelper::icon_by_class(
45
+ 'frm_icon_font frm_more_horiz_solid_icon frm-show-inline-modal',
46
+ array(
47
+ 'data-open' => 'frm-smart-values-box',
48
+ )
49
+ );
50
+ ?>
51
+ <input
52
+ type="text"
53
+ name="<?php echo esc_attr( $input_name ); ?>"
54
+ id="<?php echo esc_attr( $input_id ); ?>"
55
+ value="<?php echo esc_attr( isset( $default_value[ $sub_field['name'] ] ) ? $default_value[ $sub_field['name'] ] : '' ); ?>"
56
+ data-changeme="field_<?php echo esc_attr( $field_key . '_' . $sub_field['name'] ); ?>"
57
+ data-changeatt="value"
58
+ />
59
+ </span>
60
+ <label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
61
+ <?php echo esc_html( $labels[ $option ] ); ?>
62
+ </label>
63
+ </p>
64
+ <?php
65
+ break;
66
+
67
+ // All simple text options with live update the form output can go here.
68
+ case 'placeholder':
69
+ $input_name = sprintf( 'field_options[%1$s_%2$s][%3$s]', $option, $field_id, $sub_field['name'] );
70
+ $input_id = 'field_options_' . $option . '_' . $uniq_str;
71
+ $input_value = FrmField::get_option( $field, $option );
72
+ ?>
73
+ <p class="frm6 frm_form_field">
74
+ <input
75
+ type="text"
76
+ name="<?php echo esc_attr( $input_name ); ?>"
77
+ id="<?php echo esc_attr( $input_id ); ?>"
78
+ value="<?php echo esc_attr( isset( $input_value[ $sub_field['name'] ] ) ? $input_value[ $sub_field['name'] ] : '' ); ?>"
79
+ data-changeme="field_<?php echo esc_attr( $field_key . '_' . $sub_field['name'] ); ?>"
80
+ data-changeatt="<?php echo esc_attr( $option ); ?>"
81
+ />
82
+ <label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
83
+ <?php echo esc_html( $labels[ $option ] ); ?>
84
+ </label>
85
+ </p>
86
+ <?php
87
+ break;
88
+
89
+ // All simple text options without live update the form output can go here.
90
+ case 'desc':
91
+ $input_name = sprintf( 'field_options[%1$s_%2$s_%3$s]', $sub_field['name'], $option, $field_id );
92
+ $input_id = 'field_options_' . $option . '_' . $uniq_str;
93
+ $input_value = FrmField::get_option( $field, $sub_field['name'] . '_' . $option );
94
+ ?>
95
+ <p class="frm6 frm_form_field">
96
+ <input
97
+ type="text"
98
+ name="<?php echo esc_attr( $input_name ); ?>"
99
+ id="<?php echo esc_attr( $input_id ); ?>"
100
+ value="<?php echo esc_attr( $input_value ); ?>"
101
+ data-changeme="frm_field_<?php echo esc_attr( $field_id . '_' . $sub_field['name'] ); ?>_desc"
102
+ />
103
+ <label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
104
+ <?php echo esc_html( $labels[ $option ] ); ?>
105
+ </label>
106
+ </p>
107
+ <?php
108
+ break;
109
+ }
110
+ }
111
+ ?>
112
+ <div class="frm12"></div>
113
+ </div><!-- End .frm_sub_field_options -->
classes/views/frm-fields/back-end/name/primary-options.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Primary options for name field
4
+ *
5
+ * @package Formidable
6
+ * @since 4.10.02
7
+ *
8
+ * @var array $field Field array.
9
+ * @var array $args Includes 'field', 'display', and 'values'.
10
+ * @var FrmFieldName $this Field type object.
11
+ */
12
+
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ die( 'You are not allowed to call this page directly.' );
15
+ }
16
+
17
+ // Options here need to be declared in FrmFieldName::extra_field_opts().
18
+ $field_id = $field['id'];
19
+ $name_layout = FrmField::get_option( $field, 'name_layout' );
20
+ ?>
21
+ <p>
22
+ <label for="name_layout_<?php echo esc_attr( $field_id ); ?>">
23
+ <?php esc_html_e( 'Name layout', 'formidable' ); ?>
24
+ </label>
25
+
26
+ <select
27
+ name="field_options[name_layout_<?php echo esc_attr( $field_id ); ?>]"
28
+ id="name_layout_<?php echo esc_attr( $field_id ); ?>"
29
+ class="frm_name_layout_dropdown"
30
+ data-field-id="<?php echo intval( $field_id ); ?>"
31
+ data-changeme="frm_combo_inputs_container_<?php echo intval( $field_id ); ?>"
32
+ data-changeatt="data-name-layout"
33
+ >
34
+ <option value="first_last" <?php selected( $name_layout, 'first_last' ); ?>>
35
+ <?php esc_html_e( 'First Last', 'formidable' ); ?>
36
+ </option>
37
+ <option value="last_first" <?php selected( $name_layout, 'last_first' ); ?>>
38
+ <?php esc_html_e( 'Last First', 'formidable' ); ?>
39
+ </option>
40
+ <option value="first_middle_last" <?php selected( $name_layout, 'first_middle_last' ); ?>>
41
+ <?php esc_html_e( 'First Middle Last', 'formidable' ); ?>
42
+ </option>
43
+ </select>
44
+ </p>
classes/views/frm-fields/front-end/combo-field/combo-field.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Frontend template for combo field
4
+ *
5
+ * @package Formidable
6
+ * @since 4.10.02
7
+ *
8
+ * @var array $args Data passed to this view. See FrmFieldCombo::load_field_output().
9
+ * @var array $shortcode_atts Shortcode attributes.
10
+ * @var array $sub_fields Sub fields array.
11
+ * @var string $html_id HTML ID.
12
+ * @var string $field_name Field Name.
13
+ * @var array $errors Field errors.
14
+ * @var bool $remove_names Remove field name or not.
15
+ * @var FrmFieldCombo $this Field type object.
16
+ */
17
+
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ die( 'You are not allowed to call this page directly.' );
20
+ }
21
+
22
+ $field = $args['field'];
23
+ $field_id = $field['id'];
24
+ $field_label = $field['name'];
25
+ $field_value = $field['value'];
26
+ $sub_fields = $args['sub_fields'];
27
+ $html_id = $args['html_id'];
28
+ $field_name = $args['field_name'];
29
+ $errors = $args['errors'];
30
+
31
+ $inputs_attrs = $this->get_inputs_container_attrs();
32
+ $inputs_attrs_str = '';
33
+ foreach ( $inputs_attrs as $key => $inputs_attr ) {
34
+ $inputs_attrs_str .= sprintf( ' %s="%s"', esc_attr( $key ), esc_attr( $inputs_attr ) );
35
+ }
36
+ ?>
37
+ <fieldset aria-labelledby="<?php echo esc_attr( $html_id ); ?>_label">
38
+ <legend class="frm_screen_reader frm_hidden">
39
+ <?php echo esc_html( $field_label ); ?>
40
+ </legend>
41
+
42
+ <div<?php echo $inputs_attrs_str; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
43
+ <?php
44
+ foreach ( $sub_fields as $name => $sub_field ) {
45
+ $sub_field['name'] = $name;
46
+ $sub_field_class = "frm_form_field form-field frm_form_subfield-{$name} {$sub_field['wrapper_classes']}";
47
+ $sub_field_desc = FrmField::get_option( $field, $name . '_desc' );
48
+
49
+ if ( isset( $errors[ 'field' . $field_id . '-' . $name ] ) ) {
50
+ $sub_field_class .= ' frm_blank_field';
51
+ }
52
+ ?>
53
+ <div
54
+ id="frm_field_<?php echo esc_attr( $field_id . '-' . $name ); ?>_container"
55
+ class="<?php echo esc_attr( $sub_field_class ); ?>"
56
+ data-sub-field-name="<?php echo esc_attr( $name ); ?>"
57
+ >
58
+ <label for="<?php echo esc_attr( $html_id . '_' . $name ); ?>" class="frm_screen_reader frm_hidden">
59
+ <?php echo esc_html( $sub_field_desc ? $sub_field_desc : $field_label ); ?>
60
+ </label>
61
+
62
+ <?php
63
+ switch ( $sub_field['type'] ) {
64
+ default:
65
+ ?>
66
+ <input
67
+ type="<?php echo esc_attr( $sub_field['type'] ); ?>"
68
+ id="<?php echo esc_attr( $html_id . '_' . $name ); ?>"
69
+ value="<?php echo esc_attr( isset( $field_value[ $name ] ) ? $field_value[ $name ] : '' ); ?>"
70
+ <?php
71
+ if ( empty( $args['remove_names'] ) ) {
72
+ echo 'name="' . esc_attr( $field_name ) . '[' . esc_attr( $name ) . ']" ';
73
+ }
74
+
75
+ $this->print_input_atts( compact( 'field', 'sub_field' ) );
76
+ ?>
77
+ />
78
+ <?php
79
+ }
80
+
81
+ if ( $sub_field['label'] && ( $sub_field_desc || $this->should_print_hidden_sub_fields() ) ) {
82
+ echo '<div class="frm_description" id="frm_field_' . esc_attr( $field_id . '_' . $sub_field['name'] ) . '_desc">' . FrmAppHelper::kses( $sub_field_desc ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
83
+ }
84
+
85
+ // Don't show individual field errors when there is a combo field error.
86
+ if ( ! empty( $errors ) && isset( $errors[ 'field' . $field_id . '-' . $name ] ) && ! isset( $errors[ 'field' . $field_id ] ) ) {
87
+ ?>
88
+ <div class="frm_error"><?php echo esc_html( $errors[ 'field' . $field_id . '-' . $name ] ); ?></div>
89
+ <?php } ?>
90
+ </div>
91
+ <?php } ?>
92
+ </div>
93
+ </fieldset>
classes/views/frm-forms/settings-advanced.php CHANGED
@@ -118,23 +118,7 @@ if ( ! defined( 'ABSPATH' ) ) {
118
  </label>
119
  </td>
120
  </tr>
121
- <?php if ( function_exists( 'akismet_http_post' ) ) { ?>
122
- <tr>
123
- <td colspan="2"><?php esc_html_e( 'Use Akismet to check entries for spam for', 'formidable' ); ?>
124
- <select name="options[akismet]">
125
- <option value="">
126
- <?php esc_html_e( 'no one', 'formidable' ); ?>
127
- </option>
128
- <option value="1" <?php selected( $values['akismet'], 1 ); ?>>
129
- <?php esc_html_e( 'everyone', 'formidable' ); ?>
130
- </option>
131
- <option value="logged" <?php selected( $values['akismet'], 'logged' ); ?>>
132
- <?php esc_html_e( 'visitors who are not logged in', 'formidable' ); ?>
133
- </option>
134
- </select>
135
- </td>
136
- </tr>
137
- <?php } ?>
138
  </table>
139
 
140
  <!--AJAX Section-->
118
  </label>
119
  </td>
120
  </tr>
121
+ <?php is_callable( 'self::render_spam_settings' ) && self::render_spam_settings( $values ); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  </table>
123
 
124
  <!--AJAX Section-->
classes/views/frm-forms/spam-settings/akismet.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+ ?>
6
+ <tr>
7
+ <td colspan="2"><?php esc_html_e( 'Use Akismet to check entries for spam for', 'formidable' ); ?>
8
+ <select name="options[akismet]">
9
+ <option value="">
10
+ <?php esc_html_e( 'no one', 'formidable' ); ?>
11
+ </option>
12
+ <option value="1" <?php selected( $values['akismet'], 1 ); ?>>
13
+ <?php esc_html_e( 'everyone', 'formidable' ); ?>
14
+ </option>
15
+ <option value="logged" <?php selected( $values['akismet'], 'logged' ); ?>>
16
+ <?php esc_html_e( 'visitors who are not logged in', 'formidable' ); ?>
17
+ </option>
18
+ </select>
19
+ </td>
20
+ </tr>
classes/views/frm-forms/spam-settings/antispam.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+ ?>
6
+ <tr>
7
+ <td colspan="2">
8
+ <input id="antispam" type="checkbox" name="options[antispam]" <?php checked( $values['antispam'], 1 ); ?> value="1" />
9
+ <label for="antispam"><?php esc_html_e( 'Check entries for spam using JavaScript', 'formidable' ); ?></label>
10
+ </td>
11
+ </tr>
classes/views/frm-forms/spam-settings/honeypot.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ die( 'You are not allowed to call this page directly.' );
4
+ }
5
+ ?>
6
+ <tr>
7
+ <td colspan="2">
8
+ <label for="honeypot"><?php esc_html_e( 'Use Honeypot to check entries for spam', 'formidable' ); ?></label>
9
+ <select id="honeypot" name="options[honeypot]">
10
+ <option value="off" <?php selected( $values['honeypot'], 'off' ); ?>><?php esc_html_e( 'Off', 'formidable' ); ?></option>
11
+ <option value="basic" <?php selected( ! empty( $values['honeypot'] ) && 'strict' !== $values['honeypot'], true ); ?>><?php esc_html_e( 'Basic', 'formidable' ); ?></option>
12
+ <option value="strict" <?php selected( $values['honeypot'], 'strict' ); ?>><?php esc_html_e( 'Strict', 'formidable' ); ?></option>
13
+ </select>
14
+ </td>
15
+ </tr>
css/frm_admin.css CHANGED
@@ -3093,7 +3093,8 @@ input[type="checkbox"] {
3093
  }
3094
 
3095
  #new_fields .frm_primary_label + p,
3096
- #new_fields .frm_primary_label + .frm6 + .frm6 {
 
3097
  margin-top: 0;
3098
  }
3099
 
@@ -6793,6 +6794,13 @@ input[disabled],
6793
  font-size: 18px;
6794
  }
6795
 
 
 
 
 
 
 
 
6796
  .frm_code_list a .frmsvg,
6797
  .frm_code_list a i {
6798
  margin: 0 5px 0 0;
@@ -8028,3 +8036,8 @@ Responsive Design
8028
  .frm-admin-page-styles #frm-publishing #save_menu_header {
8029
  display: inline-block;
8030
  }
 
 
 
 
 
3093
  }
3094
 
3095
  #new_fields .frm_primary_label + p,
3096
+ #new_fields .frm_primary_label + .frm6 + .frm6,
3097
+ #new_fields .frm_primary_label + .frm6 + .frm-inline-modal + .frm6 {
3098
  margin-top: 0;
3099
  }
3100
 
6794
  font-size: 18px;
6795
  }
6796
 
6797
+ /* Icon for Name field is larger */
6798
+ .field_type_list li.frm_tname.frmbutton .frmsvg {
6799
+ width: 24px;
6800
+ height: 24px;
6801
+ padding-right: 11px;
6802
+ }
6803
+
6804
  .frm_code_list a .frmsvg,
6805
  .frm_code_list a i {
6806
  margin: 0 5px 0 0;
8036
  .frm-admin-page-styles #frm-publishing #save_menu_header {
8037
  display: inline-block;
8038
  }
8039
+
8040
+ /* Change the order of subfields of the Name field in the backend */
8041
+ .edit_form_item .frm_combo_inputs_container[data-name-layout="last_first"] .frm_form_subfield-first {
8042
+ order: 2;
8043
+ }
formidable.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
- Version: 4.10.03
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
+ Version: 4.11
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11
images/icons.svg CHANGED
@@ -932,5 +932,6 @@
932
  <symbol id="frm_comment_icon" viewBox="0 0 36 36" fill="none"><path d="M28 23.3a2.6 2.6 0 01-2.6 2.6H11c-.6 0-1.1.2-1.5.6l-2.8 2.8a1 1 0 01-1.7-.7v-18A2.6 2.6 0 017.6 8h17.8a2.6 2.6 0 012.6 2.6v12.7z" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path><path d="M12.5 2.5a1 1 0 100 2v-2zM31 19a1 1 0 102 0h-2zM12.5 4.5H27v-2H12.5v2zm18.5 4V19h2V8.5h-2zm-4-4a4 4 0 014 4h2a6 6 0 00-6-6v2z" fill="currentColor" opacity=".6"></path></symbol>
933
  <symbol id="frm_case_icon" viewBox="0 0 24 24"><path d="M15 6.5a1 1 0 01-1-1V4h-4v1.5a1 1 0 01-2 0V4c0-1.1.9-2 2-2h4a2 2 0 012 2v1.5c0 .6-.4 1-1 1zM18 12.5v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9h-9v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9H0v6.7C0 20.8 1.2 22 2.7 22h18.5c1.6 0 2.8-1.2 2.8-2.8v-6.7h-6zM21.3 5H2.7A2.7 2.7 0 000 7.8V11h6V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h9V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h6V7.7C24 6.2 22.8 5 21.3 5z" fill="currentColor"></path></symbol>
934
  <symbol id="frm_smile_icon" viewBox="0 0 24 24"><path d="M12 0a12 12 0 100 24 12 12 0 000-24zM5 9c0-1.1.9-2 2-2a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2zm12.7 9a8 8 0 01-11.4 0 1 1 0 011.4-1.5 6 6 0 008.6 0 1 1 0 011.4 1.4zm-.7-7a2 2 0 01-2-2c0-1.1.9-2 2-2a2 2 0 010 4z" fill="currentColor"></path></symbol>
 
935
  </defs>
936
  </svg>
932
  <symbol id="frm_comment_icon" viewBox="0 0 36 36" fill="none"><path d="M28 23.3a2.6 2.6 0 01-2.6 2.6H11c-.6 0-1.1.2-1.5.6l-2.8 2.8a1 1 0 01-1.7-.7v-18A2.6 2.6 0 017.6 8h17.8a2.6 2.6 0 012.6 2.6v12.7z" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path><path d="M12.5 2.5a1 1 0 100 2v-2zM31 19a1 1 0 102 0h-2zM12.5 4.5H27v-2H12.5v2zm18.5 4V19h2V8.5h-2zm-4-4a4 4 0 014 4h2a6 6 0 00-6-6v2z" fill="currentColor" opacity=".6"></path></symbol>
933
  <symbol id="frm_case_icon" viewBox="0 0 24 24"><path d="M15 6.5a1 1 0 01-1-1V4h-4v1.5a1 1 0 01-2 0V4c0-1.1.9-2 2-2h4a2 2 0 012 2v1.5c0 .6-.4 1-1 1zM18 12.5v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9h-9v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9H0v6.7C0 20.8 1.2 22 2.7 22h18.5c1.6 0 2.8-1.2 2.8-2.8v-6.7h-6zM21.3 5H2.7A2.7 2.7 0 000 7.8V11h6V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h9V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h6V7.7C24 6.2 22.8 5 21.3 5z" fill="currentColor"></path></symbol>
934
  <symbol id="frm_smile_icon" viewBox="0 0 24 24"><path d="M12 0a12 12 0 100 24 12 12 0 000-24zM5 9c0-1.1.9-2 2-2a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2zm12.7 9a8 8 0 01-11.4 0 1 1 0 011.4-1.5 6 6 0 008.6 0 1 1 0 011.4 1.4zm-.7-7a2 2 0 01-2-2c0-1.1.9-2 2-2a2 2 0 010 4z" fill="currentColor"></path></symbol>
935
+ <symbol id="frm_user_name_icon" viewBox="0 0 24 24" fill="none"><path d="M3 21L21 21C22.1046 21 23 20.1046 23 19L23 16.75L23 13.5625L23 12.5L23 11.4375L23 8.25L23 6C23 4.89543 22.1046 4 21 4L15.1429 4L8.85714 4L3 4C1.89543 4 0.999998 4.89543 0.999998 6L0.999997 19C0.999997 20.1046 1.89543 21 3 21Z" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M11.9313 9.93864C11.9313 11.5916 10.5987 12.8773 8.99262 12.8773C7.34168 12.8773 6.05398 11.5896 6.05398 9.93864C6.05398 8.33253 7.33964 7 8.99262 7C10.6008 7 11.9313 8.33049 11.9313 9.93864ZM10.1619 9.93864C10.1619 9.32165 9.60961 8.76932 8.99262 8.76932C8.33687 8.76932 7.8233 9.31757 7.8233 9.93864C7.8233 10.5984 8.33283 11.108 8.99262 11.108C9.61369 11.108 10.1619 10.5944 10.1619 9.93864ZM4 17.4699C4 15.4783 5.58561 13.8466 7.6233 13.8466H10.3619C12.3552 13.8466 13.9852 15.4766 13.9852 17.4699C13.9852 17.9734 13.5453 18.3546 13.1006 18.3546C12.605 18.3546 12.2159 17.9655 12.2159 17.4699C12.2159 16.4678 11.3641 15.6159 10.3619 15.6159H7.6233C6.5811 15.6159 5.76932 16.4651 5.76932 17.4699C5.76932 17.9734 5.32934 18.3546 4.88466 18.3546C4.38908 18.3546 4 17.9655 4 17.4699Z" fill="#282F36" fill-opacity="0.45"/><line x1="15.75" y1="9.25" x2="19.25" y2="9.25" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5" stroke-linecap="round"/><line x1="15.75" y1="12.25" x2="19.25" y2="12.25" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5" stroke-linecap="round"/></symbol>
936
  </defs>
937
  </svg>
js/formidable.js CHANGED
@@ -980,6 +980,31 @@ function frmFrontFormJS() {
980
  }
981
  }
982
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
983
  return {
984
  init: function() {
985
  jQuery( document ).off( 'submit.formidable', '.frm-show-form' );
@@ -1005,6 +1030,9 @@ function frmFrontFormJS() {
1005
  jQuery( document ).on( 'click', 'a[data-frmconfirm]', confirmClick );
1006
  jQuery( 'a[data-frmtoggle]' ).on( 'click', toggleDiv );
1007
 
 
 
 
1008
  // Add fallbacks for the beloved IE8
1009
  addIndexOfFallbackForIE8();
1010
  addTrimFallbackForIE8();
@@ -1097,8 +1125,18 @@ function frmFrontFormJS() {
1097
  },
1098
 
1099
  submitFormNow: function( object ) {
1100
- var hasFileFields,
1101
  classList = object.className.trim().split( /\s+/gi );
 
 
 
 
 
 
 
 
 
 
1102
  if ( classList.indexOf( 'frm_ajax_submit' ) > -1 ) {
1103
  hasFileFields = jQuery( object ).find( 'input[type="file"]' ).filter( function() {
1104
  return !! this.value;
980
  }
981
  }
982
 
983
+ /**
984
+ * Focus on the first sub field when clicking to the primary label of combo field.
985
+ *
986
+ * @since 4.10.02
987
+ */
988
+ function changeFocusWhenClickComboFieldLabel() {
989
+ let label;
990
+
991
+ const comboInputsContainer = document.querySelectorAll( '.frm_combo_inputs_container' );
992
+ comboInputsContainer.forEach( function( inputsContainer ) {
993
+ if ( ! inputsContainer.closest( '.frm_form_field' ) ) {
994
+ return;
995
+ }
996
+
997
+ label = inputsContainer.closest( '.frm_form_field' ).querySelector( '.frm_primary_label' );
998
+ if ( ! label ) {
999
+ return;
1000
+ }
1001
+
1002
+ label.addEventListener( 'click', function( e ) {
1003
+ inputsContainer.querySelector( '.frm_form_field:first-child input, .frm_form_field:first-child select, .frm_form_field:first-child textarea' ).focus();
1004
+ });
1005
+ });
1006
+ }
1007
+
1008
  return {
1009
  init: function() {
1010
  jQuery( document ).off( 'submit.formidable', '.frm-show-form' );
1030
  jQuery( document ).on( 'click', 'a[data-frmconfirm]', confirmClick );
1031
  jQuery( 'a[data-frmtoggle]' ).on( 'click', toggleDiv );
1032
 
1033
+ // Focus on the first sub field when clicking to the primary label of combo field.
1034
+ changeFocusWhenClickComboFieldLabel();
1035
+
1036
  // Add fallbacks for the beloved IE8
1037
  addIndexOfFallbackForIE8();
1038
  addTrimFallbackForIE8();
1125
  },
1126
 
1127
  submitFormNow: function( object ) {
1128
+ var hasFileFields, antispamInput,
1129
  classList = object.className.trim().split( /\s+/gi );
1130
+
1131
+ if ( object.hasAttribute( 'data-token' ) && null === object.querySelector( '[name="antispam_token"]' ) ) {
1132
+ // include the antispam token on form submit.
1133
+ antispamInput = document.createElement( 'input' );
1134
+ antispamInput.type = 'hidden';
1135
+ antispamInput.name = 'antispam_token';
1136
+ antispamInput.value = object.getAttribute( 'data-token' );
1137
+ object.appendChild( antispamInput );
1138
+ }
1139
+
1140
  if ( classList.indexOf( 'frm_ajax_submit' ) > -1 ) {
1141
  hasFileFields = jQuery( object ).find( 'input[type="file"]' ).filter( function() {
1142
  return !! this.value;
js/formidable.min.js CHANGED
@@ -35,22 +35,24 @@ thisVal=$thisField.val().replace(/(\n|\r\n)/g,"\r");if("replace"===e){if(thisVal
35
  entry_id:entryId,form_id:formId,nonce:frm_js.nonce},success:function(msg){var admin=document.getElementById("wpbody");if(admin===null)label.html(msg);else{label.html("");$link.after(msg)}}});return false}function confirmClick(){var message=jQuery(this).data("frmconfirm");return confirm(message)}function toggleDiv(){var div=jQuery(this).data("frmtoggle");if(jQuery(div).is(":visible"))jQuery(div).slideUp("fast");else jQuery(div).slideDown("fast");return false}function addIndexOfFallbackForIE8(){var len,
36
  from;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(elt){len=this.length>>>0;from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++)if(from in this&&this[from]===elt)return from;return-1}}function addTrimFallbackForIE8(){if(typeof String.prototype.trim!=="function")String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}function addFilterFallbackForIE8(){var t,len,res,thisp,i,val;if(!Array.prototype.filter)Array.prototype.filter=
37
  function(fun){if(this===void 0||this===null)throw new TypeError;t=Object(this);len=t.length>>>0;if(typeof fun!=="function")throw new TypeError;res=[];thisp=arguments[1];for(i=0;i<len;i++)if(i in t){val=t[i];if(fun.call(thisp,val,i,t))res.push(val)}return res}}function addKeysFallbackForIE8(){var keys,i;if(!Object.keys)Object.keys=function(obj){keys=[];for(i in obj)if(obj.hasOwnProperty(i))keys.push(i);return keys}}function onHoneypotFieldChange(){var css=jQuery(this).css("box-shadow");if(css.match(/inset/))this.parentNode.removeChild(this)}
 
38
  return{init:function(){jQuery(document).off("submit.formidable",".frm-show-form");jQuery(document).on("submit.formidable",".frm-show-form",frmFrontForm.submitForm);jQuery(".frm-show-form input[onblur], .frm-show-form textarea[onblur]").each(function(){if(jQuery(this).val()==="")jQuery(this).trigger("blur")});jQuery(document).on("focus",".frm_toggle_default",clearDefault);jQuery(document).on("blur",".frm_toggle_default",replaceDefault);jQuery(".frm_toggle_default").trigger("blur");jQuery(document.getElementById("frm_resend_email")).on("click",
39
  resendEmail);jQuery(document).on("change",'.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]',frmFrontForm.fieldValueChanged);jQuery(document).on("change keyup",".frm-show-form .frm_inside_container input, .frm-show-form .frm_inside_container select, .frm-show-form .frm_inside_container textarea",maybeShowLabel);jQuery(document).on("change","[id^=frm_email_]",onHoneypotFieldChange);jQuery(document).on("click","a[data-frmconfirm]",
40
- confirmClick);jQuery("a[data-frmtoggle]").on("click",toggleDiv);addIndexOfFallbackForIE8();addTrimFallbackForIE8();addFilterFallbackForIE8();addKeysFallbackForIE8()},getFieldId:function(field,fullID){return getFieldId(field,fullID)},renderRecaptcha:function(captcha){var formID,recaptchaID,size=captcha.getAttribute("data-size"),rendered=captcha.getAttribute("data-rid")!==null,params={"sitekey":captcha.getAttribute("data-sitekey"),"size":size,"theme":captcha.getAttribute("data-theme")};if(rendered)return;
41
- if(size==="invisible"){formID=jQuery(captcha).closest("form").find('input[name="form_id"]').val();jQuery(captcha).closest(".frm_form_field .frm_primary_label").hide();params.callback=function(token){frmFrontForm.afterRecaptcha(token,formID)}}recaptchaID=grecaptcha.render(captcha.id,params);captcha.setAttribute("data-rid",recaptchaID)},afterSingleRecaptcha:function(){var object=jQuery(".frm-show-form .g-recaptcha").closest("form")[0];frmFrontForm.submitFormNow(object)},afterRecaptcha:function(token,
42
  formID){var object=jQuery("#frm_form_"+formID+"_container form")[0];frmFrontForm.submitFormNow(object)},submitForm:function(e){frmFrontForm.submitFormManual(e,this)},submitFormManual:function(e,object){var isPro,errors,invisibleRecaptcha=hasInvisibleRecaptcha(object),classList=object.className.trim().split(/\s+/gi);if(classList&&invisibleRecaptcha.length<1){isPro=classList.indexOf("frm_pro_form")>-1;if(!isPro)return}if(jQuery("body").hasClass("wp-admin")&&jQuery(object).closest(".frmapi-form").length<
43
- 1)return;e.preventDefault();if(typeof frmProForm!=="undefined"&&typeof frmProForm.submitAllowed==="function")if(!frmProForm.submitAllowed(object))return;if(invisibleRecaptcha.length){showLoadingIndicator(jQuery(object));executeInvisibleRecaptcha(invisibleRecaptcha)}else{errors=frmFrontForm.validateFormSubmit(object);if(Object.keys(errors).length===0){showSubmitLoading(jQuery(object));frmFrontForm.submitFormNow(object,classList)}}},submitFormNow:function(object){var hasFileFields,classList=object.className.trim().split(/\s+/gi);
44
- if(classList.indexOf("frm_ajax_submit")>-1){hasFileFields=jQuery(object).find('input[type="file"]').filter(function(){return!!this.value}).length;if(hasFileFields<1){action=jQuery(object).find('input[name="frm_action"]').val();frmFrontForm.checkFormErrors(object,action)}else object.submit()}else object.submit()},validateFormSubmit:function(object){if(typeof tinyMCE!=="undefined"&&jQuery(object).find(".wp-editor-wrap").length)tinyMCE.triggerSave();jsErrors=[];if(shouldJSValidate(object)){frmFrontForm.getAjaxFormErrors(object);
45
- if(Object.keys(jsErrors).length)frmFrontForm.addAjaxFormErrors(object)}return jsErrors},getAjaxFormErrors:function(object){var customErrors,key;jsErrors=validateForm(object);if(typeof frmThemeOverride_jsErrors==="function"){action=jQuery(object).find('input[name="frm_action"]').val();customErrors=frmThemeOverride_jsErrors(action,object);if(Object.keys(customErrors).length)for(key in customErrors)jsErrors[key]=customErrors[key]}return jsErrors},addAjaxFormErrors:function(object){var key,$fieldCont;
46
- removeAllErrors();for(key in jsErrors){$fieldCont=jQuery(object).find("#frm_field_"+key+"_container");if($fieldCont.length)addFieldError($fieldCont,key,jsErrors);else delete jsErrors[key]}scrollToFirstField(object)},checkFormErrors:function(object,action){getFormErrors(object,action)},checkRequiredField:function(field,errors){return checkRequiredField(field,errors)},showSubmitLoading:function($object){showSubmitLoading($object)},removeSubmitLoading:function($object,enable,processesRunning){removeSubmitLoading($object,
47
- enable,processesRunning)},scrollToID:function(id){var object=jQuery(document.getElementById(id));frmFrontForm.scrollMsg(object,false)},scrollMsg:function(id,object,animate){var newPos,m,b,screenTop,screenBottom,scrollObj="";if(typeof object==="undefined"){scrollObj=jQuery(document.getElementById("frm_form_"+id+"_container"));if(scrollObj.length<1)return}else if(typeof id==="string")scrollObj=jQuery(object).find("#frm_field_"+id+"_container");else scrollObj=id;jQuery(scrollObj).trigger("focus");newPos=
48
- scrollObj.offset().top;if(!newPos||frm_js.offset==="-1")return;newPos=newPos-frm_js.offset;m=jQuery("html").css("margin-top");b=jQuery("body").css("margin-top");if(m||b)newPos=newPos-parseInt(m)-parseInt(b);if(newPos&&window.innerHeight){screenTop=document.documentElement.scrollTop||document.body.scrollTop;screenBottom=screenTop+window.innerHeight;if(newPos>screenBottom||newPos<screenTop){if(typeof animate==="undefined")jQuery(window).scrollTop(newPos);else jQuery("html,body").animate({scrollTop:newPos},
49
- 500);return false}}},fieldValueChanged:function(e){var fieldId=frmFrontForm.getFieldId(this,false);if(!fieldId||typeof fieldId==="undefined")return;if(e.frmTriggered&&e.frmTriggered==fieldId)return;jQuery(document).trigger("frmFieldChanged",[this,fieldId,e]);if(e.selfTriggered!==true)maybeValidateChange(fieldId,this)},savingDraft:function(object){console.warn("DEPRECATED: function frmFrontForm.savingDraft in v3.0 use frmProForm.savingDraft");if(typeof frmProForm!=="undefined")return frmProForm.savingDraft(object)},
50
- goingToPreviousPage:function(object){console.warn("DEPRECATED: function frmFrontForm.goingToPreviousPage in v3.0 use frmProForm.goingToPreviousPage");if(typeof frmProForm!=="undefined")return frmProForm.goingToPreviousPage(object)},hideOrShowFields:function(){console.warn("DEPRECATED: function frmFrontForm.hideOrShowFields in v3.0 use frmProForm.hideOrShowFields");if(typeof frmProForm!=="undefined")frmProForm.hideOrShowFields()},hidePreviouslyHiddenFields:function(){console.warn("DEPRECATED: function frmFrontForm.hidePreviouslyHiddenFields in v3.0 use frmProForm.hidePreviouslyHiddenFields");
51
- if(typeof frmProForm!=="undefined")frmProForm.hidePreviouslyHiddenFields()},checkDependentDynamicFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentDynamicFields in v3.0 use frmProForm.checkDependentDynamicFields");if(typeof frmProForm!=="undefined")frmProForm.checkDependentDynamicFields(ids)},checkDependentLookupFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentLookupFields in v3.0 use frmProForm.checkDependentLookupFields");if(typeof frmProForm!==
52
- "undefined")frmProForm.checkDependentLookupFields(ids)},loadGoogle:function(){console.warn("DEPRECATED: function frmFrontForm.loadGoogle in v3.0 use frmProForm.loadGoogle");frmProForm.loadGoogle()},escapeHtml:function(text){return text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")},invisible:function(classes){jQuery(classes).css("visibility","hidden")},visible:function(classes){jQuery(classes).css("visibility","visible")}}}
53
- frmFrontForm=frmFrontFormJS();jQuery(document).ready(function(){frmFrontForm.init()});function frmRecaptcha(){var c,cl,captchas=jQuery(".frm-g-recaptcha");for(c=0,cl=captchas.length;c<cl;c++)frmFrontForm.renderRecaptcha(captchas[c])}function frmAfterRecaptcha(token){frmFrontForm.afterSingleRecaptcha(token)}
 
54
  function frmUpdateField(entryId,fieldId,value,message,num){jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).html('<span class="frm-loading-img"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_update_field_ajax",entry_id:entryId,field_id:fieldId,value:value,nonce:frm_js.nonce},success:function(){if(message.replace(/^\s+|\s+$/g,"")==="")jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).fadeOut("slow");else jQuery(document.getElementById("frm_update_field_"+
55
  entryId+"_"+fieldId+"_"+num)).replaceWith(message)}})}
56
  function frmDeleteEntry(entryId,prefix){console.warn("DEPRECATED: function frmDeleteEntry in v2.0.13 use frmFrontForm.deleteEntry");jQuery(document.getElementById("frm_delete_"+entryId)).replaceWith('<span class="frm-loading-img" id="frm_delete_'+entryId+'"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_destroy",entry:entryId,nonce:frm_js.nonce},success:function(html){if(html.replace(/^\s+|\s+$/g,"")==="success")jQuery(document.getElementById(prefix+entryId)).fadeOut("slow");
35
  entry_id:entryId,form_id:formId,nonce:frm_js.nonce},success:function(msg){var admin=document.getElementById("wpbody");if(admin===null)label.html(msg);else{label.html("");$link.after(msg)}}});return false}function confirmClick(){var message=jQuery(this).data("frmconfirm");return confirm(message)}function toggleDiv(){var div=jQuery(this).data("frmtoggle");if(jQuery(div).is(":visible"))jQuery(div).slideUp("fast");else jQuery(div).slideDown("fast");return false}function addIndexOfFallbackForIE8(){var len,
36
  from;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(elt){len=this.length>>>0;from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++)if(from in this&&this[from]===elt)return from;return-1}}function addTrimFallbackForIE8(){if(typeof String.prototype.trim!=="function")String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}function addFilterFallbackForIE8(){var t,len,res,thisp,i,val;if(!Array.prototype.filter)Array.prototype.filter=
37
  function(fun){if(this===void 0||this===null)throw new TypeError;t=Object(this);len=t.length>>>0;if(typeof fun!=="function")throw new TypeError;res=[];thisp=arguments[1];for(i=0;i<len;i++)if(i in t){val=t[i];if(fun.call(thisp,val,i,t))res.push(val)}return res}}function addKeysFallbackForIE8(){var keys,i;if(!Object.keys)Object.keys=function(obj){keys=[];for(i in obj)if(obj.hasOwnProperty(i))keys.push(i);return keys}}function onHoneypotFieldChange(){var css=jQuery(this).css("box-shadow");if(css.match(/inset/))this.parentNode.removeChild(this)}
38
+ function changeFocusWhenClickComboFieldLabel(){var label;var comboInputsContainer=document.querySelectorAll(".frm_combo_inputs_container");comboInputsContainer.forEach(function(inputsContainer){if(!inputsContainer.closest(".frm_form_field"))return;label=inputsContainer.closest(".frm_form_field").querySelector(".frm_primary_label");if(!label)return;label.addEventListener("click",function(e){inputsContainer.querySelector(".frm_form_field:first-child input, .frm_form_field:first-child select, .frm_form_field:first-child textarea").focus()})})}
39
  return{init:function(){jQuery(document).off("submit.formidable",".frm-show-form");jQuery(document).on("submit.formidable",".frm-show-form",frmFrontForm.submitForm);jQuery(".frm-show-form input[onblur], .frm-show-form textarea[onblur]").each(function(){if(jQuery(this).val()==="")jQuery(this).trigger("blur")});jQuery(document).on("focus",".frm_toggle_default",clearDefault);jQuery(document).on("blur",".frm_toggle_default",replaceDefault);jQuery(".frm_toggle_default").trigger("blur");jQuery(document.getElementById("frm_resend_email")).on("click",
40
  resendEmail);jQuery(document).on("change",'.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]',frmFrontForm.fieldValueChanged);jQuery(document).on("change keyup",".frm-show-form .frm_inside_container input, .frm-show-form .frm_inside_container select, .frm-show-form .frm_inside_container textarea",maybeShowLabel);jQuery(document).on("change","[id^=frm_email_]",onHoneypotFieldChange);jQuery(document).on("click","a[data-frmconfirm]",
41
+ confirmClick);jQuery("a[data-frmtoggle]").on("click",toggleDiv);changeFocusWhenClickComboFieldLabel();addIndexOfFallbackForIE8();addTrimFallbackForIE8();addFilterFallbackForIE8();addKeysFallbackForIE8()},getFieldId:function(field,fullID){return getFieldId(field,fullID)},renderRecaptcha:function(captcha){var formID,recaptchaID,size=captcha.getAttribute("data-size"),rendered=captcha.getAttribute("data-rid")!==null,params={"sitekey":captcha.getAttribute("data-sitekey"),"size":size,"theme":captcha.getAttribute("data-theme")};
42
+ if(rendered)return;if(size==="invisible"){formID=jQuery(captcha).closest("form").find('input[name="form_id"]').val();jQuery(captcha).closest(".frm_form_field .frm_primary_label").hide();params.callback=function(token){frmFrontForm.afterRecaptcha(token,formID)}}recaptchaID=grecaptcha.render(captcha.id,params);captcha.setAttribute("data-rid",recaptchaID)},afterSingleRecaptcha:function(){var object=jQuery(".frm-show-form .g-recaptcha").closest("form")[0];frmFrontForm.submitFormNow(object)},afterRecaptcha:function(token,
43
  formID){var object=jQuery("#frm_form_"+formID+"_container form")[0];frmFrontForm.submitFormNow(object)},submitForm:function(e){frmFrontForm.submitFormManual(e,this)},submitFormManual:function(e,object){var isPro,errors,invisibleRecaptcha=hasInvisibleRecaptcha(object),classList=object.className.trim().split(/\s+/gi);if(classList&&invisibleRecaptcha.length<1){isPro=classList.indexOf("frm_pro_form")>-1;if(!isPro)return}if(jQuery("body").hasClass("wp-admin")&&jQuery(object).closest(".frmapi-form").length<
44
+ 1)return;e.preventDefault();if(typeof frmProForm!=="undefined"&&typeof frmProForm.submitAllowed==="function")if(!frmProForm.submitAllowed(object))return;if(invisibleRecaptcha.length){showLoadingIndicator(jQuery(object));executeInvisibleRecaptcha(invisibleRecaptcha)}else{errors=frmFrontForm.validateFormSubmit(object);if(Object.keys(errors).length===0){showSubmitLoading(jQuery(object));frmFrontForm.submitFormNow(object,classList)}}},submitFormNow:function(object){var hasFileFields,antispamInput,classList=
45
+ object.className.trim().split(/\s+/gi);if(object.hasAttribute("data-token")&&null===object.querySelector('[name="antispam_token"]')){antispamInput=document.createElement("input");antispamInput.type="hidden";antispamInput.name="antispam_token";antispamInput.value=object.getAttribute("data-token");object.appendChild(antispamInput)}if(classList.indexOf("frm_ajax_submit")>-1){hasFileFields=jQuery(object).find('input[type="file"]').filter(function(){return!!this.value}).length;if(hasFileFields<1){action=
46
+ jQuery(object).find('input[name="frm_action"]').val();frmFrontForm.checkFormErrors(object,action)}else object.submit()}else object.submit()},validateFormSubmit:function(object){if(typeof tinyMCE!=="undefined"&&jQuery(object).find(".wp-editor-wrap").length)tinyMCE.triggerSave();jsErrors=[];if(shouldJSValidate(object)){frmFrontForm.getAjaxFormErrors(object);if(Object.keys(jsErrors).length)frmFrontForm.addAjaxFormErrors(object)}return jsErrors},getAjaxFormErrors:function(object){var customErrors,key;
47
+ jsErrors=validateForm(object);if(typeof frmThemeOverride_jsErrors==="function"){action=jQuery(object).find('input[name="frm_action"]').val();customErrors=frmThemeOverride_jsErrors(action,object);if(Object.keys(customErrors).length)for(key in customErrors)jsErrors[key]=customErrors[key]}return jsErrors},addAjaxFormErrors:function(object){var key,$fieldCont;removeAllErrors();for(key in jsErrors){$fieldCont=jQuery(object).find("#frm_field_"+key+"_container");if($fieldCont.length)addFieldError($fieldCont,
48
+ key,jsErrors);else delete jsErrors[key]}scrollToFirstField(object)},checkFormErrors:function(object,action){getFormErrors(object,action)},checkRequiredField:function(field,errors){return checkRequiredField(field,errors)},showSubmitLoading:function($object){showSubmitLoading($object)},removeSubmitLoading:function($object,enable,processesRunning){removeSubmitLoading($object,enable,processesRunning)},scrollToID:function(id){var object=jQuery(document.getElementById(id));frmFrontForm.scrollMsg(object,
49
+ false)},scrollMsg:function(id,object,animate){var newPos,m,b,screenTop,screenBottom,scrollObj="";if(typeof object==="undefined"){scrollObj=jQuery(document.getElementById("frm_form_"+id+"_container"));if(scrollObj.length<1)return}else if(typeof id==="string")scrollObj=jQuery(object).find("#frm_field_"+id+"_container");else scrollObj=id;jQuery(scrollObj).trigger("focus");newPos=scrollObj.offset().top;if(!newPos||frm_js.offset==="-1")return;newPos=newPos-frm_js.offset;m=jQuery("html").css("margin-top");
50
+ b=jQuery("body").css("margin-top");if(m||b)newPos=newPos-parseInt(m)-parseInt(b);if(newPos&&window.innerHeight){screenTop=document.documentElement.scrollTop||document.body.scrollTop;screenBottom=screenTop+window.innerHeight;if(newPos>screenBottom||newPos<screenTop){if(typeof animate==="undefined")jQuery(window).scrollTop(newPos);else jQuery("html,body").animate({scrollTop:newPos},500);return false}}},fieldValueChanged:function(e){var fieldId=frmFrontForm.getFieldId(this,false);if(!fieldId||typeof fieldId===
51
+ "undefined")return;if(e.frmTriggered&&e.frmTriggered==fieldId)return;jQuery(document).trigger("frmFieldChanged",[this,fieldId,e]);if(e.selfTriggered!==true)maybeValidateChange(fieldId,this)},savingDraft:function(object){console.warn("DEPRECATED: function frmFrontForm.savingDraft in v3.0 use frmProForm.savingDraft");if(typeof frmProForm!=="undefined")return frmProForm.savingDraft(object)},goingToPreviousPage:function(object){console.warn("DEPRECATED: function frmFrontForm.goingToPreviousPage in v3.0 use frmProForm.goingToPreviousPage");
52
+ if(typeof frmProForm!=="undefined")return frmProForm.goingToPreviousPage(object)},hideOrShowFields:function(){console.warn("DEPRECATED: function frmFrontForm.hideOrShowFields in v3.0 use frmProForm.hideOrShowFields");if(typeof frmProForm!=="undefined")frmProForm.hideOrShowFields()},hidePreviouslyHiddenFields:function(){console.warn("DEPRECATED: function frmFrontForm.hidePreviouslyHiddenFields in v3.0 use frmProForm.hidePreviouslyHiddenFields");if(typeof frmProForm!=="undefined")frmProForm.hidePreviouslyHiddenFields()},
53
+ checkDependentDynamicFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentDynamicFields in v3.0 use frmProForm.checkDependentDynamicFields");if(typeof frmProForm!=="undefined")frmProForm.checkDependentDynamicFields(ids)},checkDependentLookupFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentLookupFields in v3.0 use frmProForm.checkDependentLookupFields");if(typeof frmProForm!=="undefined")frmProForm.checkDependentLookupFields(ids)},loadGoogle:function(){console.warn("DEPRECATED: function frmFrontForm.loadGoogle in v3.0 use frmProForm.loadGoogle");
54
+ frmProForm.loadGoogle()},escapeHtml:function(text){return text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")},invisible:function(classes){jQuery(classes).css("visibility","hidden")},visible:function(classes){jQuery(classes).css("visibility","visible")}}}frmFrontForm=frmFrontFormJS();jQuery(document).ready(function(){frmFrontForm.init()});
55
+ function frmRecaptcha(){var c,cl,captchas=jQuery(".frm-g-recaptcha");for(c=0,cl=captchas.length;c<cl;c++)frmFrontForm.renderRecaptcha(captchas[c])}function frmAfterRecaptcha(token){frmFrontForm.afterSingleRecaptcha(token)}
56
  function frmUpdateField(entryId,fieldId,value,message,num){jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).html('<span class="frm-loading-img"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_update_field_ajax",entry_id:entryId,field_id:fieldId,value:value,nonce:frm_js.nonce},success:function(){if(message.replace(/^\s+|\s+$/g,"")==="")jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).fadeOut("slow");else jQuery(document.getElementById("frm_update_field_"+
57
  entryId+"_"+fieldId+"_"+num)).replaceWith(message)}})}
58
  function frmDeleteEntry(entryId,prefix){console.warn("DEPRECATED: function frmDeleteEntry in v2.0.13 use frmFrontForm.deleteEntry");jQuery(document.getElementById("frm_delete_"+entryId)).replaceWith('<span class="frm-loading-img" id="frm_delete_'+entryId+'"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_destroy",entry:entryId,nonce:frm_js.nonce},success:function(html){if(html.replace(/^\s+|\s+$/g,"")==="success")jQuery(document.getElementById(prefix+entryId)).fadeOut("slow");
js/formidable_admin.js CHANGED
@@ -2159,11 +2159,14 @@ function frmAdminBuildJS() {
2159
  wp.media.model.settings.post.id = postID;
2160
 
2161
  fileFrame = wp.media.frames.file_frame = wp.media({
2162
- multiple: false
 
 
 
2163
  });
2164
 
2165
  fileFrame.on( 'select', function() {
2166
- attachment = fileFrame.state().get( 'selection' ).first().toJSON();
2167
  $imagePreview.find( 'img' ).attr( 'src', attachment.url );
2168
  $imagePreview.find( '.frm_image_preview_frame' ).show();
2169
  $imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
@@ -3556,11 +3559,15 @@ function frmAdminBuildJS() {
3556
 
3557
  if ( classes.trim() === '' ) {
3558
  replace = ' frmstart frmend ';
 
 
 
3559
  replaceWith = ' frmstart ' + replaceWith.trim() + ' frmend ';
3560
  } else {
3561
  replace = classes.trim();
3562
  replaceWith = replaceWith.trim();
3563
  }
 
3564
  field.className = field.className.replace( replace, replaceWith );
3565
  }
3566
 
@@ -6570,6 +6577,117 @@ function frmAdminBuildJS() {
6570
  return object;
6571
  }
6572
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6573
  function debounce( func, wait = 100 ) {
6574
  let timeout;
6575
  return function( ...args ) {
@@ -6831,6 +6949,7 @@ function frmAdminBuildJS() {
6831
  hideEmptyEle();
6832
  maybeDisableAddSummaryBtn();
6833
  maybeHideQuantityProductFieldOption();
 
6834
  },
6835
 
6836
  settingsInit: function() {
2159
  wp.media.model.settings.post.id = postID;
2160
 
2161
  fileFrame = wp.media.frames.file_frame = wp.media({
2162
+ multiple: false,
2163
+ library: {
2164
+ type: [ 'image' ]
2165
+ }
2166
  });
2167
 
2168
  fileFrame.on( 'select', function() {
2169
+ const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
2170
  $imagePreview.find( 'img' ).attr( 'src', attachment.url );
2171
  $imagePreview.find( '.frm_image_preview_frame' ).show();
2172
  $imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
3559
 
3560
  if ( classes.trim() === '' ) {
3561
  replace = ' frmstart frmend ';
3562
+ if ( -1 === field.className.indexOf( replace ) ) {
3563
+ replace = ' frmstart frmend ';
3564
+ }
3565
  replaceWith = ' frmstart ' + replaceWith.trim() + ' frmend ';
3566
  } else {
3567
  replace = classes.trim();
3568
  replaceWith = replaceWith.trim();
3569
  }
3570
+
3571
  field.className = field.className.replace( replace, replaceWith );
3572
  }
3573
 
6577
  return object;
6578
  }
6579
 
6580
+ /**
6581
+ * Show, hide, and sort subfields of Name field on form builder.
6582
+ *
6583
+ * @since 4.11
6584
+ */
6585
+ function handleNameFieldOnFormBuilder() {
6586
+ /**
6587
+ * Gets subfield element from cache.
6588
+ *
6589
+ * @param {String} fieldId Field ID.
6590
+ * @param {String} key Cache key.
6591
+ * @returns {HTMLElement|undefined} Return the element from cache or undefined if not found.
6592
+ */
6593
+ const getSubFieldElFromCache = ( fieldId, key ) => {
6594
+ window.frmCachedSubFields = window.frmCachedSubFields || {};
6595
+ window.frmCachedSubFields[fieldId] = window.frmCachedSubFields[fieldId] || {};
6596
+ return window.frmCachedSubFields[fieldId][key];
6597
+ };
6598
+
6599
+ /**
6600
+ * Sets subfield element to cache.
6601
+ *
6602
+ * @param {String} fieldId Field ID.
6603
+ * @param {String} key Cache key.
6604
+ * @param {HTMLElement} el Element.
6605
+ */
6606
+ const setSubFieldElToCache = ( fieldId, key, el ) => {
6607
+ window.frmCachedSubFields = window.frmCachedSubFields || {};
6608
+ window.frmCachedSubFields[fieldId] = window.frmCachedSubFields[fieldId] || {};
6609
+ window.frmCachedSubFields[fieldId][key] = el;
6610
+ };
6611
+
6612
+ /**
6613
+ * Gets column class from the number of columns.
6614
+ *
6615
+ * @param {Number} colCount Number of columns.
6616
+ * @returns {string}
6617
+ */
6618
+ const getColClass = colCount => 'frm' + parseInt( 12 / colCount );
6619
+
6620
+ const colClasses = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ].map( num => 'frm' + num );
6621
+
6622
+ const allSubFieldNames = [ 'first', 'middle', 'last' ];
6623
+
6624
+ /**
6625
+ * Handles name layout change.
6626
+ *
6627
+ * @param {Event} event Event object.
6628
+ */
6629
+ const onChangeLayout = event => {
6630
+ const value = event.target.value;
6631
+ const subFieldNames = value.split( '_' );
6632
+ const fieldId = event.target.dataset.fieldId;
6633
+
6634
+ /*
6635
+ * Live update form on the form builder.
6636
+ */
6637
+ const container = document.querySelector( '#field_' + fieldId + '_inner_container .frm_combo_inputs_container' );
6638
+ const newColClass = getColClass( subFieldNames.length );
6639
+
6640
+ // Set all sub field elements to cache and hide all of them first.
6641
+ allSubFieldNames.forEach( name => {
6642
+ const subFieldEl = container.querySelector( '[data-sub-field-name="' + name + '"]' );
6643
+ if ( subFieldEl ) {
6644
+ subFieldEl.classList.add( 'frm_hidden' );
6645
+ subFieldEl.classList.remove( ...colClasses );
6646
+ setSubFieldElToCache( fieldId, name, subFieldEl );
6647
+ }
6648
+ });
6649
+
6650
+ subFieldNames.forEach( subFieldName => {
6651
+ const subFieldEl = getSubFieldElFromCache( fieldId, subFieldName );
6652
+ if ( ! subFieldEl ) {
6653
+ return;
6654
+ }
6655
+
6656
+ subFieldEl.classList.remove( 'frm_hidden' );
6657
+ subFieldEl.classList.add( newColClass );
6658
+
6659
+ container.append( subFieldEl );
6660
+ });
6661
+
6662
+ /*
6663
+ * Live update subfield options.
6664
+ */
6665
+ // Hide all subfield options.
6666
+ allSubFieldNames.forEach( name => {
6667
+ const optionsEl = document.querySelector( '.frm_sub_field_options-' + name + '[data-field-id="' + fieldId + '"]' );
6668
+ if ( optionsEl ) {
6669
+ optionsEl.classList.add( 'frm_hidden' );
6670
+ setSubFieldElToCache( fieldId, name + '_options', optionsEl );
6671
+ }
6672
+ });
6673
+
6674
+ subFieldNames.forEach( subFieldName => {
6675
+ const optionsEl = getSubFieldElFromCache( fieldId, subFieldName + '_options' );
6676
+ if ( ! optionsEl ) {
6677
+ return;
6678
+ }
6679
+ optionsEl.classList.remove( 'frm_hidden' );
6680
+ });
6681
+ };
6682
+
6683
+ const dropdownSelector = '.frm_name_layout_dropdown';
6684
+ document.addEventListener( 'change', event => {
6685
+ if ( event.target.matches( dropdownSelector ) ) {
6686
+ onChangeLayout( event );
6687
+ }
6688
+ }, false );
6689
+ }
6690
+
6691
  function debounce( func, wait = 100 ) {
6692
  let timeout;
6693
  return function( ...args ) {
6949
  hideEmptyEle();
6950
  maybeDisableAddSummaryBtn();
6951
  maybeHideQuantityProductFieldOption();
6952
+ handleNameFieldOnFormBuilder();
6953
  },
6954
 
6955
  settingsInit: function() {
languages/formidable.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Formidable Forms 4.10.03\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: 2021-05-12T18:14:04+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: formidable\n"
@@ -130,7 +130,7 @@ msgstr ""
130
 
131
  #: classes/controllers/FrmAddonsController.php:22
132
  #: classes/controllers/FrmAddonsController.php:23
133
- #: classes/helpers/FrmFormsHelper.php:1326
134
  #: classes/views/frm-fields/back-end/smart-values.php:16
135
  #: classes/views/shared/admin-header.php:32
136
  msgid "Upgrade"
@@ -191,7 +191,7 @@ msgstr ""
191
  #: classes/controllers/FrmAppController.php:165
192
  #: classes/controllers/FrmEntriesController.php:11
193
  #: classes/controllers/FrmEntriesController.php:100
194
- #: classes/controllers/FrmFormsController.php:756
195
  #: classes/controllers/FrmXMLController.php:259
196
  #: classes/views/xml/import_form.php:121
197
  msgid "Entries"
@@ -217,14 +217,14 @@ msgid "Build a Form"
217
  msgstr ""
218
 
219
  #: classes/controllers/FrmEntriesController.php:79
220
- #: classes/controllers/FrmFormsController.php:1262
221
  #: classes/views/frm-entries/form.php:54
222
  #: classes/views/frm-entries/sidebar-shared.php:57
223
  msgid "Entry Key"
224
  msgstr ""
225
 
226
  #: classes/controllers/FrmEntriesController.php:84
227
- #: classes/controllers/FrmFormsController.php:657
228
  #: classes/views/xml/import_form.php:152
229
  #: classes/widgets/FrmShowForm.php:59
230
  msgid "Form"
@@ -235,7 +235,7 @@ msgid "Entry Name"
235
  msgstr ""
236
 
237
  #: classes/controllers/FrmEntriesController.php:86
238
- #: classes/helpers/FrmCSVExportHelper.php:218
239
  msgid "Created By"
240
  msgstr ""
241
 
@@ -314,7 +314,7 @@ msgid "You do not have permission to do that"
314
  msgstr ""
315
 
316
  #: classes/controllers/FrmFormsController.php:9
317
- #: classes/controllers/FrmFormsController.php:766
318
  #: classes/controllers/FrmStylesController.php:51
319
  #: classes/controllers/FrmXMLController.php:258
320
  #: classes/views/frm-forms/list.php:10
@@ -333,111 +333,111 @@ msgstr ""
333
  msgid "Add Conditional Logic"
334
  msgstr ""
335
 
336
- #: classes/controllers/FrmFormsController.php:141
337
  msgid "Settings Successfully Updated"
338
  msgstr ""
339
 
340
- #: classes/controllers/FrmFormsController.php:168
341
- #: classes/controllers/FrmFormsController.php:966
342
  msgid "Form was successfully updated."
343
  msgstr ""
344
 
345
  #. translators: %1$s: Start link HTML, %2$s: end link HTML
346
- #: classes/controllers/FrmFormsController.php:173
347
  msgid "However, your form is very long and may be %1$sreaching server limits%2$s."
348
  msgstr ""
349
 
350
- #: classes/controllers/FrmFormsController.php:227
351
  #: deprecated/FrmDeprecated.php:414
352
  msgid "Form template was Successfully Created"
353
  msgstr ""
354
 
355
- #: classes/controllers/FrmFormsController.php:227
356
  msgid "Form was Successfully Copied"
357
  msgstr ""
358
 
359
- #: classes/controllers/FrmFormsController.php:231
360
  msgid "There was a problem creating the new template."
361
  msgstr ""
362
 
363
- #: classes/controllers/FrmFormsController.php:360
364
  msgid "Form Preview"
365
  msgstr ""
366
 
367
  #. translators: %1$s: Number of forms
368
- #: classes/controllers/FrmFormsController.php:405
369
- #: classes/controllers/FrmFormsController.php:466
370
  msgid "%1$s form restored from the Trash."
371
  msgid_plural "%1$s forms restored from the Trash."
372
  msgstr[0] ""
373
  msgstr[1] ""
374
 
375
  #. translators: %1$s: Number of forms, %2$s: Start link HTML, %3$s: End link HTML
376
- #: classes/controllers/FrmFormsController.php:469
377
- #: classes/controllers/FrmFormsController.php:494
378
  msgid "%1$s form moved to the Trash. %2$sUndo%3$s"
379
  msgid_plural "%1$s forms moved to the Trash. %2$sUndo%3$s"
380
  msgstr[0] ""
381
  msgstr[1] ""
382
 
383
  #. translators: %1$s: Number of forms
384
- #: classes/controllers/FrmFormsController.php:517
385
  msgid "%1$s Form Permanently Deleted"
386
  msgid_plural "%1$s Forms Permanently Deleted"
387
  msgstr[0] ""
388
  msgstr[1] ""
389
 
390
  #. translators: %1$s: Number of forms
391
- #: classes/controllers/FrmFormsController.php:534
392
- #: classes/controllers/FrmFormsController.php:551
393
  msgid "%1$s form permanently deleted."
394
  msgid_plural "%1$s forms permanently deleted."
395
  msgstr[0] ""
396
  msgstr[1] ""
397
 
398
- #: classes/controllers/FrmFormsController.php:597
399
  msgid "There was an error creating a template."
400
  msgstr ""
401
 
402
- #: classes/controllers/FrmFormsController.php:641
403
  msgid "Add forms and content"
404
  msgstr ""
405
 
406
- #: classes/controllers/FrmFormsController.php:658
407
  #: classes/views/frm-forms/insert_form_popup.php:33
408
  msgid "Insert a Form"
409
  msgstr ""
410
 
411
- #: classes/controllers/FrmFormsController.php:687
412
  msgid "Display form title"
413
  msgstr ""
414
 
415
- #: classes/controllers/FrmFormsController.php:691
416
  msgid "Display form description"
417
  msgstr ""
418
 
419
- #: classes/controllers/FrmFormsController.php:695
420
  msgid "Minimize form HTML"
421
  msgstr ""
422
 
423
- #: classes/controllers/FrmFormsController.php:751
424
  #: classes/views/frm-forms/new-form-overlay.php:46
425
  msgid "Template Name"
426
  msgstr ""
427
 
428
- #: classes/controllers/FrmFormsController.php:752
429
  #: classes/views/xml/import_form.php:120
430
  msgid "Type"
431
  msgstr ""
432
 
433
- #: classes/controllers/FrmFormsController.php:753
434
- #: classes/controllers/FrmFormsController.php:757
435
- #: classes/helpers/FrmCSVExportHelper.php:223
436
  #: classes/views/shared/mb_adv_info.php:98
437
  msgid "Key"
438
  msgstr ""
439
 
440
- #: classes/controllers/FrmFormsController.php:755
441
  #: classes/controllers/FrmStylesController.php:394
442
  #: classes/views/frm-forms/settings-advanced.php:13
443
  #: classes/views/styles/manage.php:39
@@ -446,188 +446,188 @@ msgstr ""
446
  msgid "Form Title"
447
  msgstr ""
448
 
449
- #: classes/controllers/FrmFormsController.php:758
450
  msgid "Shortcodes"
451
  msgstr ""
452
 
453
- #: classes/controllers/FrmFormsController.php:761
454
- #: classes/models/FrmField.php:82
455
  msgid "Date"
456
  msgstr ""
457
 
458
- #: classes/controllers/FrmFormsController.php:881
459
- #: classes/helpers/FrmFormsHelper.php:1269
460
  msgid "My Templates"
461
  msgstr ""
462
 
463
- #: classes/controllers/FrmFormsController.php:940
464
  msgid "You are trying to edit a form that does not exist."
465
  msgstr ""
466
 
467
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
468
- #: classes/controllers/FrmFormsController.php:945
469
  msgid "You are trying to edit a child form. Please edit from %1$shere%2$s"
470
  msgstr ""
471
 
472
- #: classes/controllers/FrmFormsController.php:968
473
  msgid "Template was successfully updated."
474
  msgstr ""
475
 
476
- #: classes/controllers/FrmFormsController.php:1032
477
  #: classes/controllers/FrmStylesController.php:393
478
  msgid "General"
479
  msgstr ""
480
 
481
- #: classes/controllers/FrmFormsController.php:1033
482
  msgid "General Form Settings"
483
  msgstr ""
484
 
485
- #: classes/controllers/FrmFormsController.php:1038
486
  msgid "Actions & Notifications"
487
  msgstr ""
488
 
489
- #: classes/controllers/FrmFormsController.php:1044
490
- #: classes/controllers/FrmFormsController.php:1049
491
  msgid "Form Permissions"
492
  msgstr ""
493
 
494
- #: classes/controllers/FrmFormsController.php:1050
495
  msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
496
  msgstr ""
497
 
498
- #: classes/controllers/FrmFormsController.php:1054
499
  msgid "Form Scheduling"
500
  msgstr ""
501
 
502
- #: classes/controllers/FrmFormsController.php:1059
503
  msgid "Form scheduling settings"
504
  msgstr ""
505
 
506
- #: classes/controllers/FrmFormsController.php:1063
507
  msgid "Styling & Buttons"
508
  msgstr ""
509
 
510
- #: classes/controllers/FrmFormsController.php:1069
511
  msgid "Customize HTML"
512
  msgstr ""
513
 
514
- #: classes/controllers/FrmFormsController.php:1178
515
  msgid "Customize field values with the following parameters."
516
  msgstr ""
517
 
518
- #: classes/controllers/FrmFormsController.php:1215
519
  msgid "Separator"
520
  msgstr ""
521
 
522
- #: classes/controllers/FrmFormsController.php:1216
523
  msgid "Use a different separator for checkbox fields"
524
  msgstr ""
525
 
526
- #: classes/controllers/FrmFormsController.php:1219
527
  msgid "Date Format"
528
  msgstr ""
529
 
530
- #: classes/controllers/FrmFormsController.php:1222
531
  #: classes/views/frm-fields/back-end/settings.php:27
532
  msgid "Field Label"
533
  msgstr ""
534
 
535
- #: classes/controllers/FrmFormsController.php:1225
536
  msgid "No Auto P"
537
  msgstr ""
538
 
539
- #: classes/controllers/FrmFormsController.php:1226
540
  msgid "Do not automatically add any paragraphs or line breaks"
541
  msgstr ""
542
 
543
- #: classes/controllers/FrmFormsController.php:1241
544
- #: classes/models/FrmField.php:58
545
  msgid "User ID"
546
  msgstr ""
547
 
548
- #: classes/controllers/FrmFormsController.php:1242
549
  msgid "First Name"
550
  msgstr ""
551
 
552
- #: classes/controllers/FrmFormsController.php:1243
553
  msgid "Last Name"
554
  msgstr ""
555
 
556
- #: classes/controllers/FrmFormsController.php:1244
557
  msgid "Display Name"
558
  msgstr ""
559
 
560
- #: classes/controllers/FrmFormsController.php:1245
561
  msgid "User Login"
562
  msgstr ""
563
 
564
- #: classes/controllers/FrmFormsController.php:1246
565
  #: classes/models/FrmField.php:34
566
  msgid "Email"
567
  msgstr ""
568
 
569
- #: classes/controllers/FrmFormsController.php:1247
570
  msgid "Avatar"
571
  msgstr ""
572
 
573
- #: classes/controllers/FrmFormsController.php:1248
574
  msgid "Author Link"
575
  msgstr ""
576
 
577
- #: classes/controllers/FrmFormsController.php:1261
578
  #: classes/views/frm-entries/sidebar-shared.php:51
579
  msgid "Entry ID"
580
  msgstr ""
581
 
582
- #: classes/controllers/FrmFormsController.php:1263
583
  msgid "Post ID"
584
  msgstr ""
585
 
586
- #: classes/controllers/FrmFormsController.php:1264
587
  msgid "User IP"
588
  msgstr ""
589
 
590
- #: classes/controllers/FrmFormsController.php:1265
591
  msgid "Entry created"
592
  msgstr ""
593
 
594
- #: classes/controllers/FrmFormsController.php:1266
595
  msgid "Entry updated"
596
  msgstr ""
597
 
598
- #: classes/controllers/FrmFormsController.php:1268
599
  msgid "Site URL"
600
  msgstr ""
601
 
602
- #: classes/controllers/FrmFormsController.php:1269
603
  msgid "Site Name"
604
  msgstr ""
605
 
606
- #: classes/controllers/FrmFormsController.php:1277
607
  msgid "Default Msg"
608
  msgstr ""
609
 
610
- #: classes/controllers/FrmFormsController.php:1278
611
  msgid "Default HTML"
612
  msgstr ""
613
 
614
- #: classes/controllers/FrmFormsController.php:1279
615
  msgid "Default Plain"
616
  msgstr ""
617
 
618
- #: classes/controllers/FrmFormsController.php:1368
619
  msgid "No forms were specified"
620
  msgstr ""
621
 
622
- #: classes/controllers/FrmFormsController.php:1480
623
  msgid "Abnormal HTML characters prevented your form from saving correctly"
624
  msgstr ""
625
 
626
- #: classes/controllers/FrmFormsController.php:1595
627
  #: classes/helpers/FrmFormsHelper.php:57
628
  #: classes/helpers/FrmFormsHelper.php:112
629
  #: classes/helpers/FrmFormsHelper.php:166
630
- #: classes/helpers/FrmFormsHelper.php:1024
631
  #: classes/helpers/FrmFormsListHelper.php:315
632
  #: classes/views/frm-forms/create-template-from-an-existing-form.php:25
633
  #: classes/views/styles/manage.php:59
@@ -635,17 +635,17 @@ msgstr ""
635
  msgid "(no title)"
636
  msgstr ""
637
 
638
- #: classes/controllers/FrmFormsController.php:1641
639
- #: classes/controllers/FrmFormsController.php:1655
640
  msgid "Please select a valid form"
641
  msgstr ""
642
 
643
- #: classes/controllers/FrmFormsController.php:1877
644
  msgid "Please wait while you are redirected."
645
  msgstr ""
646
 
647
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
648
- #: classes/controllers/FrmFormsController.php:1913
649
  msgid "%1$sClick here%2$s if you are not automatically redirected."
650
  msgstr ""
651
 
@@ -700,7 +700,7 @@ msgid "Plugin Licenses"
700
  msgstr ""
701
 
702
  #: classes/controllers/FrmSettingsController.php:104
703
- #: classes/views/frm-forms/settings-advanced.php:186
704
  msgid "Miscellaneous"
705
  msgstr ""
706
 
@@ -909,7 +909,7 @@ msgid "Your form styles have been saved."
909
  msgstr ""
910
 
911
  #: classes/controllers/FrmStylesController.php:395
912
- #: classes/helpers/FrmFormsHelper.php:509
913
  #: classes/views/frm-forms/new-form-overlay.php:53
914
  #: classes/views/frm-forms/new-form-overlay.php:54
915
  #: classes/views/frm-forms/settings-advanced.php:27
@@ -921,7 +921,7 @@ msgid "Field Labels"
921
  msgstr ""
922
 
923
  #: classes/controllers/FrmStylesController.php:397
924
- #: classes/helpers/FrmFormsHelper.php:469
925
  #: classes/views/frm-fields/back-end/field-description.php:8
926
  msgid "Field Description"
927
  msgstr ""
@@ -1154,7 +1154,7 @@ msgid "Remove"
1154
  msgstr ""
1155
 
1156
  #: classes/helpers/FrmAppHelper.php:2448
1157
- #: classes/helpers/FrmCSVExportHelper.php:222
1158
  #: classes/views/shared/mb_adv_info.php:95
1159
  msgid "ID"
1160
  msgstr ""
@@ -1333,7 +1333,7 @@ msgid "The parameter \"%s\" is reserved by WordPress. This may cause problems wh
1333
  msgstr ""
1334
 
1335
  #: classes/helpers/FrmAppHelper.php:2505
1336
- #: classes/helpers/FrmFormsHelper.php:1500
1337
  msgid "See the list of reserved words in WordPress."
1338
  msgstr ""
1339
 
@@ -1622,45 +1622,45 @@ msgstr ""
1622
  msgid "Renew Now"
1623
  msgstr ""
1624
 
1625
- #: classes/helpers/FrmCSVExportHelper.php:127
1626
  msgid "(label)"
1627
  msgstr ""
1628
 
1629
- #: classes/helpers/FrmCSVExportHelper.php:209
1630
  msgid "Comment"
1631
  msgstr ""
1632
 
1633
- #: classes/helpers/FrmCSVExportHelper.php:210
1634
  msgid "Comment User"
1635
  msgstr ""
1636
 
1637
- #: classes/helpers/FrmCSVExportHelper.php:211
1638
  msgid "Comment Date"
1639
  msgstr ""
1640
 
1641
- #: classes/helpers/FrmCSVExportHelper.php:216
1642
  msgid "Timestamp"
1643
  msgstr ""
1644
 
1645
- #: classes/helpers/FrmCSVExportHelper.php:217
1646
  msgid "Last Updated"
1647
  msgstr ""
1648
 
1649
- #: classes/helpers/FrmCSVExportHelper.php:219
1650
  msgid "Updated By"
1651
  msgstr ""
1652
 
1653
- #: classes/helpers/FrmCSVExportHelper.php:220
1654
- #: classes/helpers/FrmFormsHelper.php:1227
1655
  #: classes/helpers/FrmFormsListHelper.php:342
1656
  msgid "Draft"
1657
  msgstr ""
1658
 
1659
- #: classes/helpers/FrmCSVExportHelper.php:221
1660
  msgid "IP"
1661
  msgstr ""
1662
 
1663
- #: classes/helpers/FrmCSVExportHelper.php:225
1664
  msgid "Parent ID"
1665
  msgstr ""
1666
 
@@ -1737,7 +1737,7 @@ msgid "Permanently delete this entry?"
1737
  msgstr ""
1738
 
1739
  #: classes/helpers/FrmEntriesListHelper.php:309
1740
- #: classes/helpers/FrmFormsHelper.php:1132
1741
  #: classes/helpers/FrmFormsListHelper.php:133
1742
  #: classes/views/frm-form-actions/form_action.php:25
1743
  msgid "Delete"
@@ -2954,220 +2954,221 @@ msgstr ""
2954
  msgid "(ID %d)"
2955
  msgstr ""
2956
 
2957
- #: classes/helpers/FrmFormsHelper.php:457
2958
  msgid "Field ID"
2959
  msgstr ""
2960
 
2961
- #: classes/helpers/FrmFormsHelper.php:461
2962
  #: classes/views/frm-fields/back-end/settings.php:294
2963
  msgid "Field Key"
2964
  msgstr ""
2965
 
2966
- #: classes/helpers/FrmFormsHelper.php:465
2967
  msgid "Field Name"
2968
  msgstr ""
2969
 
2970
- #: classes/helpers/FrmFormsHelper.php:473
2971
  #: classes/views/frm-fields/back-end/settings.php:267
2972
  msgid "Label Position"
2973
  msgstr ""
2974
 
2975
- #: classes/helpers/FrmFormsHelper.php:477
2976
  msgid "Required Label"
2977
  msgstr ""
2978
 
2979
- #: classes/helpers/FrmFormsHelper.php:481
2980
  msgid "Input Field"
2981
  msgstr ""
2982
 
2983
- #: classes/helpers/FrmFormsHelper.php:485
2984
  msgid "Single Option"
2985
  msgstr ""
2986
 
2987
- #: classes/helpers/FrmFormsHelper.php:486
2988
  msgid "Show a single radio or checkbox option by replacing 1 with the order of the option"
2989
  msgstr ""
2990
 
2991
- #: classes/helpers/FrmFormsHelper.php:490
2992
  msgid "Hide Option Label"
2993
  msgstr ""
2994
 
2995
- #: classes/helpers/FrmFormsHelper.php:494
2996
  msgid "Required Class"
2997
  msgstr ""
2998
 
2999
- #: classes/helpers/FrmFormsHelper.php:495
3000
  msgid "Add class name if field is required"
3001
  msgstr ""
3002
 
3003
- #: classes/helpers/FrmFormsHelper.php:499
3004
  msgid "Error Class"
3005
  msgstr ""
3006
 
3007
- #: classes/helpers/FrmFormsHelper.php:500
3008
  msgid "Add class name if field has an error on form submit"
3009
  msgstr ""
3010
 
3011
- #: classes/helpers/FrmFormsHelper.php:505
3012
  #: classes/views/frm-forms/new-form-overlay.php:46
3013
  #: classes/views/frm-forms/new-form-overlay.php:47
3014
  msgid "Form Name"
3015
  msgstr ""
3016
 
3017
- #: classes/helpers/FrmFormsHelper.php:513
3018
  #: classes/views/frm-forms/settings-advanced.php:20
3019
  msgid "Form Key"
3020
  msgstr ""
3021
 
3022
- #: classes/helpers/FrmFormsHelper.php:517
3023
  msgid "Delete Entry Link"
3024
  msgstr ""
3025
 
3026
- #: classes/helpers/FrmFormsHelper.php:522
3027
  msgid "Button Label"
3028
  msgstr ""
3029
 
3030
- #: classes/helpers/FrmFormsHelper.php:526
3031
  msgid "Button Hook"
3032
  msgstr ""
3033
 
3034
- #: classes/helpers/FrmFormsHelper.php:992
3035
  msgid "Create Form from Template"
3036
  msgstr ""
3037
 
3038
- #: classes/helpers/FrmFormsHelper.php:998
3039
  msgid "Duplicate Form"
3040
  msgstr ""
3041
 
3042
- #: classes/helpers/FrmFormsHelper.php:1119
3043
  msgid "Restore from Trash"
3044
  msgstr ""
3045
 
3046
- #: classes/helpers/FrmFormsHelper.php:1120
3047
  #: classes/helpers/FrmFormsListHelper.php:124
3048
  msgid "Restore"
3049
  msgstr ""
3050
 
3051
- #: classes/helpers/FrmFormsHelper.php:1124
3052
  msgid "Move Form to Trash"
3053
  msgstr ""
3054
 
3055
- #: classes/helpers/FrmFormsHelper.php:1125
3056
- #: classes/helpers/FrmFormsHelper.php:1228
3057
  #: classes/helpers/FrmFormsListHelper.php:158
3058
  msgid "Trash"
3059
  msgstr ""
3060
 
3061
- #: classes/helpers/FrmFormsHelper.php:1128
3062
  msgid "Do you want to move this form to the trash?"
3063
  msgstr ""
3064
 
3065
- #: classes/helpers/FrmFormsHelper.php:1131
3066
  #: classes/helpers/FrmFormsListHelper.php:128
3067
  msgid "Delete Permanently"
3068
  msgstr ""
3069
 
3070
- #: classes/helpers/FrmFormsHelper.php:1134
3071
  msgid "Are you sure you want to delete this form and all its entries?"
3072
  msgstr ""
3073
 
3074
- #: classes/helpers/FrmFormsHelper.php:1136
3075
  msgid "This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?"
3076
  msgstr ""
3077
 
3078
- #: classes/helpers/FrmFormsHelper.php:1147
3079
- #: classes/models/FrmField.php:189
3080
  msgid "Total"
3081
  msgstr ""
3082
 
3083
- #: classes/helpers/FrmFormsHelper.php:1148
3084
  msgid "Add this to a read-only field to display the text in bold without a border or background."
3085
  msgstr ""
3086
 
3087
- #: classes/helpers/FrmFormsHelper.php:1151
3088
  msgid "Big Total"
3089
  msgstr ""
3090
 
3091
- #: classes/helpers/FrmFormsHelper.php:1152
3092
  msgid "Add this to a read-only field to display the text in large, bold text without a border or background."
3093
  msgstr ""
3094
 
3095
- #: classes/helpers/FrmFormsHelper.php:1155
3096
  msgid "Scroll Box"
3097
  msgstr ""
3098
 
3099
- #: classes/helpers/FrmFormsHelper.php:1156
3100
  msgid "If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field."
3101
  msgstr ""
3102
 
3103
- #: classes/helpers/FrmFormsHelper.php:1159
 
3104
  msgid "First"
3105
  msgstr ""
3106
 
3107
- #: classes/helpers/FrmFormsHelper.php:1160
3108
  msgid "Add this to the first field in each row along with a width. ie frm_first frm4"
3109
  msgstr ""
3110
 
3111
- #: classes/helpers/FrmFormsHelper.php:1162
3112
  #: classes/helpers/FrmStylesHelper.php:113
3113
  msgid "Right"
3114
  msgstr ""
3115
 
3116
- #: classes/helpers/FrmFormsHelper.php:1163
3117
  msgid "First Grid Row"
3118
  msgstr ""
3119
 
3120
- #: classes/helpers/FrmFormsHelper.php:1164
3121
  msgid "Even Grid Row"
3122
  msgstr ""
3123
 
3124
- #: classes/helpers/FrmFormsHelper.php:1165
3125
  msgid "Odd Grid Row"
3126
  msgstr ""
3127
 
3128
- #: classes/helpers/FrmFormsHelper.php:1167
3129
  msgid "Color Block"
3130
  msgstr ""
3131
 
3132
- #: classes/helpers/FrmFormsHelper.php:1168
3133
  msgid "Add a background color to the field or section."
3134
  msgstr ""
3135
 
3136
- #: classes/helpers/FrmFormsHelper.php:1171
3137
  msgid "Capitalize"
3138
  msgstr ""
3139
 
3140
- #: classes/helpers/FrmFormsHelper.php:1172
3141
  msgid "Automatically capitalize the first letter in each word."
3142
  msgstr ""
3143
 
3144
- #: classes/helpers/FrmFormsHelper.php:1229
3145
  msgid "Published"
3146
  msgstr ""
3147
 
3148
- #: classes/helpers/FrmFormsHelper.php:1313
3149
  msgid "Create Form"
3150
  msgstr ""
3151
 
3152
- #: classes/helpers/FrmFormsHelper.php:1321
3153
  msgid "Renew"
3154
  msgstr ""
3155
 
3156
- #: classes/helpers/FrmFormsHelper.php:1385
3157
  msgid "License plan required:"
3158
  msgstr ""
3159
 
3160
- #: classes/helpers/FrmFormsHelper.php:1499
3161
  msgid "Is this intentional?"
3162
  msgstr ""
3163
 
3164
  #. translators: %s: the name of a single parameter in the redirect URL
3165
- #: classes/helpers/FrmFormsHelper.php:1509
3166
  msgid "The redirect URL is using the parameter \"%s\", which is reserved by WordPress. "
3167
  msgstr ""
3168
 
3169
  #. translators: %s: the names of two or more parameters in the redirect URL, separated by commas
3170
- #: classes/helpers/FrmFormsHelper.php:1515
3171
  msgid "The redirect URL is using the parameters \"%s\", which are reserved by WordPress. "
3172
  msgstr ""
3173
 
@@ -3639,11 +3640,11 @@ msgstr[1] ""
3639
  msgid "Go to imported form"
3640
  msgstr ""
3641
 
3642
- #: classes/helpers/FrmXMLHelper.php:1302
3643
  msgid "Create Posts"
3644
  msgstr ""
3645
 
3646
- #: classes/helpers/FrmXMLHelper.php:1431
3647
  msgid "Email Notification"
3648
  msgstr ""
3649
 
@@ -3671,6 +3672,28 @@ msgstr ""
3671
  msgid "Option 2"
3672
  msgstr ""
3673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3674
  #: classes/models/fields/FrmFieldNumber.php:68
3675
  msgid "Please select a higher number"
3676
  msgstr ""
@@ -3767,6 +3790,19 @@ msgstr ""
3767
  msgid "There was a %1$s error: %2$s"
3768
  msgstr ""
3769
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3770
  #: classes/models/FrmDb.php:447
3771
  msgid "Use the query in an array format so it can be properly prepared."
3772
  msgstr ""
@@ -3800,12 +3836,12 @@ msgstr ""
3800
  msgid "There was a problem with your submission. Please try again."
3801
  msgstr ""
3802
 
3803
- #: classes/models/FrmEntryValidate.php:233
3804
- #: classes/models/FrmEntryValidate.php:242
3805
  msgid "Your entry appears to be spam!"
3806
  msgstr ""
3807
 
3808
- #: classes/models/FrmEntryValidate.php:237
3809
  msgid "Your entry appears to be blocked spam!"
3810
  msgstr ""
3811
 
@@ -3847,115 +3883,119 @@ msgid "Number"
3847
  msgstr ""
3848
 
3849
  #: classes/models/FrmField.php:46
3850
- msgid "Phone"
3851
  msgstr ""
3852
 
3853
  #: classes/models/FrmField.php:50
3854
- msgid "HTML"
3855
  msgstr ""
3856
 
3857
  #: classes/models/FrmField.php:54
 
 
 
 
3858
  msgid "Hidden"
3859
  msgstr ""
3860
 
3861
- #: classes/models/FrmField.php:62
3862
  msgid "reCAPTCHA"
3863
  msgstr ""
3864
 
3865
- #: classes/models/FrmField.php:73
3866
  msgid "File Upload"
3867
  msgstr ""
3868
 
3869
- #: classes/models/FrmField.php:78
3870
  msgid "Rich Text"
3871
  msgstr ""
3872
 
3873
- #: classes/models/FrmField.php:86
3874
  msgid "Time"
3875
  msgstr ""
3876
 
3877
- #: classes/models/FrmField.php:90
3878
  msgid "Scale"
3879
  msgstr ""
3880
 
3881
- #: classes/models/FrmField.php:95
3882
  msgid "Star Rating"
3883
  msgstr ""
3884
 
3885
- #: classes/models/FrmField.php:99
3886
  msgid "Slider"
3887
  msgstr ""
3888
 
3889
- #: classes/models/FrmField.php:103
3890
  msgid "Toggle"
3891
  msgstr ""
3892
 
3893
- #: classes/models/FrmField.php:107
3894
  msgid "Dynamic"
3895
  msgstr ""
3896
 
3897
- #: classes/models/FrmField.php:112
3898
  msgid "Lookup"
3899
  msgstr ""
3900
 
3901
- #: classes/models/FrmField.php:117
3902
  msgid "Repeater"
3903
  msgstr ""
3904
 
3905
- #: classes/models/FrmField.php:122
3906
  #: classes/models/FrmFormMigrator.php:302
3907
  msgid "Section Buttons"
3908
  msgstr ""
3909
 
3910
- #: classes/models/FrmField.php:126
3911
  msgid "Section"
3912
  msgstr ""
3913
 
3914
- #: classes/models/FrmField.php:130
3915
  msgid "Page Break"
3916
  msgstr ""
3917
 
3918
- #: classes/models/FrmField.php:135
3919
  msgid "Embed Form"
3920
  msgstr ""
3921
 
3922
- #: classes/models/FrmField.php:139
3923
  msgid "Password"
3924
  msgstr ""
3925
 
3926
- #: classes/models/FrmField.php:143
3927
  msgid "Tags"
3928
  msgstr ""
3929
 
3930
- #: classes/models/FrmField.php:147
3931
  msgid "Credit Card"
3932
  msgstr ""
3933
 
3934
- #: classes/models/FrmField.php:152
3935
  msgid "Address"
3936
  msgstr ""
3937
 
3938
- #: classes/models/FrmField.php:156
3939
  msgid "Summary"
3940
  msgstr ""
3941
 
3942
- #: classes/models/FrmField.php:161
3943
  msgid "Signature"
3944
  msgstr ""
3945
 
3946
- #: classes/models/FrmField.php:166
3947
  msgid "Quiz Score"
3948
  msgstr ""
3949
 
3950
- #: classes/models/FrmField.php:171
3951
  msgid "Appointment"
3952
  msgstr ""
3953
 
3954
- #: classes/models/FrmField.php:179
3955
  msgid "Product"
3956
  msgstr ""
3957
 
3958
- #: classes/models/FrmField.php:184
3959
  msgid "Quantity"
3960
  msgstr ""
3961
 
@@ -4011,6 +4051,10 @@ msgstr ""
4011
  msgid "Default Form"
4012
  msgstr ""
4013
 
 
 
 
 
4014
  #: classes/models/FrmMigrate.php:564
4015
  msgid "Sending"
4016
  msgstr ""
@@ -4236,10 +4280,6 @@ msgstr ""
4236
  msgid "You did not add any fields to your form. %1$sGo back%2$s and add some."
4237
  msgstr ""
4238
 
4239
- #: classes/views/frm-entries/form.php:65
4240
- msgid "If you are human, leave this field blank."
4241
- msgstr ""
4242
-
4243
  #: classes/views/frm-entries/list.php:14
4244
  #: classes/views/frm-entries/list.php:25
4245
  msgid "Form Entries"
@@ -4441,6 +4481,22 @@ msgstr ""
4441
  msgid "Max Characters"
4442
  msgstr ""
4443
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4444
  #: classes/views/frm-fields/back-end/number-range.php:7
4445
  msgid "Set the number range the field validation should allow. Browsers that support the HTML5 number field require a number range to determine the numbers seen when clicking the arrows next to the field."
4446
  msgstr ""
@@ -4525,14 +4581,6 @@ msgstr ""
4525
  msgid "Advanced"
4526
  msgstr ""
4527
 
4528
- #: classes/views/frm-fields/back-end/settings.php:134
4529
- msgid "Default Value"
4530
- msgstr ""
4531
-
4532
- #: classes/views/frm-fields/back-end/settings.php:180
4533
- msgid "Placeholder Text"
4534
- msgstr ""
4535
-
4536
  #: classes/views/frm-fields/back-end/settings.php:214
4537
  msgid "If this URL points to an image, show to image on the entries listing page."
4538
  msgstr ""
@@ -5113,7 +5161,7 @@ msgid "Form Settings"
5113
  msgstr ""
5114
 
5115
  #: classes/views/frm-forms/settings-advanced.php:67
5116
- #: classes/views/frm-forms/settings-advanced.php:177
5117
  msgid "On Submit"
5118
  msgstr ""
5119
 
@@ -5141,51 +5189,35 @@ msgstr ""
5141
  msgid "Do not store entries submitted from this form"
5142
  msgstr ""
5143
 
5144
- #: classes/views/frm-forms/settings-advanced.php:123
5145
- msgid "Use Akismet to check entries for spam for"
5146
- msgstr ""
5147
-
5148
- #: classes/views/frm-forms/settings-advanced.php:126
5149
- msgid "no one"
5150
- msgstr ""
5151
-
5152
- #: classes/views/frm-forms/settings-advanced.php:129
5153
- msgid "everyone"
5154
- msgstr ""
5155
-
5156
- #: classes/views/frm-forms/settings-advanced.php:132
5157
- msgid "visitors who are not logged in"
5158
- msgstr ""
5159
-
5160
- #: classes/views/frm-forms/settings-advanced.php:141
5161
  msgid "AJAX"
5162
  msgstr ""
5163
 
5164
- #: classes/views/frm-forms/settings-advanced.php:142
5165
  msgid "Make stuff happen in the background without a page refresh"
5166
  msgstr ""
5167
 
5168
- #: classes/views/frm-forms/settings-advanced.php:149
5169
  msgid "Load and save form builder page with AJAX"
5170
  msgstr ""
5171
 
5172
- #: classes/views/frm-forms/settings-advanced.php:150
5173
  msgid "Recommended for long forms."
5174
  msgstr ""
5175
 
5176
- #: classes/views/frm-forms/settings-advanced.php:159
5177
  msgid "Validate this form with javascript"
5178
  msgstr ""
5179
 
5180
- #: classes/views/frm-forms/settings-advanced.php:160
5181
  msgid "Required fields, email format, and number format can be checked instantly in your browser. You may want to turn this option off if you have any customizations to remove validation messages on certain fields."
5182
  msgstr ""
5183
 
5184
- #: classes/views/frm-forms/settings-advanced.php:171
5185
  msgid "Messages"
5186
  msgstr ""
5187
 
5188
- #: classes/views/frm-forms/settings-advanced.php:172
5189
  msgid "Set up your confirmation messages."
5190
  msgstr ""
5191
 
@@ -5239,6 +5271,42 @@ msgstr ""
5239
  msgid "Select a form:"
5240
  msgstr ""
5241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5242
  #: classes/views/frm-forms/_no_forms.php:17
5243
  msgid "Add New Form"
5244
  msgstr ""
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Formidable Forms 4.11\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: 2021-05-21T15:16:11+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: formidable\n"
130
 
131
  #: classes/controllers/FrmAddonsController.php:22
132
  #: classes/controllers/FrmAddonsController.php:23
133
+ #: classes/helpers/FrmFormsHelper.php:1328
134
  #: classes/views/frm-fields/back-end/smart-values.php:16
135
  #: classes/views/shared/admin-header.php:32
136
  msgid "Upgrade"
191
  #: classes/controllers/FrmAppController.php:165
192
  #: classes/controllers/FrmEntriesController.php:11
193
  #: classes/controllers/FrmEntriesController.php:100
194
+ #: classes/controllers/FrmFormsController.php:772
195
  #: classes/controllers/FrmXMLController.php:259
196
  #: classes/views/xml/import_form.php:121
197
  msgid "Entries"
217
  msgstr ""
218
 
219
  #: classes/controllers/FrmEntriesController.php:79
220
+ #: classes/controllers/FrmFormsController.php:1289
221
  #: classes/views/frm-entries/form.php:54
222
  #: classes/views/frm-entries/sidebar-shared.php:57
223
  msgid "Entry Key"
224
  msgstr ""
225
 
226
  #: classes/controllers/FrmEntriesController.php:84
227
+ #: classes/controllers/FrmFormsController.php:673
228
  #: classes/views/xml/import_form.php:152
229
  #: classes/widgets/FrmShowForm.php:59
230
  msgid "Form"
235
  msgstr ""
236
 
237
  #: classes/controllers/FrmEntriesController.php:86
238
+ #: classes/helpers/FrmCSVExportHelper.php:225
239
  msgid "Created By"
240
  msgstr ""
241
 
314
  msgstr ""
315
 
316
  #: classes/controllers/FrmFormsController.php:9
317
+ #: classes/controllers/FrmFormsController.php:782
318
  #: classes/controllers/FrmStylesController.php:51
319
  #: classes/controllers/FrmXMLController.php:258
320
  #: classes/views/frm-forms/list.php:10
333
  msgid "Add Conditional Logic"
334
  msgstr ""
335
 
336
+ #: classes/controllers/FrmFormsController.php:148
337
  msgid "Settings Successfully Updated"
338
  msgstr ""
339
 
340
+ #: classes/controllers/FrmFormsController.php:184
341
+ #: classes/controllers/FrmFormsController.php:982
342
  msgid "Form was successfully updated."
343
  msgstr ""
344
 
345
  #. translators: %1$s: Start link HTML, %2$s: end link HTML
346
+ #: classes/controllers/FrmFormsController.php:189
347
  msgid "However, your form is very long and may be %1$sreaching server limits%2$s."
348
  msgstr ""
349
 
350
+ #: classes/controllers/FrmFormsController.php:243
351
  #: deprecated/FrmDeprecated.php:414
352
  msgid "Form template was Successfully Created"
353
  msgstr ""
354
 
355
+ #: classes/controllers/FrmFormsController.php:243
356
  msgid "Form was Successfully Copied"
357
  msgstr ""
358
 
359
+ #: classes/controllers/FrmFormsController.php:247
360
  msgid "There was a problem creating the new template."
361
  msgstr ""
362
 
363
+ #: classes/controllers/FrmFormsController.php:376
364
  msgid "Form Preview"
365
  msgstr ""
366
 
367
  #. translators: %1$s: Number of forms
368
+ #: classes/controllers/FrmFormsController.php:421
369
+ #: classes/controllers/FrmFormsController.php:482
370
  msgid "%1$s form restored from the Trash."
371
  msgid_plural "%1$s forms restored from the Trash."
372
  msgstr[0] ""
373
  msgstr[1] ""
374
 
375
  #. translators: %1$s: Number of forms, %2$s: Start link HTML, %3$s: End link HTML
376
+ #: classes/controllers/FrmFormsController.php:485
377
+ #: classes/controllers/FrmFormsController.php:510
378
  msgid "%1$s form moved to the Trash. %2$sUndo%3$s"
379
  msgid_plural "%1$s forms moved to the Trash. %2$sUndo%3$s"
380
  msgstr[0] ""
381
  msgstr[1] ""
382
 
383
  #. translators: %1$s: Number of forms
384
+ #: classes/controllers/FrmFormsController.php:533
385
  msgid "%1$s Form Permanently Deleted"
386
  msgid_plural "%1$s Forms Permanently Deleted"
387
  msgstr[0] ""
388
  msgstr[1] ""
389
 
390
  #. translators: %1$s: Number of forms
391
+ #: classes/controllers/FrmFormsController.php:550
392
+ #: classes/controllers/FrmFormsController.php:567
393
  msgid "%1$s form permanently deleted."
394
  msgid_plural "%1$s forms permanently deleted."
395
  msgstr[0] ""
396
  msgstr[1] ""
397
 
398
+ #: classes/controllers/FrmFormsController.php:613
399
  msgid "There was an error creating a template."
400
  msgstr ""
401
 
402
+ #: classes/controllers/FrmFormsController.php:657
403
  msgid "Add forms and content"
404
  msgstr ""
405
 
406
+ #: classes/controllers/FrmFormsController.php:674
407
  #: classes/views/frm-forms/insert_form_popup.php:33
408
  msgid "Insert a Form"
409
  msgstr ""
410
 
411
+ #: classes/controllers/FrmFormsController.php:703
412
  msgid "Display form title"
413
  msgstr ""
414
 
415
+ #: classes/controllers/FrmFormsController.php:707
416
  msgid "Display form description"
417
  msgstr ""
418
 
419
+ #: classes/controllers/FrmFormsController.php:711
420
  msgid "Minimize form HTML"
421
  msgstr ""
422
 
423
+ #: classes/controllers/FrmFormsController.php:767
424
  #: classes/views/frm-forms/new-form-overlay.php:46
425
  msgid "Template Name"
426
  msgstr ""
427
 
428
+ #: classes/controllers/FrmFormsController.php:768
429
  #: classes/views/xml/import_form.php:120
430
  msgid "Type"
431
  msgstr ""
432
 
433
+ #: classes/controllers/FrmFormsController.php:769
434
+ #: classes/controllers/FrmFormsController.php:773
435
+ #: classes/helpers/FrmCSVExportHelper.php:230
436
  #: classes/views/shared/mb_adv_info.php:98
437
  msgid "Key"
438
  msgstr ""
439
 
440
+ #: classes/controllers/FrmFormsController.php:771
441
  #: classes/controllers/FrmStylesController.php:394
442
  #: classes/views/frm-forms/settings-advanced.php:13
443
  #: classes/views/styles/manage.php:39
446
  msgid "Form Title"
447
  msgstr ""
448
 
449
+ #: classes/controllers/FrmFormsController.php:774
450
  msgid "Shortcodes"
451
  msgstr ""
452
 
453
+ #: classes/controllers/FrmFormsController.php:777
454
+ #: classes/models/FrmField.php:86
455
  msgid "Date"
456
  msgstr ""
457
 
458
+ #: classes/controllers/FrmFormsController.php:897
459
+ #: classes/helpers/FrmFormsHelper.php:1271
460
  msgid "My Templates"
461
  msgstr ""
462
 
463
+ #: classes/controllers/FrmFormsController.php:956
464
  msgid "You are trying to edit a form that does not exist."
465
  msgstr ""
466
 
467
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
468
+ #: classes/controllers/FrmFormsController.php:961
469
  msgid "You are trying to edit a child form. Please edit from %1$shere%2$s"
470
  msgstr ""
471
 
472
+ #: classes/controllers/FrmFormsController.php:984
473
  msgid "Template was successfully updated."
474
  msgstr ""
475
 
476
+ #: classes/controllers/FrmFormsController.php:1048
477
  #: classes/controllers/FrmStylesController.php:393
478
  msgid "General"
479
  msgstr ""
480
 
481
+ #: classes/controllers/FrmFormsController.php:1049
482
  msgid "General Form Settings"
483
  msgstr ""
484
 
485
+ #: classes/controllers/FrmFormsController.php:1054
486
  msgid "Actions & Notifications"
487
  msgstr ""
488
 
489
+ #: classes/controllers/FrmFormsController.php:1060
490
+ #: classes/controllers/FrmFormsController.php:1065
491
  msgid "Form Permissions"
492
  msgstr ""
493
 
494
+ #: classes/controllers/FrmFormsController.php:1066
495
  msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
496
  msgstr ""
497
 
498
+ #: classes/controllers/FrmFormsController.php:1070
499
  msgid "Form Scheduling"
500
  msgstr ""
501
 
502
+ #: classes/controllers/FrmFormsController.php:1075
503
  msgid "Form scheduling settings"
504
  msgstr ""
505
 
506
+ #: classes/controllers/FrmFormsController.php:1079
507
  msgid "Styling & Buttons"
508
  msgstr ""
509
 
510
+ #: classes/controllers/FrmFormsController.php:1085
511
  msgid "Customize HTML"
512
  msgstr ""
513
 
514
+ #: classes/controllers/FrmFormsController.php:1205
515
  msgid "Customize field values with the following parameters."
516
  msgstr ""
517
 
518
+ #: classes/controllers/FrmFormsController.php:1242
519
  msgid "Separator"
520
  msgstr ""
521
 
522
+ #: classes/controllers/FrmFormsController.php:1243
523
  msgid "Use a different separator for checkbox fields"
524
  msgstr ""
525
 
526
+ #: classes/controllers/FrmFormsController.php:1246
527
  msgid "Date Format"
528
  msgstr ""
529
 
530
+ #: classes/controllers/FrmFormsController.php:1249
531
  #: classes/views/frm-fields/back-end/settings.php:27
532
  msgid "Field Label"
533
  msgstr ""
534
 
535
+ #: classes/controllers/FrmFormsController.php:1252
536
  msgid "No Auto P"
537
  msgstr ""
538
 
539
+ #: classes/controllers/FrmFormsController.php:1253
540
  msgid "Do not automatically add any paragraphs or line breaks"
541
  msgstr ""
542
 
543
+ #: classes/controllers/FrmFormsController.php:1268
544
+ #: classes/models/FrmField.php:62
545
  msgid "User ID"
546
  msgstr ""
547
 
548
+ #: classes/controllers/FrmFormsController.php:1269
549
  msgid "First Name"
550
  msgstr ""
551
 
552
+ #: classes/controllers/FrmFormsController.php:1270
553
  msgid "Last Name"
554
  msgstr ""
555
 
556
+ #: classes/controllers/FrmFormsController.php:1271
557
  msgid "Display Name"
558
  msgstr ""
559
 
560
+ #: classes/controllers/FrmFormsController.php:1272
561
  msgid "User Login"
562
  msgstr ""
563
 
564
+ #: classes/controllers/FrmFormsController.php:1273
565
  #: classes/models/FrmField.php:34
566
  msgid "Email"
567
  msgstr ""
568
 
569
+ #: classes/controllers/FrmFormsController.php:1274
570
  msgid "Avatar"
571
  msgstr ""
572
 
573
+ #: classes/controllers/FrmFormsController.php:1275
574
  msgid "Author Link"
575
  msgstr ""
576
 
577
+ #: classes/controllers/FrmFormsController.php:1288
578
  #: classes/views/frm-entries/sidebar-shared.php:51
579
  msgid "Entry ID"
580
  msgstr ""
581
 
582
+ #: classes/controllers/FrmFormsController.php:1290
583
  msgid "Post ID"
584
  msgstr ""
585
 
586
+ #: classes/controllers/FrmFormsController.php:1291
587
  msgid "User IP"
588
  msgstr ""
589
 
590
+ #: classes/controllers/FrmFormsController.php:1292
591
  msgid "Entry created"
592
  msgstr ""
593
 
594
+ #: classes/controllers/FrmFormsController.php:1293
595
  msgid "Entry updated"
596
  msgstr ""
597
 
598
+ #: classes/controllers/FrmFormsController.php:1295
599
  msgid "Site URL"
600
  msgstr ""
601
 
602
+ #: classes/controllers/FrmFormsController.php:1296
603
  msgid "Site Name"
604
  msgstr ""
605
 
606
+ #: classes/controllers/FrmFormsController.php:1304
607
  msgid "Default Msg"
608
  msgstr ""
609
 
610
+ #: classes/controllers/FrmFormsController.php:1305
611
  msgid "Default HTML"
612
  msgstr ""
613
 
614
+ #: classes/controllers/FrmFormsController.php:1306
615
  msgid "Default Plain"
616
  msgstr ""
617
 
618
+ #: classes/controllers/FrmFormsController.php:1395
619
  msgid "No forms were specified"
620
  msgstr ""
621
 
622
+ #: classes/controllers/FrmFormsController.php:1507
623
  msgid "Abnormal HTML characters prevented your form from saving correctly"
624
  msgstr ""
625
 
626
+ #: classes/controllers/FrmFormsController.php:1622
627
  #: classes/helpers/FrmFormsHelper.php:57
628
  #: classes/helpers/FrmFormsHelper.php:112
629
  #: classes/helpers/FrmFormsHelper.php:166
630
+ #: classes/helpers/FrmFormsHelper.php:1026
631
  #: classes/helpers/FrmFormsListHelper.php:315
632
  #: classes/views/frm-forms/create-template-from-an-existing-form.php:25
633
  #: classes/views/styles/manage.php:59
635
  msgid "(no title)"
636
  msgstr ""
637
 
638
+ #: classes/controllers/FrmFormsController.php:1668
639
+ #: classes/controllers/FrmFormsController.php:1682
640
  msgid "Please select a valid form"
641
  msgstr ""
642
 
643
+ #: classes/controllers/FrmFormsController.php:1904
644
  msgid "Please wait while you are redirected."
645
  msgstr ""
646
 
647
  #. translators: %1$s: Start link HTML, %2$s: End link HTML
648
+ #: classes/controllers/FrmFormsController.php:1940
649
  msgid "%1$sClick here%2$s if you are not automatically redirected."
650
  msgstr ""
651
 
700
  msgstr ""
701
 
702
  #: classes/controllers/FrmSettingsController.php:104
703
+ #: classes/views/frm-forms/settings-advanced.php:170
704
  msgid "Miscellaneous"
705
  msgstr ""
706
 
909
  msgstr ""
910
 
911
  #: classes/controllers/FrmStylesController.php:395
912
+ #: classes/helpers/FrmFormsHelper.php:511
913
  #: classes/views/frm-forms/new-form-overlay.php:53
914
  #: classes/views/frm-forms/new-form-overlay.php:54
915
  #: classes/views/frm-forms/settings-advanced.php:27
921
  msgstr ""
922
 
923
  #: classes/controllers/FrmStylesController.php:397
924
+ #: classes/helpers/FrmFormsHelper.php:471
925
  #: classes/views/frm-fields/back-end/field-description.php:8
926
  msgid "Field Description"
927
  msgstr ""
1154
  msgstr ""
1155
 
1156
  #: classes/helpers/FrmAppHelper.php:2448
1157
+ #: classes/helpers/FrmCSVExportHelper.php:229
1158
  #: classes/views/shared/mb_adv_info.php:95
1159
  msgid "ID"
1160
  msgstr ""
1333
  msgstr ""
1334
 
1335
  #: classes/helpers/FrmAppHelper.php:2505
1336
+ #: classes/helpers/FrmFormsHelper.php:1502
1337
  msgid "See the list of reserved words in WordPress."
1338
  msgstr ""
1339
 
1622
  msgid "Renew Now"
1623
  msgstr ""
1624
 
1625
+ #: classes/helpers/FrmCSVExportHelper.php:132
1626
  msgid "(label)"
1627
  msgstr ""
1628
 
1629
+ #: classes/helpers/FrmCSVExportHelper.php:216
1630
  msgid "Comment"
1631
  msgstr ""
1632
 
1633
+ #: classes/helpers/FrmCSVExportHelper.php:217
1634
  msgid "Comment User"
1635
  msgstr ""
1636
 
1637
+ #: classes/helpers/FrmCSVExportHelper.php:218
1638
  msgid "Comment Date"
1639
  msgstr ""
1640
 
1641
+ #: classes/helpers/FrmCSVExportHelper.php:223
1642
  msgid "Timestamp"
1643
  msgstr ""
1644
 
1645
+ #: classes/helpers/FrmCSVExportHelper.php:224
1646
  msgid "Last Updated"
1647
  msgstr ""
1648
 
1649
+ #: classes/helpers/FrmCSVExportHelper.php:226
1650
  msgid "Updated By"
1651
  msgstr ""
1652
 
1653
+ #: classes/helpers/FrmCSVExportHelper.php:227
1654
+ #: classes/helpers/FrmFormsHelper.php:1229
1655
  #: classes/helpers/FrmFormsListHelper.php:342
1656
  msgid "Draft"
1657
  msgstr ""
1658
 
1659
+ #: classes/helpers/FrmCSVExportHelper.php:228
1660
  msgid "IP"
1661
  msgstr ""
1662
 
1663
+ #: classes/helpers/FrmCSVExportHelper.php:232
1664
  msgid "Parent ID"
1665
  msgstr ""
1666
 
1737
  msgstr ""
1738
 
1739
  #: classes/helpers/FrmEntriesListHelper.php:309
1740
+ #: classes/helpers/FrmFormsHelper.php:1134
1741
  #: classes/helpers/FrmFormsListHelper.php:133
1742
  #: classes/views/frm-form-actions/form_action.php:25
1743
  msgid "Delete"
2954
  msgid "(ID %d)"
2955
  msgstr ""
2956
 
2957
+ #: classes/helpers/FrmFormsHelper.php:459
2958
  msgid "Field ID"
2959
  msgstr ""
2960
 
2961
+ #: classes/helpers/FrmFormsHelper.php:463
2962
  #: classes/views/frm-fields/back-end/settings.php:294
2963
  msgid "Field Key"
2964
  msgstr ""
2965
 
2966
+ #: classes/helpers/FrmFormsHelper.php:467
2967
  msgid "Field Name"
2968
  msgstr ""
2969
 
2970
+ #: classes/helpers/FrmFormsHelper.php:475
2971
  #: classes/views/frm-fields/back-end/settings.php:267
2972
  msgid "Label Position"
2973
  msgstr ""
2974
 
2975
+ #: classes/helpers/FrmFormsHelper.php:479
2976
  msgid "Required Label"
2977
  msgstr ""
2978
 
2979
+ #: classes/helpers/FrmFormsHelper.php:483
2980
  msgid "Input Field"
2981
  msgstr ""
2982
 
2983
+ #: classes/helpers/FrmFormsHelper.php:487
2984
  msgid "Single Option"
2985
  msgstr ""
2986
 
2987
+ #: classes/helpers/FrmFormsHelper.php:488
2988
  msgid "Show a single radio or checkbox option by replacing 1 with the order of the option"
2989
  msgstr ""
2990
 
2991
+ #: classes/helpers/FrmFormsHelper.php:492
2992
  msgid "Hide Option Label"
2993
  msgstr ""
2994
 
2995
+ #: classes/helpers/FrmFormsHelper.php:496
2996
  msgid "Required Class"
2997
  msgstr ""
2998
 
2999
+ #: classes/helpers/FrmFormsHelper.php:497
3000
  msgid "Add class name if field is required"
3001
  msgstr ""
3002
 
3003
+ #: classes/helpers/FrmFormsHelper.php:501
3004
  msgid "Error Class"
3005
  msgstr ""
3006
 
3007
+ #: classes/helpers/FrmFormsHelper.php:502
3008
  msgid "Add class name if field has an error on form submit"
3009
  msgstr ""
3010
 
3011
+ #: classes/helpers/FrmFormsHelper.php:507
3012
  #: classes/views/frm-forms/new-form-overlay.php:46
3013
  #: classes/views/frm-forms/new-form-overlay.php:47
3014
  msgid "Form Name"
3015
  msgstr ""
3016
 
3017
+ #: classes/helpers/FrmFormsHelper.php:515
3018
  #: classes/views/frm-forms/settings-advanced.php:20
3019
  msgid "Form Key"
3020
  msgstr ""
3021
 
3022
+ #: classes/helpers/FrmFormsHelper.php:519
3023
  msgid "Delete Entry Link"
3024
  msgstr ""
3025
 
3026
+ #: classes/helpers/FrmFormsHelper.php:524
3027
  msgid "Button Label"
3028
  msgstr ""
3029
 
3030
+ #: classes/helpers/FrmFormsHelper.php:528
3031
  msgid "Button Hook"
3032
  msgstr ""
3033
 
3034
+ #: classes/helpers/FrmFormsHelper.php:994
3035
  msgid "Create Form from Template"
3036
  msgstr ""
3037
 
3038
+ #: classes/helpers/FrmFormsHelper.php:1000
3039
  msgid "Duplicate Form"
3040
  msgstr ""
3041
 
3042
+ #: classes/helpers/FrmFormsHelper.php:1121
3043
  msgid "Restore from Trash"
3044
  msgstr ""
3045
 
3046
+ #: classes/helpers/FrmFormsHelper.php:1122
3047
  #: classes/helpers/FrmFormsListHelper.php:124
3048
  msgid "Restore"
3049
  msgstr ""
3050
 
3051
+ #: classes/helpers/FrmFormsHelper.php:1126
3052
  msgid "Move Form to Trash"
3053
  msgstr ""
3054
 
3055
+ #: classes/helpers/FrmFormsHelper.php:1127
3056
+ #: classes/helpers/FrmFormsHelper.php:1230
3057
  #: classes/helpers/FrmFormsListHelper.php:158
3058
  msgid "Trash"
3059
  msgstr ""
3060
 
3061
+ #: classes/helpers/FrmFormsHelper.php:1130
3062
  msgid "Do you want to move this form to the trash?"
3063
  msgstr ""
3064
 
3065
+ #: classes/helpers/FrmFormsHelper.php:1133
3066
  #: classes/helpers/FrmFormsListHelper.php:128
3067
  msgid "Delete Permanently"
3068
  msgstr ""
3069
 
3070
+ #: classes/helpers/FrmFormsHelper.php:1136
3071
  msgid "Are you sure you want to delete this form and all its entries?"
3072
  msgstr ""
3073
 
3074
+ #: classes/helpers/FrmFormsHelper.php:1138
3075
  msgid "This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?"
3076
  msgstr ""
3077
 
3078
+ #: classes/helpers/FrmFormsHelper.php:1149
3079
+ #: classes/models/FrmField.php:193
3080
  msgid "Total"
3081
  msgstr ""
3082
 
3083
+ #: classes/helpers/FrmFormsHelper.php:1150
3084
  msgid "Add this to a read-only field to display the text in bold without a border or background."
3085
  msgstr ""
3086
 
3087
+ #: classes/helpers/FrmFormsHelper.php:1153
3088
  msgid "Big Total"
3089
  msgstr ""
3090
 
3091
+ #: classes/helpers/FrmFormsHelper.php:1154
3092
  msgid "Add this to a read-only field to display the text in large, bold text without a border or background."
3093
  msgstr ""
3094
 
3095
+ #: classes/helpers/FrmFormsHelper.php:1157
3096
  msgid "Scroll Box"
3097
  msgstr ""
3098
 
3099
+ #: classes/helpers/FrmFormsHelper.php:1158
3100
  msgid "If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field."
3101
  msgstr ""
3102
 
3103
+ #: classes/helpers/FrmFormsHelper.php:1161
3104
+ #: classes/models/fields/FrmFieldName.php:28
3105
  msgid "First"
3106
  msgstr ""
3107
 
3108
+ #: classes/helpers/FrmFormsHelper.php:1162
3109
  msgid "Add this to the first field in each row along with a width. ie frm_first frm4"
3110
  msgstr ""
3111
 
3112
+ #: classes/helpers/FrmFormsHelper.php:1164
3113
  #: classes/helpers/FrmStylesHelper.php:113
3114
  msgid "Right"
3115
  msgstr ""
3116
 
3117
+ #: classes/helpers/FrmFormsHelper.php:1165
3118
  msgid "First Grid Row"
3119
  msgstr ""
3120
 
3121
+ #: classes/helpers/FrmFormsHelper.php:1166
3122
  msgid "Even Grid Row"
3123
  msgstr ""
3124
 
3125
+ #: classes/helpers/FrmFormsHelper.php:1167
3126
  msgid "Odd Grid Row"
3127
  msgstr ""
3128
 
3129
+ #: classes/helpers/FrmFormsHelper.php:1169
3130
  msgid "Color Block"
3131
  msgstr ""
3132
 
3133
+ #: classes/helpers/FrmFormsHelper.php:1170
3134
  msgid "Add a background color to the field or section."
3135
  msgstr ""
3136
 
3137
+ #: classes/helpers/FrmFormsHelper.php:1173
3138
  msgid "Capitalize"
3139
  msgstr ""
3140
 
3141
+ #: classes/helpers/FrmFormsHelper.php:1174
3142
  msgid "Automatically capitalize the first letter in each word."
3143
  msgstr ""
3144
 
3145
+ #: classes/helpers/FrmFormsHelper.php:1231
3146
  msgid "Published"
3147
  msgstr ""
3148
 
3149
+ #: classes/helpers/FrmFormsHelper.php:1315
3150
  msgid "Create Form"
3151
  msgstr ""
3152
 
3153
+ #: classes/helpers/FrmFormsHelper.php:1323
3154
  msgid "Renew"
3155
  msgstr ""
3156
 
3157
+ #: classes/helpers/FrmFormsHelper.php:1387
3158
  msgid "License plan required:"
3159
  msgstr ""
3160
 
3161
+ #: classes/helpers/FrmFormsHelper.php:1501
3162
  msgid "Is this intentional?"
3163
  msgstr ""
3164
 
3165
  #. translators: %s: the name of a single parameter in the redirect URL
3166
+ #: classes/helpers/FrmFormsHelper.php:1511
3167
  msgid "The redirect URL is using the parameter \"%s\", which is reserved by WordPress. "
3168
  msgstr ""
3169
 
3170
  #. translators: %s: the names of two or more parameters in the redirect URL, separated by commas
3171
+ #: classes/helpers/FrmFormsHelper.php:1517
3172
  msgid "The redirect URL is using the parameters \"%s\", which are reserved by WordPress. "
3173
  msgstr ""
3174
 
3640
  msgid "Go to imported form"
3641
  msgstr ""
3642
 
3643
+ #: classes/helpers/FrmXMLHelper.php:1298
3644
  msgid "Create Posts"
3645
  msgstr ""
3646
 
3647
+ #: classes/helpers/FrmXMLHelper.php:1427
3648
  msgid "Email Notification"
3649
  msgstr ""
3650
 
3672
  msgid "Option 2"
3673
  msgstr ""
3674
 
3675
+ #: classes/models/fields/FrmFieldCombo.php:190
3676
+ #: classes/views/frm-fields/back-end/settings.php:134
3677
+ msgid "Default Value"
3678
+ msgstr ""
3679
+
3680
+ #: classes/models/fields/FrmFieldCombo.php:191
3681
+ #: classes/views/frm-fields/back-end/settings.php:180
3682
+ msgid "Placeholder Text"
3683
+ msgstr ""
3684
+
3685
+ #: classes/models/fields/FrmFieldCombo.php:192
3686
+ msgid "Description"
3687
+ msgstr ""
3688
+
3689
+ #: classes/models/fields/FrmFieldName.php:29
3690
+ msgid "Middle"
3691
+ msgstr ""
3692
+
3693
+ #: classes/models/fields/FrmFieldName.php:30
3694
+ msgid "Last"
3695
+ msgstr ""
3696
+
3697
  #: classes/models/fields/FrmFieldNumber.php:68
3698
  msgid "Please select a higher number"
3699
  msgstr ""
3790
  msgid "There was a %1$s error: %2$s"
3791
  msgstr ""
3792
 
3793
+ #: classes/models/FrmAntiSpam.php:256
3794
+ msgid "This page isn't loading JavaScript properly, and the form will not be able to submit."
3795
+ msgstr ""
3796
+
3797
+ #: classes/models/FrmAntiSpam.php:267
3798
+ msgid "Form token is invalid. Please refresh the page."
3799
+ msgstr ""
3800
+
3801
+ #. translators: %1$s start link, %2$s end link.
3802
+ #: classes/models/FrmAntiSpam.php:288
3803
+ msgid "Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue."
3804
+ msgstr ""
3805
+
3806
  #: classes/models/FrmDb.php:447
3807
  msgid "Use the query in an array format so it can be properly prepared."
3808
  msgstr ""
3836
  msgid "There was a problem with your submission. Please try again."
3837
  msgstr ""
3838
 
3839
+ #: classes/models/FrmEntryValidate.php:236
3840
+ #: classes/models/FrmEntryValidate.php:240
3841
  msgid "Your entry appears to be spam!"
3842
  msgstr ""
3843
 
3844
+ #: classes/models/FrmEntryValidate.php:238
3845
  msgid "Your entry appears to be blocked spam!"
3846
  msgstr ""
3847
 
3883
  msgstr ""
3884
 
3885
  #: classes/models/FrmField.php:46
3886
+ msgid "Name"
3887
  msgstr ""
3888
 
3889
  #: classes/models/FrmField.php:50
3890
+ msgid "Phone"
3891
  msgstr ""
3892
 
3893
  #: classes/models/FrmField.php:54
3894
+ msgid "HTML"
3895
+ msgstr ""
3896
+
3897
+ #: classes/models/FrmField.php:58
3898
  msgid "Hidden"
3899
  msgstr ""
3900
 
3901
+ #: classes/models/FrmField.php:66
3902
  msgid "reCAPTCHA"
3903
  msgstr ""
3904
 
3905
+ #: classes/models/FrmField.php:77
3906
  msgid "File Upload"
3907
  msgstr ""
3908
 
3909
+ #: classes/models/FrmField.php:82
3910
  msgid "Rich Text"
3911
  msgstr ""
3912
 
3913
+ #: classes/models/FrmField.php:90
3914
  msgid "Time"
3915
  msgstr ""
3916
 
3917
+ #: classes/models/FrmField.php:94
3918
  msgid "Scale"
3919
  msgstr ""
3920
 
3921
+ #: classes/models/FrmField.php:99
3922
  msgid "Star Rating"
3923
  msgstr ""
3924
 
3925
+ #: classes/models/FrmField.php:103
3926
  msgid "Slider"
3927
  msgstr ""
3928
 
3929
+ #: classes/models/FrmField.php:107
3930
  msgid "Toggle"
3931
  msgstr ""
3932
 
3933
+ #: classes/models/FrmField.php:111
3934
  msgid "Dynamic"
3935
  msgstr ""
3936
 
3937
+ #: classes/models/FrmField.php:116
3938
  msgid "Lookup"
3939
  msgstr ""
3940
 
3941
+ #: classes/models/FrmField.php:121
3942
  msgid "Repeater"
3943
  msgstr ""
3944
 
3945
+ #: classes/models/FrmField.php:126
3946
  #: classes/models/FrmFormMigrator.php:302
3947
  msgid "Section Buttons"
3948
  msgstr ""
3949
 
3950
+ #: classes/models/FrmField.php:130
3951
  msgid "Section"
3952
  msgstr ""
3953
 
3954
+ #: classes/models/FrmField.php:134
3955
  msgid "Page Break"
3956
  msgstr ""
3957
 
3958
+ #: classes/models/FrmField.php:139
3959
  msgid "Embed Form"
3960
  msgstr ""
3961
 
3962
+ #: classes/models/FrmField.php:143
3963
  msgid "Password"
3964
  msgstr ""
3965
 
3966
+ #: classes/models/FrmField.php:147
3967
  msgid "Tags"
3968
  msgstr ""
3969
 
3970
+ #: classes/models/FrmField.php:151
3971
  msgid "Credit Card"
3972
  msgstr ""
3973
 
3974
+ #: classes/models/FrmField.php:156
3975
  msgid "Address"
3976
  msgstr ""
3977
 
3978
+ #: classes/models/FrmField.php:160
3979
  msgid "Summary"
3980
  msgstr ""
3981
 
3982
+ #: classes/models/FrmField.php:165
3983
  msgid "Signature"
3984
  msgstr ""
3985
 
3986
+ #: classes/models/FrmField.php:170
3987
  msgid "Quiz Score"
3988
  msgstr ""
3989
 
3990
+ #: classes/models/FrmField.php:175
3991
  msgid "Appointment"
3992
  msgstr ""
3993
 
3994
+ #: classes/models/FrmField.php:183
3995
  msgid "Product"
3996
  msgstr ""
3997
 
3998
+ #: classes/models/FrmField.php:188
3999
  msgid "Quantity"
4000
  msgstr ""
4001
 
4051
  msgid "Default Form"
4052
  msgstr ""
4053
 
4054
+ #: classes/models/FrmHoneypot.php:77
4055
+ msgid "If you are human, leave this field blank."
4056
+ msgstr ""
4057
+
4058
  #: classes/models/FrmMigrate.php:564
4059
  msgid "Sending"
4060
  msgstr ""
4280
  msgid "You did not add any fields to your form. %1$sGo back%2$s and add some."
4281
  msgstr ""
4282
 
 
 
 
 
4283
  #: classes/views/frm-entries/list.php:14
4284
  #: classes/views/frm-entries/list.php:25
4285
  msgid "Form Entries"
4481
  msgid "Max Characters"
4482
  msgstr ""
4483
 
4484
+ #: classes/views/frm-fields/back-end/name/primary-options.php:23
4485
+ msgid "Name layout"
4486
+ msgstr ""
4487
+
4488
+ #: classes/views/frm-fields/back-end/name/primary-options.php:35
4489
+ msgid "First Last"
4490
+ msgstr ""
4491
+
4492
+ #: classes/views/frm-fields/back-end/name/primary-options.php:38
4493
+ msgid "Last First"
4494
+ msgstr ""
4495
+
4496
+ #: classes/views/frm-fields/back-end/name/primary-options.php:41
4497
+ msgid "First Middle Last"
4498
+ msgstr ""
4499
+
4500
  #: classes/views/frm-fields/back-end/number-range.php:7
4501
  msgid "Set the number range the field validation should allow. Browsers that support the HTML5 number field require a number range to determine the numbers seen when clicking the arrows next to the field."
4502
  msgstr ""
4581
  msgid "Advanced"
4582
  msgstr ""
4583
 
 
 
 
 
 
 
 
 
4584
  #: classes/views/frm-fields/back-end/settings.php:214
4585
  msgid "If this URL points to an image, show to image on the entries listing page."
4586
  msgstr ""
5161
  msgstr ""
5162
 
5163
  #: classes/views/frm-forms/settings-advanced.php:67
5164
+ #: classes/views/frm-forms/settings-advanced.php:161
5165
  msgid "On Submit"
5166
  msgstr ""
5167
 
5189
  msgid "Do not store entries submitted from this form"
5190
  msgstr ""
5191
 
5192
+ #: classes/views/frm-forms/settings-advanced.php:125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5193
  msgid "AJAX"
5194
  msgstr ""
5195
 
5196
+ #: classes/views/frm-forms/settings-advanced.php:126
5197
  msgid "Make stuff happen in the background without a page refresh"
5198
  msgstr ""
5199
 
5200
+ #: classes/views/frm-forms/settings-advanced.php:133
5201
  msgid "Load and save form builder page with AJAX"
5202
  msgstr ""
5203
 
5204
+ #: classes/views/frm-forms/settings-advanced.php:134
5205
  msgid "Recommended for long forms."
5206
  msgstr ""
5207
 
5208
+ #: classes/views/frm-forms/settings-advanced.php:143
5209
  msgid "Validate this form with javascript"
5210
  msgstr ""
5211
 
5212
+ #: classes/views/frm-forms/settings-advanced.php:144
5213
  msgid "Required fields, email format, and number format can be checked instantly in your browser. You may want to turn this option off if you have any customizations to remove validation messages on certain fields."
5214
  msgstr ""
5215
 
5216
+ #: classes/views/frm-forms/settings-advanced.php:155
5217
  msgid "Messages"
5218
  msgstr ""
5219
 
5220
+ #: classes/views/frm-forms/settings-advanced.php:156
5221
  msgid "Set up your confirmation messages."
5222
  msgstr ""
5223
 
5271
  msgid "Select a form:"
5272
  msgstr ""
5273
 
5274
+ #: classes/views/frm-forms/spam-settings/akismet.php:7
5275
+ msgid "Use Akismet to check entries for spam for"
5276
+ msgstr ""
5277
+
5278
+ #: classes/views/frm-forms/spam-settings/akismet.php:10
5279
+ msgid "no one"
5280
+ msgstr ""
5281
+
5282
+ #: classes/views/frm-forms/spam-settings/akismet.php:13
5283
+ msgid "everyone"
5284
+ msgstr ""
5285
+
5286
+ #: classes/views/frm-forms/spam-settings/akismet.php:16
5287
+ msgid "visitors who are not logged in"
5288
+ msgstr ""
5289
+
5290
+ #: classes/views/frm-forms/spam-settings/antispam.php:9
5291
+ msgid "Check entries for spam using JavaScript"
5292
+ msgstr ""
5293
+
5294
+ #: classes/views/frm-forms/spam-settings/honeypot.php:8
5295
+ msgid "Use Honeypot to check entries for spam"
5296
+ msgstr ""
5297
+
5298
+ #: classes/views/frm-forms/spam-settings/honeypot.php:10
5299
+ msgid "Off"
5300
+ msgstr ""
5301
+
5302
+ #: classes/views/frm-forms/spam-settings/honeypot.php:11
5303
+ msgid "Basic"
5304
+ msgstr ""
5305
+
5306
+ #: classes/views/frm-forms/spam-settings/honeypot.php:12
5307
+ msgid "Strict"
5308
+ msgstr ""
5309
+
5310
  #: classes/views/frm-forms/_no_forms.php:17
5311
  msgid "Add New Form"
5312
  msgstr ""
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: forms, contact form, form builder, survey, form maker, form creator, paypa
5
  Requires at least: 4.7
6
  Tested up to: 5.7.2
7
  Requires PHP: 5.6
8
- Stable tag: 4.10.03
9
 
10
  The most advanced WordPress forms plugin. Go beyond contact forms with our drag & drop form builder for surveys, quizzes, and more.
11
 
@@ -436,6 +436,13 @@ Using our Zapier integration, you can easily connect Formidable with over 1000+
436
  See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
437
 
438
  == Changelog ==
 
 
 
 
 
 
 
439
  = 4.10.03 =
440
  * New: Improved the performance of the style editor preview.
441
  * New: You can now sign up for free form templates directly from your inbox.
@@ -444,7 +451,7 @@ See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zap
444
  * Fix: Actions would occasionally conflict if multiple were added too quickly.
445
 
446
  = 4.10.02 =
447
- * New: Added support for in-theme previews for more themes including Twenty Twenty and Customizr.
448
 
449
  = 4.10.01 =
450
  * New: Include the full email header when an email is sent using the mail function.
@@ -454,1071 +461,15 @@ See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zap
454
  = 4.10 =
455
  * Fix: Some fields, including signatures, were not properly detecting duplicate entries.
456
  * Fix: Zeros were not appearing when used as a placeholder value.
457
- * Fix: Prevent a warning when previewing a form with no fields.
458
 
459
  = 4.09.08 =
460
- * New: If you add or remove an action from a form and try to leave the page without saving, there will be a warning.
461
  * Fix: The style editor save button was hidden in WordPress 5.7.
462
  * Fix: There were a couple of words misspelled on the welcome page.
463
 
464
  = 4.09.07 =
465
- * Fix: Duplicated form fields would occasionally generate long field keys that were preventing fields from being created.
466
  * Fix: Fields for controlling radio options in the form builder were not using unique id attribute values.
467
 
468
- = 4.09.06 =
469
- * New: Added a new welcome screen to introduce new users to Formidable.
470
- * Fix: Make sure that Site Health exists when upgrading.
471
- * Fix: Invalid message data was occasionally appearing in the Inbox.
472
- * Fix: Excluded checkbox options were not properly toggling for Action Taxonomies.
473
- * Fix: Some pop ups were occasionally including outdated text.
474
-
475
- = 4.09.05 =
476
- * Fix: Autofill was flagging form submissions as spam with Honeypot in some browsers.
477
- * Fix: Important security update that adds better escaping when text is used from attribute data.
478
-
479
- = 4.09.04 =
480
- * Fix: The form builder page wasn't always loading all fields correctly when loaded with ajax.
481
- * New: frm_global_switch_fields and frm_maybe_switch_field_ids hooks for changing field ids in a form action when a form is duplicated.
482
-
483
- = 4.09.03 =
484
- * New: Added frm_run_honeypot hook to turn off honeypot. Return false to disable or 'limit' to hide from screenreader.
485
- * Moved honeypot back to front of form to catch more spam.
486
- * Fix: dropdown fields were cut off in the admin area in WordPress 5.6.
487
- * Fix: Update a few deprecated jQuery functions.
488
- * Fix: Prevent some duplicate database queries on the back end.
489
-
490
- = 4.09.02 =
491
- * Show a warning when leaving the form settings page with unsaved changes.
492
- * Make the process for using free form templates more clear.
493
-
494
- = 4.09.01 =
495
- * Don't include a link in the entries list to the form page when the user doesn't have permission to see anything there.
496
-
497
- = 4.09 =
498
- * New: Updated the UX for creating a new blank form or from a template.
499
- * Fix: Duplicating a closed form action didn't copy correctly.
500
- * Fix: PHP warnings showed on the add-ons page on some sites.
501
-
502
- = 4.08 =
503
- * New: Added confirmation before forms are deleted in bulk.
504
- * Allow a value to pass validation if the entered value matches the placeholder setting.
505
- * Fix: Email addresses were not being sent to Akismet for logged out users, and resulting in some false positive spam.
506
- * Fix: Some sites have been getting duplicate entries days apart. This issue should be fixed.
507
- * Fix: Searching when switching between forms no longer triggers the confirmation message when leaving the page.
508
-
509
- = 4.07.01 =
510
- * New: Show a warning when leaving the form builder page with unsaved changes.
511
- * Fix: Make any multiselect dropdowns in admin settings accessible.
512
- * Fix: aria-invalid attribute was missing on form elements for accessibility.
513
-
514
- = 4.07 =
515
- * New: Use frm_inline_success for the form class in the customized HTML to move the success message next to the submit button. "frm_inline_success frm_alignright_success" will right-align the message.
516
- * Tweak: Improve the form listing page and entry listings page when nothing has been created.
517
- * Fix: Update the recaptcha for better reliability to catch more spam.
518
-
519
- = 4.06.03 =
520
- * More consistent dropdown styling with multiselect dropdowns.
521
- * Prepare the code for handling permissions options as an array of roles.
522
- * Fix: WP 5.5 - Email subject lines were coming through encoded.
523
- * Fix: WP 5.5 - When WP Mail SMTP was installed, the Formidable SMTP page has an error.
524
-
525
- = 4.06.02 =
526
- * New: Added frm_field_value_object hook for making adjustments to the field before it's label and value is displayed.
527
- * New: Added frm_xml_response hook for altering the message/response when an XML file is imported.
528
- * Fix: Updated deprecated blacklist functions in WP 5.5.
529
- * Fix: Add more checks to the installation triggers to prevent them from being triggered at unintended times.
530
- * Show a more helpful error message in some cases when the XML import fails.
531
-
532
- = 4.06.01 =
533
- * Remove the top level nav notification for inbox notifications.
534
- * Use the frm_display_value hook for each different case where values are displayed (entries list table, view an entry, summary field...)
535
- * Fix: Left and right margin setting on buttons was being ignored. Use something like "10px 10px" in the button margin setting to show margins on the sides.
536
- * Fix: Prevent a js error in some cases when the ajax response isn't json.
537
-
538
- = 4.06 =
539
- * New: Better accessibility for honeypot field and message after submit.
540
- * New: Add a Dismiss all button in the inbox.
541
- * New: Add 'frm_user_id_display' hook for showing something other than the dispay name by default in user ID fields.
542
- * Set the default styling to use grids since most browsers support it now.
543
- * Fix: On some sites, permissions were preventing a form from being created from a template.
544
- * Fix: The button colors were overriding eachother with some settings.
545
-
546
- = 4.05.02 =
547
- * New: Added frm_message_placement hook to show the form message below the form
548
- * New: New classes that can be used in the 'form class' setting: frm_plain_success (Removes styling from the success message) and frm_below_success (Movs the success message below the form).
549
- * Add Formidable back to the admin bar. This is now a setting if the default WordPress v5.2+ behavior is desired.
550
- * Fix: Reiew requests were added to the inbox too frequently with sites with multiple admins.
551
- * Fix: Elementor conflict by using the glost $post in the admin area.
552
- * Fix: The color picker position in the styling settings was off for some options.
553
-
554
- = 4.05.01 =
555
- * Fix: The entry list wasn't always showing the entries.
556
- * Better sync between review requests in inbox and message.
557
-
558
- = 4.05 =
559
- * Updates to the default form styling.
560
- * New: Added an inbox as a centralized place for notices and communication.
561
- * New: Added frm_color_block and frm_total_big classes for more beautiful forms.
562
- * Help prevent common email issues by showing a warning in the email settings when the from and to email addresses are the same.
563
- * Fix: Forms edited after export and reimported were losing the required indicator in some cases.
564
-
565
- = 4.04.05 =
566
- * When some styling settings are blank, allow inheritance from theme styling.
567
- * Allow a form action to be updated during form migration.
568
- * Code: Update javascript codestyling.
569
-
570
- = 4.04.04 =
571
- * Increased WP version requirement to 4.7.
572
- * Added more options on Import/Export page depending on what other plugins are installed.
573
- * More reliably add new options in fields when also reordering.
574
- * Fix: When a newly added option is set as the default value, save it correctly.
575
- * Added an easy way to install and SMTP plugin for better email deliverability.
576
-
577
- = 4.04.03 =
578
- * Add option to Import forms on the form listing page and in the new form process.
579
- * Improve performance on the form settings page when default values are used in fields.
580
- * Update the base migrator class for more flexibility.
581
- * Fix: Prevent a few PHP warnings.
582
-
583
- = 4.04.02 =
584
- * Don't load the front end form js in the builder/settings.
585
- * Fix: Some database prefixes weren't working correctly with many database calls: "rm", "fr", "_".
586
- * Fix: Remove incorrect instructions for input masks and allow uppercase characters with 'a' in the input mask.
587
- * Fix: Save value as array when single box is checked. This resolves a conflict when used with ACF.
588
- * Fix: The 5/6th class was the wrong size when CSS grids are turned off.
589
- * Fix: More accurately set the default options to fade in fields and use CSS grids.
590
- * Fix: Sort country list by the current locale.
591
-
592
- = 4.04.01 =
593
- * Performance: Improve speed when creating a unique entry key.
594
- * Performance: Always return a single result with FrmDb::get_var().
595
- * Fix: Resolve php warning showing on form builder with some fields.
596
- * Fix: Fix deprecated implode() strings for PHP 7.4.
597
- * Fix: Prevent possibility of extra entry being deleted when switching forms right after deleting an entry.
598
- * Fix: In some cases, a PHP warning was shown when redirecting after submit.
599
-
600
- = 4.04 =
601
- * New: Show a warning if a WordPress parameter is used in the redirect URL to prevent unintented results.
602
- * New: Added frm_is_field_type hook to set if an individual field is shown as radio or checkbox
603
- * New: Show the new pricing fields in the builder for product education.
604
-
605
- = 4.03.07 =
606
- * Project Delight: Make admin-side tooltips more enjoyable and helpful.
607
- * Add several missing countries to the country list.
608
- * Fix: Prevent duplicate localization strings from showing in the page source.
609
-
610
- = 4.03.06 =
611
- * New: Use autocomplete for settings for selecting a WordPress page for faster load time on sites with many pages.
612
- * Fix: When saving conditional logic settings in WP 5.3.1, there was a PHP error message showing on some sites.
613
- * Fix: Custom CSS was being sanitized incorrectly and > was switched to &rt;
614
-
615
- = 4.03.05 =
616
- * New: Add a center alignment option for section headings.
617
- * Keep the add field & field options links fixed to prevent extra scrolling to add more fields.
618
- * Add live searching on the add-ons page.
619
- * Fix: When only one box was selected for the default value in a checkbox field, it wasn't being checked.
620
- * Fix: Recaptcha labels are included for accessibility.
621
-
622
- = 4.03.04 =
623
- * Better compatibility with WP 5.3.
624
- * Switch from using date to gmdate per WP codestyling recommendations.
625
- * Fix: Prevent undefined get_plugins error on some sites.
626
-
627
- = 4.03.03 =
628
- * Fix: There was an error on form submit when Pro was not installed.
629
-
630
- = 4.03.02 =
631
- * Add 'frm_form_object' hook run when a form is fetched from the database.
632
- * Include more education about field types, including the new Appointments field.
633
- * Fix: Dropdown fields weren't saving HTML values correctly.
634
-
635
- = 4.03.01 =
636
- * Add an option to filter form templates by category.
637
- * Add the refresh downloads link on the add-ons and form templates pages.
638
- * Fix: If HTML entities are intentionally saved in a field, keep it that way rather than converting to the value.
639
- * Fix: Prevent a js error with some plugins when the WP editor is loaded on a custom page.
640
-
641
- = 4.03 =
642
- * New: Add an easier way to upgrade to the Pro version.
643
- * New: When the default Contact form is created, use the email address in the form as the Reply to address.
644
- * Fix: On some sites, the Formidable js wasn't loading correctly and causing errors.
645
- * Fix: Don't include generated css with plugin. Some sites weren't updating it.
646
- * New: Added frm_before_create_field hook while a field is being created from the builder. This allows extra fields to be included at once.
647
-
648
- = 4.02.04 =
649
- * Add a bit more in-plugin education and guidance for using Styles.
650
- * Add styling for Stripe credit card fields.
651
- * Fix: Prevent the localized javascript info from being duplicated in the page source.
652
- * Fix: Use the current date for the auto-created contact form.
653
- * Remove a bit of unused code.
654
-
655
- = 4.02.03 =
656
- * Security: Don't unserialize values posted in field options in admin area.
657
- * Start switching any data saved with serializing to json, including cache keys and default values.
658
- * Save styling settings with json instead of serialized array.
659
-
660
- = 4.02.02 =
661
- * Security: Correctly escape values on the View Entry page.
662
- * Include a message on the Entries page about how to prevent spam.
663
- * Show the reCaptcha badge for invisible recaptcha since it's required by their terms.
664
- * Fix: Show the correct labels on template buttons (Upgrade vs Renew)
665
-
666
- = 4.02.01 =
667
- * Security: Fix vulnerability with unserializing.
668
- * Code: Refactor field settings to make it easier to add a section for field options/choices.
669
-
670
- = 4.02 =
671
- * New: Adjust the process and layout of starting a new form.
672
- * New: Separate custom templates from downloadable templates.
673
- * New: Add frm_modify_posted_field_value hook or adjusting a posted value.
674
- * UX: Don't show the style template option if the Formidable styling is turned off.
675
- * Fix: Always include form styling when previewing forms in the theme.
676
-
677
- = 4.01.02 =
678
- * Fix: Prevent the frm_alignright class from affecting the layout on the form builder page
679
- * Fix: Importing in Windows was failing and not finding the file
680
- * Tweak: When inserting smart default values, use a comma between values by default for checkbox fields
681
- * Code: Set the field classes in a more generalizable way so other areas can set a separator and exclude shortcode brackets (use data-sep=" " and data-shortcode="0" in add-ons)
682
-
683
- = 4.01.01 =
684
- * Use svgs for admin menu and admin bar so icon font doesn't need to be loaded admin-wide.
685
- * Optimize a few SVGs.
686
- * Fix: Load the css a bit earlier on the page when it isn't set to load in the header. This solves issues with styling ajax multi-page forms.
687
- * Fix: Changing settings in the styler was causing font icon not found warnings in the console.
688
-
689
- = 4.01 =
690
- * New: Prevent a flash of unstyled form when form styling is set to load only on applicable pages.
691
- * New: Search by field id or key on the form listing page.
692
- * Hide more notices from other plugins when on a Formidable page.
693
- * Fix: The colorpicker box in the form styler was off screen on some sites.
694
-
695
- = 4.0.04 =
696
- * New: Added several missing countries to the default options in the bulk countries list.
697
- * New: Include form ids in the form switcher dropdown. Searching here will also search the form key.
698
- * New: Double click on a field in the form builder to auto-expend the advanced options section.
699
- * New: Show more of the form title in the builder and include a tooltip when it's cut off.
700
- * Give the builder sidebar a bit more space.
701
- * Improve the way &, <, and > are sanitized and saved in the database. Strip them out in the fields that should not have them.
702
- * Fix: Some custom created field types were showing as text fields when created.
703
- * Fix: The form actions trigger options box was closing automatically when a box was checked.
704
- * Added frm_admin_full_screen_class hook for preventing collapsed admin menu. This is not supported, and is not the best experience with using the Formidable form builder.
705
-
706
- = 4.0.03 =
707
- * Reduce builder layout and styling conflicts with themes that don't like to keep their messages and css to themselves. This hides messages and junk from other plugins on Formidable pages. It also removes the .description class from the builder page.
708
- * Use a textarea for the placeholder setting in paragraph fields.
709
- * Fix: CSV import was returning an error message.
710
-
711
- = 4.0.02 =
712
- * Include the WordPress admin bar in full screen mode.
713
- * Replace field icons in builder with svg sprite to prevent browser caching issues.
714
- * Update the field ids in more of the form action settings when a form is duplicated.
715
- * Live update for default values.
716
- * Click on a field description on the form builder page to be taken directly to the setting.
717
- * Allow apostrophes in an email address.
718
- * Save a few clicks. Move the layout classes out of the advanced section and auto open the fields class list on click. Also select the search box when the form switcher is selected.
719
- * Fix: The WordPress menu was collapsed when editing a post. Oops!
720
- * Fix: Trim whitespace from radio/checkbox/dropdown options when they are changed.
721
- * Fix: Automatically hide and show the field box more accurately when clicking in and out of settings that use it.
722
- * Fix: Include field selection box on the redirect url setting.
723
- * Fix: Adjust the show entry page for small screens.
724
- * Fix: After an entry was deleted from the entry listing page, the page no longer scrolled.
725
- * Fix: Backslashes were removed in the Custom CSS on save.
726
- * Fix: In some cases, the default value was showing as a placeholder.
727
- * Fix: Fix a PHP 5.4 error. If you are running a version less than 5.6, you'll see a reminder message to get up to date.
728
- * Code: Added a trigger for use after an ajax call. The frmElementAdded trigger allows add-ons to add the field box menu to newly added settings.
729
- * Show a message if Internet Explorer is being used. This browser is no longer supported in the form builder.
730
-
731
- = 4.0.01 =
732
- * Automatically open the field options box on the form settings page.
733
- * Clean up, size down, and reposition the request for reviews.
734
- * Use collapsed admin menu in full screen mode.
735
- * Show a form title in the top bar on hover if truncated.
736
- * Show a message if 4.0 Lite is installed without the matching Pro version.
737
- * Fix: The link to print an entry wasn't responding.
738
- * Fix: The full screen entries page was only scrolling if the menu label was 'Forms'
739
- * Fix: Sometimes the field classes and inline shortcodes were appearing on the wrong setting.
740
- * Fix: 1Password was conflicting with some fields with the inline popup.
741
-
742
- = 4.0 =
743
- * We've added a new, full screen builder for a faster and more enjoyable form building experience.
744
- * Moved all settings into the sidebar instead of expanding/collapsing under each field.
745
- * Faster way of adding new radio/select/checkbox options with drag and drop reordering.
746
- * Added a separate placeholder option to make it easier to use, and to allow for both a placeholder and a default value. Existing placeholders will be automatically moved to the new setting.
747
- * Added placeholder setting for dropdown fields, and allow the field label to be used as a placeholder.
748
- * Long forms are easier to edit and save since only the fields settings that have been viewed will be saved.
749
- * Replaced the form builder sidebar panel with in-field modals that include the possible values to insert.
750
- * Added a way to more easily see and find all possible add-ons in the form actions.
751
- * Add link to imported form in the import success message.
752
- * Removed a few unused settings including the option to disable HTML5.
753
- * New hooks: frm_after_field_choices, frm_field_options, frm_after_field_options, frm_[type]_primary_field_options, Added hooks for each tab in the global settings: frm_[section name]_settings_form, frm_default_value_setting
754
- * Added better confirmation messages before deleting fields, forms, form actions, and entries.
755
- * Change default settings to fade in forms and use css grids for new installs.
756
-
757
- = 3.06.06 =
758
- * Remove complete Spanish translations
759
- * Increase PHP requirements to 5.6
760
- * Increase minimum WP version to 4.6
761
-
762
- = 3.06.05 =
763
- * When getting IP addresses, use the end use IP rather than the proxy IP with services like Cloudflare.
764
- * On new installations, allow multiple reCaptchas on a page by default.
765
- * Remove admin email address from user tracking in order to keep it 100% anonymous.
766
- * Fix: When a license is saved, properly clear the local caches in order to get access to new add-ons and form templates after renewing or upgrading.
767
-
768
- = 3.06.04 =
769
- * New: Added an option to opt into usage tracking. This will allow us to simplify settings in a future release and better cater to the majority of use cases.
770
- * Fix: Replace old field ids in the field description and HTML field after duplication or import.
771
-
772
- = 3.06.03 =
773
- * Fix: The required indicator for a field was blank after importing a form.
774
- * Fix: Only include the id of the error message once in aria-describedby for linking the error message for screen readers.
775
- * Fix: Prevent a couple PHP warning messages with certain settings.
776
-
777
- = 3.06.02 =
778
- * New: More WCAG improvements. Link the error messages to the field for screenreaders.
779
- * Fix: When resending emails, don't send emails that are toggled off.
780
- * Fix: Prevent other plugins from adding messages on the form templates and new form pages.
781
- * Fix: Prevent front-end styles from loading on back-end pages.
782
- * Fix: When the screen settings are changed after filtering the entry list, stay on the filtered list.
783
-
784
- = 3.06.01 =
785
- * Notice: The default HTML for field types with multiple inputs now use div instead of label for the field label for WCAG compliance. This will only affect new fields.
786
- * New: When saving a form, check if it is too long for the server settings. If so, show a notice along with information on how to fix it.
787
- * New: Better WCAG compliance. Added aria-required to required fields and aria-invalid when javascript validation is turned on.
788
- * New: Add functions to get a list of field, form, and global settings to translate for multilingual add-ons. This will make maintaining strings much easier without a delay.
789
- * New: Added frm_form_strings, frm_global_setting, frm_global_invalid_msg, frm_global_failed_msg, and frm_global_login_msg hooks for making adjustments to messages.
790
- * New: Add frm_field filter when a field is fetched individually with FrmField::getOne( x, true )
791
- * New: Allow the frm_scroll_box class to work on HTML fields instead of only accepting frm_html_scroll_box
792
- * Fix: The pagination lost styling in WP 5.1.
793
- * Fix: The saved CSS string was being autoloaded by WordPress since the transient didn't have an expiration.
794
- * Fix: Prevent the invisible recaptcha from adding empty space in some forms.
795
- * Fix: Form layouts with a long section of options in a radio or checkbox were adding extra spacing.
796
- * Fix: The templates page was showing a blank tile for expired licenses.
797
- * Fix: Submit button remained disabled after when the invisible reCaptcha validation failed.
798
-
799
- = 3.06 =
800
- * New: Add one-click form creation from a form template and adjust the way a new form is created
801
- * New: Add a new process for creating a custom form template
802
- * Tweak: Create smaller XML fiels when exporting forms
803
- * Tweak: Use the name of the form for XML exports when a single form is exported
804
- * Tweak: Don't limit the width of the color picker in the form styler to avoid conflicts with some color picker plugins
805
- * Fix: Prevent the 'Advanced' section from hiding on non-Formidable blocks
806
- * Fix: Some users were seeing PHP error messages in PHP 5.2
807
- * Fix: XML form exports set to use the default style were not correctly setting the style on import
808
-
809
- = 3.05 =
810
- * New: Add a new Forms block for use with the new WP editor
811
- * Fix: A false number was showing for number of plugin updates available when add-ons were not installed
812
-
813
- = 3.04.03 =
814
- * New: Improved autoupdating and installation for form add-ons
815
- * Tweak: Only show the form add-ons page to those who can activate plugins
816
- * Fix: Radio button shadows had a box around them in some browsers
817
- * Fix: Don't mark an entry as a duplicate when the second entry includes more fields than the first
818
- * Code: Move deprecated code to its own folder
819
-
820
- = 3.04.02 =
821
- * New: When HTML5 is used, auto add the http in a url field if it is omitted by the user
822
-
823
- = 3.04.01 =
824
- * New: When a form includes a user ID field, include helpers in the Advanced tab to get data from the user profile for use in emails and other form actions.
825
- * Code: Refactor and clean up the code for the Advanced tab in the form settings sidebar
826
- * Code: Add frm_advanced_helpers hook to move some Advanced shortcode examples to Pro
827
- * Code: Add frm_field_code_tab hook to add extra shortcodes in the customization sidebar for a single field
828
- * Update translations
829
-
830
- = 3.04 =
831
- * New: Add option to duplicate a form action
832
- * New: Add option to turn form actions on or off
833
- * New: Add frm_is_multiple_select hook
834
-
835
- = 3.03.03 =
836
- * Improve the appearance of the import/export page
837
- * Move the admin menu position below the post comments
838
- * Remove unused CSS including CSS for login forms in the user registration plugin
839
- * Override theme styling for box shadows on inputs
840
- * Add a new migrator class that will serve as a base for migrations from other form builder plugins
841
- * Add a prepare_field_value function for altering the value show inside a form field that can be overridden in extension classes for fields
842
-
843
- = 3.03.02 =
844
- * Fix: When syntax highlighting was turned off in the user profile, the custom CSS box didn't appear.
845
- * Fix: Allow 'aside' tags in the form widget. Don't remove it when sanitizing.
846
- * Fix: When a form includes a reCaptcha, the loading indicator on the submit button wasn't triggered on submit.
847
- * Fix: The reCaptcha label was orphaned and didn't pass WCAG compliance. This fix applies to new reCaptcha fields. For existing fields, delete it and add it again.
848
- * Fix: Automatically scroll the form builder window when a field is dragged and dropped in the form.
849
- * Fix: Use a percentage for left labels instead of a fixed with to ensure the margin isn't too big for small spaces.
850
-
851
- = 3.03.01 =
852
- * Fix: Allow the section html in the form widget. Don't remove it when sanitizing.
853
- * Fix: Show the scrollbar for the list of fields in Chrome on the form builder. Some devices don't allow scrolling without it.
854
-
855
- = 3.03 =
856
- * Fix: Custom css like #frm_field_196_container > label was being sanitized and preventing the > from working correctly
857
- * Fix: Allow <i icon="something"> to pass sanitization in checkbox and radio field options
858
- * Fix: A warning message in the form style builder was sometimes appearing multiple times and not closing
859
- * Move datepicker css and images to Pro form builder
860
-
861
- = 3.02.02 =
862
- * Update PO file for translation
863
-
864
- = 3.02.01 =
865
- * Fix: Allow the heading class and ids to stay for the sidebar form widget. The headings were missing a class and not the same as other headings in some themes.
866
- * Fix: If all form templates are deleted, keep the 'templates' nav item so new templates can still be created.
867
- * Fix: When creating a new form, don't include trashed form templates in the form template options
868
- * Fix: Remove outdated sslverify references
869
- * Fix: The sample form for the form styler didn't have a great layout when CSS grids were turned on
870
-
871
- = 3.02 =
872
- * New: Add support for WordPress export and erase personal data options for easier GDPR support
873
- * Fix: HTML was getting stripped in field labels when a form was edited on the form builder page
874
- * Fix: If a field option includes HTML, allow the HTML rather than sanitizing it with entities
875
- * Fix: When the 'add option' button on the form builder is clicked multiple times, add the options correctly if the previous option isn't yes showing in the form maker
876
- * Fix: The HTML for the link to the user profile was showing in the sidebar when editing or viewing an entry
877
- * Code change: Move input classes into the field object class so it can be more easily overridden and amended. The FrmFieldType->get_input_class() function can be overridden in sub classes
878
-
879
- = 3.01.03 =
880
- * Fix: Add responsive styling for the .frm_four_col class when grids are disabled
881
- * Fix: Fix number field HTML5 min, max, and step. This code was still in the pro form builder
882
- * Fix: More escaping for translated strings, and whitelist false positives for code security tools
883
- * Fix: When form builder is loaded with ajax, prevent errors when the default value is an array
884
- * Fix: Add a nonce check when updating settings for a form
885
- * Removed: Get rid of the start tour. We will add this back in a less annoying way.
886
-
887
- = 3.01.02 =
888
- * New: Add frm_sanitize_shortcodes hook. This hook allows shortcodes in field values to be processed rather than shown on the page.
889
- * Fix: Stylesheets weren't saving correctly when multiple styles were used for forms
890
-
891
- = 3.01.01 =
892
- * New: Replace the jQuery colorpicker with the WordPress colorpicker in the visual form styler
893
- * New: Process shortcodes in the redirect url after form submission
894
- * New: frm_override_default_styles and frm_default_style_settings hooks
895
- * Fix: Prevent shortcodes inside field values from being processed in more places including the redirect url. This is a security precaution.
896
- * Fix: A default contact form was being added with each update. This update ensures the contact form is only generated once.
897
- * Fix: Allow the visual form styler to show instant changes to the sample contact form since server limits of url size were being hit in some cases.
898
- * Fix: HTML was being stripped from some form field settings on the form creator page like validation messages
899
-
900
- = 3.01 =
901
- * New: Added frm_js_location hook for saving the combined javascript file in a different location
902
- * New: Added frm_include_field_in_content hook for excluding fields in the default email message
903
- * Tweak: Process shortcodes inside the form validation messages
904
- * Tweak: Reduce page load time by not autoloading the saved form styling from the database. In most cases, this data is saved in the CSS file, and doesn't need to be retrieved from the database.
905
- * Fix: The Invisible reCaptcha wasn't being validated correctly in contact forms when the Pro version was not running.
906
- * Fix: Run the server-side form validation on a number field that uses 0 for the minimum value. This was being skipped.
907
- * Fix: Show the label above a dropdown field if the label position is set to inside since dropdown placeholders are not yet supported. Plus, don't show the Inside label position option for any fields that don't allow placeholders.
908
- * Fix: If there is an error during a database update, make sure it can try again in the future
909
- * Fix: Prevent more conflicts with Divi when editing some posts with forms
910
- * Fix: Form fields without CSS grids were not aligning correctly with left, right, or inline labels
911
-
912
- = 3.0.06 =
913
- * New: Include the option to duplicate a form in the free form maker
914
- * Fix: If the reply to address in the email is not specified, use only the from email without the from name to increase receivability
915
- * Fix: Improve form styling without CSS grids when using left, right, and inline labels
916
- * Fix: Make the frmFrontForm.fieldValueChanged function public in the javascript so it can be triggered by scripts in other plugins
917
-
918
- = 3.0.05 =
919
- * Fix: The visual form styler didn't look good when CSS grids were turned off
920
- * Fix: Prevent past database migrations from being run again. This was making some field sizes much larger.
921
- * Fix: If field sizes are extra long, reverse them because it most likely happened in the last release.
922
- * Fix: Sort by a number field on the entries page was ordering by text instead of number
923
- * Fix: The export page was showing weird styling for the form selector on some sites
924
- * Fix: If CSS grids are off, don't force the width to 100% for form fields like before
925
-
926
- = 3.0.04 =
927
- * Fix required validation: URL and number fields were requiring a value when the field was not required
928
- * Fix double recaptcha validation which was causing it to fail validation
929
-
930
- = 3.0.03 =
931
- * Enhancement: Use relative path in the form css now that the css is inside the plugin. Now font icons will continue working without a style save when the site url is changed.
932
- * Fix: Save a different stylesheet file for each site in a network to prevent them from saving over eachother
933
- * Fix: Use auto field height when grids are off to prevent tiny form fields on some sites
934
- * Fix: Correctly set default email message to 100% width
935
- * Fix: Fields with a layout class and labels set to right or left were not aligned right with CSS grids off
936
- * Fix: Some field shortcodes weren't being processed when the whitespace was abnormal from some cases of copy/paste
937
- * Fix: Set the width of the box with field types on form builder page a bit differently to prevent it from being too small when the page includes a lot of admin notices at the top
938
- * Remove a few 100% translations from the plugin so WordPress can handle it
939
-
940
- = 3.0.02 =
941
- * Tweak: Move the forms css inside the plugin rather than saving it in the uploads folder so it will always be reset after updates
942
- * New: Add frm_fields_container_class hook for changing the new form container class attributes
943
- * Fix: More form styling fixes for css grids. Fixes cover layouts with frm_alignright and smoother responsive layouts.
944
- * Fix: Combine the old and new form css, and include the old layout CSS by default
945
- * Fix: Trigger the activation install right when the plugin is installed
946
- * Fix: Don't add label position styling to fields that don't include the option to change the label position
947
- * Fix: Correctly limit the number of fields returned when using the FrmField::get_all_for_form function with a limit set
948
-
949
- = 3.0.01 =
950
- * Fix: Trigger style update when a form is loaded instead of only when an admin page is visited
951
- * Fix: A few various form styling and layout fixes
952
- * Fix: Prevent screenreader text for accessibility from showing on sites with older cached css
953
- * Fix: Prevent conflict with Divi when a form shortcode with a recaptcha is included in page editor
954
- * Fix: Use 'readfile' instead of 'include' for css files for extra safety precautions
955
- * Fix: Load the field options before frm_new_fields_vars hook for reverse compatibility
956
-
957
- = 3.0 =
958
- * Move features into the free form builder: redirect and show page after save, javascript validation, field format options with HTML5 pattern validation, and phone number, number, user ID, hidden field, and HTML fields
959
- * Possibly breaking change: Remove code that has been deprecated since before v2.02
960
- * Save a combined js file to use on the front-end with a fallback if the file fails to generate. This file is updated when the plugin is activated or updated.
961
- * A UI pick-me-up in preparation of things to come in 4.0.
962
- * New: Use CSS grids for better layouts. If you would like your column layouts to show in Internet Explorer, you'll need to turn on the old styling in the Formidable -> Global settings. The grids use a 12-column layout with classes that range from frm1 (1 column of 12) to frm12 (span all 12 columns). (Thanks for the feedback from our feedback group!)
963
- * New: Search for fields by name, id, and key in the customization panel
964
- * Improved RTL styling in backend
965
- * Enhancement: Add frm_rtl class to forms with styles set to RTL for easier styling.
966
- * Enhancement: Customize the invalid message when a custom format is set on text fields
967
- * Better a11y/WCAG support: hidden labels where required, "for" tag on most labels, and link the field to its description for screenreaders.
968
- * Move form shortcodes from the sidebar to the form settings page
969
- * Change "field options" to "field settings" on the form builder page
970
- * Update the Print styling for the entries page
971
- * Remove frm_text_block class and do it by default. Radio buttons and checkboxes with wrapping text should look good by default.
972
- * Add a link in the footer to review Formidable
973
- * New: field object class to make it easy to make new field types. We don't have docs yet, but developers can take a look at the FrmFieldType class. But we've gone to great efforts to make sure fields done the old way will continue to function.
974
- * New hook: Add frm_output_single_style hook to add extra css into the generated stylesheet
975
- * New hook: Add frm_before_get_form hook for enqueueing form scripts
976
- * New hook: Add frm_enqueue_builder_scripts hook to load extra scripts on the form builder page
977
- * New hook: Add frm_show_entry_defaults hook to add extra atts to the frm_show_entry shortcode
978
- * Tweak: Include 'original_default' in the field array for new entries so we can compare and prevent double processing later
979
- * Fix: quotation marks were being escaped in frm_form_attributes and frm_form_div_attributes hooks
980
- * Removed: The preview page option in the global settings is no longer used. The form preview page is now generated.
981
- * Removed: The placeholder fallback javascript for old versions of IE is gone. No need to give everyone extra scripts to load.
982
- * Deprecated the accordion javascript checkbox in global settings since it isn't used by the plugin. If you had this box checked, you'll still see it. Once you uncheck it the option will no longer appear.
983
-
984
- = 2.05.09 =
985
- * Fix: Read only background and border colors weren't showing in the form correctly
986
- * Fix: A PHP warning was showing with validation messages in the form
987
-
988
- = 2.05.08 =
989
- * Fix: Hide extra columns on the Formidable -> Entries page more accurately
990
- * Fix: Prevent WP confirmation messages from showing when saving a form
991
- * Fix: Some tooltips were partially covered by the admin menu
992
-
993
- = 2.05.07 =
994
- * New: Limit the number of field columns in the entry listing page to a max of 11 fields
995
- * Security Fix: Fix an SQL injection vulnerability on the Form listing page on the backend. Vulnerability discovered by the static code analysis solution RIPS (www.ripstech.com)
996
-
997
- = 2.05.06 =
998
- * Tweak: Move database functions from FrmAppHelper to FrmDb
999
- * Tweak: Move install/update/migrate functions from FrmDb to FrmMigrate
1000
- * Tweak: Remove unused check_cache_and_transient function
1001
- * Fix: Rename ja_JP translation to ja
1002
-
1003
- = 2.05.05 =
1004
- * Fix: When form actions were added at the same time with non-alphabetical naming, a new addon was replacing the first one
1005
-
1006
- = 2.05.04 =
1007
- * Tweak: Remove recaptcha and website fields from sample Contact us form template since most people don't need them
1008
- * Fix: Updates for WP 4.9 compatibility. This includes preventing double filtering on contact form widgets and using the WordPress Codemirror scripts for the form CSS page.
1009
- * Fix: Prevent "are you sure" message that has started occuring from WordPress when saving a WordPress form
1010
- * Fix: Correctly validate form fields with an Inside field label when HTML5 forms are not enabled
1011
- * Fix: Set the background color on loading form submit button. Depending on the hover button covers, the loading spinner may have been the same color as the button
1012
- * Fix: Additional security checks when getting POST or GET values in some places
1013
- * Fix: Return int rather than string from FrmForm::getIdByKey
1014
-
1015
- = 2.05.03 =
1016
- * Enhancement: Clean up BCC and CC email buttons on small screens
1017
- * Security enhancement: Use wp_kses instead of wp_kses_post for showing entries
1018
- * Enhancement: Add more HTML options to the wp_kses filters
1019
- * Fix: Correctly show the list of trashed forms after one is permanently deleted
1020
-
1021
- = 2.05.02 =
1022
- * New: Add frm_affiliate_id hook for theme author affiliates
1023
- * Fix: XSS vulnerability on form preview page. Don't check POST values before displaying the form
1024
- * Enhancement: Speed up the Formidable > Entries listing page for large forms
1025
- * Fix: Don't add slashes to default field values
1026
- * Fix: Replace the arrows in the settings sections that disappeared in WP 4.8
1027
-
1028
- = 2.05.01 =
1029
- * Fix: Let the new label position option override the setting in the styles
1030
- * Fix: Trigger an update for the styling settings so a manual save isn't required to get new updates
1031
- * Fix: Prevent an undefined php warning when viewing the form page
1032
-
1033
- = 2.05 =
1034
- * New: Add option to not save IP address with entries for GDPR compliant forms
1035
- * New: Add a new label position option: Inside. This option automatically uses the field labels as placeholders.
1036
- * Enhancement: Prevent jumping when selecting field to edit on form builder.
1037
- * Enhancement: Trigger frm_after_entry_processed hook after save when the action is set to show a message. This affects deleting entries automatically.
1038
- * Enhancement: Allow text colors like "red" in frm-show-entry.
1039
- * Enhancement: Increase minimum WP version requirement to 4.0.
1040
- * Enhancement: Add array_key option to entry shortcode to set whether an ID or key is used when an array is returned.
1041
- * Fix: Restore Default Plain button for filling email content.
1042
- * Fix: Set dependency on reCaptcha script to ensure it loads after the Formidable script when defer fails.
1043
- * Fix: Add frm_entries_list_query hook to filter queries on the Formidable -> Entries page.
1044
- * Fix: Improve field duplication on form builder.
1045
- * Fix: Remove deprecated notification settings on import.
1046
- * Fix: Allow multiple invisible recaptchas to work on the same page.
1047
- * Fix: Make sure licenses tab loads if navigating to it directly.
1048
-
1049
- = 2.04.01 =
1050
- * Fix: Prevent php warning when 'show' attr is missing.
1051
-
1052
- = 2.04 =
1053
- * New: Add FrmEntryValues and FrmFieldValue classes, which should be widely reusable.
1054
- * New: Add ready-to-use contact form. Use it anywhere with [formidable id=contact-form]. It will only be created on new installs.
1055
- * Enhancement: Load global settings tabs with AJAX to improve the load speed.
1056
- * Enhancement: Add form and entry to frm_email_message filter.
1057
- * Fix: Changed blank title processing in the form widget to match WordPress core widgets.
1058
-
1059
- = 2.03.10 =
1060
- * New: Add <a href="https://formidableforms.com/wordpress-anti-spam-invisible-recaptcha/">invisible recaptcha to your WordPress forms</a>
1061
- * New: Add frm_form_div_attributes action hook
1062
- * Enhancement: Replace is_super_admin calls per WordPress recommendations
1063
- * Enhancement: Add duplicated field right below original instead of at the end of the form for easier drag and drop form building with long forms
1064
- * Fix: When importing entries, save the IP from the imported CSV rather than the IP of the person running the import
1065
- * Fix: Fix duplicate frm_verify ID HTML vaildation error in forms
1066
- * Fix: Fix squished customization panel showing up when clicking into some field settings
1067
- * Fix: Run frm_validate_entry when there are errors
1068
-
1069
- = 2.03.09 =
1070
- * New: Add frmStartFormLoading and frmEndFormLoading jQuery events.
1071
-
1072
- = 2.03.08 =
1073
- * New: Add frm_label_justify CSS layout class to justify text in long labels
1074
- * Fix: Prevent XSS error messages in Chrome when saving a form on the back-end
1075
- * Fix: Remove extra space between textarea and description.
1076
- * Fix: Resolve errors in frm_entries_footer_scripts action call.
1077
- * Fix: Decrease size of file path for automatic updates to avoid hitting file path limits on Windows servers.
1078
- * Fix: Improve checkbox and radio styling with Bootstrap active.
1079
- * Fix: Remove Bootstrap error class with js validation.
1080
-
1081
- = 2.03.07 =
1082
- * New: Add frm_after_import_view hook.
1083
- * New: Add frmPageChanged, frmFormComplete, and frmFormErrors jQuery events.
1084
- * Fix: Include full where query in cache key to avoid identical keys for different queries.
1085
- * Fix: Show entries from all forms on the entry listing page.
1086
- * Fix: Remove IE8-specific CSS causing errors in stylesheet.
1087
-
1088
- = 2.03.05 =
1089
- * New: Add <a href="https://formidableforms.com/defeat-spambots-honeypot-spam-protection/">Honeypot spam protection to your WordPress forms</a>
1090
- * Enhancement: Add frm_form_attributes hook
1091
- * Enhancement: Make field value dropdown code available in the free form builder plugin
1092
- * Enhancement: Add deprecated notice for old globals such as $frm_form, $frm_entry, $frm_entry_meta, and $frmdb
1093
- * Fix: Set default menu name to Formidable
1094
- * Fix: Allow Date column to be toggled on form listing page
1095
-
1096
- = 2.03.04 =
1097
- * Fix: Allow quotes within shortcodes in email settings
1098
- * Fix: Check if an option is "other" a little more reliably. Instead of checking for 'other' anywhere in the option key, check for other_ at the beginning.
1099
- * Fix: Correctly use default version number for jquery ui URL if query string is not included
1100
- * Fix: Increase room for ids in the database. Increase from 11 to 20 to match the WordPress DB fields
1101
- * Fix: Resolve a conflict with themes adding display:block; as the default for all input elements that is causing checkboxes and radio buttons to look bad
1102
- * Code: Email code refactoring
1103
-
1104
- = 2.03.03 =
1105
- * Fix: Update the minified JS to match the non-minified version. This fixes issues with calculations.
1106
- * Fix: Allow the first form action label to be clickable
1107
-
1108
- = 2.03.02 =
1109
- * Fix: javascript error in Safari in form builder
1110
- * Fix: Prevent null values from leaving a white space on the entries listing page
1111
- * Fix: Form shortcode parameters were also affecting the forms in a widget
1112
- * Fix: Prevent action trigger options from getting cut off at the bottom of the page
1113
-
1114
- = 2.03.01 =
1115
- * Fix: Some colors were not being used correctly in the visual form styler settings
1116
-
1117
- = 2.03 =
1118
- * New: Add a combined list of all entries on the Formidable -> Entries page instead of defaulting to the first form
1119
- * New: Replace submit input with button HTML for new forms. This allows us to show the loading indicator on top of the button instead of outside. This applies to new forms only. Existing forms will need the submit button HTML adjusted to see this new styling. But we decided it was best for reverse compatibility if we don't change it automatically
1120
- * New: Add frm_after_title hook for inserting content between the title and form fields
1121
- * Enhancement: Speed up adding and editing field options and conditional logic in the form builder
1122
- * Enhancement: Don't save the field options until the whole form is saved
1123
- * Tweak: Pass error array in frm_get_paged_fields instead of true/false. If you are using the frm_get_paged_fields hook, it's possible your code may need to be adjusted.
1124
- * Fix: styling issue when select field moves when changing between a blank and not blank option
1125
- * Fix: Make sure "Activate" button for add-ons is specific to subsite in multisite network
1126
- * Removed: pro fields and styling options from the visual styler, extra pro version css, and registering pro scripts. We don't need unused options.
1127
-
1128
- = 2.02.13 =
1129
- * New: Add frm_send_separate_emails filter. If there are multiple emails in the "to" box, this hook will send one email per address.
1130
- * Fixed: Prevent field option reset when a style is included with the imported form
1131
-
1132
- = 2.02.12 =
1133
- * Fixed: PHP 7.1 illegal string offset warnings addressed.
1134
-
1135
- = 2.02.11 =
1136
- * New: Added frm_create_default_email_action hook to prevent default email action creation.
1137
- * New: Added frm_inline_submit CSS Layout Class to use in the form generator.
1138
- * Improved: Include IP for checking comment blacklist.
1139
- * Improved: Load minified themepicker js and placeholder js when possible.
1140
- * Improved: Better spam checking with Akismet.
1141
- * Improved: Update placeholder JS for old browsers to v2.3.1.
1142
- * Fixed: Don’t force fields created by a add-on to a text field when Pro is not installed.
1143
- * Fixed: Style success message text color now applies to nested paragraph tags.
1144
- * Fixed: Prevent PHP warning messages some sites are seeing during cache key retrieval.
1145
- * Fixed: -1 offset in frm_scroll_offset hook now stops auto-scrolling.
1146
- * Fixed: Invalid Portuguese translation for field is invalid message.
1147
- * Fixed: A few HTML errors on form Settings page are resolved.
1148
- * Fixed: Set default margin on checkbox and radio divs. This resolves conflicts with Bootstrap styling and frm_two_col and frm_three_col classes.
1149
- * Fixed: If same form is published multiple times on the same page, make sure success message shows with the right occurrence of the form. Auto-scroll to the correct form as well.
1150
-
1151
- = 2.02.10 =
1152
- * Add frm_form_error_class hook
1153
- * Fix db error when updating title in some forms
1154
- * Fix unclickable keys in Customization Panel
1155
- * Fix print styling on entries page
1156
- * Clear entry cache after delete all entries
1157
-
1158
- = 2.02.09 =
1159
- * Add frm_before_install hook
1160
- * Trigger a database update to flush permalinks
1161
- * Fix PHP 5.4 syntax error
1162
-
1163
- = 2.02.08 =
1164
- * Fix recaptcha error (change default to normal)
1165
- * Prevent double submit clicks
1166
- * Make sure recaptcha English language setting applies
1167
- * Add placeholder color CSS
1168
- * Add frm_after_import_form action hook
1169
- * Add frm_send_email hook for stopping the email
1170
- * Add frm_upgrade_page hook
1171
- * Include field object in frm_prepare_data_before_db hook
1172
- * Fix nav errors when trying to edit form that doesn't exist
1173
- * Replace specific cache key deletion with group cache delete for more cache clearing fixes
1174
-
1175
- = 2.02.07 =
1176
- * Improve cache clearing in order to make Formidable compatible with persistent object caching
1177
- * Add vertical-align:baseline to radio and checkboxes to prevent styling conflicts
1178
- * Add hook for invalid form entry error message
1179
- * Add form id to 'frm_include_meta_keys' hook
1180
- * Fix IE11 and Edge form builder issues with editing field options
1181
- * Allow localhost to pass URL validation
1182
- * Remove frm_field_input_html calls for fields on form builder page
1183
-
1184
- = 2.02.06 =
1185
- * Prevent styling conflict with field buttons on form builder
1186
-
1187
- = 2.02.05 =
1188
- * Clear caching when updating styling settings
1189
- * Add frm_field_div_classes hook
1190
- * Remove deprecated safe_mode check
1191
- * Warning added for invalid height/padding styling combination
1192
-
1193
- = 2.02.04 =
1194
- * Add field description margin option
1195
- * Fixes for submitting forms in IE10
1196
-
1197
- = 2.02.03 =
1198
- * Update translations
1199
-
1200
- = 2.02.02 =
1201
- * Fix clicking the undo link after bulk trash forms
1202
- * Add submitFormManual function for custom scripts
1203
- * HTML5 error fields now have styling
1204
-
1205
- = 2.02 =
1206
- * Improve user role dropdowns in global settings
1207
- * Remove some deprecated functions
1208
- * More output escaping
1209
- * Move file creation for stylesheet to its own file for an easier API
1210
-
1211
- = 2.01.02 =
1212
- * Increased minimum required WordPress version to 3.8
1213
- * Added frm_skip_form_action hook. This hook can be used to change whether the action is skipped or not
1214
- * Added border radius settings to success and error messages
1215
- * Fixed issue allowing a trashed form shortcode to still show the form
1216
- * Fixed issue causing &amp; to show instead of & when editing paragraph fields
1217
- * Removes French and Swedish translations since they are complete online
1218
- * Update for better cache deletion in WP 4.0+
1219
- * Allow a specific field type to change the value for emails and entry array
1220
- * Prevent errors with Redis cache plugin
1221
- * Improve styling for submit buttons on mobile devices
1222
- * Don't let imported style override default
1223
- * Add frm_clean_[field-type-here]_field_options_before_update hook
1224
- * Fix &, >, and other character comparison issues
1225
-
1226
- = 2.01.01 =
1227
- * Use a different email regex to allow more characters, and longer TLDs
1228
- * Only load custom styles on the styler. Don't include it on the manage styles, or custom css tabs. Bad custom css can make the page uneditable.
1229
- * Fix issue preventing the option to Allow the multiple recaptchas to be turned off
1230
- * Fixed issue with white space allowed in field options when bulk editing
1231
- * Use javascript instead of jQuery to scroll after submit
1232
- * Add missing styling to make inline labels work with checkbox/radio fields
1233
-
1234
- = 2.01.0 =
1235
- * Allow shortcodes for the submit button label
1236
- * Increase the timeout for activating a license
1237
- * Add a couple static functions to use in add-ons with form actions
1238
- * Don't show templates on the add-ons page
1239
- * Add frm_switch_field_types hook for specifying which fields can be switched to/from
1240
- * Add Authorize, Stripe, WOO, and copy icons
1241
- * Some back-end styling improvements
1242
- * Additional bug fixes
1243
-
1244
- = 2.0.25 =
1245
- * Add an option to allow multiple recaptchas. This is off by default to avoid new conflicts.
1246
- * Use the recaptcha size setting when displaying multiple recaptchas per page.
1247
- * Add frm_after_field_is_imported and frm_prepare_single_field_for_duplication hooks
1248
- * Add property="stylesheet" to the stylehsheets when HTML5 is enabled
1249
-
1250
- = 2.0.24 =
1251
- * Add option to use the dark reCaptcha
1252
- * Show a helpful error message when recaptcha communication fails
1253
- * Fix the clear on focus setting to not switch to the default blank
1254
-
1255
- = 2.0.23 =
1256
- * Add support for multiple reCaptchas on a page
1257
- * Make sure the screen options for the form listings only shows when needed
1258
- * Make sure a value is selected when it includes an &
1259
- * Load grid CSS on the back-end entries and form builder pages
1260
- * Allow transparent background color on fields and form
1261
- * Don't update clear on click options until whole form is saved
1262
- * Don't force an array to be a string before going through get_display_value function
1263
- * Added frm_trigger_create_action hook to alter action triggering
1264
- * Added frm_csv_format hook for changing the exported CSV format
1265
- * Added frm_is_field_required hook for allowing a field to be conditionally required
1266
- * Added frm_field_options_to_update hook for setting more field options to update
1267
- * Added frm_display_FIELDTYPE_value_custom hook
1268
- * Added frm_get_FIELDTYPE_display_value
1269
- * Added frm_csv_field_columns hook. Once the columns are added, if a field value is an array, it will automatically fill added csv columns
1270
-
1271
- = 2.0.22 =
1272
- * Add an upgrade banner when affiliate links are active
1273
- * Add permission checks in addition to nonce for several actions for extra security
1274
- * Don't allow javascript to be saved in field choices
1275
- * Include the admin_url params inside the function to resolve a conflict with WPML
1276
- * Prevent XML breaking with US character
1277
- * Fix rand() error with float some users are seeing with PHP7
1278
-
1279
- = 2.0.21 =
1280
- * Add a timestamp to the css file instead of plugin version number to improve issues with styling caching
1281
- * Add pro tips & upgrade calls
1282
- * Fix bug with importing old forms with no custom style
1283
-
1284
- = 2.0.20 =
1285
- * Added more styling options: box-shadow, font-weight, Form Title, and Form Description
1286
- * Fixed a couple issues with activating and deactivating licences
1287
- * A few improvements for importing styles
1288
- * Add a hook for approved theme authors to add affiliate links. If the free version is packaged with a theme, the theme author can get commissions on upgrades.
1289
-
1290
- = 2.0.19 =
1291
- * Add CSV export to free version
1292
- * Add page with list of add-ons
1293
- * Set up base for allowing affiliate links inside the free version
1294
-
1295
- = 2.0.18 =
1296
- * PHP 7 updates
1297
- * Add frm_field_extra_html hook
1298
- * Prevent specific html entity from breaking email message
1299
- * Add filter for removing wpautop from form success message
1300
- * Fix HTML error on form builder page
1301
- * Change the "Licenses" submenu to "Plugin Licenses"
1302
-
1303
- = 2.0.16 =
1304
- * Escape font family correctly for quotation marks
1305
- * Only check for updates every 24 hours
1306
- * Allow emails to be separated by a space
1307
- * Prevent old versions of Akismet from causing errors
1308
- * Add unit tests for XML import
1309
- * Styling updates for WP 4.4
1310
- * Save form action settings even if they aren't in the default options
1311
- * More contrast on form builder page
1312
- * Use normal font weight for from builder
1313
-
1314
- = 2.0.15 =
1315
- * Send plugin updates through formidableforms.com
1316
- * Update Swedish translation
1317
- * Use media_buttons hook instead of deprecated media_buttons_context hook
1318
- * Unit test updates
1319
- * Fix Portuguese translation error
1320
- * Allow more characters in field description
1321
- * Prevent plugin styling conflict with user roles dropdown
1322
- * Fix installing when the plugin is activated
1323
- * Get rid of ambiguity in FrmField::getAll function
1324
- * Fix the plugin url when used in the mu-plugins folder
1325
- * Make selected values show on form builder page before refresh
1326
- * Minor styling changes to frm_total class
1327
- * Update stylesheet after import
1328
- * Make long text wrap in Chrome cb/radio fields
1329
- * Add 'compact' option to Recaptcha
1330
-
1331
- = 2.0.14 =
1332
- * Stripslashes in Other field
1333
- * Prevent collapse icon from being inserted inside of section
1334
- * Make sure roles dropdowns show correctly after clicking update (in Global Settings)
1335
- * Make form listing and entry listing pages responsive
1336
- * Don't truncate form name in excerpt mode
1337
- * Fix validating embedded forms
1338
- * Fix filtering by repeating fields in Dynamic Views > Detail Page
1339
- * Fix dependent Dynamic autocomplete fields with default values
1340
- * Fix logic on embedded forms and multiselect dd
1341
- * Some readonly field fixes
1342
- * Read-only improvements for multiselect dropdown
1343
- * Improve JavaScript for multiple forms on a page
1344
- * Use the minified css for jQuery UI styling
1345
- * Allow view filtering with time fields using NOW
1346
- * Allow times to be formatted with [25 format='g:i A']
1347
-
1348
- = 2.0.13 =
1349
- * Allow recaptcha to be conditionally hidden on previous pages of form
1350
- * Fix error with embedded form on a conditionally hidden page
1351
- * Show the editlink after an entry is edited in place
1352
- * Make sure collapsible section icons show regardless of characters in the section title
1353
- * Don't require conditionally hidden dynamic category fields
1354
- * Add fields attribute to [editlink] shortcode
1355
- * Fix calculations using repeating checkboxes
1356
- * Prevent double click on Add button in repeating section
1357
- * Clear conditionally hidden fields even if they aren't visible
1358
- * Make sure pro form templates get imported in multisite
1359
- * Use separate values by default for post status fields
1360
- * Make sure the separate values option is allows for post status fields
1361
- * Show the frmcal-week-end class consistently
1362
- * Fix default values in repeating Dynamic fields
1363
- * Make Private Views show up in shortcode builder
1364
- * Don't do calculations in conditionally hidden repeating fields
1365
- * Do calcs in repeating fields when adding a row
1366
- * Improve JS for IE8
1367
- * Fix unique time error
1368
- * Fix default date in jQuery calendar
1369
- * Allow entry key with frm-field-value shortcode
1370
- * Fix unique time error
1371
- * Improve calculations across page breaks
1372
- * Prevent clearing default values when hiding/showing sections
1373
- * Run calculations in collapsible sections
1374
- * Fix duplicating regular sections
1375
- * Add post ID View filter
1376
- * Fix empty graphs
1377
- * Allow frm-entry-update-field, editlink, and deletelink inside foreach loop
1378
- * Fix importing parent_form_id on child forms
1379
- * Allow css file updating if FTP creds are present
1380
- * A few jshint fixes
1381
- * Add 'frm_ajax_url' hook
1382
- * Allow layout classes to be used with submit button
1383
- * Remove frm_last class
1384
- * Prevent get_filesystem_method error in multisite after update
1385
- * Conditionally use ssl for the ajax url for form submission
1386
-
1387
-
1388
- = 2.0.12 =
1389
- * Add option to center form on page
1390
- * Improve styling classes for more consistency across different field classes, and make all classes responsive
1391
- * Added a few more styling classes: frm_three_fourths, frm_two_fifths, frm_three_fifths
1392
- * Remove in-place-editing from the field keys on the form builder page
1393
- * Add 'frm_after_update_field_name' hook for changing a field name during editing
1394
- * Update Bootstrap multiselect to v0.9.13
1395
- * Add license page to prepare for add-ons. Big things are coming.
1396
- * Fix: Prevent loading icon from being huge in some themes
1397
- * Fix: When the jQuery UI css is loaded by another plugin on the form builder page, the required icon looked the same whether required or not. This styling conflict is resolved.
1398
- * Fix: Make sure the form description size can be changed in the styling settings.
1399
-
1400
- = 2.0.11 =
1401
- * Fix issue with clearing array keys when sanitizing an array when displaying entry values
1402
- * When the email "reply to" value uses the "from" setting, only use the email address without the name
1403
- * Switch the form action events to dropdown instead of checkboxes
1404
- * Shrink the reCaptcha on small screens
1405
- * Add font-weight 100-900 options to styler
1406
- * Add frm_email_message filter
1407
- * Fixes for javascript errors while form building in IE8
1408
- * Only load font.css for the admin bar when user can edit forms
1409
- * Add frm_include_form_tag filter for using div instead of form tag
1410
- * Add frm_show_submit_button filter for hiding and showing the submit button
1411
- * Fix date calculations using date formats that begin with the year
1412
- * Allow classes to be included on a hidden input
1413
- * Process the entry a little sooner (wp_loaded instead of wp)
1414
- * Add frm_capitalize layout class
1415
- * Make frm_customize class work for more field types
1416
-
1417
- = 2.0.10 =
1418
- * Add frm_action_triggers hook for adding custom triggers into the actions
1419
- * Add frm_{action name here}_action_options hook so any action can be altered
1420
- * Prevent extra form actions when a form is duplicated
1421
- * Load correct version of formidable.js based on wp-config debugging constant (Thanks @naomicbush for the contributions!)
1422
- * Revert get_sortable_columns changes for < WP 4.0 support
1423
-
1424
- = 2.0.09 =
1425
- * Add frm_time_to_check duplicate entries filter
1426
- * Allow custom JavaScript validation
1427
- * Add frm_do_html_shortcodes fiter
1428
- * Fix the duplicate entry check
1429
- * Include get_columns function in list tables for 4.3
1430
- * Use relative URLs in the stylesheet
1431
- * Make frm_fifth classes responsive
1432
- * Allow 0 to be saved in a checkbox field
1433
- * Fix saving forms as drafts
1434
-
1435
- = 2.0.08 =
1436
- * Fix security vulnerability allowing shortcodes to be excuted inside a form https://research.g0blin.co.uk/?p=618&d=i4ziyggqao0oz0L0vpUTd8KZwrO2P9Mw
1437
- * Added frm_filter_final_form hook. This will need to be used to cover shortcodes that span multiple blocks of field HTML since we can't do a general shortcode replacement on the rendered form
1438
- * Revert change that prevented scripts from firing in the form success message
1439
- * Fix timestamp timezone on view/edit entry page
1440
- * Added frm_entries_{$col_name}_column hook to allow custom columns on the entries listing page
1441
-
1442
- = 2.0.07 =
1443
- * Don't escape urls in ajax
1444
- * Correctly save all the options on the form settings page
1445
-
1446
- = 2.0.06 =
1447
- * Fix an XSS vulnerability in the lite version. When the pro version is active, the vulnerability was resolved.
1448
- * Increased security
1449
- * Fix the shortcode display on form listing page
1450
- * Add frm_helper_shortcode filter
1451
- * Prevent javascript error on form settings page when WooThemes Helper plugin is active
1452
- * Prevent conflict from unknown plugin/theme that was modifying the post excerpt in form actions, which prevented them from showing
1453
- * Only scroll to the errored field and success message if they are not already in view
1454
- * Make sure admins always have permission to view menus
1455
-
1456
- = 2.0.05 =
1457
- * Remove deprecated jQuery toggle() calls
1458
- * Add html ids to hidden fields
1459
- * Make sure the entry name doesn't exceed allowed database field size
1460
- * Adjust user agent displayed values
1461
- * Update Bootstrap javascript to v3.3.4
1462
- * Clear more caching for forms, fields, and entries when changes are made
1463
- * Lite only: Remove the entry search box on the entries page since the functionality is in pro
1464
-
1465
- = 2.0.04 =
1466
- * Fix XSS vulnerability from add_query_args and remove_query_args
1467
- * Remove unneeded options from the form widget and switch old styling setting width from 400px to 100%
1468
- * Fix the new form class box in the customizable HTML
1469
- * Remove WP support for v3.5 and lower
1470
- * Don't require the captcha if the keys haven't been configured
1471
- * Styling enhancements for left and right label settings
1472
- * Deactivate plugin after uninstall to prevent tables from being added back
1473
- * Add frm_text_block class to Layout tab
1474
- * Fix migration of email settigns that haven't been updated in over two years
1475
- * Fix emailing from only a multiple word name with no email
1476
- * Send emails for WordPress default if trying to send from Yahoo
1477
-
1478
- = 2.0.03 =
1479
- * Use frm_clear instead of clear to minimize conflicts
1480
- * Add js fallback for database update on sites without CURL
1481
- * Fix issues with emails migrating to actions in php 5.3, and t showing in some emails after updating settings
1482
-
1483
- = 2.0.02 =
1484
- * Make sure frm_to_email hook is reverse compatible
1485
- * Fix php example in the shortcode examples
1486
- * Add styling for frm_half classes combined with left or right labels
1487
- * Add a fallback if dbDelta is missing
1488
- * Remove inline js from the draft button in the default HTML to prevent 404/403 errors on some servers. This change only applies to new forms
1489
- * Move the legend tag into the customizable HTML, but without a migration so it won't be added to existing forms
1490
- * Move the "before fields" HTML into the fieldset to it will be parallell with the "After fields" HTML
1491
- * Make sure partial form transients aren't saved for long forms. Make sure it's all or nothing.
1492
- * Make sure the parent_form_id column was added, and try to add it again if it's not there
1493
-
1494
- = 2.0.01 =
1495
- * Break transients into chunks for large forms ( > 200 fields )
1496
- * Remove the upgrade link and perform the upgrade automatically
1497
- * Allow upgrades to be done automatically in WordPress multisite with the 'Upgrade Network' option
1498
- * Updated translations
1499
- * Only add one line in the email headers for cc and bcc
1500
- * Added frm_include_meta_keys hook for including the previously included meta values referenced by field key
1501
- * Delete transients with uninstall
1502
- * Make sure the legend stays hidden after opening form in a popup
1503
-
1504
- = 2.0 =
1505
- * Move visual form styler into the free WordPress form plugin
1506
- * Added multiple emails to free version
1507
- * Added BCC, CC, and reply to options to emails
1508
- * Replaced the reCaptcha with the new no-captcha recaptcha
1509
- * Allow multiple roles to be selected for the permissions on the global settings page
1510
- * Updated the UI
1511
- * Added a trash can for forms as well as draft forms
1512
- * Extra security with sanitizing output and prepare database queries extra just to be sure
1513
- * Switch to frm_first frm_last frm_half classes for more flexibility
1514
- * Added more responsiveness to the styling classes
1515
- * Change the field width option from characters to pixels
1516
- * Change the user browser info into a more easily readable format, and include it in the lite version
1517
- * Add (hidden) legend tag for accessibility
1518
- * Fix preview page with 2015 theme
1519
- * Reduce duplicate entry check to 1 minute
1520
- * Remove a bunch of upgrade messages in the lite version
1521
- * Reduce size of indexed db columns for utf8mb4 in WordPress 4.2
1522
- * Fixed a SQL vulnerability. Thanks @KacperSzurek for finding it!
1523
-
1524
  <a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>
5
  Requires at least: 4.7
6
  Tested up to: 5.7.2
7
  Requires PHP: 5.6
8
+ Stable tag: 4.11
9
 
10
  The most advanced WordPress forms plugin. Go beyond contact forms with our drag & drop form builder for surveys, quizzes, and more.
11
 
436
  See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
437
 
438
  == Changelog ==
439
+ = 4.11 =
440
+ * New: Added a quick and easy Name field with options for First, Middle, and Last names.
441
+ * New: Added a more powerful spam protection using JavaScript. This can be turned on in the settings for each form.
442
+ * New: Added Honeypot options to form settings and changed the default Honeypot behaviour to avoid the false positives some people are seeing on mobile devices.
443
+ * New: Added a frm_process_honeypot filter for gracefully handling honeypot spam.
444
+ * Fix: A warning was getting logged when exporting a form as XML.
445
+
446
  = 4.10.03 =
447
  * New: Improved the performance of the style editor preview.
448
  * New: You can now sign up for free form templates directly from your inbox.
451
  * Fix: Actions would occasionally conflict if multiple were added too quickly.
452
 
453
  = 4.10.02 =
454
+ * New: Added support for in-theme previews for more themes including Twenty Twenty, Customizr, and more.
455
 
456
  = 4.10.01 =
457
  * New: Include the full email header when an email is sent using the mail function.
461
  = 4.10 =
462
  * Fix: Some fields, including signatures, were not properly detecting duplicate entries.
463
  * Fix: Zeros were not appearing when used as a placeholder value.
464
+ * Fix: Prevent a warning when previewing a contact form with no fields.
465
 
466
  = 4.09.08 =
467
+ * New: If you add or remove an action and try to leave the page without saving, there will be a warning.
468
  * Fix: The style editor save button was hidden in WordPress 5.7.
469
  * Fix: There were a couple of words misspelled on the welcome page.
470
 
471
  = 4.09.07 =
472
+ * Fix: Duplicated fields would occasionally generate long field keys that were preventing fields from being created.
473
  * Fix: Fields for controlling radio options in the form builder were not using unique id attribute values.
474
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
475
  <a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>