PluginProbe
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder / 3.6.0
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder v3.6.0
3.6.0 3.5.0 trunk 1.0.10 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.6.1 1.0.7 1.0.8 1.0.9 1.1 1.1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 All 110 releases
← All changes | freemius/templates/connect.php +703 -163 1.4.23.6.0 View file →
@@ -24,8 +24,17 @@
24 24 $is_freemium = $fs->is_freemium();
25 25
26 26 $fs->_enqueue_connect_essentials();
27 27
28 + /**
29 + * Enqueueing the styles in `_enqueue_connect_essentials()` is too late, as we need them in the HEADER. Therefore, inject the styles inline to avoid FOUC.
30 + *
31 + * @author Vova Feldman (@svovaf)
32 + */
33 + echo "<style>\n";
34 + include WP_FS__DIR_CSS . '/admin/connect.css';
35 + echo "</style>\n";
36 +
28 37 $current_user = Freemius::_get_current_wp_user();
29 38
30 39 $first_name = $current_user->user_firstname;
31 40 if ( empty( $first_name ) ) {
@@ -31,34 +40,33 @@
31 40 if ( empty( $first_name ) ) {
32 41 $first_name = $current_user->nickname;
33 42 }
34 43
35 - $site_url = get_site_url();
44 + $site_url = Freemius::get_unfiltered_site_url();
36 45 $protocol_pos = strpos( $site_url, '://' );
37 46 if ( false !== $protocol_pos ) {
38 47 $site_url = substr( $site_url, $protocol_pos + 3 );
39 48 }
40 49
41 - $freemius_site_www = 'https://freemius.com';
50 + $freemius_usage_tracking_url = $fs->get_usage_tracking_terms_url();
51 + $freemius_plugin_terms_url = $fs->get_eula_url();
42 52
43 - $freemius_site_url = $freemius_site_www . '/' . ( $fs->is_premium() ?
44 - 'wordpress/' :
45 - // Insights platform information.
46 - 'wordpress/usage-tracking/' . $fs->get_id() . "/{$slug}/" );
53 + $error = fs_request_get( 'error' );
47 54
48 - if ( $fs->is_premium() ) {
49 - $freemius_site_url .= '?' . http_build_query( array(
50 - 'id' => $fs->get_id(),
51 - 'slug' => $slug,
52 - ) );
53 - }
55 + $has_release_on_freemius = $fs->has_release_on_freemius();
54 56
55 - $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="1">freemius.com</a>';
57 + $require_license_key = $is_premium_only ||
58 + (
59 + $is_freemium &&
60 + ( $is_premium_code || ! $has_release_on_freemius ) &&
61 + fs_request_get_bool( 'require_license', ( $is_premium_code || $has_release_on_freemius ) )
62 + );
56 63
57 - $error = fs_request_get( 'error' );
64 + $freemius_activation_terms_url = ($fs->is_premium() && $require_license_key) ?
65 + $fs->get_license_activation_terms_url() :
66 + $freemius_usage_tracking_url;
58 67
59 - $require_license_key = $is_premium_only ||
60 - ( $is_freemium && $is_premium_code && fs_request_get_bool( 'require_license', true ) );
68 + $freemius_activation_terms_html = '<a href="' . esc_url( $freemius_activation_terms_url ) . '" target="_blank" rel="noopener" tabindex="1">freemius.com</a>';
61 69
62 70 if ( $is_pending_activation ) {
63 71 $require_license_key = false;
64 72 }
@@ -69,9 +77,9 @@
69 77
70 78 $is_optin_dialog = (
71 79 $fs->is_theme() &&
72 80 $fs->is_themes_page() &&
73 - ( ! $fs->has_settings_menu() || $fs->is_free_wp_org_theme() )
81 + $fs->show_opt_in_on_themes_page()
74 82 );
75 83
76 84 if ( $is_optin_dialog ) {
77 85 $show_close_button = false;
@@ -84,15 +92,39 @@
84 92 $show_close_button = ( ! empty( $previous_theme_activation_url ) );
85 93 }
86 94 }
87 95
88 - $fs_user = Freemius::_get_user_by_email( $current_user->user_email );
96 + $is_network_level_activation = (
97 + fs_is_network_admin() &&
98 + $fs->is_network_active() &&
99 + ! $fs->is_network_delegated_connection()
100 + );
101 +
102 + $fs_user = Freemius::_get_user_by_email( $current_user->user_email );
103 +
89 104 $activate_with_current_user = (
90 - is_object( $fs_user ) &&
105 + is_object( $fs_user ) &&
91 106 ! $is_pending_activation &&
92 107 // If requires a license for activation, use the user associated with the license for the opt-in.
93 - ! $require_license_key
108 + ! $require_license_key &&
109 + ! $is_network_level_activation
94 110 );
111 +
112 + $optin_params = $fs->get_opt_in_params( array(), $is_network_level_activation );
113 + $sites = isset( $optin_params['sites'] ) ? $optin_params['sites'] : array();
114 +
115 + $is_network_upgrade_mode = ( fs_is_network_admin() && $fs->is_network_upgrade_mode() );
116 +
117 + /* translators: %s: name (e.g. Hey John,) */
118 + $hey_x_text = esc_html( sprintf( fs_text_x_inline( 'Hey %s,', 'greeting', 'hey-x', $slug ), $first_name ) );
119 +
120 + $activation_state = array(
121 + 'is_license_activation' => $require_license_key,
122 + 'is_pending_activation' => $is_pending_activation,
123 + 'is_gdpr_required' => true,
124 + 'is_network_level_activation' => $is_network_level_activation,
125 + 'is_dialog' => $is_optin_dialog,
126 + );
95 127 ?>
96 128 <?php
97 129 if ( $is_optin_dialog ) { ?>
98 130 <div id="fs_theme_connect_wrapper">
@@ -104,116 +136,250 @@
104 136 }
105 137 ?>
106 138 <?php
107 139 }
140 +
141 + /**
142 + * Allows developers to include custom HTML before the opt-in content.
143 + *
144 + * @author Vova Feldman
145 + * @since 2.3.2
146 + */
147 + $fs->do_action( 'connect/before', $activation_state );
108 148 ?>
109 149 <div id="fs_connect"
110 - class="wrap<?php if ( ! $fs->is_enable_anonymous() || $is_pending_activation || $require_license_key ) {
150 + class="wrap<?php if ( ! fs_is_network_admin() && ( ! $fs->is_enable_anonymous() || $is_pending_activation || $require_license_key ) ) {
111 151 echo ' fs-anonymous-disabled';
112 - } ?>">
113 - <div class="fs-visual">
114 - <b class="fs-site-icon"><i class="dashicons dashicons-wordpress"></i></b>
115 - <i class="dashicons dashicons-plus fs-first"></i>
116 - <?php
117 - $vars = array( 'id' => $fs->get_id() );
118 - fs_require_once_template( 'plugin-icon.php', $vars );
119 - ?>
120 - <i class="dashicons dashicons-plus fs-second"></i>
121 - <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/>
122 - </div>
152 + } ?><?php echo $require_license_key ? ' require-license-key' : '' ?>">
153 + <div class="fs-header">
154 + <!-- <b class="fs-site-icon"><i class="dashicons dashicons-wordpress-alt"></i></b>-->
155 + <?php
156 + $size = 50;
157 + $vars = array(
158 + 'id' => $fs->get_id(),
159 + 'size' => $size,
160 + );
161 +
162 + fs_require_once_template( 'plugin-icon.php', $vars );
163 + ?>
164 + </div>
165 + <div class="fs-box-container">
123 166 <div class="fs-content">
167 + <?php $fs->do_action( 'connect/before_message', $activation_state ) ?>
168 +
124 169 <?php if ( ! empty( $error ) ) : ?>
125 - <p class="fs-error"><?php echo esc_html( $error ) ?></p>
170 + <div class="fs-error"><?php echo $fs->apply_filters( 'connect_error_esc_html', esc_html( $error ) ) ?></div>
126 171 <?php endif ?>
172 + <?php
173 + if ( ! $is_pending_activation && ! $require_license_key ) {
174 + if ( ! $fs->is_plugin_update() ) {
175 + echo $fs->apply_filters( 'connect-header', sprintf(
176 + '<h2 style="text-align: center">%s</h2>',
177 + esc_html( fs_text_inline( 'Never miss an important update', 'connect-header' ) )
178 + ) );
179 + } else {
180 + echo $fs->apply_filters( 'connect-header_on-update', sprintf(
181 + '<h2>%s</h2>',
182 + sprintf(
183 + esc_html(
184 + /* translators: %1$s: plugin name (e.g., "Awesome Plugin"); %2$s: version (e.g., "1.2.3") */
185 + fs_text_inline('Thank you for updating to %1$s v%2$s!', 'connect-header_on-update' )
186 + ),
187 + esc_html( $fs->get_plugin_name() ),
188 + $fs->get_plugin_version()
189 + )
190 + ) );
191 + }
192 + }
193 + ?>
127 194 <p><?php
128 195 $button_label = fs_text_inline( 'Allow & Continue', 'opt-in-connect', $slug );
196 + $message = '';
129 197
130 198 if ( $is_pending_activation ) {
131 199 $button_label = fs_text_inline( 'Re-send activation email', 'resend-activation-email', $slug );
132 200
133 - echo $fs->apply_filters( 'pending_activation_message', sprintf(
134 - /* translators: %s: name (e.g. Thanks John!) */
201 + $message = $fs->apply_filters( 'pending_activation_message', sprintf(
202 + /* translators: %s: name (e.g. Thanks John!) */
135 203 fs_text_inline( 'Thanks %s!', 'thanks-x', $slug ) . '<br>' .
136 - fs_text_inline( 'You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s.', 'pending-activation-message', $slug ),
204 + fs_text_inline( 'You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.', 'pending-activation-message', $slug ),
137 205 $first_name,
138 206 '<b>' . $fs->get_plugin_name() . '</b>',
139 207 '<b>' . $current_user->user_email . '</b>',
140 - fs_text_inline( 'complete the install', 'complete-the-install', $slug )
208 + fs_text_inline( 'complete the opt-in', 'complete-the-opt-in', $slug )
141 209 ) );
142 210 } else if ( $require_license_key ) {
143 - $button_label = fs_text_inline( 'Agree & Activate License', 'agree-activate-license', $slug );
211 + $button_label = fs_text_inline( 'Activate License', 'activate-license', $slug );
144 212
145 - echo $fs->apply_filters( 'connect-message_on-premium',
146 - /* translators: %s: name (e.g. Hey John,) */
147 - sprintf( fs_text_x_inline( 'Hey %s,', 'greeting', $slug ), $first_name ) . '<br>' .
148 - sprintf( fs_text_inline( 'Thanks for purchasing %s! To get started, please enter your license key:', 'thanks-for-purchasing', $slug ), '<b>' . $fs->get_plugin_name() . '</b>' ),
213 + $message = $fs->apply_filters(
214 + 'connect-message_on-premium',
215 + sprintf( fs_text_inline( 'Welcome to %s! To get started, please enter your license key:', 'thanks-for-purchasing', $slug ), '<b>' . $fs->get_plugin_name() . '</b>' ),
149 216 $first_name,
150 217 $fs->get_plugin_name()
151 218 );
152 219 } else {
153 - $filter = 'connect_message';
154 - $default_optin_message = fs_text_inline( 'Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s.', 'connect-message', $slug);;
220 + $filter = 'connect_message';
155 221
156 - if ( $fs->is_plugin_update() ) {
222 + if ( ! $fs->is_plugin_update() ) {
223 + $default_optin_message = esc_html(
224 + sprintf(
225 + /* translators: %s: module type (plugin, theme, or add-on) */
226 + fs_text_inline( 'Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.', 'connect-message', $slug ),
227 + $fs->get_module_label( true )
228 + )
229 + );
230 + } else {
157 231 // If Freemius was added on a plugin update, set different
158 232 // opt-in message.
159 - $default_optin_message = fs_text_inline( 'Please help us improve %1$s! If you opt in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that\'s okay! %1$s will still work just fine.', 'connect-message_on-update', $slug );
160 233
161 - // If user customized the opt-in message on update, use
234 + /* translators: %s: module type (plugin, theme, or add-on) */
235 + $default_optin_message = esc_html( sprintf( fs_text_inline( 'We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.', 'connect-message_on-update_why' ), $fs->get_module_label( true ) ) );
236 +
237 + $default_optin_message .= '<br><br>' . esc_html( fs_text_inline( 'Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.', 'connect-message_on-update', $slug ) );
238 +
239 + if ( $fs->is_enable_anonymous() ) {
240 + $default_optin_message .= ' ' . esc_html( fs_text_inline( 'If you skip this, that\'s okay! %1$s will still work just fine.', 'connect-message_on-update_skip', $slug ) );
241 + }
242 +
243 + // If user customized the opt-in message on update, use
162 244 // that message. Otherwise, fallback to regular opt-in
163 - // custom message if exist.
245 + // custom message if exists.
164 246 if ( $fs->has_filter( 'connect_message_on_update' ) ) {
165 247 $filter = 'connect_message_on_update';
166 248 }
167 249 }
168 250
169 - echo $fs->apply_filters( $filter,
170 - esc_html( sprintf( fs_text_x_inline( 'Hey %s,', 'greeting', 'hey-x', $slug ), $first_name ) ) . '<br>' .
251 + $message = $fs->apply_filters(
252 + $filter,
171 253 sprintf(
172 - esc_html( $default_optin_message ),
254 + $default_optin_message,
173 255 '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>',
174 256 '<b>' . $current_user->user_login . '</b>',
175 - '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>',
176 - $freemius_link
257 + '<a href="' . $site_url . '" target="_blank" rel="noopener noreferrer">' . $site_url . '</a>',
258 + $freemius_activation_terms_html
177 259 ),
178 260 $first_name,
179 261 $fs->get_plugin_name(),
180 262 $current_user->user_login,
181 - '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>',
182 - $freemius_link
263 + '<a href="' . $site_url . '" target="_blank" rel="noopener noreferrer">' . $site_url . '</a>',
264 + $freemius_activation_terms_html,
265 + true
183 266 );
184 267 }
268 +
269 + if ( $is_network_upgrade_mode ) {
270 + $network_integration_text = esc_html( fs_text_inline( 'We\'re excited to introduce the Freemius network-level integration.', 'connect_message_network_upgrade', $slug ) );
271 +
272 + if ($is_premium_code){
273 + $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %d site(s) that are still pending license activation.', 'connect_message_network_upgrade-premium', $slug ), count( $sites ) );
274 +
275 + $message .= '<br><br>' . sprintf( fs_text_inline( 'If you\'d like to use the %s on those sites, please enter your license key below and click the activation button.', 'connect_message_network_upgrade-premium-activate-license', $slug ), $is_premium_only ? $fs->get_module_label( true ) : sprintf(
276 + /* translators: %s: module type (plugin, theme, or add-on) */
277 + fs_text_inline( "%s's paid features", 'x-paid-features', $slug ),
278 + $fs->get_module_label( true )
279 + ) );
280 +
281 + /* translators: %s: module type (plugin, theme, or add-on) */
282 + $message .= ' ' . sprintf( fs_text_inline( 'Alternatively, you can skip it for now and activate the license later, in your %s\'s network-level Account page.', 'connect_message_network_upgrade-premium-skip-license', $slug ), $fs->get_module_label( true ) );
283 + }else {
284 + $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %s site(s) in the network that are still pending your attention.', 'connect_message_network_upgrade-free', $slug ), count( $sites ) ) . '<br><br>' . ( fs_starts_with( $message, $hey_x_text . '<br>' ) ? substr( $message, strlen( $hey_x_text . '<br>' ) ) : $message );
285 + }
286 + }
287 +
288 + echo $message;
185 289 ?></p>
186 290 <?php if ( $require_license_key ) : ?>
187 291 <div class="fs-license-key-container">
188 - <input id="fs_license_key" name="fs_key" type="text" required maxlength="32"
292 + <input id="fs_license_key" name="fs_key" type="text" required maxlength="<?php echo $fs->apply_filters('license_key_maxlength', 32) ?>"
189 293 placeholder="<?php fs_esc_attr_echo_inline( 'License key', 'license-key', $slug ) ?>" tabindex="1"/>
190 294 <i class="dashicons dashicons-admin-network"></i>
191 295 <a class="show-license-resend-modal show-license-resend-modal-<?php echo $fs->get_unique_affix() ?>"
192 296 href="#"><?php fs_esc_html_echo_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); ?></a>
193 297 </div>
298 +
299 + <?php
300 + /**
301 + * Allows developers to include custom HTML after the license input container.
302 + *
303 + * @author Vova Feldman
304 + * @since 2.1.2
305 + */
306 + $fs->do_action( 'connect/after_license_input', $activation_state );
307 + ?>
308 +
309 + <?php
310 + $send_updates_text = sprintf(
311 + '%s<span class="action-description"> - %s</span>',
312 + $fs->get_text_inline( 'Yes', 'yes' ),
313 + $fs->get_text_inline( 'send me security & feature updates, educational content and offers.', 'send-updates' )
314 + );
315 +
316 + $do_not_send_updates_text = sprintf(
317 + '%s<span class="action-description"> - %s</span>',
318 + $fs->get_text_inline( 'No', 'no' ),
319 + sprintf(
320 + $fs->get_text_inline( 'do %sNOT%s send me security & feature updates, educational content and offers.', 'do-not-send-updates' ),
321 + '<span class="underlined">',
322 + '</span>'
323 + )
324 + );
325 + ?>
326 + <div id="fs_marketing_optin">
327 + <span class="fs-message"><?php fs_echo_inline( "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:", 'contact-for-updates' ) ?></span>
328 + <div class="fs-input-container">
329 + <label>
330 + <input type="radio" name="allow-marketing" value="true" tabindex="1" />
331 + <span class="fs-input-label"><?php echo $send_updates_text ?></span>
332 + </label>
333 + <label>
334 + <input type="radio" name="allow-marketing" value="false" tabindex="1" />
335 + <span class="fs-input-label"><?php echo $do_not_send_updates_text ?></span>
336 + </label>
337 + </div>
338 + </div>
194 339 <?php endif ?>
340 + <?php if ( $is_network_level_activation ) : ?>
341 + <?php
342 + $vars = array(
343 + 'id' => $fs->get_id(),
344 + 'sites' => $sites,
345 + 'require_license_key' => $require_license_key
346 + );
347 +
348 + echo fs_get_template( 'partials/network-activation.php', $vars );
349 + ?>
350 + <?php endif ?>
351 +
352 + <?php $fs->do_action( 'connect/after_message', $activation_state ) ?>
195 353 </div>
196 354 <div class="fs-actions">
197 - <?php if ( $fs->is_enable_anonymous() && ! $is_pending_activation && ! $require_license_key ) : ?>
198 - <a href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_skip_activation' ) ), $fs->get_unique_affix() . '_skip_activation' ) ?>"
355 + <?php $fs->do_action( 'connect/before_actions', $activation_state ) ?>
356 +
357 + <?php if ( $fs->is_enable_anonymous() && ! $is_pending_activation && ( ! $require_license_key || $is_network_upgrade_mode ) ) : ?>
358 + <a id="skip_activation" href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_skip_activation' ), $is_network_level_activation ), $fs->get_unique_affix() . '_skip_activation' ) ?>"
199 359 class="button button-secondary" tabindex="2"><?php fs_esc_html_echo_x_inline( 'Skip', 'verb', 'skip', $slug ) ?></a>
200 360 <?php endif ?>
201 -
361 + <?php if ( $is_network_level_activation && $fs->apply_filters( 'show_delegation_option', true ) ) : ?>
362 + <a id="delegate_to_site_admins" class="fs-tooltip-trigger <?php echo is_rtl() ? ' rtl' : '' ?>" href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_delegate_activation' ) ), $fs->get_unique_affix() . '_delegate_activation' ) ?>"><?php fs_esc_html_echo_inline( 'Delegate to Site Admins', 'delegate-to-site-admins', $slug ) ?><span class="fs-tooltip"><?php fs_esc_html_echo_inline( 'If you click it, this decision will be delegated to the sites administrators.', 'delegate-sites-tooltip', $slug ) ?></span></a>
363 + <?php endif ?>
202 364 <?php if ( $activate_with_current_user ) : ?>
203 365 <form action="" method="POST">
204 366 <input type="hidden" name="fs_action"
205 - value="<?php echo $fs->get_unique_affix() ?>_activate_existing">
206 - <?php wp_nonce_field( 'activate_existing_' . $fs->get_public_key() ) ?>
367 + value="<?php echo esc_attr( $fs->get_unique_affix() . '_activate_existing' ) ?>">
368 + <?php wp_nonce_field( $fs->get_unique_affix() . '_activate_existing' ) ?>
369 + <input type="hidden" name="is_extensions_tracking_allowed" value="1">
370 + <input type="hidden" name="is_diagnostic_tracking_allowed" value="1">
207 371 <button class="button button-primary" tabindex="1"
208 372 type="submit"><?php echo esc_html( $button_label ) ?></button>
209 373 </form>
210 374 <?php else : ?>
211 375 <form method="post" action="<?php echo WP_FS__ADDRESS ?>/action/service/user/install/">
212 - <?php $params = $fs->get_opt_in_params() ?>
213 - <?php foreach ( $params as $name => $value ) : ?>
214 - <input type="hidden" name="<?php echo $name ?>" value="<?php echo esc_attr( $value ) ?>">
376 + <?php unset( $optin_params['sites']); ?>
377 + <?php foreach ( $optin_params as $name => $value ) : ?>
378 + <input type="hidden" name="<?php echo esc_attr( $name ) ?>" value="<?php echo esc_attr( $value ) ?>">
215 379 <?php endforeach ?>
380 + <input type="hidden" name="is_extensions_tracking_allowed" value="1">
381 + <input type="hidden" name="is_diagnostic_tracking_allowed" value="1">
216 382 <button class="button button-primary" tabindex="1"
217 383 type="submit"<?php if ( $require_license_key ) {
218 384 echo ' disabled="disabled"';
219 385 } ?>><?php echo esc_html( $button_label ) ?></button>
@@ -218,85 +384,49 @@
218 384 echo ' disabled="disabled"';
219 385 } ?>><?php echo esc_html( $button_label ) ?></button>
220 386 </form>
221 387 <?php endif ?>
388 + <?php if ( $require_license_key ) : ?>
389 + <a id="license_issues_link"
390 + href="<?php echo esc_url( $fs->apply_filters( 'known_license_issues_url', 'https://freemius.com/help/documentation/wordpress-sdk/license-activation-issues/' ) ) ?>"
391 + target="_blank"><?php fs_esc_html_echo_inline( 'License issues?', 'license-issues', $slug ) ?></a>
392 + <?php endif ?>
393 +
394 + <?php $fs->do_action( 'connect/after_actions', $activation_state ) ?>
222 395 </div><?php
396 + $permission_manager = FS_Permission_Manager::instance( $fs );
223 397
224 398 // Set core permission list items.
225 - $permissions = array(
226 - 'profile' => array(
227 - 'icon-class' => 'dashicons dashicons-admin-users',
228 - 'label' => $fs->get_text_inline( 'Your Profile Overview', 'permissions-profile' ),
229 - 'desc' => $fs->get_text_inline( 'Name and email address', 'permissions-profile_desc' ),
230 - 'priority' => 5,
231 - ),
232 - 'site' => array(
233 - 'icon-class' => 'dashicons dashicons-admin-settings',
234 - 'label' => $fs->get_text_inline( 'Your Site Overview', 'permissions-site' ),
235 - 'desc' => $fs->get_text_inline( 'Site URL, WP version, PHP info, plugins & themes', 'permissions-site_desc' ),
236 - 'priority' => 10,
237 - ),
238 - 'notices' => array(
239 - 'icon-class' => 'dashicons dashicons-testimonial',
240 - 'label' => $fs->get_text_inline( 'Admin Notices', 'permissions-admin-notices' ),
241 - 'desc' => $fs->get_text_inline( 'Updates, announcements, marketing, no spam', 'permissions-newsletter_desc' ),
242 - 'priority' => 13,
243 - ),
244 - 'events' => array(
245 - 'icon-class' => 'dashicons dashicons-admin-plugins',
246 - 'label' => sprintf( $fs->get_text_inline( 'Current %s Events', 'permissions-events' ), ucfirst( $fs->get_module_type() ) ),
247 - 'desc' => $fs->get_text_inline( 'Activation, deactivation and uninstall', 'permissions-events_desc' ),
248 - 'priority' => 20,
249 - ),
250 -// 'plugins_themes' => array(
251 -// 'icon-class' => 'dashicons dashicons-admin-settings',
252 -// 'label' => fs_text_inline( 'Plugins & Themes', 'permissions-plugins_themes' ),
253 -// 'desc' => fs_text_inline( 'Titles, versions and state.', 'permissions-plugins_themes_desc' ),
254 -// 'priority' => 30,
255 -// ),
256 - );
399 + $permissions = array();
257 400
258 - // Add newsletter permissions if enabled.
259 - if ( $fs->is_permission_requested( 'newsletter' ) ) {
260 - $permissions['newsletter'] = array(
261 - 'icon-class' => 'dashicons dashicons-email-alt',
262 - 'label' => $fs->get_text_inline( 'Newsletter', 'permissions-newsletter' ),
263 - 'desc' => $fs->get_text_inline( 'Updates, announcements, marketing, no spam', 'permissions-newsletter_desc' ),
264 - 'priority' => 15,
265 - );
266 - }
401 + // Add newsletter permissions if enabled.
402 + if ( $fs->is_permission_requested( 'newsletter' ) ) {
403 + $permissions[] = $permission_manager->get_newsletter_permission();
404 + }
267 405
268 - // Allow filtering of the permissions list.
269 - $permissions = $fs->apply_filters( 'permission_list', $permissions );
406 + $permissions = $permission_manager->get_permissions(
407 + $require_license_key,
408 + $permissions
409 + );
270 410
271 - // Sort by priority.
272 - uasort( $permissions, 'fs_sort_by_priority' );
273 -
274 411 if ( ! empty( $permissions ) ) : ?>
275 412 <div class="fs-permissions">
276 - <?php if ( $require_license_key ) : ?>
277 - <p class="fs-license-sync-disclaimer"><?php
278 - echo sprintf(
279 - fs_esc_html_inline( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ),
280 - $fs->get_module_label( true ),
281 - $freemius_link
282 - ) ?></p>
283 - <?php endif ?>
284 - <a class="fs-trigger" href="#" tabindex="1"><?php fs_esc_html_echo_inline( 'What permissions are being granted?', 'what-permissions', $slug ) ?></a>
413 + <?php if ( $require_license_key ) : ?>
414 + <a class="fs-trigger wp-core-ui" href="#" tabindex="1" style="color: inherit;"><?php echo sprintf(
415 + fs_esc_html_inline( 'For delivery of security & feature updates, and license management, %s needs to', 'license-sync-disclaimer', $slug ) . '<b class="fs-arrow"></b>',
416 + sprintf( '<nobr class="button-link" style="color: inherit;">%s</nobr>', esc_html( $fs->get_plugin_title() ) )
417 + ) ?></a>
418 + <?php else : ?>
419 + <a class="fs-trigger wp-core-ui" href="#" tabindex="1" style="color: inherit;"><?php printf(
420 + fs_esc_html_inline( 'This will allow %s to', 'this-will-allow-x', $slug ) . '<b class="fs-arrow"></b>',
421 + sprintf( '<nobr class="button-link" style="color: inherit;">%s</nobr>', esc_html( $fs->get_plugin_title() ) )
422 + ) ?></a>
423 + <?php endif ?>
285 424 <ul><?php
286 - foreach ( $permissions as $id => $permission ) : ?>
287 - <li id="fs-permission-<?php echo esc_attr( $id ); ?>"
288 - class="fs-permission fs-<?php echo esc_attr( $id ); ?>">
289 - <i class="<?php echo esc_attr( $permission['icon-class'] ); ?>"></i>
290 -
291 - <div>
292 - <span><?php echo esc_html( $permission['label'] ); ?></span>
293 -
294 - <p><?php echo esc_html( $permission['desc'] ); ?></p>
295 - </div>
296 - </li>
297 - <?php endforeach; ?>
298 - </ul>
425 + foreach ( $permissions as $permission ) {
426 + $permission_manager->render_permission( $permission );
427 + }
428 + ?></ul>
299 429 </div>
300 430 <?php endif ?>
301 431 <?php if ( $is_premium_code && $is_freemium ) : ?>
302 432 <div class="fs-freemium-licensing">
@@ -310,16 +440,31 @@
310 440 <?php endif ?>
311 441 </p>
312 442 </div>
313 443 <?php endif ?>
444 + </div>
314 445 <div class="fs-terms">
315 - <a href="https://freemius.com/privacy/" target="_blank"
446 + <a class="fs-tooltip-trigger<?php echo is_rtl() ? ' rtl' : '' ?>" href="<?php echo esc_url( $freemius_activation_terms_url ) ?>" target="_blank" rel="noopener" tabindex="1">Powered by Freemius<?php if ( $require_license_key ) : ?> <span class="fs-tooltip" style="width: 170px"><?php echo esc_html( $fs->get_text_inline( 'Freemius is our licensing and software updates engine', 'permissions-extensions_desc' ) ) ?></span><?php endif ?></a>
447 + &nbsp;&nbsp;-&nbsp;&nbsp;
448 + <a href="https://freemius.com/privacy/" target="_blank" rel="noopener"
316 449 tabindex="1"><?php fs_esc_html_echo_inline( 'Privacy Policy', 'privacy-policy', $slug ) ?></a>
317 450 &nbsp;&nbsp;-&nbsp;&nbsp;
318 - <a href="<?php echo $freemius_site_www ?>/terms/" target="_blank" tabindex="1"><?php fs_echo_inline( 'Terms of Service', 'tos', $slug ) ?></a>
451 + <?php if ($require_license_key) : ?>
452 + <a href="<?php echo esc_url( $freemius_plugin_terms_url ) ?>" target="_blank" rel="noopener" tabindex="1"><?php fs_echo_inline( 'License Agreement', 'license-agreement', $slug ) ?></a>
453 + <?php else : ?>
454 + <a href="<?php echo esc_url( $freemius_usage_tracking_url ) ?>" target="_blank" rel="noopener" tabindex="1"><?php fs_echo_inline( 'Terms of Service', 'tos', $slug ) ?></a>
455 + <?php endif; ?>
319 456 </div>
320 457 </div>
321 458 <?php
459 + /**
460 + * Allows developers to include custom HTML after the opt-in content.
461 + *
462 + * @author Vova Feldman
463 + * @since 2.3.2
464 + */
465 + $fs->do_action( 'connect/after', $activation_state );
466 +
322 467 if ( $is_optin_dialog ) { ?>
323 468 </div>
324 469 <?php
325 470 }
@@ -351,36 +496,325 @@
351 496 <?php
352 497 }
353 498 ?>
354 499
355 - var $primaryCta = $('.fs-actions .button.button-primary'),
356 - $form = $('.fs-actions form'),
357 - requireLicenseKey = <?php echo $require_license_key ? 'true' : 'false' ?>,
358 - hasContextUser = <?php echo $activate_with_current_user ? 'true' : 'false' ?>,
500 + var $primaryCta = $('.fs-actions .button.button-primary'),
501 + primaryCtaLabel = $primaryCta.html(),
502 + $form = $('.fs-actions form'),
503 + isNetworkActive = <?php echo $is_network_level_activation ? 'true' : 'false' ?>,
504 + requireLicenseKey = <?php echo $require_license_key ? 'true' : 'false' ?>,
505 + hasContextUser = <?php echo $activate_with_current_user ? 'true' : 'false' ?>,
506 + isNetworkUpgradeMode = <?php echo $is_network_upgrade_mode ? 'true' : 'false' ?>,
359 507 $licenseSecret,
360 - $licenseKeyInput = $('#fs_license_key');
508 + $licenseKeyInput = $('#fs_license_key'),
509 + pauseCtaLabelUpdate = false,
510 + isNetworkDelegating = false,
511 + /**
512 + * @author Leo Fajardo (@leorw)
513 + * @since 2.1.0
514 + */
515 + resetLoadingMode = function() {
516 + // Reset loading mode.
517 + $primaryCta.html(primaryCtaLabel);
518 + $primaryCta.prop('disabled', false);
519 + $( '.fs-loading' ).removeClass( 'fs-loading' );
361 520
521 + console.log('resetLoadingMode - Primary button was enabled');
522 + },
523 + setLoadingMode = function () {
524 + $( document.body ).addClass( 'fs-loading' );
525 + };
526 +
362 527 $('.fs-actions .button').on('click', function () {
363 - // Set loading mode.
364 - $(document.body).css({'cursor': 'wait'});
528 + setLoadingMode();
365 529
366 530 var $this = $(this);
367 - $this.css({'cursor': 'wait'});
368 531
369 532 setTimeout(function () {
370 - $this.attr('disabled', 'disabled');
533 + if ( ! requireLicenseKey || ! $marketingOptin.hasClass( 'error' ) ) {
534 + $this.attr('disabled', 'disabled');
535 + }
371 536 }, 200);
372 537 });
373 538
539 + if ( isNetworkActive ) {
540 + var
541 + $multisiteOptionsContainer = $( '.fs-multisite-options-container' ),
542 + $allSitesOptions = $( '.fs-all-sites-options' ),
543 + $applyOnAllSites = $( '.fs-apply-on-all-sites-checkbox' ),
544 + $sitesListContainer = $( '.fs-sites-list-container' ),
545 + totalSites = <?php echo count( $sites ) ?>,
546 + maxSitesListHeight = null,
547 + $skipActivationButton = $( '#skip_activation' ),
548 + $delegateToSiteAdminsButton = $( '#delegate_to_site_admins' ),
549 + hasAnyInstall = <?php echo ! is_null( $fs->find_first_install() ) ? 'true' : 'false' ?>;
550 +
551 + $applyOnAllSites.click(function() {
552 + var isChecked = $( this ).is( ':checked' );
553 +
554 + if ( isChecked ) {
555 + $multisiteOptionsContainer.find( '.action' ).removeClass( 'selected' );
556 + updatePrimaryCtaText( 'allow' );
557 + }
558 +
559 + $multisiteOptionsContainer.find( '.action-allow' ).addClass( 'selected' );
560 +
561 + $skipActivationButton.toggle();
562 +
563 + $delegateToSiteAdminsButton.toggle();
564 +
565 + $multisiteOptionsContainer.toggleClass( 'fs-apply-on-all-sites', isChecked );
566 +
567 + $sitesListContainer.toggle( ! isChecked );
568 + if ( ! isChecked && null === maxSitesListHeight ) {
569 + /**
570 + * Set the visible number of rows to 5 (5 * height of the first row).
571 + *
572 + * @author Leo Fajardo (@leorw)
573 + */
574 + maxSitesListHeight = ( 5 * $sitesListContainer.find( 'tr:first' ).height() );
575 + $sitesListContainer.css( 'max-height', maxSitesListHeight );
576 + }
577 + });
578 +
579 + $allSitesOptions.find( '.action' ).click(function( evt ) {
580 + var actionType = $( evt.target ).data( 'action-type' );
581 +
582 + $multisiteOptionsContainer.find( '.action' ).removeClass( 'selected' );
583 + $multisiteOptionsContainer.find( '.action-' + actionType ).toggleClass( 'selected' );
584 +
585 + updatePrimaryCtaText( actionType );
586 + });
587 +
588 + $sitesListContainer.delegate( 'td:not(:first-child)', 'click', function() {
589 + // If a site row is clicked, trigger a click on the checkbox.
590 + $( this ).parent().find( 'td:first-child input' ).click();
591 + } );
592 +
593 + $sitesListContainer.delegate( '.action', 'click', function( evt ) {
594 + var $this = $( evt.target );
595 + if ( $this.hasClass( 'selected' ) ) {
596 + return false;
597 + }
598 +
599 + $this.parents( 'tr:first' ).find( '.action' ).removeClass( 'selected' );
600 + $this.toggleClass( 'selected' );
601 +
602 + var
603 + singleSiteActionType = $this.data( 'action-type' ),
604 + totalSelected = $sitesListContainer.find( '.action-' + singleSiteActionType + '.selected' ).length;
605 +
606 + $allSitesOptions.find( '.action.selected' ).removeClass( 'selected' );
607 +
608 + if ( totalSelected === totalSites ) {
609 + $allSitesOptions.find( '.action-' + singleSiteActionType ).addClass( 'selected' );
610 +
611 + updatePrimaryCtaText( singleSiteActionType );
612 + } else {
613 + updatePrimaryCtaText( 'mixed' );
614 + }
615 + });
616 +
617 + if ( isNetworkUpgradeMode || hasAnyInstall ) {
618 + $skipActivationButton.click(function(){
619 + $delegateToSiteAdminsButton.hide();
620 +
621 + $skipActivationButton.html('<?php fs_esc_js_echo_inline( 'Skipping, please wait', 'skipping-wait', $slug ) ?>...');
622 +
623 + pauseCtaLabelUpdate = true;
624 +
625 + // Check all sites to be skipped.
626 + $allSitesOptions.find('.action.action-skip').click();
627 +
628 + $form.submit();
629 +
630 + pauseCtaLabelUpdate = false;
631 +
632 + return false;
633 + });
634 +
635 + $delegateToSiteAdminsButton.click(function(){
636 + $delegateToSiteAdminsButton.html('<?php fs_esc_js_echo_inline( 'Delegating, please wait', 'delegating-wait', $slug ) ?>...');
637 +
638 + pauseCtaLabelUpdate = true;
639 +
640 + /**
641 + * Set to true so that the form submission handler can differentiate delegation from license
642 + * activation and the proper AJAX action will be used (when delegating, the action should be
643 + * `network_activate` and not `activate_license`).
644 + *
645 + * @author Leo Fajardo (@leorw)
646 + * @since 2.3.0
647 + */
648 + isNetworkDelegating = true;
649 +
650 + // Check all sites to be skipped.
651 + $allSitesOptions.find('.action.action-delegate').click();
652 +
653 + $form.submit();
654 +
655 + pauseCtaLabelUpdate = false;
656 +
657 + /**
658 + * Set to false so that in case the previous AJAX request has failed, the form submission handler
659 + * can differentiate license activation from delegation and the proper AJAX action will be used
660 + * (when activating a license, the action should be `activate_license` and not `network_activate`).
661 + *
662 + * @author Leo Fajardo (@leorw)
663 + * @since 2.3.0
664 + */
665 + isNetworkDelegating = false;
666 +
667 + return false;
668 + });
669 + }
670 + }
671 +
672 + /**
673 + * @author Leo Fajardo (@leorw)
674 + */
675 + function updatePrimaryCtaText( actionType ) {
676 + if (pauseCtaLabelUpdate)
677 + return;
678 +
679 + var text = '<?php fs_esc_js_echo_inline( 'Continue', 'continue', $slug ) ?>';
680 +
681 + switch ( actionType ) {
682 + case 'allow':
683 + text = '<?php fs_esc_js_echo_inline( 'Allow & Continue', 'opt-in-connect', $slug ) ?>';
684 + break;
685 + case 'delegate':
686 + text = '<?php fs_esc_js_echo_inline( 'Delegate to Site Admins & Continue', 'delegate-to-site-admins-and-continue', $slug ) ?>';
687 + break;
688 + case 'skip':
689 + text = '<?php fs_esc_js_echo_x_inline( 'Skip', 'verb', 'skip', $slug ) ?>';
690 + break;
691 + }
692 +
693 + $primaryCta.html( text );
694 + }
695 +
696 + var ajaxOptin = ( requireLicenseKey || isNetworkActive );
697 +
374 698 $form.on('submit', function () {
699 + var $extensionsPermission = $( '#fs_permission_extensions .fs-switch' ),
700 + isExtensionsTrackingAllowed = ( $extensionsPermission.length > 0 ) ?
701 + $extensionsPermission.hasClass( 'fs-on' ) :
702 + null;
703 +
704 + var $diagnosticPermission = $( '#fs_permission_diagnostic .fs-switch' ),
705 + isDiagnosticTrackingAllowed = ( $diagnosticPermission.length > 0 ) ?
706 + $diagnosticPermission.hasClass( 'fs-on' ) :
707 + null;
708 +
709 + if ( null === isExtensionsTrackingAllowed ) {
710 + $( 'input[name=is_extensions_tracking_allowed]' ).remove();
711 + } else {
712 + $( 'input[name=is_extensions_tracking_allowed]' ).val( isExtensionsTrackingAllowed ? 1 : 0 );
713 + }
714 +
715 + // We are not showing switch to enable/disable diagnostic tracking while activating free version. So, don't remove hidden `is_diagnostic_tracking_allowed` element from DOM and change the value only if switch is available.
716 + if ( null !== isDiagnosticTrackingAllowed ) {
717 + $( 'input[name=is_diagnostic_tracking_allowed]' ).val( isDiagnosticTrackingAllowed ? 1 : 0 );
718 + }
719 +
375 720 /**
376 721 * @author Vova Feldman (@svovaf)
377 722 * @since 1.1.9
378 723 */
379 - if (requireLicenseKey) {
380 - if (!hasContextUser) {
724 + if ( ajaxOptin ) {
725 + if (!hasContextUser || isNetworkUpgradeMode) {
726 + var action = null,
727 + security = null;
728 +
729 + if ( requireLicenseKey && ! isNetworkDelegating ) {
730 + action = '<?php echo $fs->get_ajax_action( 'activate_license' ) ?>';
731 + security = '<?php echo $fs->get_ajax_security( 'activate_license' ) ?>';
732 + } else {
733 + action = '<?php echo $fs->get_ajax_action( 'network_activate' ) ?>';
734 + security = '<?php echo $fs->get_ajax_security( 'network_activate' ) ?>';
735 + }
736 +
381 737 $('.fs-error').remove();
382 738
739 + var
740 + licenseKey = $licenseKeyInput.val(),
741 + data = {
742 + action : action,
743 + security : security,
744 + license_key: licenseKey,
745 + module_id : '<?php echo $fs->get_id() ?>'
746 + };
747 +
748 + if (
749 + requireLicenseKey &&
750 + ! isNetworkDelegating &&
751 + isMarketingAllowedByLicense.hasOwnProperty(licenseKey)
752 + ) {
753 + var
754 + isMarketingAllowed = null,
755 + $isMarketingAllowed = $marketingOptin.find( 'input[type="radio"][name="allow-marketing"]:checked');
756 +
757 +
758 + if ($isMarketingAllowed.length > 0)
759 + isMarketingAllowed = ('true' == $isMarketingAllowed.val());
760 +
761 + if ( null == isMarketingAllowedByLicense[ licenseKey ] &&
762 + null == isMarketingAllowed
763 + ) {
764 + $marketingOptin.addClass( 'error' ).show();
765 + resetLoadingMode();
766 + return false;
767 + } else if ( null == isMarketingAllowed ) {
768 + isMarketingAllowed = isMarketingAllowedByLicense[ licenseKey ];
769 + }
770 +
771 + data.is_marketing_allowed = isMarketingAllowed;
772 +
773 + data.is_extensions_tracking_allowed = isExtensionsTrackingAllowed;
774 +
775 + data.is_diagnostic_tracking_allowed = isDiagnosticTrackingAllowed;
776 + }
777 +
778 + $marketingOptin.removeClass( 'error' );
779 +
780 + if ( isNetworkActive ) {
781 + var
782 + sites = [],
783 + applyOnAllSites = $applyOnAllSites.is( ':checked' );
784 +
785 + $sitesListContainer.find( 'tr' ).each(function() {
786 + var
787 + $this = $( this ),
788 + includeSite = ( ! requireLicenseKey || applyOnAllSites || $this.find( 'input' ).is( ':checked' ) );
789 +
790 + if ( ! includeSite )
791 + return;
792 +
793 + var site = {
794 + uid : $this.find( '.uid' ).val(),
795 + url : $this.find( '.url' ).val(),
796 + title : $this.find( '.title' ).val(),
797 + language: $this.find( '.language' ).val(),
798 + blog_id : $this.find( '.blog-id' ).find( 'span' ).text()
799 + };
800 +
801 + if ( ! requireLicenseKey) {
802 + site.action = $this.find('.action.selected').data('action-type');
803 + } else if ( isNetworkDelegating ) {
804 + site.action = 'delegate';
805 + }
806 +
807 + sites.push( site );
808 + });
809 +
810 + data.sites = sites;
811 +
812 + if ( hasAnyInstall ) {
813 + data.has_any_install = hasAnyInstall;
814 + }
815 + }
816 +
383 817 /**
384 818 * Use the AJAX opt-in when license key is required to potentially
385 819 * process the after install failure hook.
386 820 *
@@ -387,16 +821,11 @@
387 821 * @author Vova Feldman (@svovaf)
388 822 * @since 1.2.1.5
389 823 */
390 824 $.ajax({
391 - url : ajaxurl,
825 + url : <?php echo Freemius::ajax_url() ?>,
392 826 method : 'POST',
393 - data : {
394 - action : '<?php echo $fs->get_ajax_action( 'activate_license' ) ?>',
395 - security : '<?php echo $fs->get_ajax_security( 'activate_license' ) ?>',
396 - license_key: $licenseKeyInput.val(),
397 - module_id : '<?php echo $fs->get_id() ?>'
398 - },
827 + data : data,
399 828 success: function (result) {
400 829 var resultObj = $.parseJSON(result);
401 830 if (resultObj.success) {
402 831 // Redirect to the "Account" page and sync the license.
@@ -401,17 +830,16 @@
401 830 if (resultObj.success) {
402 831 // Redirect to the "Account" page and sync the license.
403 832 window.location.href = resultObj.next_page;
404 833 } else {
834 + resetLoadingMode();
835 +
405 836 // Show error.
406 - $('.fs-content').prepend('<p class="fs-error">' + (resultObj.error.message ? resultObj.error.message : resultObj.error) + '</p>');
407 -
408 - // Reset loading mode.
409 - $primaryCta.removeClass('fs-loading').css({'cursor': 'auto'});
410 - $primaryCta.html('<?php echo esc_js( $button_label ) ?>');
411 - $primaryCta.prop('disabled', false);
412 - $(document.body).css({'cursor': 'auto'});
837 + $('.fs-content').prepend('<div class="fs-error">' + (resultObj.error.message ? resultObj.error.message : resultObj.error) + '</div>');
413 838 }
839 + },
840 + error: function () {
841 + resetLoadingMode();
414 842 }
415 843 });
416 844
417 845 return false;
@@ -429,14 +857,25 @@
429 857
430 858 return true;
431 859 });
432 860
861 + $( '#fs_connect .fs-permissions .fs-switch' ).on( 'click', function () {
862 + $( this )
863 + .toggleClass( 'fs-on' )
864 + .toggleClass( 'fs-off' );
865 +
866 + $( this ).closest( '.fs-permission' )
867 + .toggleClass( 'fs-disabled' );
868 + });
869 +
433 870 $primaryCta.on('click', function () {
871 + console.log('Primary button was clicked');
872 +
434 873 $(this).addClass('fs-loading');
435 874 $(this).html('<?php echo esc_js( $is_pending_activation ?
436 875 fs_text_x_inline( 'Sending email', 'as in the process of sending an email', 'sending-email', $slug ) :
437 876 fs_text_x_inline( 'Activating', 'as activating plugin', 'activating', $slug )
438 - ) ?>...');
877 + ) ?>...');
439 878 });
440 879
441 880 $('.fs-permissions .fs-trigger').on('click', function () {
442 881 $('.fs-permissions').toggleClass('fs-open');
@@ -467,13 +906,28 @@
467 906 * @since 1.1.9
468 907 */
469 908 $licenseKeyInput.on('keyup paste delete cut', function () {
470 909 setTimeout(function () {
471 - if ('' === $licenseKeyInput.val()) {
910 + var key = $licenseKeyInput.val();
911 +
912 + if (key == previousLicenseKey){
913 + return;
914 + }
915 +
916 + if ('' === key) {
472 917 $primaryCta.attr('disabled', 'disabled');
918 + $marketingOptin.hide();
473 919 } else {
474 - $primaryCta.prop('disabled', false);
920 + $primaryCta.prop('disabled', false);
921 +
922 + if (32 <= key.length){
923 + fetchIsMarketingAllowedFlagAndToggleOptin();
924 + } else {
925 + $marketingOptin.hide();
926 + }
475 927 }
928 +
929 + previousLicenseKey = key;
476 930 }, 100);
477 931 }).focus();
478 932 }
479 933
@@ -498,6 +952,92 @@
498 952 'href',
499 953 href + 'require_license=' + $connectLicenseModeTrigger.attr('data-require-license')
500 954 );
501 955 }
956 +
957 + //--------------------------------------------------------------------------------
958 + //region GDPR
959 + //--------------------------------------------------------------------------------
960 + var isMarketingAllowedByLicense = {},
961 + $marketingOptin = $('#fs_marketing_optin'),
962 + previousLicenseKey = null;
963 +
964 + if (requireLicenseKey) {
965 +
966 + var
967 + afterMarketingFlagLoaded = function () {
968 + var licenseKey = $licenseKeyInput.val();
969 +
970 + if (null == isMarketingAllowedByLicense[licenseKey]) {
971 + $marketingOptin.show();
972 +
973 + if ($marketingOptin.find('input[type=radio]:checked').length > 0){
974 + // Focus on button if GDPR opt-in already selected is already selected.
975 + $primaryCta.focus();
976 + } else {
977 + // Focus on the GDPR opt-in radio button.
978 + $($marketingOptin.find('input[type=radio]')[0]).focus();
979 + }
980 + } else {
981 + $marketingOptin.hide();
982 + $primaryCta.focus();
983 + }
984 + },
985 + /**
986 + * @author Leo Fajardo (@leorw)
987 + * @since 2.1.0
988 + */
989 + fetchIsMarketingAllowedFlagAndToggleOptin = function () {
990 + var licenseKey = $licenseKeyInput.val();
991 +
992 + if (licenseKey.length < 32) {
993 + $marketingOptin.hide();
994 + return;
995 + }
996 +
997 + if (isMarketingAllowedByLicense.hasOwnProperty(licenseKey)) {
998 + afterMarketingFlagLoaded();
999 + return;
1000 + }
1001 +
1002 + $marketingOptin.hide();
1003 +
1004 + setLoadingMode();
1005 +
1006 + $primaryCta.addClass('fs-loading');
1007 + $primaryCta.attr('disabled', 'disabled');
1008 + $primaryCta.html('<?php fs_esc_js_echo_inline( 'Please wait', 'please-wait', $slug ) ?>...');
1009 +
1010 + $.ajax({
1011 + url : <?php echo Freemius::ajax_url() ?>,
1012 + method : 'POST',
1013 + data : {
1014 + action : '<?php echo $fs->get_ajax_action( 'fetch_is_marketing_required_flag_value' ) ?>',
1015 + security : '<?php echo $fs->get_ajax_security( 'fetch_is_marketing_required_flag_value' ) ?>',
1016 + license_key: licenseKey,
1017 + module_id : '<?php echo $fs->get_id() ?>'
1018 + },
1019 + success: function (result) {
1020 + resetLoadingMode();
1021 +
1022 + if (result.success) {
1023 + result = result.data;
1024 +
1025 + // Cache result.
1026 + isMarketingAllowedByLicense[licenseKey] = result.is_marketing_allowed;
1027 + }
1028 +
1029 + afterMarketingFlagLoaded();
1030 + }
1031 + });
1032 + };
1033 +
1034 + $marketingOptin.find( 'input' ).click(function() {
1035 + $marketingOptin.removeClass( 'error' );
1036 + });
1037 + }
1038 +
1039 + //endregion
502 1040 })(jQuery);
503 -</script>
1041 +</script>
1042 +<?php
1043 + fs_require_once_template( 'api-connectivity-message-js.php' );