Strong Testimonials - Version 2.31.5

Version Description

  • June 1, 2018 =
  • Fix XSS vulnerablilities reported by DefenseCode using Thunderscan.
  • Add spinner UI element while form is being submitted to deter visitor from navigating away.
  • Minor admin UI improvements.
Download this release

Release Info

Developer cdillon27
Plugin Icon 128x128 Strong Testimonials
Version 2.31.5
Comparing to
See all releases

Code changes from version 2.31.4 to 2.31.5

admin/about/class-strong-testimonials-about.php CHANGED
@@ -63,7 +63,7 @@ class Strong_Testimonials_About {
63
  <p class="about-text">
64
  <?php _e( 'Thank you for updating to the latest version!' ); ?>
65
  <?php /* translators: %s is the plugin version number */ ?>
66
- <?php printf( 'Strong Testimonials %s includes a shortcode for your average rating and improves compatibility with lazy loading images.', $major_minor ); ?>
67
  </p>
68
 
69
  <div class="wp-badge strong-testimonials"><?php printf( __( 'Version %s' ), $major_minor ); ?></div>
63
  <p class="about-text">
64
  <?php _e( 'Thank you for updating to the latest version!' ); ?>
65
  <?php /* translators: %s is the plugin version number */ ?>
66
+ <?php printf( 'Strong Testimonials %s fixes minor security vulnerabilities, adds a shortcode for your average rating and has more compatibility options.', $major_minor ); ?>
67
  </p>
68
 
69
  <div class="wp-badge strong-testimonials"><?php printf( __( 'Version %s' ), $major_minor ); ?></div>
admin/about/whats-new.php CHANGED
@@ -14,13 +14,14 @@
14
 
15
  <h3 class="heading">Point Releases</h3>
16
 
17
- <p>Bug fixes and improved compatibility. <a href="https://wordpress.org/plugins/strong-testimonials/#developers" target="_blank">Read changelog on wordpress.org</a>.</p>
18
 
19
  <ul>
20
  <li>Version 2.31.1</li>
21
  <li>Version 2.31.2</li>
22
  <li>Version 2.31.3</li>
23
  <li>Version 2.31.4</li>
 
24
  </ul>
25
 
26
  </div>
14
 
15
  <h3 class="heading">Point Releases</h3>
16
 
17
+ <p>Security fixes, bug fixes and improved compatibility. <a href="https://wordpress.org/plugins/strong-testimonials/#developers" target="_blank">Read changelog on wordpress.org</a>.</p>
18
 
19
  <ul>
20
  <li>Version 2.31.1</li>
21
  <li>Version 2.31.2</li>
22
  <li>Version 2.31.3</li>
23
  <li>Version 2.31.4</li>
24
+ <li>Version 2.31.5</li>
25
  </ul>
26
 
27
  </div>
admin/css/views.css CHANGED
@@ -782,7 +782,7 @@ ul.radio-list.template-list li {
782
  border-color: #444; }
783
  .fields .field3 {
784
  flex: 20; }
785
- .fields span.link {
786
  display: inline-block;
787
  cursor: pointer;
788
  padding: 10px 10px 8px;
782
  border-color: #444; }
783
  .fields .field3 {
784
  flex: 20; }
785
+ .fields div.link {
786
  display: inline-block;
787
  cursor: pointer;
788
  padding: 10px 10px 8px;
admin/js/views.js CHANGED
@@ -101,10 +101,26 @@ Array.max = function (array) {
101
  }(jQuery));
102
 
103
  /**
104
- * Masonry in the Layout section.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  */
106
  jQuery(document).ready(function ($) {
107
- // Masonry
 
108
  $('.view-layout-masonry .example-container')
109
  .find('.box')
110
  .width(jQuery('.grid-sizer').width())
@@ -113,6 +129,8 @@ jQuery(document).ready(function ($) {
113
 
114
  // Category select width
115
  $.fn.afterToggle();
 
 
116
  });
117
 
118
  (function ($) {
@@ -189,7 +207,7 @@ jQuery(document).ready(function ($) {
189
  * Restore defaults
190
  */
191
  // TODO i18n
192
- $('#restore-defaults').click(function () {
193
  return confirm('Restore the default settings?');
194
  });
195
 
101
  }(jQuery));
102
 
103
  /**
104
+ * Remove 'result' query argument.
105
+ */
106
+ removeResultArg = function () {
107
+ var urlParams = new URLSearchParams(window.location.search);
108
+ if (urlParams.has('result')) {
109
+ urlParams.delete('result');
110
+ var newURL = window.location.pathname;
111
+ if (urlParams.toString()) {
112
+ newURL = newURL + '?' + urlParams.toString();
113
+ }
114
+ window.history.replaceState({}, document.title, newURL);
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Initial actions on document.ready
120
  */
121
  jQuery(document).ready(function ($) {
122
+
123
+ // Masonry in the Layout section
124
  $('.view-layout-masonry .example-container')
125
  .find('.box')
126
  .width(jQuery('.grid-sizer').width())
129
 
130
  // Category select width
131
  $.fn.afterToggle();
132
+
133
+ removeResultArg();
134
  });
135
 
136
  (function ($) {
207
  * Restore defaults
208
  */
209
  // TODO i18n
210
+ $('#restore-defaults').on('click', function () {
211
  return confirm('Restore the default settings?');
212
  });
213
 
admin/partials/views/group-compat.php CHANGED
@@ -1,5 +1,12 @@
1
- <div class="then <?php echo apply_filters( 'wpmtst_view_section', '', 'compat' ); ?>" style="display: none;">
 
 
 
 
 
 
2
  <h3>
 
3
  <?php _e( 'Compatibility', 'strong-testimonials' ); ?>
4
  </h3>
5
  <table class="form-table multiple group-general">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ apply_filters( 'wpmtst_view_section', '', 'compat' ),
5
+ );
6
+ ?>
7
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
8
  <h3>
9
+ <?php /* translators: On the Views admin screen. */ ?>
10
  <?php _e( 'Compatibility', 'strong-testimonials' ); ?>
11
  </h3>
12
  <table class="form-table multiple group-general">
admin/partials/views/group-extra.php CHANGED
@@ -1,6 +1,16 @@
1
- <?php /* translators: On the Views admin screen. */ ?>
2
- <div class="then then_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'extra' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Extra', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-layout">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_display',
5
+ 'then_not_form',
6
+ 'then_slideshow',
7
+ 'then_not_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'extra' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: On the Views admin screen. */ ?>
14
  <?php _e( 'Extra', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-layout">
admin/partials/views/group-fields.php CHANGED
@@ -1,20 +1,75 @@
1
- <?php /* translators: On the Views admin screen. */ ?>
2
- <div class="then then_display then_not_form then_slideshow then_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'fields' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Fields', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-show">
7
- <tr class="then then_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'title' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
 
 
8
  <?php include( 'option-title.php' ); ?>
9
  </tr>
10
- <tr class="then then_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'thumbnail' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
 
 
11
  <?php include( 'option-thumbnail.php' ); ?>
12
  </tr>
13
- <tr class="then then_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'content' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
 
 
14
  <?php include( 'option-content.php' ); ?>
15
  </tr>
16
- <tr class="then then_display then_not_form then_slideshow then_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'client-section' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
 
 
17
  <?php include( 'option-client-section.php' ); ?>
18
  </tr>
 
19
  </table>
20
  </div>
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_display',
5
+ 'then_not_form',
6
+ 'then_slideshow',
7
+ 'then_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'fields' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: On the Views admin screen. */ ?>
14
  <?php _e( 'Fields', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-show">
17
+
18
+ <?php
19
+ $then_classes = array(
20
+ 'then',
21
+ 'then_display',
22
+ 'then_not_form',
23
+ 'then_slideshow',
24
+ 'then_not_single_template',
25
+ apply_filters( 'wpmtst_view_section', '', 'title' ),
26
+ );
27
+ ?>
28
+ <tr class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
29
  <?php include( 'option-title.php' ); ?>
30
  </tr>
31
+
32
+ <?php
33
+ $then_classes = array(
34
+ 'then',
35
+ 'then_display',
36
+ 'then_not_form',
37
+ 'then_slideshow',
38
+ 'then_not_single_template',
39
+ apply_filters( 'wpmtst_view_section', '', 'thumbnail' ),
40
+ );
41
+ ?>
42
+ <tr class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
43
  <?php include( 'option-thumbnail.php' ); ?>
44
  </tr>
45
+
46
+ <?php
47
+ $then_classes = array(
48
+ 'then',
49
+ 'then_display',
50
+ 'then_not_form',
51
+ 'then_slideshow',
52
+ 'then_not_single_template',
53
+ apply_filters( 'wpmtst_view_section', '', 'content' ),
54
+ );
55
+ ?>
56
+ <tr class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
57
  <?php include( 'option-content.php' ); ?>
58
  </tr>
59
+
60
+ <?php
61
+ $then_classes = array(
62
+ 'then',
63
+ 'then_display',
64
+ 'then_not_form',
65
+ 'then_slideshow',
66
+ 'then_single_template',
67
+ apply_filters( 'wpmtst_view_section', '', 'client-section' ),
68
+ );
69
+ ?>
70
+ <tr class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
71
  <?php include( 'option-client-section.php' ); ?>
72
  </tr>
73
+
74
  </table>
75
  </div>
admin/partials/views/group-form.php CHANGED
@@ -1,6 +1,16 @@
1
- <?php /* translators: On the Views admin screen. */ ?>
2
- <div class="then then_not_display then_not_slideshow then_form then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'form' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Actions', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-select">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_not_display',
5
+ 'then_not_slideshow',
6
+ 'then_form',
7
+ 'then_not_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'form' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: On the Views admin screen. */ ?>
14
  <?php _e( 'Actions', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-select">
admin/partials/views/group-query.php CHANGED
@@ -1,13 +1,30 @@
1
- <?php /* translators: On the Views admin screen. */ ?>
2
- <div class="then then_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'select' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Query', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-select">
7
  <tr class="subheading">
8
- <td>Option</td>
9
- <td>Setting</td>
10
- <td class="divider" colspan="2">or Shortcode Attribute <span class="help-links"><span class="description"><a href="#tab-panel-wpmtst-help-shortcode" class="open-help-tab"><?php _e( 'Help' ); ?></a></span></span></td>
 
 
 
 
 
 
 
11
  <td>Example</td>
12
  </tr>
13
  <tr class="then then_display then_not_slideshow then_not_form" style="display: none;">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_display',
5
+ 'then_not_form',
6
+ 'then_slideshow',
7
+ 'then_not_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'select' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: On the Views admin screen. */ ?>
14
  <?php _e( 'Query', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-select">
17
  <tr class="subheading">
18
+ <td><?php _e( 'Option', 'strong-testimonials' ); ?></td>
19
+ <td><?php _e( 'Setting', 'strong-testimonials' ); ?></td>
20
+ <td class="divider" colspan="2">
21
+ <?php _e( 'or Shortcode Attribute', 'strong-testimonials' ); ?>
22
+ <span class="help-links">
23
+ <span class="description">
24
+ <a href="#tab-panel-wpmtst-help-shortcode" class="open-help-tab"><?php _e( 'Help' ); ?></a>
25
+ </span>
26
+ </span>
27
+ </td>
28
  <td>Example</td>
29
  </tr>
30
  <tr class="then then_display then_not_slideshow then_not_form" style="display: none;">
admin/partials/views/group-slideshow.php CHANGED
@@ -1,6 +1,16 @@
1
- <?php /* translators: In the view editor. */ ?>
2
- <div class="then then_not_display then_not_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'slideshow' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Slideshow', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-select">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_not_display',
5
+ 'then_not_form',
6
+ 'then_slideshow',
7
+ 'then_not_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'slideshow' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: In the view editor. */ ?>
14
  <?php _e( 'Slideshow', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-select">
admin/partials/views/group-style.php CHANGED
@@ -1,6 +1,16 @@
1
- <?php /* translators: On the Views admin screen. */ ?>
2
- <div class="then then_display then_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'style' ); ?>" style="display: none;">
 
 
 
 
 
 
 
 
 
3
  <h3>
 
4
  <?php _e( 'Style', 'strong-testimonials' ); ?>
5
  </h3>
6
  <table class="form-table multiple group-style">
1
+ <?php
2
+ $then_classes = array(
3
+ 'then',
4
+ 'then_display',
5
+ 'then_form',
6
+ 'then_slideshow',
7
+ 'then_not_single_template',
8
+ apply_filters( 'wpmtst_view_section', '', 'style' ),
9
+ );
10
+ ?>
11
+ <div class="<?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>" style="display: none;">
12
  <h3>
13
+ <?php /* translators: On the Views admin screen. */ ?>
14
  <?php _e( 'Style', 'strong-testimonials' ); ?>
15
  </h3>
16
  <table class="form-table multiple group-style">
admin/partials/views/view-mode.php CHANGED
@@ -6,8 +6,8 @@
6
  <div class="mode-list">
7
  <?php foreach ( $view_options['mode'] as $mode ) : ?>
8
  <label>
9
- <input id="<?php echo $mode['name']; ?>" type="radio" name="view[data][mode]"
10
- value="<?php echo $mode['name']; ?>" <?php checked( $view['mode'], $mode['name'] ); ?>>
11
  <?php echo $mode['label']; ?>
12
  <div class="mode-line"></div>
13
  </label>
6
  <div class="mode-list">
7
  <?php foreach ( $view_options['mode'] as $mode ) : ?>
8
  <label>
9
+ <input id="<?php echo esc_attr( $mode['name'] ); ?>" type="radio" name="view[data][mode]"
10
+ value="<?php echo esc_attr( $mode['name'] ); ?>" <?php checked( $view['mode'], $mode['name'] ); ?>>
11
  <?php echo $mode['label']; ?>
12
  <div class="mode-line"></div>
13
  </label>
admin/partials/views/view-shortcode.php CHANGED
@@ -2,16 +2,25 @@
2
  // avoiding the tab character before the shortcode for better copy-n-paste
3
  if ( 'edit' == $action ) {
4
  $shortcode = '<div class="saved">';
5
- $shortcode .= '<input id="view-shortcode" type="text" value="[testimonial_view id=&quot;' . $view_id . '&quot;]" readonly />';
6
- $shortcode .= '<input id="copy-shortcode" class="button small" type="button" value="' . __( 'copy to clipboard', 'strong-testimonials' ) . '" data-copytarget="#view-shortcode" />';
7
  $shortcode .= '<span id="copy-message">copied</span>';
8
  $shortcode .= '</div>';
9
  } else {
10
  $shortcode = '<div class="unsaved">' . _x( 'will be available after you save this', 'The shortcode for a new View.', 'strong-testimonials' ) . '</div>';
11
  }
 
 
 
 
 
 
 
 
 
12
  ?>
13
 
14
- <div class="table-row form-view-shortcode then then_display then_form then_slideshow then_not_single_template <?php echo apply_filters( 'wpmtst_view_section', '', 'shortcode' ); ?>">
15
  <div class="table-cell">
16
  <label for="view-shortcode">
17
  <?php _e( 'Shortcode', 'strong-testimonials' ); ?>
2
  // avoiding the tab character before the shortcode for better copy-n-paste
3
  if ( 'edit' == $action ) {
4
  $shortcode = '<div class="saved">';
5
+ $shortcode .= '<input id="view-shortcode" type="text" value="[testimonial_view id=&quot;' . esc_attr( $view_id ) . '&quot;]" readonly />';
6
+ $shortcode .= '<input id="copy-shortcode" class="button small" type="button" value="' . esc_attr__( 'copy to clipboard', 'strong-testimonials' ) . '" data-copytarget="#view-shortcode" />';
7
  $shortcode .= '<span id="copy-message">copied</span>';
8
  $shortcode .= '</div>';
9
  } else {
10
  $shortcode = '<div class="unsaved">' . _x( 'will be available after you save this', 'The shortcode for a new View.', 'strong-testimonials' ) . '</div>';
11
  }
12
+
13
+ $then_classes = array(
14
+ 'then',
15
+ 'then_display',
16
+ 'then_form',
17
+ 'then_slideshow',
18
+ 'then_not_single_template',
19
+ apply_filters( 'wpmtst_view_section', '', 'shortcode' ),
20
+ );
21
  ?>
22
 
23
+ <div class="table-row form-view-shortcode <?php echo esc_attr( join( array_filter( $then_classes ), ' ' ) ); ?>">
24
  <div class="table-cell">
25
  <label for="view-shortcode">
26
  <?php _e( 'Shortcode', 'strong-testimonials' ); ?>
admin/scss/_partials/_custom-fields.scss CHANGED
@@ -22,7 +22,7 @@
22
  flex: 20;
23
  }
24
 
25
- span.link {
26
  display: inline-block;
27
  cursor: pointer;
28
  padding: 10px 10px 8px;
22
  flex: 20;
23
  }
24
 
25
+ div.link {
26
  display: inline-block;
27
  cursor: pointer;
28
  padding: 10px 10px 8px;
admin/settings/class-strong-testimonials-settings-compat.php CHANGED
@@ -98,12 +98,15 @@ class Strong_Testimonials_Settings_Compat {
98
 
99
  $input['lazyload']['enabled'] = wpmtst_sanitize_checkbox( $input['lazyload'], 'enabled' );
100
  // may be multiple pairs
101
- foreach ( $input['lazyload']['classes'] as $key => $classes ) {
102
- if ( $classes['start'] || $classes['finish'] ) {
103
- $input['lazyload']['classes'][ $key ]['start'] = str_replace( '.', '', sanitize_text_field( $classes['start'] ) );
104
- $input['lazyload']['classes'][ $key ]['finish'] = str_replace( '.', '', sanitize_text_field( $classes['finish'] ) );
105
- } else {
106
- unset( $input['lazyload']['classes'][ $key ] );
 
 
 
107
  }
108
  }
109
 
@@ -847,8 +850,10 @@ class Strong_Testimonials_Settings_Compat {
847
  </div>
848
  <div class="lazyload-pairs">
849
  <?php
850
- foreach ( $this->options['lazyload']['classes'] as $key => $pair ) {
851
- $this->settings_page_lazyload_class_inputs( $key, $pair );
 
 
852
  }
853
  ?>
854
  <div class="pair-actions">
98
 
99
  $input['lazyload']['enabled'] = wpmtst_sanitize_checkbox( $input['lazyload'], 'enabled' );
100
  // may be multiple pairs
101
+ if ( isset( $input['lazyload']['classes'] ) ) {
102
+ foreach ( $input['lazyload']['classes'] as $key => $classes ) {
103
+ if ( $classes['start'] || $classes['finish'] ) {
104
+ $input['lazyload']['classes'][ $key ]['start'] = str_replace( '.', '', sanitize_text_field( $classes['start'] ) );
105
+ $input['lazyload']['classes'][ $key ]['finish'] = str_replace( '.', '', sanitize_text_field( $classes['finish'] ) );
106
+ }
107
+ else {
108
+ unset( $input['lazyload']['classes'][ $key ] );
109
+ }
110
  }
111
  }
112
 
850
  </div>
851
  <div class="lazyload-pairs">
852
  <?php
853
+ if ( isset( $this->options['lazyload']['classes'] ) ) {
854
+ foreach ( $this->options['lazyload']['classes'] as $key => $pair ) {
855
+ $this->settings_page_lazyload_class_inputs( $key, $pair );
856
+ }
857
  }
858
  ?>
859
  <div class="pair-actions">
admin/views-validate.php CHANGED
@@ -13,10 +13,10 @@
13
  function wpmtst_validate_view_name( $name, $view_id ){
14
  if ( '' == $name ) {
15
  $name = "Testimonial View $view_id";
16
- }
17
- else {
18
  $name = sanitize_text_field( stripslashes( $name ) );
19
  }
 
20
  return $name;
21
  }
22
 
13
  function wpmtst_validate_view_name( $name, $view_id ){
14
  if ( '' == $name ) {
15
  $name = "Testimonial View $view_id";
16
+ }else {
 
17
  $name = sanitize_text_field( stripslashes( $name ) );
18
  }
19
+
20
  return $name;
21
  }
22
 
admin/views.php CHANGED
@@ -16,46 +16,50 @@ function wpmtst_views_admin() {
16
  if ( ! current_user_can( 'strong_testimonials_views' ) )
17
  wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
18
 
 
 
 
 
 
 
 
19
  ?>
20
  <div class="wrap wpmtst2">
21
 
22
  <?php
23
- if ( isset( $_REQUEST['cancelled'] ) ) {
24
- $message = __( 'Changes cancelled.', 'strong-testimonials' );
25
- } elseif ( isset( $_REQUEST['defaults-restored'] ) ) {
26
- $message = __( 'Defaults restored.', 'strong-testimonials' );
27
- } elseif ( isset( $_REQUEST['view-saved'] ) ) {
28
- $message = __( 'View saved.', 'strong-testimonials' );
29
- } elseif( isset( $_REQUEST['view-deleted'] ) ) {
30
- $message = __( 'View deleted.', 'strong-testimonials' );
31
- } else {
32
- $message = '';
33
- }
 
 
 
34
 
35
- if ( $message ) {
36
- printf( '<div class="notice is-dismissible updated"><p>%s</p></div>', $message );
37
  }
38
 
39
  if ( isset( $_REQUEST['error'] ) ) {
40
 
41
  echo '<h1>' . __( 'Edit View', 'strong-testimonials' ) . '</h1>';
42
- $message = __( 'An error occurred.', 'strong-testimonials' ) . ' ' . sprintf( __( 'Please <a href="%s" target="_blank">open a support ticket</a>.', 'strong-testimonials' ), esc_url( 'https://support.strongplugins.com/new-ticket/' ) );
43
- wp_die( sprintf( '<div class="error strong-view-error"><p>%s</p></div>', $message ) );
44
 
45
- } elseif ( isset( $_REQUEST['action'] ) ) {
46
 
47
- if ( 'edit' == $_REQUEST['action'] && isset( $_REQUEST['id'] ) ) {
48
- wpmtst_view_settings( $_REQUEST['action'], $_REQUEST['id'] );
49
- }
50
- elseif ( 'duplicate' == $_REQUEST['action'] && isset( $_REQUEST['id'] ) ) {
51
- wpmtst_view_settings( $_REQUEST['action'], $_REQUEST['id'] );
52
- }
53
- elseif ( 'add' == $_REQUEST['action'] ) {
54
- wpmtst_view_settings( $_REQUEST['action'] );
55
- }
56
- else {
57
- echo '<p>' . __( 'Invalid request. Please try again.', 'strong-testimonials' ) . '</p>';
58
- }
59
 
60
  } else {
61
 
@@ -105,6 +109,11 @@ function wpmtst_views_admin() {
105
  */
106
  function wpmtst_view_settings( $action = '', $view_id = null ) {
107
 
 
 
 
 
 
108
  if ( ( 'edit' == $action || 'duplicate' == $action ) && ! $view_id ) return;
109
 
110
  global $view;
@@ -163,9 +172,9 @@ function wpmtst_view_settings( $action = '', $view_id = null ) {
163
  $view['pagination_settings']['per_page'] = 5;
164
  }
165
 
166
- $custom_list = apply_filters( 'wpmtst_custom_pages_list', array(), $view );
167
- $pages_list = apply_filters( 'wpmtst_pages_list', wpmtst_get_pages() );
168
- $posts_list = apply_filters( 'wpmtst_posts_list', wpmtst_get_posts() );
169
 
170
  $view_options = apply_filters( 'wpmtst_view_options', get_option( 'wpmtst_view_options' ) );
171
 
@@ -173,8 +182,7 @@ function wpmtst_view_settings( $action = '', $view_id = null ) {
173
  if ( !$view['template'] ) {
174
  if ( 'form' == $view['mode'] ) {
175
  $view['template'] = 'default-form';
176
- }
177
- else {
178
  $view['template'] = 'default';
179
  }
180
  }
@@ -205,14 +213,14 @@ function wpmtst_view_settings( $action = '', $view_id = null ) {
205
  <?php endif; ?>
206
  </h1>
207
 
208
- <form id="wpmtst-views-form" method="post" action="<?php echo get_admin_url() . 'admin-post.php'; ?>" autocomplete="off">
209
 
210
  <?php wp_nonce_field( 'view_form_submit', 'view_form_nonce', true, true ); ?>
211
 
212
- <input type="hidden" name="action" value="view_<?php echo $action; ?>_form">
213
- <input type="hidden" name="view[id]" value="<?php echo $view_id; ?>">
214
- <input type="hidden" name="view_original_mode" value="<?php echo $view['mode']; ?>">
215
- <input type="hidden" name="view[data][_form_id]" value="<?php echo $view['form_id']; ?>">
216
 
217
  <div class="table view-info">
218
  <?php include( 'partials/views/view-name.php' ); ?>
@@ -271,56 +279,58 @@ function wpmtst_view_edit_form() {
271
 
272
  $goback = wp_get_referer();
273
 
274
- if ( ! empty( $_POST ) && check_admin_referer( 'view_form_submit', 'view_form_nonce' ) ) {
275
-
276
- $view_id = $_POST['view']['id'];
277
- $view_name = wpmtst_validate_view_name( $_POST['view']['name'], $view_id );
 
278
 
279
- if ( isset( $_POST['reset'] ) ) {
 
280
 
281
- // Undo changes
282
- $goback = remove_query_arg( array( 'defaults-restored', 'view-saved' ), $goback );
283
- $goback = add_query_arg( 'cancelled', true, $goback );
284
 
285
- } elseif ( isset( $_POST['restore-defaults'] ) ) {
 
286
 
287
- // Restore defaults
288
- $default_view = wpmtst_get_view_default();
289
 
290
- $view = array(
291
- 'id' => $view_id,
292
- 'name' => $view_name,
293
- 'data' => $default_view
294
- );
295
- $success = wpmtst_save_view( $view ); // num_rows
296
 
297
- if ( $success ) {
298
- $goback = add_query_arg( 'defaults-restored', true, $goback );
299
- } else {
300
- $goback = add_query_arg( 'error', true, $goback );
301
- }
 
302
 
 
 
303
  } else {
 
 
304
 
305
- // Sanitize & validate
306
- $view = array(
307
- 'id' => $view_id,
308
- 'name' => $view_name,
309
- 'data' => wpmtst_sanitize_view( stripslashes_deep( $_POST['view']['data'] ) ),
310
- );
311
- $success = wpmtst_save_view( $view ); // num_rows
312
 
313
- if ( $success ) {
314
- $goback = remove_query_arg( array( 'defaults-restored', 'cancelled' ), $goback );
315
- $goback = add_query_arg( 'view-saved', true, $goback );
316
- } else {
317
- $goback = add_query_arg( 'error', true, $goback );
318
- }
 
319
 
 
 
 
 
320
  }
321
 
322
  } else {
323
- $goback = add_query_arg( 'error', true, $goback );
 
 
324
  }
325
 
326
  wp_redirect( $goback );
@@ -339,48 +349,52 @@ function wpmtst_view_add_form() {
339
 
340
  $goback = wp_get_referer();
341
 
342
- if ( ! empty( $_POST ) && check_admin_referer( 'view_form_submit', 'view_form_nonce' ) ) {
 
 
 
 
343
 
344
- $view_id = 0;
345
- $view_name = wpmtst_validate_view_name( $_POST['view']['name'], $view_id );
346
 
347
- if ( isset( $_POST['restore-defaults'] ) ) {
348
 
349
- // Restore defaults
350
- $default_view = wpmtst_get_view_default();
351
 
352
- $view = array(
353
- 'id' => $view_id,
354
- 'name' => $view_name,
355
- 'data' => $default_view,
356
- );
357
- $success = wpmtst_save_view( $view, 'add' ); // num_rows
358
 
359
- $query_arg = 'defaults-restored';
360
 
361
- } else {
362
 
363
- // Sanitize & validate
364
- $view = array(
365
- 'id' => 0,
366
- 'name' => $view_name,
367
- 'data' => wpmtst_sanitize_view( stripslashes_deep( $_POST['view']['data'] ) ),
368
- );
369
- $success = wpmtst_save_view( $view, 'add' ); // new id
370
 
371
- $query_arg = 'view-saved';
372
 
373
- }
374
 
375
- $goback = remove_query_arg( array( 'action', 'defaults-restored', 'cancelled' ), $goback );
376
- if ( $success ) {
377
- $goback = add_query_arg( array( 'action' => 'edit', 'id' => $success, $query_arg => true ), $goback );
378
- } else {
379
- $goback = add_query_arg( 'error', true, $goback );
380
- }
381
 
 
 
 
 
382
  } else {
383
- $goback = add_query_arg( 'error', true, $goback );
384
  }
385
 
386
  wp_redirect( $goback );
@@ -507,7 +521,7 @@ function wpmtst_view_field_inputs( $key, $field, $adding = false ) {
507
 
508
  <div class="field3" data-key="<?php echo $key; ?>">
509
 
510
- <span class="link" title="<?php _e( 'click to open or close', 'strong-testimonials' ); ?>">
511
 
512
  <a href="#" class="field-description <?php echo $label_class; ?>"><?php echo $field_label; ?></a>
513
 
@@ -523,7 +537,7 @@ function wpmtst_view_field_inputs( $key, $field, $adding = false ) {
523
  title="<?php _e( 'click to open or close', 'strong-testimonials' ); ?>"></span>
524
  </div>
525
 
526
- </span>
527
 
528
  <div class="field-properties" style="display: none;">
529
 
@@ -734,15 +748,14 @@ function wpmtst_delete_view( $id ) {
734
  */
735
  function wpmtst_action_delete_view() {
736
  if ( isset( $_REQUEST['action'] ) && 'delete-strong-view' == $_REQUEST['action'] && isset( $_REQUEST['id'] ) ) {
737
- $id = (int) $_GET['id'];
738
  check_admin_referer( 'delete-strong-view_' . $id );
739
  wpmtst_delete_view( $id );
740
- $goback = add_query_arg( 'view-deleted', true, wp_get_referer() );
741
  wp_redirect( $goback );
742
  exit;
743
  }
744
  }
745
-
746
  add_action( 'admin_action_delete-strong-view', 'wpmtst_action_delete_view' );
747
 
748
 
@@ -808,7 +821,7 @@ function wpmtst_form_category_checklist( $view_cats_array ) {
808
  * @since 2.22.0
809
  */
810
  function wpmtst_save_view_sticky() {
811
- $id = $_REQUEST['id'];
812
  $stickies = get_option( 'wpmtst_sticky_views', array() );
813
  if ( in_array( $id, $stickies ) ) {
814
  $stickies = array_diff( $stickies, array( $id ) );
16
  if ( ! current_user_can( 'strong_testimonials_views' ) )
17
  wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
18
 
19
+ $tags = array(
20
+ 'a' => array(
21
+ 'href' => array(),
22
+ 'target' => array(),
23
+ ),
24
+ );
25
+
26
  ?>
27
  <div class="wrap wpmtst2">
28
 
29
  <?php
30
+ if ( isset( $_REQUEST['result'] ) ) {
31
+
32
+ $result = filter_input( INPUT_GET, 'result', FILTER_SANITIZE_STRING );
33
+
34
+ $result_messages = array(
35
+ 'cancelled' => __( 'Changes cancelled.', 'strong-testimonials' ),
36
+ 'defaults-restored' => __( 'Defaults restored.', 'strong-testimonials' ),
37
+ 'view-saved' => __( 'View saved.', 'strong-testimonials' ),
38
+ 'view-deleted' => __( 'View deleted.', 'strong-testimonials' ),
39
+ );
40
+
41
+ if ( in_array( $result, array_keys( $result_messages ) ) ) {
42
+ printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', $result_messages[ $result ] );
43
+ }
44
 
 
 
45
  }
46
 
47
  if ( isset( $_REQUEST['error'] ) ) {
48
 
49
  echo '<h1>' . __( 'Edit View', 'strong-testimonials' ) . '</h1>';
 
 
50
 
51
+ $message = __( 'An error occurred.', 'strong-testimonials' ) . ' ' . sprintf( wp_kses( __( 'Please <a href="%s" target="_blank">open a support ticket</a>.', 'strong-testimonials' ), $tags ), esc_url( 'https://support.strongplugins.com/new-ticket/' ) );
52
 
53
+ wp_die( sprintf( '<div class="notice notice-error"><p>%s</p></div>', $message ) );
54
+
55
+ }
56
+
57
+ if ( isset( $_REQUEST['action'] ) ) {
58
+
59
+ $action = filter_input( INPUT_GET, 'action', FILTER_SANITIZE_STRING );
60
+ $id = abs( filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT ) );
61
+
62
+ wpmtst_view_settings( $action, $id );
 
 
63
 
64
  } else {
65
 
109
  */
110
  function wpmtst_view_settings( $action = '', $view_id = null ) {
111
 
112
+ $actions = array( 'edit', 'duplicate', 'add' );
113
+ if ( ! in_array( $action, $actions ) ) {
114
+ wp_die( __( 'Invalid request. Please try again.', 'strong-testimonials' ) );
115
+ }
116
+
117
  if ( ( 'edit' == $action || 'duplicate' == $action ) && ! $view_id ) return;
118
 
119
  global $view;
172
  $view['pagination_settings']['per_page'] = 5;
173
  }
174
 
175
+ $custom_list = apply_filters( 'wpmtst_custom_pages_list', array(), $view );
176
+ $pages_list = apply_filters( 'wpmtst_pages_list', wpmtst_get_pages() );
177
+ $posts_list = apply_filters( 'wpmtst_posts_list', wpmtst_get_posts() );
178
 
179
  $view_options = apply_filters( 'wpmtst_view_options', get_option( 'wpmtst_view_options' ) );
180
 
182
  if ( !$view['template'] ) {
183
  if ( 'form' == $view['mode'] ) {
184
  $view['template'] = 'default-form';
185
+ } else {
 
186
  $view['template'] = 'default';
187
  }
188
  }
213
  <?php endif; ?>
214
  </h1>
215
 
216
+ <form id="wpmtst-views-form" method="post" action="<?php echo admin_url( 'admin-post.php' ); ?>" autocomplete="off">
217
 
218
  <?php wp_nonce_field( 'view_form_submit', 'view_form_nonce', true, true ); ?>
219
 
220
+ <input type="hidden" name="action" value="view_<?php echo esc_attr( $action ); ?>_form">
221
+ <input type="hidden" name="view[id]" value="<?php echo esc_attr( $view_id ); ?>">
222
+ <input type="hidden" name="view_original_mode" value="<?php echo esc_attr( $view['mode'] ); ?>">
223
+ <input type="hidden" name="view[data][_form_id]" value="<?php echo esc_attr( $view['form_id'] ); ?>">
224
 
225
  <div class="table view-info">
226
  <?php include( 'partials/views/view-name.php' ); ?>
279
 
280
  $goback = wp_get_referer();
281
 
282
+ if ( empty( $_POST ) || ! check_admin_referer( 'view_form_submit', 'view_form_nonce' ) ) {
283
+ $goback = add_query_arg( 'result', 'error', $goback );
284
+ wp_redirect( $goback );
285
+ exit;
286
+ }
287
 
288
+ $view_id = abs( filter_var( $_POST['view']['id'], FILTER_SANITIZE_NUMBER_INT ) );
289
+ $view_name = wpmtst_validate_view_name( $_POST['view']['name'], $view_id );
290
 
291
+ if ( isset( $_POST['reset'] ) ) {
 
 
292
 
293
+ // Undo changes
294
+ $goback = add_query_arg( 'result', 'cancelled', $goback );
295
 
296
+ } elseif ( isset( $_POST['restore-defaults'] ) ) {
 
297
 
298
+ // Restore defaults
299
+ $default_view = wpmtst_get_view_default();
 
 
 
 
300
 
301
+ $view = array(
302
+ 'id' => $view_id,
303
+ 'name' => $view_name,
304
+ 'data' => $default_view
305
+ );
306
+ $success = wpmtst_save_view( $view ); // num_rows
307
 
308
+ if ( $success ) {
309
+ $goback = add_query_arg( 'result', 'defaults-restored', $goback );
310
  } else {
311
+ $goback = add_query_arg( 'result', 'error', $goback );
312
+ }
313
 
314
+ } elseif ( isset( $_POST['submit-form'] ) ) {
 
 
 
 
 
 
315
 
316
+ // Sanitize & validate
317
+ $view = array(
318
+ 'id' => $view_id,
319
+ 'name' => $view_name,
320
+ 'data' => wpmtst_sanitize_view( stripslashes_deep( $_POST['view']['data'] ) ),
321
+ );
322
+ $success = wpmtst_save_view( $view ); // num_rows
323
 
324
+ if ( $success ) {
325
+ $goback = add_query_arg( 'result', 'view-saved', $goback );
326
+ } else {
327
+ $goback = add_query_arg( 'result', 'error', $goback );
328
  }
329
 
330
  } else {
331
+
332
+ $goback = add_query_arg( 'result', 'error', $goback );
333
+
334
  }
335
 
336
  wp_redirect( $goback );
349
 
350
  $goback = wp_get_referer();
351
 
352
+ if ( empty( $_POST ) || ! check_admin_referer( 'view_form_submit', 'view_form_nonce' ) ) {
353
+ $goback = add_query_arg( 'result', 'error', $goback );
354
+ wp_redirect( $goback );
355
+ exit;
356
+ }
357
 
358
+ $view_id = 0;
359
+ $view_name = wpmtst_validate_view_name( $_POST['view']['name'], $view_id );
360
 
361
+ if ( isset( $_POST['restore-defaults'] ) ) {
362
 
363
+ // Restore defaults
364
+ $default_view = wpmtst_get_view_default();
365
 
366
+ $view = array(
367
+ 'id' => $view_id,
368
+ 'name' => $view_name,
369
+ 'data' => $default_view,
370
+ );
371
+ $success = wpmtst_save_view( $view, 'add' ); // view ID
372
 
373
+ $query_arg = 'defaults-restored';
374
 
375
+ } elseif ( isset( $_POST['submit-form'] ) ) {
376
 
377
+ // Sanitize & validate
378
+ $view = array(
379
+ 'id' => 0,
380
+ 'name' => $view_name,
381
+ 'data' => wpmtst_sanitize_view( stripslashes_deep( $_POST['view']['data'] ) ),
382
+ );
383
+ $success = wpmtst_save_view( $view, 'add' ); // view ID
384
 
385
+ $query_arg = 'view-saved';
386
 
387
+ } else {
388
 
389
+ $success = false;
390
+ $query_arg = 'error';
 
 
 
 
391
 
392
+ }
393
+
394
+ if ( $success ) {
395
+ $goback = add_query_arg( array( 'action' => 'edit', 'id' => $success, 'result' => $query_arg ), $goback );
396
  } else {
397
+ $goback = add_query_arg( 'result', 'error', $goback );
398
  }
399
 
400
  wp_redirect( $goback );
521
 
522
  <div class="field3" data-key="<?php echo $key; ?>">
523
 
524
+ <div class="link" title="<?php _e( 'click to open or close', 'strong-testimonials' ); ?>">
525
 
526
  <a href="#" class="field-description <?php echo $label_class; ?>"><?php echo $field_label; ?></a>
527
 
537
  title="<?php _e( 'click to open or close', 'strong-testimonials' ); ?>"></span>
538
  </div>
539
 
540
+ </div>
541
 
542
  <div class="field-properties" style="display: none;">
543
 
748
  */
749
  function wpmtst_action_delete_view() {
750
  if ( isset( $_REQUEST['action'] ) && 'delete-strong-view' == $_REQUEST['action'] && isset( $_REQUEST['id'] ) ) {
751
+ $id = abs( (int) filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT ) );
752
  check_admin_referer( 'delete-strong-view_' . $id );
753
  wpmtst_delete_view( $id );
754
+ $goback = add_query_arg( 'result', 'view-deleted', wp_get_referer() );
755
  wp_redirect( $goback );
756
  exit;
757
  }
758
  }
 
759
  add_action( 'admin_action_delete-strong-view', 'wpmtst_action_delete_view' );
760
 
761
 
821
  * @since 2.22.0
822
  */
823
  function wpmtst_save_view_sticky() {
824
+ $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT );
825
  $stickies = get_option( 'wpmtst_sticky_views', array() );
826
  if ( in_array( $id, $stickies ) ) {
827
  $stickies = array_diff( $stickies, array( $id ) );
includes/class-strong-view-form.php CHANGED
@@ -37,6 +37,26 @@ class Strong_View_Form extends Strong_View {
37
  add_action( 'wp_enqueue_scripts', array( $this, 'add_custom_style' ), 20 );
38
  }
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  /**
41
  * Build the view.
42
  */
@@ -58,7 +78,6 @@ class Strong_View_Form extends Strong_View {
58
  $this->load_extra_stylesheets();
59
  $this->custom_background();
60
  $this->load_validator();
61
- //$this->load_honeypots();
62
 
63
  /*
64
  * If we cannot preprocess, add the inline style to the footer.
@@ -87,6 +106,7 @@ class Strong_View_Form extends Strong_View {
87
  /**
88
  * Add filters here.
89
  */
 
90
 
91
  /**
92
  * Locate template.
@@ -110,7 +130,11 @@ class Strong_View_Form extends Strong_View {
110
  /**
111
  * Remove filters here.
112
  */
 
113
 
 
 
 
114
  do_action( 'wpmtst_form_rendered', $this->atts );
115
 
116
  $this->html = apply_filters( 'strong_view_form_html', $html, $this );
37
  add_action( 'wp_enqueue_scripts', array( $this, 'add_custom_style' ), 20 );
38
  }
39
 
40
+ /**
41
+ * Print overlay while form data is submitted.
42
+ *
43
+ * This helps when uploading large files and on slow connections.
44
+ *
45
+ * @since 2.31.5
46
+ */
47
+ public function print_overlay() {
48
+ if ( apply_filters( 'wpmtst_form_wait', true ) ) {
49
+ WPMST()->render->add_style( 'wpmtst-font-awesome' );
50
+ ?>
51
+ <div class="strong-form-wait">
52
+ <div class="message">
53
+ <?php echo wp_kses_post( apply_filters( 'wpmtst_form_wait_message', '<i class="fa fa-2x fa-spinner fa-pulse" aria-hidden="true"></i>' ) ); ?>
54
+ </div>
55
+ </div>
56
+ <?php
57
+ }
58
+ }
59
+
60
  /**
61
  * Build the view.
62
  */
78
  $this->load_extra_stylesheets();
79
  $this->custom_background();
80
  $this->load_validator();
 
81
 
82
  /*
83
  * If we cannot preprocess, add the inline style to the footer.
106
  /**
107
  * Add filters here.
108
  */
109
+ add_action( 'wpmtst_before_form', array( $this, 'print_overlay' ) );
110
 
111
  /**
112
  * Locate template.
130
  /**
131
  * Remove filters here.
132
  */
133
+ remove_action( 'wpmtst_before_form', array( $this, 'print_overlay' ) );
134
 
135
+ /**
136
+ * Trigger stuff.
137
+ */
138
  do_action( 'wpmtst_form_rendered', $this->atts );
139
 
140
  $this->html = apply_filters( 'strong_view_form_html', $html, $this );
public/js/controller.js CHANGED
@@ -113,6 +113,16 @@ var strongController = {
113
  if (forms.length) {
114
  strongValidation.init();
115
  // initialize Captcha plugins here
 
 
 
 
 
 
 
 
 
 
116
  }
117
  },
118
 
113
  if (forms.length) {
114
  strongValidation.init();
115
  // initialize Captcha plugins here
116
+ } else {
117
+ var urlParams = new URLSearchParams(window.location.search);
118
+ if (urlParams.has('success')) {
119
+ urlParams.delete('success');
120
+ var newURL = window.location.pathname;
121
+ if (urlParams.toString()) {
122
+ newURL = newURL + '?' + urlParams.toString();
123
+ }
124
+ window.history.replaceState({}, document.title, newURL);
125
+ }
126
  }
127
  },
128
 
public/js/controller.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";var debugit=false;var strongController={grids:{},iframes:{},defaults:{initializeOn:"windowLoad",method:"",universalTimer:500,observerTimer:500,containerId:"page",addedNodeId:"content",event:"",script:"",debug:false},config:{},setup:function(settings){settings.universalTimer=parseInt(settings.universalTimer);settings.observerTimer=parseInt(settings.observerTimer);settings.debug=!!settings.debug;debugit=settings.debug;this.config=jQuery.extend({},this.defaults,settings)},mutationObserver:window.MutationObserver||window.WebKitMutationObserver,eventListenerSupported:window.addEventListener,checkInit:function(){return jQuery('.strong-view[data-state="idle"]').length},initSliders:function(){var sliders=jQuery('.strong-view.slider-container[data-state="idle"]');if(debugit)console.log("sliders found:",sliders.length);if(sliders.length){sliders.each(function(){jQuery(this).strongSlider()})}},initPagers:function(){var pagers=jQuery('.strong-pager[data-state="idle"]');if(debugit)console.log("pagers found:",pagers.length);if(pagers.length){pagers.each(function(){jQuery(this).strongPager()})}},initLayouts:function(){this.grids=jQuery('.strong-view[data-state="idle"] .strong-masonry');if(debugit)console.log("Masonry found:",this.grids.length);if(this.grids.length){this.grids.prepend('<div class="grid-sizer"></div><div class="gutter-sizer"></div>');this.grids.imagesLoaded(function(){strongController.grids.masonry({columnWidth:".grid-sizer",gutter:".gutter-sizer",itemSelector:".testimonial",percentPosition:true});strongController.grids.closest(".strong-view").attr("data-state","init")})}},initForm:function(){var forms=jQuery('.strong-form[data-state="idle"]');if(debugit)console.log("forms found:",forms.length);if(forms.length){strongValidation.init()}},initIframes:function(){this.iframes=jQuery("iframe")},observer:function(obj,callback){if(this.mutationObserver){var obs=new this.mutationObserver(function(mutations){for(var i=0;i<mutations.length;i++){if(mutations[i].addedNodes.length){if(debugit)console.log("mutation observed",mutations);for(var j=0;j<mutations[i].addedNodes.length;j++){if(mutations[i].addedNodes[j].id===strongController.config.containerId){if(debugit)console.log("+",strongController.config.containerId);callback();return}}}}});obs.observe(obj,{childList:true,subtree:true})}else if(this.eventListenerSupported){obj.addEventListener("DOMNodeInserted",function(e){if(e.currentTarget.id===obj.id){if(debugit)console.log("DOMNodeInserted:",e.currentTarget.id);callback()}},false)}},intervalId:null,timeoutId:null,newInterval:function(){strongController.intervalId=setInterval(function tick(){if(debugit)console.log("tick > checkInit",strongController.checkInit());if(strongController.checkInit()){strongController.start()}},strongController.config.universalTimer)},newTimeout:function(){strongController.timeoutId=setTimeout(function tick(){if(debugit)console.log("tick > checkInit",strongController.checkInit());if(strongController.checkInit()){strongController.start()}},strongController.config.observerTimer)},init:function(){if(debugit)console.log("strongController init");var settings={};if(typeof window.strongControllerParms!=="undefined"){settings=window.strongControllerParms}else{if(debugit)console.log("settings not found")}this.setup(settings);if(debugit)console.log("config",this.config);if("documentReady"===this.config.initializeOn){jQuery(document).ready(function(){if(debugit)console.log("document ready");strongController.start();strongController.listen()})}else{jQuery(window).on("load",function(){if(debugit)console.log("window load");strongController.start();strongController.listen()})}jQuery(window).on("load",function(){strongController.listenForIframeReady()})},start:function(){if(debugit)console.log("start");strongController.initSliders();strongController.initPagers();strongController.initLayouts();strongController.initForm();strongController.initIframes()},listen:function(){if(debugit)console.log("listen");switch(this.config.method){case"universal":this.newInterval();break;case"observer":this.observer(document.getElementById(this.config.containerId),this.newTimeout);break;case"event":document.addEventListener(this.config.event,this.start);break;case"script":switch(this.config.script){case"barba":if(typeof Barba==="object"&&Barba.hasOwnProperty("Dispatcher")){Barba.Dispatcher.on("transitionCompleted",this.start)}break;default:}break;default:}},listenForIframeReady:function(){if(debugit)console.log("listenForIframeReady");if(strongController.iframes.length&&strongController.grids.length){strongController.iframes.ready(function(){setTimeout(function(){strongController.grids.masonry();if(debugit)console.log("listenForIframeReady","timeout 1")},1e3);setTimeout(function(){strongController.grids.masonry();if(debugit)console.log("listenForIframeReady","timeout 2")},2e3)})}else{if(debugit)console.log("listenForIframeReady","no iframes or Masonry found")}}};strongController.init();
1
+ "use strict";var debugit=false;var strongController={grids:{},iframes:{},defaults:{initializeOn:"windowLoad",method:"",universalTimer:500,observerTimer:500,containerId:"page",addedNodeId:"content",event:"",script:"",debug:false},config:{},setup:function(settings){settings.universalTimer=parseInt(settings.universalTimer);settings.observerTimer=parseInt(settings.observerTimer);settings.debug=!!settings.debug;debugit=settings.debug;this.config=jQuery.extend({},this.defaults,settings)},mutationObserver:window.MutationObserver||window.WebKitMutationObserver,eventListenerSupported:window.addEventListener,checkInit:function(){return jQuery('.strong-view[data-state="idle"]').length},initSliders:function(){var sliders=jQuery('.strong-view.slider-container[data-state="idle"]');if(debugit)console.log("sliders found:",sliders.length);if(sliders.length){sliders.each(function(){jQuery(this).strongSlider()})}},initPagers:function(){var pagers=jQuery('.strong-pager[data-state="idle"]');if(debugit)console.log("pagers found:",pagers.length);if(pagers.length){pagers.each(function(){jQuery(this).strongPager()})}},initLayouts:function(){this.grids=jQuery('.strong-view[data-state="idle"] .strong-masonry');if(debugit)console.log("Masonry found:",this.grids.length);if(this.grids.length){this.grids.prepend('<div class="grid-sizer"></div><div class="gutter-sizer"></div>');this.grids.imagesLoaded(function(){strongController.grids.masonry({columnWidth:".grid-sizer",gutter:".gutter-sizer",itemSelector:".testimonial",percentPosition:true});strongController.grids.closest(".strong-view").attr("data-state","init")})}},initForm:function(){var forms=jQuery('.strong-form[data-state="idle"]');if(debugit)console.log("forms found:",forms.length);if(forms.length){strongValidation.init()}else{var urlParams=new URLSearchParams(window.location.search);if(urlParams.has("success")){urlParams.delete("success");var newURL=window.location.pathname;if(urlParams.toString()){newURL=newURL+"?"+urlParams.toString()}window.history.replaceState({},document.title,newURL)}}},initIframes:function(){this.iframes=jQuery("iframe")},observer:function(obj,callback){if(this.mutationObserver){var obs=new this.mutationObserver(function(mutations){for(var i=0;i<mutations.length;i++){if(mutations[i].addedNodes.length){if(debugit)console.log("mutation observed",mutations);for(var j=0;j<mutations[i].addedNodes.length;j++){if(mutations[i].addedNodes[j].id===strongController.config.containerId){if(debugit)console.log("+",strongController.config.containerId);callback();return}}}}});obs.observe(obj,{childList:true,subtree:true})}else if(this.eventListenerSupported){obj.addEventListener("DOMNodeInserted",function(e){if(e.currentTarget.id===obj.id){if(debugit)console.log("DOMNodeInserted:",e.currentTarget.id);callback()}},false)}},intervalId:null,timeoutId:null,newInterval:function(){strongController.intervalId=setInterval(function tick(){if(debugit)console.log("tick > checkInit",strongController.checkInit());if(strongController.checkInit()){strongController.start()}},strongController.config.universalTimer)},newTimeout:function(){strongController.timeoutId=setTimeout(function tick(){if(debugit)console.log("tick > checkInit",strongController.checkInit());if(strongController.checkInit()){strongController.start()}},strongController.config.observerTimer)},init:function(){if(debugit)console.log("strongController init");var settings={};if(typeof window.strongControllerParms!=="undefined"){settings=window.strongControllerParms}else{if(debugit)console.log("settings not found")}this.setup(settings);if(debugit)console.log("config",this.config);if("documentReady"===this.config.initializeOn){jQuery(document).ready(function(){if(debugit)console.log("document ready");strongController.start();strongController.listen()})}else{jQuery(window).on("load",function(){if(debugit)console.log("window load");strongController.start();strongController.listen()})}jQuery(window).on("load",function(){strongController.listenForIframeReady()})},start:function(){if(debugit)console.log("start");strongController.initSliders();strongController.initPagers();strongController.initLayouts();strongController.initForm();strongController.initIframes()},listen:function(){if(debugit)console.log("listen");switch(this.config.method){case"universal":this.newInterval();break;case"observer":this.observer(document.getElementById(this.config.containerId),this.newTimeout);break;case"event":document.addEventListener(this.config.event,this.start);break;case"script":switch(this.config.script){case"barba":if(typeof Barba==="object"&&Barba.hasOwnProperty("Dispatcher")){Barba.Dispatcher.on("transitionCompleted",this.start)}break;default:}break;default:}},listenForIframeReady:function(){if(debugit)console.log("listenForIframeReady");if(strongController.iframes.length&&strongController.grids.length){strongController.iframes.ready(function(){setTimeout(function(){strongController.grids.masonry();if(debugit)console.log("listenForIframeReady","timeout 1")},1e3);setTimeout(function(){strongController.grids.masonry();if(debugit)console.log("listenForIframeReady","timeout 2")},2e3)})}else{if(debugit)console.log("listenForIframeReady","no iframes or Masonry found")}}};strongController.init();
public/js/lib/form-validation/form-validation.js CHANGED
@@ -17,7 +17,7 @@ var strongValidation = {
17
  onSuccess: true,
18
  onSuccessOffset: 100
19
  },
20
- fields: {}
21
  },
22
 
23
  settings: {},
@@ -151,18 +151,29 @@ var strongValidation = {
151
  },
152
 
153
  submitHandler: function (form) {
 
 
 
154
  // If Ajax
155
  if (strongValidation.settings.ajaxUrl !== '') {
 
 
 
 
 
156
  var formOptions = {
157
  url: strongValidation.settings.ajaxUrl,
158
  data: {
159
  action: 'wpmtst_form2'
160
  },
161
- success: strongValidation.showResponse
162
  };
163
  jQuery(form).ajaxSubmit(formOptions);
 
164
  } else {
 
165
  form.submit();
 
166
  }
167
  },
168
 
@@ -207,6 +218,8 @@ var strongValidation = {
207
  * @param response
208
  */
209
  showResponse: function (response) {
 
 
210
  var obj = JSON.parse(response);
211
  if (obj.success) {
212
  jQuery('#wpmtst-form').html(obj.message);
@@ -240,5 +253,21 @@ var strongValidation = {
240
  jQuery('html, body').animate({scrollTop: scrollTop}, 800);
241
  }
242
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
  };
17
  onSuccess: true,
18
  onSuccessOffset: 100
19
  },
20
+ fields: {},
21
  },
22
 
23
  settings: {},
151
  },
152
 
153
  submitHandler: function (form) {
154
+
155
+ strongValidation.disableForm();
156
+
157
  // If Ajax
158
  if (strongValidation.settings.ajaxUrl !== '') {
159
+
160
+ window.onbeforeunload = function() {
161
+ return "Please wait while the form is submitted.";
162
+ }
163
+
164
  var formOptions = {
165
  url: strongValidation.settings.ajaxUrl,
166
  data: {
167
  action: 'wpmtst_form2'
168
  },
169
+ success: strongValidation.showResponse,
170
  };
171
  jQuery(form).ajaxSubmit(formOptions);
172
+
173
  } else {
174
+
175
  form.submit();
176
+
177
  }
178
  },
179
 
218
  * @param response
219
  */
220
  showResponse: function (response) {
221
+ window.onbeforeunload = null;
222
+ strongValidation.enableForm();
223
  var obj = JSON.parse(response);
224
  if (obj.success) {
225
  jQuery('#wpmtst-form').html(obj.message);
253
  jQuery('html, body').animate({scrollTop: scrollTop}, 800);
254
  }
255
  }
256
+ },
257
+
258
+ /**
259
+ * Show overlay during form submission.
260
+ */
261
+ disableForm: function () {
262
+ jQuery('.strong-form-wait').show();
263
+ jQuery('#wpmtst_submit_testimonial').prop('disabled',true);
264
+ },
265
+
266
+ /**
267
+ * Hide overlay after form submission.
268
+ */
269
+ enableForm: function () {
270
+ jQuery('.strong-form-wait').hide();
271
+ jQuery('#wpmtst_submit_testimonial').prop('disabled',false);
272
  }
273
  };
public/js/lib/form-validation/form-validation.min.js CHANGED
@@ -1 +1 @@
1
- var strongValidation={defaults:{ajaxUrl:"",display:{successMessage:false},scroll:{onError:true,onErrorOffset:100,onSuccess:true,onSuccessOffset:100},fields:{}},settings:{},setOpts:function(options){this.settings=jQuery.extend({},this.defaults,options)},rules:{},setRules:function(){for(var i=0;i<this.settings.fields.length;i++){if("rating"===this.settings.fields[i].type){if(1===this.settings.fields[i].required){this.rules[this.settings.fields[i].name]={ratingRequired:true}}}}},init:function(){var strongForm={};if(typeof window["strongForm"]!=="undefined"){strongForm=window["strongForm"]}this.setOpts(strongForm);if(this.settings.display.successMessage){this.scrollOnSuccess()}else{this.setRules();this.changeEvents();this.customValidators();this.validateForm()}},changeEvents:function(){jQuery('input[type="text"], input[type="url"], input[type="email"], textarea',"#wpmtst-submission-form").on("change blur",function(e){e.target.value=e.target.value.trim()});jQuery("input[type=url]").change(function(){if(this.value.length&&!/^https*:\/\//.test(this.value)){this.value="http://"+this.value}});var ratings=document.getElementsByClassName("strong-rating");for(var i=0;i<ratings.length;i++){ratings[i].addEventListener("click",this.handleRadioEvent,true);ratings[i].addEventListener("keyup",this.handleRadioEvent,true);ratings[i].addEventListener("change",function(){jQuery(this).valid()},true)}},handleRadioEvent:function(e){if(e.keyCode>=48&&e.keyCode<=53){var key=e.keyCode-48;jQuery(this).find('input[type="radio"][value='+key+"]").click()}},customValidators:function(){jQuery.validator.addMethod("ratingRequired",function(value,element){return jQuery(element).find("input:checked").val()>0},jQuery.validator.messages.required)},validateForm:function(){var theForm=jQuery("#wpmtst-submission-form");theForm.validate({onfocusout:false,focusInvalid:false,invalidHandler:function(form,validator){var errors=validator.numberOfInvalids();if(errors){if(strongValidation.settings.scroll.onError){if(typeof validator.errorList[0]!=="undefined"){var firstError=jQuery(validator.errorList[0].element);var fieldOffset=firstError.closest(".form-field").offset();var scrollTop=fieldOffset.top-strongValidation.settings.scroll.onErrorOffset;jQuery("html, body").animate({scrollTop:scrollTop},800,function(){firstError.focus()})}}else{validator.errorList[0].element.focus()}}},submitHandler:function(form){if(strongValidation.settings.ajaxUrl!==""){var formOptions={url:strongValidation.settings.ajaxUrl,data:{action:"wpmtst_form2"},success:strongValidation.showResponse};jQuery(form).ajaxSubmit(formOptions)}else{form.submit()}},rules:strongValidation.rules,errorPlacement:function(error,element){error.appendTo(element.closest("div.form-field"))},highlight:function(element,errorClass,validClass){if(element.type==="checkbox"){jQuery(element).closest(".field-wrap").addClass(errorClass).removeClass(validClass)}else if("rating"===jQuery(element).data("fieldType")){jQuery(element).closest(".field-wrap").addClass(errorClass).removeClass(validClass)}else{jQuery(element).addClass(errorClass).removeClass(validClass)}},unhighlight:function(element,errorClass,validClass){if(element.type==="checkbox"){jQuery(element).closest(".field-wrap").removeClass(errorClass).addClass(validClass)}else if("rating"===jQuery(element).data("fieldType")){jQuery(element).closest(".field-wrap").removeClass(errorClass).addClass(validClass)}else{jQuery(element).removeClass(errorClass).addClass(validClass)}}})},showResponse:function(response){var obj=JSON.parse(response);if(obj.success){jQuery("#wpmtst-form").html(obj.message);strongValidation.scrollOnSuccess()}else{for(var key in obj.errors){if(obj.errors.hasOwnProperty(key)){jQuery("div.wpmtst-"+key).find("span.error").remove().end().append('<span class="error">'+obj.errors[key]+"</span>")}}}},scrollOnSuccess:function(){if(strongValidation.settings.scroll.onSuccess){var containerOffset,scrollTop;containerOffset=jQuery(".testimonial-success").offset();if(containerOffset){scrollTop=containerOffset.top-strongValidation.settings.scroll.onSuccessOffset;if(jQuery("#wpadminbar").length){scrollTop-=32}jQuery("html, body").animate({scrollTop:scrollTop},800)}}}};
1
+ var strongValidation={defaults:{ajaxUrl:"",display:{successMessage:false},scroll:{onError:true,onErrorOffset:100,onSuccess:true,onSuccessOffset:100},fields:{}},settings:{},setOpts:function(options){this.settings=jQuery.extend({},this.defaults,options)},rules:{},setRules:function(){for(var i=0;i<this.settings.fields.length;i++){if("rating"===this.settings.fields[i].type){if(1===this.settings.fields[i].required){this.rules[this.settings.fields[i].name]={ratingRequired:true}}}}},init:function(){var strongForm={};if(typeof window["strongForm"]!=="undefined"){strongForm=window["strongForm"]}this.setOpts(strongForm);if(this.settings.display.successMessage){this.scrollOnSuccess()}else{this.setRules();this.changeEvents();this.customValidators();this.validateForm()}},changeEvents:function(){jQuery('input[type="text"], input[type="url"], input[type="email"], textarea',"#wpmtst-submission-form").on("change blur",function(e){e.target.value=e.target.value.trim()});jQuery("input[type=url]").change(function(){if(this.value.length&&!/^https*:\/\//.test(this.value)){this.value="http://"+this.value}});var ratings=document.getElementsByClassName("strong-rating");for(var i=0;i<ratings.length;i++){ratings[i].addEventListener("click",this.handleRadioEvent,true);ratings[i].addEventListener("keyup",this.handleRadioEvent,true);ratings[i].addEventListener("change",function(){jQuery(this).valid()},true)}},handleRadioEvent:function(e){if(e.keyCode>=48&&e.keyCode<=53){var key=e.keyCode-48;jQuery(this).find('input[type="radio"][value='+key+"]").click()}},customValidators:function(){jQuery.validator.addMethod("ratingRequired",function(value,element){return jQuery(element).find("input:checked").val()>0},jQuery.validator.messages.required)},validateForm:function(){var theForm=jQuery("#wpmtst-submission-form");theForm.validate({onfocusout:false,focusInvalid:false,invalidHandler:function(form,validator){var errors=validator.numberOfInvalids();if(errors){if(strongValidation.settings.scroll.onError){if(typeof validator.errorList[0]!=="undefined"){var firstError=jQuery(validator.errorList[0].element);var fieldOffset=firstError.closest(".form-field").offset();var scrollTop=fieldOffset.top-strongValidation.settings.scroll.onErrorOffset;jQuery("html, body").animate({scrollTop:scrollTop},800,function(){firstError.focus()})}}else{validator.errorList[0].element.focus()}}},submitHandler:function(form){strongValidation.disableForm();if(strongValidation.settings.ajaxUrl!==""){window.onbeforeunload=function(){return"Please wait while the form is submitted."};var formOptions={url:strongValidation.settings.ajaxUrl,data:{action:"wpmtst_form2"},success:strongValidation.showResponse};jQuery(form).ajaxSubmit(formOptions)}else{form.submit()}},rules:strongValidation.rules,errorPlacement:function(error,element){error.appendTo(element.closest("div.form-field"))},highlight:function(element,errorClass,validClass){if(element.type==="checkbox"){jQuery(element).closest(".field-wrap").addClass(errorClass).removeClass(validClass)}else if("rating"===jQuery(element).data("fieldType")){jQuery(element).closest(".field-wrap").addClass(errorClass).removeClass(validClass)}else{jQuery(element).addClass(errorClass).removeClass(validClass)}},unhighlight:function(element,errorClass,validClass){if(element.type==="checkbox"){jQuery(element).closest(".field-wrap").removeClass(errorClass).addClass(validClass)}else if("rating"===jQuery(element).data("fieldType")){jQuery(element).closest(".field-wrap").removeClass(errorClass).addClass(validClass)}else{jQuery(element).removeClass(errorClass).addClass(validClass)}}})},showResponse:function(response){window.onbeforeunload=null;strongValidation.enableForm();var obj=JSON.parse(response);if(obj.success){jQuery("#wpmtst-form").html(obj.message);strongValidation.scrollOnSuccess()}else{for(var key in obj.errors){if(obj.errors.hasOwnProperty(key)){jQuery("div.wpmtst-"+key).find("span.error").remove().end().append('<span class="error">'+obj.errors[key]+"</span>")}}}},scrollOnSuccess:function(){if(strongValidation.settings.scroll.onSuccess){var containerOffset,scrollTop;containerOffset=jQuery(".testimonial-success").offset();if(containerOffset){scrollTop=containerOffset.top-strongValidation.settings.scroll.onSuccessOffset;if(jQuery("#wpadminbar").length){scrollTop-=32}jQuery("html, body").animate({scrollTop:scrollTop},800)}}},disableForm:function(){jQuery(".strong-form-wait").show();jQuery("#wpmtst_submit_testimonial").prop("disabled",true)},enableForm:function(){jQuery(".strong-form-wait").hide();jQuery("#wpmtst_submit_testimonial").prop("disabled",false)}};
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: cdillon27
3
  Tags: testimonials, testimonial slider, testimonial form, reviews, star ratings
4
  Requires at least: 3.7
5
- Requires PHP: 5.2
6
  Tested up to: 4.9.6
7
- Stable tag: 2.31.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -215,6 +215,11 @@ If you prefer, start a private support ticket at [support.strongplugins.com](htt
215
 
216
  == Changelog ==
217
 
 
 
 
 
 
218
  = 2.31.4 - May 22, 2018 =
219
  * Add integration with WordPress privacy exporter and eraser features.
220
 
@@ -308,3 +313,6 @@ New [testimonial_average_rating] shortcode. More compatibility options.
308
 
309
  = 2.31.4 =
310
  Privacy exporter and eraser integration.
 
 
 
2
  Contributors: cdillon27
3
  Tags: testimonials, testimonial slider, testimonial form, reviews, star ratings
4
  Requires at least: 3.7
5
+ Requires PHP: 5.2.4
6
  Tested up to: 4.9.6
7
+ Stable tag: 2.31.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
215
 
216
  == Changelog ==
217
 
218
+ = 2.31.5 - June 1, 2018 =
219
+ * Fix XSS vulnerablilities reported by DefenseCode using Thunderscan.
220
+ * Add spinner UI element while form is being submitted to deter visitor from navigating away.
221
+ * Minor admin UI improvements.
222
+
223
  = 2.31.4 - May 22, 2018 =
224
  * Add integration with WordPress privacy exporter and eraser features.
225
 
313
 
314
  = 2.31.4 =
315
  Privacy exporter and eraser integration.
316
+
317
+ = 2.31.5 =
318
+ Fix XSS security vulnerabilities.
strong-testimonials.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin URI: https://strongplugins.com/plugins/strong-testimonials/
5
  * Description: Collect and display your testimonials or reviews.
6
  * Author: Chris Dillon
7
- * Version: 2.31.4
8
  *
9
  * Author URI: https://strongplugins.com/
10
  * Text Domain: strong-testimonials
@@ -34,7 +34,7 @@ if ( ! defined( 'ABSPATH' ) ) {
34
  exit;
35
  }
36
 
37
- define( 'WPMTST_VERSION', '2.31.4' );
38
  define( 'WPMTST_PLUGIN', plugin_basename( __FILE__ ) ); // strong-testimonials/strong-testimonials.php
39
  define( 'WPMTST', dirname( WPMTST_PLUGIN ) ); // strong-testimonials
40
  define( 'STRONGPLUGINS_STORE_URL', 'https://strongplugins.com' );
4
  * Plugin URI: https://strongplugins.com/plugins/strong-testimonials/
5
  * Description: Collect and display your testimonials or reviews.
6
  * Author: Chris Dillon
7
+ * Version: 2.31.5
8
  *
9
  * Author URI: https://strongplugins.com/
10
  * Text Domain: strong-testimonials
34
  exit;
35
  }
36
 
37
+ define( 'WPMTST_VERSION', '2.31.5' );
38
  define( 'WPMTST_PLUGIN', plugin_basename( __FILE__ ) ); // strong-testimonials/strong-testimonials.php
39
  define( 'WPMTST', dirname( WPMTST_PLUGIN ) ); // strong-testimonials
40
  define( 'STRONGPLUGINS_STORE_URL', 'https://strongplugins.com' );
templates-scss/_partials/_structure-form.scss CHANGED
@@ -1,4 +1,5 @@
1
  .strong-form {
 
2
  margin: 0 auto;
3
 
4
  .form-field {
@@ -119,3 +120,23 @@ img.captcha {
119
  }
120
 
121
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  .strong-form {
2
+ position: relative;
3
  margin: 0 auto;
4
 
5
  .form-field {
120
  }
121
 
122
  }
123
+
124
+ .strong-form-wait {
125
+ display: none;
126
+ position: absolute;
127
+ top: 0;
128
+ bottom: 0;
129
+ left: 0;
130
+ right: 0;
131
+ background: rgba(255,255,255,0.7);
132
+
133
+ .message {
134
+ position: absolute;
135
+ top: calc( 50% - 25px );
136
+ text-align: center;
137
+ width: 100%;
138
+ height: 50px;
139
+ line-height: 50px;
140
+ color: #111;
141
+ }
142
+ }
templates/default-form/form.css CHANGED
@@ -2,6 +2,7 @@
2
  * Strong Testimonials Default Form template
3
  */
4
  .strong-form {
 
5
  margin: 0 auto;
6
  }
7
  .strong-form .form-field {
@@ -100,6 +101,25 @@ img.captcha {
100
  padding-left: 0;
101
  }
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  .strong-form {
104
  /* error indicators */
105
  /* field-wrap is used for checkboxes, radios, star ratings */
2
  * Strong Testimonials Default Form template
3
  */
4
  .strong-form {
5
+ position: relative;
6
  margin: 0 auto;
7
  }
8
  .strong-form .form-field {
101
  padding-left: 0;
102
  }
103
 
104
+ .strong-form-wait {
105
+ display: none;
106
+ position: absolute;
107
+ top: 0;
108
+ bottom: 0;
109
+ left: 0;
110
+ right: 0;
111
+ background: rgba(255, 255, 255, 0.7);
112
+ }
113
+ .strong-form-wait .message {
114
+ position: absolute;
115
+ top: calc( 50% - 25px );
116
+ text-align: center;
117
+ width: 100%;
118
+ height: 50px;
119
+ line-height: 50px;
120
+ color: #111;
121
+ }
122
+
123
  .strong-form {
124
  /* error indicators */
125
  /* field-wrap is used for checkboxes, radios, star ratings */
templates/default-form/form.php CHANGED
@@ -6,6 +6,8 @@
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
 
 
9
  <div id="wpmtst-form">
10
 
11
  <div class="strong-form-inner">
@@ -30,4 +32,6 @@
30
 
31
  </div>
32
 
 
 
33
  </div>
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
9
+ <?php do_action( 'wpmtst_before_form' ); ?>
10
+
11
  <div id="wpmtst-form">
12
 
13
  <div class="strong-form-inner">
32
 
33
  </div>
34
 
35
+ <?php do_action( 'wpmtst_after_form' ); ?>
36
+
37
  </div>
templates/simple-form/form.css CHANGED
@@ -2,6 +2,7 @@
2
  * Strong Testimonials Simple Form template
3
  */
4
  .strong-form {
 
5
  margin: 0 auto;
6
  }
7
  .strong-form .form-field {
@@ -100,6 +101,25 @@ img.captcha {
100
  padding-left: 0;
101
  }
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  .strong-form {
104
  /* error indicators */
105
  /* field-wrap is used for checkboxes, radios, star ratings */
2
  * Strong Testimonials Simple Form template
3
  */
4
  .strong-form {
5
+ position: relative;
6
  margin: 0 auto;
7
  }
8
  .strong-form .form-field {
101
  padding-left: 0;
102
  }
103
 
104
+ .strong-form-wait {
105
+ display: none;
106
+ position: absolute;
107
+ top: 0;
108
+ bottom: 0;
109
+ left: 0;
110
+ right: 0;
111
+ background: rgba(255, 255, 255, 0.7);
112
+ }
113
+ .strong-form-wait .message {
114
+ position: absolute;
115
+ top: calc( 50% - 25px );
116
+ text-align: center;
117
+ width: 100%;
118
+ height: 50px;
119
+ line-height: 50px;
120
+ color: #111;
121
+ }
122
+
123
  .strong-form {
124
  /* error indicators */
125
  /* field-wrap is used for checkboxes, radios, star ratings */
templates/simple-form/form.php CHANGED
@@ -6,6 +6,8 @@
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
 
 
9
  <div id="wpmtst-form">
10
 
11
  <div class="strong-form-inner">
@@ -30,4 +32,6 @@
30
 
31
  </div>
32
 
 
 
33
  </div>
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
9
+ <?php do_action( 'wpmtst_before_form' ); ?>
10
+
11
  <div id="wpmtst-form">
12
 
13
  <div class="strong-form-inner">
32
 
33
  </div>
34
 
35
+ <?php do_action( 'wpmtst_after_form' ); ?>
36
+
37
  </div>
templates/unstyled-form/form.php CHANGED
@@ -6,6 +6,8 @@
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
 
 
9
  <div id="wpmtst-form">
10
 
11
  <div class="strong-form-inner">
@@ -30,4 +32,6 @@
30
 
31
  </div>
32
 
 
 
33
  </div>
6
  ?>
7
  <div class="strong-view strong-form <?php wpmtst_container_class(); ?>"<?php wpmtst_container_data(); ?>>
8
 
9
+ <?php do_action( 'wpmtst_before_form' ); ?>
10
+
11
  <div id="wpmtst-form">
12
 
13
  <div class="strong-form-inner">
32
 
33
  </div>
34
 
35
+ <?php do_action( 'wpmtst_after_form' ); ?>
36
+
37
  </div>