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