PluginProbe
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder / 3.6.0
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder v3.6.0
3.6.0 3.5.0 trunk 1.0.10 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.6.1 1.0.7 1.0.8 1.0.9 1.1 1.1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 All 110 releases
← All changes | freemius/templates/forms/deactivation/form.php +419 -115 1.33.6.0 View file →
@@ -1,9 +1,9 @@
1 1 <?php
2 2 /**
3 3 * @package Freemius
4 4 * @copyright Copyright (c) 2015, Freemius, Inc.
5 - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
5 + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6 6 * @since 1.1.2
7 7 */
8 8
9 9 if ( ! defined( 'ABSPATH' ) ) {
@@ -12,100 +12,270 @@
12 12
13 13 /**
14 14 * @var array $VARS
15 15 */
16 - $slug = $VARS['slug'];
17 - $fs = freemius( $slug );
16 + $fs = freemius( $VARS['id'] );
17 + $slug = $fs->get_slug();
18 18
19 - $confirmation_message = $fs->apply_filters( 'uninstall_confirmation_message', '' );
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'];
20 22
21 - $reasons = $VARS['reasons'];
23 + $is_anonymous = ( ! $fs->is_registered() );
24 + $anonymous_feedback_checkbox_html = '';
22 25
23 - $reasons_list_items_html = '';
26 + $reasons_list_items_html = '';
27 + $snooze_select_html = '';
24 28
25 - foreach ( $reasons as $reason ) {
26 - $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
29 + if ( $show_deactivation_feedback_form ) {
30 + $reasons = $VARS['reasons'];
27 31
28 - if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) {
29 - $list_item_classes .= ' has-internal-message';
30 - $reason_internal_message = $reason['internal_message'];
31 - } else {
32 - $reason_internal_message = '';
33 - }
32 + foreach ( $reasons as $reason ) {
33 + $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' );
34 34
35 - $reason_list_item_html = <<< HTML
36 - <li class="{$list_item_classes}"
37 - data-input-type="{$reason['input_type']}"
38 - data-input-placeholder="{$reason['input_placeholder']}">
39 - <label>
40 - <span>
41 - <input type="radio" name="selected-reason" value="{$reason['id']}"/>
42 - </span>
43 - <span>{$reason['text']}</span>
44 - </label>
45 - <div class="internal-message">{$reason_internal_message}</div>
46 - </li>
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>
47 57 HTML;
48 58
49 - $reasons_list_items_html .= $reason_list_item_html;
50 - }
59 + $reasons_list_items_html .= $reason_list_item_html;
60 + }
51 61
52 - $is_anonymous = ( ! $fs->is_registered() );
53 - if ( $is_anonymous ) {
54 - $anonymous_feedback_checkbox_html =
55 - '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> '
56 - . fs_text( 'anonymous-feedback', $slug )
57 - . '</label>';
58 - } else {
59 - $anonymous_feedback_checkbox_html = '';
60 - }
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 + }
61 68
62 - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' );
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 + }
63 122 ?>
64 123 <script type="text/javascript">
65 124 (function ($) {
66 - var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ); ?>,
67 - modalHtml =
125 + var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
126 + modalHtml =
68 127 '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
69 128 + ' <div class="fs-modal-dialog">'
70 129 + ' <div class="fs-modal-header">'
71 - + ' <h4><?php fs_esc_attr_echo('quick-feedback' , $slug) ?></h4>'
130 + + ' <h4><?php fs_esc_attr_echo_inline( 'Quick Feedback', 'quick-feedback' , $slug ) ?></h4>'
72 131 + ' </div>'
73 132 + ' <div class="fs-modal-body">'
74 133 + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>'
75 - + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php fs_esc_attr_echo( 'deactivation-share-reason' , $slug ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></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>'
76 135 + ' </div>'
77 136 + ' <div class="fs-modal-footer">'
78 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>'
79 139 + ' <a href="#" class="button button-secondary button-deactivate"></a>'
80 - + ' <a href="#" class="button button-primary button-close"><?php fs_echo( 'cancel' , $slug ) ?></a>'
140 + + ' <a href="#" class="button button-secondary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>'
81 141 + ' </div>'
82 142 + ' </div>'
83 143 + '</div>',
84 - $modal = $(modalHtml),
85 - $deactivateLink = $('#the-list .deactivate > [data-slug=<?php echo $VARS['slug']; ?>].fs-slug').prev(),
86 - $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
87 - isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
88 - selectedReasonID = false,
89 - otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
90 - dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>;
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' );
91 156
92 - $modal.appendTo($('body'));
157 + $modal.appendTo( $body );
93 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 +
94 226 registerEventHandlers();
95 227
96 228 function registerEventHandlers() {
97 - $deactivateLink.click(function (evt) {
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 +
98 234 evt.preventDefault();
99 235
100 - showModal();
236 + redirectLink = $(this).attr('href');
237 +
238 + if ( 0 == $subscriptionCancellationModal.length ) {
239 + showModal();
240 + } else {
241 + $subscriptionCancellationModal.trigger( 'showModal' );
242 + }
101 243 });
102 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 +
103 277 $modal.on('input propertychange', '.reason-input input', function () {
104 - if (!isOtherReasonSelected()) {
105 - return;
106 - }
107 -
108 278 var reason = $(this).val().trim();
109 279
110 280 /**
111 281 * If reason is not empty, remove the error-message class of the message container
@@ -111,11 +281,14 @@
111 281 * If reason is not empty, remove the error-message class of the message container
112 282 * to change the message color back to default.
113 283 */
114 284 if (reason.length > 0) {
115 - $('.message').removeClass('error-message');
116 - enableDeactivateButton();
117 - }
285 + $('.message').removeClass('error-message');
286 + }
287 +
288 + toggleDeactivationButtonPrimary( reason.length > 0 );
289 +
290 + changeDeactivateButtonText();
118 291 });
119 292
120 293 $modal.on('blur', '.reason-input input', function () {
121 294 var $userReason = $(this);
@@ -130,10 +303,10 @@
130 303 * to change the message color to red.
131 304 */
132 305 if (0 === $userReason.val().trim().length) {
133 306 $('.message').addClass('error-message');
134 - disableDeactivateButton();
135 - }
307 + changeDeactivateButtonText();
308 + }
136 309 }, 150);
137 310 });
138 311
139 312 $modal.on('click', '.fs-modal-footer .button', function (evt) {
@@ -146,42 +319,79 @@
146 319 var _parent = $(this).parents('.fs-modal:first');
147 320 var _this = $(this);
148 321
149 322 if (_this.hasClass('allow-deactivate')) {
150 - var $radio = $('input[type="radio"]:checked');
323 + var
324 + $radio = $modal.find('input[type="radio"]:checked'),
325 + isReasonSelected = (0 < $radio.length),
326 + userReason = '';
151 327
152 - if (0 === $radio.length) {
153 - // If no selected reason, just deactivate the plugin.
154 - window.location.href = $deactivateLink.attr('href');
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 +
155 366 return;
156 367 }
157 368
158 - var $selected_reason = $radio.parents('li:first'),
159 - $input = $selected_reason.find('textarea, input[type="text"]'),
160 - userReason = ( 0 !== $input.length ) ? $input.val().trim() : '';
369 + var snoozePeriod = 0,
370 + shouldSnooze = $feedbackSnooze.find( '.feedback-from-snooze-checkbox' ).is( ':checked' );
161 371
162 - if (isOtherReasonSelected() && ( '' === userReason )) {
163 - return;
164 - }
372 + if ( shouldSnooze && <?php echo Freemius::REASON_TEMPORARY_DEACTIVATION ?> == selectedReasonID ) {
373 + snoozePeriod = parseInt($feedbackSnooze.find('select').val(), 10);
374 + }
165 375
166 376 $.ajax({
167 - url : ajaxurl,
377 + url : <?php echo Freemius::ajax_url() ?>,
168 378 method : 'POST',
169 379 data : {
170 - action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>',
171 - security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>',
172 - slug : '<?php echo $slug ?>',
173 - reason_id : $radio.val(),
174 - reason_info : userReason,
175 - is_anonymous: isAnonymousFeedback()
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
176 387 },
177 388 beforeSend: function () {
178 - _parent.find('.fs-modal-footer .button').addClass('disabled');
179 - _parent.find('.fs-modal-footer .button-secondary').text('Processing...');
389 + _parent.find('.fs-modal-footer .button-deactivate').text('<?php echo esc_js( fs_text_inline( 'Processing', 'processing', $slug ) ) ?>...');
180 390 },
181 391 complete : function () {
182 392 // Do not show the dialog box, deactivate the plugin.
183 - window.location.href = $deactivateLink.attr('href');
393 + window.location.href = redirectLink;
184 394 }
185 395 });
186 396 } else if (_this.hasClass('button-deactivate')) {
187 397 // Change the Deactivate button's text and show the reasons panel.
@@ -186,14 +396,18 @@
186 396 } else if (_this.hasClass('button-deactivate')) {
187 397 // Change the Deactivate button's text and show the reasons panel.
188 398 _parent.find('.button-deactivate').addClass('allow-deactivate');
189 399
190 - showPanel('reasons');
400 + if ( showDeactivationFeedbackForm ) {
401 + showPanel('reasons');
402 + } else {
403 + deactivateModule();
404 + }
191 405 }
192 406 });
193 407
194 408 $modal.on('click', 'input[type="radio"]', function () {
195 - var $selectedReasonOption = $(this);
409 + var $selectedReasonOption = $( this );
196 410
197 411 // If the selection has not changed, do not proceed.
198 412 if (selectedReasonID === $selectedReasonOption.val())
199 413 return;
@@ -211,31 +425,82 @@
211 425 var _parent = $(this).parents('li:first');
212 426
213 427 $modal.find('.reason-input').remove();
214 428 $modal.find( '.internal-message' ).hide();
215 - $modal.find('.button-deactivate').text('<?php printf( fs_text( 'deactivation-modal-button-submit' , $slug ) ); ?>');
429 + $modal.find('.button-deactivate').html('<?php echo esc_js( $submit_deactivate_text ) ?>');
216 430
217 - enableDeactivateButton();
218 -
219 431 if ( _parent.hasClass( 'has-internal-message' ) ) {
220 432 _parent.find( '.internal-message' ).show();
221 433 }
222 434
223 - if (_parent.hasClass('has-input')) {
435 + if ( ! _parent.hasClass('has-input') ) {
436 + toggleDeactivationButtonPrimary( true );
437 + } else {
438 + toggleDeactivationButtonPrimary( false );
439 +
224 440 var inputType = _parent.data('input-type'),
225 441 inputPlaceholder = _parent.data('input-placeholder'),
226 - reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" />' : '<textarea rows="5"></textarea>' ) + '</div>';
442 + reasonInputHtml = '<div class="reason-input"><span class="message"></span>' + ( ( 'textfield' === inputType ) ? '<input type="text" maxlength="128" />' : '<textarea rows="5" maxlength="128"></textarea>' ) + '</div>';
227 443
228 444 _parent.append($(reasonInputHtml));
229 445 _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
230 446
231 447 if (isOtherReasonSelected()) {
232 - showMessage('<?php printf( fs_text( 'ask-for-reason-message' , $slug ) ); ?>');
233 - disableDeactivateButton();
234 - }
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 + }
235 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 + }
236 459 });
237 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 +
238 503 // If the user has clicked outside the window, cancel it.
239 504 $modal.on('click', function (evt) {
240 505 var $target = $(evt.target);
241 506
@@ -244,13 +509,17 @@
244 509 return;
245 510 }
246 511
247 512 // If the user has not clicked the close button and the clicked element is inside the modal dialog, just return.
248 - if (!$target.hasClass('button-close') && ( $target.parents('.fs-modal-body').length > 0 || $target.parents('.fs-modal-footer').length > 0 )) {
513 + if (
514 + ! $target.hasClass( 'button-close' ) &&
515 + ( $target.parents( '.fs-modal-body' ).length > 0 || $target.parents( '.fs-modal-footer' ).length > 0 )
516 + ) {
249 517 return;
250 518 }
251 519
252 520 closeModal();
521 +
253 522 return false;
254 523 });
255 524 }
256 525
@@ -290,10 +559,8 @@
290 559
291 560 function resetModal() {
292 561 selectedReasonID = false;
293 562
294 - enableDeactivateButton();
295 -
296 563 // Uncheck all radio buttons.
297 564 $modal.find('input[type="radio"]').prop('checked', false);
298 565
299 566 // Remove all input fields ( textfield, textarea ).
@@ -300,10 +567,10 @@
300 567 $modal.find('.reason-input').remove();
301 568
302 569 $modal.find('.message').hide();
303 570
304 - if ( isAnonymous ) {
305 - $anonymousFeedback.find( 'input' ).prop( 'checked', false );
571 + if ( isAnonymous ) {
572 + $anonymousFeedback.find( 'input' ).prop( 'checked', <?php echo $fs->apply_filters( 'default_to_anonymous_feedback', false ) ? 'true' : 'false' ?> );
306 573
307 574 // Hide, since by default there is no selected reason.
308 575 $anonymousFeedback.hide();
309 576 }
@@ -313,16 +580,16 @@
313 580 /*
314 581 * If the modal dialog has no confirmation message, that is, it has only one panel, then ensure
315 582 * that clicking the deactivate button will actually deactivate the plugin.
316 583 */
317 - if ($modal.hasClass('no-confirmation-message')) {
318 - $deactivateButton.addClass('allow-deactivate');
584 + if ( $modal.hasClass( 'no-confirmation-message' ) ) {
585 + $deactivateButton.addClass( 'allow-deactivate' );
319 586
320 - showPanel('reasons');
587 + showPanel( 'reasons' );
321 588 } else {
322 - $deactivateButton.removeClass('allow-deactivate');
589 + $deactivateButton.removeClass( 'allow-deactivate' );
323 590
324 - showPanel('confirm');
591 + showPanel( 'confirm' );
325 592 }
326 593 }
327 594
328 595 function showMessage(message) {
@@ -328,31 +595,59 @@
328 595 function showMessage(message) {
329 596 $modal.find('.message').text(message).show();
330 597 }
331 598
332 - function enableDeactivateButton() {
333 - $modal.find('.button-deactivate').removeClass('disabled');
334 - }
599 + /**
600 + * @author Xiaheng Chen (@xhchen)
601 + *
602 + * @since 2.4.2
603 + */
604 + function changeDeactivateButtonText() {
605 + if ( ! isOtherReasonSelected()) {
606 + return;
607 + }
335 608
336 - function disableDeactivateButton() {
337 - $modal.find('.button-deactivate').addClass('disabled');
338 - }
609 + var
610 + $userReason = $modal.find('.reason-input input'),
611 + $deactivateButton = $modal.find('.button-deactivate');
339 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 +
340 625 function showPanel(panelType) {
341 - $modal.find('.fs-modal-panel').removeClass('active ');
342 - $modal.find('[data-panel-id="' + panelType + '"]').addClass('active');
626 + $modal.find( '.fs-modal-panel' ).removeClass( 'active' );
627 + $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' );
343 628
344 629 updateButtonLabels();
345 630 }
346 631
347 632 function updateButtonLabels() {
348 - var $deactivateButton = $modal.find('.button-deactivate');
633 + var $deactivateButton = $modal.find( '.button-deactivate' );
349 634
350 - // Reset the deactivate button's text.
351 - if ('confirm' === getCurrentPanel()) {
352 - $deactivateButton.text('<?php printf( fs_text( 'deactivation-modal-button-confirm' , $slug ) ); ?>');
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 + ) ) ?> );
353 643 } else {
354 - $deactivateButton.text('<?php printf( fs_text( 'skip-deactivate' , $slug ) ); ?>');
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 + ) ) ?> );
355 650 }
356 651 }
357 652
358 653 function getCurrentPanel() {
@@ -357,6 +652,15 @@
357 652
358 653 function getCurrentPanel() {
359 654 return $modal.find('.fs-modal-panel.active').attr('data-panel-id');
360 655 }
656 +
657 + /**
658 + * @author Leo Fajardo (@leorw)
659 + *
660 + * @since 2.3.0
661 + */
662 + function deactivateModule() {
663 + window.location.href = redirectLink;
664 + }
361 665 })(jQuery);
362 666 </script>