PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.1
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.1
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php +468 -338 3.1.33.7.1 View file →
@@ -39,9 +39,9 @@
39 39 * Where to send the data.
40 40 *
41 41 * @var string Endpoint url.
42 42 */
43 - const FEEDBACK_ENDPOINT = 'http://feedback.themeisle.com/wordpress/wp-json/__pirate_feedback_/v1/feedback';
43 + const FEEDBACK_ENDPOINT = 'https://api.themeisle.com/tracking/uninstall';
44 44
45 45 /**
46 46 * Default options for plugins.
47 47 *
@@ -53,9 +53,11 @@
53 53 'type' => 'text',
54 54 'placeholder' => 'What\'s the plugin\'s name?',
55 55 ),
56 56 'I could not get the plugin to work' => array(
57 - 'id' => 4,
57 + 'type' => 'textarea',
58 + 'placeholder' => 'What problem are you experiencing?',
59 + 'id' => 4,
58 60 ),
59 61 'I no longer need the plugin' => array(
60 62 'id' => 5,
61 63 'type' => 'textarea',
@@ -61,9 +63,11 @@
61 63 'type' => 'textarea',
62 64 'placeholder' => 'If you could improve one thing about our product, what would it be?',
63 65 ),
64 66 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
65 - 'id' => 6,
67 + 'type' => 'textarea',
68 + 'placeholder' => 'What problem are you experiencing?',
69 + 'id' => 6,
66 70 ),
67 71 );
68 72 /**
69 73 * Default options for theme.
@@ -74,9 +78,11 @@
74 78 'I don\'t know how to make it look like demo' => array(
75 79 'id' => 7,
76 80 ),
77 81 'It lacks options' => array(
78 - 'id' => 8,
82 + 'placeholder' => 'What option is missing?',
83 + 'type' => 'text',
84 + 'id' => 8,
79 85 ),
80 86 'Is not working with a plugin that I need' => array(
81 87 'id' => 9,
82 88 'type' => 'text',
@@ -94,9 +100,9 @@
94 100 private $other = array(
95 101 'Other' => array(
96 102 'id' => 999,
97 103 'type' => 'textarea',
98 - 'placeholder' => 'cmon cmon tell us',
104 + 'placeholder' => 'What can we do better?',
99 105 ),
100 106 );
101 107 /**
102 108 * Default heading for plugin.
@@ -102,15 +108,15 @@
102 108 * Default heading for plugin.
103 109 *
104 110 * @var string $heading_plugin The heading of the modal
105 111 */
106 - private $heading_plugin = 'Quick Feedback <span>Because we care about our clients, please leave us feedback.</span>';
112 + private $heading_plugin = 'What\'s wrong?';
107 113 /**
108 114 * Default heading for theme.
109 115 *
110 116 * @var string $heading_theme The heading of the modal
111 117 */
112 - private $heading_theme = 'Looking to change {theme}? <span> What does not work for you?</span>';
118 + private $heading_theme = 'What does not work for you in {theme}?';
113 119 /**
114 120 * Default submit button action text.
115 121 *
116 122 * @var string $button_submit The text of the deactivate button
@@ -125,440 +131,574 @@
125 131
126 132 /**
127 133 * Loads the additional resources
128 134 */
129 - function load_resources() {
130 - add_thickbox();
135 + public function load_resources() {
136 + $screen = get_current_screen();
131 137
132 - $id = $this->product->get_key() . '_deactivate';
138 + if ( ! $screen || ! in_array( $screen->id, array( 'theme-install', 'plugins' ) ) ) {
139 + return;
140 + }
133 141
134 - $this->add_css( $this->product->get_type(), $this->product->get_key() );
135 - $this->add_js( $this->product->get_type(), $this->product->get_key(), '#TB_inline?' . apply_filters( $this->product->get_key() . '_feedback_deactivate_attributes', 'width=600&height=550' ) . '&inlineId=' . $id );
142 + $this->add_feedback_popup_style();
136 143
137 - echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
144 + if ( $this->product->get_type() === 'theme' ) {
145 + $this->add_theme_feedback_drawer_js();
146 + $this->render_theme_feedback_popup();
147 +
148 + return;
149 + }
150 + $this->add_plugin_feedback_popup_js();
151 + $this->render_plugin_feedback_popup();
138 152 }
139 153
140 154 /**
141 - * Loads the css
142 - *
143 - * @param string $type The type of product.
144 - * @param string $key The product key.
155 + * Render theme feedback drawer.
145 156 */
146 - function add_css( $type, $key ) {
147 - $key = esc_attr( $key );
148 - $suffix = Product::THEME_TYPE === $type ? 'theme-install-php' : 'plugins-php';
149 - $icon = esc_attr( apply_filters( $this->product->get_slug() . '_uninstall_feedback_icon', '' ) );
150 - if ( empty( $icon ) ) {
151 - $icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkVDM0M4RkYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkVDM0M5MEYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2RUMzQzhERjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM2RUMzQzhFRjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KBNOswAAFtFJREFUeNrkWwmUXVWV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';
152 - }
157 + private function render_theme_feedback_popup() {
158 + $heading = str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
159 + $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', 'Submit' );
160 + $options = $this->options_theme;
161 + $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
162 + $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
163 +
164 + $options += $this->other;
165 +
153 166 ?>
154 - <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
155 - input[name="ti-deactivate-option"] ~ div {
156 - display: none;
167 + <div class="ti-theme-uninstall-feedback-drawer ti-feedback">
168 + <div class="popup--header">
169 + <h5><?php echo wp_kses( $heading, array( 'span' => true ) ); ?> </h5>
170 + <button class="toggle"><span>&times;</span></button>
171 + </div><!--/.popup--header-->
172 + <div class="popup--body">
173 + <?php $this->render_options_list( $options ); ?>
174 + </div><!--/.popup--body-->
175 + <div class="popup--footer">
176 + <div class="actions">
177 + <?php
178 + echo wp_kses_post( $info_disclosure_link );
179 + echo wp_kses_post( $this->get_disclosure_labels() );
180 + echo '<div class="buttons">';
181 + echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function has an internal sanitization.
182 + $button_submit,
183 + 'secondary',
184 + $this->product->get_key() . 'ti-deactivate-yes',
185 + false,
186 + array(
187 + 'data-after-text' => $button_submit,
188 + 'disabled' => true,
189 + )
190 + );
191 + echo '</div>';
192 + ?>
193 + </div><!--/.actions-->
194 + </div><!--/.popup--footer-->
195 + </div>
196 + <?php
197 + }
198 +
199 + /**
200 + * Add feedback styles.
201 + */
202 + private function add_feedback_popup_style() {
203 + ?>
204 + <style>
205 + .ti-feedback {
206 + background: #fff;
207 + max-width: 400px;
208 + z-index: 10000;
209 + box-shadow: 0 0 15px -5px rgba(0, 0, 0, .5);
210 + transition: all .3s ease-out;
157 211 }
158 212
159 - input[name="ti-deactivate-option"]:checked ~ div {
160 - display: block;
161 - }
162 213
163 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
164 - background: none !important;
214 + .ti-feedback .popup--header {
215 + position: relative;
216 + background-color: #23A1CE;
165 217 }
166 218
167 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
168 - background: url('<?php echo $icon; ?>') 40px 30px no-repeat;
169 - border: none;
170 - box-sizing: border-box;
171 - color: #373e40;
172 - font-size: 24px;
173 - font-weight: 700;
174 - height: 90px;
175 - padding: 40px 40px 0 120px;
176 - text-transform: uppercase;
177 - width: 100%;
219 + .ti-feedback .popup--header h5 {
220 + margin: 0;
221 + font-size: 16px;
222 + padding: 15px;
223 + color: #fff;
224 + font-weight: 600;
225 + text-align: center;
226 + letter-spacing: .3px;
178 227 }
179 228
180 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul i {
181 - padding-left: 5px;
182 - margin: 0 1px;
229 + .ti-feedback .popup--body {
230 + padding: 15px;
183 231 }
184 232
185 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul strong {
186 - width: 125px;
187 - display: block;
233 + .ti-feedback .popup--form {
188 234 margin: 0;
189 - float: left;
235 + font-size: 13px;
190 236 }
191 237
192 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul {
193 - margin-left: 39px;
194 - margin-top: 2px;
195 - padding-top: 0px;
238 + .ti-feedback .popup--form input[type="radio"] {
239 + <?php echo is_rtl() ? 'margin: 0 0 0 10px;' : 'margin: 0 10px 0 0;'; ?>
196 240 }
197 241
198 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content p {
199 - font-style: italic;
200 - margin-bottom: 0px;
242 + .ti-feedback .popup--form input[type="radio"]:checked ~ textarea {
243 + display: block;
201 244 }
202 245
203 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content {
246 + .ti-feedback .popup--form textarea {
247 + width: 100%;
248 + margin: 10px 0 0;
204 249 display: none;
250 + max-height: 150px;
205 251 }
206 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure-content {
207 - display: block;
208 - position:absolute;
209 - bottom: 100px;
252 +
253 + .ti-feedback li {
254 + display: flex;
255 + align-items: center;
256 + margin-bottom: 15px;
257 + flex-wrap: wrap;
210 258 }
211 259
212 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure {
213 - top: -130px;
260 + .ti-feedback li label {
261 + max-width: 90%;
214 262 }
215 263
216 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open {
217 - height: 590px !important;
264 + .ti-feedback li:last-child {
265 + margin-bottom: 0;
218 266 }
219 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure {
220 - position: absolute;
221 - top: -50px;
222 - font-size: 13px;
223 - color: #8d9192;
224 - font-weight: 400;
225 - right: 40px;
267 +
268 + .ti-feedback .popup--footer {
269 + padding: 0 15px 15px;
226 270 }
227 271
228 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
229 - box-sizing: border-box;
230 - padding: 30px 40px;
231 - background-color: #eaeaea;
272 + .ti-feedback .actions {
273 + display: flex;
274 + flex-wrap: wrap;
232 275 }
233 276
234 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button {
235 - background: #ec5d60;
236 - border: none;
237 - box-shadow: none;
238 - color: #ffffff;
239 - font-size: 15px;
240 - font-weight: 700;
241 - height: auto;
242 - line-height: 20px;
243 - padding: 10px 15px;
244 - text-transform: uppercase;
245 - -webkit-transition: 0.3s ease;
246 - -moz-transition: 0.3s ease;
247 - -ms-transition: 0.3s ease;
248 - -o-transition: 0.3s ease;
249 - transition: 0.3s ease;
277 + .info-disclosure-link {
278 + width: 100%;
279 + margin-bottom: 15px;
250 280 }
251 281
252 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary {
253 - background: transparent;
254 - box-shadow: none;
255 - color: #8d9192;
256 - font-weight: 400;
257 - float: right;
258 - line-height: 40px;
259 - padding: 0;
260 - text-decoration: underline;
261 - text-shadow: none;
262 - text-transform: none;
282 + .ti-feedback .info-disclosure-content {
283 + max-height: 0;
284 + overflow: hidden;
285 + width: 100%;
286 + transition: .3s ease;
263 287 }
264 288
265 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:hover {
266 - background: #e83f42;
289 + .ti-feedback .info-disclosure-content.active {
290 + max-height: 300px;
267 291 }
268 292
269 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
270 - background: transparent;
293 + .ti-feedback .info-disclosure-content p {
294 + margin: 0;
271 295 }
272 296
273 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:focus {
274 - box-shadow: none;
275 - outline: none;
297 + .ti-feedback .info-disclosure-content ul {
298 + margin: 10px 0;
299 + border-radius: 3px;
276 300 }
277 301
278 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:active {
279 - box-shadow: none;
280 - transform: translateY(0);
302 + .ti-feedback .info-disclosure-content ul li {
303 + display: flex;
304 + align-items: center;
305 + justify-content: space-between;
306 + margin-bottom: 0;
307 + padding: 5px 0;
308 + border-bottom: 1px solid #ccc;
281 309 }
282 310
283 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:disabled {
284 - cursor: not-allowed;
311 + .ti-feedback .buttons {
312 + display: flex;
313 + width: 100%;
285 314 }
286 315
287 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
288 - text-decoration: none;
316 + .ti-feedback .buttons input:last-child {
317 + <?php echo is_rtl() ? 'margin-right: auto;' : 'margin-left: auto;'; ?>
289 318 }
290 319
291 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
292 - background-color: #ffffff;
320 + .ti-theme-uninstall-feedback-drawer {
321 + border-top-left-radius: 5px;
322 + position: fixed;
323 + top: 100%;
324 + right: 15px;
293 325 }
294 326
295 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list {
296 - margin: 0;
327 + .ti-theme-uninstall-feedback-drawer.active {
328 + transform: translateY(-100%);
297 329 }
298 330
299 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
300 - color: #373e40;
301 - font-size: 13px;
302 - margin-bottom: 5px;
331 + .ti-theme-uninstall-feedback-drawer .popup--header {
332 + border-top-left-radius: 5px;
303 333 }
304 334
305 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li label {
306 - margin-left: 10px;
307 - line-height: 28px;
308 - font-size: 15px;
335 + .ti-theme-uninstall-feedback-drawer .popup--header .toggle {
336 + position: absolute;
337 + padding: 3px 0;
338 + width: 30px;
339 + top: -26px;
340 + right: 0;
341 + cursor: pointer;
342 + border-top-left-radius: 5px;
343 + border-top-right-radius: 5px;
344 + font-size: 20px;
345 + background-color: #23A1CE;
346 + color: #fff;
347 + border: none;
348 + line-height: 20px;
309 349 }
310 350
311 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list input[type=radio] {
312 - margin-top: 1px;
351 + .ti-theme-uninstall-feedback-drawer .toggle span {
352 + margin: 0;
353 + display: inline-block;
313 354 }
314 355
315 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxContent {
316 - box-sizing: border-box;
317 - height: auto !important;
318 - padding: 20px 40px;
319 - width: 100% !important;
356 + .ti-theme-uninstall-feedback-drawer:not(.active) .toggle span {
357 + transform: rotate(45deg);
320 358 }
321 359
322 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
323 - padding: 10px 15px;
324 - width: 100%;
360 + .ti-theme-uninstall-feedback-drawer .popup--header .toggle:hover {
361 + background-color: #1880a5;
325 362 }
326 363
327 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
328 - margin: 10px 30px;
329 - }
330 364
331 - .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
332 - box-sizing: border-box;
365 + .ti-plugin-uninstall-feedback-popup .popup--header:before {
366 + content: "";
333 367 display: block;
334 - float: none;
335 - font-weight: 700;
336 - line-height: 1;
337 - padding: 0;
338 - text-align: left;
339 - width: 100%;
368 + position: absolute;
369 + top: 50%;
370 + transform: translateY(-50%);
371 + <?php
372 + echo is_rtl() ?
373 + 'right: -10px;
374 + border-top: 20px solid transparent;
375 + border-left: 20px solid #23A1CE;
376 + border-bottom: 20px solid transparent;' :
377 + 'left: -10px;
378 + border-top: 20px solid transparent;
379 + border-right: 20px solid #23A1CE;
380 + border-bottom: 20px solid transparent;';
381 + ?>
340 382 }
341 383
342 - .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle span {
343 - color: #8d9192;
344 - display: block;
345 - font-size: 15px;
346 - font-weight: 400;
347 - margin-top: 5px;
348 - text-transform: none;
384 + .ti-plugin-uninstall-feedback-popup {
385 + display: none;
386 + position: absolute;
387 + white-space: normal;
388 + width: 400px;
389 + <?php echo is_rtl() ? 'right: calc( 100% + 15px );' : 'left: calc( 100% + 15px );'; ?>
390 + top: -15px;
349 391 }
350 392
351 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
393 + .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i {
394 + animation: rotation 2s infinite linear;
395 + display: block;
396 + float: none;
397 + align-items: center;
352 398 width: 100%;
353 - display: block;
354 - position: absolute;
355 - left: 0;
356 - bottom: 0;
399 + margin: 0 auto;
400 + height: 100%;
401 + background: transparent;
402 + padding: 0;
357 403 }
358 404
359 - .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
360 - font-size: 32px;
405 + .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i:before {
406 + padding: 0;
407 + background: transparent;
408 + box-shadow: none;
409 + color: #b4b9be
361 410 }
362 411
363 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
364 - color: #eee;
365 - }
366 412
367 - .<?php echo $key; ?>-container #TB_closeWindowButton {
368 - left: auto;
369 - right: -5px;
370 - top: -35px;
371 - color: #eee;
413 + .ti-plugin-uninstall-feedback-popup.active {
414 + display: block;
372 415 }
373 416
374 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
375 - text-align: right;
376 - line-height: 25px;
377 - width: 25px;
378 - height: 25px;
417 + tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>"] .deactivate {
418 + position: relative;
379 419 }
380 420
381 - .<?php echo $key; ?>-container #TB_closeWindowButton:focus .tb-close-icon {
382 - box-shadow: none;
383 - outline: none;
421 + body.ti-feedback-open .ti-feedback-overlay {
422 + content: "";
423 + display: block;
424 + background-color: rgba(0, 0, 0, 0.5);
425 + top: 0;
426 + bottom: 0;
427 + right: 0;
428 + left: 0;
429 + z-index: 10000;
430 + position: fixed;
384 431 }
385 432
386 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
387 - font: normal 25px dashicons;
388 - }
433 + @media (max-width: 768px) {
434 + .ti-plugin-uninstall-feedback-popup {
435 + position: fixed;
436 + max-width: 100%;
437 + margin: 0 auto;
438 + left: 50%;
439 + top: 50px;
440 + transform: translateX(-50%);
441 + }
389 442
390 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container {
391 - margin: auto !important;
392 - height: 500px !important;
393 - top: 0 !important;
394 - left: 0 !important;
395 - bottom: 0 !important;
396 - right: 0 !important;
397 - width: 600px !important;
443 + .ti-plugin-uninstall-feedback-popup .popup--header:before {
444 + display: none;
445 + }
398 446 }
399 447 </style>
400 448 <?php
401 - do_action( $this->product->get_key() . '_uninstall_feedback_after_css' );
402 449 }
403 450
404 451 /**
405 - * Loads the js.
406 - *
407 - * @param string $type The type of product.
408 - * @param string $key The product key.
409 - * @param string $src The url that will hijack the deactivate button url.
452 + * Theme feedback drawer JS.
410 453 */
411 - function add_js( $type, $key, $src ) {
412 - $heading = Product::PLUGIN_TYPE === $type ? $this->heading_plugin : str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
413 - $key = esc_attr( $key );
414 - $heading = apply_filters( $this->product->get_key() . '_feedback_deactivate_heading', $heading );
454 + private function add_theme_feedback_drawer_js() {
455 + $key = $this->product->get_key();
415 456 ?>
416 457 <script type="text/javascript" id="ti-deactivate-js">
417 458 (function ($) {
418 459 $(document).ready(function () {
419 - var auto_trigger = false;
420 - var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
460 + setTimeout(function () {
461 + $('.ti-theme-uninstall-feedback-drawer').addClass('active');
462 + }, <?php echo absint( self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000 ); ?> );
463 +
464 + $('.ti-theme-uninstall-feedback-drawer .toggle').on('click', function (e) {
465 + e.preventDefault();
466 + $('.ti-theme-uninstall-feedback-drawer').toggleClass('active');
467 + });
468 +
469 + $('.info-disclosure-link').on('click', function (e) {
470 + e.preventDefault();
471 + $('.info-disclosure-content').toggleClass('active');
472 + });
473 +
474 + $('.ti-theme-uninstall-feedback-drawer input[type="radio"]').on('change', function () {
475 + var radio = $(this);
476 + if (radio.parent().find('textarea').length > 0 &&
477 + radio.parent().find('textarea').val().length === 0) {
478 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
479 + radio.parent().find('textarea').on('keyup', function (e) {
480 + if ($(this).val().length === 0) {
481 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
482 + } else {
483 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
484 + }
485 + });
486 + } else {
487 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
488 + }
489 + });
490 +
491 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
492 + e.preventDefault();
493 + e.stopPropagation();
494 +
495 + var selectedOption = $(
496 + '.ti-theme-uninstall-feedback-drawer input[name="ti-deactivate-option"]:checked');
497 + $.post(ajaxurl, {
498 + 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
499 + 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
500 + 'id': selectedOption.parent().attr('ti-option-id'),
501 + 'msg': selectedOption.parent().find('textarea').val(),
502 + 'type': 'theme',
503 + 'key': '<?php echo esc_attr( $key ); ?>'
504 + });
505 + $('.ti-theme-uninstall-feedback-drawer').fadeOut();
506 + });
507 + });
508 + })(jQuery);
509 +
510 + </script>
511 + <?php
512 + do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
513 + }
514 +
515 + /**
516 + * Render the options list.
517 + *
518 + * @param array $options the options for the feedback form.
519 + */
520 + private function render_options_list( $options ) {
521 + $key = $this->product->get_key();
522 + $inputs_row_map = [
523 + 'text' => 1,
524 + 'textarea' => 2,
525 + ];
526 + ?>
527 + <ul class="popup--form">
528 + <?php foreach ( $options as $title => $attributes ) { ?>
529 + <li ti-option-id="<?php echo esc_attr( $attributes['id'] ); ?>">
530 + <input type="radio" name="ti-deactivate-option" id="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
531 + <label for="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
532 + <?php echo esc_attr( str_replace( '{theme}', $this->product->get_name(), $title ) ); ?>
533 + </label>
421 534 <?php
422 - if ( 'theme' === $type ) {
423 - ?>
424 - auto_trigger = true;
425 - if ($('a.ti-auto-anchor').length == 0) {
426 - $('body').append($('<a class="ti-auto-anchor" href=""></a>'));
535 + if ( array_key_exists( 'type', $attributes ) ) {
536 + $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
537 + echo '<textarea width="100%" rows="' . esc_attr( $inputs_row_map[ $attributes['type'] ] ) . '" name="comments" placeholder="' . esc_attr( $placeholder ) . '"></textarea>';
427 538 }
428 - target_element = 'a.ti-auto-anchor';
429 - <?php
430 - }
431 539 ?>
540 + </li>
541 + <?php } ?>
542 + </ul>
543 + <?php
544 + }
432 545
433 - if (auto_trigger) {
434 - setTimeout(function () {
435 - $('a.ti-auto-anchor').trigger('click');
436 - }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
546 + /**
547 + * Render plugin feedback popup.
548 + */
549 + private function render_plugin_feedback_popup() {
550 + $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
551 + $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $this->button_submit );
552 + $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $this->options_plugin ) );
553 + $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
554 +
555 + $options += $this->other;
556 + ?>
557 + <div class="ti-plugin-uninstall-feedback-popup ti-feedback" id="<?php echo esc_attr( $this->product->get_slug() . '_uninstall_feedback_popup' ); ?>">
558 + <div class="popup--header">
559 + <h5><?php echo wp_kses( $this->heading_plugin, array( 'span' => true ) ); ?> </h5>
560 + </div><!--/.popup--header-->
561 + <div class="popup--body">
562 + <?php $this->render_options_list( $options ); ?>
563 + </div><!--/.popup--body-->
564 + <div class="popup--footer">
565 + <div class="actions">
566 + <?php
567 + echo wp_kses_post( $info_disclosure_link );
568 + echo wp_kses_post( $this->get_disclosure_labels() );
569 + echo '<div class="buttons">';
570 + echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
571 + $button_cancel,
572 + 'secondary',
573 + $this->product->get_key() . 'ti-deactivate-no',
574 + false
575 + );
576 + echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
577 + $button_submit,
578 + 'primary',
579 + $this->product->get_key() . 'ti-deactivate-yes',
580 + false,
581 + array(
582 + 'data-after-text' => $button_submit,
583 + 'disabled' => true,
584 + )
585 + );
586 + echo '</div>';
587 + ?>
588 + </div><!--/.actions-->
589 + </div><!--/.popup--footer-->
590 + </div>
591 +
592 + <?php
593 + }
594 +
595 + /**
596 + * Add plugin feedback popup JS
597 + */
598 + private function add_plugin_feedback_popup_js() {
599 + $popup_id = '#' . $this->product->get_slug() . '_uninstall_feedback_popup';
600 + $key = $this->product->get_key();
601 + ?>
602 + <script type="text/javascript" id="ti-deactivate-js">
603 + (function ($) {
604 + $(document).ready(function () {
605 + var targetElement = 'tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>/"] span.deactivate a';
606 + var redirectUrl = $(targetElement).attr('href');
607 + if ($('.ti-feedback-overlay').length === 0) {
608 + $('body').prepend('<div class="ti-feedback-overlay"></div>');
437 609 }
438 - $(document).on('thickbox:removed', function () {
439 - $.post(ajaxurl, {
440 - 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
441 - 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
442 - 'type': '<?php echo $type; ?>',
443 - 'key': '<?php echo $key; ?>'
610 + $('<?php echo esc_attr( $popup_id ); ?> ').appendTo($(targetElement).parent());
611 +
612 + $(targetElement).on('click', function (e) {
613 + e.preventDefault();
614 + $('<?php echo esc_attr( $popup_id ); ?> ').addClass('active');
615 + $('body').addClass('ti-feedback-open');
616 + $('.ti-feedback-overlay').on('click', function () {
617 + $('<?php echo esc_attr( $popup_id ); ?> ').removeClass('active');
618 + $('body').removeClass('ti-feedback-open');
444 619 });
445 620 });
446 - var href = $(target_element).attr('href');
447 - $('#<?php echo $key; ?>ti-deactivate-no').attr('data-ti-action', href).on('click', function (e) {
621 +
622 + $('<?php echo esc_attr( $popup_id ); ?> .info-disclosure-link').on('click', function (e) {
448 623 e.preventDefault();
449 - e.stopPropagation();
450 -
451 - $('body').unbind('thickbox:removed');
452 - tb_remove();
453 - var redirect = $(this).attr('data-ti-action');
454 - if (redirect !== '') {
455 - location.href = redirect;
456 - }
624 + $(this).parent().find('.info-disclosure-content').toggleClass('active');
457 625 });
458 626
459 - $('#<?php echo $key; ?> ul.ti-list label, #<?php echo $key; ?> ul.ti-list input[name="ti-deactivate-option"]').on('click', function (e) {
460 - $('#<?php echo $key; ?>ti-deactivate-yes').val($('#<?php echo $key; ?>ti-deactivate-yes').attr('data-after-text'));
461 -
462 - var radio = $(this).prop('tagName') === 'LABEL' ? $(this).parent() : $(this);
463 - if (radio.parent().find('textarea').length > 0 && radio.parent().find('textarea').val().length === 0) {
464 - $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
465 - radio.parent().find('textarea').on('keyup', function (ee) {
627 + $('<?php echo esc_attr( $popup_id ); ?> input[type="radio"]').on('change', function () {
628 + var radio = $(this);
629 + if (radio.parent().find('textarea').length > 0 &&
630 + radio.parent().find('textarea').val().length === 0) {
631 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
632 + radio.parent().find('textarea').on('keyup', function (e) {
466 633 if ($(this).val().length === 0) {
467 - $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
634 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
468 635 } else {
469 - $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
636 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
470 637 }
471 638 });
472 639 } else {
473 - $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
640 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
474 641 }
475 642 });
476 - $("#<?php echo $key; ?>-info-disclosure").on('click', function () {
477 - $("#TB_window").toggleClass("<?php echo $key; ?>-container-disc-open");
478 - return false;
479 - });
480 - $('#<?php echo $key; ?>ti-deactivate-yes').attr('data-ti-action', href).on('click', function (e) {
643 +
644 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-no').on('click', function (e) {
481 645 e.preventDefault();
482 646 e.stopPropagation();
483 - $.post(ajaxurl, {
484 - 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
485 - 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
486 - 'id': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().attr('ti-option-id'),
487 - 'msg': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().find('textarea').val(),
488 - 'type': '<?php echo $type; ?>',
489 - });
490 - var redirect = $(this).attr('data-ti-action');
491 - if (redirect != '') {
492 - location.href = redirect;
493 - } else {
494 - $('body').unbind('thickbox:removed');
495 - tb_remove();
647 + $(targetElement).unbind('click');
648 + $('body').removeClass('ti-feedback-open');
649 + $('<?php echo esc_attr( $popup_id ); ?>').remove();
650 + if (redirectUrl !== '') {
651 + location.href = redirectUrl;
496 652 }
497 653 });
498 654
499 - $(target_element).attr('name', '<?php echo wp_kses( $heading, array( 'span' => array() ) ); ?>').attr('href', '<?php echo $src; ?>').addClass('thickbox');
500 - var thicbox_timer;
501 - $(target_element).on('click', function () {
502 - tiBindThickbox();
655 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
656 + e.preventDefault();
657 + e.stopPropagation();
658 + $(targetElement).unbind('click');
659 + var selectedOption = $(
660 + '<?php echo esc_attr( $popup_id ); ?> input[name="ti-deactivate-option"]:checked');
661 + var data = {
662 + 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
663 + 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
664 + 'id': selectedOption.parent().attr('ti-option-id'),
665 + 'msg': selectedOption.parent().find('textarea').val(),
666 + 'type': 'plugin',
667 + 'key': '<?php echo esc_attr( $key ); ?>'
668 + };
669 + $.ajax({
670 + type: 'POST',
671 + url: ajaxurl,
672 + data: data,
673 + complete() {
674 + $('body').removeClass('ti-feedback-open');
675 + $('<?php echo esc_attr( $popup_id ); ?>').remove();
676 + if (redirectUrl !== '') {
677 + location.href = redirectUrl;
678 + }
679 + },
680 + beforeSend() {
681 + $('<?php echo esc_attr( $popup_id ); ?>').addClass('sending-feedback');
682 + $('<?php echo esc_attr( $popup_id ); ?> .popup--footer').remove();
683 + $('<?php echo esc_attr( $popup_id ); ?> .popup--body').html('<i class="dashicons dashicons-update-alt"></i>');
684 + }
685 + });
503 686 });
504 -
505 - function tiBindThickbox() {
506 - var thicbox_timer = setTimeout(function () {
507 - if ($("#<?php echo esc_html( $key ); ?>").is(":visible")) {
508 - $("body").trigger('thickbox:iframe:loaded');
509 - $("#TB_window").addClass("<?php echo $key; ?>-container");
510 - clearTimeout(thicbox_timer);
511 - $('body').unbind('thickbox:removed');
512 - } else {
513 - tiBindThickbox();
514 - }
515 - }, 100);
516 - }
517 687 });
518 688 })(jQuery);
689 +
519 690 </script>
520 691 <?php
521 -
522 692 do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
523 693 }
524 694
525 695 /**
526 - * Generates the HTML.
696 + * Get the disclosure labels markup.
527 697 *
528 - * @param string $type The type of product.
529 - * @param string $key The product key.
698 + * @return string
530 699 */
531 - function get_html( $type, $key ) {
532 - $options = Product::PLUGIN_TYPE === $type ? $this->options_plugin : $this->options_theme;
533 - $button_cancel = Product::PLUGIN_TYPE === $type ? $this->button_cancel : 'Skip';
534 - $button_submit = Product::PLUGIN_TYPE === $type ? $this->button_submit : 'Submit';
535 - $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
536 - $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $button_submit );
537 - $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $button_cancel );
538 -
539 - $options += $this->other;
540 -
541 - $list = '';
542 - foreach ( $options as $title => $attributes ) {
543 - $id = $attributes['id'];
544 - $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
545 - if ( array_key_exists( 'type', $attributes ) ) {
546 - $list .= '<div>';
547 - $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
548 - switch ( $attributes['type'] ) {
549 - case 'text':
550 - $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
551 - break;
552 - case 'textarea':
553 - $list .= '<textarea style="width: 100%" rows="2" name="comments" placeholder="' . $placeholder . '"></textarea>';
554 - break;
555 - }
556 - $list .= '</div>';
557 - }
558 - $list .= '</li>';
559 - }
560 -
700 + private function get_disclosure_labels() {
561 701 $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
562 702 $disclosure_labels = array_merge(
563 703 [
564 704 'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No domain name, email address or IP addresses are transmited after you submit the survey.',
@@ -563,38 +703,22 @@
563 703 [
564 704 'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No domain name, email address or IP addresses are transmited after you submit the survey.',
565 705 'items' => [
566 706 sprintf( '%s %s version %s %s %s %s', '<strong>', ucwords( $this->product->get_type() ), '</strong>', '<code>', $this->product->get_version(), '</code>' ),
567 - sprintf( '%s Uninstall reason %s %s Selected reson from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
707 + sprintf( '%sCurrent website:%s %s %s %s', '<strong>', '</strong>', '<code>', get_site_url(), '</code>' ),
708 + sprintf( '%s Uninstall reason %s %s Selected reason from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
568 709 ],
569 710 ],
570 711 $disclosure_new_labels
571 712 );
572 713
573 - $info_disclosure_link = '<a href="#" id="' . $this->product->get_key() . '-info-disclosure">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
574 - $info_disclosure_content = '<div id="' . $this->product->get_key() . '-info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
714 + $info_disclosure_content = '<div class="info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
575 715 foreach ( $disclosure_labels['items'] as $disclosure_item ) {
576 716 $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
577 717 }
578 718 $info_disclosure_content .= '</ul></div>';
579 719
580 - return
581 - '<div id="' . $this->product->get_key() . '"><ul class="ti-list">' . $list . '</ul>'
582 - . $info_disclosure_content
583 - . '<div class="actions">'
584 - . get_submit_button(
585 - $button_submit,
586 - 'secondary',
587 - $this->product->get_key() . 'ti-deactivate-yes',
588 - false,
589 - array(
590 - 'data-after-text' => $button_submit,
591 - 'disabled' => true,
592 - )
593 - )
594 - . wp_kses_post( $info_disclosure_link )
595 - . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
596 - . '</div></div>';
720 + return $info_disclosure_content;
597 721 }
598 722
599 723 /**
600 724 * Randomizes the options array.
@@ -600,9 +724,9 @@
600 724 * Randomizes the options array.
601 725 *
602 726 * @param array $options The options array.
603 727 */
604 - function randomize_options( $options ) {
728 + public function randomize_options( $options ) {
605 729 $new = array();
606 730 $keys = array_keys( $options );
607 731 shuffle( $keys );
608 732
@@ -615,9 +739,9 @@
615 739
616 740 /**
617 741 * Called when the deactivate button is clicked.
618 742 */
619 - function post_deactivate() {
743 + public function post_deactivate() {
620 744 check_ajax_referer( (string) __CLASS__, 'nonce' );
621 745
622 746 $this->post_deactivate_or_cancel();
623 747
@@ -629,10 +753,10 @@
629 753 }
630 754 $this->call_api(
631 755 array(
632 756 'type' => 'deactivate',
633 - 'id' => $_POST['id'],
634 - 'comment' => isset( $_POST['msg'] ) ? $_POST['msg'] : '',
757 + 'id' => sanitize_key( $_POST['id'] ),
758 + 'comment' => isset( $_POST['msg'] ) ? sanitize_textarea_field( $_POST['msg'] ) : '',
635 759 )
636 760 );
637 761 wp_send_json( [] );
638 762
@@ -641,16 +765,16 @@
641 765 /**
642 766 * Called when the deactivate/cancel button is clicked.
643 767 */
644 768 private function post_deactivate_or_cancel() {
645 - if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) {
769 + if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
646 770 return;
647 771 }
648 - if ( 'theme' !== $_POST['type'] ) {
772 + if ( 'theme' !== $_POST['type'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
649 773 return;
650 774 }
651 775
652 - set_transient( 'ti_sdk_pause_' . $_POST['key'], true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );
776 + set_transient( 'ti_sdk_pause_' . sanitize_text_field( $_POST['key'] ), true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );//phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
653 777
654 778 }
655 779
656 780 /**
@@ -664,8 +788,9 @@
664 788 $slug = $this->product->get_slug();
665 789 $version = $this->product->get_version();
666 790 $attributes['slug'] = $slug;
667 791 $attributes['version'] = $version;
792 + $attributes['url'] = get_site_url();
668 793
669 794 $response = wp_remote_post(
670 795 self::FEEDBACK_ENDPOINT,
671 796 array(
@@ -718,8 +843,13 @@
718 843 *
719 844 * @return Uninstall_Feedback Current module instance.
720 845 */
721 846 public function load( $product ) {
847 +
848 + if ( apply_filters( $product->get_key() . '_hide_uninstall_feedback', false ) ) {
849 + return;
850 + }
851 +
722 852 $this->product = $product;
723 853 add_action( 'admin_head', array( $this, 'load_resources' ) );
724 854 add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
725 855