Form builder to get in touch with visitors, grow your email list and collect payments — Happyforms - Version 1.9.7

Version Description

Improvement: New Confirm submission control in Setup step. Improvement: Various improvements to HappyForms UI. Improvement: Compatibility with WordPress 5.4. Bugfix: Form width slider in Style tab General was not updating value in preview.

Download this release

Release Info

Developer thethemefoundry
Plugin Icon 128x128 Form builder to get in touch with visitors, grow your email list and collect payments — Happyforms
Version 1.9.7
Comparing to
See all releases

Code changes from version 1.9.6 to 1.9.7

core/assets/css/admin.css CHANGED
@@ -255,3 +255,7 @@ p.welcome-panel-footer a:active {
255
  #happyforms-notice-happyforms_form_saved_guide {
256
  border-left-color: #46b450;
257
  }
 
 
 
 
255
  #happyforms-notice-happyforms_form_saved_guide {
256
  border-left-color: #46b450;
257
  }
258
+
259
+ .type-happyform .column-date span[title] {
260
+ text-decoration: none;
261
+ }
core/assets/css/customize.css CHANGED
@@ -164,7 +164,8 @@ p.description a {
164
  margin-left: 5px;
165
  }
166
 
167
- .customize-control.customize-control-checkbox_dummy label a:after {
 
168
  content: "\f504";
169
  font-family: dashicons;
170
  }
@@ -678,7 +679,7 @@ body.adding-happyforms-parts #customize-preview iframe {
678
  display: inline-block;
679
  padding: 2px 8px 4px;
680
  border: 1px solid #fff;
681
- border-bottom-color: #eee;
682
  text-decoration: none;
683
  }
684
 
@@ -689,7 +690,7 @@ body.adding-happyforms-parts #customize-preview iframe {
689
  }
690
 
691
  .happyforms-part-widget .tab-links a.active {
692
- border: 1px solid #eee;
693
  border-bottom-color: #fff;
694
  color: #444;
695
  }
@@ -1419,3 +1420,27 @@ div.customize-section-description {
1419
  color: #555d66;
1420
  background: #fff;
1421
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  margin-left: 5px;
165
  }
166
 
167
+ .customize-control.customize-control-checkbox_dummy label a:after,
168
+ .customize-control.customize-control--upsell a:after {
169
  content: "\f504";
170
  font-family: dashicons;
171
  }
679
  display: inline-block;
680
  padding: 2px 8px 4px;
681
  border: 1px solid #fff;
682
+ border-bottom-color: #ddd;
683
  text-decoration: none;
684
  }
685
 
690
  }
691
 
692
  .happyforms-part-widget .tab-links a.active {
693
+ border: 1px solid #ddd;
694
  border-bottom-color: #fff;
695
  color: #444;
696
  }
1420
  color: #555d66;
1421
  background: #fff;
1422
  }
1423
+
1424
+ #customize-control-confirmation_message {
1425
+ display: none;
1426
+ }
1427
+
1428
+ #customize-control-confirm_submission[data-value="success_message"] ~ .customize-control-group #customize-control-confirmation_message {
1429
+ display: block;
1430
+ }
1431
+
1432
+ .happyforms-nested-settings[data-trigger="confirm_submission"] {
1433
+ display: block;
1434
+ }
1435
+
1436
+ .wp-editor-float-right {
1437
+ float: right;
1438
+ }
1439
+
1440
+ #happyforms-redirect-upsell {
1441
+ display: none;
1442
+ }
1443
+
1444
+ #customize-control-confirm_submission[data-value="redirect"] ~ #happyforms-redirect-upsell {
1445
+ display: block;
1446
+ }
core/assets/css/layout.css CHANGED
@@ -1234,6 +1234,10 @@ input[type=submit][disabled].happyforms-button--submit {
1234
  padding: 45px 1% 10px;
1235
  }
1236
 
 
 
 
 
1237
  .screen-reader-text {
1238
  position: absolute;
1239
  top: 0;
1234
  padding: 45px 1% 10px;
1235
  }
1236
 
1237
+ .happyforms-part__char-counter .counter-label {
1238
+ text-transform: lowercase;
1239
+ }
1240
+
1241
  .screen-reader-text {
1242
  position: absolute;
1243
  top: 0;
core/assets/js/frontend/long-text.js CHANGED
@@ -6,7 +6,7 @@
6
  init: function() {
7
  this.type = this.$el.data( 'happyforms-type' );
8
  this.$input = $( 'textarea', this.$el );
9
- this.$counter = $( '.happyforms-part__char-counter span', this.$el );
10
 
11
  this.$input.on( 'blur', this.onBlur.bind( this ) );
12
  this.$input.on( 'keyup', this.triggerChange.bind( this ) );
@@ -41,4 +41,4 @@
41
  },
42
  };
43
 
44
- } )( jQuery );
6
  init: function() {
7
  this.type = this.$el.data( 'happyforms-type' );
8
  this.$input = $( 'textarea', this.$el );
9
+ this.$counter = $( '.happyforms-part__char-counter span.counter', this.$el );
10
 
11
  this.$input.on( 'blur', this.onBlur.bind( this ) );
12
  this.$input.on( 'keyup', this.triggerChange.bind( this ) );
41
  },
42
  };
43
 
44
+ } )( jQuery );
core/assets/js/parts/part-checkbox.js CHANGED
@@ -161,6 +161,7 @@
161
  this.listenTo( this, 'sort-stop', this.onOptionSortStop );
162
  this.listenTo( this, 'ready', this.onReady );
163
  this.listenTo( this.model, 'change:show_select_all', this.onSelectAllChange );
 
164
  this.listenTo( this.model, 'change:options_width', this.onOptionsWidthChange );
165
  },
166
 
@@ -401,6 +402,14 @@
401
  },
402
 
403
  onSelectAllChange: function( model, value ) {
 
 
 
 
 
 
 
 
404
  this.model.fetchHtml( function( response ) {
405
  var data = {
406
  id: model.get( 'id' ),
@@ -409,6 +418,15 @@
409
 
410
  happyForms.previewSend( 'happyforms-form-part-refresh', data );
411
  } );
 
 
 
 
 
 
 
 
 
412
  }
413
  } );
414
 
@@ -470,7 +488,14 @@
470
  $part.removeClass( 'happyforms-part-options-width--full' );
471
 
472
  $part.addClass( 'happyforms-part-options-width--' + part.get( 'options_width' ) );
473
- }
 
 
 
 
 
 
 
474
  } );
475
 
476
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
161
  this.listenTo( this, 'sort-stop', this.onOptionSortStop );
162
  this.listenTo( this, 'ready', this.onReady );
163
  this.listenTo( this.model, 'change:show_select_all', this.onSelectAllChange );
164
+ this.listenTo( this.model, 'change:select_all_label', this.onSelectAllLabelChange );
165
  this.listenTo( this.model, 'change:options_width', this.onOptionsWidthChange );
166
  },
167
 
402
  },
403
 
404
  onSelectAllChange: function( model, value ) {
405
+ var $selectAllOptions = $( '.happyforms-nested-settings[data-trigger="show_select_all"]', this.$el );
406
+
407
+ if ( 1 == value ) {
408
+ $selectAllOptions.show();
409
+ } else {
410
+ $selectAllOptions.hide();
411
+ }
412
+
413
  this.model.fetchHtml( function( response ) {
414
  var data = {
415
  id: model.get( 'id' ),
418
 
419
  happyForms.previewSend( 'happyforms-form-part-refresh', data );
420
  } );
421
+ },
422
+
423
+ onSelectAllLabelChange: function( model, value ) {
424
+ var data = {
425
+ id: this.model.get( 'id' ),
426
+ callback: 'onCheckboxSelectAllLabelChangeCallback'
427
+ };
428
+
429
+ happyForms.previewSend( 'happyforms-part-dom-update', data );
430
  }
431
  } );
432
 
488
  $part.removeClass( 'happyforms-part-options-width--full' );
489
 
490
  $part.addClass( 'happyforms-part-options-width--' + part.get( 'options_width' ) );
491
+ },
492
+
493
+ onCheckboxSelectAllLabelChangeCallback: function( id, html, options ) {
494
+ var part = this.getPartModel( id );
495
+ var $part = this.getPartElement( html );
496
+
497
+ this.$( '.happyforms-part-option--select-all .label', $part ).text( part.get( 'select_all_label' ) );
498
+ },
499
  } );
500
 
501
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
core/assets/js/parts/part-multi-line-text.js CHANGED
@@ -20,6 +20,8 @@
20
  this.listenTo( this.model, 'change:limit_input', this.onLimitInputChange );
21
  this.listenTo( this.model, 'change:character_limit', this.onCharacterLimitChange );
22
  this.listenTo( this.model, 'change:character_limit_mode', this.onCharacterLimitChange );
 
 
23
  },
24
 
