PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.3.0
ShopBuilder – WooCommerce Builder For Elementor v3.3.0
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
← All changes | app/Controllers/Admin/PluginRow.php +259 -48 3.2.63.3.0 View file →
@@ -107,14 +107,12 @@
107 107 <div id="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>" title="Quick Feedback">
108 108 <!-- Modal content -->
109 109 <div class="modal-content">
110 110 <div id="feedback-form-body-<?php echo esc_attr( $this->textdomain ); ?>">
111 - <p style="margin: 0 0 15px 0;">
111 + <p class="rtsb-deactivate-intro" style="margin: 0 0 15px 0;">
112 112 Having trouble? <br/>
113 113 For faster and more accurate support, please
114 - <a target="_blank" href="https://www.radiustheme.com/contact/" style="text-decoration: none;">
115 - <span style="color: red">open a support ticket</span>
116 - </a>
114 + <a target="_blank" href="https://www.radiustheme.com/contact/" class="rtsb-support-link">open a support ticket</a>
117 115 — our support agent will personally review and resolve your issue.
118 116 </p>
119 117
120 118 <div class="feedback-input-header">
@@ -155,16 +153,18 @@
155 153 temporary deactivation</label>
156 154 </div>
157 155 <span style="color:red;font-size: 13px;"></span>
158 156 </div>
159 - <p style="margin: 10px 0 15px 0;">
160 - Please let us know about any issues you are facing with the plugin.
161 - How can we improve the plugin?
162 - </p>
163 - <div class="feedback-text-wrapper-<?php echo esc_attr( $this->textdomain ); ?>">
164 - <textarea id="deactivation-feedback-<?php echo esc_attr( $this->textdomain ); ?>" rows="4" cols="40"
165 - placeholder=" Write something here. How can we improve the plugin?"></textarea>
166 - <span style="display: block;color:red;font-size: 13px;margin-top: 5px;"></span>
157 + <div class="rtsb-feedback-extra" style="display:none;">
158 + <p style="margin: 10px 0 15px 0;">
159 + Please let us know about any issues you are facing with the plugin.
160 + How can we improve the plugin?
161 + </p>
162 + <div class="feedback-text-wrapper-<?php echo esc_attr( $this->textdomain ); ?>">
163 + <textarea id="deactivation-feedback-<?php echo esc_attr( $this->textdomain ); ?>" rows="2" cols="40"
164 + placeholder=" Write something here. How can we improve the plugin?"></textarea>
165 + <span style="display: block;color:red;font-size: 13px;margin-top: 5px;"></span>
166 + </div>
167 167 </div>
168 168 </div>
169 169 </div>
170 170 <?php
@@ -226,37 +226,19 @@
226 226 margin: auto;
227 227 padding: 0;
228 228 }
229 229
230 - div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> p {
231 - font-size: 15px;
232 - }
233 -
234 230 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content > * {
235 231 width: 100%;
236 232 overflow: hidden;
237 233 }
238 234
239 - #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea {
240 - border: 1px solid rgba(0, 0, 0, 0.3);
241 - padding: 15px;
242 - width: 100%;
243 - }
244 -
245 - #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea:focus {
246 - border-color: #2271b1;
247 - }
248 -
249 235 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input.feedback-feedback-text {
250 - border: 1px solid rgba(0, 0, 0, 0.3);
236 + border: 1px solid #cbd5e1;
251 237 min-width: 250px;
238 + border-radius: 6px;
252 239 }
253 240
254 - /* The Close Button */
255 - #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"] {
256 - margin: 0;
257 - }
258 -
259 241 .ui-dialog-title {
260 242 font-size: 18px;
261 243 font-weight: 600;
262 244 }
@@ -302,9 +284,15 @@
302 284
303 285 .ui-dialog[aria-describedby="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>"] {
304 286 background-color: #fefefe;
305 287 box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
306 - z-index: 99;
288 + z-index: 9999;
289 + position: fixed !important;
290 + top: 50% !important;
291 + left: 50% !important;
292 + transform: translate(-50%, -50%) !important;
293 + max-height: 90vh;
294 + overflow-y: auto;
307 295 }
308 296
309 297 .ui-dialog[aria-describedby="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>"] .ui-dialog-title {
310 298 text-transform: uppercase;
@@ -317,15 +305,44 @@
317 305 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> {
318 306 padding: 30px !important;
319 307 }
320 308
309 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-support-link {
310 + display: inline-block;
311 + padding: 2px 8px;
312 + margin: 0 2px;
313 + background: rgba(216, 14, 14, 0.08);
314 + color: #d80e0e;
315 + font-weight: 600;
316 + border-radius: 4px;
317 + text-decoration: none;
318 + border: 1px solid rgba(216, 14, 14, 0.25);
319 + transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
320 + }
321 +
322 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-support-link:hover,
323 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-support-link:focus {
324 + background: #d80e0e;
325 + color: #fff;
326 + border-color: #d80e0e;
327 + text-decoration: none;
328 + outline: none;
329 + }
330 +
321 331 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .feedback-input-header {
322 332 font-weight: 600;
323 - font-size: 15px;
324 - line-height: 1.4;
325 - margin-bottom: 20px;
333 + font-size: 14px;
334 + line-height: 1.5;
335 + margin-bottom: 16px;
336 + color: #1f2937;
326 337 }
327 338
339 + div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> p {
340 + font-size: 14px;
341 + color: #4b5563;
342 + line-height: 1.55;
343 + }
344 +
328 345 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>,
329 346 .ui-draggable .ui-dialog-titlebar {
330 347 padding: 18px 15px;
331 348 box-shadow: 0 0 3px rgba(0, 0, 0, 0.1);
@@ -332,33 +349,143 @@
332 349 text-align: left;
333 350 }
334 351
335 352 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper {
336 - margin-bottom: 8px;
353 + margin-bottom: 6px;
337 354 display: flex;
338 355 align-items: center;
339 - gap: 8px;
340 - /*line-height: 2;*/
341 - padding: 0 1px;
356 + gap: 10px;
357 + padding: 10px 12px;
342 358 font-size: 14px;
359 + border: 1px solid #e5e7eb;
360 + border-radius: 8px;
361 + background: #fff;
362 + cursor: pointer;
363 + transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
343 364 }
344 365
366 + div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper:hover {
367 + border-color: #4360ef;
368 + background: rgba(67, 96, 239, 0.04);
369 + }
370 +
371 + div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper:has(input[type="radio"]:checked) {
372 + border-color: #4360ef;
373 + background: rgba(67, 96, 239, 0.06);
374 + }
375 +
376 + div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper .feedback-label {
377 + flex: 1;
378 + cursor: pointer;
379 + user-select: none;
380 + color: #1f2937;
381 + font-weight: 500;
382 + line-height: 1.4;
383 + }
384 +
385 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"] {
386 + appearance: none;
387 + -webkit-appearance: none;
388 + width: 18px;
389 + height: 18px;
390 + border: 1.5px solid #cbd5e1;
391 + border-radius: 50%;
392 + background: #fff;
393 + cursor: pointer;
394 + position: relative;
395 + flex: 0 0 auto;
396 + box-sizing: border-box;
397 + outline: none;
398 + box-shadow: none;
399 + transition: border-color 0.15s ease;
400 + }
401 +
402 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:hover,
403 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:focus,
404 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:focus-visible,
405 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:active {
406 + outline: none;
407 + box-shadow: none;
408 + }
409 +
410 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:hover {
411 + border-color: #94a3b8;
412 + }
413 +
414 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked {
415 + border-color: #4360ef;
416 + outline: none;
417 + box-shadow: none;
418 + }
419 +
420 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked::after {
421 + content: '';
422 + position: absolute;
423 + top: 50%;
424 + left: 50%;
425 + transform: translate(-50%, -50%);
426 + width: 8px;
427 + height: 8px;
428 + border-radius: 50%;
429 + background: #4360ef;
430 + }
431 +
345 432 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional {
346 433 flex-wrap: wrap;
347 434 }
348 435
349 436 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional .feedback-feedback-text {
350 - flex: 0 0 calc(100% - 24px);
351 - margin: 5px 0 10px 24px;
352 - min-height: 40px;
353 - border: 1px solid rgba(0, 0, 0, 0.3);
354 - padding: 0 15px;
437 + flex: 0 0 calc(100% - 28px);
438 + margin: 8px 0 0 28px;
439 + min-height: 38px;
440 + border: 1px solid #cbd5e1;
441 + border-radius: 6px;
442 + padding: 0 12px;
443 + font-size: 13px;
444 + transition: border-color 0.15s ease, box-shadow 0.15s ease;
355 445 }
356 446
357 447 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional .feedback-feedback-text:focus {
358 - border-color: #2271b1;
448 + border-color: #4360ef;
449 + outline: none;
450 + box-shadow: 0 0 0 3px rgba(67, 96, 239, 0.15);
359 451 }
360 452
453 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-feedback-extra {
454 + margin: 6px 0 10px;
455 + padding: 12px 14px;
456 + background: #f8fafc;
457 + border: 1px dashed #cbd5e1;
458 + border-radius: 8px;
459 + }
460 +
461 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-feedback-extra p {
462 + margin: 0 0 8px !important;
463 + font-size: 13px !important;
464 + font-weight: 500;
465 + color: #4b5563;
466 + line-height: 1.4;
467 + }
468 +
469 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea {
470 + border: 1px solid #cbd5e1;
471 + border-radius: 6px;
472 + padding: 8px 10px;
473 + width: 100%;
474 + min-height: 56px;
475 + max-height: 120px;
476 + font-size: 13px;
477 + line-height: 1.45;
478 + resize: vertical;
479 + transition: border-color 0.15s ease, box-shadow 0.15s ease;
480 + }
481 +
482 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea:focus {
483 + border-color: #4360ef;
484 + outline: none;
485 + box-shadow: 0 0 0 3px rgba(67, 96, 239, 0.15);
486 + }
487 +
361 488 .ui-widget-overlay.ui-front {
362 489 position: fixed;
363 490 top: 0;
364 491 left: 0;
@@ -410,8 +537,35 @@
410 537 .ui-dialog[aria-describedby="deactivation-dialog-shopbuilder"] .ui-dialog-buttonset .ui-button:last-child:hover {
411 538 background: #d80e0e;
412 539 color: #fff;
413 540 }
541 +
542 + /* Loading overlay shown while submitting feedback / deactivating. */
543 + .rtsb-deactivate-loader {
544 + position: absolute;
545 + inset: 0;
546 + display: flex;
547 + align-items: center;
548 + justify-content: center;
549 + background: rgba(255, 255, 255, 0.72);
550 + z-index: 100;
551 + border-radius: inherit;
552 + }
553 +
554 + .rtsb-deactivate-loader .rtsb-deactivate-spinner {
555 + width: 40px;
556 + height: 40px;
557 + border: 3px solid rgba(67, 96, 239, 0.2);
558 + border-top-color: #4360ef;
559 + border-radius: 50%;
560 + animation: rtsb-deactivate-spin 0.8s linear infinite;
561 + }
562 +
563 + @keyframes rtsb-deactivate-spin {
564 + to {
565 + transform: rotate(360deg);
566 + }
567 + }
414 568 </style>
415 569
416 570 <?php
417 571 }
@@ -432,8 +586,9 @@
432 586 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').hide();
433 587 var dialogbox = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>').dialog({
434 588 modal: true,
435 589 width: 550,
590 + position: { my: "center", at: "center", of: window },
436 591 show: {
437 592 effect: "fadeIn",
438 593 duration: 400
439 594 },
@@ -446,18 +601,49 @@
446 601 Submit: function () {
447 602 submitFeedback();
448 603 },
449 604 Cancel: function () {
450 - $(this).dialog('close');
605 + showDeactivateLoader();
451 606 window.location.href = href;
452 607 }
453 608 }
454 609 });
455 610
611 + // Keep the dialog centered on window resize.
612 + $(window).off('resize.rtsbDeactivate').on('resize.rtsbDeactivate', function () {
613 + if ( dialogbox.dialog('instance') ) {
614 + dialogbox.dialog('option', 'position', { my: 'center', at: 'center', of: window });
615 + }
616 + });
456 617
618 +
619 + // Make the entire feedback-input-wrapper card clickable to select its radio.
620 + dialogbox.on('click', '.feedback-input-wrapper', function (event) {
621 + // Ignore clicks on the inner radio/label (native behavior handles them) and the
622 + // "Found a better plugin" name input so typing inside it doesn't re-toggle.
623 + if ( $(event.target).is('input, label') ) {
624 + return;
625 + }
626 + var $radio = $(this).find('input[type="radio"]');
627 + if ( $radio.length && ! $radio.prop('checked') ) {
628 + $radio.prop('checked', true).trigger('change');
629 + }
630 + });
631 +
457 632 // Close the dialog when clicking outside of it
458 633 dialogbox.on('change', 'input[type="radio"]', function (event) {
459 - var reasons = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked').val();
634 + var $extra = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .rtsb-feedback-extra');
635 + var $selectedRow = $(this).closest('.feedback-input-wrapper');
636 + var reasons = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked').val();
637 + // Temporary deactivation does not need a feedback message — keep the textarea hidden.
638 + if ( 'temporary_deactivation' === reasons ) {
639 + $extra.stop( true, true ).slideUp(200);
640 + } else if ( $selectedRow.length ) {
641 + // Move the feedback textarea so it appears directly below the selected radio.
642 + $extra.hide().insertAfter( $selectedRow ).slideDown(200);
643 + } else {
644 + $extra.slideDown(200);
645 + }
460 646 if( 'found_a_better_plugin' === reasons ){
461 647 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').show();
462 648 } else {
463 649 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').hide();
@@ -475,8 +661,22 @@
475 661 $('.ui-dialog-buttonpane button:contains("Submit")').text('Submit & Deactivate');
476 662 $('.ui-dialog-buttonpane button:contains("Cancel")').text('Skip & Deactivate');
477 663 });
478 664
665 + // Show a loading spinner over the dialog while submitting /
666 + // deactivating, and lock the footer buttons to avoid double clicks.
667 + function showDeactivateLoader() {
668 + var $content = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>');
669 + if ( ! $content.length || ! $content.hasClass('ui-dialog-content') ) {
670 + return;
671 + }
672 + var $widget = $content.dialog('widget');
673 + if ( ! $widget.find('.rtsb-deactivate-loader').length ) {
674 + $widget.append('<div class="rtsb-deactivate-loader"><span class="rtsb-deactivate-spinner"></span></div>');
675 + }
676 + $widget.find('.ui-dialog-buttonpane button').prop('disabled', true);
677 + }
678 +
479 679 // Submit the feedback
480 680 function submitFeedback() {
481 681 var href = $('.deactivate #deactivate-shopbuilder').attr('href');
482 682 var reasons = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked').val();
@@ -503,25 +703,34 @@
503 703 return;
504 704 }
505 705
506 706 if ('temporary_deactivation' === reasons || ! feedback ) {
707 + showDeactivateLoader();
507 708 window.location.href = href;
508 709 return;
509 710 }
510 711
511 712 if ( ! feedback.length > 0 ) {
713 + showDeactivateLoader();
512 714 window.location.href = href;
513 715 return;
514 716 }
515 717 var websiteUrl = '<?php echo esc_url( home_url() ); ?>';
516 718 if ( ! websiteUrl.length > 0 ) {
719 + showDeactivateLoader();
517 720 window.location.href = href;
518 721 return;
519 722 }
723 + showDeactivateLoader();
520 724 $.ajax({
521 725 url: 'https://shopbuilderwp.com/wp-json/RadiusTheme/pluginSurvey/v1/Survey/appendToSheet',
522 726 method: 'GET',
523 727 dataType: 'json',
728 + // Feedback is best-effort: if the endpoint is slow/unreachable,
729 + // fail fast so the user isn't stuck on the loader. `complete`
730 + // runs on success, error and timeout, so deactivation always
731 + // proceeds (redirects to the deactivate link) regardless.
732 + timeout: 5000,
524 733 data: {
525 734 website: websiteUrl,
526 735 reasons: reasons ? reasons : '',
527 736 better_plugin: better_plugin,
@@ -526,8 +735,10 @@
526 735 reasons: reasons ? reasons : '',
527 736 better_plugin: better_plugin,
528 737 feedback: feedback,
529 738 wpplugin: 'ShopBuilder',
739 + version: '<?php echo esc_js( defined( 'RTSB_VERSION' ) ? RTSB_VERSION : '' ); ?>',
740 + date: '<?php echo esc_js( gmdate( 'M j, Y' ) ); ?>',
530 741 },
531 742 success: function (response) {
532 743 },
533 744 error: function (xhr, status, error) {