PluginProbe
WPIDE – File Manager & Code Editor / 3.5.9
WPIDE – File Manager & Code Editor v3.5.9
3.5.9 3.5.8 3.5.7 2.0.14 2.0.15 2.0.16 2.0.2 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1 2.2 2.3 2.3.1 2.3.2 2.4.0 2.5 2.6 3.0 3.1 3.2 3.3 All 55 releases
← All changes | freemius/templates/forms/deactivation/form.php +666 -543 3.23.5.9 View file →
@@ -1,543 +1,666 @@
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.1.2
7 - */
8 -
9 - if ( ! defined( 'ABSPATH' ) ) {
10 - exit;
11 - }
12 -
13 - /**
14 - * @var array $VARS
15 - */
16 - $fs = freemius( $VARS['id'] );
17 - $slug = $fs->get_slug();
18 -
19 - $subscription_cancellation_dialog_box_template_params = $VARS['subscription_cancellation_dialog_box_template_params'];
20 - $show_deactivation_feedback_form = $VARS['show_deactivation_feedback_form'];
21 - $confirmation_message = $VARS['uninstall_confirmation_message'];
22 -
23 - $is_anonymous = ( ! $fs->is_registered() );
24 - $anonymous_feedback_checkbox_html = '';
25 -
26 - $reasons_list_items_html = '';
27 -
28 - if ( $show_deactivation_feedback_form ) {
29 - $reasons = $VARS['reasons'];
30 -
31 - foreach ( $reasons as $reason ) {
32 - $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
33 -
34 - if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) {
35 - $list_item_classes .= ' has-internal-message';
36 - $reason_internal_message = $reason['internal_message'];
37 - } else {
38 - $reason_internal_message = '';
39 - }
40 -
41 - $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' );
42 - $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' );
43 -
44 - $reason_list_item_html = <<< HTML
45 - <li class="{$list_item_classes}"
46 - data-input-type="{$reason_input_type}"
47 - data-input-placeholder="{$reason_input_placeholder}">
48 - <label>
49 - <span>
50 - <input type="radio" name="selected-reason" value="{$reason['id']}"/>
51 - </span>
52 - <span>{$reason['text']}</span>
53 - </label>
54 - <div class="internal-message">{$reason_internal_message}</div>
55 - </li>
56 -HTML;
57 -
58 - $reasons_list_items_html .= $reason_list_item_html;
59 - }
60 -
61 - if ( $is_anonymous ) {
62 - $anonymous_feedback_checkbox_html = sprintf(
63 - '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> %s</label>',
64 - fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug )
65 - );
66 - }
67 - }
68 -
69 - // Aliases.
70 - $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug );
71 - $theme_text = fs_text_inline( 'Theme', 'theme', $slug );
72 - $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug );
73 -
74 - fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
75 -
76 - if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) {
77 - fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params );
78 - }
79 -?>
80 -<script type="text/javascript">
81 -(function ($) {
82 - var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
83 - modalHtml =
84 - '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
85 - + ' <div class="fs-modal-dialog">'
86 - + ' <div class="fs-modal-header">'
87 - + ' <h4><?php fs_esc_attr_echo_inline( 'Quick Feedback', 'quick-feedback' , $slug ) ?></h4>'
88 - + ' </div>'
89 - + ' <div class="fs-modal-body">'
90 - + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>'
91 - + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php echo esc_js( sprintf( fs_text_inline( 'If you have a moment, please let us know why you are %s', 'deactivation-share-reason' , $slug ), ( $fs->is_plugin() ? fs_text_inline( 'deactivating', 'deactivating', $slug ) : fs_text_inline( 'switching', 'switching', $slug ) ) ) ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>'
92 - + ' </div>'
93 - + ' <div class="fs-modal-footer">'
94 - + ' <?php echo $anonymous_feedback_checkbox_html ?>'
95 - + ' <a href="#" class="button button-secondary button-deactivate"></a>'
96 - + ' <a href="#" class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>'
97 - + ' </div>'
98 - + ' </div>'
99 - + '</div>',
100 - $modal = $(modalHtml),
101 - selectedReasonID = false,
102 - redirectLink = '',
103 - $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
104 - isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
105 - otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
106 - dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
107 - deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
108 - $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
109 - showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>,
110 - $body = $( 'body' );
111 -
112 - $modal.appendTo( $body );
113 -
114 - if ( 0 !== $subscriptionCancellationModal.length ) {
115 - $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
116 - var shouldDeactivateModule = ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm );
117 -
118 - if ( false === cancelSubscription ) {
119 - if ( ! shouldDeactivateModule ) {
120 - showModal();
121 - }
122 -
123 - $subscriptionCancellationModal.trigger( 'closeModal' );
124 -
125 - if ( shouldDeactivateModule ) {
126 - deactivateModule();
127 - }
128 - } else {
129 - var $errorMessage = $subscriptionCancellationModal.find( '.notice-error' );
130 -
131 - <?php
132 - $subscription_cancellation_context = $fs->is_paid_trial() ?
133 - fs_text_inline( 'trial', 'trial', $slug ) :
134 - fs_text_inline( 'subscription', 'subscription', $slug );
135 - ?>
136 -
137 - $.ajax({
138 - url : ajaxurl,
139 - method : 'POST',
140 - data : {
141 - action : '<?php echo $fs->get_ajax_action( 'cancel_subscription_or_trial' ) ?>',
142 - security : '<?php echo $fs->get_ajax_security( 'cancel_subscription_or_trial' ) ?>',
143 - module_id: '<?php echo $fs->get_id() ?>'
144 - },
145 - beforeSend: function() {
146 - $errorMessage.hide();
147 -
148 - $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
149 - $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).text( '<?php echo esc_js(
150 - sprintf( fs_text_inline( 'Cancelling %s...', 'cancelling-x' , $slug ), $subscription_cancellation_context )
151 - ) ?>' );
152 - },
153 - success: function( result ) {
154 - if ( result.success ) {
155 - $subscriptionCancellationModal.removeClass( 'has-subscription-actions' );
156 - $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).removeClass( 'warn' );
157 -
158 - $subscriptionCancellationModal.remove();
159 -
160 - if ( ! shouldDeactivateModule ) {
161 - showModal();
162 - } else {
163 - deactivateModule();
164 - }
165 - } else {
166 - $errorMessage.find( '> p' ).html( result.error );
167 - $errorMessage.show();
168 -
169 - $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).removeClass( 'disabled' );
170 - $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).html( <?php echo json_encode( sprintf(
171 - fs_text_inline( 'Cancel %s & Proceed', 'cancel-x-and-proceed', $slug ),
172 - ucfirst( $subscription_cancellation_context )
173 - ) ) ?> );
174 - }
175 - }
176 - });
177 - }
178 - });
179 - }
180 -
181 - registerEventHandlers();
182 -
183 - function registerEventHandlers() {
184 - $body.on( 'click', '#the-list .deactivate > a', function ( evt ) {
185 - if ( 0 === $( this ).next( '[data-module-id=<?php echo $fs->get_id() ?>].fs-module-id' ).length ) {
186 - return true;
187 - }
188 -
189 - evt.preventDefault();
190 -
191 - redirectLink = $(this).attr('href');
192 -
193 - if ( 0 == $subscriptionCancellationModal.length ) {
194 - showModal();
195 - } else {
196 - $subscriptionCancellationModal.trigger( 'showModal' );
197 - }
198 - });
199 -
200 - <?php
201 - if ( ! $fs->is_plugin() ) {
202 - /**
203 - * For "theme" module type, the modal is shown when the current user clicks on
204 - * the "Activate" button of any other theme. The "Activate" button is actually
205 - * a link to the "Themes" page (/wp-admin/themes.php) containing query params
206 - * that tell WordPress to deactivate the current theme and activate a different theme.
207 - *
208 - * @author Leo Fajardo (@leorw)
209 - * @since 1.2.2
210 - *
211 - * @since 1.2.2.7 Don't trigger the deactivation feedback form if activating the premium version of the theme.
212 - */
213 - ?>
214 - $('body').on('click', '.theme-browser .theme:not([data-slug=<?php echo $fs->get_premium_slug() ?>]) .theme-actions .button.activate', function (evt) {
215 - evt.preventDefault();
216 -
217 - redirectLink = $(this).attr('href');
218 -
219 - if ( 0 != $subscriptionCancellationModal.length ) {
220 - $subscriptionCancellationModal.trigger( 'showModal' );
221 - } else {
222 - if ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm ) {
223 - deactivateModule();
224 - } else {
225 - showModal();
226 - }
227 - }
228 - });
229 - <?php
230 - } ?>
231 -
232 - $modal.on('input propertychange', '.reason-input input', function () {
233 - if (!isOtherReasonSelected()) {
234 - return;
235 - }
236 -
237 - var reason = $(this).val().trim();
238 -
239 - /**
240 - * If reason is not empty, remove the error-message class of the message container
241 - * to change the message color back to default.
242 - */
243 - if (reason.length > 0) {
244 - $('.message').removeClass('error-message');
245 - enableDeactivateButton();
246 - }
247 - });
248 -
249 - $modal.on('blur', '.reason-input input', function () {
250 - var $userReason = $(this);
251 -
252 - setTimeout(function () {
253 - if (!isOtherReasonSelected()) {
254 - return;
255 - }
256 -
257 - /**
258 - * If reason is empty, add the error-message class to the message container
259 - * to change the message color to red.
260 - */
261 - if (0 === $userReason.val().trim().length) {
262 - $('.message').addClass('error-message');
263 - disableDeactivateButton();
264 - }
265 - }, 150);
266 - });
267 -
268 - $modal.on('click', '.fs-modal-footer .button', function (evt) {
269 - evt.preventDefault();
270 -
271 - if ($(this).hasClass('disabled')) {
272 - return;
273 - }
274 -
275 - var _parent = $(this).parents('.fs-modal:first');
276 - var _this = $(this);
277 -
278 - if (_this.hasClass('allow-deactivate')) {
279 - var $radio = $modal.find('input[type="radio"]:checked');
280 -
281 - if (0 === $radio.length) {
282 - if ( ! deleteThemeUpdateData ) {
283 - // If no selected reason, just deactivate the plugin.
284 - window.location.href = redirectLink;
285 - } else {
286 - $.ajax({
287 - url : ajaxurl,
288 - method : 'POST',
289 - data : {
290 - action : '<?php echo $fs->get_ajax_action( 'delete_theme_update_data' ) ?>',
291 - security : '<?php echo $fs->get_ajax_security( 'delete_theme_update_data' ) ?>',
292 - module_id: '<?php echo $fs->get_id() ?>'
293 - },
294 - beforeSend: function() {
295 - _parent.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
296 - _parent.find( '.fs-modal-footer .button-secondary' ).text( 'Processing...' );
297 - },
298 - complete : function() {
299 - window.location.href = redirectLink;
300 - }
301 - });
302 - }
303 -
304 - return;
305 - }
306 -
307 - var $selected_reason = $radio.parents('li:first'),
308 - $input = $selected_reason.find('textarea, input[type="text"]'),
309 - userReason = ( 0 !== $input.length ) ? $input.val().trim() : '';
310 -
311 - if (isOtherReasonSelected() && ( '' === userReason )) {
312 - return;
313 - }
314 -
315 - $.ajax({
316 - url : ajaxurl,
317 - method : 'POST',
318 - data : {
319 - action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>',
320 - security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>',
321 - module_id : '<?php echo $fs->get_id() ?>',
322 - reason_id : $radio.val(),
323 - reason_info : userReason,
324 - is_anonymous: isAnonymousFeedback()
325 - },
326 - beforeSend: function () {
327 - _parent.find('.fs-modal-footer .button').addClass('disabled');
328 - _parent.find('.fs-modal-footer .button-secondary').text('Processing...');
329 - },
330 - complete : function () {
331 - // Do not show the dialog box, deactivate the plugin.
332 - window.location.href = redirectLink;
333 - }
334 - });
335 - } else if (_this.hasClass('button-deactivate')) {
336 - // Change the Deactivate button's text and show the reasons panel.
337 - _parent.find('.button-deactivate').addClass('allow-deactivate');
338 -
339 - if ( showDeactivationFeedbackForm ) {
340 - showPanel('reasons');
341 - } else {
342 - deactivateModule();
343 - }
344 - }
345 - });
346 -
347 - $modal.on('click', 'input[type="radio"]', function () {
348 - var $selectedReasonOption = $( this );
349 -
350 - // If the selection has not changed, do not proceed.
351 - if (selectedReasonID === $selectedReasonOption.val())
352 - return;
353 -
354 - selectedReasonID = $selectedReasonOption.val();
355 -
356 - if ( isAnonymous ) {
357 - if ( isReasonSelected( dontShareDataReasonID ) ) {
358 - $anonymousFeedback.hide();
359 - } else {
360 - $anonymousFeedback.show();
361 - }
362 - }
363 -
364 - var _parent = $(this).parents('li:first');
365 -
366 - $modal.find('.reason-input').remove();
367 - $modal.find( '.internal-message' ).hide();
368 - $modal.find('.button-deactivate').html('<?php echo esc_js( sprintf(
369 - fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit' , $slug ),
370 - $fs->is_plugin() ?
371 - $deactivate_text :
372 - sprintf( $activate_x_text, $theme_text )
373 - ) ) ?>');
374 -
375 - enableDeactivateButton();
376 -
377 - if ( _parent.hasClass( 'has-internal-message' ) ) {
378 - _parent.find( '.internal-message' ).show();
379 - }
380 -
381 - if (_parent.hasClass('has-input')) {
382 - var inputType = _parent.data('input-type'),
383 - inputPlaceholder = _parent.data('input-placeholder'),
384 - reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" maxlength="128" />' : '<textarea rows="5" maxlength="128"></textarea>' ) + '</div>';
385 -
386 - _parent.append($(reasonInputHtml));
387 - _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
388 -
389 - if (isOtherReasonSelected()) {
390 - showMessage('<?php echo esc_js( fs_text_inline( 'Kindly tell us the reason so we can improve.', 'ask-for-reason-message' , $slug ) ); ?>');
391 - disableDeactivateButton();
392 - }
393 - }
394 - });
395 -
396 - // If the user has clicked outside the window, cancel it.
397 - $modal.on('click', function (evt) {
398 - var $target = $(evt.target);
399 -
400 - // If the user has clicked anywhere in the modal dialog, just return.
401 - if ($target.hasClass('fs-modal-body') || $target.hasClass('fs-modal-footer')) {
402 - return;
403 - }
404 -
405 - // If the user has not clicked the close button and the clicked element is inside the modal dialog, just return.
406 - if (
407 - ! $target.hasClass( 'button-close' ) &&
408 - ( $target.parents( '.fs-modal-body' ).length > 0 || $target.parents( '.fs-modal-footer' ).length > 0 )
409 - ) {
410 - return;
411 - }
412 -
413 - closeModal();
414 -
415 - return false;
416 - });
417 - }
418 -
419 - function isAnonymousFeedback() {
420 - if ( ! isAnonymous ) {
421 - return false;
422 - }
423 -
424 - return ( isReasonSelected( dontShareDataReasonID ) || $anonymousFeedback.find( 'input' ).prop( 'checked' ) );
425 - }
426 -
427 - function isReasonSelected( reasonID ) {
428 - // Get the selected radio input element.
429 - var $selectedReasonOption = $modal.find('input[type="radio"]:checked');
430 -
431 - return ( reasonID == $selectedReasonOption.val() );
432 - }
433 -
434 - function isOtherReasonSelected() {
435 - return isReasonSelected( otherReasonID );
436 - }
437 -
438 - function showModal() {
439 - resetModal();
440 -
441 - // Display the dialog box.
442 - $modal.addClass('active');
443 -
444 - $('body').addClass('has-fs-modal');
445 - }
446 -
447 - function closeModal() {
448 - $modal.removeClass('active');
449 -
450 - $('body').removeClass('has-fs-modal');
451 - }
452 -
453 - function resetModal() {
454 - selectedReasonID = false;
455 -
456 - enableDeactivateButton();
457 -
458 - // Uncheck all radio buttons.
459 - $modal.find('input[type="radio"]').prop('checked', false);
460 -
461 - // Remove all input fields ( textfield, textarea ).
462 - $modal.find('.reason-input').remove();
463 -
464 - $modal.find('.message').hide();
465 -
466 - if ( isAnonymous ) {
467 - $anonymousFeedback.find( 'input' ).prop( 'checked', false );
468 -
469 - // Hide, since by default there is no selected reason.
470 - $anonymousFeedback.hide();
471 - }
472 -
473 - var $deactivateButton = $modal.find('.button-deactivate');
474 -
475 - /*
476 - * If the modal dialog has no confirmation message, that is, it has only one panel, then ensure
477 - * that clicking the deactivate button will actually deactivate the plugin.
478 - */
479 - if ( $modal.hasClass( 'no-confirmation-message' ) ) {
480 - $deactivateButton.addClass( 'allow-deactivate' );
481 -
482 - showPanel( 'reasons' );
483 - } else {
484 - $deactivateButton.removeClass( 'allow-deactivate' );
485 -
486 - showPanel( 'confirm' );
487 - }
488 - }
489 -
490 - function showMessage(message) {
491 - $modal.find('.message').text(message).show();
492 - }
493 -
494 - function enableDeactivateButton() {
495 - $modal.find('.button-deactivate').removeClass('disabled');
496 - }
497 -
498 - function disableDeactivateButton() {
499 - $modal.find('.button-deactivate').addClass('disabled');
500 - }
501 -
502 - function showPanel(panelType) {
503 - $modal.find( '.fs-modal-panel' ).removeClass( 'active' );
504 - $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' );
505 -
506 - updateButtonLabels();
507 - }
508 -
509 - function updateButtonLabels() {
510 - var $deactivateButton = $modal.find( '.button-deactivate' );
511 -
512 - // Reset the deactivate button's text.
513 - if ( 'confirm' === getCurrentPanel() ) {
514 - $deactivateButton.text( <?php echo json_encode( sprintf(
515 - fs_text_inline( 'Yes - %s', 'deactivation-modal-button-confirm', $slug ),
516 - $fs->is_plugin() ?
517 - $deactivate_text :
518 - sprintf( $activate_x_text, $theme_text )
519 - ) ) ?> );
520 - } else {
521 - $deactivateButton.html( <?php echo json_encode( sprintf(
522 - fs_text_inline('Skip & %s', 'skip-and-x', $slug ),
523 - $fs->is_plugin() ?
524 - $deactivate_text :
525 - sprintf( $activate_x_text, $theme_text )
526 - ) ) ?> );
527 - }
528 - }
529 -
530 - function getCurrentPanel() {
531 - return $modal.find('.fs-modal-panel.active').attr('data-panel-id');
532 - }
533 -
534 - /**
535 - * @author Leo Fajardo (@leorw)
536 - *
537 - * @since 2.3.0
538 - */
539 - function deactivateModule() {
540 - window.location.href = redirectLink;
541 - }
542 -})(jQuery);
543 -</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.1.2
7 + */
8 +
9 + if ( ! defined( 'ABSPATH' ) ) {
10 + exit;
11 + }
12 +
13 + /**
14 + * @var array $VARS
15 + */
16 + $fs = freemius( $VARS['id'] );
17 + $slug = $fs->get_slug();
18 +
19 + $subscription_cancellation_dialog_box_template_params = $VARS['subscription_cancellation_dialog_box_template_params'];
20 + $show_deactivation_feedback_form = $VARS['show_deactivation_feedback_form'];
21 + $confirmation_message = $VARS['uninstall_confirmation_message'];
22 +
23 + $is_anonymous = ( ! $fs->is_registered() );
24 + $anonymous_feedback_checkbox_html = '';
25 +
26 + $reasons_list_items_html = '';
27 + $snooze_select_html = '';
28 +
29 + if ( $show_deactivation_feedback_form ) {
30 + $reasons = $VARS['reasons'];
31 +
32 + foreach ( $reasons as $reason ) {
33 + $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
34 +
35 + if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) {
36 + $list_item_classes .= ' has-internal-message';
37 + $reason_internal_message = $reason['internal_message'];
38 + } else {
39 + $reason_internal_message = '';
40 + }
41 +
42 + $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' );
43 + $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' );
44 +
45 + $reason_list_item_html = <<< HTML
46 + <li class="{$list_item_classes}"
47 + data-input-type="{$reason_input_type}"
48 + data-input-placeholder="{$reason_input_placeholder}">
49 + <label>
50 + <span>
51 + <input type="radio" name="selected-reason" value="{$reason['id']}"/>
52 + </span>
53 + <span>{$reason['text']}</span>
54 + </label>
55 + <div class="internal-message">{$reason_internal_message}</div>
56 + </li>
57 +HTML;
58 +
59 + $reasons_list_items_html .= $reason_list_item_html;
60 + }
61 +
62 + if ( $is_anonymous ) {
63 + $anonymous_feedback_checkbox_html = sprintf(
64 + '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> %s</label>',
65 + fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug )
66 + );
67 + }
68 +
69 + $snooze_periods = array(
70 + array(
71 + 'increment' => fs_text_inline( 'hour', $slug ),
72 + 'quantity' => number_format_i18n(1),
73 + 'value' => 6 * WP_FS__TIME_10_MIN_IN_SEC,
74 + ),
75 + array(
76 + 'increment' => fs_text_inline( 'hours', $slug ),
77 + 'quantity' => number_format_i18n(24),
78 + 'value' => WP_FS__TIME_24_HOURS_IN_SEC,
79 + ),
80 + array(
81 + 'increment' => fs_text_inline( 'days', $slug ),
82 + 'quantity' => number_format_i18n(7),
83 + 'value' => WP_FS__TIME_WEEK_IN_SEC,
84 + ),
85 + array(
86 + 'increment' => fs_text_inline( 'days', $slug ),
87 + 'quantity' => number_format_i18n(30),
88 + 'value' => 30 * WP_FS__TIME_24_HOURS_IN_SEC,
89 + ),
90 + );
91 +
92 + $snooze_select_html = '<select>';
93 + foreach ($snooze_periods as $period) {
94 + $snooze_select_html .= sprintf(
95 + '<option value="%s">%s %s</option>',
96 + $period['value'],
97 + $period['quantity'],
98 + $period['increment']
99 + );
100 + }
101 +
102 + $snooze_select_html .= '</select>';
103 + }
104 +
105 + // Aliases.
106 + $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug );
107 + $theme_text = fs_text_inline( 'Theme', 'theme', $slug );
108 + $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug );
109 +
110 + $submit_deactivate_text = sprintf(
111 + fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit', $slug ),
112 + $fs->is_plugin() ?
113 + $deactivate_text :
114 + sprintf( $activate_x_text, $theme_text )
115 + );
116 +
117 + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
118 +
119 + if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) {
120 + fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params );
121 + }
122 +?>
123 +<script type="text/javascript">
124 +(function ($) {
125 + var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
126 + modalHtml =
127 + '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
128 + + ' <div class="fs-modal-dialog">'
129 + + ' <div class="fs-modal-header">'
130 + + ' <h4><?php fs_esc_attr_echo_inline( 'Quick Feedback', 'quick-feedback' , $slug ) ?></h4>'
131 + + ' </div>'
132 + + ' <div class="fs-modal-body">'
133 + + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>'
134 + + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php echo esc_js( sprintf( fs_text_inline( 'If you have a moment, please let us know why you are %s', 'deactivation-share-reason' , $slug ), ( $fs->is_plugin() ? fs_text_inline( 'deactivating', 'deactivating', $slug ) : fs_text_inline( 'switching', 'switching', $slug ) ) ) ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>'
135 + + ' </div>'
136 + + ' <div class="fs-modal-footer">'
137 + + ' <?php echo $anonymous_feedback_checkbox_html ?>'
138 + + ' <label style="display: none" class="feedback-from-snooze-label"><input type="checkbox" class="feedback-from-snooze-checkbox"> <span><?php fs_esc_js_echo_inline( 'Snooze this panel during troubleshooting', 'snooze-panel-during-troubleshooting', $slug ) ?></span><span style="display: none"><?php fs_esc_js_echo_inline( 'Snooze this panel for', 'snooze-panel-for', $slug ) ?> <?php echo $snooze_select_html ?></span></label>'
139 + + ' <a href="#" class="button button-secondary button-deactivate"></a>'
140 + + ' <a href="#" class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>'
141 + + ' </div>'
142 + + ' </div>'
143 + + '</div>',
144 + $modal = $(modalHtml),
145 + selectedReasonID = false,
146 + redirectLink = '',
147 + $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
148 + $feedbackSnooze = $modal.find( '.feedback-from-snooze-label' ),
149 + isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
150 + otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
151 + dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
152 + deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
153 + $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
154 + showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>,
155 + $body = $( 'body' );
156 +
157 + $modal.appendTo( $body );
158 +
159 + if ( 0 !== $subscriptionCancellationModal.length ) {
160 + $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
161 + var shouldDeactivateModule = ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm );
162 +
163 + if ( false === cancelSubscription ) {
164 + if ( ! shouldDeactivateModule ) {
165 + showModal();
166 + }
167 +
168 + $subscriptionCancellationModal.trigger( 'closeModal' );
169 +
170 + if ( shouldDeactivateModule ) {
171 + deactivateModule();
172 + }
173 + } else {
174 + var $errorMessage = $subscriptionCancellationModal.find( '.notice-error' );
175 +
176 + <?php
177 + $subscription_cancellation_context = $fs->is_paid_trial() ?
178 + fs_text_inline( 'trial', 'trial', $slug ) :
179 + fs_text_inline( 'subscription', 'subscription', $slug );
180 + ?>
181 +
182 + $.ajax({
183 + url : <?php echo Freemius::ajax_url() ?>,
184 + method : 'POST',
185 + data : {
186 + action : '<?php echo $fs->get_ajax_action( 'cancel_subscription_or_trial' ) ?>',
187 + security : '<?php echo $fs->get_ajax_security( 'cancel_subscription_or_trial' ) ?>',
188 + module_id: '<?php echo $fs->get_id() ?>'
189 + },
190 + beforeSend: function() {
191 + $errorMessage.hide();
192 +
193 + $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
194 + $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).text( '<?php echo esc_js(
195 + sprintf( fs_text_inline( 'Cancelling %s...', 'cancelling-x' , $slug ), $subscription_cancellation_context )
196 + ) ?>' );
197 + },
198 + success: function( result ) {
199 + if ( result.success ) {
200 + $subscriptionCancellationModal.removeClass( 'has-subscription-actions' );
201 + $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).removeClass( 'warn' );
202 +
203 + $subscriptionCancellationModal.remove();
204 +
205 + if ( ! shouldDeactivateModule ) {
206 + showModal();
207 + } else {
208 + deactivateModule();
209 + }
210 + } else {
211 + $errorMessage.find( '> p' ).html( result.error );
212 + $errorMessage.show();
213 +
214 + $subscriptionCancellationModal.find( '.fs-modal-footer .button' ).removeClass( 'disabled' );
215 + $subscriptionCancellationModal.find( '.fs-modal-footer .button-primary' ).html( <?php echo json_encode( sprintf(
216 + fs_text_inline( 'Cancel %s & Proceed', 'cancel-x-and-proceed', $slug ),
217 + ucfirst( $subscription_cancellation_context )
218 + ) ) ?> );
219 + }
220 + }
221 + });
222 + }
223 + });
224 + }
225 +
226 + registerEventHandlers();
227 +
228 + function registerEventHandlers() {
229 + $body.on( 'click', '#the-list .deactivate > a', function ( evt ) {
230 + if ( 0 === $( this ).next( '[data-module-id=<?php echo $fs->get_id() ?>].fs-module-id' ).length ) {
231 + return true;
232 + }
233 +
234 + evt.preventDefault();
235 +
236 + redirectLink = $(this).attr('href');
237 +
238 + if ( 0 == $subscriptionCancellationModal.length ) {
239 + showModal();
240 + } else {
241 + $subscriptionCancellationModal.trigger( 'showModal' );
242 + }
243 + });
244 +
245 + <?php
246 + if ( ! $fs->is_plugin() ) {
247 + /**
248 + * For "theme" module type, the modal is shown when the current user clicks on
249 + * the "Activate" button of any other theme. The "Activate" button is actually
250 + * a link to the "Themes" page (/wp-admin/themes.php) containing query params
251 + * that tell WordPress to deactivate the current theme and activate a different theme.
252 + *
253 + * @author Leo Fajardo (@leorw)
254 + * @since 1.2.2
255 + *
256 + * @since 1.2.2.7 Don't trigger the deactivation feedback form if activating the premium version of the theme.
257 + */
258 + ?>
259 + $('body').on('click', '.theme-browser .theme:not([data-slug=<?php echo $fs->get_premium_slug() ?>]) .theme-actions .button.activate', function (evt) {
260 + evt.preventDefault();
261 +
262 + redirectLink = $(this).attr('href');
263 +
264 + if ( 0 != $subscriptionCancellationModal.length ) {
265 + $subscriptionCancellationModal.trigger( 'showModal' );
266 + } else {
267 + if ( $modal.hasClass( 'no-confirmation-message' ) && ! showDeactivationFeedbackForm ) {
268 + deactivateModule();
269 + } else {
270 + showModal();
271 + }
272 + }
273 + });
274 + <?php
275 + } ?>
276 +
277 + $modal.on('input propertychange', '.reason-input input', function () {
278 + var reason = $(this).val().trim();
279 +
280 + /**
281 + * If reason is not empty, remove the error-message class of the message container
282 + * to change the message color back to default.
283 + */
284 + if (reason.length > 0) {
285 + $('.message').removeClass('error-message');
286 + }
287 +
288 + toggleDeactivationButtonPrimary( reason.length > 0 );
289 +
290 + changeDeactivateButtonText();
291 + });
292 +
293 + $modal.on('blur', '.reason-input input', function () {
294 + var $userReason = $(this);
295 +
296 + setTimeout(function () {
297 + if (!isOtherReasonSelected()) {
298 + return;
299 + }
300 +
301 + /**
302 + * If reason is empty, add the error-message class to the message container
303 + * to change the message color to red.
304 + */
305 + if (0 === $userReason.val().trim().length) {
306 + $('.message').addClass('error-message');
307 + changeDeactivateButtonText();
308 + }
309 + }, 150);
310 + });
311 +
312 + $modal.on('click', '.fs-modal-footer .button', function (evt) {
313 + evt.preventDefault();
314 +
315 + if ($(this).hasClass('disabled')) {
316 + return;
317 + }
318 +
319 + var _parent = $(this).parents('.fs-modal:first');
320 + var _this = $(this);
321 +
322 + if (_this.hasClass('allow-deactivate')) {
323 + var
324 + $radio = $modal.find('input[type="radio"]:checked'),
325 + isReasonSelected = (0 < $radio.length),
326 + userReason = '';
327 +
328 + if ( isReasonSelected ) {
329 + var $selectedReason = $radio.parents('li:first'),
330 + $reasonInput = $selectedReason.find('textarea, input[type="text"]');
331 +
332 + if ( 0 < $reasonInput.length ) {
333 + userReason = $reasonInput.val().trim();
334 + }
335 + }
336 +
337 + if ( otherReasonID == selectedReasonID && '' === userReason ) {
338 + // If the 'Other' is selected and a reason is not provided (aka it's empty), treat it as if a reason wasn't selected at all.
339 + isReasonSelected = false;
340 + }
341 +
342 + _parent.find( '.fs-modal-footer .button' ).addClass( 'disabled' );
343 +
344 + if ( ! isReasonSelected ) {
345 + if ( ! deleteThemeUpdateData ) {
346 + // If no selected reason, just deactivate the plugin.
347 + window.location.href = redirectLink;
348 + } else {
349 + $.ajax({
350 + url : <?php echo Freemius::ajax_url() ?>,
351 + method : 'POST',
352 + data : {
353 + action : '<?php echo $fs->get_ajax_action( 'delete_theme_update_data' ) ?>',
354 + security : '<?php echo $fs->get_ajax_security( 'delete_theme_update_data' ) ?>',
355 + module_id: '<?php echo $fs->get_id() ?>'
356 + },
357 + beforeSend: function() {
358 + _parent.find( '.fs-modal-footer .button-deactivate' ).text( '<?php echo esc_js( fs_text_inline( 'Processing', 'processing', $slug ) ) ?>...' );
359 + },
360 + complete : function() {
361 + window.location.href = redirectLink;
362 + }
363 + });
364 + }
365 +
366 + return;
367 + }
368 +
369 + var snoozePeriod = 0,
370 + shouldSnooze = $feedbackSnooze.find( '.feedback-from-snooze-checkbox' ).is( ':checked' );
371 +
372 + if ( shouldSnooze && <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID ) {
373 + snoozePeriod = parseInt($feedbackSnooze.find('select').val(), 10);
374 + }
375 +
376 + $.ajax({
377 + url : <?php echo Freemius::ajax_url() ?>,
378 + method : 'POST',
379 + data : {
380 + action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>',
381 + security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>',
382 + module_id : '<?php echo $fs->get_id() ?>',
383 + reason_id : $radio.val(),
384 + reason_info : userReason,
385 + is_anonymous : isAnonymousFeedback(),
386 + snooze_period: snoozePeriod
387 + },
388 + beforeSend: function () {
389 + _parent.find('.fs-modal-footer .button-deactivate').text('<?php echo esc_js( fs_text_inline( 'Processing', 'processing', $slug ) ) ?>...');
390 + },
391 + complete : function () {
392 + // Do not show the dialog box, deactivate the plugin.
393 + window.location.href = redirectLink;
394 + }
395 + });
396 + } else if (_this.hasClass('button-deactivate')) {
397 + // Change the Deactivate button's text and show the reasons panel.
398 + _parent.find('.button-deactivate').addClass('allow-deactivate');
399 +
400 + if ( showDeactivationFeedbackForm ) {
401 + showPanel('reasons');
402 + } else {
403 + deactivateModule();
404 + }
405 + }
406 + });
407 +
408 + $modal.on('click', 'input[type="radio"]', function () {
409 + var $selectedReasonOption = $( this );
410 +
411 + // If the selection has not changed, do not proceed.
412 + if (selectedReasonID === $selectedReasonOption.val())
413 + return;
414 +
415 + selectedReasonID = $selectedReasonOption.val();
416 +
417 + if ( isAnonymous ) {
418 + if ( isReasonSelected( dontShareDataReasonID ) ) {
419 + $anonymousFeedback.hide();
420 + } else {
421 + $anonymousFeedback.show();
422 + }
423 + }
424 +
425 + var _parent = $(this).parents('li:first');
426 +
427 + $modal.find('.reason-input').remove();
428 + $modal.find( '.internal-message' ).hide();
429 + $modal.find('.button-deactivate').html('<?php echo esc_js( $submit_deactivate_text ) ?>');
430 +
431 + if ( _parent.hasClass( 'has-internal-message' ) ) {
432 + _parent.find( '.internal-message' ).show();
433 + }
434 +
435 + if ( ! _parent.hasClass('has-input') ) {
436 + toggleDeactivationButtonPrimary( true );
437 + } else {
438 + toggleDeactivationButtonPrimary( false );
439 +
440 + var inputType = _parent.data('input-type'),
441 + inputPlaceholder = _parent.data('input-placeholder'),
442 + reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" maxlength="128" />' : '<textarea rows="5" maxlength="128"></textarea>' ) + '</div>';
443 +
444 + _parent.append($(reasonInputHtml));
445 + _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
446 +
447 + if (isOtherReasonSelected()) {
448 + showMessage('<?php echo esc_js( fs_text_inline( 'Kindly tell us the reason so we can improve.', 'ask-for-reason-message' , $slug ) ); ?>');
449 + changeDeactivateButtonText();
450 + }
451 + }
452 +
453 + $anonymousFeedback.toggle( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> != selectedReasonID );
454 + $feedbackSnooze.toggle( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID );
455 +
456 + if ( <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID ) {
457 + updateDeactivationButtonOnTrouble();
458 + }
459 + });
460 +
461 + var toggleDeactivationButtonPrimary = function ( isPrimary ) {
462 + if ( isPrimary ) {
463 + $modal.find('.button-deactivate')
464 + .removeClass( 'button-secondary' )
465 + .addClass( 'button-primary' );
466 + } else {
467 + $modal.find('.button-deactivate')
468 + .addClass( 'button-secondary' )
469 + .removeClass( 'button-primary' );
470 + }
471 + };
472 +
473 + var snooze = false;
474 +
475 + var updateDeactivationButtonOnTrouble = function () {
476 + if ( snooze ) {
477 + $modal.find('.button-deactivate').html('<?php echo esc_js( sprintf(
478 + fs_text_inline( 'Snooze & %s', 'snooze-modal-button-submit' , $slug ),
479 + $fs->is_plugin() ?
480 + $deactivate_text :
481 + sprintf( $activate_x_text, $theme_text )
482 + ) ) ?>');
483 + } else {
484 + $modal.find('.button-deactivate').html('<?php echo esc_js(
485 + $fs->is_plugin() ?
486 + $deactivate_text :
487 + sprintf( $activate_x_text, $theme_text )
488 + ) ?>');
489 + }
490 + };
491 +
492 + $feedbackSnooze.on( 'click', 'input', function () {
493 + var $spans = $feedbackSnooze.find( 'span' );
494 +
495 + snooze = ( ! snooze );
496 +
497 + $( $spans[0] ).toggle();
498 + $( $spans[1] ).toggle();
499 +
500 + updateDeactivationButtonOnTrouble();
501 + });
502 +
503 + // If the user has clicked outside the window, cancel it.
504 + $modal.on('click', function (evt) {
505 + var $target = $(evt.target);
506 +
507 + // If the user has clicked anywhere in the modal dialog, just return.
508 + if ($target.hasClass('fs-modal-body') || $target.hasClass('fs-modal-footer')) {
509 + return;
510 + }
511 +
512 + // If the user has not clicked the close button and the clicked element is inside the modal dialog, just return.
513 + if (
514 + ! $target.hasClass( 'button-close' ) &&
515 + ( $target.parents( '.fs-modal-body' ).length > 0 || $target.parents( '.fs-modal-footer' ).length > 0 )
516 + ) {
517 + return;
518 + }
519 +
520 + closeModal();
521 +
522 + return false;
523 + });
524 + }
525 +
526 + function isAnonymousFeedback() {
527 + if ( ! isAnonymous ) {
528 + return false;
529 + }
530 +
531 + return ( isReasonSelected( dontShareDataReasonID ) || $anonymousFeedback.find( 'input' ).prop( 'checked' ) );
532 + }
533 +
534 + function isReasonSelected( reasonID ) {
535 + // Get the selected radio input element.
536 + var $selectedReasonOption = $modal.find('input[type="radio"]:checked');
537 +
538 + return ( reasonID == $selectedReasonOption.val() );
539 + }
540 +
541 + function isOtherReasonSelected() {
542 + return isReasonSelected( otherReasonID );
543 + }
544 +
545 + function showModal() {
546 + resetModal();
547 +
548 + // Display the dialog box.
549 + $modal.addClass('active');
550 +
551 + $('body').addClass('has-fs-modal');
552 + }
553 +
554 + function closeModal() {
555 + $modal.removeClass('active');
556 +
557 + $('body').removeClass('has-fs-modal');
558 + }
559 +
560 + function resetModal() {
561 + selectedReasonID = false;
562 +
563 + // Uncheck all radio buttons.
564 + $modal.find('input[type="radio"]').prop('checked', false);
565 +
566 + // Remove all input fields ( textfield, textarea ).
567 + $modal.find('.reason-input').remove();
568 +
569 + $modal.find('.message').hide();
570 +
571 + if ( isAnonymous ) {
572 + $anonymousFeedback.find( 'input' ).prop( 'checked', <?php echo $fs->apply_filters( 'default_to_anonymous_feedback', false ) ? 'true' : 'false' ?> );
573 +
574 + // Hide, since by default there is no selected reason.
575 + $anonymousFeedback.hide();
576 + }
577 +
578 + var $deactivateButton = $modal.find('.button-deactivate');
579 +
580 + /*
581 + * If the modal dialog has no confirmation message, that is, it has only one panel, then ensure
582 + * that clicking the deactivate button will actually deactivate the plugin.
583 + */
584 + if ( $modal.hasClass( 'no-confirmation-message' ) ) {
585 + $deactivateButton.addClass( 'allow-deactivate' );
586 +
587 + showPanel( 'reasons' );
588 + } else {
589 + $deactivateButton.removeClass( 'allow-deactivate' );
590 +
591 + showPanel( 'confirm' );
592 + }
593 + }
594 +
595 + function showMessage(message) {
596 + $modal.find('.message').text(message).show();
597 + }
598 +
599 + /**
600 + * @author Xiaheng Chen (@xhchen)
601 + *
602 + * @since 2.4.2
603 + */
604 + function changeDeactivateButtonText() {
605 + if ( ! isOtherReasonSelected()) {
606 + return;
607 + }
608 +
609 + var
610 + $userReason = $modal.find('.reason-input input'),
611 + $deactivateButton = $modal.find('.button-deactivate');
612 +
613 + if (0 === $userReason.val().trim().length) {
614 + // If the reason is empty, just change the text to 'Deactivate' (plugin) or 'Activate themeX' (theme).
615 + $deactivateButton.html('<?php echo
616 + $fs->is_plugin() ?
617 + $deactivate_text :
618 + sprintf( $activate_x_text, $theme_text )
619 + ?>');
620 + } else {
621 + $deactivateButton.html('<?php echo esc_js( $submit_deactivate_text ) ?>');
622 + }
623 + }
624 +
625 + function showPanel(panelType) {
626 + $modal.find( '.fs-modal-panel' ).removeClass( 'active' );
627 + $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' );
628 +
629 + updateButtonLabels();
630 + }
631 +
632 + function updateButtonLabels() {
633 + var $deactivateButton = $modal.find( '.button-deactivate' );
634 +
635 + // Reset the deactivate button's text.
636 + if ( 'confirm' === getCurrentPanel() ) {
637 + $deactivateButton.text( <?php echo json_encode( sprintf(
638 + fs_text_inline( 'Yes - %s', 'deactivation-modal-button-confirm', $slug ),
639 + $fs->is_plugin() ?
640 + $deactivate_text :
641 + sprintf( $activate_x_text, $theme_text )
642 + ) ) ?> );
643 + } else {
644 + $deactivateButton.html( <?php echo json_encode( sprintf(
645 + fs_text_inline('Skip & %s', 'skip-and-x', $slug ),
646 + $fs->is_plugin() ?
647 + $deactivate_text :
648 + sprintf( $activate_x_text, $theme_text )
649 + ) ) ?> );
650 + }
651 + }
652 +
653 + function getCurrentPanel() {
654 + return $modal.find('.fs-modal-panel.active').attr('data-panel-id');
655 + }
656 +
657 + /**
658 + * @author Leo Fajardo (@leorw)
659 + *
660 + * @since 2.3.0
661 + */
662 + function deactivateModule() {
663 + window.location.href = redirectLink;
664 + }
665 +})(jQuery);
666 +</script>