25
  /**
@@ -58,8 +60,45 @@
58
  } );
59
  },
60
 
61
- onCharacterLimitChange: function() {
62
- var model = this.model;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  model.fetchHtml( function( response ) {
65
  var data = {
@@ -70,6 +109,18 @@
70
  happyForms.previewSend( 'happyforms-form-part-refresh', data );
71
  } );
72
  },
 
 
 
 
 
 
 
 
 
 
 
 
73
  } );
74
 
75
  happyForms.previewer = _.extend( happyForms.previewer, {
@@ -79,6 +130,12 @@
79
 
80
  this.$( 'textarea', $part ).attr( 'placeholder', part.get( 'placeholder' ) );
81
  },
 
 
 
 
 
 
82
  } );
83
 
84
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
20
  this.listenTo( this.model, 'change:limit_input', this.onLimitInputChange );
21
  this.listenTo( this.model, 'change:character_limit', this.onCharacterLimitChange );
22
  this.listenTo( this.model, 'change:character_limit_mode', this.onCharacterLimitChange );
23
+ this.listenTo( this.model, 'change:characters_label', this.onLimitWordsCharactersLabelChange );
24
+ this.listenTo( this.model, 'change:words_label', this.onLimitWordsCharactersLabelChange );
25
  },
26
 
27
  /**
60
  } );
61
  },
62
 
63
+ toggleMinMaxLabel: function( labelAttribute, $labelControl, limitValue ) {
64
+ var label = this.model.get( labelAttribute ).toLowerCase();
65
+
66
+ if ( -1 !== label.indexOf( 'min ' ) || -1 !== label.indexOf( 'max ' ) ) {
67
+ if ( 'word_max' === limitValue || 'character_max' === limitValue ) {
68
+ label = label.replace( 'min ', 'max ' );
69
+ } else {
70
+ label = label.replace( 'max ', 'min ' );
71
+ }
72
+
73
+ label = label.charAt(0).toUpperCase() + label.slice( 1 );
74
+
75
+ $( 'input', $labelControl ).val( label );
76
+ this.model.set( labelAttribute, label );
77
+ }
78
+ },
79
+
80
+ onCharacterLimitChange: function( model, value ) {
81
+ switch ( value ) {
82
+ case 'word_min':
83
+ case 'word_max':
84
+ var $wordsLabel = $( '.character-limit__words-label', this.$el );
85
+ this.toggleMinMaxLabel( 'words_label', $wordsLabel, value );
86
+
87
+ $wordsLabel.show();
88
+ $( '.character-limit__characters-label', this.$el ).hide();
89
+
90
+ break;
91
+ case 'character_min':
92
+ case 'character_max':
93
+ var $charactersLabel = $( '.character-limit__characters-label', this.$el );
94
+ this.toggleMinMaxLabel( 'characters_label', $charactersLabel, value );
95
+
96
+ $charactersLabel.show();
97
+ $( '.character-limit__words-label', this.$el ).hide();
98
+ break;
99
+ default:
100
+ break;
101
+ }
102
 
103
  model.fetchHtml( function( response ) {
104
  var data = {
109
  happyForms.previewSend( 'happyforms-form-part-refresh', data );
110
  } );
111
  },
112
+
113
+ onLimitWordsCharactersLabelChange: function( model, value ) {
114
+ var data = {
115
+ id: this.model.get( 'id' ),
116
+ callback: 'onLimitWordsCharactersLabelChangeCallback',
117
+ options: {
118
+ label: value
119
+ }
120
+ };
121
+
122
+ happyForms.previewSend( 'happyforms-part-dom-update', data );
123
+ }
124
  } );
125
 
126
  happyForms.previewer = _.extend( happyForms.previewer, {
130
 
131
  this.$( 'textarea', $part ).attr( 'placeholder', part.get( 'placeholder' ) );
132
  },
133
+
134
+ onLimitWordsCharactersLabelChangeCallback: function( id, html, options ) {
135
+ var $part = this.getPartElement( html );
136
+
137
+ this.$( 'span.counter-label', $part ).text( options.label );
138
+ }
139
  } );
140
 
141
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
core/classes/class-form-admin.php CHANGED
@@ -48,6 +48,8 @@ class HappyForms_Form_Admin {
48
  add_action( 'load-edit.php', array( $this, 'define_screen_settings' ) );
49
  add_filter( "manage_{$post_type}_posts_columns", array( $this, 'column_headers' ), PHP_INT_MAX );
50
  add_action( "manage_{$post_type}_posts_custom_column", array( $this, 'column_content' ), 10, 2 );
 
 
51
  add_filter( 'post_row_actions', array( $this, 'row_actions' ), 10, 2 );
52
  add_action( 'load-edit.php', array( $this, 'duplicate_form_redirect' ) );
53
  add_action( 'admin_footer', array( $this, 'admin_footer' ) );
@@ -286,6 +288,59 @@ class HappyForms_Form_Admin {
286
  }
287
  }
288
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  /**
290
  * Filter: filter the row actions contents for the
291
  * All Form admin screen table.
@@ -370,7 +425,7 @@ class HappyForms_Form_Admin {
370
  admin_url( 'edit.php' )
371
  );
372
 
373
- $notice = sprintf(
374
  '%s <a href="%s">%s</a>',
375
  __( '1 form duplicated.', HAPPYFORMS_TEXT_DOMAIN ),
376
  get_delete_post_link( $new_form_id, '', true ),
48
  add_action( 'load-edit.php', array( $this, 'define_screen_settings' ) );
49
  add_filter( "manage_{$post_type}_posts_columns", array( $this, 'column_headers' ), PHP_INT_MAX );
50
  add_action( "manage_{$post_type}_posts_custom_column", array( $this, 'column_content' ), 10, 2 );
51
+ add_filter( 'post_date_column_status', array( $this, 'date_column_status' ), 10, 4 );
52
+ add_filter( 'post_date_column_time', array( $this, 'date_column_time' ), 10, 4 );
53
  add_filter( 'post_row_actions', array( $this, 'row_actions' ), 10, 2 );
54
  add_action( 'load-edit.php', array( $this, 'duplicate_form_redirect' ) );
55
  add_action( 'admin_footer', array( $this, 'admin_footer' ) );
288
  }
289
  }
290
 
291
+ /**
292
+ * Filter: Change status in Date column to blank. By default
293
+ * the column has value of "Published" or "Scheduled" for posts.
294
+ *
295
+ * @hooked filter post_date_column_status
296
+ *
297
+ * @param string $status Current status.
298
+ * @param object $post Post object.
299
+ * @param string $column_name Name of the column, always 'date'.
300
+ * @param string $mode Date mode.
301
+ *
302
+ * @return string
303
+ */
304
+ public function date_column_status( $status, $post, $column_name, $mode ) {
305
+ if ( 'date' !== $column_name ) {
306
+ return $status;
307
+ }
308
+
309
+ $post_type = happyforms_get_form_controller()->post_type;
310
+
311
+ if ( $post->post_type === $post_type ) {
312
+ $status = '';
313
+ }
314
+
315
+ return $status;
316
+ }
317
+
318
+ /**
319
+ * Filter: Change date format in date column.
320
+ *
321
+ * @hooked filter post_date_column_time
322
+ *
323
+ * @param string $time Current time value.
324
+ * @param object $post Post object.
325
+ * @param string $column_name Name of the column, always 'date'.
326
+ * @param string $mode Date mode.
327
+ *
328
+ * @return string
329
+ */
330
+ public function date_column_time( $time, $post, $column_name, $mode ) {
331
+ if ( 'date' !== $column_name ) {
332
+ return $time;
333
+ }
334
+
335
+ $post_type = happyforms_get_form_controller()->post_type;
336
+
337
+ if ( $post->post_type === $post_type ) {
338
+ $time = get_the_time( __( 'Y/m/d' ), $post );
339
+ }
340
+
341
+ return $time;
342
+ }
343
+
344
  /**
345
  * Filter: filter the row actions contents for the
346
  * All Form admin screen table.
425
  admin_url( 'edit.php' )
426
  );
427
 
428
+ $notice = sprintf(
429
  '%s <a href="%s">%s</a>',
430
  __( '1 form duplicated.', HAPPYFORMS_TEXT_DOMAIN ),
431
  get_delete_post_link( $new_form_id, '', true ),
core/classes/class-form-setup.php CHANGED
@@ -48,6 +48,10 @@ class HappyForms_Form_Setup {
48
  global $current_user;
49
 
50
  $fields = array(
 
 
 
 
51
  'confirmation_message' => array(
52
  'default' => __( 'Thank you! Your submission has been sent.', HAPPYFORMS_TEXT_DOMAIN ),
53
  'sanitize' => 'esc_html',
@@ -159,12 +163,34 @@ class HappyForms_Form_Setup {
159
 
160
  public function get_controls() {
161
  $controls = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  100 => array(
163
  'type' => 'editor',
164
  'label' => __( 'Success message', HAPPYFORMS_TEXT_DOMAIN ),
165
- 'tooltip' => __( 'This is the message your users will see after succesfully submitting your form.', HAPPYFORMS_TEXT_DOMAIN ),
166
  'field' => 'confirmation_message',
167
  ),
 
 
 
168
  110 => array(
169
  'type' => 'editor',
170
  'label' => __( 'Error message', HAPPYFORMS_TEXT_DOMAIN ),
@@ -241,6 +267,7 @@ class HappyForms_Form_Setup {
241
  case 'textarea':
242
  case 'group_start':
243
  case 'group_end':
 
244
  require( "{$path}/{$type}.php" );
245
  break;
246
  default:
48
  global $current_user;
49
 
50
  $fields = array(
51
+ 'confirm_submission' => array(
52
+ 'default' => 'success_message',
53
+ 'sanitize' => 'sanitize_text_field',
54
+ ),
55
  'confirmation_message' => array(
56
  'default' => __( 'Thank you! Your submission has been sent.', HAPPYFORMS_TEXT_DOMAIN ),
57
  'sanitize' => 'esc_html',
163
 
164
  public function get_controls() {
165
  $controls = array(
166
+ 10 => array(
167
+ 'type' => 'select',
168
+ 'label' => __( 'Confirm submission', HAPPYFORMS_TEXT_DOMAIN ),
169
+ 'options' => array(
170
+ 'success_message' => __( 'Success message', HAPPYFORMS_TEXT_DOMAIN ),
171
+ 'redirect' => __( 'Redirect to web address', HAPPYFORMS_TEXT_DOMAIN ),
172
+ ),
173
+ 'field' => 'confirm_submission',
174
+ 'tooltip' => __( 'Choose how the form should confirm successful submission.', HAPPYFORMS_TEXT_DOMAIN ),
175
+ ),
176
+ 11 => array(
177
+ 'type' => 'upsell',
178
+ 'label' => __( 'Upgrade', HAPPYFORMS_TEXT_DOMAIN ),
179
+ 'field' => '',
180
+ 'id' => 'happyforms-redirect-upsell',
181
+ ),
182
+ 20 => array(
183
+ 'type' => 'group_start',
184
+ 'trigger' => 'confirm_submission',
185
+ ),
186
  100 => array(
187
  'type' => 'editor',
188
  'label' => __( 'Success message', HAPPYFORMS_TEXT_DOMAIN ),
 
189
  'field' => 'confirmation_message',
190
  ),
191
+ 101 => array(
192
+ 'type' => 'group_end'
193
+ ),
194
  110 => array(
195
  'type' => 'editor',
196
  'label' => __( 'Error message', HAPPYFORMS_TEXT_DOMAIN ),
267
  case 'textarea':
268
  case 'group_start':
269
  case 'group_end':
270
+ case 'upsell':
271
  require( "{$path}/{$type}.php" );
272
  break;
273
  default:
core/classes/class-happyforms-core.php CHANGED
@@ -91,7 +91,7 @@ class HappyForms_Core {
91
  add_action( 'admin_menu', array( $this, 'admin_menu' ) );
92
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
93
  add_action( 'current_screen', array( $this, 'admin_screens' ) );
94
- add_filter( 'media_buttons_context', array( $this, 'insert_editor_buttons' ) );
95
  add_filter( 'mce_external_plugins', array( $this, 'mce_external_plugins' ) );
96
 
97
  // Widget
@@ -417,24 +417,24 @@ class HappyForms_Core {
417
  *
418
  * @since 1.1.0.
419
  *
420
- * @hooked filter media_buttons_context
421
  *
422
- * @param string $context HTML markup.
423
  *
424
  * @return void
425
  */
426
- public function insert_editor_buttons( $context ) {
427
  global $pagenow;
428
 
429
  if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
430
- return $context;
431
  }
432
 
433
  $button_html = '<a href="#" class="button happyforms-editor-button" data-title="' . __( 'Insert HappyForm', HAPPYFORMS_TEXT_DOMAIN ) . '"><span class="dashicons dashicons-format-status"></span><span>'. __( 'Add HappyForms', HAPPYFORMS_TEXT_DOMAIN ) .'</span></a>';
434
 
435
  add_action( 'admin_footer', array( $this, 'output_happyforms_modal' ) );
436
 
437
- return $context . ' ' . $button_html;
438
  }
439
 
440
  public function mce_external_plugins( $plugins ) {
91
  add_action( 'admin_menu', array( $this, 'admin_menu' ) );
92
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
93
  add_action( 'current_screen', array( $this, 'admin_screens' ) );
94
+ add_action( 'media_buttons', array( $this, 'insert_editor_buttons' ) );
95
  add_filter( 'mce_external_plugins', array( $this, 'mce_external_plugins' ) );
96
 
97
  // Widget
417
  *
418
  * @since 1.1.0.
419
  *
420
+ * @hooked filter media_buttons
421
  *
422
+ * @param string $editor_id Editor ID.
423
  *
424
  * @return void
425
  */
426
+ public function insert_editor_buttons( $editor_id ) {
427
  global $pagenow;
428
 
429
  if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
430
+ return;
431
  }
432
 
433
  $button_html = '<a href="#" class="button happyforms-editor-button" data-title="' . __( 'Insert HappyForm', HAPPYFORMS_TEXT_DOMAIN ) . '"><span class="dashicons dashicons-format-status"></span><span>'. __( 'Add HappyForms', HAPPYFORMS_TEXT_DOMAIN ) .'</span></a>';
434
 
435
  add_action( 'admin_footer', array( $this, 'output_happyforms_modal' ) );
436
 
437
+ echo ' ' . $button_html;
438
  }
439
 
440
  public function mce_external_plugins( $plugins ) {
core/classes/class-session.php CHANGED
@@ -200,13 +200,13 @@ class HappyForms_Session {
200
  'step' => $this->step,
201
  ) );
202
 
203
- $serialized = wp_slash( json_encode( $data ), JSON_UNESCAPED_UNICODE );
204
 
205
  return $serialized;
206
  }
207
 
208
  public function unserialize( $data ) {
209
- $data = json_decode( wp_unslash( $data ), true );
210
 
211
  if ( ! isset( $data['step'] ) ) {
212
  $data['step'] = 0;
200
  'step' => $this->step,
201
  ) );
202
 
203
+ $serialized = wp_slash( json_encode( $data, JSON_UNESCAPED_UNICODE ) );
204
 
205
  return $serialized;
206
  }
207
 
208
  public function unserialize( $data ) {
209
+ $data = json_decode( $data, true );
210
 
211
  if ( ! isset( $data['step'] ) ) {
212
  $data['step'] = 0;
core/classes/parts/class-part-checkbox.php CHANGED
@@ -79,6 +79,10 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
79
  'default' => 0,
80
  'sanitize' => 'happyforms_sanitize_checkbox'
81
  ),
 
 
 
 
82
  );
