PluginProbe ʕ •ᴥ•ʔ
Code Manager / 1.0.3
Code Manager v1.0.3
1.0.48 1.0.47 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.3 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.4 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9
code-manager / freemius / templates / connect.php
code-manager / freemius / templates Last commit date
account 5 years ago debug 5 years ago forms 5 years ago js 5 years ago partials 5 years ago plugin-info 5 years ago account.php 5 years ago add-ons.php 5 years ago add-trial-to-pricing.php 5 years ago admin-notice.php 5 years ago ajax-loader.php 5 years ago auto-installation.php 5 years ago checkout.php 5 years ago connect.php 5 years ago contact.php 5 years ago debug.php 5 years ago email.php 5 years ago firewall-issues-js.php 5 years ago gdpr-optin-js.php 5 years ago index.php 5 years ago plugin-icon.php 5 years ago powered-by.php 5 years ago pricing.php 5 years ago secure-https-header.php 5 years ago sticky-admin-notice-js.php 5 years ago tabs-capture-js.php 5 years ago tabs.php 5 years ago
connect.php
1026 lines
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>