PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.2.0
ShopBuilder – WooCommerce Builder For Elementor v3.2.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 +46 -274 3.4.23.2.0 View file →
@@ -48,20 +48,10 @@
48 48 $new_links[] = '<a target="_blank" href="' . esc_url( 'https://shopbuilderwp.com/docs/' ) . '">' . esc_html__( 'Documentation', 'shopbuilder' ) . '</a>';
49 49
50 50 $links = array_merge( $new_links, $links );
51 51
52 - $current = time();
53 - // Check if current date is within promotional period (Sept 19 - Jan 5).
54 - $start_date = strtotime( '2025-11-12 00:00:00' );
55 - $end_date = strtotime( '2025-12-30 23:59:59' );
56 - $is_promo_period = $start_date <= $current && $current <= $end_date;
57 - $text = esc_html__( 'Get Pro', 'shopbuilder' );
58 - if ( $is_promo_period ) {
59 - $text = esc_html__( 'Get 60% off', 'shopbuilder' );
60 - }
61 -
62 52 if ( ! rtsb()->has_pro() ) {
63 - $links['shopbuilder_pro'] = '<a href="' . esc_url( rtsb()->pro_version_link() ) . '" target="_blank" style="color: #39b54a; font-weight: bold;">' . $text . '</a>';
53 + $links['shopbuilder_pro'] = '<a href="' . esc_url( rtsb()->pro_version_link() ) . '" target="_blank" style="color: #39b54a; font-weight: bold;">' . esc_html__( 'Go Pro', 'shopbuilder' ) . '</a>';
64 54 }
65 55
66 56 return $links;
67 57 }
@@ -107,14 +97,9 @@
107 97 <div id="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>" title="Quick Feedback">
108 98 <!-- Modal content -->
109 99 <div class="modal-content">
110 100 <div id="feedback-form-body-<?php echo esc_attr( $this->textdomain ); ?>">
111 - <p class="rtsb-deactivate-intro" style="margin: 0 0 15px 0;">
112 - Having trouble? <br/>
113 - For faster and more accurate support, please
114 - <a target="_blank" href="https://www.radiustheme.com/contact/" class="rtsb-support-link">open a support ticket</a>
115 - — our support agent will personally review and resolve your issue.
116 - </p>
101 + <p style="margin: 0 0 15px 0;"> Having trouble? <br/> It’s best to <a target="_blank" href="https://www.radiustheme.com/contact/" style="text-decoration: none;"><span style="color: red"> open a support ticket </span></a> — our agent will assist you personally. </p>
117 102
118 103 <div class="feedback-input-header">
119 104 <?php echo esc_html__( 'If you’d prefer not to open a support ticket, please take a moment to share why you’re deactivating ShopBuilder:', 'shopbuilder' ); ?>
120 105 </div>
@@ -153,18 +138,16 @@
153 138 temporary deactivation</label>
154 139 </div>
155 140 <span style="color:red;font-size: 13px;"></span>
156 141 </div>
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>
142 + <p style="margin: 10px 0 15px 0;">
143 + Please let us know about any issues you are facing with the plugin.
144 + How can we improve the plugin?
145 + </p>
146 + <div class="feedback-text-wrapper-<?php echo esc_attr( $this->textdomain ); ?>">
147 + <textarea id="deactivation-feedback-<?php echo esc_attr( $this->textdomain ); ?>" rows="4" cols="40"
148 + placeholder=" Write something here. How can we improve the plugin?"></textarea>
149 + <span style="display: block;color:red;font-size: 13px;margin-top: 5px;"></span>
167 150 </div>
168 151 </div>
169 152 </div>
170 153 <?php
@@ -226,19 +209,37 @@
226 209 margin: auto;
227 210 padding: 0;
228 211 }
229 212
213 + div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> p {
214 + font-size: 15px;
215 + }
216 +
230 217 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content > * {
231 218 width: 100%;
232 219 overflow: hidden;
233 220 }
234 221
222 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea {
223 + border: 1px solid rgba(0, 0, 0, 0.3);
224 + padding: 15px;
225 + width: 100%;
226 + }
227 +
228 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content textarea:focus {
229 + border-color: #2271b1;
230 + }
231 +
235 232 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input.feedback-feedback-text {
236 - border: 1px solid #cbd5e1;
233 + border: 1px solid rgba(0, 0, 0, 0.3);
237 234 min-width: 250px;
238 - border-radius: 6px;
239 235 }
240 236
237 + /* The Close Button */
238 + #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"] {
239 + margin: 0;
240 + }
241 +
241 242 .ui-dialog-title {
242 243 font-size: 18px;
243 244 font-weight: 600;
244 245 }
@@ -284,15 +285,9 @@
284 285
285 286 .ui-dialog[aria-describedby="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>"] {
286 287 background-color: #fefefe;
287 288 box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
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;
289 + z-index: 99;
295 290 }
296 291
297 292 .ui-dialog[aria-describedby="deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>"] .ui-dialog-title {
298 293 text-transform: uppercase;
@@ -305,44 +300,15 @@
305 300 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> {
306 301 padding: 30px !important;
307 302 }
308 303
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 -
331 304 #deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .feedback-input-header {
332 305 font-weight: 600;
333 - font-size: 14px;
334 - line-height: 1.5;
335 - margin-bottom: 16px;
336 - color: #1f2937;
306 + font-size: 15px;
307 + line-height: 1.4;
308 + margin-bottom: 20px;
337 309 }
338 310
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 -
345 311 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>,
346 312 .ui-draggable .ui-dialog-titlebar {
347 313 padding: 18px 15px;
348 314 box-shadow: 0 0 3px rgba(0, 0, 0, 0.1);
@@ -349,143 +315,33 @@
349 315 text-align: left;
350 316 }
351 317
352 318 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper {
353 - margin-bottom: 6px;
319 + margin-bottom: 8px;
354 320 display: flex;
355 321 align-items: center;
356 - gap: 10px;
357 - padding: 10px 12px;
322 + gap: 8px;
323 + /*line-height: 2;*/
324 + padding: 0 1px;
358 325 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;
364 326 }
365 327
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 -
432 328 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional {
433 329 flex-wrap: wrap;
434 330 }
435 331
436 332 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional .feedback-feedback-text {
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;
333 + flex: 0 0 calc(100% - 24px);
334 + margin: 5px 0 10px 24px;
335 + min-height: 40px;
336 + border: 1px solid rgba(0, 0, 0, 0.3);
337 + padding: 0 15px;
445 338 }
446 339
447 340 div#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content .feedback-input-wrapper.conditional .feedback-feedback-text:focus {
448 - border-color: #4360ef;
449 - outline: none;
450 - box-shadow: 0 0 0 3px rgba(67, 96, 239, 0.15);
341 + border-color: #2271b1;
451 342 }
452 343
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 -
488 344 .ui-widget-overlay.ui-front {
489 345 position: fixed;
490 346 top: 0;
491 347 left: 0;
@@ -537,35 +393,8 @@
537 393 .ui-dialog[aria-describedby="deactivation-dialog-shopbuilder"] .ui-dialog-buttonset .ui-button:last-child:hover {
538 394 background: #d80e0e;
539 395 color: #fff;
540 396 }
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 - }
568 397 </style>
569 398
570 399 <?php
571 400 }
@@ -586,9 +415,8 @@
586 415 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').hide();
587 416 var dialogbox = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?>').dialog({
588 417 modal: true,
589 418 width: 550,
590 - position: { my: "center", at: "center", of: window },
591 419 show: {
592 420 effect: "fadeIn",
593 421 duration: 400
594 422 },
@@ -601,49 +429,18 @@
601 429 Submit: function () {
602 430 submitFeedback();
603 431 },
604 432 Cancel: function () {
605 - showDeactivateLoader();
433 + $(this).dialog('close');
606 434 window.location.href = href;
607 435 }
608 436 }
609 437 });
610 438
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 - });
617 439
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 -
632 440 // Close the dialog when clicking outside of it
633 441 dialogbox.on('change', 'input[type="radio"]', function (event) {
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 - }
442 + var reasons = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked').val();
646 443 if( 'found_a_better_plugin' === reasons ){
647 444 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').show();
648 445 } else {
649 446 $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> .modal-content input[name="reason_found_a_better_plugin"]').hide();
@@ -661,22 +458,8 @@
661 458 $('.ui-dialog-buttonpane button:contains("Submit")').text('Submit & Deactivate');
662 459 $('.ui-dialog-buttonpane button:contains("Cancel")').text('Skip & Deactivate');
663 460 });
664 461
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 -
679 462 // Submit the feedback
680 463 function submitFeedback() {
681 464 var href = $('.deactivate #deactivate-shopbuilder').attr('href');
682 465 var reasons = $('#deactivation-dialog-<?php echo esc_attr( $this->textdomain ); ?> input[type="radio"]:checked').val();
@@ -703,34 +486,25 @@
703 486 return;
704 487 }
705 488
706 489 if ('temporary_deactivation' === reasons || ! feedback ) {
707 - showDeactivateLoader();
708 490 window.location.href = href;
709 491 return;
710 492 }
711 493
712 494 if ( ! feedback.length > 0 ) {
713 - showDeactivateLoader();
714 495 window.location.href = href;
715 496 return;
716 497 }
717 498 var websiteUrl = '<?php echo esc_url( home_url() ); ?>';
718 499 if ( ! websiteUrl.length > 0 ) {
719 - showDeactivateLoader();
720 500 window.location.href = href;
721 501 return;
722 502 }
723 - showDeactivateLoader();
724 503 $.ajax({
725 504 url: 'https://shopbuilderwp.com/wp-json/RadiusTheme/pluginSurvey/v1/Survey/appendToSheet',
726 505 method: 'GET',
727 506 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,
733 507 data: {
734 508 website: websiteUrl,
735 509 reasons: reasons ? reasons : '',
736 510 better_plugin: better_plugin,
@@ -735,10 +509,8 @@
735 509 reasons: reasons ? reasons : '',
736 510 better_plugin: better_plugin,
737 511 feedback: feedback,
738 512 wpplugin: 'ShopBuilder',
739 - version: '<?php echo esc_js( defined( 'RTSB_VERSION' ) ? RTSB_VERSION : '' ); ?>',
740 - date: '<?php echo esc_js( gmdate( 'M j, Y' ) ); ?>',
741 513 },
742 514 success: function (response) {
743 515 },
744 516 error: function (xhr, status, error) {