83
 
84
  return happyforms_get_part_customize_fields( $fields, $this->type );
79
  'default' => 0,
80
  'sanitize' => 'happyforms_sanitize_checkbox'
81
  ),
82
+ 'select_all_label' => array(
83
+ 'default' => __( 'Select all', HAPPYFORMS_TEXT_DOMAIN ),
84
+ 'sanitize' => 'sanitize_text_field',
85
+ )
86
  );
87
 
88
  return happyforms_get_part_customize_fields( $fields, $this->type );
core/classes/parts/class-part-multi-line-text.php CHANGED
@@ -55,8 +55,8 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
55
  'sanitize' => 'happyforms_sanitize_checkbox',
56
  ),
57
  'character_limit' => array(
58
- 'default' => '',
59
- 'sanitize' => 'sanitize_text_field',
60
  ),
61
  'character_limit_mode' => array(
62
  'default' => 'word_max',
@@ -65,6 +65,14 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
65
  array( 'character_max', 'character_min', 'word_max', 'word_min' ),
66
  ),
67
  ),
 
 
 
 
 
 
 
 
68
  'width' => array(
69
  'default' => 'full',
70
  'sanitize' => 'sanitize_key'
@@ -224,23 +232,30 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
224
  }
225
 
226
  private function get_limit_label( $part ) {
227
- $label = '';
 
228
 
229
  switch( $part['character_limit_mode'] ) {
230
  case 'character_min':
231
- $label = __( 'characters (min.)', HAPPYFORMS_TEXT_DOMAIN );
232
  break;
233
  case 'character_max':
234
- $label = __( 'characters (max.)', HAPPYFORMS_TEXT_DOMAIN );
235
  break;
236
  case 'word_min':
237
- $label = __( 'words (min.)', HAPPYFORMS_TEXT_DOMAIN );
238
  break;
239
  case 'word_max':
240
- $label = __( 'words (max.)', HAPPYFORMS_TEXT_DOMAIN );
241
  break;
242
  }
243
 
 
 
 
 
 
 
244
  return $label;
245
  }
246
 
@@ -275,7 +290,7 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
275
  $label = $this->get_limit_label( $part );
276
  ?>
277
  <div class="happyforms-part__char-counter" <?php if ( happyforms_is_preview() && ! $character_limit ) : ?>style="display: none;"<?php endif; ?>>
278
- <span>0</span>/<?php echo $character_limit; ?> <?php echo $label; ?>
279
  </div>
280
  <?php
281
  }
55
  'sanitize' => 'happyforms_sanitize_checkbox',
56
  ),
57
  'character_limit' => array(
58
+ 'default' => 250,
59
+ 'sanitize' => 'intval',
60
  ),
61
  'character_limit_mode' => array(
62
  'default' => 'word_max',
65
  array( 'character_max', 'character_min', 'word_max', 'word_min' ),
66
  ),
67
  ),
68
+ 'characters_label' => array(
69
+ 'default' => __( 'Min characters', 'happyforms-upgrade' ),
70
+ 'sanitize' => 'sanitize_text_field',
71
+ ),
72
+ 'words_label' => array(
73
+ 'default' => __( 'Max words', 'happyforms-upgrade' ),
74
+ 'sanitize' => 'sanitize_text_field',
75
+ ),
76
  'width' => array(
77
  'default' => 'full',
78
  'sanitize' => 'sanitize_key'
232
  }
233
 
234
  private function get_limit_label( $part ) {
235
+ $min_or_max = '';
236
+ $type = '';
237
 
238
  switch( $part['character_limit_mode'] ) {
239
  case 'character_min':
240
+ $type = $part['characters_label'];
241
  break;
242
  case 'character_max':
243
+ $type = $part['characters_label'];
244
  break;
245
  case 'word_min':
246
+ $type = $part['words_label'];
247
  break;
248
  case 'word_max':
249
+ $type = $part['words_label'];
250
  break;
251
  }
252
 
253
+ $label = sprintf(
254
+ '<span class="counter-label">%s</span>',
255
+ $type,
256
+ $min_or_max
257
+ );
258
+
259
  return $label;
260
  }
261
 
290
  $label = $this->get_limit_label( $part );
291
  ?>
292
  <div class="happyforms-part__char-counter" <?php if ( happyforms_is_preview() && ! $character_limit ) : ?>style="display: none;"<?php endif; ?>>
293
+ <span class="counter">0</span>/<?php echo $character_limit; ?> <?php echo $label; ?>
294
  </div>
295
  <?php
296
  }
core/helpers/helper-form-templates.php CHANGED
@@ -1438,7 +1438,7 @@ endif;
1438
  if ( ! function_exists( 'happyforms_get_narrative_format' ) ) :
1439
 
1440
  function happyforms_get_narrative_format( $format ) {
1441
- $format = preg_replace( '/\[([^\]]*)\]/m', '%s', $format );
1442
 
1443
  return $format;
1444
  }
@@ -1448,7 +1448,7 @@ endif;
1448
  if ( ! function_exists( 'happyforms_get_narrative_tokens' ) ) :
1449
 
1450
  function happyforms_get_narrative_tokens( $format, $with_placeholders = false ) {
1451
- $matches = preg_match_all( '/\[([^\]]*)\]/m', $format, $tokens );
1452
 
1453
  if ( ! $matches ) {
1454
  return array();
@@ -1457,7 +1457,7 @@ function happyforms_get_narrative_tokens( $format, $with_placeholders = false )
1457
  $tokens = $tokens[1];
1458
 
1459
  if ( ! $with_placeholders ) {
1460
- return array_fill( 0, count( $tokens ), '' );
1461
  }
1462
 
1463
  return $tokens;
1438
  if ( ! function_exists( 'happyforms_get_narrative_format' ) ) :
1439
 
1440
  function happyforms_get_narrative_format( $format ) {
1441
+ $format = preg_replace( '/\[([^\/\]]*)\]/m', '%s', $format );
1442
 
1443
  return $format;
1444
  }
1448
  if ( ! function_exists( 'happyforms_get_narrative_tokens' ) ) :
1449
 
1450
  function happyforms_get_narrative_tokens( $format, $with_placeholders = false ) {
1451
+ $matches = preg_match_all( '/\[([^\/\]]*)\]/m', $format, $tokens );
1452
 
1453
  if ( ! $matches ) {
1454
  return array();
1457
  $tokens = $tokens[1];
1458
 
1459
  if ( ! $with_placeholders ) {
1460
+ $tokens = array_fill( 0, count( $tokens ), '' );
1461
  }
1462
 
1463
  return $tokens;
core/templates/customize-controls/setup/select.php CHANGED
@@ -1,4 +1,4 @@
1
- <div class="customize-control customize-control-select" id="customize-control-<?php echo $control['field']; ?>">
2
  <?php do_action( "happyforms_setup_control_{$control['field']}_before", $control ); ?>
3
 
4
  <label for="<?php echo $control['field']; ?>" class="customize-control-title"><?php echo $control['label']; ?> <?php if ( isset( $control['tooltip'] ) ) : ?><i class="dashicons dashicons-editor-help" aria-hidden="true" data-pointer><span><?php echo $control['tooltip']; ?></span></i><?php endif; ?></label>
1
+ <div class="customize-control customize-control-select" id="customize-control-<?php echo $control['field']; ?>" data-value="<%= <?php echo $control['field']; ?> %>">
2
  <?php do_action( "happyforms_setup_control_{$control['field']}_before", $control ); ?>
3
 
4
  <label for="<?php echo $control['field']; ?>" class="customize-control-title"><?php echo $control['label']; ?> <?php if ( isset( $control['tooltip'] ) ) : ?><i class="dashicons dashicons-editor-help" aria-hidden="true" data-pointer><span><?php echo $control['tooltip']; ?></span></i><?php endif; ?></label>
core/templates/customize-controls/setup/upsell.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <div class="customize-control customize-control--upsell" id="<?php echo $control['id']; ?>">
2
+ <a href="https://happyforms.me/upgrade" target="_blank" class="external"><?php echo $control['label']; ?></a>
3
+ </div>
core/templates/parts/customize-email.php CHANGED
@@ -44,11 +44,6 @@
44
  <div class="happyforms-part-advanced-settings-wrap">
45
  <?php do_action( 'happyforms_part_customize_email_before_advanced_options' ); ?>
46
 
47
- <p>
48
- <label for="<%= instance.id %>_suffix"><?php _e( 'Suffix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
49
- <input type="text" id="<%= instance.id %>_suffix" class="widefat title" value="<%= instance.suffix %>" data-bind="suffix" maxlength="50" />
50
- </p>
51
-
52
  <p style="display: <%= ( instance.suffix.length ) ? 'none' : 'block' %>">
53
  <label>
54
  <input type="checkbox" class="checkbox" value="1" <% if ( instance.autocomplete_domains ) { %>checked="checked"<% } %> data-bind="autocomplete_domains" /> <?php _e( 'Suggest common email domains', HAPPYFORMS_TEXT_DOMAIN ); ?>
@@ -61,15 +56,20 @@
61
  </p>
62
  <div class="happyforms-nested-settings" data-trigger="confirmation_field" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
63
  <p>
64
- <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
65
  <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
66
  </p>
67
  <p>
68
- <label for="<%= instance.id %>_confirmation_field_placeholder"><?php _e( 'Placeholder', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
69
  <input type="text" id="<%= instance.id %>_confirmation_field_placeholder" class="widefat title" value="<%= instance.confirmation_field_placeholder %>" data-bind="confirmation_field_placeholder" />
70
  </p>
71
  </div>
72
 
 
 
 
 
 
73
  <?php happyforms_customize_part_width_control(); ?>
74
 
75
  <?php do_action( 'happyforms_part_customize_email_after_advanced_options' ); ?>
44
  <div class="happyforms-part-advanced-settings-wrap">
45
  <?php do_action( 'happyforms_part_customize_email_before_advanced_options' ); ?>
46
 
 
 
 
 
 
47
  <p style="display: <%= ( instance.suffix.length ) ? 'none' : 'block' %>">
48
  <label>
49
  <input type="checkbox" class="checkbox" value="1" <% if ( instance.autocomplete_domains ) { %>checked="checked"<% } %> data-bind="autocomplete_domains" /> <?php _e( 'Suggest common email domains', HAPPYFORMS_TEXT_DOMAIN ); ?>
56
  </p>
57
  <div class="happyforms-nested-settings" data-trigger="confirmation_field" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
58
  <p>
59
+ <label for="<%= instance.id %>_confirmation_field_label"><?php _e( '\'Confirmation\' label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
60
  <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
61
  </p>
62
  <p>
63
+ <label for="<%= instance.id %>_confirmation_field_placeholder"><?php _e( '\'Confirmation\' placeholder', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
64
  <input type="text" id="<%= instance.id %>_confirmation_field_placeholder" class="widefat title" value="<%= instance.confirmation_field_placeholder %>" data-bind="confirmation_field_placeholder" />
65
  </p>
66
  </div>
67
 
68
+ <p>
69
+ <label for="<%= instance.id %>_suffix"><?php _e( 'Suffix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
70
+ <input type="text" id="<%= instance.id %>_suffix" class="widefat title" value="<%= instance.suffix %>" data-bind="suffix" maxlength="50" />
71
+ </p>
72
+
73
  <?php happyforms_customize_part_width_control(); ?>
74
 
75
  <?php do_action( 'happyforms_part_customize_email_after_advanced_options' ); ?>
core/templates/parts/customize-multi-line-text.php CHANGED
@@ -52,15 +52,26 @@
52
 
53
  <div class="happyforms-nested-settings character-limit-settings" <% if ( ! instance.limit_input ) { %>style="display: none;"<% } %>>
54
  <p>
55
- <label for="<%= instance.id %>_character_limit"><?php _e( 'Amount', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
56
  <input type="number" id="<%= instance.id %>_character_limit" class="widefat title" step="1" min="1" value="<%= instance.character_limit %>" data-bind="character_limit" />
57
  </p>
58
- <select id="<%= instance.id %>_character_limit_mode" data-bind="character_limit_mode">
59
- <option value="word_max"<%= (instance.character_limit_mode == 'word_max') ? ' selected' : '' %>><?php _e( 'Words (max)', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
60
- <option value="word_min"<%= (instance.character_limit_mode == 'word_min') ? ' selected' : '' %>><?php _e( 'Words (min)', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
61
- <option value="character_max"<%= (instance.character_limit_mode == 'character_max') ? ' selected' : '' %>><?php _e( 'Characters (max)', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
62
- <option value="character_min"<%= (instance.character_limit_mode == 'character_min') ? ' selected' : '' %>><?php _e( 'Characters (min)', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
63
- </select>
 
 
 
 
 
 
 
 
 
 
 
64
  </div>
65
 
66
  <?php happyforms_customize_part_width_control(); ?>
52
 
53
  <div class="happyforms-nested-settings character-limit-settings" <% if ( ! instance.limit_input ) { %>style="display: none;"<% } %>>
54
  <p>
55
+ <label for="<%= instance.id %>_character_limit"><?php _e( 'Limit', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
56
  <input type="number" id="<%= instance.id %>_character_limit" class="widefat title" step="1" min="1" value="<%= instance.character_limit %>" data-bind="character_limit" />
57
  </p>
58
+ <p>
59
+ <label for="<%= instance.id %>_character_limit_mode"><?php _e( 'Count', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
60
+ <select id="<%= instance.id %>_character_limit_mode" data-bind="character_limit_mode">
61
+ <option value="word_max"<%= (instance.character_limit_mode == 'word_max') ? ' selected' : '' %>><?php _e( 'Max words', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
62
+ <option value="word_min"<%= (instance.character_limit_mode == 'word_min') ? ' selected' : '' %>><?php _e( 'Min words', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
63
+ <option value="character_max"<%= (instance.character_limit_mode == 'character_max') ? ' selected' : '' %>><?php _e( 'Max characters', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
64
+ <option value="character_min"<%= (instance.character_limit_mode == 'character_min') ? ' selected' : '' %>><?php _e( 'Min characters', HAPPYFORMS_TEXT_DOMAIN ); ?></option>
65
+ </select>
66
+ </p>
67
+ <p class="character-limit__characters-label" style="display: <%= ( 'character_min' === instance.character_limit_mode || 'character_max' === instance.character_limit_mode ) ? 'block' : 'none' %>">
68
+ <label for="<%= instance.id %>_characters_label"><?php _e( '\'Characters\' label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
69
+ <input type="text" id="<%= instance.id %>_characters_label" class="widefat title" value="<%= instance.characters_label %>" data-bind="characters_label" />
70
+ </p>
71
+ <p class="character-limit__words-label" style="display: <%= ( 'word_max' === instance.character_limit_mode || 'word_min' === instance.character_limit_mode ) ? 'block' : 'none' %>">
72
+ <label for="<%= instance.id %>_words_label"><?php _e( '\'Words\' label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
73
+ <input type="text" id="<%= instance.id %>_words_label" class="widefat title" value="<%= instance.words_label %>" data-bind="words_label" />
74
+ </p>
75
  </div>
76
 
77
  <?php happyforms_customize_part_width_control(); ?>
core/templates/parts/customize-number.php CHANGED
@@ -35,11 +35,11 @@
35
 
36
  <div class="min-max-wrapper">
37
  <p>
38
- <label for="<%= instance.id %>_min_value"><?php _e( 'Min value', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
39
  <input type="number" id="<%= instance.id %>_min_value" class="widefat title" value="<%= instance.min_value %>" data-bind="min_value" />
40
  </p>
41
  <p>
42
- <label for="<%= instance.id %>_max_value"><?php _e( 'Max value', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
43
  <input type="number" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
44
  </p>
45
  </div>
@@ -69,14 +69,6 @@
69
  <input type="text" id="<%= instance.id %>_mask_numeric_decimal_mark" class="widefat title" value="<%= instance.mask_numeric_decimal_mark %>" data-bind="mask_numeric_decimal_mark" />
70
  </p>
71
  </div>
72
- <p>
73
- <label for="<%= instance.id %>_mask_numeric_prefix"><?php _e( 'Prefix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
74
- <input type="text" id="<%= instance.id %>_mask_numeric_prefix" class="widefat title" value="<%= instance.mask_numeric_prefix %>" data-bind="mask_numeric_prefix" maxlength="50" />
75
- </p>
76
- <p>
77
- <label for="<%= instance.id %>_mask_numeric_suffix"><?php _e( 'Suffix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
78
- <input type="text" id="<%= instance.id %>_mask_numeric_suffix" class="widefat title" value="<%= instance.mask_numeric_suffix %>" data-bind="mask_numeric_suffix" maxlength="50" />
79
- </p>
80
  <p>
81
  <label>
82
  <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation', HAPPYFORMS_TEXT_DOMAIN ); ?>
@@ -84,14 +76,22 @@
84
  </p>
85
  <div class="happyforms-nested-settings" data-trigger="confirmation_field" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
86
  <p>
87
- <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
88
  <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
89
  </p>
90
  <p>
91
- <label for="<%= instance.id %>_confirmation_field_placeholder"><?php _e( 'Placeholder', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
92
  <input type="text" id="<%= instance.id %>_confirmation_field_placeholder" class="widefat title" value="<%= instance.confirmation_field_placeholder %>" data-bind="confirmation_field_placeholder" />
93
  </p>
94
  </div>
 
 
 
 
 
 
 
 
95
 
96
  <?php happyforms_customize_part_width_control(); ?>
97
 
35
 
36
  <div class="min-max-wrapper">
37
  <p>
38
+ <label for="<%= instance.id %>_min_value"><?php _e( 'Min number', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
39
  <input type="number" id="<%= instance.id %>_min_value" class="widefat title" value="<%= instance.min_value %>" data-bind="min_value" />
40
  </p>
41
  <p>
42
+ <label for="<%= instance.id %>_max_value"><?php _e( 'Max number', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
43
  <input type="number" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
44
  </p>
45
  </div>
69
  <input type="text" id="<%= instance.id %>_mask_numeric_decimal_mark" class="widefat title" value="<%= instance.mask_numeric_decimal_mark %>" data-bind="mask_numeric_decimal_mark" />
70
  </p>
71
  </div>
 
 
 
 
 
 
 
 
72
  <p>
73
  <label>
74
  <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation', HAPPYFORMS_TEXT_DOMAIN ); ?>
76
  </p>
77
  <div class="happyforms-nested-settings" data-trigger="confirmation_field" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
78
  <p>
79
+ <label for="<%= instance.id %>_confirmation_field_label"><?php _e( '\'Confirmation\' label', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
80
  <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
81
  </p>
82
  <p>
83
+ <label for="<%= instance.id %>_confirmation_field_placeholder"><?php _e( '\'Confirmation\' placeholder', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
84
  <input type="text" id="<%= instance.id %>_confirmation_field_placeholder" class="widefat title" value="<%= instance.confirmation_field_placeholder %>" data-bind="confirmation_field_placeholder" />
85
  </p>
86
  </div>
87
+ <p>
88
+ <label for="<%= instance.id %>_mask_numeric_prefix"><?php _e( 'Prefix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
89
+ <input type="text" id="<%= instance.id %>_mask_numeric_prefix" class="widefat title" value="<%= instance.mask_numeric_prefix %>" data-bind="mask_numeric_prefix" maxlength="50" />
90
+ </p>
91
+ <p>
92
+ <label for="<%= instance.id %>_mask_numeric_suffix"><?php _e( 'Suffix', HAPPYFORMS_TEXT_DOMAIN ); ?></label>
93
+ <input type="text" id="<%= instance.id %>_mask_numeric_suffix" class="widefat title" value="<%= instance.mask_numeric_suffix %>" data-bind="mask_numeric_suffix" maxlength="50" />
94
+ </p>
95
 
96
  <?php happyforms_customize_part_width_control(); ?>
97
 
happyforms.php CHANGED
@@ -5,7 +5,7 @@
5
  * Plugin URI: https://happyforms.me
6
  * Description: Your friendly drag and drop contact form builder for creating contact forms, lead generation forms, feedback forms, quote forms, survey forms and more!
7
  * Author: The Theme Foundry
8
- * Version: 1.9.6
9
  * Author URI: https://thethemefoundry.com
10
  * Upgrade URI: https://thethemefoundry.com
11
  */
@@ -13,7 +13,7 @@
13
  /**
14
  * The current version of the plugin.
15
  */
16
- define( 'HAPPYFORMS_VERSION', '1.9.6' );
17
  define( 'HAPPYFORMS_TEXT_DOMAIN', 'happyforms' );
18
 
19
  if ( ! function_exists( 'happyforms_plugin_file' ) ):
5
  * Plugin URI: https://happyforms.me
6
  * Description: Your friendly drag and drop contact form builder for creating contact forms, lead generation forms, feedback forms, quote forms, survey forms and more!
7
  * Author: The Theme Foundry
8
+ * Version: 1.9.7
9
  * Author URI: https://thethemefoundry.com
10
  * Upgrade URI: https://thethemefoundry.com
11
  */
13
  /**
14
  * The current version of the plugin.
15
  */
16
+ define( 'HAPPYFORMS_VERSION', '1.9.7' );
17
  define( 'HAPPYFORMS_TEXT_DOMAIN', 'happyforms' );
18
 
19
  if ( ! function_exists( 'happyforms_plugin_file' ) ):
inc/assets/js/customize.js CHANGED
@@ -1430,6 +1430,7 @@
1430
  classes.views.Base.prototype.initialize.apply( this, arguments );
1431
 
1432
  this.listenTo( this.model, 'change:submit_button_label', this.onSubmitButtonLabelChange );
 
1433
  },
1434
 
1435
  render: function() {
@@ -1481,6 +1482,8 @@
1481
  }
1482
  }
1483
 
 
 
1484
  this.model.set( attribute, value );
1485
  },
1486
 
@@ -1530,6 +1533,10 @@
1530
  } );
1531
 
1532
  classes.views.Base.prototype.remove.apply( this, arguments );
 
 
 
 
1533
  }
1534
  } );
1535
 
@@ -1649,6 +1656,7 @@
1649
  ready: function() {
1650
  this.initColorPickers();
1651
  this.initUISliders();
 
1652
  this.setupHelpPointers();
1653
  this.initCodeEditors();
1654
 
1430
  classes.views.Base.prototype.initialize.apply( this, arguments );
1431
 
1432
  this.listenTo( this.model, 'change:submit_button_label', this.onSubmitButtonLabelChange );
1433
+ this.listenTo( this.model, 'change:confirm_submission', this.onConfirmSubmissionChange );
1434
  },
1435
 
1436
  render: function() {
1482
  }
1483
  }
1484
 
1485
+ $( '#customize-control-' + attribute ).attr( 'data-value', value );
1486
+
1487
  this.model.set( attribute, value );
1488
  },
1489
 
1533
  } );
1534
 
1535
  classes.views.Base.prototype.remove.apply( this, arguments );
1536
+ },
1537
+
1538
+ onConfirmSubmissionChange: function( model, value ) {
1539
+ model.set( 'confirm_submission', 'success_message', { silent: true } );
1540
  }
1541
  } );
1542
 
1656
  ready: function() {
1657
  this.initColorPickers();
1658
  this.initUISliders();
1659
+ this.initFormWidthSlider();
1660
  this.setupHelpPointers();
1661
  this.initCodeEditors();
1662
 
inc/classes/class-happyforms.php CHANGED
@@ -76,13 +76,6 @@ class HappyForms extends HappyForms_Core {
76
  }
77
 
78
  public function add_dummy_setup_controls( $controls ) {
79
- $controls[1300] = array(
80
- 'type' => 'checkbox_dummy',
81
- 'dummy_id' => 'redirect_on_complete',
82
- 'label' => __( 'Redirect on complete', HAPPYFORMS_TEXT_DOMAIN ),
83
- 'tooltip' => __( 'By default, users will be redirected to the post or page displaying this form. To set a custom redirect webpage, add a link here.', HAPPYFORMS_TEXT_DOMAIN ),
84
- );
85
-
86
  $controls[1320] = array(
87
  'type' => 'checkbox_dummy',
88
  'dummy_id' => 'use_theme_styles',
@@ -118,24 +111,45 @@ class HappyForms extends HappyForms_Core {
118
  'tooltip' => __( 'Generate a link that can be clicked to open an overlay window for this form.', HAPPYFORMS_TEXT_DOMAIN ),
119
  );
120
 
 
 
 
 
 
 
 
121
  $controls[1660] = array(
122
  'type' => 'checkbox_dummy',
123
  'dummy_id' => 'save_abandoned_responses',
124
- 'label' => __( 'Save abandoned submission', HAPPYFORMS_TEXT_DOMAIN ),
125
  'tooltip' => __( 'Keep incomplete users responses stored in your WordPress database.', HAPPYFORMS_TEXT_DOMAIN ),
126
  );
127
 
 
 
 
 
 
 
 
128
  $controls[1690] = array(
 
 
 
 
 
 
 
129
  'type' => 'checkbox_dummy',
130
  'dummy_id' => 'unique_id',
131
- 'label' => __( 'Give each submission an ID number', HAPPYFORMS_TEXT_DOMAIN ),
132
  'tooltip' => __( 'Tag responses with a unique, incremental identifier.', HAPPYFORMS_TEXT_DOMAIN ),
133
  );
134
 
135
  $controls[1800] = array(
136
  'type' => 'checkbox_dummy',
137
  'dummy_id' => 'preview_before_submit',
138
- 'label' => __( 'Preview values before submission', HAPPYFORMS_TEXT_DOMAIN ),
139
  'tooltip' => __( 'Let your users review their submission before confirming it.', HAPPYFORMS_TEXT_DOMAIN ),
140
  );
141
 
76
  }
77
 
78
  public function add_dummy_setup_controls( $controls ) {
 
 
 
 
 
 
 
79
  $controls[1320] = array(
80
  'type' => 'checkbox_dummy',
81
  'dummy_id' => 'use_theme_styles',
111
  'tooltip' => __( 'Generate a link that can be clicked to open an overlay window for this form.', HAPPYFORMS_TEXT_DOMAIN ),
112
  );
113
 
114
+ $controls[1591] = array(
115
+ 'type' => 'checkbox_dummy',
116
+ 'dummy_id' => 'save_meta_data',
117
+ 'label' => __( 'Save user\'s meta data', HAPPYFORMS_TEXT_DOMAIN ),
118
+ 'tooltip' => __( 'User meta data like IP address, browser language, local time, and platform will be saved with each submission when checked.', HAPPYFORMS_TEXT_DOMAIN ),
119
+ );
120
+
121
  $controls[1660] = array(
122
  'type' => 'checkbox_dummy',
123
  'dummy_id' => 'save_abandoned_responses',
124
+ 'label' => __( 'Save abandoned submissions', HAPPYFORMS_TEXT_DOMAIN ),
125
  'tooltip' => __( 'Keep incomplete users responses stored in your WordPress database.', HAPPYFORMS_TEXT_DOMAIN ),
126
  );
127
 
128
+ $controls[1661] = array(
129
+ 'type' => 'checkbox_dummy',
130
+ 'dummy_id' => 'save_and_resume_submissions',
131
+ 'label' => __( 'Save and resume submissions', HAPPYFORMS_TEXT_DOMAIN ),
132
+ 'tooltip' => __( 'Let users temporarily save their incomplete response and continue filling out the form at a later time.', HAPPYFORMS_TEXT_DOMAIN ),
133
+ );
134
+
135
  $controls[1690] = array(
136
+ 'type' => 'checkbox_dummy',
137
+ 'dummy_id' => 'use_mailchimp',
138
+ 'label' => __( 'Use Mailchimp', HAPPYFORMS_TEXT_DOMAIN ),
139
+ 'tooltip' => __( 'Set which Mailchimp lists, groups and tags you want to use.', HAPPYFORMS_TEXT_DOMAIN )
140
+ );
141
+
142
+ $controls[1691] = array(
143
  'type' => 'checkbox_dummy',
144
  'dummy_id' => 'unique_id',
145
+ 'label' => __( 'Add identifier to each submission', HAPPYFORMS_TEXT_DOMAIN ),
146
  'tooltip' => __( 'Tag responses with a unique, incremental identifier.', HAPPYFORMS_TEXT_DOMAIN ),
147
  );
148
 
149
  $controls[1800] = array(
150
  'type' => 'checkbox_dummy',
151
  'dummy_id' => 'preview_before_submit',
152
+ 'label' => __( 'Preview values before submit', HAPPYFORMS_TEXT_DOMAIN ),
153
  'tooltip' => __( 'Let your users review their submission before confirming it.', HAPPYFORMS_TEXT_DOMAIN ),
154
  );
155
 
inc/classes/parts/class-part-website-url-dummy.php CHANGED
@@ -5,7 +5,7 @@ class HappyForms_Part_WebsiteUrl_Dummy extends HappyForms_Form_Part {
5
  public $type = 'website_url_dummy';
6
 
7
  public function __construct() {
8
- $this->label = __( 'Site Address', 'happyforms' );
9
  $this->description = __( 'For formatted site URLs.', 'happyforms' );
10
  }
11
 
5
  public $type = 'website_url_dummy';
6
 
7
  public function __construct() {
8
+ $this->label = __( 'Web Address', 'happyforms' );
9
  $this->description = __( 'For formatted site URLs.', 'happyforms' );
10
  }
11
 
languages/happyforms.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the HappyForms package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: HappyForms 1.9.6\n"
6
  "Report-Msgid-Bugs-To: https://thethemefoundry.com/support/\n"
7
- "POT-Creation-Date: 2020-03-11 13:58:15+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -45,112 +45,116 @@ msgstr ""
45
  msgid "Edit Form"
46
  msgstr ""
47
 
48
- #: core/classes/class-form-admin.php:154
49
  #: core/classes/class-form-controller.php:80
50
  msgid "View form"
51
  msgstr ""
52
 
53
- #: core/classes/class-form-admin.php:159
54
  msgid "Preview form"
55
  msgstr ""
56
 
57
- #: core/classes/class-form-admin.php:164 core/classes/class-form-admin.php:167
58
  msgid "Form updated."
59
  msgstr ""
60
 
61
- #: core/classes/class-form-admin.php:165
62
  msgid "Custom field updated."
63
  msgstr ""
64
 
65
- #: core/classes/class-form-admin.php:166
66
  msgid "Custom field deleted."
67
  msgstr ""
68
 
69
- #: core/classes/class-form-admin.php:168
70
  msgid "Form restored to revision from %s."
71
  msgstr ""
72
 
73
- #: core/classes/class-form-admin.php:169
74
  msgid "Form published."
75
  msgstr ""
76
 
77
- #: core/classes/class-form-admin.php:170
78
  msgid "Form saved."
79
  msgstr ""
80
 
81
- #: core/classes/class-form-admin.php:171
82
  msgid "Form submitted."
83
  msgstr ""
84
 
85
- #: core/classes/class-form-admin.php:172
86
  msgid "Form scheduled."
87
  msgstr ""
88
 
89
- #: core/classes/class-form-admin.php:173
90
  msgid "Form draft updated."
91
  msgstr ""
92
 
93
- #: core/classes/class-form-admin.php:196
94
  msgid "%s form updated."
95
  msgid_plural "%s forms updated."
96
  msgstr[0] ""
97
  msgstr[1] ""
98
 
99
- #: core/classes/class-form-admin.php:197
100
  msgid "%s form not updated, somebody is editing it."
101
  msgid_plural "%s forms not updated, somebody is editing them."
102
  msgstr[0] ""
103
  msgstr[1] ""
104
 
105
- #: core/classes/class-form-admin.php:198
106
  msgid "%s form permanently deleted."
107
  msgid_plural "%s forms permanently deleted."
108
  msgstr[0] ""
109
  msgstr[1] ""
110
 
111
- #: core/classes/class-form-admin.php:199
112
  msgid "%s form moved to the Trash."
113
  msgid_plural "%s forms moved to the Trash."
114
  msgstr[0] ""
115
  msgstr[1] ""
116
 
117
- #: core/classes/class-form-admin.php:200
118
  msgid "%s form restored from the Trash."
119
  msgid_plural "%s forms restored from the Trash."
120
  msgstr[0] ""
121
  msgstr[1] ""
122
 
123
- #: core/classes/class-form-admin.php:243
124
  msgid "Shortcode"
125
  msgstr ""
126
 
127
- #: core/classes/class-form-admin.php:244
128
  msgid "Author"
129
  msgstr ""
130
 
131
- #: core/classes/class-form-admin.php:282
132
  msgid "Copy to clipboard"
133
  msgstr ""
134
 
135
- #: core/classes/class-form-admin.php:323
 
 
 
 
136
  msgid "Edit"
137
  msgstr ""
138
 
139
- #: core/classes/class-form-admin.php:327
140
  #: core/templates/customize-form-item.php:27
141
  #: core/templates/customize-form-part-footer.php:4
142
  msgid "Duplicate"
143
  msgstr ""
144
 
145
- #: core/classes/class-form-admin.php:331
146
  msgid "Trash"
147
  msgstr ""
148
 
149
- #: core/classes/class-form-admin.php:375
150
  msgid "1 form duplicated."
151
  msgstr ""
152
 
153
- #: core/classes/class-form-admin.php:377
154
  msgid "Undo"
155
  msgstr ""
156
 
@@ -309,109 +313,122 @@ msgstr ""
309
  msgid "Missing validation callback for field %s"
310
  msgstr ""
311
 
312
- #: core/classes/class-form-setup.php:52
313
  msgid "Thank you! Your submission has been sent."
314
  msgstr ""
315
 
316
- #: core/classes/class-form-setup.php:56
317
  msgid "There is a problem! Please review your submission."
318
  msgstr ""
319
 
320
- #: core/classes/class-form-setup.php:76
321
  msgid "This field is required."
322
  msgstr ""
323
 
324
- #: core/classes/class-form-setup.php:80
325
  msgid "(optional)"
326
  msgstr ""
327
 
328
- #: core/classes/class-form-setup.php:84
329
  msgid "Send"
330
  msgstr ""
331
 
332
- #: core/classes/class-form-setup.php:108
333
  msgid "Validate your submission"
334
  msgstr ""
335
 
336
- #: core/classes/class-form-setup.php:116
337
  msgid "Review submission"
338
  msgstr ""
339
 
340
- #: core/classes/class-form-setup.php:164
 
 
 
 
341
  msgid "Success message"
342
  msgstr ""
343
 
344
- #: core/classes/class-form-setup.php:165
345
- msgid ""
346
- "This is the message your users will see after succesfully submitting your "
347
- "form."
 
 
 
 
 
 
 
 
 
348
  msgstr ""
349
 
350
- #: core/classes/class-form-setup.php:170
351
  msgid "Error message"
352
  msgstr ""
353
 
354
- #: core/classes/class-form-setup.php:171
355
  msgid ""
356
  "This is the message your users will see when there are form errors "
357
  "preventing submission."
358
  msgstr ""
359
 
360
- #: core/classes/class-form-setup.php:176
361
  msgid "Optional part label"
362
  msgstr ""
363
 
364
- #: core/classes/class-form-setup.php:177
365
  msgid ""
366
  "Mark optional parts in your form to let your users distinguish them from "
367
  "required parts."
368
  msgstr ""
369
 
370
- #: core/classes/class-form-setup.php:182
371
  msgid "Submit button label"
372
  msgstr ""
373
 
374
- #: core/classes/class-form-setup.php:183
375
  msgid "Change text of submit button to describe an action your form performs."
376
  msgstr ""
377
 
378
- #: core/classes/class-form-setup.php:188
379
  msgid "Submit button CSS classes"
380
  msgstr ""
381
 
382
- #: core/classes/class-form-setup.php:189
383
  msgid ""
384
  "Add custom CSS classes separated by space for targeting a button in your "
385
  "stylesheet."
386
  msgstr ""
387
 
388
- #: core/classes/class-form-setup.php:194
389
  msgid "Use custom HTML ID"
390
  msgstr ""
391
 
392
- #: core/classes/class-form-setup.php:196
393
  msgid "Add a unique HTML ID to your form. Write without a hash (#) character."
394
  msgstr ""
395
 
396
- #: core/classes/class-form-setup.php:204
397
  msgid "Form HTML ID"
398
  msgstr ""
399
 
400
- #: core/classes/class-form-setup.php:212
401
  msgid "Hide form after submit"
402
  msgstr ""
403
 
404
- #: core/classes/class-form-setup.php:213
405
  msgid ""
406
  "Hide all form parts and display just title and confirmation message on "
407
  "submit."
408
  msgstr ""
409
 
410
- #: core/classes/class-form-setup.php:218
411
  msgid "Spam prevention"
412
  msgstr ""
413
 
414
- #: core/classes/class-form-setup.php:219
415
  msgid "Protect your form against bots by using HoneyPot security."
416
  msgstr ""
417
 
@@ -688,10 +705,8 @@ msgstr ""
688
 
689
  #: core/classes/class-form-styles.php:720
690
  #: core/templates/parts/customize-email.php:30
691
- #: core/templates/parts/customize-email.php:68
692
  #: core/templates/parts/customize-multi-line-text.php:30
693
  #: core/templates/parts/customize-number.php:30
694
- #: core/templates/parts/customize-number.php:91
695
  #: core/templates/parts/customize-select.php:28
696
  #: core/templates/parts/customize-single-line-text.php:30
697
  #: inc/classes/parts/class-part-placeholder-dummy.php:8
@@ -1003,6 +1018,11 @@ msgstr ""
1003
  msgid "Untitled"
1004
  msgstr ""
1005
 
 
 
 
 
 
1006
  #: core/classes/parts/class-part-email.php:8
1007
  #: core/templates/customize-form-steps.php:5
1008
  msgid "Email"
@@ -1020,20 +1040,14 @@ msgstr ""
1020
  msgid "For paragraph text fields."
1021
  msgstr ""
1022
 
1023
- #: core/classes/parts/class-part-multi-line-text.php:231
1024
- msgid "characters (min.)"
1025
- msgstr ""
1026
-
1027
- #: core/classes/parts/class-part-multi-line-text.php:234
1028
- msgid "characters (max.)"
1029
  msgstr ""
1030
 
1031
- #: core/classes/parts/class-part-multi-line-text.php:237
1032
- msgid "words (min.)"
1033
- msgstr ""
1034
-
1035
- #: core/classes/parts/class-part-multi-line-text.php:240
1036
- msgid "words (max.)"
1037
  msgstr ""
1038
 
1039
  #: core/classes/parts/class-part-number.php:8
@@ -2884,12 +2898,6 @@ msgstr ""
2884
  msgid "Clear Results"
2885
  msgstr ""
2886
 
2887
- #: core/templates/customize-form-parts-drawer.php:30
2888
- #: inc/classes/class-happyforms.php:231
2889
- #: inc/templates/customize-controls/checkbox_dummy.php:7
2890
- msgid "Upgrade"
2891
- msgstr ""
2892
-
2893
  #: core/templates/customize-form-parts-drawer.php:39
2894
  msgid "No parts found."
2895
  msgstr ""
@@ -2925,10 +2933,8 @@ msgstr ""
2925
  #: core/templates/parts/customize-checkbox.php:4
2926
  #: core/templates/parts/customize-checkbox.php:120
2927
  #: core/templates/parts/customize-email.php:4
2928
- #: core/templates/parts/customize-email.php:64
2929
  #: core/templates/parts/customize-multi-line-text.php:4
2930
  #: core/templates/parts/customize-number.php:4
2931
- #: core/templates/parts/customize-number.php:87
2932
  #: core/templates/parts/customize-radio.php:4
2933
  #: core/templates/parts/customize-radio.php:103
2934
  #: core/templates/parts/customize-select.php:4
@@ -3087,7 +3093,7 @@ msgstr ""
3087
 
3088
  #: core/templates/parts/customize-checkbox.php:102
3089
  #: core/templates/parts/customize-email.php:78
3090
- #: core/templates/parts/customize-multi-line-text.php:71
3091
  #: core/templates/parts/customize-number.php:99
3092
  #: core/templates/parts/customize-radio.php:83
3093
  #: core/templates/parts/customize-select.php:83
@@ -3119,19 +3125,29 @@ msgstr ""
3119
  msgid "Reveal on focus"
3120
  msgstr ""
3121
 
3122
- #: core/templates/parts/customize-email.php:48
3123
- #: core/templates/parts/customize-number.php:77
3124
- #: core/templates/parts/customize-single-line-text.php:53
3125
- msgid "Suffix"
3126
  msgstr ""
3127
 
3128
  #: core/templates/parts/customize-email.php:54
3129
- msgid "Suggest common email domains"
 
3130
  msgstr ""
3131
 
3132
  #: core/templates/parts/customize-email.php:59
3133
- #: core/templates/parts/customize-number.php:82
3134
- msgid "Require confirmation"
 
 
 
 
 
 
 
 
 
 
 
3135
  msgstr ""
3136
 
3137
  #: core/templates/parts/customize-multi-line-text.php:49
@@ -3139,31 +3155,35 @@ msgid "Limit words/characters"
3139
  msgstr ""
3140
 
3141
  #: core/templates/parts/customize-multi-line-text.php:55
3142
- msgid "Amount"
3143
  msgstr ""
3144
 
3145
  #: core/templates/parts/customize-multi-line-text.php:59
3146
- msgid "Words (max)"
3147
  msgstr ""
3148
 
3149
- #: core/templates/parts/customize-multi-line-text.php:60
3150
- msgid "Words (min)"
3151
  msgstr ""
3152
 
3153
- #: core/templates/parts/customize-multi-line-text.php:61
3154
- msgid "Characters (max)"
3155
  msgstr ""
3156
 
3157
- #: core/templates/parts/customize-multi-line-text.php:62
3158
- msgid "Characters (min)"
 
 
 
 
3159
  msgstr ""
3160
 
3161
  #: core/templates/parts/customize-number.php:38
3162
- msgid "Min value"
3163
  msgstr ""
3164
 
3165
  #: core/templates/parts/customize-number.php:42
3166
- msgid "Max value"
3167
  msgstr ""
3168
 
3169
  #: core/templates/parts/customize-number.php:59
@@ -3178,7 +3198,7 @@ msgstr ""
3178
  msgid "Decimal"
3179
  msgstr ""
3180
 
3181
- #: core/templates/parts/customize-number.php:73
3182
  #: core/templates/parts/customize-single-line-text.php:48
3183
  msgid "Prefix"
3184
  msgstr ""
@@ -3191,66 +3211,62 @@ msgstr ""
3191
  msgid "'No results' label"
3192
  msgstr ""
3193
 
3194
- #: core/templates/parts/frontend-checkbox.php:13
3195
- msgid "Select all"
3196
- msgstr ""
3197
-
3198
  #: core/templates/preview-form-pencil.php:3
3199
  msgid "Click to edit this part."
3200
  msgstr ""
3201
 
3202
  #: inc/classes/class-happyforms.php:82
3203
- msgid "Redirect on complete"
3204
  msgstr ""
3205
 
3206
  #: inc/classes/class-happyforms.php:83
3207
- msgid ""
3208
- "By default, users will be redirected to the post or page displaying this "
3209
- "form. To set a custom redirect webpage, add a link here."
3210
  msgstr ""
3211
 
3212
  #: inc/classes/class-happyforms.php:89
3213
- msgid "Use theme styles"
3214
  msgstr ""
3215
 
3216
  #: inc/classes/class-happyforms.php:90
3217
- msgid "Inherit theme default styles instead of using HappyForms styles."
3218
  msgstr ""
3219
 
3220
  #: inc/classes/class-happyforms.php:96
3221
- msgid "Shuffle parts"
3222
  msgstr ""
3223
 
3224
  #: inc/classes/class-happyforms.php:97
3225
- msgid "Shuffle the order of all form parts to avoid biases in your responses."
3226
  msgstr ""
3227
 
3228
  #: inc/classes/class-happyforms.php:103
3229
- msgid "Use reCAPTCHA"
3230
  msgstr ""
3231
 
3232
  #: inc/classes/class-happyforms.php:104
3233
- msgid "Protect your form against bots using your Google ReCaptcha credentials."
3234
  msgstr ""
3235
 
3236
  #: inc/classes/class-happyforms.php:110
3237
- msgid "Require password"
3238
  msgstr ""
3239
 
3240
  #: inc/classes/class-happyforms.php:111
3241
- msgid "Only users with password will be able to view and submit the form."
3242
  msgstr ""
3243
 
3244
  #: inc/classes/class-happyforms.php:117
3245
- msgid "Open in overlay window"
3246
  msgstr ""
3247
 
3248
  #: inc/classes/class-happyforms.php:118
3249
- msgid "Generate a link that can be clicked to open an overlay window for this form."
 
 
3250
  msgstr ""
3251
 
3252
  #: inc/classes/class-happyforms.php:124
3253
- msgid "Save abandoned submission"
3254
  msgstr ""
3255
 
3256
  #: inc/classes/class-happyforms.php:125
@@ -3258,98 +3274,116 @@ msgid "Keep incomplete users responses stored in your WordPress database."
3258
  msgstr ""
3259
 
3260
  #: inc/classes/class-happyforms.php:131
3261
- msgid "Give each submission an ID number"
3262
  msgstr ""
3263
 
3264
  #: inc/classes/class-happyforms.php:132
3265
- msgid "Tag responses with a unique, incremental identifier."
 
 
3266
  msgstr ""
3267
 
3268
  #: inc/classes/class-happyforms.php:138
3269
- msgid "Preview values before submission"
3270
  msgstr ""
3271
 
3272
  #: inc/classes/class-happyforms.php:139
3273
- msgid "Let your users review their submission before confirming it."
3274
  msgstr ""
3275
 
3276
  #: inc/classes/class-happyforms.php:145
3277
- msgid "Fade submit button until valid"
3278
  msgstr ""
3279
 
3280
  #: inc/classes/class-happyforms.php:146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3281
  msgid ""
3282
  "Reduce the opacity of the submit button until all required form parts are "
3283
  "valid."
3284
  msgstr ""
3285
 
3286
- #: inc/classes/class-happyforms.php:152
3287
  msgid "Limit submissions"
3288
  msgstr ""
3289
 
3290
- #: inc/classes/class-happyforms.php:153
3291
  msgid "Set limit on number of allowed form submission in general or per user."
3292
  msgstr ""
3293
 
3294
- #: inc/classes/class-happyforms.php:159
3295
  msgid "Schedule visibility"
3296
  msgstr ""
3297
 
3298
- #: inc/classes/class-happyforms.php:160
3299
  msgid ""
3300
  "Show or hide this form during a chosen time and day. Go to Settings > "
3301
  "Timezone to set your city offset."
3302
  msgstr ""
3303
 
3304
- #: inc/classes/class-happyforms.php:170
3305
  msgid "Include mark and reply link"
3306
  msgstr ""
3307
 
3308
- #: inc/classes/class-happyforms.php:171
3309
  msgid "Reply to your users and mark their submission as read in one click."
3310
  msgstr ""
3311
 
3312
- #: inc/classes/class-happyforms.php:177
3313
  msgid "Link to attachments in email"
3314
  msgstr ""
3315
 
3316
- #: inc/classes/class-happyforms.php:178
3317
  msgid "Show attachments as links instead of a simple counter."
3318
  msgstr ""
3319
 
3320
- #: inc/classes/class-happyforms.php:184
3321
  msgid "Hide Placeholder parts in email"
3322
  msgstr ""
3323
 
3324
- #: inc/classes/class-happyforms.php:190
3325
  msgid "Include referral link"
3326
  msgstr ""
3327
 
3328
- #: inc/classes/class-happyforms.php:191
3329
  msgid "Include the page link your form was submitted from."
3330
  msgstr ""
3331
 
3332
- #: inc/classes/class-happyforms.php:197
3333
  msgid "Attach PDF to confirmation email"
3334
  msgstr ""
3335
 
3336
- #: inc/classes/class-happyforms.php:198
3337
  msgid "Attach a PDF to the recipient's confirmation email."
3338
  msgstr ""
3339
 
3340
- #: inc/classes/class-happyforms.php:204
3341
  msgid "Send abandonment email"
3342
  msgstr ""
3343
 
3344
- #: inc/classes/class-happyforms.php:205
3345
  msgid "Notify users when they abandon your form before submitting it."
3346
  msgstr ""
3347
 
3348
- #: inc/classes/class-happyforms.php:230
3349
  msgid "HappyForms Upgrade"
3350
  msgstr ""
3351
 
3352
- #: inc/classes/class-happyforms.php:355
3353
  msgid ""
3354
  "<p>Can we ask a favor?</p><p>You created your first form %s days ago — how "
3355
  "time flies! Since then, we’ve answered hundreds of community emails and "
@@ -3492,7 +3526,7 @@ msgid "For displaying personal honorifics."
3492
  msgstr ""
3493
 
3494
  #: inc/classes/parts/class-part-website-url-dummy.php:8
3495
- msgid "Site Address"
3496
  msgstr ""
3497
 
3498
  #: inc/classes/parts/class-part-website-url-dummy.php:9
2
  # This file is distributed under the same license as the HappyForms package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: HappyForms 1.9.7\n"
6
  "Report-Msgid-Bugs-To: https://thethemefoundry.com/support/\n"
7
+ "POT-Creation-Date: 2020-03-27 12:44:28+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
45
  msgid "Edit Form"
46
  msgstr ""
47
 
48
+ #: core/classes/class-form-admin.php:156
49
  #: core/classes/class-form-controller.php:80
50
  msgid "View form"
51
  msgstr ""
52
 
53
+ #: core/classes/class-form-admin.php:161
54
  msgid "Preview form"
55
  msgstr ""
56
 
57
+ #: core/classes/class-form-admin.php:166 core/classes/class-form-admin.php:169
58
  msgid "Form updated."
59
  msgstr ""
60
 
61
+ #: core/classes/class-form-admin.php:167
62
  msgid "Custom field updated."
63
  msgstr ""
64
 
65
+ #: core/classes/class-form-admin.php:168
66
  msgid "Custom field deleted."
67
  msgstr ""
68
 
69
+ #: core/classes/class-form-admin.php:170
70
  msgid "Form restored to revision from %s."
71
  msgstr ""
72
 
73
+ #: core/classes/class-form-admin.php:171
74
  msgid "Form published."
75
  msgstr ""
76
 
77
+ #: core/classes/class-form-admin.php:172
78
  msgid "Form saved."
79
  msgstr ""
80
 
81
+ #: core/classes/class-form-admin.php:173
82
  msgid "Form submitted."
83
  msgstr ""
84
 
85
+ #: core/classes/class-form-admin.php:174
86
  msgid "Form scheduled."
87
  msgstr ""
88
 
89
+ #: core/classes/class-form-admin.php:175
90
  msgid "Form draft updated."
91
  msgstr ""
92
 
93
+ #: core/classes/class-form-admin.php:198
94
  msgid "%s form updated."
95
  msgid_plural "%s forms updated."
96
  msgstr[0] ""
97
  msgstr[1] ""
98
 
99
+ #: core/classes/class-form-admin.php:199
100
  msgid "%s form not updated, somebody is editing it."
101
  msgid_plural "%s forms not updated, somebody is editing them."
102
  msgstr[0] ""
103
  msgstr[1] ""
104
 
105
+ #: core/classes/class-form-admin.php:200
106
  msgid "%s form permanently deleted."
107
  msgid_plural "%s forms permanently deleted."
108
  msgstr[0] ""
109
  msgstr[1] ""
110
 
111
+ #: core/classes/class-form-admin.php:201
112
  msgid "%s form moved to the Trash."
113
  msgid_plural "%s forms moved to the Trash."
114
  msgstr[0] ""
115
  msgstr[1] ""
116
 
117
+ #: core/classes/class-form-admin.php:202
118
  msgid "%s form restored from the Trash."
119
  msgid_plural "%s forms restored from the Trash."
120
  msgstr[0] ""
121
  msgstr[1] ""
122
 
123
+ #: core/classes/class-form-admin.php:245
124
  msgid "Shortcode"
125
  msgstr ""
126
 
127
+ #: core/classes/class-form-admin.php:246
128
  msgid "Author"
129
  msgstr ""
130
 
131
+ #: core/classes/class-form-admin.php:284
132
  msgid "Copy to clipboard"
133
  msgstr ""
134
 
135
+ #: core/classes/class-form-admin.php:338
136
+ msgid "Y/m/d"
137
+ msgstr ""
138
+
139
+ #: core/classes/class-form-admin.php:378
140
  msgid "Edit"
141
  msgstr ""
142
 
143
+ #: core/classes/class-form-admin.php:382
144
  #: core/templates/customize-form-item.php:27
145
  #: core/templates/customize-form-part-footer.php:4
146
  msgid "Duplicate"
147
  msgstr ""
148
 
149
+ #: core/classes/class-form-admin.php:386
150
  msgid "Trash"
151
  msgstr ""
152
 
153
+ #: core/classes/class-form-admin.php:430
154
  msgid "1 form duplicated."
155
  msgstr ""
156
 
157
+ #: core/classes/class-form-admin.php:432
158
  msgid "Undo"
159
  msgstr ""
160
 
313
  msgid "Missing validation callback for field %s"
314
  msgstr ""
315
 
316
+ #: core/classes/class-form-setup.php:56
317
  msgid "Thank you! Your submission has been sent."
318
  msgstr ""
319
 
320
+ #: core/classes/class-form-setup.php:60
321
  msgid "There is a problem! Please review your submission."
322
  msgstr ""
323
 
324
+ #: core/classes/class-form-setup.php:80
325
  msgid "This field is required."
326
  msgstr ""
327
 
328
+ #: core/classes/class-form-setup.php:84
329
  msgid "(optional)"
330
  msgstr ""
331
 
332
+ #: core/classes/class-form-setup.php:88
333
  msgid "Send"
334
  msgstr ""
335
 
336
+ #: core/classes/class-form-setup.php:112
337
  msgid "Validate your submission"
338
  msgstr ""
339
 
340
+ #: core/classes/class-form-setup.php:120
341
  msgid "Review submission"
342
  msgstr ""
343
 
344
+ #: core/classes/class-form-setup.php:168
345
+ msgid "Confirm submission"
346
+ msgstr ""
347
+
348
+ #: core/classes/class-form-setup.php:170 core/classes/class-form-setup.php:188
349
  msgid "Success message"
350
  msgstr ""
351
 
352
+ #: core/classes/class-form-setup.php:171
353
+ msgid "Redirect to web address"
354
+ msgstr ""
355
+
356
+ #: core/classes/class-form-setup.php:174
357
+ msgid "Choose how the form should confirm successful submission."
358
+ msgstr ""
359
+
360
+ #: core/classes/class-form-setup.php:178
361
+ #: core/templates/customize-form-parts-drawer.php:30
362
+ #: inc/classes/class-happyforms.php:245
363
+ #: inc/templates/customize-controls/checkbox_dummy.php:7
364
+ msgid "Upgrade"
365
  msgstr ""
366
 
367
+ #: core/classes/class-form-setup.php:196
368
  msgid "Error message"
369
  msgstr ""
370
 
371
+ #: core/classes/class-form-setup.php:197
372
  msgid ""
373
  "This is the message your users will see when there are form errors "
374
  "preventing submission."
375
  msgstr ""
376
 
377
+ #: core/classes/class-form-setup.php:202
378
  msgid "Optional part label"
379
  msgstr ""
380
 
381
+ #: core/classes/class-form-setup.php:203
382
  msgid ""
383
  "Mark optional parts in your form to let your users distinguish them from "
384
  "required parts."
385
  msgstr ""
386
 
387
+ #: core/classes/class-form-setup.php:208
388
  msgid "Submit button label"
389
  msgstr ""
390
 
391
+ #: core/classes/class-form-setup.php:209
392
  msgid "Change text of submit button to describe an action your form performs."
393
  msgstr ""
394
 
395
+ #: core/classes/class-form-setup.php:214
396
  msgid "Submit button CSS classes"
397
  msgstr ""
398
 
399
+ #: core/classes/class-form-setup.php:215
400
  msgid ""
401
  "Add custom CSS classes separated by space for targeting a button in your "
402
  "stylesheet."
403
  msgstr ""
404
 
405
+ #: core/classes/class-form-setup.php:220
406
  msgid "Use custom HTML ID"
407
  msgstr ""
408
 
409
+ #: core/classes/class-form-setup.php:222
410
  msgid "Add a unique HTML ID to your form. Write without a hash (#) character."
411
  msgstr ""
412
 
413
+ #: core/classes/class-form-setup.php:230
414
  msgid "Form HTML ID"
415
  msgstr ""
416
 
417
+ #: core/classes/class-form-setup.php:238
418
  msgid "Hide form after submit"
419
  msgstr ""
420
 
421
+ #: core/classes/class-form-setup.php:239
422
  msgid ""
423
  "Hide all form parts and display just title and confirmation message on "
424
  "submit."
425
  msgstr ""
426
 
427
+ #: core/classes/class-form-setup.php:244
428
  msgid "Spam prevention"
429
  msgstr ""
430
 
431
+ #: core/classes/class-form-setup.php:245
432
  msgid "Protect your form against bots by using HoneyPot security."
433
  msgstr ""
434
 
705
 
706
  #: core/classes/class-form-styles.php:720
707
  #: core/templates/parts/customize-email.php:30
 
708
  #: core/templates/parts/customize-multi-line-text.php:30
709
  #: core/templates/parts/customize-number.php:30
 
710
  #: core/templates/parts/customize-select.php:28
711
  #: core/templates/parts/customize-single-line-text.php:30
712
  #: inc/classes/parts/class-part-placeholder-dummy.php:8
1018
  msgid "Untitled"
1019
  msgstr ""
1020
 
1021
+ #: core/classes/parts/class-part-checkbox.php:83
1022
+ #: core/templates/parts/frontend-checkbox.php:13
1023
+ msgid "Select all"
1024
+ msgstr ""
1025
+
1026
  #: core/classes/parts/class-part-email.php:8
1027
  #: core/templates/customize-form-steps.php:5
1028
  msgid "Email"
1040
  msgid "For paragraph text fields."
1041
  msgstr ""
1042
 
1043
+ #: core/classes/parts/class-part-multi-line-text.php:69
1044
+ #: core/templates/parts/customize-multi-line-text.php:64
1045
+ msgid "Min characters"
 
 
 
1046
  msgstr ""
1047
 
1048
+ #: core/classes/parts/class-part-multi-line-text.php:73
1049
+ #: core/templates/parts/customize-multi-line-text.php:61
1050
+ msgid "Max words"
 
 
 
1051
  msgstr ""
1052
 
1053
  #: core/classes/parts/class-part-number.php:8
2898
  msgid "Clear Results"
2899
  msgstr ""
2900
 
 
 
 
 
 
 
2901
  #: core/templates/customize-form-parts-drawer.php:39
2902
  msgid "No parts found."
2903
  msgstr ""
2933
  #: core/templates/parts/customize-checkbox.php:4
2934
  #: core/templates/parts/customize-checkbox.php:120
2935
  #: core/templates/parts/customize-email.php:4
 
2936
  #: core/templates/parts/customize-multi-line-text.php:4
2937
  #: core/templates/parts/customize-number.php:4
 
2938
  #: core/templates/parts/customize-radio.php:4
2939
  #: core/templates/parts/customize-radio.php:103
2940
  #: core/templates/parts/customize-select.php:4
3093
 
3094
  #: core/templates/parts/customize-checkbox.php:102
3095
  #: core/templates/parts/customize-email.php:78
3096
+ #: core/templates/parts/customize-multi-line-text.php:82
3097
  #: core/templates/parts/customize-number.php:99
3098
  #: core/templates/parts/customize-radio.php:83
3099
  #: core/templates/parts/customize-select.php:83
3125
  msgid "Reveal on focus"
3126
  msgstr ""
3127
 
3128
+ #: core/templates/parts/customize-email.php:49
3129
+ msgid "Suggest common email domains"
 
 
3130
  msgstr ""
3131
 
3132
  #: core/templates/parts/customize-email.php:54
3133
+ #: core/templates/parts/customize-number.php:74
3134
+ msgid "Require confirmation"
3135
  msgstr ""
3136
 
3137
  #: core/templates/parts/customize-email.php:59
3138
+ #: core/templates/parts/customize-number.php:79
3139
+ msgid "'Confirmation' label"
3140
+ msgstr ""
3141
+
3142
+ #: core/templates/parts/customize-email.php:63
3143
+ #: core/templates/parts/customize-number.php:83
3144
+ msgid "'Confirmation' placeholder"
3145
+ msgstr ""
3146
+
3147
+ #: core/templates/parts/customize-email.php:69
3148
+ #: core/templates/parts/customize-number.php:92
3149
+ #: core/templates/parts/customize-single-line-text.php:53
3150
+ msgid "Suffix"
3151
  msgstr ""
3152
 
3153
  #: core/templates/parts/customize-multi-line-text.php:49
3155
  msgstr ""
3156
 
3157
  #: core/templates/parts/customize-multi-line-text.php:55
3158
+ msgid "Limit"
3159
  msgstr ""
3160
 
3161
  #: core/templates/parts/customize-multi-line-text.php:59
3162
+ msgid "Count"
3163
  msgstr ""
3164
 
3165
+ #: core/templates/parts/customize-multi-line-text.php:62
3166
+ msgid "Min words"
3167
  msgstr ""
3168
 
3169
+ #: core/templates/parts/customize-multi-line-text.php:63
3170
+ msgid "Max characters"
3171
  msgstr ""
3172
 
3173
+ #: core/templates/parts/customize-multi-line-text.php:68
3174
+ msgid "'Characters' label"
3175
+ msgstr ""
3176
+
3177
+ #: core/templates/parts/customize-multi-line-text.php:72
3178
+ msgid "'Words' label"
3179
  msgstr ""
3180
 
3181
  #: core/templates/parts/customize-number.php:38
3182
+ msgid "Min number"
3183
  msgstr ""
3184
 
3185
  #: core/templates/parts/customize-number.php:42
3186
+ msgid "Max number"
3187
  msgstr ""
3188
 
3189
  #: core/templates/parts/customize-number.php:59
3198
  msgid "Decimal"
3199
  msgstr ""
3200
 
3201
+ #: core/templates/parts/customize-number.php:88
3202
  #: core/templates/parts/customize-single-line-text.php:48
3203
  msgid "Prefix"
3204
  msgstr ""
3211
  msgid "'No results' label"
3212
  msgstr ""
3213
 
 
 
 
 
3214
  #: core/templates/preview-form-pencil.php:3
3215
  msgid "Click to edit this part."
3216
  msgstr ""
3217
 
3218
  #: inc/classes/class-happyforms.php:82
3219
+ msgid "Use theme styles"
3220
  msgstr ""
3221
 
3222
  #: inc/classes/class-happyforms.php:83
3223
+ msgid "Inherit theme default styles instead of using HappyForms styles."
 
 
3224
  msgstr ""
3225
 
3226
  #: inc/classes/class-happyforms.php:89
3227
+ msgid "Shuffle parts"
3228
  msgstr ""
3229
 
3230
  #: inc/classes/class-happyforms.php:90
3231
+ msgid "Shuffle the order of all form parts to avoid biases in your responses."
3232
  msgstr ""
3233
 
3234
  #: inc/classes/class-happyforms.php:96
3235
+ msgid "Use reCAPTCHA"
3236
  msgstr ""
3237
 
3238
  #: inc/classes/class-happyforms.php:97
3239
+ msgid "Protect your form against bots using your Google ReCaptcha credentials."
3240
  msgstr ""
3241
 
3242
  #: inc/classes/class-happyforms.php:103
3243
+ msgid "Require password"
3244
  msgstr ""
3245
 
3246
  #: inc/classes/class-happyforms.php:104
3247
+ msgid "Only users with password will be able to view and submit the form."
3248
  msgstr ""
3249
 
3250
  #: inc/classes/class-happyforms.php:110
3251
+ msgid "Open in overlay window"
3252
  msgstr ""
3253
 
3254
  #: inc/classes/class-happyforms.php:111
3255
+ msgid "Generate a link that can be clicked to open an overlay window for this form."
3256
  msgstr ""
3257
 
3258
  #: inc/classes/class-happyforms.php:117
3259
+ msgid "Save user's meta data"
3260
  msgstr ""
3261
 
3262
  #: inc/classes/class-happyforms.php:118
3263
+ msgid ""
3264
+ "User meta data like IP address, browser language, local time, and platform "
3265
+ "will be saved with each submission when checked."
3266
  msgstr ""
3267
 
3268
  #: inc/classes/class-happyforms.php:124
3269
+ msgid "Save abandoned submissions"
3270
  msgstr ""
3271
 
3272
  #: inc/classes/class-happyforms.php:125
3274
  msgstr ""
3275
 
3276
  #: inc/classes/class-happyforms.php:131
3277
+ msgid "Save and resume submissions"
3278
  msgstr ""
3279
 
3280
  #: inc/classes/class-happyforms.php:132
3281
+ msgid ""
3282
+ "Let users temporarily save their incomplete response and continue filling "
3283
+ "out the form at a later time."
3284
  msgstr ""
3285
 
3286
  #: inc/classes/class-happyforms.php:138
3287
+ msgid "Use Mailchimp"
3288
  msgstr ""
3289
 
3290
  #: inc/classes/class-happyforms.php:139
3291
+ msgid "Set which Mailchimp lists, groups and tags you want to use."
3292
  msgstr ""
3293
 
3294
  #: inc/classes/class-happyforms.php:145
3295
+ msgid "Add identifier to each submission"
3296
  msgstr ""
3297
 
3298
  #: inc/classes/class-happyforms.php:146
3299
+ msgid "Tag responses with a unique, incremental identifier."
3300
+ msgstr ""
3301
+
3302
+ #: inc/classes/class-happyforms.php:152
3303
+ msgid "Preview values before submit"
3304
+ msgstr ""
3305
+
3306
+ #: inc/classes/class-happyforms.php:153
3307
+ msgid "Let your users review their submission before confirming it."
3308
+ msgstr ""
3309
+
3310
+ #: inc/classes/class-happyforms.php:159
3311
+ msgid "Fade submit button until valid"
3312
+ msgstr ""
3313
+
3314
+ #: inc/classes/class-happyforms.php:160
3315
  msgid ""
3316
  "Reduce the opacity of the submit button until all required form parts are "
3317
  "valid."
3318
  msgstr ""
3319
 
3320
+ #: inc/classes/class-happyforms.php:166
3321
  msgid "Limit submissions"
3322
  msgstr ""
3323
 
3324
+ #: inc/classes/class-happyforms.php:167
3325
  msgid "Set limit on number of allowed form submission in general or per user."
3326
  msgstr ""
3327
 
3328
+ #: inc/classes/class-happyforms.php:173
3329
  msgid "Schedule visibility"
3330
  msgstr ""
3331
 
3332
+ #: inc/classes/class-happyforms.php:174
3333
  msgid ""
3334
  "Show or hide this form during a chosen time and day. Go to Settings > "
3335
  "Timezone to set your city offset."
3336
  msgstr ""
3337
 
3338
+ #: inc/classes/class-happyforms.php:184
3339
  msgid "Include mark and reply link"
3340
  msgstr ""
3341
 
3342
+ #: inc/classes/class-happyforms.php:185
3343
  msgid "Reply to your users and mark their submission as read in one click."
3344
  msgstr ""
3345
 
3346
+ #: inc/classes/class-happyforms.php:191
3347
  msgid "Link to attachments in email"
3348
  msgstr ""
3349
 
3350
+ #: inc/classes/class-happyforms.php:192
3351
  msgid "Show attachments as links instead of a simple counter."
3352
  msgstr ""
3353
 
3354
+ #: inc/classes/class-happyforms.php:198
3355
  msgid "Hide Placeholder parts in email"
3356
  msgstr ""
3357
 
3358
+ #: inc/classes/class-happyforms.php:204
3359
  msgid "Include referral link"
3360
  msgstr ""
3361
 
3362
+ #: inc/classes/class-happyforms.php:205
3363
  msgid "Include the page link your form was submitted from."
3364
  msgstr ""
3365
 
3366
+ #: inc/classes/class-happyforms.php:211
3367
  msgid "Attach PDF to confirmation email"
3368
  msgstr ""
3369
 
3370
+ #: inc/classes/class-happyforms.php:212
3371
  msgid "Attach a PDF to the recipient's confirmation email."
3372
  msgstr ""
3373
 
3374
+ #: inc/classes/class-happyforms.php:218
3375
  msgid "Send abandonment email"
3376
  msgstr ""
3377
 
3378
+ #: inc/classes/class-happyforms.php:219
3379
  msgid "Notify users when they abandon your form before submitting it."
3380
  msgstr ""
3381
 
3382
+ #: inc/classes/class-happyforms.php:244
3383
  msgid "HappyForms Upgrade"
3384
  msgstr ""
3385
 
3386
+ #: inc/classes/class-happyforms.php:369
3387
  msgid ""
3388
  "<p>Can we ask a favor?</p><p>You created your first form %s days ago — how "
3389
  "time flies! Since then, we’ve answered hundreds of community emails and "
3526
  msgstr ""
3527
 
3528
  #: inc/classes/parts/class-part-website-url-dummy.php:8
3529
+ msgid "Web Address"
3530
  msgstr ""
3531
 
3532
  #: inc/classes/parts/class-part-website-url-dummy.php:9
readme.txt CHANGED
@@ -3,9 +3,9 @@
3
  Contributors: thethemefoundry
4
  Tags: contact, contact form, email, feedback form, form, form builder, custom form, lead generation, survey form, quote form
5
  Requires at least: 4.8
6
- Tested up to: 5.3
7
  Requires PHP: 5.3
8
- Stable tag: 1.9.6
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -97,6 +97,12 @@ Yep! HappyForms free isn't going anywhere but for those looking for even more yo
97
 
98
  == Changelog ==
99
 
 
 
 
 
 
 
100
  = 1.9.6 =
101
  * Improvement: When searching for specific choice in Dropdown part, a configurable "No results" message is shown if no choice is found.
102
  * Improvement: Custom HTML ID of the form using "Form HTML ID" control can now be toggled by checking "Use custom HTML ID" control.
@@ -587,6 +593,9 @@ Yep! HappyForms free isn't going anywhere but for those looking for even more yo
587
 
588
  == Upgrade Notice ==
589
 
 
 
 
590
  = 1.9.6 =
591
  * Miscellaneous improvements and bugfixes.
592
 
3
  Contributors: thethemefoundry
4
  Tags: contact, contact form, email, feedback form, form, form builder, custom form, lead generation, survey form, quote form
5
  Requires at least: 4.8
6
+ Tested up to: 5.4
7
  Requires PHP: 5.3
8
+ Stable tag: 1.9.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
97
 
98
  == Changelog ==
99
 
100
+ = 1.9.7 =
101
+ Improvement: New “Confirm submission” control in Setup step.
102
+ Improvement: Various improvements to HappyForms UI.
103
+ Improvement: Compatibility with WordPress 5.4.
104
+ Bugfix: Form width slider in Style tab → General was not updating value in preview.
105
+
106
  = 1.9.6 =
107
  * Improvement: When searching for specific choice in Dropdown part, a configurable "No results" message is shown if no choice is found.
108
  * Improvement: Custom HTML ID of the form using "Form HTML ID" control can now be toggled by checking "Use custom HTML ID" control.
593
 
594
  == Upgrade Notice ==
595
 
596
+ = 1.9.7 =
597
+ * Compatibility with WordPress 5.4, improvements and bug fixes.
598
+
599
  = 1.9.6 =
600
  * Miscellaneous improvements and bugfixes.
601