Changeset 3736444
- Timestamp:
- 10/09/2026 10:52:53 AM (2 weeks ago)
- Location:
- bp-user-profile-reviews
- Files:
-
- 122 added
- 33 edited
-
tags/3.8.1 (added)
-
tags/3.8.1/admin (added)
-
tags/3.8.1/admin/assets (added)
-
tags/3.8.1/admin/assets/css (added)
-
tags/3.8.1/admin/assets/css/bupr-admin.css (added)
-
tags/3.8.1/admin/assets/css/min (added)
-
tags/3.8.1/admin/assets/css/min/bupr-admin.min.css (added)
-
tags/3.8.1/admin/assets/css/rtl (added)
-
tags/3.8.1/admin/assets/css/rtl/bupr-admin.rtl.css (added)
-
tags/3.8.1/admin/assets/css/vendor (added)
-
tags/3.8.1/admin/assets/css/vendor/select2.css (added)
-
tags/3.8.1/admin/assets/js (added)
-
tags/3.8.1/admin/assets/js/bupr-admin.js (added)
-
tags/3.8.1/admin/assets/js/bupr-color-picker.js (added)
-
tags/3.8.1/admin/assets/js/min (added)
-
tags/3.8.1/admin/assets/js/min/bupr-admin.min.js (added)
-
tags/3.8.1/admin/assets/js/min/bupr-color-picker.min.js (added)
-
tags/3.8.1/admin/assets/js/vendor (added)
-
tags/3.8.1/admin/assets/js/vendor/select2.js (added)
-
tags/3.8.1/admin/assets/js/vendor/select2.min.js (added)
-
tags/3.8.1/admin/bupr-admin.php (added)
-
tags/3.8.1/admin/class-bupr-admin-feedback.php (added)
-
tags/3.8.1/admin/tab-templates (added)
-
tags/3.8.1/admin/tab-templates/bupr-setting-criteria-tab.php (added)
-
tags/3.8.1/admin/tab-templates/bupr-setting-display-tab.php (added)
-
tags/3.8.1/admin/tab-templates/bupr-setting-general-tab.php (added)
-
tags/3.8.1/assets (added)
-
tags/3.8.1/assets/css (added)
-
tags/3.8.1/assets/css/admin.css (added)
-
tags/3.8.1/assets/css/bupr-front.css (added)
-
tags/3.8.1/assets/css/fontawesome (added)
-
tags/3.8.1/assets/css/fontawesome/all.css (added)
-
tags/3.8.1/assets/css/fontawesome/all.min.css (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-brands-400.woff (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-brands-400.woff2 (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-regular-400.woff (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-regular-400.woff2 (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-solid-900.woff (added)
-
tags/3.8.1/assets/css/fontawesome/webfonts/fa-solid-900.woff2 (added)
-
tags/3.8.1/assets/css/min (added)
-
tags/3.8.1/assets/css/min/admin.min.css (added)
-
tags/3.8.1/assets/css/min/bupr-front.min.css (added)
-
tags/3.8.1/assets/css/rtl (added)
-
tags/3.8.1/assets/css/rtl/admin.rtl.css (added)
-
tags/3.8.1/assets/css/rtl/bupr-front.rtl.css (added)
-
tags/3.8.1/assets/images (added)
-
tags/3.8.1/assets/images/ecosystem (added)
-
tags/3.8.1/assets/images/ecosystem/buddynext.svg (added)
-
tags/3.8.1/assets/images/ecosystem/buddyx.png (added)
-
tags/3.8.1/assets/images/ecosystem/eventonomy.svg (added)
-
tags/3.8.1/assets/images/ecosystem/jetonomy.svg (added)
-
tags/3.8.1/assets/images/ecosystem/learnomy.svg (added)
-
tags/3.8.1/assets/images/ecosystem/listora.svg (added)
-
tags/3.8.1/assets/images/ecosystem/mediaverse.svg (added)
-
tags/3.8.1/assets/images/ecosystem/wb-gamification.svg (added)
-
tags/3.8.1/assets/images/ecosystem/wp-career-board.svg (added)
-
tags/3.8.1/assets/images/ecosystem/wp-sell-services.svg (added)
-
tags/3.8.1/assets/images/star.png (added)
-
tags/3.8.1/assets/images/star_half.png (added)
-
tags/3.8.1/assets/images/star_off.png (added)
-
tags/3.8.1/assets/js (added)
-
tags/3.8.1/assets/js/admin.js (added)
-
tags/3.8.1/assets/js/bupr-front.js (added)
-
tags/3.8.1/assets/js/min (added)
-
tags/3.8.1/assets/js/min/admin.min.js (added)
-
tags/3.8.1/assets/js/min/bupr-front.min.js (added)
-
tags/3.8.1/buddypress-member-review.php (added)
-
tags/3.8.1/includes (added)
-
tags/3.8.1/includes/admin (added)
-
tags/3.8.1/includes/admin/class-bupr-admin-panel.php (added)
-
tags/3.8.1/includes/admin/views (added)
-
tags/3.8.1/includes/admin/views/discover.php (added)
-
tags/3.8.1/includes/admin/views/hub.php (added)
-
tags/3.8.1/includes/admin/views/overview.php (added)
-
tags/3.8.1/includes/admin/views/settings-criteria.php (added)
-
tags/3.8.1/includes/admin/views/settings-display.php (added)
-
tags/3.8.1/includes/admin/views/settings-general.php (added)
-
tags/3.8.1/includes/admin/views/shell.php (added)
-
tags/3.8.1/includes/bupr-ajax.php (added)
-
tags/3.8.1/includes/bupr-filters.php (added)
-
tags/3.8.1/includes/bupr-general-functions.php (added)
-
tags/3.8.1/includes/bupr-notification.php (added)
-
tags/3.8.1/includes/bupr-scripts.php (added)
-
tags/3.8.1/includes/bupr-shortcodes.php (added)
-
tags/3.8.1/includes/class-buprglobals.php (added)
-
tags/3.8.1/includes/templates (added)
-
tags/3.8.1/includes/templates/bupr-edit-review-form.php (added)
-
tags/3.8.1/includes/templates/bupr-owner-reply.php (added)
-
tags/3.8.1/includes/templates/bupr-reviews-tab-template.php (added)
-
tags/3.8.1/includes/templates/bupr-single-review-template.php (added)
-
tags/3.8.1/includes/widgets (added)
-
tags/3.8.1/includes/widgets/display-review.php (added)
-
tags/3.8.1/includes/widgets/member-rating.php (added)
-
tags/3.8.1/index.php (added)
-
tags/3.8.1/languages (added)
-
tags/3.8.1/languages/bp-member-reviews-de_DE.l10n.php (added)
-
tags/3.8.1/languages/bp-member-reviews-de_DE.mo (added)
-
tags/3.8.1/languages/bp-member-reviews-de_DE.po (added)
-
tags/3.8.1/languages/bp-member-reviews-es_ES.l10n.php (added)
-
tags/3.8.1/languages/bp-member-reviews-es_ES.mo (added)
-
tags/3.8.1/languages/bp-member-reviews-es_ES.po (added)
-
tags/3.8.1/languages/bp-member-reviews-fr_FR.l10n.php (added)
-
tags/3.8.1/languages/bp-member-reviews-fr_FR.mo (added)
-
tags/3.8.1/languages/bp-member-reviews-fr_FR.po (added)
-
tags/3.8.1/languages/bp-member-reviews-it_IT.l10n.php (added)
-
tags/3.8.1/languages/bp-member-reviews-it_IT.mo (added)
-
tags/3.8.1/languages/bp-member-reviews-it_IT.po (added)
-
tags/3.8.1/languages/bp-member-reviews-pt_BR.l10n.php (added)
-
tags/3.8.1/languages/bp-member-reviews-pt_BR.mo (added)
-
tags/3.8.1/languages/bp-member-reviews-pt_BR.po (added)
-
tags/3.8.1/languages/bp-member-reviews.pot (added)
-
tags/3.8.1/readme.txt (added)
-
tags/3.8.1/screenshot-1.png (added)
-
tags/3.8.1/screenshot-2.png (added)
-
tags/3.8.1/screenshot-3.png (added)
-
tags/3.8.1/screenshot-4.png (added)
-
tags/3.8.1/screenshot-5.png (added)
-
tags/3.8.1/screenshot-6.png (added)
-
tags/3.8.1/uninstall.php (added)
-
tags/3.8.1/wpml-config.xml (added)
-
trunk/admin/assets/css/bupr-admin.css (modified) (7 diffs)
-
trunk/admin/assets/css/min/bupr-admin.min.css (modified) (1 diff)
-
trunk/admin/assets/css/rtl/bupr-admin.rtl.css (modified) (7 diffs)
-
trunk/admin/assets/js/bupr-admin.js (modified) (3 diffs)
-
trunk/admin/assets/js/min/bupr-admin.min.js (modified) (1 diff)
-
trunk/admin/bupr-admin.php (modified) (18 diffs)
-
trunk/admin/tab-templates/bupr-setting-criteria-tab.php (modified) (4 diffs)
-
trunk/admin/tab-templates/bupr-setting-display-tab.php (modified) (1 diff)
-
trunk/admin/tab-templates/bupr-setting-general-tab.php (modified) (6 diffs)
-
trunk/assets/css/admin.css (modified) (4 diffs)
-
trunk/assets/css/bupr-front.css (modified) (4 diffs)
-
trunk/assets/css/min/admin.min.css (modified) (1 diff)
-
trunk/assets/css/min/bupr-front.min.css (modified) (1 diff)
-
trunk/assets/css/rtl/admin.rtl.css (modified) (4 diffs)
-
trunk/assets/css/rtl/bupr-front.rtl.css (modified) (4 diffs)
-
trunk/assets/js/bupr-front.js (modified) (3 diffs)
-
trunk/assets/js/min/bupr-front.min.js (modified) (1 diff)
-
trunk/buddypress-member-review.php (modified) (3 diffs)
-
trunk/includes/admin/class-bupr-admin-panel.php (modified) (3 diffs)
-
trunk/includes/admin/views/overview.php (modified) (5 diffs)
-
trunk/includes/bupr-ajax.php (modified) (14 diffs)
-
trunk/includes/bupr-filters.php (modified) (11 diffs)
-
trunk/includes/bupr-general-functions.php (modified) (3 diffs)
-
trunk/includes/bupr-notification.php (modified) (6 diffs)
-
trunk/includes/bupr-scripts.php (modified) (1 diff)
-
trunk/includes/bupr-shortcodes.php (modified) (7 diffs)
-
trunk/includes/class-buprglobals.php (modified) (1 diff)
-
trunk/includes/templates/bupr-owner-reply.php (added)
-
trunk/includes/templates/bupr-reviews-tab-template.php (modified) (2 diffs)
-
trunk/includes/templates/bupr-single-review-template.php (modified) (4 diffs)
-
trunk/includes/widgets/display-review.php (modified) (3 diffs)
-
trunk/includes/widgets/member-rating.php (modified) (2 diffs)
-
trunk/languages/bp-member-reviews.pot (modified) (36 diffs)
-
trunk/readme.txt (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
bp-user-profile-reviews/trunk/admin/assets/css/bupr-admin.css
r3617176 r3736444 77 77 78 78 79 /* Rounded sliders */80 .bupr-slider.bupr-round {81 border-radius: 34px;82 }83 84 .bupr-slider.bupr-round:before {85 border-radius: 50%;86 }87 88 79 .bupr_excluding_member { 89 80 width: 70%; … … 99 90 } 100 91 101 @media (min-width: 782px) {102 .bupr-switch {103 width: 30px;104 height: 17px;105 }106 107 .bupr-slider:before {108 height: 13px;109 width: 13px;110 left: 2px;111 bottom: 2px;112 }113 114 input:checked+.bupr-slider:before {115 -webkit-transform: translateX(13px);116 -ms-transform: translateX(13px);117 transform: translateX(13px);118 }119 }120 92 121 93 /* Admin Switch Toggle : End */ … … 129 101 background-color: var(--bupr-admin-surface-1, #fafafa); 130 102 /* Must travel with the background. Once the surface follows the token it 131 goes dark under body. admin-color-dark, while WP's default input colour103 goes dark under body.is-dark-theme, while WP's default input colour 132 104 stays near-black - dark text on a dark field. Verified in-browser. */ 133 105 color: var(--bupr-admin-text, #1e293b); … … 144 116 -ms-flex-pack: center; 145 117 justify-content: center; 146 }147 148 .bupr-criteria .bupr-delete-tag input[type=button],149 #bupr-add-criteria-action input#bupr-btnAdd,150 #bupr-admin-row-criteria input.bupr-remove.button.button-secondary {151 padding: 12px 30px;152 font-size: 15px;153 background: var(--bupr-admin-danger, #ee1313);154 margin-inline-end: 35px;155 text-shadow: none;156 font-weight: 600;157 width: auto;158 color: #fff;159 line-height: 1;160 border: 0;161 -webkit-transition: all 0.3s;162 transition: all 0.3s;163 box-shadow: 0px 8px 20px rgba(32, 53, 85, 0.35);164 border-radius: 12px;165 height: auto;166 }167 168 .bupr-criteria .bupr-delete-tag input[type=button]:hover {169 background: var(--bupr-admin-danger-hover, #272B41);170 }171 172 #bupr-add-criteria-action input#bupr-btnAdd:hover {173 background: var(--bupr-admin-success-hover, #272B41);174 }175 176 #bupr-add-criteria-action input#bupr-btnAdd {177 padding: 16px 30px;178 margin-bottom: 10px;179 margin-top: 10px;180 background: var(--bupr-admin-success, #08c462);181 118 } 182 119 … … 327 264 } 328 265 329 /* custom css for switch */330 .bupr-switch-custom {331 margin: 0 10px;332 margin-top: 6px;333 }334 335 .buprcriteria .bupr-switch {336 margin-right: 40px;337 }338 339 @media(max-width: 781px) {340 .buprcriteria input:checked+.bupr-slider::before {341 -webkit-transform: translateX(35px);342 -ms-transform: translateX(35px);343 transform: translateX(35px);344 }345 346 .buprcriteria .bupr-switch {347 width: 70px;348 margin-right: 0;349 }350 }351 352 266 .bupr-delete-tag { 353 267 margin-top: 0px; 354 268 margin-bottom: 10px; 355 }356 357 .bupr-criteria-remove-button {358 border-radius: 20px;359 height: 34px;360 margin: 0;361 padding: 2px;362 width: 70px;363 269 } 364 270 … … 380 286 } 381 287 382 .bupr-show-if-allowed { 288 /* The legacy card sets `.bupr-card--legacy .wbcom-settings-section-wrap { display: flex }` 289 (0,2,0); the gate must out-rank it or the criteria builder never hides. */ 290 .bupr-show-if-allowed, 291 .bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed { 383 292 display: none; 384 293 } … … 437 346 * Do not reintroduce either. Style notices through `.bupr-admin .notice`. 438 347 */ 439 440 .wbcom-settings-section-options input#profile_reviews_per_page { 441 width: 300px; 442 margin-inline-end: 10px; 443 } 348 /* Reviews list: a review pulled by the report threshold, as opposed to one awaiting 349 first approval. This sheet also loads on edit.php?post_type=review, which has no 350 .bupr-admin wrapper, so every token keeps a literal fallback. */ 351 .bupr-status-auto-hidden { 352 display: inline-block; 353 margin-inline-start: 4px; 354 padding: 1px 8px; 355 border-radius: 999px; 356 font-size: 11px; 357 font-weight: 600; 358 line-height: 1.6; 359 background: var(--bupr-admin-danger-light, #fee2e2); 360 color: var(--bupr-admin-danger, #b91c1c); 361 } -
bp-user-profile-reviews/trunk/admin/assets/css/min/bupr-admin.min.css
r3617176 r3736444 1 .bupr-admin-settings-header p{font-size:24px}.wbcom-wrap .notice.notice-error.is-dismissible.learndash-license-is-dismissible{display:none}.bupr-admin-settings-spinner{vertical-align:middle;display:none}.bupr-btn-ajax{color:var(--bupr-admin-accent,#66c6e4)}#bupr_settings_updated{display:none;margin-left:0;margin-bottom:15px}.bupr-review-fields input{width:100%}.bupr-remove{margin:10px 0}.bupr-widget-class p{width:100%}.bupr-widget-class p label{width:50%}.bupr-widget-class p input{width:50%}.bupr-widget-class p select{width:50%}.bupr-adming-setting{float:left;width:90%;padding-top:10px}.bupr-border{border-inline-end:1px solid var(--bupr-admin-border,hsl(0,0%,87%))}.bupr-shortcode{font-size:16px;font-weight:400}.wbcom-field-error{color:var(--bupr-admin-danger,#ee1313);font-family:auto;font-weight:100}.bupr -slider.bupr-round{border-radius:34px}.bupr-slider.bupr-round:before{border-radius:50%}.bupr_excluding_member{width:70%}.bupr_adding_member{width:70%}.bupr-label{font-size:15px;font-weight:600}@media (min-width:782px){.bupr-switch{width:30px;height:17px}.bupr-slider:before{height:13px;width:13px;left:2px;bottom:2px}input:checked+.bupr-slider:before{-webkit-transform:translateX(13px);-ms-transform:translateX(13px);transform:translateX(13px)}}.bupr-criteria input[type=text]{width:95%;height:40px;border-radius:8px;border-color:var(--bupr-admin-border,#e3e2ea);background-color:var(--bupr-admin-surface-1,#fafafa);color:var(--bupr-admin-text,#1e293b)}.bupr-admin-col-6.buprcriteria{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#bupr-add-criteria-action input#bupr-btnAdd,#bupr-admin-row-criteria input.bupr-remove.button.button-secondary,.bupr-criteria .bupr-delete-tag input[type=button]{padding:12px 30px;font-size:15px;background:var(--bupr-admin-danger,#ee1313);margin-inline-end:35px;text-shadow:none;font-weight:600;width:auto;color:#fff;line-height:1;border:0;-webkit-transition:all .3s;transition:all .3s;box-shadow:0 8px 20px rgba(32,53,85,.35);border-radius:12px;height:auto}.bupr-criteria .bupr-delete-tag input[type=button]:hover{background:var(--bupr-admin-danger-hover,#272b41)}#bupr-add-criteria-action input#bupr-btnAdd:hover{background:var(--bupr-admin-success-hover,#272b41)}#bupr-add-criteria-action input#bupr-btnAdd{padding:16px 30px;margin-bottom:10px;margin-top:10px;background:var(--bupr-admin-success,#08c462)}[class*=bupr-admin-col-]{float:left;padding:10px 0}div#bupr-admin-row-criteria.bupr-admin-row{overflow:hidden;border:1px solid var(--bupr-admin-border,#e3e2ec);border-radius:10px;padding:5px 13px;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;background:var(--bupr-admin-white,#fff);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-row#bupr-admin-row-criteria .bupr-admin-col-6{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-col-1{width:8.33%}.bupr-admin-col-2{width:16.66%}.bupr-admin-col-3{width:25%}.bupr-admin-col-4{width:33.33%}.bupr-admin-col-5{width:41.66%}.bupr-admin-col-6{width:50%}.bupr-admin-col-7{width:58.33%}.bupr-admin-col-8{width:66.66%}.bupr-admin-col-9{width:75%}.bupr-admin-col-10{width:83.33%}.bupr-admin-col-11{width:91.66%}.bupr-admin-col-12{width:100%}@media(max-width:767px){[class*=bupr-admin-col-]{width:100%}div#bupr-admin-row-criteria.bupr-admin-row{-ms-flex-flow:wrap;flex-flow:wrap}.bupr-admin-col-6.buprcriteria{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}}button.bupr-accordion{background-color:var(--bupr-admin-surface-2,#ddd);border:medium none;border-top-right-radius:10px;border-top-left-radius:10px;color:var(--bupr-admin-text,#444);cursor:pointer;font-size:15px;margin:0 5%;outline:medium none;padding:15px 20px;text-align:left;-webkit-transition:all .4s ease 0s;transition:all .4s ease 0s;width:90%}button.bupr-accordion.active,button.bupr-accordion:hover{background-color:var(--bupr-admin-accent,#2094f3);color:#fff}div.panel{padding:0 18px;background-color:#fff;max-height:0;overflow:hidden;-webkit-transition:max-height .2s ease-out;transition:max-height .2s ease-out;margin:0 5%}button.bupr-accordion::after{color:var(--bupr-admin-text-3,#777);content:"+";float:right;font-size:13px;font-weight:700;margin-left:5px}button.bupr-accordion::after:hover{color:#fff}button.bupr-accordion.active::after{content:"−";color:#fff}.bupr-switch-custom{margin:0 10px;margin-top:6px}.buprcriteria .bupr-switch{margin-right:40px}@media(max-width:781px){.buprcriteria input:checked+.bupr-slider::before{-webkit-transform:translateX(35px);-ms-transform:translateX(35px);transform:translateX(35px)}.buprcriteria .bupr-switch{width:70px;margin-right:0}}.bupr-delete-tag{margin-top:0;margin-bottom:10px}.bupr-criteria-remove-button{border-radius:20px;height:34px;margin:0;padding:2px;width:70px}.buprcriteria span.description{margin:0}span.move-icons{font-size:30px;font-weight:700;margin-right:10px;cursor:move}.bupr-display-info{font-weight:400;font-size:14px;margin-left:10px}.bupr-show-if-allowed{display:none}.bupr-approve-review{color:green}.bupr-extra-actions{float:right}.nav-tab-wrapper ul .bupr-general a:before{content:"\f111"}.nav-tab-wrapper ul .bupr-criteria a:before{content:"\f155"}.nav-tab-wrapper ul .bupr-shortcode a:before{content:"\f150"}.nav-tab-wrapper ul .bupr-display a:before{content:"\f478"}.nav-tab-wrapper ul .bupr-pro-features a:before{content:"\f527"}.wbcom-settings-section-options input#profile_reviews_per_page{width:300px;margin-inline-end:10px}1 .bupr-admin-settings-header p{font-size:24px}.wbcom-wrap .notice.notice-error.is-dismissible.learndash-license-is-dismissible{display:none}.bupr-admin-settings-spinner{vertical-align:middle;display:none}.bupr-btn-ajax{color:var(--bupr-admin-accent,#66c6e4)}#bupr_settings_updated{display:none;margin-left:0;margin-bottom:15px}.bupr-review-fields input{width:100%}.bupr-remove{margin:10px 0}.bupr-widget-class p{width:100%}.bupr-widget-class p label{width:50%}.bupr-widget-class p input{width:50%}.bupr-widget-class p select{width:50%}.bupr-adming-setting{float:left;width:90%;padding-top:10px}.bupr-border{border-inline-end:1px solid var(--bupr-admin-border,hsl(0,0%,87%))}.bupr-shortcode{font-size:16px;font-weight:400}.wbcom-field-error{color:var(--bupr-admin-danger,#ee1313);font-family:auto;font-weight:100}.bupr_excluding_member{width:70%}.bupr_adding_member{width:70%}.bupr-label{font-size:15px;font-weight:600}.bupr-criteria input[type=text]{width:95%;height:40px;border-radius:8px;border-color:var(--bupr-admin-border,#e3e2ea);background-color:var(--bupr-admin-surface-1,#fafafa);color:var(--bupr-admin-text,#1e293b)}.bupr-admin-col-6.buprcriteria{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}[class*=bupr-admin-col-]{float:left;padding:10px 0}div#bupr-admin-row-criteria.bupr-admin-row{overflow:hidden;border:1px solid var(--bupr-admin-border,#e3e2ec);border-radius:10px;padding:5px 13px;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;background:var(--bupr-admin-white,#fff);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-row#bupr-admin-row-criteria .bupr-admin-col-6{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-col-1{width:8.33%}.bupr-admin-col-2{width:16.66%}.bupr-admin-col-3{width:25%}.bupr-admin-col-4{width:33.33%}.bupr-admin-col-5{width:41.66%}.bupr-admin-col-6{width:50%}.bupr-admin-col-7{width:58.33%}.bupr-admin-col-8{width:66.66%}.bupr-admin-col-9{width:75%}.bupr-admin-col-10{width:83.33%}.bupr-admin-col-11{width:91.66%}.bupr-admin-col-12{width:100%}@media(max-width:767px){[class*=bupr-admin-col-]{width:100%}div#bupr-admin-row-criteria.bupr-admin-row{-ms-flex-flow:wrap;flex-flow:wrap}.bupr-admin-col-6.buprcriteria{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}}button.bupr-accordion{background-color:var(--bupr-admin-surface-2,#ddd);border:medium none;border-top-right-radius:10px;border-top-left-radius:10px;color:var(--bupr-admin-text,#444);cursor:pointer;font-size:15px;margin:0 5%;outline:medium none;padding:15px 20px;text-align:left;-webkit-transition:all .4s ease 0s;transition:all .4s ease 0s;width:90%}button.bupr-accordion.active,button.bupr-accordion:hover{background-color:var(--bupr-admin-accent,#2094f3);color:#fff}div.panel{padding:0 18px;background-color:#fff;max-height:0;overflow:hidden;-webkit-transition:max-height .2s ease-out;transition:max-height .2s ease-out;margin:0 5%}button.bupr-accordion::after{color:var(--bupr-admin-text-3,#777);content:"+";float:right;font-size:13px;font-weight:700;margin-left:5px}button.bupr-accordion::after:hover{color:#fff}button.bupr-accordion.active::after{content:"−";color:#fff}.bupr-delete-tag{margin-top:0;margin-bottom:10px}.buprcriteria span.description{margin:0}span.move-icons{font-size:30px;font-weight:700;margin-right:10px;cursor:move}.bupr-display-info{font-weight:400;font-size:14px;margin-left:10px}.bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed,.bupr-show-if-allowed{display:none}.bupr-approve-review{color:green}.bupr-extra-actions{float:right}.nav-tab-wrapper ul .bupr-general a:before{content:"\f111"}.nav-tab-wrapper ul .bupr-criteria a:before{content:"\f155"}.nav-tab-wrapper ul .bupr-shortcode a:before{content:"\f150"}.nav-tab-wrapper ul .bupr-display a:before{content:"\f478"}.nav-tab-wrapper ul .bupr-pro-features a:before{content:"\f527"}.bupr-status-auto-hidden{display:inline-block;margin-inline-start:4px;padding:1px 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:1.6;background:var(--bupr-admin-danger-light,#fee2e2);color:var(--bupr-admin-danger,#b91c1c)} -
bp-user-profile-reviews/trunk/admin/assets/css/rtl/bupr-admin.rtl.css
r3617176 r3736444 77 77 78 78 79 /* Rounded sliders */80 .bupr-slider.bupr-round {81 border-radius: 34px;82 }83 84 .bupr-slider.bupr-round:before {85 border-radius: 50%;86 }87 88 79 .bupr_excluding_member { 89 80 width: 70%; … … 99 90 } 100 91 101 @media (min-width: 782px) {102 .bupr-switch {103 width: 30px;104 height: 17px;105 }106 107 .bupr-slider:before {108 height: 13px;109 width: 13px;110 right: 2px;111 bottom: 2px;112 }113 114 input:checked+.bupr-slider:before {115 -webkit-transform: translateX(-13px);116 -ms-transform: translateX(-13px);117 transform: translateX(-13px);118 }119 }120 92 121 93 /* Admin Switch Toggle : End */ … … 129 101 background-color: var(--bupr-admin-surface-1, #fafafa); 130 102 /* Must travel with the background. Once the surface follows the token it 131 goes dark under body. admin-color-dark, while WP's default input colour103 goes dark under body.is-dark-theme, while WP's default input colour 132 104 stays near-black - dark text on a dark field. Verified in-browser. */ 133 105 color: var(--bupr-admin-text, #1e293b); … … 144 116 -ms-flex-pack: center; 145 117 justify-content: center; 146 }147 148 .bupr-criteria .bupr-delete-tag input[type=button],149 #bupr-add-criteria-action input#bupr-btnAdd,150 #bupr-admin-row-criteria input.bupr-remove.button.button-secondary {151 padding: 12px 30px;152 font-size: 15px;153 background: var(--bupr-admin-danger, #ee1313);154 margin-inline-end: 35px;155 text-shadow: none;156 font-weight: 600;157 width: auto;158 color: #fff;159 line-height: 1;160 border: 0;161 -webkit-transition: all 0.3s;162 transition: all 0.3s;163 box-shadow: 0px 8px 20px rgba(32, 53, 85, 0.35);164 border-radius: 12px;165 height: auto;166 }167 168 .bupr-criteria .bupr-delete-tag input[type=button]:hover {169 background: var(--bupr-admin-danger-hover, #272B41);170 }171 172 #bupr-add-criteria-action input#bupr-btnAdd:hover {173 background: var(--bupr-admin-success-hover, #272B41);174 }175 176 #bupr-add-criteria-action input#bupr-btnAdd {177 padding: 16px 30px;178 margin-bottom: 10px;179 margin-top: 10px;180 background: var(--bupr-admin-success, #08c462);181 118 } 182 119 … … 327 264 } 328 265 329 /* custom css for switch */330 .bupr-switch-custom {331 margin: 0 10px;332 margin-top: 6px;333 }334 335 .buprcriteria .bupr-switch {336 margin-left: 40px;337 }338 339 @media(max-width: 781px) {340 .buprcriteria input:checked+.bupr-slider::before {341 -webkit-transform: translateX(-35px);342 -ms-transform: translateX(-35px);343 transform: translateX(-35px);344 }345 346 .buprcriteria .bupr-switch {347 width: 70px;348 margin-left: 0;349 }350 }351 352 266 .bupr-delete-tag { 353 267 margin-top: 0px; 354 268 margin-bottom: 10px; 355 }356 357 .bupr-criteria-remove-button {358 border-radius: 20px;359 height: 34px;360 margin: 0;361 padding: 2px;362 width: 70px;363 269 } 364 270 … … 380 286 } 381 287 382 .bupr-show-if-allowed { 288 /* The legacy card sets `.bupr-card--legacy .wbcom-settings-section-wrap { display: flex }` 289 (0,2,0); the gate must out-rank it or the criteria builder never hides. */ 290 .bupr-show-if-allowed, 291 .bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed { 383 292 display: none; 384 293 } … … 437 346 * Do not reintroduce either. Style notices through `.bupr-admin .notice`. 438 347 */ 439 440 .wbcom-settings-section-options input#profile_reviews_per_page { 441 width: 300px; 442 margin-inline-end: 10px; 443 } 348 /* Reviews list: a review pulled by the report threshold, as opposed to one awaiting 349 first approval. This sheet also loads on edit.php?post_type=review, which has no 350 .bupr-admin wrapper, so every token keeps a literal fallback. */ 351 .bupr-status-auto-hidden { 352 display: inline-block; 353 margin-inline-start: 4px; 354 padding: 1px 8px; 355 border-radius: 999px; 356 font-size: 11px; 357 font-weight: 600; 358 line-height: 1.6; 359 background: var(--bupr-admin-danger-light, #fee2e2); 360 color: var(--bupr-admin-danger, #b91c1c); 361 } 362 444 363 /*# sourceMappingURL=bupr-admin.rtl.css.map */ -
bp-user-profile-reviews/trunk/admin/assets/js/bupr-admin.js
r3617176 r3736444 74 74 '#bupr_allow_multiple_criteria', 75 75 function () { 76 if (jQuery(this).is(':checked')) { 77 jQuery('.bupr-criteria-settings-tbl #buprTextBoxContainer').removeClass('bupr-show-if-allowed'); 78 jQuery('.bupr-criteria-settings-tbl #bupr-add-criteria-action').removeClass('bupr-show-if-allowed'); 79 } else { 80 jQuery('.bupr-criteria-settings-tbl #buprTextBoxContainer').addClass('bupr-show-if-allowed'); 81 jQuery('.bupr-criteria-settings-tbl #bupr-add-criteria-action').addClass('bupr-show-if-allowed'); 82 } 76 // One wrapper holds the rows and the Add button; the server renders the same class on load. 77 jQuery('#bupr-criteria-builder').toggleClass('bupr-show-if-allowed', !this.checked); 78 } 79 ); 80 81 // Approval email fields only apply while reviews wait for approval. 82 jQuery(document).on( 83 'change', 84 '#bupr_review_auto_approval', 85 function () { 86 jQuery('.review-approve-email-section').toggleClass('bupr-show-if-allowed', this.checked); 83 87 } 84 88 ); … … 88 92 "click", 89 93 function () { 90 var div = jQuery("<div />"); 91 div.html(GetDynamicTextBox("")); 92 jQuery("#buprTextBoxContainer").append(div); 94 jQuery("#buprTextBoxContainer").append(GetDynamicTextBox("")); 93 95 } 94 96 ); … … 185 187 } 186 188 187 return '<div id="bupr-admin-row-criteria" class="bupr-admin-row b order bupr-criteria"><div class="bupr-admin-col-6"><input name="bupr_admin_settings[rating_field_name][' + rand_num + ']" class = "buprDynamicTextBox" type="text" value = "' + attr(value) + '" placeholder="' + attr(placeholder) + '" aria-label="' + attr(ariaLabel) + '" /></div>' +188 '<div class="bupr-admin-col-6 "><input type="button" value="' + attr(removeLabel) + '" aria-label="' + attr(removeAria) + '" class="bupr-remove button button-secondary" /></div></div>'189 return '<div id="bupr-admin-row-criteria" class="bupr-admin-row bupr-criteria bupr-criteria-fields border draggable"><div class="bupr-admin-col-6"><span class="move-icons">≡</span><input name="bupr_admin_settings[rating_field_name][' + rand_num + ']" class = "buprDynamicTextBox" type="text" value = "' + attr(value) + '" placeholder="' + attr(placeholder) + '" aria-label="' + attr(ariaLabel) + '" /></div>' + 190 '<div class="bupr-admin-col-6 buprcriteria"><p class="bupr-delete-tag"><input type="button" value="' + attr(removeLabel) + '" aria-label="' + attr(removeAria) + '" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" /></p></div></div>' 189 191 } -
bp-user-profile-reviews/trunk/admin/assets/js/min/bupr-admin.min.js
r3617176 r3736444 1 if("undefined"!=typeof wp&&wp.i18n){let __=wp.i18n.__}function GetDynamicTextBox(value){var rand_num=Math.random(),i18n=window.bupr_admin_ajax_object||{},placeholder=i18n.criteria_placeholder||"Add Review criteria eg. Member Response. ",ariaLabel=i18n.criteria_aria_label||"Review criteria name",removeLabel=i18n.criteria_remove||"Remove",i18n=i18n.criteria_remove_aria||"Remove this review criteria";function attr(text){return jQuery("<div/>").text(text).html()}return'<div id="bupr-admin-row-criteria" class="bupr-admin-row b order bupr-criteria"><div class="bupr-admin-col-6"><input name="bupr_admin_settings[rating_field_name]['+rand_num+']" class = "buprDynamicTextBox" type="text" value = "'+attr(value)+'" placeholder="'+attr(placeholder)+'" aria-label="'+attr(ariaLabel)+'" /></div><div class="bupr-admin-col-6"><input type="button" value="'+attr(removeLabel)+'" aria-label="'+attr(i18n)+'" class="bupr-remove button button-secondary" /></div></div>'}jQuery.noConflict(),jQuery(document).ready(function($){jQuery("#buprTextBoxContainer").sortable(),jQuery("#buprTextBoxContainer").disableSelection(),jQuery("#bupr_exc_member").select2(),jQuery("#bupr_add_member").select2();for(var acc=document.getElementsByClassName("bupr-accordion"),i=0;i<acc.length;i++)acc[i].onclick=function(){this.classList.toggle("active");var panel=this.nextElementSibling;panel.style.maxHeight?panel.style.maxHeight=null:panel.style.maxHeight=panel.scrollHeight+"px"};var bupr_current_tab=jQuery(".bupr-tab-active").val();jQuery("."+bupr_current_tab).addClass("nav-tab-active"),jQuery(".bupr_enable_criteria").change(function(){jQuery(this).is(":checked")?jQuery(this).val("yes"):jQuery(this).val("no")}),jQuery(document).on("change","#bupr_allow_multiple_criteria",function(){jQuery(this).is(":checked")?(jQuery(".bupr-criteria-settings-tbl #buprTextBoxContainer").removeClass("bupr-show-if-allowed"),jQuery(".bupr-criteria-settings-tbl #bupr-add-criteria-action").removeClass("bupr-show-if-allowed")):(jQuery(".bupr-criteria-settings-tbl #buprTextBoxContainer").addClass("bupr-show-if-allowed"),jQuery(".bupr-criteria-settings-tbl #bupr-add-criteria-action").addClass("bupr-show-if-allowed"))}),jQuery("#bupr-btnAdd").bind("click",function(){var div=jQuery("<div />");div.html(GetDynamicTextBox("")),jQuery("#buprTextBoxContainer").append(div)}),jQuery("body").on("click",".bupr-remove",function(){jQuery(this).parent().parent().parent("div").remove()}),jQuery(document).on("click",".bupr-approve-review",function(){var review_id=jQuery(this).data("rid");jQuery(this).html(bupr_admin_ajax_object.approving_text),jQuery.post(bupr_admin_ajax_object.ajaxurl,{action:"bupr_approve_review",review_id:review_id,nonce:bupr_admin_ajax_object.nonce},function(response){response&&response.success&&response.data&&"review-approved-successfully"===response.data.code?window.location.reload():console.log(response&&response.data?response.data.message:response)})}),jQuery(document).on("keyup","#bupr_member_tab_title",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))}),jQuery(document).on("keyup","#bupr_member_tab_title_plural",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))})});1 if("undefined"!=typeof wp&&wp.i18n){let __=wp.i18n.__}function GetDynamicTextBox(value){var rand_num=Math.random(),i18n=window.bupr_admin_ajax_object||{},placeholder=i18n.criteria_placeholder||"Add Review criteria eg. Member Response. ",ariaLabel=i18n.criteria_aria_label||"Review criteria name",removeLabel=i18n.criteria_remove||"Remove",i18n=i18n.criteria_remove_aria||"Remove this review criteria";function attr(text){return jQuery("<div/>").text(text).html()}return'<div id="bupr-admin-row-criteria" class="bupr-admin-row bupr-criteria bupr-criteria-fields border draggable"><div class="bupr-admin-col-6"><span class="move-icons">≡</span><input name="bupr_admin_settings[rating_field_name]['+rand_num+']" class = "buprDynamicTextBox" type="text" value = "'+attr(value)+'" placeholder="'+attr(placeholder)+'" aria-label="'+attr(ariaLabel)+'" /></div><div class="bupr-admin-col-6 buprcriteria"><p class="bupr-delete-tag"><input type="button" value="'+attr(removeLabel)+'" aria-label="'+attr(i18n)+'" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" /></p></div></div>'}jQuery.noConflict(),jQuery(document).ready(function($){jQuery("#buprTextBoxContainer").sortable(),jQuery("#buprTextBoxContainer").disableSelection(),jQuery("#bupr_exc_member").select2(),jQuery("#bupr_add_member").select2();for(var acc=document.getElementsByClassName("bupr-accordion"),i=0;i<acc.length;i++)acc[i].onclick=function(){this.classList.toggle("active");var panel=this.nextElementSibling;panel.style.maxHeight?panel.style.maxHeight=null:panel.style.maxHeight=panel.scrollHeight+"px"};var bupr_current_tab=jQuery(".bupr-tab-active").val();jQuery("."+bupr_current_tab).addClass("nav-tab-active"),jQuery(".bupr_enable_criteria").change(function(){jQuery(this).is(":checked")?jQuery(this).val("yes"):jQuery(this).val("no")}),jQuery(document).on("change","#bupr_allow_multiple_criteria",function(){jQuery("#bupr-criteria-builder").toggleClass("bupr-show-if-allowed",!this.checked)}),jQuery(document).on("change","#bupr_review_auto_approval",function(){jQuery(".review-approve-email-section").toggleClass("bupr-show-if-allowed",this.checked)}),jQuery("#bupr-btnAdd").bind("click",function(){jQuery("#buprTextBoxContainer").append(GetDynamicTextBox(""))}),jQuery("body").on("click",".bupr-remove",function(){jQuery(this).parent().parent().parent("div").remove()}),jQuery(document).on("click",".bupr-approve-review",function(){var review_id=jQuery(this).data("rid");jQuery(this).html(bupr_admin_ajax_object.approving_text),jQuery.post(bupr_admin_ajax_object.ajaxurl,{action:"bupr_approve_review",review_id:review_id,nonce:bupr_admin_ajax_object.nonce},function(response){response&&response.success&&response.data&&"review-approved-successfully"===response.data.code?window.location.reload():console.log(response&&response.data?response.data.message:response)})}),jQuery(document).on("keyup","#bupr_member_tab_title",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))}),jQuery(document).on("keyup","#bupr_member_tab_title_plural",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))})}); -
bp-user-profile-reviews/trunk/admin/bupr-admin.php
r3617176 r3736444 40 40 add_filter( 'pre_update_option_bupr_admin_settings', array( $this, 'bupr_update_admin_settings' ), 10, 2 ); 41 41 add_action( 'transition_post_status', array( $this, 'bupr_generate_activity_review_status_change' ), 10, 3 ); 42 add_action( 'template_redirect', array( $this, 'bupr_redirect_review_single' ) ); 42 43 /* Register custom post type review */ 43 44 $bupr_post_types = get_post_types(); … … 207 208 $args = array( 208 209 'labels' => $labels, 209 'public' => true, 210 // Not public: a review's own page, archive, search result and sitemap entry 211 // would show the real author of an anonymous review. Reviews are read on the 212 // member's profile; old /review/ links redirect there (bupr_redirect_review_single). 213 'public' => false, 210 214 'menu_icon' => 'dashicons-testimonial', 211 215 'publicly_queryable' => true, … … 222 226 ), 223 227 'map_meta_cap' => true, 224 'has_archive' => true,228 'has_archive' => false, 225 229 'hierarchical' => false, 226 230 'menu_position' => null, … … 231 235 232 236 /** 237 * Send a review's own URL (/review/slug/) to the review on the member's profile. 238 * Listings (old archive rule, feed, ?post_type=review) and unpublished reviews 239 * 404 so no page renders the author. Group reviews are left to Group Reviews. 240 * 241 * @since 3.8.1 242 */ 243 public function bupr_redirect_review_single() { 244 global $wp_query; 245 if ( ! is_singular( 'review' ) ) { 246 if ( in_array( 'review', (array) get_query_var( 'post_type' ), true ) && ! is_admin() ) { 247 $wp_query->set_404(); 248 status_header( 404 ); 249 } 250 return; 251 } 252 $review_id = get_queried_object_id(); 253 $member_id = (int) get_post_meta( $review_id, 'linked_bp_member', true ); 254 if ( ! $member_id ) { 255 return; 256 } 257 if ( 'publish' === get_post_status( $review_id ) ) { 258 wp_safe_redirect( bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/view/' . $review_id, 301 ); 259 exit; 260 } 261 $wp_query->set_404(); 262 status_header( 404 ); 263 } 264 265 /** 233 266 * Get review count and display in admin menu. 234 267 * … … 248 281 $key = $this->bupr_recursive_array_search( 'edit.php?post_type=review', $menu ); 249 282 250 if ( false === $key ) { 283 // BP Group Reviews shares the review post type and adds the same badge. 284 if ( false === $key || false !== strpos( $menu[ $key ][0], 'awaiting-mod' ) ) { 251 285 return; 252 286 } … … 339 373 340 374 do_action( 'bupr_member_review_after_review_insert', $post->ID, $bupr_member_id ); 341 do_action( 'bupr_sent_review_notification', $bupr_member_id, $post->ID ); 375 376 // A review brought back after its reports were dismissed is not news to the 377 // member. This runs before bupr_handle_review_status_transition() clears the 378 // marker (same priority, registered first), so the marker still means "restore". 379 if ( get_post_meta( $post->ID, 'bupr_auto_hidden', true ) ) { 380 return; 381 } 382 383 // Honour the owner's switches, as the submit path in BUPR_AJAX does. 384 if ( isset( $bupr['allow_notification'] ) && 'yes' === $bupr['allow_notification'] ) { 385 do_action( 'bupr_sent_review_notification', $bupr_member_id, $post->ID ); 386 } 387 if ( ! isset( $bupr['allow_email'] ) || 'yes' !== $bupr['allow_email'] ) { 388 return; 389 } 342 390 343 391 $bupr_admin_general = get_option( 'bupr_admin_general_options' ); … … 369 417 ); 370 418 371 // Check BuddyPress version and use the appropriate function. 372 // Check if the bp_members_get_user_url() function exists (introduced in BuddyPress 12.0.0). 373 if ( function_exists( 'bp_members_get_user_url' ) ) { 374 // Use bp_members_get_user_url() if it exists (for BuddyPress v12.0.0 and above). 375 $bupr_review_url = bp_members_get_user_url( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID; 376 } else { 377 // Fall back to bp_core_get_user_domain() for older versions of BuddyPress. 378 $bupr_review_url = bp_core_get_user_domain( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID; 379 } 419 $bupr_review_url = bupr_member_url( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID; 380 420 $bupr_to = $bupr_reciever_email; 381 421 // Define a default value for $bupr_subject with translation support. … … 406 446 } 407 447 $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' ); 408 wp_mail( $bupr_to, $bupr_subject, nl2br( $bupr_message ), $bupr_header );448 wp_mail( $bupr_to, $bupr_subject, wpautop( $bupr_message ), $bupr_header ); 409 449 } 410 450 } … … 485 525 } 486 526 527 // Pulled by the report threshold, not waiting for first approval. 528 if ( 'draft' === get_post_status( $post_id ) && get_post_meta( $post_id, 'bupr_auto_hidden', true ) ) { 529 $hidden_at = (int) get_post_meta( $post_id, 'bupr_auto_hidden_date', true ); 530 $status_label .= sprintf( 531 ' <span class="bupr-status-auto-hidden" title="%s">%s</span>', 532 /* translators: %s: date and time the review was hidden. */ 533 esc_attr( $hidden_at ? sprintf( __( 'Hidden on %s', 'bp-member-reviews' ), date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $hidden_at ) ) : '' ), 534 esc_html__( 'Auto-hidden', 'bp-member-reviews' ) 535 ); 536 } 537 487 538 printf( 488 539 '<span class="bupr-flag-count %s">%d %s</span>%s', … … 502 553 */ 503 554 public function bupr_add_flagged_filter_link( $views ) { 504 $flagged_count = $this->bupr_get_flagged_reviews_count();555 $flagged_count = bupr_get_flagged_reviews_count(); 505 556 506 557 if ( $flagged_count > 0 ) { … … 524 575 } 525 576 577 $auto_hidden_count = bupr_get_auto_hidden_reviews_count(); 578 if ( $auto_hidden_count > 0 ) { 579 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Checking query param for view highlight only. 580 $current = isset( $_GET['bupr_auto_hidden'] ) && '1' === sanitize_text_field( wp_unslash( $_GET['bupr_auto_hidden'] ) ) ? 'current' : ''; 581 $views['auto_hidden'] = sprintf( 582 '<a href="%s" class="%s">%s <span class="count">(%d)</span></a>', 583 esc_url( 584 add_query_arg( 585 array( 586 'post_type' => 'review', 587 'post_status' => 'draft', 588 'bupr_auto_hidden' => '1', 589 ), 590 admin_url( 'edit.php' ) 591 ) 592 ), 593 esc_attr( $current ), 594 esc_html__( 'Auto-hidden', 'bp-member-reviews' ), 595 (int) $auto_hidden_count 596 ); 597 } 598 526 599 return $views; 527 }528 529 /**530 * Get count of flagged reviews.531 *532 * @since 3.8.0533 * @return int The count of flagged reviews.534 */535 private function bupr_get_flagged_reviews_count() {536 global $wpdb;537 return (int) $wpdb->get_var(538 $wpdb->prepare(539 "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p540 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id541 WHERE p.post_type = %s542 AND p.post_status IN ('publish', 'draft')543 AND pm.meta_key = 'bupr_flag_status'544 AND pm.meta_value = 'flagged'",545 'review'546 )547 );548 600 } 549 601 … … 574 626 'value' => 'flagged', 575 627 'compare' => '=', 628 ), 629 ) 630 ); 631 } 632 633 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Query filter based on URL param, no state change. 634 if ( isset( $_GET['bupr_auto_hidden'] ) && '1' === sanitize_text_field( wp_unslash( $_GET['bupr_auto_hidden'] ) ) ) { 635 $query->set( 'post_status', 'draft' ); 636 // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Necessary for auto-hidden filter functionality. 637 $query->set( 638 'meta_query', 639 array( 640 array( 641 'key' => 'bupr_auto_hidden', 642 'compare' => 'EXISTS', 576 643 ), 577 644 ) … … 704 771 } 705 772 706 $new_status = 'bupr_dismiss_flags' === $doaction ? 'dismissed' : 'resolved'; 707 $updated = 0; 773 // Same Editor gate as the single Dismiss/Resolve actions. 774 if ( ! current_user_can( 'edit_others_posts' ) ) { 775 return $redirect_to; 776 } 777 778 $updated = 0; 708 779 709 780 foreach ( $post_ids as $post_id ) { 710 $current_status = get_post_meta( $post_id, 'bupr_flag_status', true ); 711 if ( 'flagged' === $current_status ) { 712 update_post_meta( $post_id, 'bupr_flag_status', $new_status ); 713 ++$updated; 781 if ( 'flagged' !== get_post_meta( $post_id, 'bupr_flag_status', true ) ) { 782 continue; 714 783 } 784 $this->bupr_close_reports( (int) $post_id, 'bupr_dismiss_flags' === $doaction ? 'dismissed' : 'resolved' ); 785 ++$updated; 715 786 } 716 787 … … 758 829 759 830 /** 831 * Close the reports on one review as dismissed or resolved. Shared by the 832 * single and bulk actions so every path treats reports the same way. 833 * 834 * @since 3.8.1 835 * @param int $review_id Review post ID. 836 * @param string $status 'dismissed' or 'resolved'. 837 */ 838 private function bupr_close_reports( $review_id, $status ) { 839 update_post_meta( $review_id, 'bupr_flag_status', $status ); 840 // Reports up to now were reviewed by an admin; only later ones count toward auto-hide. 841 $bupr_flags = get_post_meta( $review_id, 'bupr_flags', true ); 842 update_post_meta( $review_id, 'bupr_flag_dismissed_at_count', is_array( $bupr_flags ) ? count( $bupr_flags ) : 0 ); 843 844 if ( 'dismissed' !== $status ) { 845 return; 846 } 847 848 // Dismissing means the reports were unfounded: a review they auto-hid comes back. 849 // The publish transition clears the auto-hidden marker and restores its activity. 850 if ( get_post_meta( $review_id, 'bupr_auto_hidden', true ) && 'draft' === get_post_status( $review_id ) ) { 851 wp_update_post( 852 array( 853 'ID' => $review_id, 854 'post_status' => 'publish', 855 ) 856 ); 857 } 858 } 859 860 /** 760 861 * Handle dismiss flag action from admin-post. 761 862 * … … 771 872 772 873 // Check user capabilities. 773 if ( ! current_user_can( 'edit_post', $review_id ) ) { 874 // Moderating reports is an Editor task; edit_post let an Author dismiss reports on their own review. 875 if ( ! current_user_can( 'edit_others_posts' ) ) { 774 876 wp_die( esc_html__( 'You do not have permission to perform this action.', 'bp-member-reviews' ) ); 775 877 } … … 781 883 } 782 884 783 // Update flag status to dismissed. 784 update_post_meta( $review_id, 'bupr_flag_status', 'dismissed' ); 885 $this->bupr_close_reports( $review_id, 'dismissed' ); 785 886 786 887 // Redirect back to the review edit page. … … 812 913 813 914 // Check user capabilities. 814 if ( ! current_user_can( 'edit_post', $review_id ) ) { 915 // Moderating reports is an Editor task; edit_post let an Author dismiss reports on their own review. 916 if ( ! current_user_can( 'edit_others_posts' ) ) { 815 917 wp_die( esc_html__( 'You do not have permission to perform this action.', 'bp-member-reviews' ) ); 816 918 } … … 822 924 } 823 925 824 // Update flag status to resolved. 825 update_post_meta( $review_id, 'bupr_flag_status', 'resolved' ); 926 $this->bupr_close_reports( $review_id, 'resolved' ); 826 927 827 928 // Redirect back to the review edit page. -
bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-criteria-tab.php
r3617176 r3736444 40 40 <?php 41 41 printf( 42 /* translators: 1: Current mode label, 2: Link to Add-ons tab */ 43 esc_html__( 'Rating criteria are only used in Star Ratings mode. You are currently using %1$s mode. To manage criteria, switch to Star Ratings mode in the %2$s tab.', 'bp-member-reviews' ), 44 '<strong>' . esc_html( $mode_label ) . '</strong>', 45 '<a href="' . esc_url( admin_url( 'admin.php?page=bp-member-review-settings&tab=bupr-pro-features' ) ) . '">' . esc_html__( 'Add-ons', 'bp-member-reviews' ) . '</a>' 42 /* translators: %s: Current mode label */ 43 esc_html__( 'Rating criteria are only used in Star Ratings mode. You are currently using %s mode. To manage criteria, switch to Star Ratings mode in the Member Reviews Pro settings.', 'bp-member-reviews' ), 44 '<strong>' . esc_html( $mode_label ) . '</strong>' 46 45 ); 47 46 ?> … … 96 95 </div> 97 96 </div> 98 <div class="wbcom-settings-section-wrap <?php echo esc_attr( $bupr_multi_rating_allowed_class ); ?>">97 <div id="bupr-criteria-builder" class="wbcom-settings-section-wrap <?php echo esc_attr( $bupr_multi_rating_allowed_class ); ?>"> 99 98 <div class="bupr-admin-settings-block"> 100 99 <div id="bupr-settings-tbl" class="bupr-table bupr-criteria-settings-tbl"> … … 117 116 <div class="bupr-admin-col-6 buprcriteria"> 118 117 <p class="bupr-delete-tag"> 119 <input type="button" value="<?php esc_attr_e( ' Delete', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Delete this review criteria', 'bp-member-reviews' ); ?>" class="bupr-criteria-remove-button bupr-remove button button-secondary" />118 <input type="button" value="<?php esc_attr_e( 'Remove', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Remove this review criteria', 'bp-member-reviews' ); ?>" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" /> 120 119 <!-- Removed description span. --> 121 120 </p> … … 131 130 <div id="bupr-add-criteria-action" class="bupr-admin-row border"> 132 131 <div class="bupr-admin-col-12"> 133 <input id="bupr-btnAdd" type="button" value="<?php esc_attr_e( 'Add Criteria', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Add a new review criteria', 'bp-member-reviews' ); ?>" class="bu tton button-secondary"/>134 <p class="description"><?php esc_html_e( 'This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them. ', 'bp-member-reviews' ); ?></p>132 <input id="bupr-btnAdd" type="button" value="<?php esc_attr_e( 'Add Criteria', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Add a new review criteria', 'bp-member-reviews' ); ?>" class="bupr-btn bupr-btn-secondary"/> 133 <p class="description"><?php esc_html_e( 'This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them. With no criteria, reviews are text only and have no stars.', 'bp-member-reviews' ); ?></p> 135 134 </div> 136 135 </div> -
bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-display-tab.php
r3617176 r3736444 15 15 <div class="wbcom-admin-title-section"> 16 16 <h3><?php esc_html_e( 'Display Settings', 'bp-member-reviews' ); ?></h3> 17 <p class="wbcom-welcome-description">18 <b><?php esc_html_e( 'Note', 'bp-member-reviews' ); ?>:</b>19 <?php esc_html_e( 'This setting is applicable only if you have added a criterion for review.', 'bp-member-reviews' ); ?> </p>20 17 </div> 21 18 <div class="wbcom-admin-option-wrap wbcom-admin-option-wrap-view"> -
bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-general-tab.php
r3617176 r3736444 95 95 <div class="wbcom-settings-section-options"> 96 96 <label class="bupr-switch"> 97 <input type="hidden" name="bupr_admin_general_options[bupr_hide_review_button]" value="no"> 97 98 <input name="bupr_admin_general_options[bupr_hide_review_button]" type="checkbox" id="bupr-hide-review-button" <?php checked( esc_attr( $bupr['hide_review_button'] ), 'yes' ); ?> value="yes"> 98 99 <div class="bupr-slider bupr-round"></div> … … 189 190 </div> 190 191 <?php 191 if ( ! empty( $bupr_admin_general ) ) {192 if ( isset( $bupr_admin_general['bupr_auto_approve_reviews'] ) && 'no' === $bupr_admin_general['bupr_auto_approve_reviews'] ) {193 ?>192 // Always rendered so the Auto Approve switch can show/hide them without a save. 193 $bupr_approval_hidden = ( isset( $bupr_admin_general['bupr_auto_approve_reviews'] ) && 'no' === $bupr_admin_general['bupr_auto_approve_reviews'] ) ? '' : ' bupr-show-if-allowed'; 194 ?> 194 195 <!-- admin email section --> 195 <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section ">196 <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section<?php echo esc_attr( $bupr_approval_hidden ); ?>"> 196 197 <div class="wbcom-settings-section-options-heading"> 197 198 <label for="review_approve_email_subject"> … … 204 205 </div> 205 206 </div> 206 <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section ">207 <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section<?php echo esc_attr( $bupr_approval_hidden ); ?>"> 207 208 <div class="wbcom-settings-section-options-heading"> 208 209 <label for="review-approve-email-message"> … … 223 224 ?> 224 225 </div> 225 <?php 226 } 227 } 228 ?> 226 </div> 229 227 <!-- admin email section end --> 230 228 <div class="wbcom-settings-section-wrap"> … … 283 281 <?php esc_html_e( 'Reviewer Roles', 'bp-member-reviews' ); ?> 284 282 </label> 285 <p class="description"><?php esc_html_e( 'Select user roles that can submit reviews. ', 'bp-member-reviews' ); ?></p>283 <p class="description"><?php esc_html_e( 'Select user roles that can submit reviews. A member with any of the selected roles can. An empty list allows every role.', 'bp-member-reviews' ); ?></p> 286 284 </div> 287 285 <div class="wbcom-settings-section-options"> … … 316 314 <?php esc_html_e( 'Reviewee Roles', 'bp-member-reviews' ); ?> 317 315 </label> 318 <p class="description"><?php esc_html_e( 'Select user roles that can receive reviews. ', 'bp-member-reviews' ); ?></p>316 <p class="description"><?php esc_html_e( 'Select user roles that can receive reviews. A member with any of the selected roles can. An empty list allows every role.', 'bp-member-reviews' ); ?></p> 319 317 </div> 320 318 <div class="wbcom-settings-section-options"> -
bp-user-profile-reviews/trunk/assets/css/admin.css
r3617176 r3736444 55 55 Dark mode (ADMIN-1) 56 56 Full dark token scale for the admin panel. Gated behind an EXPLICIT 57 dark-admin signal (WP's is-dark-theme / the "Dark" admin color scheme 58 body.admin-color-dark) rather than prefers-color-scheme. Rationale: WP 57 dark-admin signal (body.is-dark-theme) rather than prefers-color-scheme. 58 body.admin-color-dark is deliberately NOT a trigger: WP's "Dark" admin 59 colour scheme restyles only the menu and toolbar, so the content area 60 stays light and the panel's header text became light-on-light. Rationale: WP 59 61 admin core has no dark mode in 6.x/7.0, so keying off the OS preference 60 62 alone flips this panel dark while the surrounding WP admin chrome (and, … … 63 65 adopts dark uniformly the moment a real dark admin context sets the class. 64 66 ═══════════════════════════════════════════════════════════ */ 65 body.is-dark-theme .bupr-admin, 66 body.admin-color-dark .bupr-admin { 67 body.is-dark-theme .bupr-admin { 67 68 --bupr-admin-white: #1e1e2e; 68 69 --bupr-admin-surface-1: #181825; … … 896 897 } 897 898 899 /* Row widths, desktop only (the <=640px layout stacks rows as columns): 900 text inputs get a real column instead of shrinking to the placeholder width, 901 and rich-text editors take the full row instead of the right half. */ 902 @media (min-width: 641px) { 903 .bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text) { 904 flex: 0 1 480px; 905 } 906 907 .bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap) { 908 flex: 1 1 100%; 909 } 910 } 911 912 /* Toggle switch. The tab templates render label.bupr-switch > checkbox + .bupr-slider; 913 its styles lived in the old wbcom wrapper sheet and were lost in the 3.8.0 shell 914 migration, which left a bare checkbox. */ 915 .bupr-admin .bupr-switch { 916 position: relative; 917 display: inline-block; 918 flex: 0 0 auto; 919 width: 40px; 920 height: 22px; 921 margin: 0; 922 } 923 924 .bupr-admin .bupr-switch input[type="checkbox"] { 925 position: absolute; 926 inset: 0; 927 width: 100%; 928 height: 100%; 929 margin: 0; 930 opacity: 0; 931 cursor: pointer; 932 z-index: 1; 933 } 934 935 .bupr-admin .bupr-slider { 936 position: absolute; 937 inset: 0; 938 border-radius: 999px; 939 background: var(--bupr-admin-border-strong); 940 transition: background 0.15s; 941 } 942 943 .bupr-admin .bupr-slider::before { 944 content: ""; 945 position: absolute; 946 top: 2px; 947 inset-inline-start: 2px; 948 width: 18px; 949 height: 18px; 950 border-radius: 50%; 951 background: #fff; 952 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); 953 transition: transform 0.15s; 954 } 955 956 .bupr-admin .bupr-switch input:checked + .bupr-slider { 957 background: var(--bupr-admin-accent); 958 } 959 960 .bupr-admin .bupr-switch input:checked + .bupr-slider::before { 961 transform: translateX(18px); 962 } 963 964 [dir="rtl"] .bupr-admin .bupr-switch input:checked + .bupr-slider::before { 965 transform: translateX(-18px); 966 } 967 968 .bupr-admin .bupr-switch input:focus-visible + .bupr-slider { 969 outline: 2px solid var(--bupr-admin-accent); 970 outline-offset: 2px; 971 } 972 898 973 .bupr-card--legacy input[type="text"], 899 974 .bupr-card--legacy input[type="number"], … … 1063 1138 } 1064 1139 1140 /* In a column the desktop flex-basis (300px / 480px) becomes a HEIGHT. */ 1141 .bupr-card--legacy .wbcom-settings-section-options-heading, 1142 .bupr-card--legacy .wbcom-settings-section-options { 1143 flex-basis: auto; 1144 } 1145 1065 1146 .bupr-stats-grid, 1066 1147 .bupr-discover-grid { -
bp-user-profile-reviews/trunk/assets/css/bupr-front.css
r3617176 r3736444 582 582 width: 100%; 583 583 padding: 10px; 584 } 585 586 /* Widths below are 100% / calc() plus padding: without border-box they overflow on themes 587 that do not reset box-sizing globally (Twenty Twenty-Five overflowed at every width). */ 588 #review_desc, 589 .bupr-review-modal-content, 590 .bupr-flag-modal-content, 591 .bupr-review-modal-content textarea, 592 .bupr-flag-modal-content textarea { 593 box-sizing: border-box; 594 } 595 596 #review_desc, 597 .bupr-review-modal-content textarea, 598 .bupr-flag-modal-content textarea { 599 max-width: 100%; 584 600 } 585 601 … … 1537 1553 # --bupr-* tokens below; the component rules that consume them are written 1538 1554 # once and fall back to the exact light values, so light mode is unchanged. 1539 # Reign exposes no --bx-color-* vars, so every dark fallback is a dark literal. 1555 # Reign exposes no --bx-color-* vars but redefines its own --reign-* tokens 1556 # under the same [data-bx-mode="dark"] selector (reign-theme critical.css), so 1557 # the four it darkens are read before the dark literal. Only map a --reign-* 1558 # token Reign actually redefines in dark, or dark mode gets its LIGHT value. 1540 1559 --------------------------------------------------------------*/ 1541 1560 html[data-bx-mode="dark"], … … 1543 1562 body.dark-mode, 1544 1563 body.dark-scheme { 1545 --bupr-card-bg: var(--bx-color-bg-elevated, #1e1e1e);1564 --bupr-card-bg: var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e)); 1546 1565 --bupr-chip-bg: var(--bx-color-bg-muted, #272727); 1547 1566 --bupr-chip-bg-hover: var(--bx-color-bg-subtle, #313131); 1548 --bupr-field-bg: var(--bx-color-bg, #161616);1549 --bupr-text: var(--bx-color-fg, #e6e6e6);1567 --bupr-field-bg: var(--bx-color-bg, var(--reign-form-background-color, #161616)); 1568 --bupr-text: var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6)); 1550 1569 --bupr-text-muted: var(--bx-color-fg-muted, #a6a6a6); 1551 1570 --bupr-text-subtle: var(--bx-color-fg-subtle, #8a8a8a); 1552 --bupr-border: var(--bx-color-border, rgba(255, 255, 255, 0.15));1571 --bupr-border: var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15))); 1553 1572 --bupr-reply-bg: var(--bx-color-bg-muted, #232323); 1554 1573 --bupr-reply-hover-bg: rgba(0, 124, 186, 0.15); … … 1661 1680 border-color: #dc3232; 1662 1681 color: var(--bupr-danger-fg, #dc3232); 1682 } 1683 1684 /* BuddyPress styles every button inside .buddypress-wrap at (0,2,1), and its hover rule 1685 (0,3,1) sets a light grey background with `color: inherit` - under a dark theme that is 1686 light text on light grey, so Report / Edit / the modal close vanished on hover. These 1687 buttons own their colours: the .buddypress-wrap ancestor plus a doubled class out-ranks 1688 BP's rules, which load after ours. Theme rules marked !important (BuddyX Pro) still win. */ 1689 .buddypress-wrap .bupr-report-button.bupr-report-button { 1690 background: var(--bupr-chip-bg, #f8f9fa); 1691 border: 1px solid var(--bupr-border, #ddd); 1692 color: var(--bupr-text-muted, #666); 1693 } 1694 1695 .buddypress-wrap .bupr-report-button.bupr-report-button:hover, 1696 .buddypress-wrap .bupr-report-button.bupr-report-button:focus { 1697 background: var(--bupr-danger-bg, #fff0f0); 1698 border-color: #dc3232; 1699 color: var(--bupr-danger-fg, #dc3232); 1700 } 1701 1702 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close { 1703 background: transparent; 1704 border: none; 1705 box-shadow: none; 1706 color: var(--bupr-text-muted, #666); 1707 } 1708 1709 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover, 1710 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus { 1711 background: transparent; 1712 color: var(--bupr-danger-fg, #dc3232); 1713 } 1714 1715 /* Edit Review is a secondary action: the same self-contained chip colours as Report, which 1716 the dark token block also sets. White on the theme accent failed in dark mode, where 1717 BuddyX's accent turns light (1.89:1). */ 1718 button.bupr-edit-review-button, 1719 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button { 1720 background: var(--bupr-chip-bg, #f8f9fa); 1721 border: 1px solid var(--bupr-border, #ddd); 1722 color: var(--bupr-text, #1d2327); 1723 } 1724 1725 button.bupr-edit-review-button:hover, 1726 button.bupr-edit-review-button:focus, 1727 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover, 1728 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus { 1729 background: var(--bupr-chip-bg-hover, #f0f0f1); 1730 border-color: var(--bupr-border, #ddd); 1731 color: var(--bupr-text, #1d2327); 1732 } 1733 1734 /* Report dialog actions and the reply Cancel: the destructive Submit stays red, Cancel 1735 stays neutral instead of a second primary. BuddyX styles every button.button inside the 1736 BP wrapper at (0,3,1) (.buddypress .buddypress-wrap button.button), so these sit at (0,4,1). */ 1737 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit { 1738 background: #dc3232; 1739 border: none; 1740 color: #fff; 1741 } 1742 1743 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover, 1744 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus { 1745 background: #a00; 1746 color: #fff; 1747 } 1748 1749 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel, 1750 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply { 1751 background: var(--bupr-chip-bg, #f0f0f1); 1752 border: 1px solid var(--bupr-border, #dcdcde); 1753 color: var(--bupr-text, #50575e); 1754 } 1755 1756 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover, 1757 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus, 1758 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover, 1759 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus { 1760 background: var(--bupr-chip-bg-hover, #dcdcde); 1761 color: var(--bupr-text, #50575e); 1663 1762 } 1664 1763 -
bp-user-profile-reviews/trunk/assets/css/min/admin.min.css
r3617176 r3736444 1 .bupr-admin{--bupr-admin-accent:#2563eb;--bupr-admin-accent-hover:#1d4ed8;--bupr-admin-accent-light:#eff6ff;--bupr-admin-white:#ffffff;--bupr-admin-surface-1:#f8fafc;--bupr-admin-surface-2:#f1f5f9;--bupr-admin-border:#e2e8f0;--bupr-admin-border-strong:#cbd5e1;--bupr-admin-text:#1e293b;--bupr-admin-text-2:#475569;--bupr-admin-text-3:#64748b;--bupr-admin-text-4:#374151;--bupr-admin-text-muted:#94a3b8;--bupr-admin-success:#16a34a;--bupr-admin-success-hover:#15803d;--bupr-admin-success-light:#dcfce7;--bupr-admin-warn:#f59e0b;--bupr-admin-warn-light:#fef9c3;--bupr-admin-danger:#dc2626;--bupr-admin-danger-hover:#b91c1c;--bupr-admin-danger-light:#fee2e2;--bupr-admin-radius:8px;--bupr-admin-radius-sm:6px;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.06),0 1px 2px rgba(0, 0, 0, 0.04);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.07),0 2px 4px rgba(0, 0, 0, 0.04);--bupr-admin-gap-sm:8px;--bupr-admin-gap-md:16px;--bupr-admin-gap-lg:20px;--bupr-admin-gap-xl:32px}body. admin-color-dark .bupr-admin,body.is-dark-theme .bupr-admin{--bupr-admin-white:#1e1e2e;--bupr-admin-surface-1:#181825;--bupr-admin-surface-2:#11111b;--bupr-admin-border:#313244;--bupr-admin-border-strong:#45475a;--bupr-admin-text:#e4e6eb;--bupr-admin-text-2:#b8bcc8;--bupr-admin-text-3:#9399a8;--bupr-admin-text-4:#c8ccd8;--bupr-admin-text-muted:#7f8496;--bupr-admin-accent-light:#1e293b;--bupr-admin-success-hover:#22c55e;--bupr-admin-success-light:#14311f;--bupr-admin-warn-light:#3a2f10;--bupr-admin-danger-hover:#ef4444;--bupr-admin-danger-light:#3a1518;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.4),0 1px 2px rgba(0, 0, 0, 0.3);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.45),0 2px 4px rgba(0, 0, 0, 0.3)}.bupr-admin{margin:0 20px 0 0;color:var(--bupr-admin-text);font-size:13px;line-height:1.5}.bupr-admin h1,.bupr-admin h2,.bupr-admin h3,.bupr-admin p{margin:0;color:inherit}.bupr-admin a{color:var(--bupr-admin-accent)}.bupr-page-header{display:flex;align-items:center;justify-content:space-between;gap:var(--bupr-admin-gap-md);padding:18px 0 14px;margin:0 0 18px;border-bottom:1px solid var(--bupr-admin-border)}.bupr-page-header__title{display:flex;align-items:center;gap:10px}.bupr-page-header__title h1{font-size:20px;font-weight:700;line-height:1.2;margin:0;padding:0}.bupr-page-header__title .dashicons{color:var(--bupr-admin-accent);width:24px;height:24px;font-size:24px}.bupr-page-header__subtitle{font-size:13px;color:var(--bupr-admin-text-3);margin:2px 0 0}.bupr-page-header__actions{display:flex;align-items:center;gap:8px}.bupr-version-pill{display:inline-block;padding:4px 10px;background:var(--bupr-admin-accent);color:#fff;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.03em}.bupr-settings-layout{display:flex;align-items:flex-start;gap:0;margin-top:var(--bupr-admin-gap-md)}.bupr-settings-sidebar{width:240px;box-sizing:border-box;flex-shrink:0;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);position:sticky;top:32px;overflow:hidden}.bupr-settings-sidebar-brand{display:flex;align-items:center;gap:10px;padding:16px 16px 14px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-settings-brand-icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--bupr-admin-radius-sm);background:var(--bupr-admin-accent);color:#fff;flex-shrink:0}.bupr-settings-brand-icon .dashicons{color:#fff;width:18px;height:18px;font-size:18px}.bupr-settings-brand-text{min-width:0}.bupr-settings-brand-name{margin:0;font-size:13px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-settings-brand-sub{margin:2px 0 0;font-size:10px;color:var(--bupr-admin-text-muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}.bupr-settings-sidebar-nav{padding:8px}.bupr-snav-link{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:var(--bupr-admin-radius-sm);color:var(--bupr-admin-text-2);text-decoration:none;font-size:13px;font-weight:500;line-height:1.4;transition:background .12s,color .12s;margin-bottom:1px}.bupr-snav-link .dashicons{width:16px;height:16px;font-size:16px;flex-shrink:0;color:var(--bupr-admin-text-muted);transition:color .12s}.bupr-snav-link:focus,.bupr-snav-link:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);box-shadow:none}.bupr-snav-link:focus:not(:focus-visible){outline:0}.bupr-snav-link:focus .dashicons,.bupr-snav-link:hover .dashicons{color:var(--bupr-admin-text-3)}.bupr-snav-link:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-snav-link--active,.bupr-snav-link--active:focus,.bupr-snav-link--active:hover{background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);font-weight:600}.bupr-snav-link--active .dashicons{color:var(--bupr-admin-accent)}.bupr-snav-link .dashicons.bupr-snav-link__ext{margin-inline-start:auto;width:14px;height:14px;font-size:14px}.bupr-snav-divider{height:1px;background:var(--bupr-admin-surface-2);margin:8px 0}.bupr-snav-section-label{margin:8px 0 4px 10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--bupr-admin-text-muted)}.bupr-settings-main{flex:1;min-width:0;margin-left:var(--bupr-admin-gap-lg)}.bupr-card{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);margin-bottom:var(--bupr-admin-gap-lg);overflow:hidden}.bupr-card__head{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card__title{font-size:13px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 2px;text-transform:uppercase;letter-spacing:.04em}.bupr-card__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0;line-height:1.5}.bupr-card__body{padding:20px}.bupr-card .form-table{margin:0}.bupr-card .form-table th{padding:14px 20px;font-size:13px;font-weight:500;color:var(--bupr-admin-text-4);width:260px;vertical-align:middle}.bupr-card .form-table td{padding:14px 20px}.bupr-card .form-table tr{border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card .form-table tr:last-child{border-bottom:none}.bupr-status-on{color:var(--bupr-admin-success);font-weight:600}.bupr-status-off{color:var(--bupr-admin-text-3)}.bupr-action-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.bupr-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid transparent;font-size:13px;font-weight:500;line-height:1.4;cursor:pointer;text-decoration:none;transition:background .12s,border-color .12s,color .12s;min-height:40px;box-shadow:none}.bupr-btn .dashicons{width:16px;height:16px;font-size:16px}.bupr-btn-primary{background:var(--bupr-admin-accent);color:#fff;border-color:var(--bupr-admin-accent)}.bupr-btn-primary:focus,.bupr-btn-primary:hover{background:var(--bupr-admin-accent-hover);border-color:var(--bupr-admin-accent-hover);color:#fff}.bupr-btn-secondary{background:var(--bupr-admin-white);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-secondary:focus,.bupr-btn-secondary:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-danger{background:var(--bupr-admin-white);color:var(--bupr-admin-danger);border-color:var(--bupr-admin-danger-light)}.bupr-btn-danger:focus,.bupr-btn-danger:hover{background:var(--bupr-admin-danger);color:#fff;border-color:var(--bupr-admin-danger)}.bupr-btn:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-inline-hint{display:inline-block;margin-left:8px;font-size:12px;font-weight:500}.bupr-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-stat{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:18px}.bupr-stat__label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--bupr-admin-text-muted);margin:0 0 6px}.bupr-stat__value{font-size:26px;font-weight:700;color:var(--bupr-admin-text);line-height:1.1}.bupr-stat__trend{margin:4px 0 0;font-size:12px;color:var(--bupr-admin-text-3)}.bupr-notice{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1);margin-bottom:var(--bupr-admin-gap-md);font-size:13px}.bupr-notice .dashicons{flex-shrink:0}.bupr-notice--info{background:var(--bupr-admin-accent-light);border-color:rgba(37,99,235,.2);color:var(--bupr-admin-accent)}.bupr-notice--warn{background:var(--bupr-admin-warn-light);border-color:rgba(245,158,11,.3);color:#92400e}.bupr-notice--warn a{color:#92400e;text-decoration:underline}.bupr-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:56px 32px;text-align:center}.bupr-empty-state__icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 16px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);border-radius:50%;font-size:32px}.bupr-empty-state__icon .dashicons{width:32px;height:32px;font-size:32px;line-height:1;color:inherit}.bupr-empty-state__title{font-size:16px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 6px;line-height:1.3}.bupr-empty-state__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 auto;max-width:440px;line-height:1.55}.bupr-hub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-hub-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);text-decoration:none;color:var(--bupr-admin-text);transition:transform .12s,box-shadow .12s,border-color .12s}.bupr-hub-card:focus,.bupr-hub-card:hover{border-color:var(--bupr-admin-accent);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px);color:var(--bupr-admin-text);text-decoration:none}.bupr-hub-card:focus:not(:focus-visible){outline:0}.bupr-hub-card:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-hub-card__icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:10px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent)}.bupr-hub-card__icon .dashicons{width:22px;height:22px;font-size:22px;color:inherit}.bupr-hub-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-hub-card__subtitle{font-size:12px;color:var(--bupr-admin-text-3);line-height:1.4}.bupr-hub-card__cta{margin-top:auto;display:inline-flex;align-items:center;gap:4px;padding-top:6px;font-size:13px;font-weight:600;color:var(--bupr-admin-accent)}.bupr-hub-card__cta .dashicons{width:16px;height:16px;font-size:16px;transition:transform .12s}.bupr-hub-card:hover .bupr-hub-card__cta .dashicons{transform:translateX(2px)}.bupr-discover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md)}.bupr-discover-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);transition:box-shadow .12s,border-color .12s,transform .12s}.bupr-discover-card:hover{border-color:var(--bupr-admin-border-strong);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px)}.bupr-discover-card__logo{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px}.bupr-discover-card__logo img{width:52px;height:52px;object-fit:contain;display:block;border-radius:var(--bupr-admin-radius-sm)}.bupr-discover-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2;margin:0}.bupr-discover-card__desc{font-size:13px;color:var(--bupr-admin-text-3);line-height:1.5;margin:0;flex:1 1 auto}.bupr-discover-card__cta{margin-top:4px}.bupr-discover-card__cta .dashicons{width:14px;height:14px;font-size:14px}.bupr-admin .notice{border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:12px 16px;margin:0 0 18px;font-size:14px;line-height:1.5;border-width:0;border-inline-start-width:4px;border-style:solid}.bupr-admin .notice p{margin:0;padding:0;font-size:14px;line-height:1.5}.bupr-admin .notice.is-dismissible{padding-right:38px}.bupr-admin .notice .notice-dismiss{top:8px;right:8px}.bupr-card--legacy .bupr-card__body{padding:0}.bupr-card--legacy .wbcom-tab-content{padding:0}.bupr-card--legacy .wbcom-admin-title-section{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card--legacy .wbcom-admin-title-section h3{font-size:13px;font-weight:700;color:var(--bupr-admin-text);text-transform:uppercase;letter-spacing:.04em;margin:0}.bupr-card--legacy .wbcom-admin-title-section p,.bupr-card--legacy .wbcom-welcome-description{font-size:13px;color:var(--bupr-admin-text-3);margin:4px 0 0}.bupr-card--legacy .wbcom-admin-option-wrap{padding:8px 20px 20px}.bupr-card--legacy .wbcom-settings-section-wrap{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card--legacy .wbcom-settings-section-wrap:last-of-type{border-bottom:none}.bupr-card--legacy .wbcom-settings-section-options-heading{flex:1 1 300px;min-width:0}.bupr-card--legacy .wbcom-settings-section-options-heading label{font-size:13px;font-weight:600;color:var(--bupr-admin-text-4);display:block}.bupr-card--legacy .wbcom-settings-section-options-heading .description{font-size:12px;color:var(--bupr-admin-text-3);margin:6px 0 0;line-height:1.5}.bupr-card--legacy .wbcom-settings-section-options{flex:0 1 auto}.bupr-card--legacy input.large-text,.bupr-card--legacy input[type=email],.bupr-card--legacy input[type=number],.bupr-card--legacy input[type=text],.bupr-card--legacy select,.bupr-card--legacy textarea{border:1px solid var(--bupr-admin-border-strong);border-radius:var(--bupr-admin-radius-sm);font-size:13px}.bupr-card--legacy input.large-text{width:100%;max-width:480px}.bupr-card--legacy .submit,.bupr-card--legacy p.submit{padding:16px 20px;margin:0;border-top:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-toast-host{position:fixed;right:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-toast{background:var(--bupr-admin-text);color:#fff;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);font-size:13px;font-weight:500;box-shadow:var(--bupr-admin-shadow-hover);min-width:240px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-toast--visible{opacity:1;transform:translateY(0)}.bupr-toast--success{background:var(--bupr-admin-success)}.bupr-toast--error{background:var(--bupr-admin-danger)}.bupr-confirm-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:100001;display:flex;align-items:center;justify-content:center;padding:24px}.bupr-confirm{background:var(--bupr-admin-white);border-radius:var(--bupr-admin-radius);box-shadow:0 20px 40px rgba(0,0,0,.2);max-width:420px;width:100%;padding:24px}.bupr-confirm__title{font-size:16px;font-weight:700;margin:0 0 8px;color:var(--bupr-admin-text)}.bupr-confirm__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 0 18px;line-height:1.5}.bupr-confirm__actions{display:flex;gap:8px;justify-content:flex-end}@media (max-width:1024px){.bupr-settings-layout{flex-direction:column}.bupr-settings-sidebar{width:100%;position:static;top:auto}.bupr-settings-sidebar-nav{display:flex;flex-wrap:wrap;padding:8px}.bupr-snav-link{flex:1 1 auto;justify-content:center}.bupr-snav-divider,.bupr-snav-section-label{display:none}.bupr-settings-main{margin-left:0;margin-top:var(--bupr-admin-gap-md)}}@media (max-width:640px){.bupr-admin{margin-right:0}.bupr-page-header{flex-direction:column;align-items:flex-start;gap:8px}.bupr-card .form-table td,.bupr-card .form-table th{display:block;width:100%;padding:8px 16px}.bupr-card--legacy .wbcom-settings-section-wrap{flex-direction:column}.bupr-discover-grid,.bupr-stats-grid{grid-template-columns:1fr}}1 .bupr-admin{--bupr-admin-accent:#2563eb;--bupr-admin-accent-hover:#1d4ed8;--bupr-admin-accent-light:#eff6ff;--bupr-admin-white:#ffffff;--bupr-admin-surface-1:#f8fafc;--bupr-admin-surface-2:#f1f5f9;--bupr-admin-border:#e2e8f0;--bupr-admin-border-strong:#cbd5e1;--bupr-admin-text:#1e293b;--bupr-admin-text-2:#475569;--bupr-admin-text-3:#64748b;--bupr-admin-text-4:#374151;--bupr-admin-text-muted:#94a3b8;--bupr-admin-success:#16a34a;--bupr-admin-success-hover:#15803d;--bupr-admin-success-light:#dcfce7;--bupr-admin-warn:#f59e0b;--bupr-admin-warn-light:#fef9c3;--bupr-admin-danger:#dc2626;--bupr-admin-danger-hover:#b91c1c;--bupr-admin-danger-light:#fee2e2;--bupr-admin-radius:8px;--bupr-admin-radius-sm:6px;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.06),0 1px 2px rgba(0, 0, 0, 0.04);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.07),0 2px 4px rgba(0, 0, 0, 0.04);--bupr-admin-gap-sm:8px;--bupr-admin-gap-md:16px;--bupr-admin-gap-lg:20px;--bupr-admin-gap-xl:32px}body.is-dark-theme .bupr-admin{--bupr-admin-white:#1e1e2e;--bupr-admin-surface-1:#181825;--bupr-admin-surface-2:#11111b;--bupr-admin-border:#313244;--bupr-admin-border-strong:#45475a;--bupr-admin-text:#e4e6eb;--bupr-admin-text-2:#b8bcc8;--bupr-admin-text-3:#9399a8;--bupr-admin-text-4:#c8ccd8;--bupr-admin-text-muted:#7f8496;--bupr-admin-accent-light:#1e293b;--bupr-admin-success-hover:#22c55e;--bupr-admin-success-light:#14311f;--bupr-admin-warn-light:#3a2f10;--bupr-admin-danger-hover:#ef4444;--bupr-admin-danger-light:#3a1518;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.4),0 1px 2px rgba(0, 0, 0, 0.3);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.45),0 2px 4px rgba(0, 0, 0, 0.3)}.bupr-admin{margin:0 20px 0 0;color:var(--bupr-admin-text);font-size:13px;line-height:1.5}.bupr-admin h1,.bupr-admin h2,.bupr-admin h3,.bupr-admin p{margin:0;color:inherit}.bupr-admin a{color:var(--bupr-admin-accent)}.bupr-page-header{display:flex;align-items:center;justify-content:space-between;gap:var(--bupr-admin-gap-md);padding:18px 0 14px;margin:0 0 18px;border-bottom:1px solid var(--bupr-admin-border)}.bupr-page-header__title{display:flex;align-items:center;gap:10px}.bupr-page-header__title h1{font-size:20px;font-weight:700;line-height:1.2;margin:0;padding:0}.bupr-page-header__title .dashicons{color:var(--bupr-admin-accent);width:24px;height:24px;font-size:24px}.bupr-page-header__subtitle{font-size:13px;color:var(--bupr-admin-text-3);margin:2px 0 0}.bupr-page-header__actions{display:flex;align-items:center;gap:8px}.bupr-version-pill{display:inline-block;padding:4px 10px;background:var(--bupr-admin-accent);color:#fff;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.03em}.bupr-settings-layout{display:flex;align-items:flex-start;gap:0;margin-top:var(--bupr-admin-gap-md)}.bupr-settings-sidebar{width:240px;box-sizing:border-box;flex-shrink:0;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);position:sticky;top:32px;overflow:hidden}.bupr-settings-sidebar-brand{display:flex;align-items:center;gap:10px;padding:16px 16px 14px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-settings-brand-icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--bupr-admin-radius-sm);background:var(--bupr-admin-accent);color:#fff;flex-shrink:0}.bupr-settings-brand-icon .dashicons{color:#fff;width:18px;height:18px;font-size:18px}.bupr-settings-brand-text{min-width:0}.bupr-settings-brand-name{margin:0;font-size:13px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-settings-brand-sub{margin:2px 0 0;font-size:10px;color:var(--bupr-admin-text-muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}.bupr-settings-sidebar-nav{padding:8px}.bupr-snav-link{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:var(--bupr-admin-radius-sm);color:var(--bupr-admin-text-2);text-decoration:none;font-size:13px;font-weight:500;line-height:1.4;transition:background .12s,color .12s;margin-bottom:1px}.bupr-snav-link .dashicons{width:16px;height:16px;font-size:16px;flex-shrink:0;color:var(--bupr-admin-text-muted);transition:color .12s}.bupr-snav-link:focus,.bupr-snav-link:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);box-shadow:none}.bupr-snav-link:focus:not(:focus-visible){outline:0}.bupr-snav-link:focus .dashicons,.bupr-snav-link:hover .dashicons{color:var(--bupr-admin-text-3)}.bupr-snav-link:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-snav-link--active,.bupr-snav-link--active:focus,.bupr-snav-link--active:hover{background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);font-weight:600}.bupr-snav-link--active .dashicons{color:var(--bupr-admin-accent)}.bupr-snav-link .dashicons.bupr-snav-link__ext{margin-inline-start:auto;width:14px;height:14px;font-size:14px}.bupr-snav-divider{height:1px;background:var(--bupr-admin-surface-2);margin:8px 0}.bupr-snav-section-label{margin:8px 0 4px 10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--bupr-admin-text-muted)}.bupr-settings-main{flex:1;min-width:0;margin-left:var(--bupr-admin-gap-lg)}.bupr-card{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);margin-bottom:var(--bupr-admin-gap-lg);overflow:hidden}.bupr-card__head{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card__title{font-size:13px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 2px;text-transform:uppercase;letter-spacing:.04em}.bupr-card__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0;line-height:1.5}.bupr-card__body{padding:20px}.bupr-card .form-table{margin:0}.bupr-card .form-table th{padding:14px 20px;font-size:13px;font-weight:500;color:var(--bupr-admin-text-4);width:260px;vertical-align:middle}.bupr-card .form-table td{padding:14px 20px}.bupr-card .form-table tr{border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card .form-table tr:last-child{border-bottom:none}.bupr-status-on{color:var(--bupr-admin-success);font-weight:600}.bupr-status-off{color:var(--bupr-admin-text-3)}.bupr-action-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.bupr-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid transparent;font-size:13px;font-weight:500;line-height:1.4;cursor:pointer;text-decoration:none;transition:background .12s,border-color .12s,color .12s;min-height:40px;box-shadow:none}.bupr-btn .dashicons{width:16px;height:16px;font-size:16px}.bupr-btn-primary{background:var(--bupr-admin-accent);color:#fff;border-color:var(--bupr-admin-accent)}.bupr-btn-primary:focus,.bupr-btn-primary:hover{background:var(--bupr-admin-accent-hover);border-color:var(--bupr-admin-accent-hover);color:#fff}.bupr-btn-secondary{background:var(--bupr-admin-white);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-secondary:focus,.bupr-btn-secondary:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-danger{background:var(--bupr-admin-white);color:var(--bupr-admin-danger);border-color:var(--bupr-admin-danger-light)}.bupr-btn-danger:focus,.bupr-btn-danger:hover{background:var(--bupr-admin-danger);color:#fff;border-color:var(--bupr-admin-danger)}.bupr-btn:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-inline-hint{display:inline-block;margin-left:8px;font-size:12px;font-weight:500}.bupr-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-stat{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:18px}.bupr-stat__label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--bupr-admin-text-muted);margin:0 0 6px}.bupr-stat__value{font-size:26px;font-weight:700;color:var(--bupr-admin-text);line-height:1.1}.bupr-stat__trend{margin:4px 0 0;font-size:12px;color:var(--bupr-admin-text-3)}.bupr-notice{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1);margin-bottom:var(--bupr-admin-gap-md);font-size:13px}.bupr-notice .dashicons{flex-shrink:0}.bupr-notice--info{background:var(--bupr-admin-accent-light);border-color:rgba(37,99,235,.2);color:var(--bupr-admin-accent)}.bupr-notice--warn{background:var(--bupr-admin-warn-light);border-color:rgba(245,158,11,.3);color:#92400e}.bupr-notice--warn a{color:#92400e;text-decoration:underline}.bupr-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:56px 32px;text-align:center}.bupr-empty-state__icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 16px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);border-radius:50%;font-size:32px}.bupr-empty-state__icon .dashicons{width:32px;height:32px;font-size:32px;line-height:1;color:inherit}.bupr-empty-state__title{font-size:16px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 6px;line-height:1.3}.bupr-empty-state__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 auto;max-width:440px;line-height:1.55}.bupr-hub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-hub-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);text-decoration:none;color:var(--bupr-admin-text);transition:transform .12s,box-shadow .12s,border-color .12s}.bupr-hub-card:focus,.bupr-hub-card:hover{border-color:var(--bupr-admin-accent);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px);color:var(--bupr-admin-text);text-decoration:none}.bupr-hub-card:focus:not(:focus-visible){outline:0}.bupr-hub-card:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-hub-card__icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:10px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent)}.bupr-hub-card__icon .dashicons{width:22px;height:22px;font-size:22px;color:inherit}.bupr-hub-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-hub-card__subtitle{font-size:12px;color:var(--bupr-admin-text-3);line-height:1.4}.bupr-hub-card__cta{margin-top:auto;display:inline-flex;align-items:center;gap:4px;padding-top:6px;font-size:13px;font-weight:600;color:var(--bupr-admin-accent)}.bupr-hub-card__cta .dashicons{width:16px;height:16px;font-size:16px;transition:transform .12s}.bupr-hub-card:hover .bupr-hub-card__cta .dashicons{transform:translateX(2px)}.bupr-discover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md)}.bupr-discover-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);transition:box-shadow .12s,border-color .12s,transform .12s}.bupr-discover-card:hover{border-color:var(--bupr-admin-border-strong);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px)}.bupr-discover-card__logo{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px}.bupr-discover-card__logo img{width:52px;height:52px;object-fit:contain;display:block;border-radius:var(--bupr-admin-radius-sm)}.bupr-discover-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2;margin:0}.bupr-discover-card__desc{font-size:13px;color:var(--bupr-admin-text-3);line-height:1.5;margin:0;flex:1 1 auto}.bupr-discover-card__cta{margin-top:4px}.bupr-discover-card__cta .dashicons{width:14px;height:14px;font-size:14px}.bupr-admin .notice{border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:12px 16px;margin:0 0 18px;font-size:14px;line-height:1.5;border-width:0;border-inline-start-width:4px;border-style:solid}.bupr-admin .notice p{margin:0;padding:0;font-size:14px;line-height:1.5}.bupr-admin .notice.is-dismissible{padding-right:38px}.bupr-admin .notice .notice-dismiss{top:8px;right:8px}.bupr-card--legacy .bupr-card__body{padding:0}.bupr-card--legacy .wbcom-tab-content{padding:0}.bupr-card--legacy .wbcom-admin-title-section{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card--legacy .wbcom-admin-title-section h3{font-size:13px;font-weight:700;color:var(--bupr-admin-text);text-transform:uppercase;letter-spacing:.04em;margin:0}.bupr-card--legacy .wbcom-admin-title-section p,.bupr-card--legacy .wbcom-welcome-description{font-size:13px;color:var(--bupr-admin-text-3);margin:4px 0 0}.bupr-card--legacy .wbcom-admin-option-wrap{padding:8px 20px 20px}.bupr-card--legacy .wbcom-settings-section-wrap{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card--legacy .wbcom-settings-section-wrap:last-of-type{border-bottom:none}.bupr-card--legacy .wbcom-settings-section-options-heading{flex:1 1 300px;min-width:0}.bupr-card--legacy .wbcom-settings-section-options-heading label{font-size:13px;font-weight:600;color:var(--bupr-admin-text-4);display:block}.bupr-card--legacy .wbcom-settings-section-options-heading .description{font-size:12px;color:var(--bupr-admin-text-3);margin:6px 0 0;line-height:1.5}.bupr-card--legacy .wbcom-settings-section-options{flex:0 1 auto}@media (min-width:641px){.bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text){flex:0 1 480px}.bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap){flex:1 1 100%}}.bupr-admin .bupr-switch{position:relative;display:inline-block;flex:0 0 auto;width:40px;height:22px;margin:0}.bupr-admin .bupr-switch input[type=checkbox]{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer;z-index:1}.bupr-admin .bupr-slider{position:absolute;inset:0;border-radius:999px;background:var(--bupr-admin-border-strong);transition:background .15s}.bupr-admin .bupr-slider::before{content:"";position:absolute;top:2px;inset-inline-start:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s}.bupr-admin .bupr-switch input:checked+.bupr-slider{background:var(--bupr-admin-accent)}.bupr-admin .bupr-switch input:checked+.bupr-slider::before{transform:translateX(18px)}[dir=rtl] .bupr-admin .bupr-switch input:checked+.bupr-slider::before{transform:translateX(-18px)}.bupr-admin .bupr-switch input:focus-visible+.bupr-slider{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-card--legacy input.large-text,.bupr-card--legacy input[type=email],.bupr-card--legacy input[type=number],.bupr-card--legacy input[type=text],.bupr-card--legacy select,.bupr-card--legacy textarea{border:1px solid var(--bupr-admin-border-strong);border-radius:var(--bupr-admin-radius-sm);font-size:13px}.bupr-card--legacy input.large-text{width:100%;max-width:480px}.bupr-card--legacy .submit,.bupr-card--legacy p.submit{padding:16px 20px;margin:0;border-top:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-toast-host{position:fixed;right:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-toast{background:var(--bupr-admin-text);color:#fff;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);font-size:13px;font-weight:500;box-shadow:var(--bupr-admin-shadow-hover);min-width:240px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-toast--visible{opacity:1;transform:translateY(0)}.bupr-toast--success{background:var(--bupr-admin-success)}.bupr-toast--error{background:var(--bupr-admin-danger)}.bupr-confirm-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:100001;display:flex;align-items:center;justify-content:center;padding:24px}.bupr-confirm{background:var(--bupr-admin-white);border-radius:var(--bupr-admin-radius);box-shadow:0 20px 40px rgba(0,0,0,.2);max-width:420px;width:100%;padding:24px}.bupr-confirm__title{font-size:16px;font-weight:700;margin:0 0 8px;color:var(--bupr-admin-text)}.bupr-confirm__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 0 18px;line-height:1.5}.bupr-confirm__actions{display:flex;gap:8px;justify-content:flex-end}@media (max-width:1024px){.bupr-settings-layout{flex-direction:column}.bupr-settings-sidebar{width:100%;position:static;top:auto}.bupr-settings-sidebar-nav{display:flex;flex-wrap:wrap;padding:8px}.bupr-snav-link{flex:1 1 auto;justify-content:center}.bupr-snav-divider,.bupr-snav-section-label{display:none}.bupr-settings-main{margin-left:0;margin-top:var(--bupr-admin-gap-md)}}@media (max-width:640px){.bupr-admin{margin-right:0}.bupr-page-header{flex-direction:column;align-items:flex-start;gap:8px}.bupr-card .form-table td,.bupr-card .form-table th{display:block;width:100%;padding:8px 16px}.bupr-card--legacy .wbcom-settings-section-wrap{flex-direction:column}.bupr-card--legacy .wbcom-settings-section-options,.bupr-card--legacy .wbcom-settings-section-options-heading{flex-basis:auto}.bupr-discover-grid,.bupr-stats-grid{grid-template-columns:1fr}} -
bp-user-profile-reviews/trunk/assets/css/min/bupr-front.min.css
r3617176 r3736444 1 .stars{display:inline-block}[class*=bupr-col-]{float:inline-start;padding:10px 0}.bupr-col-1{width:8.33%}.bupr-col-2{width:16.66%}.bupr-col-3{width:25%}.bupr-col-4{width:33.33%}.bupr-col-5{width:41.66%}.bupr-col-6{width:50%}.bupr-col-7{width:58.33%}.bupr-col-8{width:66.66%}.bupr-col-9{width:75%}.bupr-col-10{width:83.33%}.bupr-col-11{width:91.66%}.bupr-col-12{width:100%}.bupr-row{clear:both;border-bottom:1px solid rgba(0,0,0,.1);overflow:hidden;padding:15px 0;display:block}.bupr-row:first-child{padding-top:0}.bupr-row:last-child{padding-bottom:0;border-bottom:0}.bp-nouveau .bupr-row{margin-bottom:20px;padding:15px;background:#fff;border:0;box-shadow:0 0 3px 0 rgba(0,0,0,.16)}.bupr-review-full-description{display:none;padding-top:20px}.bupr-criteria-label{word-break:break-word}.bupr-criteria-label span{display:inline;width:50%;height:40px}@media only screen and (max-width:768px){[class*=bupr-col-]{width:100%}.bupr-criteria-label span{display:inline;width:100%;clear:inline-start}}.sel{color:red}.bupr-accept-button,.bupr-deny-button{float:inline-start;margin-inline-end:5px}.bupr-pagination{border-bottom:0;clear:both}.single-headers #bupr-add-review-btn{list-style:none;margin:10px 10px 0 0}.single-headers .bb-enable-cover-img .member-header-actions>#bupr-add-review-btn{margin:5px 10px 10px 0}.bupr_members_review_setting ul.bupr-member-main li.bupr-members,.widget ul#bp-member-rating li{height:auto;width:100%;position:relative;display:block;margin:0;padding:.5em 0}ul.bupr-member-main{margin:0;list-style:none;padding:0}.bupr_members_review_setting ul.bupr-member-main li:first-child,.widget ul#bp-member-rating li:first-child{padding-top:0}.bupr_members_review_setting ul.bupr-member-main li:last-child,.widget ul#bp-member-rating li:last-child{padding-bottom:0;border-bottom:0}.widget ul#bp-member-rating .item-avatar,ul.bupr-member-main li.bupr-members img.avatar{width:50px;height:50px;float:inline-start}.widget ul#bp-member-rating .item,ul.bupr-member-main li.bupr-members .bupr-content-widget{margin-inline-start:70px}ul.bupr-member-main li.bupr-members.bupr-hide .bupr-content-widget{margin-inline-start:0}ul.bupr-member-main li.bupr-members .bupr-meta{display:block;font-size:90%;line-height:normal;margin-top:5px}.bupr-modal-msg{margin:50px 0;text-align:center}.bupr-members-profiles{text-align:center;width:80px;float:inline-start;text-align:start}.bupr-members-profiles img.avatar{max-width:50px;max-height:50px}.bupr-members-profiles .reviewer h4{text-transform:capitalize;margin:10px 0 0;font-size:80%}.bupr-members-content{margin-inline-start:100px}.bupr-members-content .review-subject h4{margin:5px 0}.bupr-review-modal{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);opacity:0;visibility:hidden;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);-webkit-transition:visibility 0s linear .25s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear .25s,opacity .25s 0s,transform .25s;z-index:9999999}.bupr-review-modal-content{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit);padding:1rem 1.5rem;max-width:30rem;width:-webkit-calc(100% - 30px);width:calc(100% - 30px);margin:auto;border-radius:8px}#bupr-edit-review-modal .bupr-review-modal-close-button{float:inline-end;width:1.75rem;height:1.75rem;min-width:0;padding:0;margin:0;line-height:1.75rem;font-size:1.5rem;text-align:center;text-transform:none;text-shadow:none;letter-spacing:normal;cursor:pointer;border:0;box-shadow:none;background:0 0;color:var(--bupr-text-muted,#666);border-radius:.25rem;-webkit-transition:background-color .2s,color .2s,-webkit-transform .2s;transition:background-color .2s,color .2s,transform .2s}#bupr-edit-review-modal .bupr-review-modal-close-button:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);background:var(--bupr-chip-bg-hover,rgba(0,0,0,.06));color:var(--bupr-text,#1d2327)}#bupr-edit-review-modal .bupr-review-modal-close-button:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}#bupr-edit-review-modal .bupr-review-modal-close-button:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.bupr-show-modal{opacity:1;visibility:visible;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:visibility 0s linear 0s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear 0s,opacity .25s 0s,transform .25s}.bupr-edit-review-button-wrapper{text-align:end;margin-bottom:10px}.bp-member-reviews .bupr-row{position:relative;padding-inline-end:160px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:absolute;inset-inline-end:15px}@media only screen and (max-width:480px){.bp-member-reviews .bupr-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-inline-end:15px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:static;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;margin:15px 0 0}}button.bupr-edit-review-button{padding:10px;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-inline-start:auto}.bupr-review-modal-content button#bupr_upodate_review{text-align:center;margin:auto;width:100%;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-posts-pagination{margin:15px 0;text-align:end}.bupr-posts-pagination span{border:1px solid #7f7f7f;border-radius:5px;margin:0 5px;padding:5px 10px}.bupr-posts-pagination .page-numbers{border:1px solid rgba(0,0,0,.1);border-radius:3px;margin:0 0;padding:0;background:#fff;display:inline-block;height:32px;width:32px;text-align:center;line-height:32px;font-size:80%;font-weight:700}.bupr-posts-pagination .next.page-numbers,.bupr-posts-pagination .prev.page-numbers{width:auto;padding:0 10px}.bupr-single-reivew{margin-top:20px}.no-count{margin-inline-start:3px}#bupr_success_review p{display:none}.bupr-save-reivew-spinner{display:none;float:inline-start;margin-inline-start:10px;margin-top:8px}.bupr-error-fields{display:none;font-size:12px;color:red}.bupr-review-error-fields{display:none;font-size:14px;color:red}.bupr-error{width:100%;padding:10px;border-radius:5px;background-color:#f1dede;border-color:#ebcbd0;color:#a84341;margin-top:10px}.br-theme-bars-square .bupr-rating-widget{height:15px;white-space:nowrap}.br-theme-bars-square .bupr-rating-widget a{display:block;width:28px;height:28px;float:inline-start;border:2px solid #8a9bc4;background-color:#fff;margin:2px;text-decoration:none;font-size:12px;font-weight:400;line-height:2;text-align:center;color:#5a6b96;font-weight:600}.br-theme-bars-square .bupr-rating-widget a:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.br-theme-bars-square .bupr-rating-widget a.bupr-square-selected{border:2px solid #1a56db;color:#1a56db}.br-theme-bars-square .br-readonly a{cursor:default}.br-theme-bars-square .br-readonly a.bupr-square-selected{border:2px solid #2c5fd0;color:#2c5fd0}@media print{.br-theme-bars-square .bupr-rating-widget a{border:2px solid #b3b3b3;color:#b3b3b3}}.br-theme-bars-square .br-readonly a.bupr-square-half{border-top:2px solid #2c5fd0;border-inline-start:2px solid #2c5fd0;color:#2c5fd0}.br-theme-bars-square .bupr-rating-widget a.bupr-square-half{border-top:2px solid #1a56db;border-inline-start:2px solid #1a56db;color:#1a56db}.item-header-content .activity{margin-bottom:10px}.success_review_msg{color:#4f8a10;background-color:#dff2bf;font-weight:700;margin-top:3px;text-decoration:none;margin-bottom:1.75em;border-radius:5px}.success_review_msg p{padding:10px 15px;margin:0}.bupr-star-rate{margin-inline-end:0}#review_desc,.bupr-bp-member-review-no-popup-add-block #review_desc{width:100%;padding:10px} .bupr-bp-member-review-no-popup-add-block #bupr_save_review{width:100%;margin:0;max-width:160px;height:auto;float:inline-start}.bp-member-add-form:after{content:"";display:table;clear:both}.bp-member-add-form input[type=checkbox]#bupr_anonymous_review{vertical-align:middle;margin:0 5px 0 0}.add_review_msg{display:none}.success_review_msg{display:none}#bupr-view-review-btn{width:100%}.bupr-member-review-wrapper{margin:10px 0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bupr-member-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-member-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-member-tooltip:hover::before{opacity:1;visibility:visible}.bupr-member-rating-text{font-size:14px;color:#555;margin-inline-start:5px}body.bp-legacy:not([class*=youzify]) .bupr-directory-review-parent-container{display:block}.bupr-directory-review-parent-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:10px 0}.bupr-directory-review-wrapper{margin:0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bp-list.grid .bupr-directory-review-wrapper{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bp-list:not(.grid) .bupr-directory-review-wrapper{display:block}.bupr-directory-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-directory-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-directory-tooltip:hover::before{opacity:1;visibility:visible}.bupr-directory-rating-text{font-size:14px;color:#555;margin-inline-start:5px}.kleo-masonry-item .member-review-stars{text-align:center}.widget.bupr_members_review_setting{overflow:hidden}.posted-on.list{padding-top:10px}.widget-area .widget.buddypress div.item-options#bp-member-rating-list-options a{margin:0}.bp-nouveau .widget-area .widget.buddypress #bp-member-rating div.item{padding:0}.bb-grid .widget.buddypress div.item-options#bp-member-rating-list-options a{margin-inline-end:1.25rem;margin-top:10px}.kleo-page .widget.buddypress #bp-member-rating div.item-avatar img.avatar{width:50px;height:50px;margin:0;border-radius:0}.rating-sec{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:10px}.rating-num{margin:0 10px;font-weight:700}.rating-sec .posted-on.list{padding:0}.bupr-full-description{word-break:break-all}.description{font-style:italic;margin-bottom:10px}.description p{margin:0}li#bupr-add-review-btn a.add-review{margin:0;display:inline-block}body[class*=youzify] .youzify-head-content .bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}body[class*=youzify].reviews .youzify-page-main-content .youzify-main-column div#subnav.item-list-tabs{margin:0}body[class*=youzify].add-review .youzify-page-main-content .youzify-main-column .bupr-bp-member-review-no-popup-add-block,body[class*=youzify].reviews .youzify-page-main-content .bupr-bp-member-reviews-block .bp-member-reviews{padding:30px;border-top:1px solid #eee;background-color:var(--reign-site-sections-bg-color);background-color:var(--yzfy-card-bg-color);margin:0}body[class*=youzify] .youzify-page-main-content #bupr-reiew-edit button.bupr-edit-review-button,body[class*=youzify].add-review .youzify-page-main-content button#bupr_save_review{color:#fff}#review_desc,body[class*=youzify] .youzify-page-main-content .bupr-bp-member-review-no-popup-add-block #review_desc{margin-top:15px}.youzify .bupr-save-reivew-spinner{display:none}body[class*=youzify] #bupr-add-review-btn .add-review.button{padding:12px 20px;margin-top:15px;display:inline-block;text-align:center;border-radius:8px;background-color:var(--yzfy-scheme-color)!important;color:var(--yzfy-scheme-text-color)!important}body[class*=youzify] #bupr-add-review-btn .add-review.button:hover{background-color:#005177}.olympus-theme .bgr-submit-review,.olympus-theme .bgr-submit-review:hover{color:inherit}body[class*=youzify] .bupr-member-tooltip .bupr-member-rating-text{color:var(--yzfy-scheme-text-color)!important}@media only screen and (max-width:480px){.bupr-members-profiles{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;float:none;width:100%;margin-bottom:10px}.bupr-members-content,.bupr-members-profiles .reviewer h4{margin:0}.rating-num{margin-inline-start:0}.rating-star{margin-inline-end:10px}body[class*=youzify] .youzify-page-main-content .bupr-criteria-label{margin-bottom:10px}}@media only screen and (max-width:768px){.multi-review{display:-webkit-box;display:-ms-flexbox;display:flex}.bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}@media only screen and (max-width:480px){.multi-review{display:inline-block}}.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-add-review-personal-li a i::before,.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-view-personal-li a i::before{content:"\f005"}.bupr-youzify-show-modal #youzify-profile-navmenu,.bupr-youzify-show-modal .youzify-hdr-v1 .youzify-cover-content .youzify-inner-content,.bupr-youzify-show-modal .youzify-header-cover>img,.bupr-youzify-show-modal .youzify-header-overlay .youzify-header-cover:before,.bupr-youzify-show-modal .youzify-header-pattern .youzify-header-cover:after{z-index:0}.buddyboss-theme .members-directory-wrapper .members .member-review-stars{text-align:center}.buddyboss-theme .member-header-actions-wrap .member-header-actions.action{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.rating{color:red}#bupr-reiew-edit button.bupr-edit-review-button{padding:6px 15px}.bp-member-add-form button#bupr_save_review{display:inline-block;max-width:180px;font-size:16px;font-weight:400}.bupr-reply-section{margin-top:15px;clear:both}.bupr-owner-reply{background:linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%);border-inline-start:4px solid var(--bupr-accent,#007cba);padding:15px;margin-top:10px;border-start-end-radius:8px;border-end-end-radius:8px}.bupr-reply-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:10px}.bupr-reply-header img.avatar{border-radius:50%;width:32px;height:32px}.bupr-reply-author{font-weight:600;color:#1d2327}.bupr-reply-badge{background:var(--bupr-accent,#007cba);color:#fff;font-size:11px;padding:3px 8px;border-radius:12px;text-transform:uppercase;font-weight:600}.bupr-reply-date{color:#666;font-size:12px}.bupr-reply-content{font-style:italic;color:#333}.bupr-reply-content p{margin:0}.bupr-reply-form-wrapper{margin-top:10px}.bupr-show-reply-form{background:0 0;border:1px dashed var(--bupr-accent,#007cba);color:var(--bupr-accent,#007cba);padding:8px 16px;cursor:pointer;border-radius:4px;font-size:13px}.bupr-show-reply-form:hover{background:#f0f7fc}.bupr-reply-form{margin-top:10px}.bupr-reply-textarea{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;resize:vertical;min-height:80px}.bupr-reply-textarea:focus{border-color:var(--bupr-accent,#007cba);box-shadow:0 0 0 2px rgba(0,124,186,.1);box-shadow:0 0 0 2px color-mix(in srgb,var(--bupr-accent,#007cba) 15%,transparent)}.bupr-reply-textarea:focus:not(:focus-visible){outline:0}.bupr-reply-textarea:focus-visible{outline:2px solid var(--bupr-focus,#007cba);outline-offset:2px}.bupr-reply-actions{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-submit-reply{background:var(--bupr-accent,#007cba);color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-submit-reply:hover{background:#005a87}.bupr-cancel-reply{background:#f0f0f1;color:#50575e;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-cancel-reply:hover{background:#dcdcde}.bupr-reply-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:var(--bupr-accent,#007cba);border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}.bupr-report-section{position:absolute;inset-inline-end:15px;top:15px}.bp-member-reviews .bupr-row{position:relative}.bupr-report-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:5px;font-size:12px;color:#666;-webkit-transition:all .2s;transition:all .2s}.bupr-report-button:hover{background:#fff0f0;border-color:#dc3232;color:#dc3232}.bupr-report-button .dashicons{font-size:14px;width:14px;height:14px}.bupr-report-text{font-weight:500}.bupr-report-success{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;color:#46b450;font-size:12px;font-weight:500;padding:6px 12px;background:#ecfdf5;border-radius:4px;border:1px solid #d4edda}.bupr-report-success .dashicons{font-size:14px;width:14px;height:14px}.bupr-flag-section{position:absolute;inset-inline-end:15px;top:15px}.bupr-flag-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px}.bupr-flag-success{display:inline-flex;align-items:center;gap:4px;color:#46b450;font-size:12px}.bupr-flag-modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999999;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-flag-modal-content{background:#fff;border-radius:8px;max-width:400px;width:90%;box-shadow:0 4px 20px rgba(0,0,0,.15)}.bupr-flag-modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 20px;border-bottom:1px solid #ddd}.bupr-flag-modal-header h3{margin:0;font-size:18px;color:#1d2327}.bupr-flag-modal-close{background:0 0;border:none;font-size:24px;cursor:pointer;color:#666;line-height:1}.bupr-flag-modal-close:hover{color:#dc3232}.bupr-flag-modal-body{padding:20px}.bupr-flag-modal-body p{margin:0 0 15px;color:#50575e}.bupr-flag-reasons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:10px}.bupr-flag-reason-option{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;padding:10px 15px;background:#f9f9f9;border-radius:4px;cursor:pointer;-webkit-transition:background .2s;transition:background .2s}.bupr-flag-reason-option:hover{background:#f0f0f1}.bupr-flag-reason-option input[type=radio]{margin:0}.bupr-flag-modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;padding:15px 20px;border-top:1px solid #ddd;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-flag-submit{background:#dc3232;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-submit:hover{background:#a00}.bupr-flag-cancel{background:#f0f0f1;color:#50575e;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-cancel:hover{background:#dcdcde}.bupr-flag-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:#dc3232;border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}@-webkit-keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media only screen and (max-width:480px){.bupr-flag-section,.bupr-report-section{position:static;margin-top:10px}.bupr-reply-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.bupr-reply-actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.bupr-reply-actions button{width:100%}}.bupr-front-toast-host{position:fixed;inset-inline-end:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-front-toast{background:#1e293b;color:#fff;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;line-height:1.4;box-shadow:0 4px 12px rgba(0,0,0,.18);min-width:220px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-front-toast--visible{opacity:1;transform:translateY(0)}.bupr-front-toast--success{background:#16a34a}.bupr-front-toast--error{background:#dc2626}:root{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, var(--wp--preset--color--base, #fff)));--bupr-chip-bg:var(--bx-color-bg-muted, #f9f9f9);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #f0f0f1);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, var(--wp--preset--color--base, #fff)));--bupr-text:var(--bx-color-fg, var(--wp--preset--color--contrast, #1d2327));--bupr-text-muted:var(--bx-color-fg-muted, #50575e);--bupr-text-subtle:var(--bx-color-fg-subtle, #666);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(0, 0, 0, 0.1)));--bupr-reply-bg:var(--bx-color-bg-muted, #f8f9fa);--bupr-reply-hover-bg:#f0f7fc;--bupr-success-bg:#ecfdf5;--bupr-success-fg:#46b450;--bupr-success-border:#d4edda;--bupr-danger-bg:#fff0f0;--bupr-danger-fg:#dc3232;--bupr-danger-border:#f5c6cb;--bupr-accent:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #007cba)));--bupr-focus:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #2271b1)))}body.buddyx-dark-theme,body.dark-mode,body.dark-scheme,html[data-bx-mode=dark]{--bupr-card-bg:var(--bx-color-bg-elevated, #1e1e1e);--bupr-chip-bg:var(--bx-color-bg-muted, #272727);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #313131);--bupr-field-bg:var(--bx-color-bg, #161616);--bupr-text:var(--bx-color-fg, #e6e6e6);--bupr-text-muted:var(--bx-color-fg-muted, #a6a6a6);--bupr-text-subtle:var(--bx-color-fg-subtle, #8a8a8a);--bupr-border:var(--bx-color-border, rgba(255, 255, 255, 0.15));--bupr-reply-bg:var(--bx-color-bg-muted, #232323);--bupr-reply-hover-bg:rgba(0, 124, 186, 0.15);--bupr-success-bg:rgba(70, 180, 80, 0.15);--bupr-success-fg:#7fd58b;--bupr-success-border:rgba(70, 180, 80, 0.4);--bupr-danger-bg:rgba(220, 50, 50, 0.15);--bupr-danger-fg:#ff8a8a;--bupr-danger-border:rgba(220, 50, 50, 0.4)}.bupr-row{border-color:var(--bupr-border,rgba(0,0,0,.1))}.bp-nouveau .bupr-row{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-review-modal-content{background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-content{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-footer,.bupr-flag-modal-header{border-color:var(--bupr-border,#ddd)}.bupr-flag-modal-header h3{color:var(--bupr-text,#1d2327)}.bupr-flag-modal-close{color:var(--bupr-text-muted,#666)}.bupr-flag-modal-body p{color:var(--bupr-text-muted,#50575e)}.bupr-flag-reason-option{background:var(--bupr-chip-bg,#f9f9f9);color:var(--bupr-text,inherit)}.bupr-flag-reason-option:hover{background:var(--bupr-chip-bg-hover,#f0f0f1)}.bupr-cancel-reply,.bupr-flag-cancel{background:var(--bupr-chip-bg,#f0f0f1);color:var(--bupr-text,#50575e)}.bupr-cancel-reply:hover,.bupr-flag-cancel:hover{background:var(--bupr-chip-bg-hover,#dcdcde)}.bupr-owner-reply{background:var(--bupr-reply-bg,linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%))}.bupr-reply-author{color:var(--bupr-text,#1d2327)}.bupr-reply-content{color:var(--bupr-text-muted,#333)}.bupr-reply-date{color:var(--bupr-text-subtle,#666)}.bupr-reply-textarea{background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bupr-show-reply-form:hover{background:var(--bupr-reply-hover-bg,#f0f7fc)}.bupr-flag-button,.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border-color:var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.bupr-report-success{background:var(--bupr-success-bg,#ecfdf5);border-color:var(--bupr-success-border,#d4edda);color:var(--bupr-success-fg,#46b450)}.success_review_msg{background-color:var(--bupr-success-bg,#dff2bf);color:var(--bupr-success-fg,#4f8a10)}.bupr-error{background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.br-theme-bars-square .bupr-rating-widget a{background-color:var(--bupr-chip-bg,#fff)}.bupr-posts-pagination .page-numbers{background:var(--bupr-chip-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,rgba(0,0,0,.1))}#bp-member-reviews-list{width:100%}.bp-member-reviews{margin-top:25px}.bp-member-add-form textarea{width:100%;padding:10px;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bp-member-add-form input{width:100%;margin-inline-end:5px}.bp-member-add-form button{width:100%;display:block;margin:0 auto}#bupr_member_review_id{padding:10px;padding-inline-start:10px;max-width:300px;width:100%;border:1px var(--bupr-border,#e3e3e3) solid;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);font-family:inherit}.bp-member-add-form p{text-align:start;margin:10px 0}.bp-member-add-form p button{width:100%}.bupr-criteria-label span{float:inline-start}.bupr-add-review{margin-inline-start:5px}.bupr-bp-member-review-no-popup-add-block{display:block}.bupr-multi-review{margin:15px}.multi-review{display:inline-block;width:100%;margin:0;padding:10px 0 0;background:0 0}.multi-review>div{padding:0}.bupr-directory-tooltip span.bupr-star-rate{font-size:15px}.bupr-error{width:90%;padding:10px;border-radius:5px;background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.bupr-review-description a{margin:10px 0;display:inline-block;text-decoration:underline}.bupr_not_give_review p{padding:10px;font-weight:500;font-size:20px;color:#e84242}.members-list li .more-action-button{display:none}#bupr_save_review:focus-visible,.bp-member-add-form button:focus-visible,.bupr-edit-review-button:focus-visible,.bupr-flag-cancel:focus-visible,.bupr-flag-modal-close:focus-visible,.bupr-flag-reason-option:focus-visible,.bupr-flag-submit:focus-visible,.bupr-pagination a:focus-visible,.bupr-report-button:focus-visible,.bupr-submit-reply:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}#bupr_save_review:active,.bp-member-add-form button:active,.bupr-edit-review-button:active,.bupr-flag-cancel:active,.bupr-flag-submit:active,.bupr-report-button:active,.bupr-submit-reply:active{-webkit-transform:translateY(1px);transform:translateY(1px)}.bupr-flag-reason-option:active{-webkit-transform:scale(.98);transform:scale(.98)}#bupr_save_review:disabled,#bupr_save_review[disabled],.bp-member-add-form button:disabled,.bp-member-add-form button[disabled],.bupr-edit-review-button:disabled,.bupr-edit-review-button[disabled],.bupr-flag-cancel:disabled,.bupr-flag-submit:disabled,.bupr-report-button:disabled,.bupr-submit-reply:disabled{opacity:.6;cursor:not-allowed;-webkit-transform:none;transform:none;pointer-events:none}.member-edit-stars:focus-visible,.member_stars:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px;border-radius:2px}1 .stars{display:inline-block}[class*=bupr-col-]{float:inline-start;padding:10px 0}.bupr-col-1{width:8.33%}.bupr-col-2{width:16.66%}.bupr-col-3{width:25%}.bupr-col-4{width:33.33%}.bupr-col-5{width:41.66%}.bupr-col-6{width:50%}.bupr-col-7{width:58.33%}.bupr-col-8{width:66.66%}.bupr-col-9{width:75%}.bupr-col-10{width:83.33%}.bupr-col-11{width:91.66%}.bupr-col-12{width:100%}.bupr-row{clear:both;border-bottom:1px solid rgba(0,0,0,.1);overflow:hidden;padding:15px 0;display:block}.bupr-row:first-child{padding-top:0}.bupr-row:last-child{padding-bottom:0;border-bottom:0}.bp-nouveau .bupr-row{margin-bottom:20px;padding:15px;background:#fff;border:0;box-shadow:0 0 3px 0 rgba(0,0,0,.16)}.bupr-review-full-description{display:none;padding-top:20px}.bupr-criteria-label{word-break:break-word}.bupr-criteria-label span{display:inline;width:50%;height:40px}@media only screen and (max-width:768px){[class*=bupr-col-]{width:100%}.bupr-criteria-label span{display:inline;width:100%;clear:inline-start}}.sel{color:red}.bupr-accept-button,.bupr-deny-button{float:inline-start;margin-inline-end:5px}.bupr-pagination{border-bottom:0;clear:both}.single-headers #bupr-add-review-btn{list-style:none;margin:10px 10px 0 0}.single-headers .bb-enable-cover-img .member-header-actions>#bupr-add-review-btn{margin:5px 10px 10px 0}.bupr_members_review_setting ul.bupr-member-main li.bupr-members,.widget ul#bp-member-rating li{height:auto;width:100%;position:relative;display:block;margin:0;padding:.5em 0}ul.bupr-member-main{margin:0;list-style:none;padding:0}.bupr_members_review_setting ul.bupr-member-main li:first-child,.widget ul#bp-member-rating li:first-child{padding-top:0}.bupr_members_review_setting ul.bupr-member-main li:last-child,.widget ul#bp-member-rating li:last-child{padding-bottom:0;border-bottom:0}.widget ul#bp-member-rating .item-avatar,ul.bupr-member-main li.bupr-members img.avatar{width:50px;height:50px;float:inline-start}.widget ul#bp-member-rating .item,ul.bupr-member-main li.bupr-members .bupr-content-widget{margin-inline-start:70px}ul.bupr-member-main li.bupr-members.bupr-hide .bupr-content-widget{margin-inline-start:0}ul.bupr-member-main li.bupr-members .bupr-meta{display:block;font-size:90%;line-height:normal;margin-top:5px}.bupr-modal-msg{margin:50px 0;text-align:center}.bupr-members-profiles{text-align:center;width:80px;float:inline-start;text-align:start}.bupr-members-profiles img.avatar{max-width:50px;max-height:50px}.bupr-members-profiles .reviewer h4{text-transform:capitalize;margin:10px 0 0;font-size:80%}.bupr-members-content{margin-inline-start:100px}.bupr-members-content .review-subject h4{margin:5px 0}.bupr-review-modal{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);opacity:0;visibility:hidden;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);-webkit-transition:visibility 0s linear .25s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear .25s,opacity .25s 0s,transform .25s;z-index:9999999}.bupr-review-modal-content{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit);padding:1rem 1.5rem;max-width:30rem;width:-webkit-calc(100% - 30px);width:calc(100% - 30px);margin:auto;border-radius:8px}#bupr-edit-review-modal .bupr-review-modal-close-button{float:inline-end;width:1.75rem;height:1.75rem;min-width:0;padding:0;margin:0;line-height:1.75rem;font-size:1.5rem;text-align:center;text-transform:none;text-shadow:none;letter-spacing:normal;cursor:pointer;border:0;box-shadow:none;background:0 0;color:var(--bupr-text-muted,#666);border-radius:.25rem;-webkit-transition:background-color .2s,color .2s,-webkit-transform .2s;transition:background-color .2s,color .2s,transform .2s}#bupr-edit-review-modal .bupr-review-modal-close-button:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);background:var(--bupr-chip-bg-hover,rgba(0,0,0,.06));color:var(--bupr-text,#1d2327)}#bupr-edit-review-modal .bupr-review-modal-close-button:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}#bupr-edit-review-modal .bupr-review-modal-close-button:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.bupr-show-modal{opacity:1;visibility:visible;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:visibility 0s linear 0s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear 0s,opacity .25s 0s,transform .25s}.bupr-edit-review-button-wrapper{text-align:end;margin-bottom:10px}.bp-member-reviews .bupr-row{position:relative;padding-inline-end:160px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:absolute;inset-inline-end:15px}@media only screen and (max-width:480px){.bp-member-reviews .bupr-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-inline-end:15px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:static;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;margin:15px 0 0}}button.bupr-edit-review-button{padding:10px;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-inline-start:auto}.bupr-review-modal-content button#bupr_upodate_review{text-align:center;margin:auto;width:100%;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-posts-pagination{margin:15px 0;text-align:end}.bupr-posts-pagination span{border:1px solid #7f7f7f;border-radius:5px;margin:0 5px;padding:5px 10px}.bupr-posts-pagination .page-numbers{border:1px solid rgba(0,0,0,.1);border-radius:3px;margin:0 0;padding:0;background:#fff;display:inline-block;height:32px;width:32px;text-align:center;line-height:32px;font-size:80%;font-weight:700}.bupr-posts-pagination .next.page-numbers,.bupr-posts-pagination .prev.page-numbers{width:auto;padding:0 10px}.bupr-single-reivew{margin-top:20px}.no-count{margin-inline-start:3px}#bupr_success_review p{display:none}.bupr-save-reivew-spinner{display:none;float:inline-start;margin-inline-start:10px;margin-top:8px}.bupr-error-fields{display:none;font-size:12px;color:red}.bupr-review-error-fields{display:none;font-size:14px;color:red}.bupr-error{width:100%;padding:10px;border-radius:5px;background-color:#f1dede;border-color:#ebcbd0;color:#a84341;margin-top:10px}.br-theme-bars-square .bupr-rating-widget{height:15px;white-space:nowrap}.br-theme-bars-square .bupr-rating-widget a{display:block;width:28px;height:28px;float:inline-start;border:2px solid #8a9bc4;background-color:#fff;margin:2px;text-decoration:none;font-size:12px;font-weight:400;line-height:2;text-align:center;color:#5a6b96;font-weight:600}.br-theme-bars-square .bupr-rating-widget a:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.br-theme-bars-square .bupr-rating-widget a.bupr-square-selected{border:2px solid #1a56db;color:#1a56db}.br-theme-bars-square .br-readonly a{cursor:default}.br-theme-bars-square .br-readonly a.bupr-square-selected{border:2px solid #2c5fd0;color:#2c5fd0}@media print{.br-theme-bars-square .bupr-rating-widget a{border:2px solid #b3b3b3;color:#b3b3b3}}.br-theme-bars-square .br-readonly a.bupr-square-half{border-top:2px solid #2c5fd0;border-inline-start:2px solid #2c5fd0;color:#2c5fd0}.br-theme-bars-square .bupr-rating-widget a.bupr-square-half{border-top:2px solid #1a56db;border-inline-start:2px solid #1a56db;color:#1a56db}.item-header-content .activity{margin-bottom:10px}.success_review_msg{color:#4f8a10;background-color:#dff2bf;font-weight:700;margin-top:3px;text-decoration:none;margin-bottom:1.75em;border-radius:5px}.success_review_msg p{padding:10px 15px;margin:0}.bupr-star-rate{margin-inline-end:0}#review_desc,.bupr-bp-member-review-no-popup-add-block #review_desc{width:100%;padding:10px}#review_desc,.bupr-flag-modal-content,.bupr-flag-modal-content textarea,.bupr-review-modal-content,.bupr-review-modal-content textarea{box-sizing:border-box}#review_desc,.bupr-flag-modal-content textarea,.bupr-review-modal-content textarea{max-width:100%}.bupr-bp-member-review-no-popup-add-block #bupr_save_review{width:100%;margin:0;max-width:160px;height:auto;float:inline-start}.bp-member-add-form:after{content:"";display:table;clear:both}.bp-member-add-form input[type=checkbox]#bupr_anonymous_review{vertical-align:middle;margin:0 5px 0 0}.add_review_msg{display:none}.success_review_msg{display:none}#bupr-view-review-btn{width:100%}.bupr-member-review-wrapper{margin:10px 0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bupr-member-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-member-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-member-tooltip:hover::before{opacity:1;visibility:visible}.bupr-member-rating-text{font-size:14px;color:#555;margin-inline-start:5px}body.bp-legacy:not([class*=youzify]) .bupr-directory-review-parent-container{display:block}.bupr-directory-review-parent-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:10px 0}.bupr-directory-review-wrapper{margin:0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bp-list.grid .bupr-directory-review-wrapper{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bp-list:not(.grid) .bupr-directory-review-wrapper{display:block}.bupr-directory-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-directory-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-directory-tooltip:hover::before{opacity:1;visibility:visible}.bupr-directory-rating-text{font-size:14px;color:#555;margin-inline-start:5px}.kleo-masonry-item .member-review-stars{text-align:center}.widget.bupr_members_review_setting{overflow:hidden}.posted-on.list{padding-top:10px}.widget-area .widget.buddypress div.item-options#bp-member-rating-list-options a{margin:0}.bp-nouveau .widget-area .widget.buddypress #bp-member-rating div.item{padding:0}.bb-grid .widget.buddypress div.item-options#bp-member-rating-list-options a{margin-inline-end:1.25rem;margin-top:10px}.kleo-page .widget.buddypress #bp-member-rating div.item-avatar img.avatar{width:50px;height:50px;margin:0;border-radius:0}.rating-sec{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:10px}.rating-num{margin:0 10px;font-weight:700}.rating-sec .posted-on.list{padding:0}.bupr-full-description{word-break:break-all}.description{font-style:italic;margin-bottom:10px}.description p{margin:0}li#bupr-add-review-btn a.add-review{margin:0;display:inline-block}body[class*=youzify] .youzify-head-content .bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}body[class*=youzify].reviews .youzify-page-main-content .youzify-main-column div#subnav.item-list-tabs{margin:0}body[class*=youzify].add-review .youzify-page-main-content .youzify-main-column .bupr-bp-member-review-no-popup-add-block,body[class*=youzify].reviews .youzify-page-main-content .bupr-bp-member-reviews-block .bp-member-reviews{padding:30px;border-top:1px solid #eee;background-color:var(--reign-site-sections-bg-color);background-color:var(--yzfy-card-bg-color);margin:0}body[class*=youzify] .youzify-page-main-content #bupr-reiew-edit button.bupr-edit-review-button,body[class*=youzify].add-review .youzify-page-main-content button#bupr_save_review{color:#fff}#review_desc,body[class*=youzify] .youzify-page-main-content .bupr-bp-member-review-no-popup-add-block #review_desc{margin-top:15px}.youzify .bupr-save-reivew-spinner{display:none}body[class*=youzify] #bupr-add-review-btn .add-review.button{padding:12px 20px;margin-top:15px;display:inline-block;text-align:center;border-radius:8px;background-color:var(--yzfy-scheme-color)!important;color:var(--yzfy-scheme-text-color)!important}body[class*=youzify] #bupr-add-review-btn .add-review.button:hover{background-color:#005177}.olympus-theme .bgr-submit-review,.olympus-theme .bgr-submit-review:hover{color:inherit}body[class*=youzify] .bupr-member-tooltip .bupr-member-rating-text{color:var(--yzfy-scheme-text-color)!important}@media only screen and (max-width:480px){.bupr-members-profiles{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;float:none;width:100%;margin-bottom:10px}.bupr-members-content,.bupr-members-profiles .reviewer h4{margin:0}.rating-num{margin-inline-start:0}.rating-star{margin-inline-end:10px}body[class*=youzify] .youzify-page-main-content .bupr-criteria-label{margin-bottom:10px}}@media only screen and (max-width:768px){.multi-review{display:-webkit-box;display:-ms-flexbox;display:flex}.bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}@media only screen and (max-width:480px){.multi-review{display:inline-block}}.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-add-review-personal-li a i::before,.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-view-personal-li a i::before{content:"\f005"}.bupr-youzify-show-modal #youzify-profile-navmenu,.bupr-youzify-show-modal .youzify-hdr-v1 .youzify-cover-content .youzify-inner-content,.bupr-youzify-show-modal .youzify-header-cover>img,.bupr-youzify-show-modal .youzify-header-overlay .youzify-header-cover:before,.bupr-youzify-show-modal .youzify-header-pattern .youzify-header-cover:after{z-index:0}.buddyboss-theme .members-directory-wrapper .members .member-review-stars{text-align:center}.buddyboss-theme .member-header-actions-wrap .member-header-actions.action{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.rating{color:red}#bupr-reiew-edit button.bupr-edit-review-button{padding:6px 15px}.bp-member-add-form button#bupr_save_review{display:inline-block;max-width:180px;font-size:16px;font-weight:400}.bupr-reply-section{margin-top:15px;clear:both}.bupr-owner-reply{background:linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%);border-inline-start:4px solid var(--bupr-accent,#007cba);padding:15px;margin-top:10px;border-start-end-radius:8px;border-end-end-radius:8px}.bupr-reply-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:10px}.bupr-reply-header img.avatar{border-radius:50%;width:32px;height:32px}.bupr-reply-author{font-weight:600;color:#1d2327}.bupr-reply-badge{background:var(--bupr-accent,#007cba);color:#fff;font-size:11px;padding:3px 8px;border-radius:12px;text-transform:uppercase;font-weight:600}.bupr-reply-date{color:#666;font-size:12px}.bupr-reply-content{font-style:italic;color:#333}.bupr-reply-content p{margin:0}.bupr-reply-form-wrapper{margin-top:10px}.bupr-show-reply-form{background:0 0;border:1px dashed var(--bupr-accent,#007cba);color:var(--bupr-accent,#007cba);padding:8px 16px;cursor:pointer;border-radius:4px;font-size:13px}.bupr-show-reply-form:hover{background:#f0f7fc}.bupr-reply-form{margin-top:10px}.bupr-reply-textarea{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;resize:vertical;min-height:80px}.bupr-reply-textarea:focus{border-color:var(--bupr-accent,#007cba);box-shadow:0 0 0 2px rgba(0,124,186,.1);box-shadow:0 0 0 2px color-mix(in srgb,var(--bupr-accent,#007cba) 15%,transparent)}.bupr-reply-textarea:focus:not(:focus-visible){outline:0}.bupr-reply-textarea:focus-visible{outline:2px solid var(--bupr-focus,#007cba);outline-offset:2px}.bupr-reply-actions{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-submit-reply{background:var(--bupr-accent,#007cba);color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-submit-reply:hover{background:#005a87}.bupr-cancel-reply{background:#f0f0f1;color:#50575e;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-cancel-reply:hover{background:#dcdcde}.bupr-reply-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:var(--bupr-accent,#007cba);border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}.bupr-report-section{position:absolute;inset-inline-end:15px;top:15px}.bp-member-reviews .bupr-row{position:relative}.bupr-report-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:5px;font-size:12px;color:#666;-webkit-transition:all .2s;transition:all .2s}.bupr-report-button:hover{background:#fff0f0;border-color:#dc3232;color:#dc3232}.bupr-report-button .dashicons{font-size:14px;width:14px;height:14px}.bupr-report-text{font-weight:500}.bupr-report-success{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;color:#46b450;font-size:12px;font-weight:500;padding:6px 12px;background:#ecfdf5;border-radius:4px;border:1px solid #d4edda}.bupr-report-success .dashicons{font-size:14px;width:14px;height:14px}.bupr-flag-section{position:absolute;inset-inline-end:15px;top:15px}.bupr-flag-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px}.bupr-flag-success{display:inline-flex;align-items:center;gap:4px;color:#46b450;font-size:12px}.bupr-flag-modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999999;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-flag-modal-content{background:#fff;border-radius:8px;max-width:400px;width:90%;box-shadow:0 4px 20px rgba(0,0,0,.15)}.bupr-flag-modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 20px;border-bottom:1px solid #ddd}.bupr-flag-modal-header h3{margin:0;font-size:18px;color:#1d2327}.bupr-flag-modal-close{background:0 0;border:none;font-size:24px;cursor:pointer;color:#666;line-height:1}.bupr-flag-modal-close:hover{color:#dc3232}.bupr-flag-modal-body{padding:20px}.bupr-flag-modal-body p{margin:0 0 15px;color:#50575e}.bupr-flag-reasons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:10px}.bupr-flag-reason-option{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;padding:10px 15px;background:#f9f9f9;border-radius:4px;cursor:pointer;-webkit-transition:background .2s;transition:background .2s}.bupr-flag-reason-option:hover{background:#f0f0f1}.bupr-flag-reason-option input[type=radio]{margin:0}.bupr-flag-modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;padding:15px 20px;border-top:1px solid #ddd;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-flag-submit{background:#dc3232;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-submit:hover{background:#a00}.bupr-flag-cancel{background:#f0f0f1;color:#50575e;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-cancel:hover{background:#dcdcde}.bupr-flag-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:#dc3232;border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}@-webkit-keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media only screen and (max-width:480px){.bupr-flag-section,.bupr-report-section{position:static;margin-top:10px}.bupr-reply-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.bupr-reply-actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.bupr-reply-actions button{width:100%}}.bupr-front-toast-host{position:fixed;inset-inline-end:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-front-toast{background:#1e293b;color:#fff;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;line-height:1.4;box-shadow:0 4px 12px rgba(0,0,0,.18);min-width:220px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-front-toast--visible{opacity:1;transform:translateY(0)}.bupr-front-toast--success{background:#16a34a}.bupr-front-toast--error{background:#dc2626}:root{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, var(--wp--preset--color--base, #fff)));--bupr-chip-bg:var(--bx-color-bg-muted, #f9f9f9);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #f0f0f1);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, var(--wp--preset--color--base, #fff)));--bupr-text:var(--bx-color-fg, var(--wp--preset--color--contrast, #1d2327));--bupr-text-muted:var(--bx-color-fg-muted, #50575e);--bupr-text-subtle:var(--bx-color-fg-subtle, #666);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(0, 0, 0, 0.1)));--bupr-reply-bg:var(--bx-color-bg-muted, #f8f9fa);--bupr-reply-hover-bg:#f0f7fc;--bupr-success-bg:#ecfdf5;--bupr-success-fg:#46b450;--bupr-success-border:#d4edda;--bupr-danger-bg:#fff0f0;--bupr-danger-fg:#dc3232;--bupr-danger-border:#f5c6cb;--bupr-accent:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #007cba)));--bupr-focus:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #2271b1)))}body.buddyx-dark-theme,body.dark-mode,body.dark-scheme,html[data-bx-mode=dark]{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e));--bupr-chip-bg:var(--bx-color-bg-muted, #272727);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #313131);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, #161616));--bupr-text:var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6));--bupr-text-muted:var(--bx-color-fg-muted, #a6a6a6);--bupr-text-subtle:var(--bx-color-fg-subtle, #8a8a8a);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15)));--bupr-reply-bg:var(--bx-color-bg-muted, #232323);--bupr-reply-hover-bg:rgba(0, 124, 186, 0.15);--bupr-success-bg:rgba(70, 180, 80, 0.15);--bupr-success-fg:#7fd58b;--bupr-success-border:rgba(70, 180, 80, 0.4);--bupr-danger-bg:rgba(220, 50, 50, 0.15);--bupr-danger-fg:#ff8a8a;--bupr-danger-border:rgba(220, 50, 50, 0.4)}.bupr-row{border-color:var(--bupr-border,rgba(0,0,0,.1))}.bp-nouveau .bupr-row{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-review-modal-content{background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-content{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-footer,.bupr-flag-modal-header{border-color:var(--bupr-border,#ddd)}.bupr-flag-modal-header h3{color:var(--bupr-text,#1d2327)}.bupr-flag-modal-close{color:var(--bupr-text-muted,#666)}.bupr-flag-modal-body p{color:var(--bupr-text-muted,#50575e)}.bupr-flag-reason-option{background:var(--bupr-chip-bg,#f9f9f9);color:var(--bupr-text,inherit)}.bupr-flag-reason-option:hover{background:var(--bupr-chip-bg-hover,#f0f0f1)}.bupr-cancel-reply,.bupr-flag-cancel{background:var(--bupr-chip-bg,#f0f0f1);color:var(--bupr-text,#50575e)}.bupr-cancel-reply:hover,.bupr-flag-cancel:hover{background:var(--bupr-chip-bg-hover,#dcdcde)}.bupr-owner-reply{background:var(--bupr-reply-bg,linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%))}.bupr-reply-author{color:var(--bupr-text,#1d2327)}.bupr-reply-content{color:var(--bupr-text-muted,#333)}.bupr-reply-date{color:var(--bupr-text-subtle,#666)}.bupr-reply-textarea{background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bupr-show-reply-form:hover{background:var(--bupr-reply-hover-bg,#f0f7fc)}.bupr-flag-button,.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border-color:var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.buddypress-wrap .bupr-report-button.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border:1px solid var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.buddypress-wrap .bupr-report-button.bupr-report-button:focus,.buddypress-wrap .bupr-report-button.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close{background:0 0;border:none;box-shadow:none;color:var(--bupr-text-muted,#666)}.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus,.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover{background:0 0;color:var(--bupr-danger-fg,#dc3232)}.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button,button.bupr-edit-review-button{background:var(--bupr-chip-bg,#f8f9fa);border:1px solid var(--bupr-border,#ddd);color:var(--bupr-text,#1d2327)}.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus,.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover,button.bupr-edit-review-button:focus,button.bupr-edit-review-button:hover{background:var(--bupr-chip-bg-hover,#f0f0f1);border-color:var(--bupr-border,#ddd);color:var(--bupr-text,#1d2327)}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit{background:#dc3232;border:none;color:#fff}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus,.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover{background:#a00;color:#fff}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply{background:var(--bupr-chip-bg,#f0f0f1);border:1px solid var(--bupr-border,#dcdcde);color:var(--bupr-text,#50575e)}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus,.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover{background:var(--bupr-chip-bg-hover,#dcdcde);color:var(--bupr-text,#50575e)}.bupr-report-success{background:var(--bupr-success-bg,#ecfdf5);border-color:var(--bupr-success-border,#d4edda);color:var(--bupr-success-fg,#46b450)}.success_review_msg{background-color:var(--bupr-success-bg,#dff2bf);color:var(--bupr-success-fg,#4f8a10)}.bupr-error{background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.br-theme-bars-square .bupr-rating-widget a{background-color:var(--bupr-chip-bg,#fff)}.bupr-posts-pagination .page-numbers{background:var(--bupr-chip-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,rgba(0,0,0,.1))}#bp-member-reviews-list{width:100%}.bp-member-reviews{margin-top:25px}.bp-member-add-form textarea{width:100%;padding:10px;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bp-member-add-form input{width:100%;margin-inline-end:5px}.bp-member-add-form button{width:100%;display:block;margin:0 auto}#bupr_member_review_id{padding:10px;padding-inline-start:10px;max-width:300px;width:100%;border:1px var(--bupr-border,#e3e3e3) solid;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);font-family:inherit}.bp-member-add-form p{text-align:start;margin:10px 0}.bp-member-add-form p button{width:100%}.bupr-criteria-label span{float:inline-start}.bupr-add-review{margin-inline-start:5px}.bupr-bp-member-review-no-popup-add-block{display:block}.bupr-multi-review{margin:15px}.multi-review{display:inline-block;width:100%;margin:0;padding:10px 0 0;background:0 0}.multi-review>div{padding:0}.bupr-directory-tooltip span.bupr-star-rate{font-size:15px}.bupr-error{width:90%;padding:10px;border-radius:5px;background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.bupr-review-description a{margin:10px 0;display:inline-block;text-decoration:underline}.bupr_not_give_review p{padding:10px;font-weight:500;font-size:20px;color:#e84242}.members-list li .more-action-button{display:none}#bupr_save_review:focus-visible,.bp-member-add-form button:focus-visible,.bupr-edit-review-button:focus-visible,.bupr-flag-cancel:focus-visible,.bupr-flag-modal-close:focus-visible,.bupr-flag-reason-option:focus-visible,.bupr-flag-submit:focus-visible,.bupr-pagination a:focus-visible,.bupr-report-button:focus-visible,.bupr-submit-reply:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}#bupr_save_review:active,.bp-member-add-form button:active,.bupr-edit-review-button:active,.bupr-flag-cancel:active,.bupr-flag-submit:active,.bupr-report-button:active,.bupr-submit-reply:active{-webkit-transform:translateY(1px);transform:translateY(1px)}.bupr-flag-reason-option:active{-webkit-transform:scale(.98);transform:scale(.98)}#bupr_save_review:disabled,#bupr_save_review[disabled],.bp-member-add-form button:disabled,.bp-member-add-form button[disabled],.bupr-edit-review-button:disabled,.bupr-edit-review-button[disabled],.bupr-flag-cancel:disabled,.bupr-flag-submit:disabled,.bupr-report-button:disabled,.bupr-submit-reply:disabled{opacity:.6;cursor:not-allowed;-webkit-transform:none;transform:none;pointer-events:none}.member-edit-stars:focus-visible,.member_stars:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px;border-radius:2px} -
bp-user-profile-reviews/trunk/assets/css/rtl/admin.rtl.css
r3617176 r3736444 55 55 Dark mode (ADMIN-1) 56 56 Full dark token scale for the admin panel. Gated behind an EXPLICIT 57 dark-admin signal (WP's is-dark-theme / the "Dark" admin color scheme 58 body.admin-color-dark) rather than prefers-color-scheme. Rationale: WP 57 dark-admin signal (body.is-dark-theme) rather than prefers-color-scheme. 58 body.admin-color-dark is deliberately NOT a trigger: WP's "Dark" admin 59 colour scheme restyles only the menu and toolbar, so the content area 60 stays light and the panel's header text became light-on-light. Rationale: WP 59 61 admin core has no dark mode in 6.x/7.0, so keying off the OS preference 60 62 alone flips this panel dark while the surrounding WP admin chrome (and, … … 63 65 adopts dark uniformly the moment a real dark admin context sets the class. 64 66 ═══════════════════════════════════════════════════════════ */ 65 body.is-dark-theme .bupr-admin, 66 body.admin-color-dark .bupr-admin { 67 body.is-dark-theme .bupr-admin { 67 68 --bupr-admin-white: #1e1e2e; 68 69 --bupr-admin-surface-1: #181825; … … 896 897 } 897 898 899 /* Row widths, desktop only (the <=640px layout stacks rows as columns): 900 text inputs get a real column instead of shrinking to the placeholder width, 901 and rich-text editors take the full row instead of the right half. */ 902 @media (min-width: 641px) { 903 .bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text) { 904 flex: 0 1 480px; 905 } 906 907 .bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap) { 908 flex: 1 1 100%; 909 } 910 } 911 912 /* Toggle switch. The tab templates render label.bupr-switch > checkbox + .bupr-slider; 913 its styles lived in the old wbcom wrapper sheet and were lost in the 3.8.0 shell 914 migration, which left a bare checkbox. */ 915 .bupr-admin .bupr-switch { 916 position: relative; 917 display: inline-block; 918 flex: 0 0 auto; 919 width: 40px; 920 height: 22px; 921 margin: 0; 922 } 923 924 .bupr-admin .bupr-switch input[type="checkbox"] { 925 position: absolute; 926 inset: 0; 927 width: 100%; 928 height: 100%; 929 margin: 0; 930 opacity: 0; 931 cursor: pointer; 932 z-index: 1; 933 } 934 935 .bupr-admin .bupr-slider { 936 position: absolute; 937 inset: 0; 938 border-radius: 999px; 939 background: var(--bupr-admin-border-strong); 940 transition: background 0.15s; 941 } 942 943 .bupr-admin .bupr-slider::before { 944 content: ""; 945 position: absolute; 946 top: 2px; 947 inset-inline-start: 2px; 948 width: 18px; 949 height: 18px; 950 border-radius: 50%; 951 background: #fff; 952 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); 953 transition: transform 0.15s; 954 } 955 956 .bupr-admin .bupr-switch input:checked + .bupr-slider { 957 background: var(--bupr-admin-accent); 958 } 959 960 .bupr-admin .bupr-switch input:checked + .bupr-slider::before { 961 transform: translateX(-18px); 962 } 963 964 [dir="rtl"] .bupr-admin .bupr-switch input:checked + .bupr-slider::before { 965 transform: translateX(18px); 966 } 967 968 .bupr-admin .bupr-switch input:focus-visible + .bupr-slider { 969 outline: 2px solid var(--bupr-admin-accent); 970 outline-offset: 2px; 971 } 972 898 973 .bupr-card--legacy input[type="text"], 899 974 .bupr-card--legacy input[type="number"], … … 1063 1138 } 1064 1139 1140 /* In a column the desktop flex-basis (300px / 480px) becomes a HEIGHT. */ 1141 .bupr-card--legacy .wbcom-settings-section-options-heading, 1142 .bupr-card--legacy .wbcom-settings-section-options { 1143 flex-basis: auto; 1144 } 1145 1065 1146 .bupr-stats-grid, 1066 1147 .bupr-discover-grid { -
bp-user-profile-reviews/trunk/assets/css/rtl/bupr-front.rtl.css
r3617176 r3736444 582 582 width: 100%; 583 583 padding: 10px; 584 } 585 586 /* Widths below are 100% / calc() plus padding: without border-box they overflow on themes 587 that do not reset box-sizing globally (Twenty Twenty-Five overflowed at every width). */ 588 #review_desc, 589 .bupr-review-modal-content, 590 .bupr-flag-modal-content, 591 .bupr-review-modal-content textarea, 592 .bupr-flag-modal-content textarea { 593 box-sizing: border-box; 594 } 595 596 #review_desc, 597 .bupr-review-modal-content textarea, 598 .bupr-flag-modal-content textarea { 599 max-width: 100%; 584 600 } 585 601 … … 1537 1553 # --bupr-* tokens below; the component rules that consume them are written 1538 1554 # once and fall back to the exact light values, so light mode is unchanged. 1539 # Reign exposes no --bx-color-* vars, so every dark fallback is a dark literal. 1555 # Reign exposes no --bx-color-* vars but redefines its own --reign-* tokens 1556 # under the same [data-bx-mode="dark"] selector (reign-theme critical.css), so 1557 # the four it darkens are read before the dark literal. Only map a --reign-* 1558 # token Reign actually redefines in dark, or dark mode gets its LIGHT value. 1540 1559 --------------------------------------------------------------*/ 1541 1560 html[data-bx-mode="dark"], … … 1543 1562 body.dark-mode, 1544 1563 body.dark-scheme { 1545 --bupr-card-bg: var(--bx-color-bg-elevated, #1e1e1e);1564 --bupr-card-bg: var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e)); 1546 1565 --bupr-chip-bg: var(--bx-color-bg-muted, #272727); 1547 1566 --bupr-chip-bg-hover: var(--bx-color-bg-subtle, #313131); 1548 --bupr-field-bg: var(--bx-color-bg, #161616);1549 --bupr-text: var(--bx-color-fg, #e6e6e6);1567 --bupr-field-bg: var(--bx-color-bg, var(--reign-form-background-color, #161616)); 1568 --bupr-text: var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6)); 1550 1569 --bupr-text-muted: var(--bx-color-fg-muted, #a6a6a6); 1551 1570 --bupr-text-subtle: var(--bx-color-fg-subtle, #8a8a8a); 1552 --bupr-border: var(--bx-color-border, rgba(255, 255, 255, 0.15));1571 --bupr-border: var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15))); 1553 1572 --bupr-reply-bg: var(--bx-color-bg-muted, #232323); 1554 1573 --bupr-reply-hover-bg: rgba(0, 124, 186, 0.15); … … 1661 1680 border-color: #dc3232; 1662 1681 color: var(--bupr-danger-fg, #dc3232); 1682 } 1683 1684 /* BuddyPress styles every button inside .buddypress-wrap at (0,2,1), and its hover rule 1685 (0,3,1) sets a light grey background with `color: inherit` - under a dark theme that is 1686 light text on light grey, so Report / Edit / the modal close vanished on hover. These 1687 buttons own their colours: the .buddypress-wrap ancestor plus a doubled class out-ranks 1688 BP's rules, which load after ours. Theme rules marked !important (BuddyX Pro) still win. */ 1689 .buddypress-wrap .bupr-report-button.bupr-report-button { 1690 background: var(--bupr-chip-bg, #f8f9fa); 1691 border: 1px solid var(--bupr-border, #ddd); 1692 color: var(--bupr-text-muted, #666); 1693 } 1694 1695 .buddypress-wrap .bupr-report-button.bupr-report-button:hover, 1696 .buddypress-wrap .bupr-report-button.bupr-report-button:focus { 1697 background: var(--bupr-danger-bg, #fff0f0); 1698 border-color: #dc3232; 1699 color: var(--bupr-danger-fg, #dc3232); 1700 } 1701 1702 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close { 1703 background: transparent; 1704 border: none; 1705 box-shadow: none; 1706 color: var(--bupr-text-muted, #666); 1707 } 1708 1709 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover, 1710 .bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus { 1711 background: transparent; 1712 color: var(--bupr-danger-fg, #dc3232); 1713 } 1714 1715 /* Edit Review is a secondary action: the same self-contained chip colours as Report, which 1716 the dark token block also sets. White on the theme accent failed in dark mode, where 1717 BuddyX's accent turns light (1.89:1). */ 1718 button.bupr-edit-review-button, 1719 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button { 1720 background: var(--bupr-chip-bg, #f8f9fa); 1721 border: 1px solid var(--bupr-border, #ddd); 1722 color: var(--bupr-text, #1d2327); 1723 } 1724 1725 button.bupr-edit-review-button:hover, 1726 button.bupr-edit-review-button:focus, 1727 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover, 1728 .buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus { 1729 background: var(--bupr-chip-bg-hover, #f0f0f1); 1730 border-color: var(--bupr-border, #ddd); 1731 color: var(--bupr-text, #1d2327); 1732 } 1733 1734 /* Report dialog actions and the reply Cancel: the destructive Submit stays red, Cancel 1735 stays neutral instead of a second primary. BuddyX styles every button.button inside the 1736 BP wrapper at (0,3,1) (.buddypress .buddypress-wrap button.button), so these sit at (0,4,1). */ 1737 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit { 1738 background: #dc3232; 1739 border: none; 1740 color: #fff; 1741 } 1742 1743 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover, 1744 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus { 1745 background: #a00; 1746 color: #fff; 1747 } 1748 1749 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel, 1750 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply { 1751 background: var(--bupr-chip-bg, #f0f0f1); 1752 border: 1px solid var(--bupr-border, #dcdcde); 1753 color: var(--bupr-text, #50575e); 1754 } 1755 1756 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover, 1757 .bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus, 1758 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover, 1759 body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus { 1760 background: var(--bupr-chip-bg-hover, #dcdcde); 1761 color: var(--bupr-text, #50575e); 1663 1762 } 1664 1763 -
bp-user-profile-reviews/trunk/assets/js/bupr-front.js
r3617176 r3736444 190 190 jQuery(".bupr-save-reivew-spinner").hide(); 191 191 sessionStorage.reloadAfterPageLoad = true; 192 var date = new Date(); 193 date.setTime(date.getTime() + 20 * 1000); 194 // jQuery.cookie("response", response, { 195 // expires: date, 196 // }); 192 // The message stays until the next submit; only a saved review clears the form, 193 // so a refused submission keeps what the member typed. 197 194 jQuery(".add_review_msg").show(); 198 195 jQuery(".add_review_msg p").html(response.data); 199 reset_review_form_data(); 200 setTimeout(() => { 201 jQuery(".add_review_msg p").html(''); 202 jQuery(".add_review_msg").hide(); 203 }, 2000); 196 if (response && response.success) { 197 reset_review_form_data(); 198 } 204 199 // window.location.reload(); 205 200 } … … 236 231 jQuery(".bupr-save-reivew-spinner").hide(); 237 232 sessionStorage.reloadAfterPageLoad = true; 238 var date = new Date(); 239 date.setTime(date.getTime() + 20 * 1000); 240 // jQuery.cookie("response", response, { 241 // expires: date, 242 // }); 233 // The message stays until the next submit; only a saved review clears the form, 234 // so a refused submission keeps what the member typed. 243 235 jQuery(".add_review_msg").show(); 244 reset_review_form_data();245 236 jQuery(".add_review_msg p").html(response.data); 246 setTimeout(() => { 247 jQuery(".add_review_msg p").html(''); 248 jQuery(".add_review_msg").hide(); 249 }, 200); 237 if (response && response.success) { 238 reset_review_form_data(); 239 } 250 240 } 251 241 ); … … 575 565 var reportedLabel = jQuery('<div/>').text(mail_title.reported || "Reported").html(); 576 566 $reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> ' + reportedLabel + '</span>'); 577 // Auto-fade after 3 seconds 578 setTimeout(function() { 579 jQuery('.bupr-report-success').fadeOut(); 580 }, 3000); 567 // Stays put: the server renders the same Reported state on reload. 581 568 } else { 582 569 jQuery(".bupr-flag-error").text(response.data.message).show(); -
bp-user-profile-reviews/trunk/assets/js/min/bupr-front.min.js
r3617176 r3736444 1 window.buprFrontToast=function(message,tone){tone=tone||"info";var host=document.querySelector(".bupr-front-toast-host"),el=(host||((host=document.createElement("div")).className="bupr-front-toast-host",document.body.appendChild(host)),document.createElement("div"));el.className="bupr-front-toast bupr-front-toast--"+tone,el.setAttribute("role","status"),el.setAttribute("aria-live","polite"),el.textContent=String(message),host.appendChild(el),window.requestAnimationFrame(function(){el.classList.add("bupr-front-toast--visible")}),window.setTimeout(function(){el.classList.remove("bupr-front-toast--visible"),window.setTimeout(function(){el.parentNode&&el.parentNode.removeChild(el)},250)},3600)},jQuery(document).ready(function(){jQuery(".add_review_msg").hide(),jQuery(document).on("click","#bupr-add-review-btn a",function(e){var show_content=jQuery(this).attr("show");localStorage.setItem("bupr_show_form",show_content)}),jQuery('.dataTables_filter input[type="search"]').attr("placeholder",mail_title.search_placeholder||"Enter Keywords....");jQuery("#reviews_pluginurl").val();function reset_review_form_data(){jQuery("#bupr_review_form_public")[0].reset(),jQuery("#bupr_review_form_public .member_rated_stars").val(0),jQuery(".member_stars").each(function(index){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).removeClass("fas").addClass("far")})}jQuery(".member_stars").mouseenter(function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(".member_stars").mouseleave(function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(".member_stars").on("click",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery("#bupr_member_review_id").on("change",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery("#review_desc").on("keydown",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(".member_stars").on("click",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(document).on("click","#bupr_save_review",function(event){event.preventDefault();var rating_exist=[],bupr_member_id=jQuery("#bupr_member_review_id").val(),bupr_current_user=jQuery("#bupr_current_user_id").val(),bupr_review_title=(mail_title.review_title_format||"%1$s received a %2$s").replace("%1$s",mail_title.cur_username).replace("%2$s",mail_title.review_title),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_count=jQuery("#member_rating_field_counter").val(),bupr_review_rating={},bupr_anonymous_review="",bupr_anonymous_review=jQuery("#bupr_anonymous_review").is(":checked")?"yes":"no";jQuery(".bupr-star-member-rating").each(function(index){bupr_review_rating[index]=jQuery(this).val()}),jQuery(".bupr-star-member-rating").each(function(){var rate_val=jQuery(this).val();0<rate_val&&0,bupr_review_desc.trim()||0!=rate_val||jQuery(".bupr-review-error-fields").show(),rating_exist.push(rate_val)}),0<bupr_review_count?""==bupr_member_id?jQuery(".bupr-review-error-fields").show():-1!=jQuery.inArray("0",rating_exist)&&!bupr_review_desc||(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0 ;var date=new Date;date.setTime(date.getTime()+2e4),jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),reset_review_form_data(),setTimeout(()=>{jQuery(".add_review_msg p").html(""),jQuery(".add_review_msg").hide()},2e3)})):""==bupr_member_id||""==bupr_review_desc?(""==bupr_member_id&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault()),""==bupr_review_desc&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault())):(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0;var date=new Date;date.setTime(date.getTime()+2e4),jQuery(".add_review_msg").show(),reset_review_form_data(),jQuery(".add_review_msg p").html(response.data),setTimeout(()=>{jQuery(".add_review_msg p").html(""),jQuery(".add_review_msg").hide()},200)}))}),jQuery(document).on("click","#bupr-review-edit-btn",function(event){event.preventDefault();var reviewwrapper=document.getElementById("bupr-edit-review"),modal=document.querySelector(".bupr-review-modal"),event=jQuery(this).data("review");event&&jQuery.post(ajaxurl,{action:"bupr_edit_review",review:event,nonce:mail_title.review_nonce},function(response){response.success&&""!=response.data.review&&(""!==reviewwrapper.innerHTML&&(reviewwrapper.innerHTML=""),response=response.data.review,jQuery("#bupr-edit-review").append(response),modal.classList.add("bupr-show-modal"),response=document.querySelector(".youzify-content"))&&!response.classList.contains("bupr-youzify-show-modal")&&response.classList.add("bupr-youzify-show-modal")})}),jQuery(document).on("click",".bupr-review-modal-close-button",function(event){event.preventDefault();document.querySelector(".bupr-review-modal").classList.remove("bupr-show-modal");event=document.querySelector(".youzify-content");event&&event.classList.contains("bupr-youzify-show-modal")&&event.classList.remove("bupr-youzify-show-modal")}),jQuery(window).click(function(e){var modal=document.querySelector(".bupr-review-modal");e.target===modal&&(modal.classList.remove("bupr-show-modal"),e=document.querySelector(".youzify-content"))&&e.classList.contains("bupr-youzify-show-modal")&&e.classList.remove("bupr-youzify-show-modal")}),jQuery(document).on("mouseenter",".member-edit-stars",function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(document).on("mouseleave",".member-edit-stars",function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(document).on("click",".member-edit-stars",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery(document).on("click","#bupr_upodate_review",function(event){event.preventDefault();var modal=document.querySelector(".bupr-review-modal"),event=jQuery("#bupr-edit-review-field-wrapper").data("review"),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_rating={},bupr_endorsed_skills=(jQuery(".bupr-star-member-rating").each(function(index,item){var critaria=jQuery(this).data("critaria");bupr_review_rating[critaria]=jQuery(this).val()}),[]);jQuery('input[name="bupr_endorsed_skills[]"]:checked').each(function(){bupr_endorsed_skills.push(jQuery(this).val())}),jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_update_review",review_id:event,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_endorsed_skills:bupr_endorsed_skills,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),response.success&&(modal.classList.remove("bupr-show-modal"),window.location.reload())})})}),jQuery(document).on("click",".bupr-show-reply-form",function(e){e.preventDefault();e=jQuery(this).closest(".bupr-reply-form-wrapper");jQuery(this).hide(),e.find(".bupr-reply-form").slideDown()}),jQuery(document).on("click",".bupr-cancel-reply",function(e){e.preventDefault();var wrapper=jQuery(this).closest(".bupr-reply-form-wrapper");wrapper.find(".bupr-reply-form").slideUp(function(){wrapper.find(".bupr-show-reply-form").show(),wrapper.find(".bupr-reply-textarea").val("")})}),jQuery(document).on("click",".bupr-submit-reply",function(e){e.preventDefault();var button=jQuery(this),wrapper=button.closest(".bupr-reply-form-wrapper"),replySection=button.closest(".bupr-reply-section"),e=button.data("review"),replyContent=wrapper.find(".bupr-reply-textarea").val().trim();replyContent?(button.prop("disabled",!0),wrapper.find(".bupr-reply-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_add_owner_reply",review_id:e,reply_content:replyContent,nonce:mail_title.review_nonce},function(response){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),response.success?(wrapper.remove(),replySection.html(response.data.reply_html)):window.buprFrontToast(response.data&&response.data.message||mail_title.reply_failed||"Failed to add reply.","error")}).fail(function(){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),window.buprFrontToast(mail_title.generic_error||"An error occurred. Please try again.","error")})):window.buprFrontToast(mail_title.reply_empty||"Please enter a reply.","error")}),jQuery(document).on("click",".bupr-report-button, .bupr-flag-button",function(e){e.preventDefault();e=jQuery(this).data("review");jQuery("#bupr-flag-review-id").val(e),jQuery('input[name="bupr_flag_reason"]').prop("checked",!1),jQuery(".bupr-flag-error").hide().text(""),jQuery(".bupr-flag-modal").fadeIn()}),jQuery(document).on("click",".bupr-flag-modal-close, .bupr-flag-cancel",function(e){e.preventDefault(),jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-modal",function(e){jQuery(e.target).hasClass("bupr-flag-modal")&&jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-submit",function(e){e.preventDefault();var reviewId=jQuery("#bupr-flag-review-id").val(),e=jQuery('input[name="bupr_flag_reason"]:checked').val();e?(jQuery(".bupr-flag-submit").prop("disabled",!0),jQuery(".bupr-flag-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_flag_review",review_id:reviewId,flag_reason:e,nonce:mail_title.review_nonce},function(response){var $reportBtn,reportedLabel;jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),response.success?(jQuery(".bupr-flag-modal").fadeOut(),$reportBtn=jQuery('.bupr-report-button[data-review="'+reviewId+'"], .bupr-flag-button[data-review="'+reviewId+'"]'),reportedLabel=jQuery("<div/>").text(mail_title.reported||"Reported").html(),$reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> '+reportedLabel+"</span>"),setTimeout(function(){jQuery(".bupr-report-success").fadeOut()},3e3)):jQuery(".bupr-flag-error").text(response.data.message).show()}).fail(function(){jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),jQuery(".bupr-flag-error").text(mail_title.generic_error||"An error occurred. Please try again.").show()})):jQuery(".bupr-flag-error").text(mail_title.flag_select_reason||"Please select a reason.").show()}),jQuery(function($){var A=window.bupr_a11y||{rate_label:"Rate %d out of 5",group_label:"Rating"},STAR=".member_stars, .member-edit-stars";function starIndex($star){return parseInt($star.attr("data-attr"),10)||0}function syncGroup($group){var val=($group=>parseInt($group.find(".bupr-star-member-rating").val(),10)||0)($group),$group=$group.find(STAR),focusTarget=0<val?val:1;$group.each(function(){var i=starIndex($(this));$(this).attr("aria-checked",i===val?"true":"false").attr("tabindex",i===focusTarget?"0":"-1")})}function enhanceAll(){$(STAR).each(function(){var group,lbl,$group=$(this).closest(".bupr-criteria-content");$group.length&&((group=$(group=$group)).data("buprA11y")||(group.attr("role","radiogroup"),group.attr("aria-label")||(lbl=group.closest(".multi-review").find(".bupr-criteria-label").first().text().trim(),group.attr("aria-label",lbl||A.group_label)),group.find(STAR).each(function(){var i=starIndex($(this));$(this).attr("role","radio").attr("aria-label",A.rate_label.replace("%d",i))}),group.data("buprA11y",!0)),syncGroup(group))})}enhanceAll(),window.MutationObserver&&new MutationObserver(function(){enhanceAll()}).observe(document.body,{childList:!0,subtree:!0}),$(document).on("click",STAR,function(){syncGroup($(this).closest(".bupr-criteria-content"))}),$(document).on("keydown",STAR,function(e){var $star=$(this),$group=$star.closest(".bupr-criteria-content"),$stars=$group.find(STAR),idx=$stars.index($star),key=e.key,move=null;if("Enter"===key||" "===key||"Spacebar"===key)e.preventDefault(),$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus();else{if("ArrowRight"===key||"ArrowUp"===key)move=Math.min($stars.length-1,idx+1);else if("ArrowLeft"===key||"ArrowDown"===key)move=Math.max(0,idx-1);else if("Home"===key)move=0;else{if("End"!==key)return;move=$stars.length-1}e.preventDefault();$star=$stars.eq(move);$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus()}})});1 window.buprFrontToast=function(message,tone){tone=tone||"info";var host=document.querySelector(".bupr-front-toast-host"),el=(host||((host=document.createElement("div")).className="bupr-front-toast-host",document.body.appendChild(host)),document.createElement("div"));el.className="bupr-front-toast bupr-front-toast--"+tone,el.setAttribute("role","status"),el.setAttribute("aria-live","polite"),el.textContent=String(message),host.appendChild(el),window.requestAnimationFrame(function(){el.classList.add("bupr-front-toast--visible")}),window.setTimeout(function(){el.classList.remove("bupr-front-toast--visible"),window.setTimeout(function(){el.parentNode&&el.parentNode.removeChild(el)},250)},3600)},jQuery(document).ready(function(){jQuery(".add_review_msg").hide(),jQuery(document).on("click","#bupr-add-review-btn a",function(e){var show_content=jQuery(this).attr("show");localStorage.setItem("bupr_show_form",show_content)}),jQuery('.dataTables_filter input[type="search"]').attr("placeholder",mail_title.search_placeholder||"Enter Keywords....");jQuery("#reviews_pluginurl").val();function reset_review_form_data(){jQuery("#bupr_review_form_public")[0].reset(),jQuery("#bupr_review_form_public .member_rated_stars").val(0),jQuery(".member_stars").each(function(index){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).removeClass("fas").addClass("far")})}jQuery(".member_stars").mouseenter(function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(".member_stars").mouseleave(function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(".member_stars").on("click",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery("#bupr_member_review_id").on("change",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery("#review_desc").on("keydown",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(".member_stars").on("click",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(document).on("click","#bupr_save_review",function(event){event.preventDefault();var rating_exist=[],bupr_member_id=jQuery("#bupr_member_review_id").val(),bupr_current_user=jQuery("#bupr_current_user_id").val(),bupr_review_title=(mail_title.review_title_format||"%1$s received a %2$s").replace("%1$s",mail_title.cur_username).replace("%2$s",mail_title.review_title),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_count=jQuery("#member_rating_field_counter").val(),bupr_review_rating={},bupr_anonymous_review="",bupr_anonymous_review=jQuery("#bupr_anonymous_review").is(":checked")?"yes":"no";jQuery(".bupr-star-member-rating").each(function(index){bupr_review_rating[index]=jQuery(this).val()}),jQuery(".bupr-star-member-rating").each(function(){var rate_val=jQuery(this).val();0<rate_val&&0,bupr_review_desc.trim()||0!=rate_val||jQuery(".bupr-review-error-fields").show(),rating_exist.push(rate_val)}),0<bupr_review_count?""==bupr_member_id?jQuery(".bupr-review-error-fields").show():-1!=jQuery.inArray("0",rating_exist)&&!bupr_review_desc||(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0,jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),response&&response.success&&reset_review_form_data()})):""==bupr_member_id||""==bupr_review_desc?(""==bupr_member_id&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault()),""==bupr_review_desc&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault())):(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0,jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),response&&response.success&&reset_review_form_data()}))}),jQuery(document).on("click","#bupr-review-edit-btn",function(event){event.preventDefault();var reviewwrapper=document.getElementById("bupr-edit-review"),modal=document.querySelector(".bupr-review-modal"),event=jQuery(this).data("review");event&&jQuery.post(ajaxurl,{action:"bupr_edit_review",review:event,nonce:mail_title.review_nonce},function(response){response.success&&""!=response.data.review&&(""!==reviewwrapper.innerHTML&&(reviewwrapper.innerHTML=""),response=response.data.review,jQuery("#bupr-edit-review").append(response),modal.classList.add("bupr-show-modal"),response=document.querySelector(".youzify-content"))&&!response.classList.contains("bupr-youzify-show-modal")&&response.classList.add("bupr-youzify-show-modal")})}),jQuery(document).on("click",".bupr-review-modal-close-button",function(event){event.preventDefault();document.querySelector(".bupr-review-modal").classList.remove("bupr-show-modal");event=document.querySelector(".youzify-content");event&&event.classList.contains("bupr-youzify-show-modal")&&event.classList.remove("bupr-youzify-show-modal")}),jQuery(window).click(function(e){var modal=document.querySelector(".bupr-review-modal");e.target===modal&&(modal.classList.remove("bupr-show-modal"),e=document.querySelector(".youzify-content"))&&e.classList.contains("bupr-youzify-show-modal")&&e.classList.remove("bupr-youzify-show-modal")}),jQuery(document).on("mouseenter",".member-edit-stars",function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(document).on("mouseleave",".member-edit-stars",function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(document).on("click",".member-edit-stars",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery(document).on("click","#bupr_upodate_review",function(event){event.preventDefault();var modal=document.querySelector(".bupr-review-modal"),event=jQuery("#bupr-edit-review-field-wrapper").data("review"),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_rating={},bupr_endorsed_skills=(jQuery(".bupr-star-member-rating").each(function(index,item){var critaria=jQuery(this).data("critaria");bupr_review_rating[critaria]=jQuery(this).val()}),[]);jQuery('input[name="bupr_endorsed_skills[]"]:checked').each(function(){bupr_endorsed_skills.push(jQuery(this).val())}),jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_update_review",review_id:event,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_endorsed_skills:bupr_endorsed_skills,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),response.success&&(modal.classList.remove("bupr-show-modal"),window.location.reload())})})}),jQuery(document).on("click",".bupr-show-reply-form",function(e){e.preventDefault();e=jQuery(this).closest(".bupr-reply-form-wrapper");jQuery(this).hide(),e.find(".bupr-reply-form").slideDown()}),jQuery(document).on("click",".bupr-cancel-reply",function(e){e.preventDefault();var wrapper=jQuery(this).closest(".bupr-reply-form-wrapper");wrapper.find(".bupr-reply-form").slideUp(function(){wrapper.find(".bupr-show-reply-form").show(),wrapper.find(".bupr-reply-textarea").val("")})}),jQuery(document).on("click",".bupr-submit-reply",function(e){e.preventDefault();var button=jQuery(this),wrapper=button.closest(".bupr-reply-form-wrapper"),replySection=button.closest(".bupr-reply-section"),e=button.data("review"),replyContent=wrapper.find(".bupr-reply-textarea").val().trim();replyContent?(button.prop("disabled",!0),wrapper.find(".bupr-reply-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_add_owner_reply",review_id:e,reply_content:replyContent,nonce:mail_title.review_nonce},function(response){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),response.success?(wrapper.remove(),replySection.html(response.data.reply_html)):window.buprFrontToast(response.data&&response.data.message||mail_title.reply_failed||"Failed to add reply.","error")}).fail(function(){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),window.buprFrontToast(mail_title.generic_error||"An error occurred. Please try again.","error")})):window.buprFrontToast(mail_title.reply_empty||"Please enter a reply.","error")}),jQuery(document).on("click",".bupr-report-button, .bupr-flag-button",function(e){e.preventDefault();e=jQuery(this).data("review");jQuery("#bupr-flag-review-id").val(e),jQuery('input[name="bupr_flag_reason"]').prop("checked",!1),jQuery(".bupr-flag-error").hide().text(""),jQuery(".bupr-flag-modal").fadeIn()}),jQuery(document).on("click",".bupr-flag-modal-close, .bupr-flag-cancel",function(e){e.preventDefault(),jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-modal",function(e){jQuery(e.target).hasClass("bupr-flag-modal")&&jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-submit",function(e){e.preventDefault();var reviewId=jQuery("#bupr-flag-review-id").val(),e=jQuery('input[name="bupr_flag_reason"]:checked').val();e?(jQuery(".bupr-flag-submit").prop("disabled",!0),jQuery(".bupr-flag-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_flag_review",review_id:reviewId,flag_reason:e,nonce:mail_title.review_nonce},function(response){var $reportBtn,reportedLabel;jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),response.success?(jQuery(".bupr-flag-modal").fadeOut(),$reportBtn=jQuery('.bupr-report-button[data-review="'+reviewId+'"], .bupr-flag-button[data-review="'+reviewId+'"]'),reportedLabel=jQuery("<div/>").text(mail_title.reported||"Reported").html(),$reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> '+reportedLabel+"</span>")):jQuery(".bupr-flag-error").text(response.data.message).show()}).fail(function(){jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),jQuery(".bupr-flag-error").text(mail_title.generic_error||"An error occurred. Please try again.").show()})):jQuery(".bupr-flag-error").text(mail_title.flag_select_reason||"Please select a reason.").show()}),jQuery(function($){var A=window.bupr_a11y||{rate_label:"Rate %d out of 5",group_label:"Rating"},STAR=".member_stars, .member-edit-stars";function starIndex($star){return parseInt($star.attr("data-attr"),10)||0}function syncGroup($group){var val=($group=>parseInt($group.find(".bupr-star-member-rating").val(),10)||0)($group),$group=$group.find(STAR),focusTarget=0<val?val:1;$group.each(function(){var i=starIndex($(this));$(this).attr("aria-checked",i===val?"true":"false").attr("tabindex",i===focusTarget?"0":"-1")})}function enhanceAll(){$(STAR).each(function(){var group,lbl,$group=$(this).closest(".bupr-criteria-content");$group.length&&((group=$(group=$group)).data("buprA11y")||(group.attr("role","radiogroup"),group.attr("aria-label")||(lbl=group.closest(".multi-review").find(".bupr-criteria-label").first().text().trim(),group.attr("aria-label",lbl||A.group_label)),group.find(STAR).each(function(){var i=starIndex($(this));$(this).attr("role","radio").attr("aria-label",A.rate_label.replace("%d",i))}),group.data("buprA11y",!0)),syncGroup(group))})}enhanceAll(),window.MutationObserver&&new MutationObserver(function(){enhanceAll()}).observe(document.body,{childList:!0,subtree:!0}),$(document).on("click",STAR,function(){syncGroup($(this).closest(".bupr-criteria-content"))}),$(document).on("keydown",STAR,function(e){var $star=$(this),$group=$star.closest(".bupr-criteria-content"),$stars=$group.find(STAR),idx=$stars.index($star),key=e.key,move=null;if("Enter"===key||" "===key||"Spacebar"===key)e.preventDefault(),$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus();else{if("ArrowRight"===key||"ArrowUp"===key)move=Math.min($stars.length-1,idx+1);else if("ArrowLeft"===key||"ArrowDown"===key)move=Math.max(0,idx-1);else if("Home"===key)move=0;else{if("End"!==key)return;move=$stars.length-1}e.preventDefault();$star=$stars.eq(move);$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus()}})}); -
bp-user-profile-reviews/trunk/buddypress-member-review.php
r3617176 r3736444 4 4 * Plugin URI: https://wbcomdesigns.com/downloads/buddypress-member-reviews/ 5 5 * Description: Enhances the BuddyPress community by allowing registered users to post reviews on other members' profiles. This feature is available exclusively to registered members and ensures unbiased feedback by preventing users from reviewing their own profiles. 6 * Version: 3.8. 06 * Version: 3.8.1 7 7 * Requires at least: 6.5 8 * Requires PHP: 8. 08 * Requires PHP: 8.1 9 9 * Author: Wbcom Designs 10 10 * Author URI: https://wbcomdesigns.com … … 23 23 * Plugin version and path constants. 24 24 */ 25 define( 'BUPR_PLUGIN_VERSION', '3.8. 0' );25 define( 'BUPR_PLUGIN_VERSION', '3.8.1' ); 26 26 define( 'BUPR_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); 27 27 define( 'BUPR_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); … … 385 385 386 386 /** 387 * Redirect to plugin settings page after activation.388 *389 * @param string $plugin The plugin basename.390 *391 * @return void392 */393 function bupr_activation_redirect_settings( $plugin ) {394 if ( BUPR_PLUGIN_BASENAME === $plugin && class_exists( 'BuddyPress' ) && ! is_multisite() && bupr_check_buddypress_compatibility() ) {395 wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) );396 exit;397 }398 }399 add_action( 'activated_plugin', 'bupr_activation_redirect_settings' );400 401 /**402 387 * Perform plugin activation redirect. 403 388 */ 404 389 function bupr_do_activation_redirect() { 405 if ( get_transient( '_bupr_activation_redirect' ) && ! is_multisite() && bupr_check_buddypress_compatibility() ) { 406 delete_transient( '_bupr_activation_redirect' ); 407 wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) ); 408 } 390 if ( ! get_transient( '_bupr_activation_redirect' ) ) { 391 return; 392 } 393 delete_transient( '_bupr_activation_redirect' ); 394 395 // The single redirect path (an exit inside activated_plugin used to cut bulk 396 // activations short and end WP-CLI runs early). Skip bulk activation and 397 // non-interactive requests; the transient is cleared either way. 398 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only check of core's bulk-activation flag. 399 if ( wp_doing_ajax() || is_network_admin() || isset( $_GET['activate-multi'] ) || is_multisite() || ! bupr_check_buddypress_compatibility() ) { 400 return; 401 } 402 wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) ); 403 exit; 409 404 } 410 405 add_action( 'admin_init', 'bupr_do_activation_redirect' ); -
bp-user-profile-reviews/trunk/includes/admin/class-bupr-admin-panel.php
r3617176 r3736444 296 296 * toggles correctly persist as their "off"/default value). 297 297 * 298 * The ONE exception is the approval-email pair , which the General tab299 * renders only when auto-approve is OFF. To avoid wiping those keys300 * when the form is saved with auto-approve ON (they're absent from301 * the POST), we restore them from the stored option if missing. This302 * is the single sentinel-guarded carve-out (Playbook 7.1) this plugin303 * needs —everything else is a full per-group rebuild.298 * The ONE exception is the approval-email pair: if a save arrives 299 * without them (the General tab has always posted them since 3.8.1, 300 * but this sanitizer also runs for programmatic update_option() 301 * calls), they are restored from the stored option instead of wiped. 302 * This is the single sentinel-guarded carve-out (Playbook 7.1) this 303 * plugin needs; everything else is a full per-group rebuild. 304 304 * 305 305 * @param mixed $input Raw input. … … 312 312 $stored = is_array( $stored ) ? $stored : array(); 313 313 314 // Conditionally-rendered keys: preserve only when this save did 315 // not include them (auto-approve was ON, so the fields were hidden). 314 // Approval-email keys: keep the stored value when a save omits them. 316 315 $conditional_keys = array( 'review_approve_email_subject', 'review_approve_email_message' ); 317 316 foreach ( $conditional_keys as $cond_key ) { … … 319 318 $sanitized[ $cond_key ] = $stored[ $cond_key ]; 320 319 } 320 } 321 322 // The two email bodies come from a rich-text editor: keep paragraphs and safe 323 // HTML. The generic sanitizer runs sanitize_text_field(), which flattened every 324 // saved message to one line with its formatting stripped. 325 foreach ( array( 'review_email_message', 'review_approve_email_message' ) as $message_key ) { 326 if ( is_array( $input ) && isset( $input[ $message_key ] ) && is_string( $input[ $message_key ] ) ) { 327 $sanitized[ $message_key ] = wp_kses_post( $input[ $message_key ] ); 328 } 329 } 330 331 // Numeric fields: a blank or junk value falls back to the documented default 332 // instead of being stored verbatim (a blank threshold silently disabled auto-hide). 333 // 0 stays meaningful for the threshold ("never auto-hide"). 334 $numeric_defaults = array( 335 'bupr_flag_threshold' => array( 5, 0 ), 336 'profile_reviews_per_page' => array( 5, 1 ), 337 ); 338 foreach ( $numeric_defaults as $num_key => list( $default, $min ) ) { 339 if ( ! array_key_exists( $num_key, $sanitized ) ) { 340 continue; 341 } 342 $raw = $sanitized[ $num_key ]; 343 $sanitized[ $num_key ] = is_numeric( $raw ) && (int) $raw >= $min ? (int) $raw : $default; 321 344 } 322 345 -
bp-user-profile-reviews/trunk/includes/admin/views/overview.php
r3617176 r3736444 37 37 ); 38 38 39 // Flagged reviews still pending moderation. 40 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching 41 $bupr_flagged = (int) $wpdb->get_var( 42 $wpdb->prepare( 43 "SELECT COUNT(DISTINCT p.ID) 44 FROM {$wpdb->posts} p 45 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id 46 WHERE p.post_type = %s 47 AND p.post_status IN ('publish', 'draft') 48 AND pm.meta_key = %s 49 AND pm.meta_value = %s", 50 'review', 51 'bupr_flag_status', 52 'flagged' 53 ) 54 ); 39 // Reviews still pending moderation. Auto-hidden drafts were pulled by reports, 40 // not waiting for first approval, so they are counted apart from Pending. 41 $bupr_flagged = bupr_get_flagged_reviews_count(); 42 $bupr_auto_hidden = bupr_get_auto_hidden_reviews_count(); 43 $bupr_pending = max( 0, $bupr_pending - $bupr_auto_hidden ); 55 44 56 45 // Feature flags (read from the hydrated global, falling back to option). … … 105 94 <p class="bupr-stat__label"><?php esc_html_e( 'Reported', 'bp-member-reviews' ); ?></p> 106 95 <p class="bupr-stat__value"><?php echo esc_html( number_format_i18n( $bupr_flagged ) ); ?></p> 107 <p class="bupr-stat__trend"><?php esc_html_e( 'Reviews flagged for moderation', 'bp-member-reviews' ); ?></p> 96 <p class="bupr-stat__trend"> 97 <?php 98 if ( $bupr_auto_hidden > 0 ) { 99 printf( 100 '<a class="bupr-inline-hint" href="%s">%s</a>', 101 esc_url( 102 add_query_arg( 103 array( 104 'post_status' => 'draft', 105 'bupr_auto_hidden' => '1', 106 ), 107 $bupr_reviews_url 108 ) 109 ), 110 esc_html( 111 sprintf( 112 /* translators: %d: number of reviews hidden by the report threshold */ 113 _n( '%d hidden automatically', '%d hidden automatically', $bupr_auto_hidden, 'bp-member-reviews' ), 114 $bupr_auto_hidden 115 ) 116 ) 117 ); 118 } else { 119 esc_html_e( 'Reviews flagged for moderation', 'bp-member-reviews' ); 120 } 121 ?> 122 </p> 108 123 </div> 109 124 </div> … … 154 169 <?php else : ?> 155 170 <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span> 171 <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a> 156 172 <?php endif; ?> 157 173 </td> … … 164 180 <?php else : ?> 165 181 <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span> 182 <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a> 166 183 <?php endif; ?> 167 184 </td> … … 174 191 <?php else : ?> 175 192 <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span> 193 <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a> 176 194 <?php endif; ?> 177 195 </td> -
bp-user-profile-reviews/trunk/includes/bupr-ajax.php
r3617176 r3736444 36 36 /* add action for approving reviews */ 37 37 add_action( 'wp_ajax_bupr_approve_review', array( $this, 'bupr_approve_review' ) ); 38 add_action( 'wp_ajax_nopriv_bupr_approve_review', array( $this, 'bupr_approve_review' ) );39 38 40 39 add_action( 'wp_ajax_allow_bupr_member_review_update', array( $this, 'wp_allow_bupr_my_member' ) ); 41 add_action( 'wp_ajax_nopriv_allow_bupr_member_review_update', array( $this, 'wp_allow_bupr_my_member' ) );42 40 43 41 /*** Filter post_date_gmt for prevent update post date on update_post_data */ … … 88 86 } 89 87 90 // Check if user can approve reviews. 91 if ( ! current_user_can( 'edit_posts' ) ) { 88 // Approving publishes another member's review, which is moderation: Editor and up. 89 // edit_posts let a Contributor publish any pending review (including their own). 90 if ( ! current_user_can( 'edit_others_posts' ) ) { 92 91 wp_send_json_error( 93 92 array( … … 201 200 $review_desc = isset( $_POST['bupr_review_desc'] ) ? sanitize_textarea_field( wp_unslash( $_POST['bupr_review_desc'] ) ) : ''; 202 201 $bupr_member_id = filter_input( INPUT_POST, 'bupr_member_id', FILTER_VALIDATE_INT ); 203 $review_count = filter_input( INPUT_POST, 'bupr_field_counter', FILTER_VALIDATE_INT );204 202 $anonymous_review = filter_input( INPUT_POST, 'bupr_anonymous_review' ); 205 203 $profile_rated_field_values = isset( $_POST['bupr_review_rating'] ) ? array_map( 'absint', wp_unslash( $_POST['bupr_review_rating'] ) ) : array(); … … 225 223 return; 226 224 } 225 // The profile UI hides Add Review from disallowed roles; the endpoint must refuse too. 226 if ( ! bupr_roles_allow_review( $bupr_current_user, $bupr_member_id ) ) { 227 wp_send_json_error( '<p class="bupr-error">' . esc_html__( 'You are not allowed to review this member.', 'bp-member-reviews' ) . '</p>' ); 228 } 229 227 230 // Set user name (anonymous or actual). 231 // The anonymous flag only counts when the site allows anonymous reviews. 232 $anonymous_review = ( 'yes' === $anonymous_review && 'yes' === ( $bupr['anonymous_reviews'] ?? 'no' ) ) ? 'yes' : 'no'; 228 233 $user_name = ( 'yes' === $anonymous_review ) ? __( 'An anonymous user', 'bp-member-reviews' ) : $current_user->display_name; 229 234 … … 237 242 ); 238 243 239 // Process rating values.240 $bupr_count = 0;241 $bupr_member_star = array();242 243 244 $member_args = array( 244 245 'post_type' => 'review', 245 'posts_per_page' => -1, 246 // Only "has this author reviewed this member?" is needed. 247 'posts_per_page' => 1, 248 'fields' => 'ids', 249 'no_found_rows' => true, 246 250 'post_status' => array( 247 251 'draft', … … 268 272 269 273 if ( 0 === $user_post_count ) { 270 if ( ! empty( $profile_rated_field_values ) ) { 271 foreach ( $profile_rated_field_values as $bupr_stars_rate ) { 272 if ( $bupr_count === $review_count ) { 273 break; 274 /* 275 * Ratings arrive positionally, one per criterion in form order. Keep each 276 * rating on its own criterion: skipping an unrated (0) value used to shift 277 * every later rating onto the wrong criterion, and a partial set was then 278 * stored with numeric keys no reader could match to a criterion. 279 */ 280 $bupr_rated_stars = array(); 281 foreach ( array_values( $profile_rated_field_values ) as $bupr_index => $bupr_stars_rate ) { 282 $bupr_stars_rate = (int) $bupr_stars_rate; 283 if ( $bupr_stars_rate < 1 || $bupr_stars_rate > 5 ) { 284 continue; 285 } 286 if ( $bupr['multi_criteria_allowed'] ) { 287 if ( isset( $bupr_rating_criteria[ $bupr_index ] ) ) { 288 $bupr_rated_stars[ $bupr_rating_criteria[ $bupr_index ] ] = $bupr_stars_rate; 274 289 } 275 $bupr_stars_rate = (int) $bupr_stars_rate; 276 // Validate rating is between 1-5, skip invalid ratings. 277 if ( $bupr_stars_rate >= 1 && $bupr_stars_rate <= 5 ) { 278 $bupr_member_star[] = $bupr_stars_rate; 279 } 280 ++$bupr_count; 290 } elseif ( empty( $bupr_rated_stars ) ) { 291 $bupr_rated_stars[] = $bupr_stars_rate; 281 292 } 282 293 } 283 294 284 $bupr_rated_stars = array(); 285 if ( $bupr['multi_criteria_allowed'] && ( count( $bupr_rating_criteria ) === count( $bupr_member_star ) ) ) { 286 $bupr_rated_stars = array_combine( $bupr_rating_criteria, $bupr_member_star ); 287 } else { 288 $bupr_rated_stars = $bupr_member_star; 295 // Same rule as the form: every criterion rated, or a written review. 296 $bupr_needed_ratings = $bupr['multi_criteria_allowed'] ? count( $bupr_rating_criteria ) : 1; 297 if ( '' === trim( $review_desc ) && ( empty( $bupr_rated_stars ) || count( $bupr_rated_stars ) < $bupr_needed_ratings ) ) { 298 wp_send_json_error( '<p class="bupr-error">' . esc_html__( 'Please rate every criterion or write a review.', 'bp-member-reviews' ) . '</p>' ); 289 299 } 290 300 … … 404 414 $bupr_review_url = bp_members_get_user_url( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id; 405 415 } else { 406 $bupr_review_url = b p_core_get_user_domain( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id;416 $bupr_review_url = bupr_member_url( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id; 407 417 } 408 418 … … 437 447 438 448 $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' ); 439 $mail_sent = wp_mail( $bupr_reciever_email, $bupr_subject, nl2br( $bupr_message ), $bupr_header );449 $mail_sent = wp_mail( $bupr_reciever_email, $bupr_subject, wpautop( $bupr_message ), $bupr_header ); 440 450 if ( ! $mail_sent && defined( 'WP_DEBUG' ) && WP_DEBUG ) { 441 451 error_log( 'BUPR: Failed to send review notification email to ' . $bupr_reciever_email ); … … 492 502 493 503 $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' ); 494 $mail_sent = wp_mail( $bupr_to, $bupr_subject, nl2br( $bupr_approve_message ), $bupr_header );504 $mail_sent = wp_mail( $bupr_to, $bupr_subject, wpautop( $bupr_approve_message ), $bupr_header ); 495 505 if ( ! $mail_sent && defined( 'WP_DEBUG' ) && WP_DEBUG ) { 496 506 error_log( 'BUPR: Failed to send admin approval notification email to ' . $bupr_to ); … … 558 568 559 569 // Check if current user can edit this review. 570 // Settings > General > Update Review off: members can no longer edit (moderators still can). 571 global $bupr; 572 if ( 'yes' !== ( $bupr['allow_update'] ?? 'yes' ) && ! current_user_can( 'edit_others_posts' ) ) { 573 wp_send_json_error( 574 array( 575 'message' => __( 'Editing reviews is turned off on this site.', 'bp-member-reviews' ), 576 'code' => 'update_disabled', 577 ) 578 ); 579 } 580 560 581 if ( get_current_user_id() !== (int) $review->post_author && ! current_user_can( 'edit_others_posts' ) ) { 561 582 wp_send_json_error( … … 740 761 * others' posts (editor/admin). 741 762 */ 763 // Settings > General > Update Review off: members can no longer edit (moderators still can). 764 global $bupr; 765 if ( 'yes' !== ( $bupr['allow_update'] ?? 'yes' ) && ! current_user_can( 'edit_others_posts' ) ) { 766 wp_send_json_error( 767 array( 768 'message' => __( 'Editing reviews is turned off on this site.', 'bp-member-reviews' ), 769 'code' => 'update_disabled', 770 ) 771 ); 772 } 773 742 774 if ( get_current_user_id() !== (int) $review->post_author && ! current_user_can( 'edit_others_posts' ) ) { 743 775 wp_send_json_error( … … 759 791 760 792 $review_args = array( 761 'ID' => esc_sql( $review_id ),793 'ID' => (int) $review_id, 762 794 'post_content' => wp_kses_post( $review_content ), 763 'post_status' => 'publish', 795 // No post_status: an edit keeps the review's status. Forcing 'publish' let an 796 // author re-publish a pending or report-hidden review without moderation. 764 797 ); 765 798 … … 850 883 // Get the review. 851 884 $review = get_post( $review_id ); 852 if ( ! $review || 'review' !== $review->post_type ) { 885 // Only published reviews can be replied to (the owner cannot see pending ones). 886 if ( ! $review || 'review' !== $review->post_type || 'publish' !== $review->post_status ) { 853 887 wp_send_json_error( 854 888 array( … … 1060 1094 $flag_threshold = isset( $bupr['flag_threshold'] ) ? absint( $bupr['flag_threshold'] ) : 5; 1061 1095 $auto_hidden = false; 1062 if ( $flag_threshold > 0 && $flag_count >= $flag_threshold ) { 1096 // Reports an admin already dismissed do not count again. 1097 $active_flags = $flag_count - (int) get_post_meta( $review_id, 'bupr_flag_dismissed_at_count', true ); 1098 if ( $flag_threshold > 0 && $active_flags >= $flag_threshold ) { 1063 1099 // Auto-hide the review by setting it to draft. 1064 1100 wp_update_post( -
bp-user-profile-reviews/trunk/includes/bupr-filters.php
r3617176 r3736444 20 20 */ 21 21 class BUPR_Custom_Hooks { 22 23 /**24 * Holds user role cache.25 *26 * @var array27 */28 public $user_role_cache = array();29 30 22 31 23 /** … … 132 124 133 125 if ( 'personal' === $bp_nouveau->displayed_nav && ! empty( $nav_item->primary ) ) { 134 if ( bp_loggedin_user_domain() ) {135 $link = str_replace( b p_loggedin_user_domain(), bp_displayed_user_domain(), $link );126 if ( is_user_logged_in() ) { 127 $link = str_replace( bupr_member_url( bp_loggedin_user_id() ), bupr_member_url( bp_displayed_user_id() ), $link ); 136 128 } else { 137 $link = trailingslashit( b p_displayed_user_domain() . $link );129 $link = trailingslashit( bupr_member_url( bp_displayed_user_id() ) . $link ); 138 130 } 139 131 } 140 132 return $link; 141 }142 143 /**144 * Get displayed user role.145 *146 * @since 2.3.0147 * @access public148 * @author Wbcom Designs149 *150 * @param int $user_id The user ID to get roles for.151 * @return array Array of user roles.152 */153 public function bupr_get_current_user_roles( $user_id ) {154 // Return empty array if not logged in.155 if ( ! is_user_logged_in() || empty( $user_id ) ) {156 return array();157 }158 159 $user_id = absint( $user_id );160 // Check cache first.161 if ( isset( $this->user_role_cache[ $user_id ] ) ) {162 return $this->user_role_cache[ $user_id ];163 }164 165 if ( ! get_userdata( $user_id ) ) {166 return array();167 }168 // Get user data.169 $user = get_userdata( $user_id );170 $roles = array();171 172 if ( is_object( $user ) && isset( $user->roles ) ) {173 $roles = $user->roles;174 }175 176 // Cache the result.177 $this->user_role_cache[ $user_id ] = $roles;178 179 return $roles;180 133 } 181 134 … … 345 298 public function bupr_add_review_button_on_member_header() { 346 299 global $bupr; 347 if ( ! empty( $bupr['hide_review_button'] ) && 'yes' === $bupr['hide_review_button'] ) { 348 if ( is_user_logged_in() ) { 349 if ( bp_displayed_user_id() === bp_loggedin_user_id() ) { 350 $this->bupr_members_right_to_review(); 351 } else { 352 $this->bupr_members_right_to_take_review(); 353 } 354 } 355 } 356 } 357 358 /** 359 * Map members who can give review by member role. 360 */ 361 public function bupr_members_right_to_review() { 362 // Add capability checks. 363 if ( ! current_user_can( 'read' ) || ! is_user_logged_in() ) { 300 if ( empty( $bupr['hide_review_button'] ) || 'yes' !== $bupr['hide_review_button'] || ! is_user_logged_in() ) { 364 301 return; 365 302 } 366 global $bp, $bupr; 367 $review_div = 'form'; 368 $user_id = bp_loggedin_user_id(); 369 370 // Get user roles once for efficiency (avoid double function call). 371 $user_roles = $this->bupr_get_current_user_roles( $user_id ); 372 $user_role = ( is_array( $user_roles ) && ! empty( $user_roles ) ) ? $user_roles[0] : ''; 373 374 // If user role is NOT in the allowed reviewer roles, exit early. 375 $allowed_reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array(); 376 if ( ! empty( $allowed_reviewer_roles ) && ! in_array( $user_role, $allowed_reviewer_roles, true ) ) { 303 $member_id = bp_displayed_user_id(); 304 // Never on own profile (self-review is refused), and only when the roles 305 // settings allow it: the same check the Add Review tab and the submit use. 306 if ( ! $member_id || bp_loggedin_user_id() === $member_id || ! bupr_roles_allow_review( bp_loggedin_user_id(), $member_id ) ) { 377 307 return; 378 308 } 379 380 // Check if the displayed user is not the logged-in user. 381 if ( bp_displayed_user_id() !== bp_loggedin_user_id() ) { 382 383 // User passed the role check above, show the "Add Review" button. 384 $review_url = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug(); 385 $bp_template_option = bp_get_option( '_bp_theme_package_id' ); 386 387 // BuddyPress Nouveau template. 388 if ( 'nouveau' === $bp_template_option ) { 309 $review_url = bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug(); 310 $tag = 'nouveau' === bp_get_option( '_bp_theme_package_id' ) ? 'li' : 'div'; 311 ?> 312 <<?php echo esc_html( $tag ); ?> id="bupr-add-review-btn" class="generic-button"> 313 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="form"> 314 <?php 315 /* translators: %s: Review label. */ 316 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 389 317 ?> 390 <li id="bupr-add-review-btn" class="generic-button"> 391 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review"> 392 <?php 393 /* translators: %s: Review label. */ 394 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 395 ?> 396 </a> 397 </li> 398 <?php 399 } else { 400 // BuddyPress legacy or other template. 401 ?> 402 <div id="bupr-add-review-btn" class="generic-button"> 403 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review"> 404 <?php 405 /* translators: %s: review label. */ 406 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 407 ?> 408 </a> 409 </div> 410 <?php 411 } 412 } 413 } 414 415 /** 416 * Members who can only take reviews. 417 */ 418 public function bupr_members_right_to_take_review() { 419 global $bp, $bupr; 420 $review_div = 'form'; 421 $user_id = bp_loggedin_user_id(); 422 $user_role = ( ! empty( $this->bupr_get_current_user_roles( $user_id ) ) ) ? $this->bupr_get_current_user_roles( $user_id )[0] : ''; 423 424 // Exit early if the user's role is NOT in the allowed reviewer roles. 425 $allowed_reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array(); 426 if ( ! empty( $allowed_reviewer_roles ) && ! in_array( $user_role, $allowed_reviewer_roles, true ) ) { 427 return; 428 } 429 430 // Check if the displayed user is not the logged-in user. 431 if ( bp_displayed_user_id() !== bp_loggedin_user_id() ) { 432 433 // If add_taken_members is set, process the review logic. 434 if ( ! empty( $bupr['add_taken_members'] ) ) { 435 $user_id = bp_displayed_user_id(); 436 $user_roles = $this->bupr_get_current_user_roles( $user_id ); 437 $user_role = ! empty( $user_roles ) ? $user_roles[0] : ''; 438 // Check if the displayed user has the role to take reviews. 439 if ( in_array( $user_role, $bupr['add_taken_members'], true ) ) { 440 441 // Construct the review URL. 442 $review_url = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug(); 443 $bp_template_option = bp_get_option( '_bp_theme_package_id' ); 444 445 // BuddyPress Nouveau template. 446 if ( 'nouveau' === $bp_template_option ) { 447 ?> 448 <li id="bupr-add-review-btn" class="generic-button"> 449 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>"> 450 <?php 451 /* translators: %s: review label. */ 452 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 453 ?> 454 </a> 455 </li> 456 <?php 457 } else { 458 // BuddyPress legacy or other template. 459 ?> 460 <div id="bupr-add-review-btn" class="generic-button"> 461 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>"> 462 <?php 463 /* translators: %s: review label. */ 464 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 465 ?> 466 </a> 467 </div> 468 <?php 469 } 470 } 471 } else { 472 // If add_taken_members is empty, allow reviews for all. 473 474 // Construct the review URL. 475 $review_url = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug(); 476 $bp_template_option = bp_get_option( '_bp_theme_package_id' ); 477 478 // BuddyPress Nouveau template. 479 if ( 'nouveau' === $bp_template_option ) { 480 ?> 481 <li id="bupr-add-review-btn" class="generic-button"> 482 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>"> 483 <?php 484 /* translators: %s: review label. */ 485 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 486 ?> 487 </a> 488 </li> 489 <?php 490 } else { 491 // BuddyPress legacy or other template. 492 ?> 493 <div id="bupr-add-review-btn" class="generic-button"> 494 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>"> 495 <?php 496 /* translators: %s: review label. */ 497 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) ); 498 ?> 499 </a> 500 </div> 501 <?php 502 } 503 } 504 } 318 </a> 319 </<?php echo esc_html( $tag ); ?>> 320 <?php 505 321 } 506 322 … … 516 332 global $wp_admin_bar; 517 333 global $bupr; 518 $bupr_args = array( 519 'post_type' => 'review', 520 'posts_per_page' => -1, 521 'post_status' => 'publish', 522 'category' => 'bp-member', 523 'meta_query' => array( 524 array( 525 'key' => 'linked_bp_member', 526 'value' => get_current_user_id(), 527 'compare' => '=', 528 ), 529 ), 530 ); 531 532 $reviews = get_posts( $bupr_args ); 533 $reviews_count = count( $reviews ); 334 $reviews_count = bupr_get_member_review_count( get_current_user_id() ); 534 335 535 336 $profile_menu_slug = isset( $bupr['review_label_plural'] ) ? sanitize_title( $bupr['review_label_plural'] ) : esc_html( 'reviews' ); 536 337 537 $base_url = b p_loggedin_user_domain() . $profile_menu_slug;338 $base_url = bupr_member_url( bp_loggedin_user_id() ) . $profile_menu_slug; 538 339 if ( is_user_logged_in() ) { 539 340 $wp_admin_bar->add_menu( … … 735 536 736 537 // Add Approve Link for draft reviews. 737 if ( 'draft' === $post->post_status ) {538 if ( 'draft' === $post->post_status && current_user_can( 'edit_others_posts' ) ) { 738 539 $actions['approve_review'] = '<a href="javascript:void(0);" title="' . $review_title . '" class="bupr-approve-review" data-rid="' . $post->ID . '">' . esc_html__( 'Approve', 'bp-member-reviews' ) . '</a>'; 739 540 } … … 767 568 global $bp, $bupr; 768 569 769 // Default from plugin settings.770 $exclude_given_members = $bupr['exclude_given_members'] ?? array();771 $add_taken_members = $bupr['add_taken_members'] ?? array();772 $review_label = $bupr['review_label'] ?? esc_html__( 'Review', 'bp-member-reviews' );773 774 if ( bupr_bp_classic_activate() ) {775 global $wp_roles;776 // Ensure $wp_roles is set correctly.777 if ( ! isset( $wp_roles ) || ! is_object( $wp_roles ) || ! isset( $wp_roles->roles ) ) {778 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Initializing WordPress global when not set.779 $wp_roles = wp_roles();780 }781 // Get all available roles for pre-population.782 $available_roles = array_keys( $wp_roles->roles );783 $bupr_general_settings = get_option( 'bupr_admin_general_options', array() );784 $exclude_given_members = $bupr_general_settings['bupr_exc_member'] ?? $available_roles;785 $add_taken_members = $bupr_general_settings['bupr_add_member'] ?? $available_roles;786 }787 788 570 $bp_pages = bp_core_get_directory_pages(); 789 571 add_filter( 'site_url', 'bupr_site_url', 99 ); 790 572 $member_slug = ( isset( $bp_pages->members ) && isset( $bp_pages->members->slug ) ) ? $bp_pages->members->slug : 'members'; 791 573 792 // Count member's review. 793 // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query 794 $bupr_args = array( 795 'post_type' => 'review', 796 'posts_per_page' => -1, 797 'post_status' => 'publish', 798 'category' => 'bp-member', 799 'meta_query' => array( 800 array( 801 'key' => 'linked_bp_member', 802 'value' => bp_displayed_user_id(), 803 'compare' => '=', 804 ), 805 ), 806 ); 807 808 $bupr_reviews = new WP_Query( $bupr_args ); 809 if ( ! empty( $bupr_reviews->posts ) ) { 810 $bupr_reviews = count( $bupr_reviews->posts ); 811 if ( ! empty( $bupr_reviews ) ) { 812 $bupr_notification = '<span class="count">' . $bupr_reviews . '</span>'; 813 } else { 814 $bupr_notification = '<span class="count">' . 0 . '</span>'; 815 } 816 } else { 817 $bupr_notification = '<span class="count">' . 0 . '</span>'; 818 } 819 wp_reset_postdata(); 574 // Count member's reviews (cached aggregate, not a full query per page view). 575 $bupr_notification = '<span class="count">' . bupr_get_member_review_count( bp_displayed_user_id() ) . '</span>'; 820 576 821 577 $name = bp_get_displayed_user_username(); … … 823 579 if ( apply_filters( 'bupr_show_profile_review_tab', true ) ) { 824 580 $tab_args = array( 825 'name' => bupr_profile_review_tab_name() . ' s' . $bupr_notification,581 'name' => bupr_profile_review_tab_name() . ' ' . $bupr_notification, // BP cuts one char before the count span. 826 582 'slug' => bupr_profile_review_tab_plural_slug(), 827 583 'screen_function' => array( $this, 'bupr_reviews_tab_function_to_show_screen' ), … … 849 605 850 606 // Add subnav to add a review. 851 if ( bp_displayed_user_id() === bp_loggedin_user_id() ) { 852 // On own profile: show "Add Review" subnav if user's role is in the allowed reviewer roles. 853 $user_role = $this->bupr_get_current_user_roles( bp_loggedin_user_id() ); 854 $allowed_roles = ! empty( $exclude_given_members ) && is_array( $exclude_given_members ) ? $exclude_given_members : array(); 855 856 // Show subnav if no role restrictions are set, or if user's role is in the allowed list. 857 if ( empty( $allowed_roles ) || ( ! empty( $user_role ) && array_intersect( (array) $user_role, $allowed_roles ) ) ) { 858 bp_core_new_subnav_item( 859 array( 860 /* translators: %1$s: Review Label. */ 861 'name' => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( $review_label ) ), 862 'slug' => 'add-' . bupr_profile_review_tab_singular_slug(), 863 'parent_url' => $bp->loggedin_user->domain . $parent_slug . '/', 864 'parent_slug' => $parent_slug, 865 'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ), 866 'position' => 200, 867 'link' => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(), 868 ) 869 ); 870 } 871 } else { 872 // On another user's profile: check if logged-in user's role is allowed to give reviews. 873 $user_role = $this->bupr_get_current_user_roles( bp_loggedin_user_id() ); 874 $allowed_roles = ! empty( $exclude_given_members ) && is_array( $exclude_given_members ) ? $exclude_given_members : array(); 875 876 // If allowed roles are set and user's role is NOT in the list, block the subnav. 877 if ( ! empty( $allowed_roles ) && ! empty( $user_role ) && ! array_intersect( (array) $user_role, $allowed_roles ) ) { 878 return; 879 } 880 881 if ( ! empty( $add_taken_members ) && ! empty( $user_role ) ) { 882 $user_role = $this->bupr_get_current_user_roles( bp_displayed_user_id() ); 883 $user_role = ! empty( $user_role ) ? $user_role : array(); 884 885 if ( array_intersect( $user_role, $add_taken_members ) ) { 886 bp_core_new_subnav_item( 887 array( 888 /* translators: %1$s: Review label. */ 889 'name' => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ), 890 'slug' => 'add-' . bupr_profile_review_tab_singular_slug(), 891 'parent_url' => $bp->loggedin_user->domain . $parent_slug . '/', 892 'parent_slug' => $parent_slug, 893 'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ), 894 'position' => 200, 895 'link' => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(), 896 ) 897 ); 898 } 899 } else { 900 901 bp_core_new_subnav_item( 902 array( 903 /* translators: %1$s: Review label. */ 904 'name' => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ), 905 'slug' => 'add-' . bupr_profile_review_tab_singular_slug(), 906 'parent_url' => $bp->loggedin_user->domain . $parent_slug . '/', 907 'parent_slug' => $parent_slug, 908 'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ), 909 'position' => 200, 910 'link' => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(), 911 ) 912 ); 913 } 607 // Never on own profile: the profile form has no member picker and self-review is refused (bupr-ajax.php). 608 // Logged-in viewers get it only when the roles settings allow the review, the same check as the header 609 // button and the submit; logged-out visitors see it and the form asks them to log in. 610 $member_id = bp_displayed_user_id(); 611 if ( bp_loggedin_user_id() !== $member_id && ( ! is_user_logged_in() || bupr_roles_allow_review( bp_loggedin_user_id(), $member_id ) ) ) { 612 bp_core_new_subnav_item( 613 array( 614 /* translators: %1$s: Review label. */ 615 'name' => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ), 616 'slug' => 'add-' . bupr_profile_review_tab_singular_slug(), 617 'parent_url' => $bp->loggedin_user->domain . $parent_slug . '/', 618 'parent_slug' => $parent_slug, 619 'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ), 620 'position' => 200, 621 'link' => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(), 622 ) 623 ); 914 624 } 915 625 remove_filter( 'site_url', 'bupr_site_url', 99 ); … … 977 687 <?php 978 688 printf( 979 /* translators: %1$s: Review user link; %2$s: review label; %3$s: reviewed user link. */ 980 'You must <a href="%1$s">login</a> to add a %2$s.', 981 esc_url( wp_login_url( get_permalink() ) ), 982 esc_html( strtolower( $bupr['review_label'] ) ), 689 wp_kses( 690 /* translators: %1$s: login URL; %2$s: review label. */ 691 __( 'You must <a href="%1$s">log in</a> to add a %2$s.', 'bp-member-reviews' ), 692 array( 'a' => array( 'href' => array() ) ) 693 ), 694 // Come back to this form after logging in. 695 esc_url( wp_login_url( bp_get_requested_url() ) ), 696 esc_html( strtolower( $bupr['review_label'] ) ) 983 697 ); 984 698 ?> … … 1051 765 } 1052 766 1053 // Check if the review activity should be created (based on settings).1054 // Get the review post data.767 // Only a published review belongs in the activity stream (an edit to a pending 768 // or report-hidden review fires this same hook). 1055 769 $review = get_post( $review_id ); 1056 if ( ! empty( $review ) ) {770 if ( ! empty( $review ) && 'publish' === $review->post_status ) { 1057 771 // Get the reviewer's (author's) and reviewed user's profile URLs. 1058 772 $reviewer_user_id = $review->post_author; … … 1088 802 $activity_user_id = $is_anonymous ? $reviewed_user_id : $reviewer_user_id; 1089 803 804 // One entry per review: an edit or re-approval updates the existing 805 // entry in place (keeping its date) instead of posting a duplicate. 806 $existing_id = bupr_get_review_activity_id( $review_id ); 807 $recorded_time = $existing_id ? ( new BP_Activity_Activity( $existing_id ) )->date_recorded : bp_core_current_time(); 808 1090 809 // Add activity to BuddyPress. 1091 810 $activity_id = bp_activity_add( 1092 811 array( 812 'id' => $existing_id, 813 'recorded_time' => $recorded_time, 1093 814 'action' => $action, 1094 815 'content' => ! empty( $escaped_content ) ? $escaped_content : 'Ratings', 1095 816 'component' => $bp->members->id, 1096 'type' => defined( 'YOUZIFY_VERSION' ) ? 'activity_status' : 'member_review',817 'type' => bupr_review_activity_type(), 1097 818 'user_id' => $activity_user_id, 1098 819 'item_id' => $review_id, -
bp-user-profile-reviews/trunk/includes/bupr-general-functions.php
r3617176 r3736444 607 607 } 608 608 609 if ( 'before_delete_post' === current_action() ) { 610 // The row still exists here, so recalculating now would count it again. 611 // Drop its activity and recalculate once the delete has gone through. 612 bupr_delete_review_activity( $post_id ); 613 add_action( 614 'deleted_post', 615 function ( $deleted_id ) use ( $post_id, $user_id ) { 616 if ( (int) $deleted_id === (int) $post_id ) { 617 bupr_recalculate_user_reviews_for_user( $user_id ); 618 bupr_flush_top_members_cache(); 619 } 620 } 621 ); 622 return; 623 } 624 609 625 // Force recalculation. 610 626 bupr_recalculate_user_reviews_for_user( $user_id ); … … 635 651 636 652 /** 653 * Published reviews a member has received, from the cached aggregate (recalculated once if missing). 654 * 655 * Replaces per-request get_posts( posts_per_page => -1 ) counts, which loaded every 656 * review a member has into memory on every page view. 657 * 658 * @since 3.8.1 659 * @param int $user_id Member ID. 660 * @return int 661 */ 662 function bupr_get_member_review_count( $user_id ) { 663 $user_id = (int) $user_id; 664 if ( ! $user_id ) { 665 return 0; 666 } 667 $count = get_user_meta( $user_id, 'bupr_review_count', true ); 668 if ( '' === $count ) { 669 bupr_recalculate_user_reviews_for_user( $user_id ); 670 $count = get_user_meta( $user_id, 'bupr_review_count', true ); 671 } 672 return (int) $count; 673 } 674 675 /** 676 * A member's profile URL, with a trailing slash, on every supported BuddyPress. 677 * 678 * BuddyPress 12 deprecated bp_core_get_user_domain() (a notice on every call under 679 * WP_DEBUG), and bp_members_get_user_url() does not exist before 12. 680 * 681 * @since 3.8.1 682 * @param int $user_id User ID. 683 * @return string 684 */ 685 function bupr_member_url( $user_id ) { 686 $url = function_exists( 'bp_members_get_user_url' ) ? bp_members_get_user_url( (int) $user_id ) : bp_core_get_user_domain( (int) $user_id ); 687 return trailingslashit( (string) $url ); 688 } 689 690 /** 691 * Whether the Reviewer Roles / Reviewee Roles settings allow one member to review another. 692 * 693 * An empty list means "every role". A user passes when ANY of their roles is listed. 694 * The header button, the Add Review tab, the shortcode picker and the submit all use this check. 695 * 696 * @since 3.8.1 697 * @param int $reviewer_id User submitting the review. 698 * @param int $member_id User being reviewed. 699 * @return bool 700 */ 701 function bupr_roles_allow_review( $reviewer_id, $member_id ) { 702 global $bupr; 703 $reviewer = get_userdata( (int) $reviewer_id ); 704 $member = get_userdata( (int) $member_id ); 705 if ( ! $reviewer || ! $member ) { 706 return false; 707 } 708 $reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array(); 709 $reviewee_roles = isset( $bupr['add_taken_members'] ) && is_array( $bupr['add_taken_members'] ) ? $bupr['add_taken_members'] : array(); 710 if ( $reviewer_roles && ! array_intersect( (array) $reviewer->roles, $reviewer_roles ) ) { 711 return false; 712 } 713 if ( $reviewee_roles && ! array_intersect( (array) $member->roles, $reviewee_roles ) ) { 714 return false; 715 } 716 return true; 717 } 718 719 /** 720 * Number of reviews whose reports are still open (published or hidden). 721 * 722 * @since 3.8.1 723 * @return int 724 */ 725 function bupr_get_flagged_reviews_count() { 726 global $wpdb; 727 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching 728 return (int) $wpdb->get_var( 729 $wpdb->prepare( 730 "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p 731 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id 732 WHERE p.post_type = %s AND p.post_status IN ('publish', 'draft') 733 AND pm.meta_key = 'bupr_flag_status' AND pm.meta_value = 'flagged'", 734 'review' 735 ) 736 ); 737 } 738 739 /** 740 * Number of reviews currently hidden because they reached the report threshold. 741 * 742 * @since 3.8.1 743 * @return int 744 */ 745 function bupr_get_auto_hidden_reviews_count() { 746 global $wpdb; 747 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching 748 return (int) $wpdb->get_var( 749 $wpdb->prepare( 750 "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p 751 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id 752 WHERE p.post_type = %s AND p.post_status = 'draft' 753 AND pm.meta_key = 'bupr_auto_hidden' AND pm.meta_value <> ''", 754 'review' 755 ) 756 ); 757 } 758 759 /** 760 * Activity type used for review entries. Youzify only renders its own status type. 761 * 762 * @since 3.8.1 763 * @return string 764 */ 765 function bupr_review_activity_type() { 766 return defined( 'YOUZIFY_VERSION' ) ? 'activity_status' : 'member_review'; 767 } 768 769 /** 770 * ID of the activity entry recorded for a review, or 0 when there is none. 771 * 772 * @since 3.8.1 773 * @param int $review_id Review post ID. 774 * @return int 775 */ 776 function bupr_get_review_activity_id( $review_id ) { 777 if ( ! function_exists( 'bp_activity_get_activity_id' ) ) { 778 return 0; 779 } 780 return (int) bp_activity_get_activity_id( 781 array( 782 'component' => buddypress()->members->id, 783 'type' => bupr_review_activity_type(), 784 'item_id' => (int) $review_id, 785 ) 786 ); 787 } 788 789 /** 790 * Remove the activity entries recorded for a review. 791 * 792 * @since 3.8.1 793 * @param int $review_id Review post ID. 794 */ 795 function bupr_delete_review_activity( $review_id ) { 796 if ( ! function_exists( 'bp_activity_delete' ) ) { 797 return; 798 } 799 bp_activity_delete( 800 array( 801 'component' => buddypress()->members->id, 802 'type' => bupr_review_activity_type(), 803 'item_id' => (int) $review_id, 804 ) 805 ); 806 } 807 808 /** 637 809 * Handle review status transitions to trigger cache invalidation. 638 810 * … … 652 824 if ( $new_status === $old_status ) { 653 825 return; 826 } 827 828 // A review that stops being public takes its activity entry with it. Re-publishing 829 // creates a fresh one through bupr_member_review_after_review_insert. 830 if ( 'publish' === $old_status ) { 831 bupr_delete_review_activity( $post->ID ); 832 } 833 834 // An admin re-approving an auto-hidden review clears the auto-hidden marker. 835 if ( 'publish' === $new_status ) { 836 delete_post_meta( $post->ID, 'bupr_auto_hidden' ); 837 delete_post_meta( $post->ID, 'bupr_auto_hidden_date' ); 654 838 } 655 839 -
bp-user-profile-reviews/trunk/includes/bupr-notification.php
r3617176 r3736444 57 57 global $bp, $bupr; 58 58 $post_status = get_post_status( $item_id ); // getting review status. 59 60 if ( 'bupr_review_flagged_action' === $component_action_name || 'bupr_owner_reply_action' === $component_action_name ) { 61 $label = strtolower( $bupr['review_label'] ?? __( 'Review', 'bp-member-reviews' ) ); 62 if ( 'bupr_review_flagged_action' === $component_action_name ) { 63 $link = admin_url( 'post.php?post=' . (int) $item_id . '&action=edit' ); 64 /* translators: %s: review label. */ 65 $text = sprintf( __( 'A member reported a %s. Check it and dismiss or resolve the report.', 'bp-member-reviews' ), $label ); 66 } else { 67 $member_id = (int) get_post_meta( $item_id, 'linked_bp_member', true ); 68 $member = get_userdata( $member_id ); 69 $link = bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/view/' . (int) $item_id; 70 /* translators: 1: member name, 2: review label. */ 71 $text = sprintf( __( '%1$s replied to your %2$s', 'bp-member-reviews' ), $member ? $member->display_name : '', $label ); 72 } 73 $link = wp_nonce_url( 74 add_query_arg( 75 array( 76 'referer' => 'user_notification', 77 'id' => $item_id, 78 ), 79 $link 80 ), 81 'mark-as-read-notification-' . bp_loggedin_user_id() 82 ); 83 if ( 'string' === $format ) { 84 return sprintf( '<a href="%s">%s</a>', esc_url( $link ), esc_html( $text ) ); 85 } 86 return array( 87 'text' => $text, 88 'link' => $link, 89 ); 90 } 59 91 60 92 if ( 'bupr_add_review_action' === $component_action_name ) { … … 91 123 $linked_user_name = $linked_user_info->display_name; 92 124 } 93 // Check if bp_members_get_user_url() exists and use it; otherwise, fall back to bp_core_get_user_domain().94 125 if ( is_array( $bupr ) ) { 95 if ( function_exists( 'bp_members_get_user_url' ) ) { 96 // Use bp_members_get_user_url() if it exists (for BuddyPress v12.0.0 and above). 97 $notification_link = bp_members_get_user_url( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id; 98 } else { 99 // Fall back to bp_core_get_user_domain() for older versions of BuddyPress. 100 $notification_link = bp_core_get_user_domain( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id; 101 } 126 $notification_link = bupr_member_url( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id; 102 127 103 128 /* translators: %s: */ … … 195 220 196 221 /** 222 * Add one unread notification for a review event, behind the BuddyPress Notifications switch. 223 * An unread one for the same review and recipient is not repeated. 224 * 225 * @since 3.8.1 226 * @param int $user_id Recipient. 227 * @param int $review_id Review post ID. 228 * @param string $action Component action. 229 */ 230 function bupr_add_review_event_notification( $user_id, $review_id, $action ) { 231 global $bupr; 232 if ( ! $user_id || ! function_exists( 'bp_notifications_add_notification' ) || 'yes' !== ( $bupr['allow_notification'] ?? '' ) ) { 233 return; 234 } 235 $unread = BP_Notifications_Notification::get( 236 array( 237 'user_id' => $user_id, 238 'item_id' => $review_id, 239 'component_name' => 'buddypress_member_review', 240 'component_action' => $action, 241 'is_new' => 1, 242 ) 243 ); 244 if ( $unread ) { 245 return; 246 } 247 bp_notifications_add_notification( 248 array( 249 'user_id' => $user_id, 250 'item_id' => $review_id, 251 'secondary_item_id' => get_current_user_id(), 252 'component_name' => 'buddypress_member_review', 253 'component_action' => $action, 254 'date_notified' => bp_core_current_time(), 255 'is_new' => 1, 256 ) 257 ); 258 } 259 260 /** 261 * Tell the site administrator a review was reported (the same account that gets the 262 * pending-approval notice). Reporters stay anonymous: the text does not name them. 263 * 264 * @since 3.8.1 265 * @param int $review_id Review post ID. 266 */ 267 function bupr_notify_review_flagged( $review_id ) { 268 $admins = get_users( 269 array( 270 'role' => 'administrator', 271 'number' => 1, 272 'fields' => 'ID', 273 ) 274 ); 275 if ( $admins ) { 276 bupr_add_review_event_notification( (int) $admins[0], (int) $review_id, 'bupr_review_flagged_action' ); 277 } 278 } 279 add_action( 'bupr_review_flagged', 'bupr_notify_review_flagged' ); 280 281 /** 282 * Tell the reviewer the reviewed member replied to their review. 283 * 284 * @since 3.8.1 285 * @param int $review_id Review post ID. 286 * @param int $owner_id Member who replied. 287 * @param int $reviewer_id Review author. 288 */ 289 function bupr_notify_owner_reply( $review_id, $owner_id, $reviewer_id ) { 290 if ( (int) $reviewer_id !== (int) $owner_id ) { 291 bupr_add_review_event_notification( (int) $reviewer_id, (int) $review_id, 'bupr_owner_reply_action' ); 292 } 293 } 294 add_action( 'bupr_owner_reply_added', 'bupr_notify_owner_reply', 10, 3 ); 295 296 /** 197 297 * Delete all BuddyPress notifications tied to a review. 198 298 * … … 213 313 } 214 314 215 // Removes the notification for every recipient (reviewed member + the216 // admin approval notice)in one query, keyed on the review item id.315 // Removes every notification for the review (new review, approval, report, 316 // reply) for every recipient in one query, keyed on the review item id. 217 317 BP_Notifications_Notification::delete( 218 318 array( 219 'item_id' => $review_id, 220 'component_name' => 'buddypress_member_review', 221 'component_action' => 'bupr_add_review_action', 319 'item_id' => $review_id, 320 'component_name' => 'buddypress_member_review', 222 321 ) 223 322 ); … … 225 324 226 325 add_action( 'bp_actions', 'bupr_buddypress_notification_marked_as_read' ); 326 // Pending-approval and report notifications link to the review edit screen in wp-admin. 327 add_action( 'load-post.php', 'bupr_buddypress_notification_marked_as_read' ); 227 328 228 329 /** … … 260 361 array( 'is_new' => false ), 261 362 array( 262 'component_ action' => 'bupr_add_review_action',263 'user_id' => $current_user_id,264 'item_id' => $review_id,265 ) 266 ); 267 } 363 'component_name' => 'buddypress_member_review', 364 'user_id' => $current_user_id, 365 'item_id' => $review_id, 366 ) 367 ); 368 } -
bp-user-profile-reviews/trunk/includes/bupr-scripts.php
r3617176 r3736444 95 95 return true; 96 96 } 97 } 98 99 // The Member Review widget renders in any sidebar, not only on BuddyPress pages. 100 if ( is_active_widget( false, false, 'bupr_members_review_setting', true ) ) { 101 return true; 97 102 } 98 103 -
bp-user-profile-reviews/trunk/includes/bupr-shortcodes.php
r3617176 r3736444 92 92 FROM {$wpdb->usermeta} 93 93 WHERE meta_key = %s 94 AND CAST(meta_value AS DECIMAL(10,2)) > 0 94 95 ORDER BY CAST(meta_value AS DECIMAL(10,2)) DESC 95 96 LIMIT %d", … … 118 119 $review_count = apply_filters( 'bupr_shortcode_review_count', ( ! empty( $review_count ) ? $review_count : 0 ), $user_id ); 119 120 120 // Get user profile link using bp_core_get_user_domain() which works across all BP versions. 121 $user_domain = function_exists( 'bp_core_get_user_domain' ) ? bp_core_get_user_domain( $user_id ) : ''; 122 $user_nicename = get_the_author_meta( 'user_nicename', $user_id ); 123 $profile_url = ! empty( $user_domain ) ? $user_domain : home_url( '/members/' . $user_nicename . '/' ); 121 $profile_url = bupr_member_url( $user_id ); 124 122 125 123 // Get global settings for review tab URL. … … 134 132 } 135 133 $output .= '<div class="bupr-content-widget">'; 136 $display_name = bp_core_get_username( $user_id ); 134 // Display name, never the login (a login is half of a member's credentials). 135 $display_name = bp_core_get_user_displayname( $user_id ); 137 136 $members_profile = '<a href="' . esc_url( $profile_url ) . '">' . esc_html( $display_name ) . '</a>'; 138 137 $output .= '<div class="bupr-member-title">' . wp_kses_post( $members_profile ) . '</div>'; … … 173 172 * @since 3.8.0 174 173 * @param string $label The item type label. Default 'reviews'. 174 * @param int $count Review count, for choosing singular or plural (since 3.8.1). 175 175 */ 176 $item_label = apply_filters( 'bupr_item_type_label', _ _( 'reviews', 'bp-member-reviews' ));176 $item_label = apply_filters( 'bupr_item_type_label', _n( 'review', 'reviews', (int) $review_count, 'bp-member-reviews' ), (int) $review_count ); 177 177 178 178 $aggregate_rating = round( $aggregate_rating, 2 ); … … 180 180 181 181 if ( $show_stars ) { 182 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>'; 182 183 /* translators: %1$s: rating; %2$s: review count; %3$s: item type label */ 183 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';184 184 $output .= apply_filters( 'bupr_shortcode_rating_text', sprintf( esc_html__( 'Rating: %1$s/5 (%2$s %3$s)', 'bp-member-reviews' ), esc_html( $aggregate_rating ), $review_count_link, esc_html( $item_label ) ), $user_id, $aggregate_rating, $review_count ); 185 185 } else { 186 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>'; 186 187 /* translators: %1$s: review count; %2$s: item type label */ 187 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';188 188 $output .= apply_filters( 'bupr_shortcode_count_text', sprintf( esc_html__( '%1$s %2$s', 'bp-member-reviews' ), $review_count_link, esc_html( $item_label ) ), $user_id, $review_count ); 189 189 } … … 275 275 $member_args = array( 276 276 'post_type' => 'review', 277 'posts_per_page' => -1, 277 // Only this author's own review of the member is needed. 278 'posts_per_page' => 1, 279 'no_found_rows' => true, 278 280 'post_status' => array( 279 281 'draft', … … 409 411 <?php 410 412 foreach ( $bupr_member as $user ) { 411 if ( is_array( $bupr['add_taken_members'] ) && ! empty( $bupr['add_taken_members'] ) && isset( $user['member_roles'][0] ) && in_array( $user['member_roles'][0], $bupr['add_taken_members'], true) ) {413 if ( bupr_roles_allow_review( get_current_user_id(), $user['member_id'] ) ) { 412 414 echo '<option value="' . esc_attr( $user['member_id'] ) . '">' . esc_attr( $user['member_name'] ) . '</option>'; 413 415 } -
bp-user-profile-reviews/trunk/includes/class-buprglobals.php
r3617176 r3736444 80 80 $enable_flagging = $bupr_general_settings['bupr_enable_flagging'] ?? 'yes'; // Default to 'yes'. 81 81 $flag_threshold = $bupr_general_settings['bupr_flag_threshold'] ?? 5; // Default to 5. 82 $flag_threshold = is_numeric( $flag_threshold ) ? $flag_threshold : 5; // A blank save must not disable auto-hide. 82 83 83 84 /** -
bp-user-profile-reviews/trunk/includes/templates/bupr-reviews-tab-template.php
r3617176 r3736444 295 295 </div> 296 296 </div> 297 <?php 298 // Owner Reply Section - only show if enabled in settings. 299 $owner_replies_enabled = isset( $bupr['enable_owner_replies'] ) ? $bupr['enable_owner_replies'] : 'yes'; 300 if ( 'yes' === $owner_replies_enabled ) : 301 $owner_reply = get_post_meta( get_the_ID(), 'bupr_owner_reply', true ); 302 $owner_reply_date = get_post_meta( get_the_ID(), 'bupr_owner_reply_date', true ); 303 $linked_member_id = get_post_meta( get_the_ID(), 'linked_bp_member', true ); 304 $current_user_id = get_current_user_id(); 305 $can_reply = ( (int) $linked_member_id === $current_user_id ) && empty( $owner_reply ); 306 ?> 307 <div class="bupr-reply-section" data-review="<?php echo esc_attr( get_the_ID() ); ?>"> 308 <?php if ( ! empty( $owner_reply ) ) : ?> 309 <?php 310 $owner_data = get_userdata( $linked_member_id ); 311 $owner_name = $owner_data ? $owner_data->display_name : __( 'Profile Owner', 'bp-member-reviews' ); 312 $owner_avatar = bp_core_fetch_avatar( 313 array( 314 'item_id' => $linked_member_id, 315 'object' => 'user', 316 'html' => false, 317 ) 318 ); 319 ?> 320 <div class="bupr-owner-reply"> 321 <div class="bupr-reply-header"> 322 <img src="<?php echo esc_url( $owner_avatar ); ?>" class="avatar avatar-32" alt="<?php echo esc_attr( $owner_name ); ?>" width="32" height="32"> 323 <span class="bupr-reply-author"><?php echo esc_html( $owner_name ); ?></span> 324 <span class="bupr-reply-badge"><?php esc_html_e( 'Owner Response', 'bp-member-reviews' ); ?></span> 325 <?php if ( $owner_reply_date ) : ?> 326 <span class="bupr-reply-date"><?php echo esc_html( date_i18n( get_option( 'date_format' ), $owner_reply_date ) ); ?></span> 327 <?php endif; ?> 328 </div> 329 <div class="bupr-reply-content"><?php echo wp_kses_post( wpautop( $owner_reply ) ); ?></div> 330 </div> 331 <?php elseif ( $can_reply ) : ?> 332 <div class="bupr-reply-form-wrapper"> 333 <button type="button" class="bupr-show-reply-form button" data-review="<?php echo esc_attr( get_the_ID() ); ?>"> 334 <?php esc_html_e( 'Reply to this review', 'bp-member-reviews' ); ?> 335 </button> 336 <div class="bupr-reply-form" style="display: none;"> 337 <textarea class="bupr-reply-textarea" rows="3" placeholder="<?php esc_attr_e( 'Write your response...', 'bp-member-reviews' ); ?>"></textarea> 338 <div class="bupr-reply-actions"> 339 <button type="button" class="bupr-submit-reply button" data-review="<?php echo esc_attr( get_the_ID() ); ?>"> 340 <?php esc_html_e( 'Submit Reply', 'bp-member-reviews' ); ?> 341 </button> 342 <button type="button" class="bupr-cancel-reply button"> 343 <?php esc_html_e( 'Cancel', 'bp-member-reviews' ); ?> 344 </button> 345 <span class="bupr-reply-spinner" style="display: none;"></span> 346 </div> 347 </div> 348 </div> 349 <?php endif; ?> 350 </div> 351 <?php endif; // End owner replies enabled check. ?> 297 <?php bupr_get_template( 'bupr-owner-reply.php', array( 'review_id' => get_the_ID() ) ); ?> 352 298 </div> 353 299 … … 358 304 ?> 359 305 <div class="bupr-report-section"> 306 <?php 307 // A member who already reported this review sees that, not a button that fails. 308 $bupr_flags = get_post_meta( get_the_ID(), 'bupr_flags', true ); 309 $bupr_reporter_ids = is_array( $bupr_flags ) ? array_map( 'intval', wp_list_pluck( $bupr_flags, 'reporter_id' ) ) : array(); 310 if ( in_array( get_current_user_id(), $bupr_reporter_ids, true ) ) : 311 ?> 312 <span class="bupr-report-success"><span class="dashicons dashicons-yes" aria-hidden="true"></span> <?php esc_html_e( 'Reported', 'bp-member-reviews' ); ?></span> 313 <?php else : ?> 360 314 <button type="button" class="bupr-report-button" data-review="<?php echo esc_attr( get_the_ID() ); ?>" title="<?php esc_attr_e( 'Report this review', 'bp-member-reviews' ); ?>"> 361 315 <span class="dashicons dashicons-warning"></span> 362 316 <span class="bupr-report-text"><?php esc_html_e( 'Report', 'bp-member-reviews' ); ?></span> 363 317 </button> 318 <?php endif; ?> 364 319 </div> 365 320 <?php endif; // End flagging enabled check. ?> -
bp-user-profile-reviews/trunk/includes/templates/bupr-single-review-template.php
r3617176 r3736444 20 20 21 21 // Bail if review doesn't exist or is not a review post type. 22 if ( ! $review || 'review' !== $review->post_type ) { 22 // Pending and report-hidden reviews are visible only to their author and moderators, 23 // and a review is only shown on the profile of the member it was written about. 24 $bupr_can_see = $review && 'review' === $review->post_type 25 && ( 'publish' === $review->post_status || get_current_user_id() === (int) $review->post_author || current_user_can( 'edit_others_posts' ) ) 26 && (int) get_post_meta( $review->ID, 'linked_bp_member', true ) === (int) bp_displayed_user_id(); 27 if ( ! $bupr_can_see ) { 23 28 echo '<p>' . esc_html__( 'Review not found.', 'bp-member-reviews' ) . '</p>'; 24 29 return; 25 30 } 26 27 $review_title = $review->post_title;28 $review_url = get_permalink( $review_id );29 31 30 32 $author = $review->post_author; … … 37 39 } 38 40 39 $review_author = $author_details->data->user_login;40 41 $author_id = $author_details->data->ID; 41 42 $member_profile = bp_core_get_userlink( $author_id ); 42 $review_author_url = home_url() . '/author/' . $review_author;43 43 $review_date_time = $review->post_date; 44 44 $review_date = date_i18n( 'M Y', $review_date_time ); … … 89 89 <div class="bupr-members-profiles"> 90 90 <div class="author"> 91 <img src="<?php echo esc_url( $avatar ); ?>" class="avatar user-<?php echo esc_attr( $author ); ?>-avatar avatar-128 photo" alt="Profile photo of <?php echo esc_attr( $review_author ); ?>" width="50" height="50"> 91 <?php if ( 'yes' === $anonymous_post_review ) : ?> 92 <img src="<?php echo esc_url( $avatar ); ?>" class="avatar avatar-128 photo" alt="<?php esc_attr_e( 'Profile Photo', 'bp-member-reviews' ); ?>" width="50" height="50"> 93 <?php else : ?> 94 <img src="<?php echo esc_url( $avatar ); ?>" class="avatar user-<?php echo esc_attr( $author ); ?>-avatar avatar-128 photo" alt="<?php echo esc_attr( sprintf( /* translators: %s: reviewer display name. */ __( 'Profile photo of %s', 'bp-member-reviews' ), $author_details->display_name ) ); ?>" width="50" height="50"> 95 <?php endif; ?> 92 96 <div class="reviewer"> 93 97 <h4> … … 245 249 </div> 246 250 </div> 251 <?php bupr_get_template( 'bupr-owner-reply.php', array( 'review_id' => $review_id ) ); ?> 247 252 </article> 248 253 </div> -
bp-user-profile-reviews/trunk/includes/widgets/display-review.php
r3617176 r3736444 85 85 WHERE um1.meta_key = 'bupr_aggregate_rating' 86 86 AND um2.meta_key = 'bupr_review_count' 87 AND CAST(um2.meta_value AS UNSIGNED) > 0 87 88 ORDER BY CAST(um1.meta_value AS DECIMAL(10,2)) DESC 88 89 LIMIT %d … … 101 102 WHERE um1.meta_key = 'bupr_aggregate_rating' 102 103 AND um2.meta_key = 'bupr_review_count' 104 AND CAST(um2.meta_value AS UNSIGNED) > 0 103 105 ORDER BY CAST(um2.meta_value AS UNSIGNED) DESC 104 106 LIMIT %d … … 143 145 * @since 3.8.0 144 146 * @param string $label The item type label. Default 'reviews'. 147 * @param int $count Review count, for choosing singular or plural (since 3.8.1). 145 148 */ 146 $item_label = apply_filters( 'bupr_item_type_label', _ _( 'reviews', 'bp-member-reviews' ));149 $item_label = apply_filters( 'bupr_item_type_label', _n( 'review', 'reviews', (int) $review_count, 'bp-member-reviews' ), (int) $review_count ); 147 150 148 151 if ( $show_stars ) { -
bp-user-profile-reviews/trunk/includes/widgets/member-rating.php
r3617176 r3736444 120 120 $bupr_user_count = 0; 121 121 foreach ( $final_review_arr as $bupr_key => $bupr_value ) { 122 if ( $bupr_user_count === $rating_limit ) {122 if ( (int) $rating_limit > 0 && $bupr_user_count >= (int) $rating_limit ) { // Saved as a string; blank or 0 means no limit. 123 123 break; 124 124 } else { … … 128 128 129 129 echo '<li class="vcard"><div class="item-avatar">'; 130 echo get_avatar( $author_id, 50 ); 130 // An anonymous review gets the default avatar, never the reviewer's own. 131 echo get_avatar( 'yes' === $user_anonymous_review ? 0 : $author_id, 50 ); 131 132 echo '</div><div class="item"><div class="item-title">'; 132 133 echo ( 'yes' !== $user_anonymous_review ) ? wp_kses_post( $members_profile ) : esc_html__( 'Anonymous', 'bp-member-reviews' ); -
bp-user-profile-reviews/trunk/languages/bp-member-reviews.pot
r3617176 r3736444 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Wbcom Designs - BuddyPress Member Reviews 3.8. 0\n"5 "Project-Id-Version: Wbcom Designs - BuddyPress Member Reviews 3.8.1\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/buddypress-member-review\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026- 07-21T10:46:16+00:00\n"12 "POT-Creation-Date: 2026-10-07T12:47:46+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 40 40 msgstr "" 41 41 42 #: admin/bupr-admin.php:7 543 #: includes/widgets/member-rating.php:20 842 #: admin/bupr-admin.php:76 43 #: includes/widgets/member-rating.php:209 44 44 msgid "Member Ratings" 45 45 msgstr "" 46 46 47 #: admin/bupr-admin.php:193 47 #: admin/bupr-admin.php:194 48 #: admin/bupr-admin.php:196 49 #: admin/bupr-admin.php:197 50 #: admin/tab-templates/bupr-setting-general-tab.php:275 51 #: includes/bupr-general-functions.php:127 52 #: includes/class-buprglobals.php:88 53 msgid "Reviews" 54 msgstr "" 55 48 56 #: admin/bupr-admin.php:195 49 #: admin/bupr-admin.php:196 50 #: admin/tab-templates/bupr-setting-general-tab.php:277 51 #: includes/bupr-general-functions.php:127 57 #: includes/bupr-general-functions.php:114 58 #: includes/bupr-notification.php:61 52 59 #: includes/class-buprglobals.php:87 53 msgid "Reviews"54 msgstr ""55 56 #: admin/bupr-admin.php:19457 #: includes/bupr-filters.php:77258 #: includes/bupr-general-functions.php:11459 #: includes/class-buprglobals.php:8660 60 msgid "Review" 61 61 msgstr "" 62 62 63 #: admin/bupr-admin.php:19764 63 #: admin/bupr-admin.php:198 64 #: admin/bupr-admin.php:199 65 65 msgid "Add New Review" 66 66 msgstr "" 67 67 68 #: admin/bupr-admin.php: 19968 #: admin/bupr-admin.php:200 69 69 msgid "New Review" 70 70 msgstr "" 71 71 72 #: admin/bupr-admin.php:20 072 #: admin/bupr-admin.php:201 73 73 msgid "View Reviews" 74 74 msgstr "" 75 75 76 #: admin/bupr-admin.php:20 176 #: admin/bupr-admin.php:202 77 77 msgid "All Reviews" 78 78 msgstr "" 79 79 80 #: admin/bupr-admin.php:20 280 #: admin/bupr-admin.php:203 81 81 msgid "Search Reviews" 82 82 msgstr "" 83 83 84 #: admin/bupr-admin.php:20 384 #: admin/bupr-admin.php:204 85 85 msgid "Parent Review:" 86 86 msgstr "" 87 87 88 #: admin/bupr-admin.php:20 488 #: admin/bupr-admin.php:205 89 89 msgid "No Review Found" 90 90 msgstr "" 91 91 92 #: admin/bupr-admin.php:20 592 #: admin/bupr-admin.php:206 93 93 msgid "No Review Found In Trash" 94 94 msgstr "" 95 95 96 #: admin/bupr-admin.php:3 0196 #: admin/bupr-admin.php:335 97 97 msgctxt "taxonomy general name" 98 98 msgid "Reviews Category" 99 99 msgstr "" 100 100 101 #: admin/bupr-admin.php:3 02101 #: admin/bupr-admin.php:336 102 102 msgctxt "taxonomy singular name" 103 103 msgid "Review Category" 104 104 msgstr "" 105 105 106 #: admin/bupr-admin.php:3 03106 #: admin/bupr-admin.php:337 107 107 msgid "Search Categories" 108 108 msgstr "" 109 109 110 #: admin/bupr-admin.php:3 04110 #: admin/bupr-admin.php:338 111 111 msgid "All Categories" 112 112 msgstr "" 113 113 114 #: admin/bupr-admin.php:3 05114 #: admin/bupr-admin.php:339 115 115 msgid "Parent Category" 116 116 msgstr "" 117 117 118 #: admin/bupr-admin.php:3 06118 #: admin/bupr-admin.php:340 119 119 msgid "Parent Category:" 120 120 msgstr "" 121 121 122 #: admin/bupr-admin.php:3 07122 #: admin/bupr-admin.php:341 123 123 msgid "Edit Category" 124 124 msgstr "" 125 125 126 #: admin/bupr-admin.php:3 08126 #: admin/bupr-admin.php:342 127 127 msgid "Update Category" 128 128 msgstr "" 129 129 130 #: admin/bupr-admin.php:3 09130 #: admin/bupr-admin.php:343 131 131 msgid "Add Category" 132 132 msgstr "" 133 133 134 #: admin/bupr-admin.php:3 10134 #: admin/bupr-admin.php:344 135 135 msgid "New Category Name" 136 136 msgstr "" 137 137 138 #: admin/bupr-admin.php:3 11138 #: admin/bupr-admin.php:345 139 139 msgid "Category" 140 140 msgstr "" 141 141 142 #: admin/bupr-admin.php: 360143 #: includes/bupr-ajax.php:2 28144 #: includes/bupr-filters.php: 1067145 #: includes/bupr-filters.php: 1166146 #: includes/bupr-notification.php: 65142 #: admin/bupr-admin.php:408 143 #: includes/bupr-ajax.php:233 144 #: includes/bupr-filters.php:781 145 #: includes/bupr-filters.php:887 146 #: includes/bupr-notification.php:97 147 147 msgid "An anonymous user" 148 148 msgstr "" … … 150 150 #. translators: 1: User display name, 2: Review tab name (singular). 151 151 #. translators: 1: Reviewed member's display name. 2: Singular review label (e.g. "review"). 152 #: admin/bupr-admin.php: 366153 #: includes/bupr-ajax.php:23 4154 #: includes/bupr-ajax.php:4 11155 #: includes/bupr-scripts.php: 195152 #: admin/bupr-admin.php:414 153 #: includes/bupr-ajax.php:239 154 #: includes/bupr-ajax.php:421 155 #: includes/bupr-scripts.php:200 156 156 #, php-format 157 157 msgid "%1$s received a %2$s" 158 158 msgstr "" 159 159 160 #: admin/bupr-admin.php: 382161 #: includes/bupr-ajax.php:4 20160 #: admin/bupr-admin.php:422 161 #: includes/bupr-ajax.php:430 162 162 msgid "New Review on Your Profile at [site-name]" 163 163 msgstr "" 164 164 165 165 #. translators: [user-name], [reviewer-name], [review-link] and [site-name] are tokens replaced at send time - keep them verbatim. 166 #: admin/bupr-admin.php: 393167 #: includes/bupr-ajax.php:4 26166 #: admin/bupr-admin.php:433 167 #: includes/bupr-ajax.php:436 168 168 msgid "Hello [user-name], <br><br>We are pleased to inform you that [reviewer-name] has recently reviewed your profile.<br><br>To view the review, simply click on the link below:<br>[review-link]<br><br>Best regards,<br>The [site-name] Team" 169 169 msgstr "" 170 170 171 #: admin/bupr-admin.php:4 53172 #: admin/tab-templates/bupr-setting-general-tab.php:4 20171 #: admin/bupr-admin.php:493 172 #: admin/tab-templates/bupr-setting-general-tab.php:418 173 173 msgid "Reports" 174 174 msgstr "" 175 175 176 #: admin/bupr-admin.php: 482177 #: admin/bupr-admin.php:6 21176 #: admin/bupr-admin.php:522 177 #: admin/bupr-admin.php:688 178 178 msgid "Resolved" 179 179 msgstr "" 180 180 181 #: admin/bupr-admin.php: 484182 #: admin/bupr-admin.php:6 24181 #: admin/bupr-admin.php:524 182 #: admin/bupr-admin.php:691 183 183 msgid "Dismissed" 184 184 msgstr "" 185 185 186 #: admin/bupr-admin.php:491 186 #. translators: %s: date and time the review was hidden. 187 #: admin/bupr-admin.php:533 188 #, php-format 189 msgid "Hidden on %s" 190 msgstr "" 191 192 #: admin/bupr-admin.php:534 193 #: admin/bupr-admin.php:594 194 msgid "Auto-hidden" 195 msgstr "" 196 197 #: admin/bupr-admin.php:542 187 198 msgid "report" 188 199 msgid_plural "reports" … … 190 201 msgstr[1] "" 191 202 192 #: admin/bupr-admin.php:521 193 #: includes/admin/views/overview.php:105 194 #: includes/bupr-scripts.php:200 203 #: admin/bupr-admin.php:572 204 #: includes/admin/views/overview.php:94 205 #: includes/bupr-scripts.php:205 206 #: includes/templates/bupr-reviews-tab-template.php:312 195 207 msgid "Reported" 196 208 msgstr "" 197 209 198 #: admin/bupr-admin.php: 590210 #: admin/bupr-admin.php:657 199 211 msgid "Report Details" 200 212 msgstr "" 201 213 202 #: admin/bupr-admin.php:6 10214 #: admin/bupr-admin.php:677 203 215 msgid "No reports for this review." 204 216 msgstr "" 205 217 206 #: admin/bupr-admin.php:6 15218 #: admin/bupr-admin.php:682 207 219 msgid "Status:" 208 220 msgstr "" 209 221 210 #: admin/bupr-admin.php:6 18222 #: admin/bupr-admin.php:685 211 223 msgid "Pending Review" 212 224 msgstr "" 213 225 214 #: admin/bupr-admin.php:6 27226 #: admin/bupr-admin.php:694 215 227 msgid "None" 216 228 msgstr "" 217 229 218 #: admin/bupr-admin.php:6 31230 #: admin/bupr-admin.php:698 219 231 msgid "Total Reports:" 220 232 msgstr "" 221 233 222 #: admin/bupr-admin.php: 636234 #: admin/bupr-admin.php:703 223 235 msgid "Unknown" 224 236 msgstr "" 225 237 226 #: admin/bupr-admin.php: 641238 #: admin/bupr-admin.php:708 227 239 msgid "By:" 228 240 msgstr "" 229 241 230 #: admin/bupr-admin.php: 671231 #: admin/bupr-admin.php: 687242 #: admin/bupr-admin.php:738 243 #: admin/bupr-admin.php:754 232 244 msgid "Dismiss Reports" 233 245 msgstr "" 234 246 235 #: admin/bupr-admin.php: 672247 #: admin/bupr-admin.php:739 236 248 msgid "Mark Resolved" 237 249 msgstr "" 238 250 239 #: admin/bupr-admin.php: 688251 #: admin/bupr-admin.php:755 240 252 msgid "Resolve Reports" 241 253 msgstr "" 242 254 243 255 #. translators: %d: Number of reviews updated 244 #: admin/bupr-admin.php: 734256 #: admin/bupr-admin.php:805 245 257 #, php-format 246 258 msgid "%d review report status updated." … … 249 261 msgstr[1] "" 250 262 251 #: admin/bupr-admin.php: 745263 #: admin/bupr-admin.php:816 252 264 msgid "Review reports have been dismissed." 253 265 msgstr "" 254 266 255 #: admin/bupr-admin.php: 754267 #: admin/bupr-admin.php:825 256 268 msgid "Review reports have been marked as resolved." 257 269 msgstr "" 258 270 259 #: admin/bupr-admin.php: 769260 #: admin/bupr-admin.php: 810271 #: admin/bupr-admin.php:870 272 #: admin/bupr-admin.php:911 261 273 msgid "Security check failed." 262 274 msgstr "" 263 275 264 #: admin/bupr-admin.php: 774265 #: admin/bupr-admin.php: 815276 #: admin/bupr-admin.php:876 277 #: admin/bupr-admin.php:917 266 278 msgid "You do not have permission to perform this action." 267 279 msgstr "" 268 280 269 #: admin/bupr-admin.php: 780270 #: admin/bupr-admin.php: 821281 #: admin/bupr-admin.php:882 282 #: admin/bupr-admin.php:923 271 283 msgid "Invalid review." 272 284 msgstr "" … … 353 365 354 366 #: admin/tab-templates/bupr-setting-criteria-tab.php:31 355 #: admin/tab-templates/bupr-setting-criteria-tab.php:7 9367 #: admin/tab-templates/bupr-setting-criteria-tab.php:78 356 368 msgid "Review Criteria" 357 369 msgstr "" … … 361 373 msgstr "" 362 374 363 #. translators: 1: Current mode label, 2: Link to Add-ons tab375 #. translators: %s: Current mode label 364 376 #: admin/tab-templates/bupr-setting-criteria-tab.php:43 365 377 #, php-format 366 msgid "Rating criteria are only used in Star Ratings mode. You are currently using %1$s mode. To manage criteria, switch to Star Ratings mode in the %2$s tab." 367 msgstr "" 368 369 #: admin/tab-templates/bupr-setting-criteria-tab.php:45 370 msgid "Add-ons" 371 msgstr "" 372 373 #: admin/tab-templates/bupr-setting-criteria-tab.php:87 378 msgid "Rating criteria are only used in Star Ratings mode. You are currently using %s mode. To manage criteria, switch to Star Ratings mode in the Member Reviews Pro settings." 379 msgstr "" 380 381 #: admin/tab-templates/bupr-setting-criteria-tab.php:86 374 382 msgid "Multiple Criteria" 375 383 msgstr "" 376 384 377 #: admin/tab-templates/bupr-setting-criteria-tab.php:8 9385 #: admin/tab-templates/bupr-setting-criteria-tab.php:88 378 386 msgid "Rate members by multiple criteria (e.g., Communication, Skills) instead of a single overall rating." 379 387 msgstr "" 380 388 381 #: admin/tab-templates/bupr-setting-criteria-tab.php:11 4382 #: includes/bupr-scripts.php:2 69389 #: admin/tab-templates/bupr-setting-criteria-tab.php:113 390 #: includes/bupr-scripts.php:274 383 391 msgid "Review criteria name" 384 392 msgstr "" 385 393 386 #: admin/tab-templates/bupr-setting-criteria-tab.php:119 387 msgid "Delete" 388 msgstr "" 389 390 #: admin/tab-templates/bupr-setting-criteria-tab.php:119 391 msgid "Delete this review criteria" 394 #: admin/tab-templates/bupr-setting-criteria-tab.php:118 395 #: includes/bupr-scripts.php:275 396 msgid "Remove" 397 msgstr "" 398 399 #: admin/tab-templates/bupr-setting-criteria-tab.php:118 400 #: includes/bupr-scripts.php:276 401 msgid "Remove this review criteria" 402 msgstr "" 403 404 #: admin/tab-templates/bupr-setting-criteria-tab.php:132 405 msgid "Add Criteria" 406 msgstr "" 407 408 #: admin/tab-templates/bupr-setting-criteria-tab.php:132 409 msgid "Add a new review criteria" 392 410 msgstr "" 393 411 394 412 #: admin/tab-templates/bupr-setting-criteria-tab.php:133 395 msgid "Add Criteria" 396 msgstr "" 397 398 #: admin/tab-templates/bupr-setting-criteria-tab.php:133 399 msgid "Add a new review criteria" 400 msgstr "" 401 402 #: admin/tab-templates/bupr-setting-criteria-tab.php:134 403 msgid "This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them." 413 msgid "This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them. With no criteria, reviews are text only and have no stars." 404 414 msgstr "" 405 415 … … 408 418 msgstr "" 409 419 410 #: admin/tab-templates/bupr-setting-display-tab.php:18 411 msgid "Note" 412 msgstr "" 413 414 #: admin/tab-templates/bupr-setting-display-tab.php:19 415 msgid "This setting is applicable only if you have added a criterion for review." 420 #: admin/tab-templates/bupr-setting-display-tab.php:28 421 msgid "Review Label" 416 422 msgstr "" 417 423 418 424 #: admin/tab-templates/bupr-setting-display-tab.php:31 419 msgid "Review Label"420 msgstr ""421 422 #: admin/tab-templates/bupr-setting-display-tab.php:34423 425 msgid "Label used in the profile tab and review form." 424 426 msgstr "" 425 427 428 #: admin/tab-templates/bupr-setting-display-tab.php:41 429 msgid "Reviews Label (Plural)" 430 msgstr "" 431 426 432 #: admin/tab-templates/bupr-setting-display-tab.php:44 427 msgid "Reviews Label (Plural)"428 msgstr ""429 430 #: admin/tab-templates/bupr-setting-display-tab.php:47431 433 msgid "Plural form of the review label." 432 434 msgstr "" 433 435 434 #: admin/tab-templates/bupr-setting-display-tab.php:5 6436 #: admin/tab-templates/bupr-setting-display-tab.php:53 435 437 msgid "Colors" 436 438 msgstr "" 437 439 440 #: admin/tab-templates/bupr-setting-display-tab.php:59 441 msgid "Rating Color" 442 msgstr "" 443 438 444 #: admin/tab-templates/bupr-setting-display-tab.php:62 439 msgid "Rating Color"440 msgstr ""441 442 #: admin/tab-templates/bupr-setting-display-tab.php:65443 445 msgid "This option allows you to change the star rating color." 444 446 msgstr "" … … 485 487 #. translators: [site-name] is a token replaced at send time - keep it verbatim. 486 488 #: admin/tab-templates/bupr-setting-general-tab.php:54 487 #: includes/bupr-ajax.php:4 50489 #: includes/bupr-ajax.php:460 488 490 msgid "A New Review Requires Your Approval on [site-name]" 489 491 msgstr "" 490 492 491 493 #: admin/tab-templates/bupr-setting-general-tab.php:63 492 #: includes/admin/views/overview.php: 194494 #: includes/admin/views/overview.php:212 493 495 msgid "General Settings" 494 496 msgstr "" … … 510 512 msgstr "" 511 513 512 #: admin/tab-templates/bupr-setting-general-tab.php:10 5514 #: admin/tab-templates/bupr-setting-general-tab.php:106 513 515 msgid "Auto Approve Reviews" 514 516 msgstr "" 515 517 516 #: admin/tab-templates/bupr-setting-general-tab.php:10 8518 #: admin/tab-templates/bupr-setting-general-tab.php:109 517 519 msgid "Automatically approve reviews without requiring manual approval." 518 520 msgstr "" 519 521 520 #: admin/tab-templates/bupr-setting-general-tab.php:12 4522 #: admin/tab-templates/bupr-setting-general-tab.php:125 521 523 msgid "Member Directory Ratings" 522 524 msgstr "" 523 525 524 #: admin/tab-templates/bupr-setting-general-tab.php:12 7526 #: admin/tab-templates/bupr-setting-general-tab.php:128 525 527 msgid "Display member ratings on the member directory page." 526 528 msgstr "" 527 529 528 #: admin/tab-templates/bupr-setting-general-tab.php:14 3530 #: admin/tab-templates/bupr-setting-general-tab.php:144 529 531 msgid "Email Notifications" 530 532 msgstr "" 531 533 532 #: admin/tab-templates/bupr-setting-general-tab.php:14 6534 #: admin/tab-templates/bupr-setting-general-tab.php:147 533 535 msgid "Send an email notification to members when someone reviews their profile." 534 536 msgstr "" 535 537 536 #: admin/tab-templates/bupr-setting-general-tab.php:16 2538 #: admin/tab-templates/bupr-setting-general-tab.php:163 537 539 msgid "Email Subject" 538 540 msgstr "" 539 541 540 #: admin/tab-templates/bupr-setting-general-tab.php:16 4542 #: admin/tab-templates/bupr-setting-general-tab.php:165 541 543 msgid "Enter the subject line for review notification emails." 542 544 msgstr "" 543 545 544 #: admin/tab-templates/bupr-setting-general-tab.php:16 7546 #: admin/tab-templates/bupr-setting-general-tab.php:168 545 547 msgid "Please enter review email subject." 546 548 msgstr "" 547 549 548 #: admin/tab-templates/bupr-setting-general-tab.php:17 3550 #: admin/tab-templates/bupr-setting-general-tab.php:174 549 551 msgid "Email Message" 550 552 msgstr "" 551 553 552 #: admin/tab-templates/bupr-setting-general-tab.php:17 5554 #: admin/tab-templates/bupr-setting-general-tab.php:176 553 555 msgid "Enter the message content for review notification emails." 554 556 msgstr "" 555 557 556 #: admin/tab-templates/bupr-setting-general-tab.php:19 8558 #: admin/tab-templates/bupr-setting-general-tab.php:199 557 559 msgid "Approval Email Subject" 558 560 msgstr "" 559 561 560 #: admin/tab-templates/bupr-setting-general-tab.php:20 0562 #: admin/tab-templates/bupr-setting-general-tab.php:201 561 563 msgid "Enter the subject line for review approval notification emails." 562 564 msgstr "" 563 565 564 #: admin/tab-templates/bupr-setting-general-tab.php:20 3566 #: admin/tab-templates/bupr-setting-general-tab.php:204 565 567 msgid "Please enter review approval email subject." 566 568 msgstr "" 567 569 568 #: admin/tab-templates/bupr-setting-general-tab.php:2 09570 #: admin/tab-templates/bupr-setting-general-tab.php:210 569 571 msgid "Approval Email Message" 570 572 msgstr "" 571 573 572 #: admin/tab-templates/bupr-setting-general-tab.php:21 1574 #: admin/tab-templates/bupr-setting-general-tab.php:212 573 575 msgid "Enter the message content for review approval notification emails." 574 576 msgstr "" 575 577 576 #: admin/tab-templates/bupr-setting-general-tab.php:23 3578 #: admin/tab-templates/bupr-setting-general-tab.php:231 577 579 msgid "BuddyPress Notifications" 578 580 msgstr "" 579 581 580 #: admin/tab-templates/bupr-setting-general-tab.php:23 6582 #: admin/tab-templates/bupr-setting-general-tab.php:234 581 583 msgid "Notify members through BuddyPress when they receive a new review." 582 584 msgstr "" 583 585 584 #: admin/tab-templates/bupr-setting-general-tab.php:25 2586 #: admin/tab-templates/bupr-setting-general-tab.php:250 585 587 msgid "Update Review" 586 588 msgstr "" 587 589 588 #: admin/tab-templates/bupr-setting-general-tab.php:25 5590 #: admin/tab-templates/bupr-setting-general-tab.php:253 589 591 msgid "Allow members to update or modify their reviews." 590 592 msgstr "" 591 593 594 #: admin/tab-templates/bupr-setting-general-tab.php:269 595 msgid "Reviews Per Page" 596 msgstr "" 597 592 598 #: admin/tab-templates/bupr-setting-general-tab.php:271 593 msgid "Reviews Per Page"594 msgstr ""595 596 #: admin/tab-templates/bupr-setting-general-tab.php:273597 599 msgid "Number of reviews to display per page." 598 600 msgstr "" 599 601 602 #: admin/tab-templates/bupr-setting-general-tab.php:281 603 msgid "Reviewer Roles" 604 msgstr "" 605 600 606 #: admin/tab-templates/bupr-setting-general-tab.php:283 601 msgid " Reviewer Roles"602 msgstr "" 603 604 #: admin/tab-templates/bupr-setting-general-tab.php: 285605 msgid " Select user roles that can submit reviews."607 msgid "Select user roles that can submit reviews. A member with any of the selected roles can. An empty list allows every role." 608 msgstr "" 609 610 #: admin/tab-templates/bupr-setting-general-tab.php:314 611 msgid "Reviewee Roles" 606 612 msgstr "" 607 613 608 614 #: admin/tab-templates/bupr-setting-general-tab.php:316 609 msgid " Reviewee Roles"610 msgstr "" 611 612 #: admin/tab-templates/bupr-setting-general-tab.php:3 18613 msgid " Select user roles that can receive reviews."615 msgid "Select user roles that can receive reviews. A member with any of the selected roles can. An empty list allows every role." 616 msgstr "" 617 618 #: admin/tab-templates/bupr-setting-general-tab.php:349 619 msgid "Anonymous Reviews" 614 620 msgstr "" 615 621 616 622 #: admin/tab-templates/bupr-setting-general-tab.php:351 617 msgid "Anonymous Reviews"618 msgstr ""619 620 #: admin/tab-templates/bupr-setting-general-tab.php:353621 623 msgid "Allow users to submit reviews anonymously." 622 624 msgstr "" 623 625 626 #: admin/tab-templates/bupr-setting-general-tab.php:363 627 msgid "Activity Stream" 628 msgstr "" 629 624 630 #: admin/tab-templates/bupr-setting-general-tab.php:365 625 msgid "Activity Stream"626 msgstr ""627 628 #: admin/tab-templates/bupr-setting-general-tab.php:367629 631 msgid "Post reviews to the BuddyPress activity stream." 630 632 msgstr "" 631 633 634 #: admin/tab-templates/bupr-setting-general-tab.php:379 635 msgid "Owner Replies" 636 msgstr "" 637 632 638 #: admin/tab-templates/bupr-setting-general-tab.php:381 633 msgid "Owner Replies"634 msgstr ""635 636 #: admin/tab-templates/bupr-setting-general-tab.php:383637 639 msgid "Allow profile owners to respond once to each review they receive." 638 640 msgstr "" 639 641 642 #: admin/tab-templates/bupr-setting-general-tab.php:396 643 msgid "Review Reporting" 644 msgstr "" 645 640 646 #: admin/tab-templates/bupr-setting-general-tab.php:398 641 msgid "Review Reporting"642 msgstr ""643 644 #: admin/tab-templates/bupr-setting-general-tab.php:400645 647 msgid "Allow users to report inappropriate reviews for admin moderation." 646 648 msgstr "" 647 649 650 #: admin/tab-templates/bupr-setting-general-tab.php:412 651 msgid "Auto-Hide Threshold" 652 msgstr "" 653 648 654 #: admin/tab-templates/bupr-setting-general-tab.php:414 649 msgid "Auto-Hide Threshold"650 msgstr ""651 652 #: admin/tab-templates/bupr-setting-general-tab.php:416653 655 msgid "Automatically hide reviews after this many reports. Set to 0 to disable." 654 656 msgstr "" … … 726 728 msgstr "" 727 729 728 #: includes/admin/class-bupr-admin-panel.php: 386730 #: includes/admin/class-bupr-admin-panel.php:409 729 731 msgid "Settings saved." 730 732 msgstr "" 731 733 732 #: includes/admin/class-bupr-admin-panel.php: 387734 #: includes/admin/class-bupr-admin-panel.php:410 733 735 msgid "Are you sure? This cannot be undone." 734 736 msgstr "" 735 737 736 #: includes/admin/class-bupr-admin-panel.php: 388738 #: includes/admin/class-bupr-admin-panel.php:411 737 739 msgid "Continue" 738 740 msgstr "" 739 741 740 #: includes/admin/class-bupr-admin-panel.php: 389741 #: includes/templates/bupr- reviews-tab-template.php:343742 #: includes/templates/bupr-reviews-tab-template.php:4 52742 #: includes/admin/class-bupr-admin-panel.php:412 743 #: includes/templates/bupr-owner-reply.php:62 744 #: includes/templates/bupr-reviews-tab-template.php:407 743 745 msgid "Cancel" 744 746 msgstr "" … … 834 836 msgstr "" 835 837 836 #: includes/admin/views/overview.php: 73838 #: includes/admin/views/overview.php:62 837 839 msgid "Reported reviews need attention." 838 840 msgstr "" 839 841 840 842 #. translators: %d: number of reported reviews 841 #: includes/admin/views/overview.php: 78843 #: includes/admin/views/overview.php:67 842 844 #, php-format 843 845 msgid "%d review has been reported and is awaiting moderation." … … 846 848 msgstr[1] "" 847 849 848 #: includes/admin/views/overview.php: 83850 #: includes/admin/views/overview.php:72 849 851 msgid "Review now" 850 852 msgstr "" 851 853 852 #: includes/admin/views/overview.php: 90854 #: includes/admin/views/overview.php:79 853 855 msgid "Published Reviews" 854 856 msgstr "" 855 857 856 #: includes/admin/views/overview.php: 92858 #: includes/admin/views/overview.php:81 857 859 msgid "Live reviews across all profiles" 858 860 msgstr "" 859 861 860 #: includes/admin/views/overview.php: 95862 #: includes/admin/views/overview.php:84 861 863 msgid "Pending Approval" 862 864 msgstr "" 863 865 864 #: includes/admin/views/overview.php: 97866 #: includes/admin/views/overview.php:86 865 867 msgid "Drafts awaiting moderation" 866 868 msgstr "" 867 869 868 #: includes/admin/views/overview.php: 100870 #: includes/admin/views/overview.php:89 869 871 msgid "Members Reviewed" 870 872 msgstr "" 871 873 872 #: includes/admin/views/overview.php: 102874 #: includes/admin/views/overview.php:91 873 875 msgid "Profiles with at least one review" 874 876 msgstr "" 875 877 876 #: includes/admin/views/overview.php:107 878 #. translators: %d: number of reviews hidden by the report threshold 879 #: includes/admin/views/overview.php:113 880 #, php-format 881 msgid "%d hidden automatically" 882 msgid_plural "%d hidden automatically" 883 msgstr[0] "" 884 msgstr[1] "" 885 886 #: includes/admin/views/overview.php:119 877 887 msgid "Reviews flagged for moderation" 878 888 msgstr "" 879 889 880 #: includes/admin/views/overview.php:1 13890 #: includes/admin/views/overview.php:128 881 891 msgid "Current Configuration" 882 892 msgstr "" 883 893 884 #: includes/admin/views/overview.php:1 14894 #: includes/admin/views/overview.php:129 885 895 msgid "What happens right now when a member reviews someone on this site." 886 896 msgstr "" 887 897 888 #: includes/admin/views/overview.php:1 18898 #: includes/admin/views/overview.php:133 889 899 msgid "Review approval" 890 900 msgstr "" 891 901 892 #: includes/admin/views/overview.php:1 21902 #: includes/admin/views/overview.php:136 893 903 msgid "Automatic: reviews publish immediately" 894 904 msgstr "" 895 905 896 #: includes/admin/views/overview.php:1 23906 #: includes/admin/views/overview.php:138 897 907 msgid "Manual: reviews wait for admin approval" 898 908 msgstr "" 899 909 900 #: includes/admin/views/overview.php:1 28910 #: includes/admin/views/overview.php:143 901 911 msgid "Email notifications" 902 912 msgstr "" 903 913 904 #: includes/admin/views/overview.php:1 31914 #: includes/admin/views/overview.php:146 905 915 msgid "On: members are emailed about new reviews" 906 916 msgstr "" 907 917 908 #: includes/admin/views/overview.php:133 909 #: includes/admin/views/overview.php:144 910 #: includes/admin/views/overview.php:155 918 #: includes/admin/views/overview.php:148 919 #: includes/admin/views/overview.php:159 920 #: includes/admin/views/overview.php:170 921 #: includes/admin/views/overview.php:181 922 #: includes/admin/views/overview.php:192 923 msgid "Off" 924 msgstr "" 925 926 #: includes/admin/views/overview.php:149 927 #: includes/admin/views/overview.php:160 928 #: includes/admin/views/overview.php:171 929 #: includes/admin/views/overview.php:182 930 #: includes/admin/views/overview.php:193 931 msgid "Turn on" 932 msgstr "" 933 934 #: includes/admin/views/overview.php:154 935 msgid "BuddyPress notifications" 936 msgstr "" 937 938 #: includes/admin/views/overview.php:157 939 msgid "On: members get a notification for new reviews" 940 msgstr "" 941 911 942 #: includes/admin/views/overview.php:165 912 #: includes/admin/views/overview.php:175913 msgid "Off"914 msgstr ""915 916 #: includes/admin/views/overview.php:134917 #: includes/admin/views/overview.php:145918 msgid "Turn on"919 msgstr ""920 921 #: includes/admin/views/overview.php:139922 msgid "BuddyPress notifications"923 msgstr ""924 925 #: includes/admin/views/overview.php:142926 msgid "On: members get a notification for new reviews"927 msgstr ""928 929 #: includes/admin/views/overview.php:150930 943 msgid "Anonymous reviews" 931 944 msgstr "" 932 945 933 #: includes/admin/views/overview.php:1 53946 #: includes/admin/views/overview.php:168 934 947 msgid "On: members can review without revealing their identity" 935 948 msgstr "" 936 949 937 #: includes/admin/views/overview.php:1 60950 #: includes/admin/views/overview.php:176 938 951 msgid "Owner replies" 939 952 msgstr "" 940 953 941 #: includes/admin/views/overview.php:1 63954 #: includes/admin/views/overview.php:179 942 955 msgid "On: profile owners can reply once to each review" 943 956 msgstr "" 944 957 945 #: includes/admin/views/overview.php:1 70958 #: includes/admin/views/overview.php:187 946 959 msgid "Review reporting" 947 960 msgstr "" 948 961 949 #: includes/admin/views/overview.php:1 73962 #: includes/admin/views/overview.php:190 950 963 msgid "On: members can report inappropriate reviews" 951 964 msgstr "" 952 965 953 #: includes/admin/views/overview.php: 184966 #: includes/admin/views/overview.php:202 954 967 msgid "Quick Actions" 955 968 msgstr "" 956 969 957 #: includes/admin/views/overview.php: 190970 #: includes/admin/views/overview.php:208 958 971 msgid "Manage Reviews" 959 972 msgstr "" 960 973 961 #: includes/admin/views/overview.php: 198974 #: includes/admin/views/overview.php:216 962 975 msgid "Rating Criteria" 963 976 msgstr "" … … 1019 1032 msgstr "" 1020 1033 1021 #: includes/bupr-ajax.php:8 41022 #: includes/bupr-ajax.php:15 91023 #: includes/bupr-ajax.php:5 171024 #: includes/bupr-ajax.php: 6911025 #: includes/bupr-ajax.php:8 311026 #: includes/bupr-ajax.php:9 641034 #: includes/bupr-ajax.php:82 1035 #: includes/bupr-ajax.php:158 1036 #: includes/bupr-ajax.php:527 1037 #: includes/bupr-ajax.php:712 1038 #: includes/bupr-ajax.php:864 1039 #: includes/bupr-ajax.php:998 1027 1040 msgid "Security verification failed." 1028 1041 msgstr "" 1029 1042 1030 #: includes/bupr-ajax.php:9 41043 #: includes/bupr-ajax.php:93 1031 1044 msgid "You do not have permission to approve reviews." 1032 1045 msgstr "" 1033 1046 1034 #: includes/bupr-ajax.php:10 51035 #: includes/bupr-ajax.php:5 401036 #: includes/bupr-ajax.php:7 131037 #: includes/bupr-ajax.php:8 431038 #: includes/bupr-ajax.php: 9871047 #: includes/bupr-ajax.php:104 1048 #: includes/bupr-ajax.php:550 1049 #: includes/bupr-ajax.php:734 1050 #: includes/bupr-ajax.php:876 1051 #: includes/bupr-ajax.php:1021 1039 1052 msgid "Invalid review ID." 1040 1053 msgstr "" 1041 1054 1042 #: includes/bupr-ajax.php:11 61043 #: includes/bupr-ajax.php:5 521044 #: includes/bupr-ajax.php:7 251045 #: includes/bupr-ajax.php:8 551046 #: includes/bupr-ajax.php: 9991047 #: includes/templates/bupr-single-review-template.php:2 31055 #: includes/bupr-ajax.php:115 1056 #: includes/bupr-ajax.php:562 1057 #: includes/bupr-ajax.php:746 1058 #: includes/bupr-ajax.php:889 1059 #: includes/bupr-ajax.php:1033 1060 #: includes/templates/bupr-single-review-template.php:28 1048 1061 msgid "Review not found." 1049 1062 msgstr "" 1050 1063 1051 #: includes/bupr-ajax.php:14 31064 #: includes/bupr-ajax.php:142 1052 1065 msgid "Review approved successfully." 1053 1066 msgstr "" 1054 1067 1055 #: includes/bupr-ajax.php:16 91056 #: includes/bupr-ajax.php:5 281057 #: includes/bupr-ajax.php:7 011068 #: includes/bupr-ajax.php:168 1069 #: includes/bupr-ajax.php:538 1070 #: includes/bupr-ajax.php:722 1058 1071 msgid "Invalid request." 1059 1072 msgstr "" 1060 1073 1061 #: includes/bupr-ajax.php:19 81074 #: includes/bupr-ajax.php:197 1062 1075 msgid "You must be logged in to submit a review." 1063 1076 msgstr "" 1064 1077 1065 #: includes/bupr-ajax.php:2 111078 #: includes/bupr-ajax.php:209 1066 1079 msgid "Please select a member." 1067 1080 msgstr "" 1068 1081 1069 #: includes/bupr-ajax.php:21 71082 #: includes/bupr-ajax.php:215 1070 1083 msgid "You cannot review your own profile." 1071 1084 msgstr "" 1072 1085 1073 #: includes/bupr-ajax.php:22 41086 #: includes/bupr-ajax.php:222 1074 1087 msgid "Selected member does not exist." 1075 1088 msgstr "" 1076 1089 1077 #: includes/bupr-ajax.php:302 1090 #: includes/bupr-ajax.php:227 1091 msgid "You are not allowed to review this member." 1092 msgstr "" 1093 1094 #: includes/bupr-ajax.php:298 1095 msgid "Please rate every criterion or write a review." 1096 msgstr "" 1097 1098 #: includes/bupr-ajax.php:312 1078 1099 msgid "Error creating review. Please try again." 1079 1100 msgstr "" 1080 1101 1081 1102 #. translators: %s: Review label (e.g., "Review"). 1082 #: includes/bupr-ajax.php:3 481103 #: includes/bupr-ajax.php:358 1083 1104 #, php-format 1084 1105 msgid "Thank you for sharing your %s! After admin approval, it will be displayed on members' profiles." … … 1086 1107 1087 1108 #. translators: %s: Review label in lowercase (e.g., "review"). 1088 #: includes/bupr-ajax.php:3 561109 #: includes/bupr-ajax.php:366 1089 1110 #, php-format 1090 1111 msgid "Thank you for sharing your thoughts in this %s!" … … 1092 1113 1093 1114 #. translators: %s: 1094 #: includes/bupr-ajax.php:3 631095 #: includes/bupr-shortcodes.php:32 01115 #: includes/bupr-ajax.php:373 1116 #: includes/bupr-shortcodes.php:322 1096 1117 #, php-format 1097 1118 msgid "You already posted a %1$s for this member." … … 1099 1120 1100 1121 #. translators: %s: User name who submitted the review. 1101 #: includes/bupr-ajax.php:4 621122 #: includes/bupr-ajax.php:472 1102 1123 #, php-format 1103 1124 msgid "Review from %s" … … 1105 1126 1106 1127 #. translators: [site-admin], [site-name] and [review-aproval-link] are tokens replaced at send time - keep them verbatim. 1107 #: includes/bupr-ajax.php:4 671128 #: includes/bupr-ajax.php:477 1108 1129 msgid "" 1109 1130 "Hello [site-admin],\n" … … 1121 1142 msgstr "" 1122 1143 1123 #: includes/bupr-ajax.php:563 1124 #: includes/bupr-ajax.php:745 1144 #: includes/bupr-ajax.php:575 1145 #: includes/bupr-ajax.php:768 1146 msgid "Editing reviews is turned off on this site." 1147 msgstr "" 1148 1149 #: includes/bupr-ajax.php:584 1150 #: includes/bupr-ajax.php:777 1125 1151 msgid "You do not have permission to edit this review." 1126 1152 msgstr "" 1127 1153 1128 #: includes/bupr-ajax.php:6 231129 #: includes/bupr-shortcodes.php:46 01154 #: includes/bupr-ajax.php:644 1155 #: includes/bupr-shortcodes.php:462 1130 1156 msgid "Rating : " 1131 1157 msgstr "" 1132 1158 1133 #: includes/bupr-ajax.php:6 421134 #: includes/bupr-shortcodes.php:41 71135 #: includes/bupr-shortcodes.php:44 61159 #: includes/bupr-ajax.php:663 1160 #: includes/bupr-shortcodes.php:419 1161 #: includes/bupr-shortcodes.php:448 1136 1162 msgid "This field is required." 1137 1163 msgstr "" 1138 1164 1139 1165 #. translators: %s: 1140 #: includes/bupr-ajax.php:6 631166 #: includes/bupr-ajax.php:684 1141 1167 #, php-format 1142 1168 msgid "Update %s" 1143 1169 msgstr "" 1144 1170 1145 #: includes/bupr-ajax.php:6 741171 #: includes/bupr-ajax.php:695 1146 1172 msgid "Unable to load review form." 1147 1173 msgstr "" 1148 1174 1149 1175 #. translators: %s: Review label (e.g., "Review"). 1150 #: includes/bupr-ajax.php:8 001176 #: includes/bupr-ajax.php:833 1151 1177 #, php-format 1152 1178 msgid "%s updated successfully." 1153 1179 msgstr "" 1154 1180 1155 #: includes/bupr-ajax.php:8 201181 #: includes/bupr-ajax.php:853 1156 1182 msgid "Owner replies are disabled." 1157 1183 msgstr "" 1158 1184 1159 #: includes/bupr-ajax.php: 8691185 #: includes/bupr-ajax.php:903 1160 1186 msgid "You do not have permission to reply to this review." 1161 1187 msgstr "" 1162 1188 1163 #: includes/bupr-ajax.php: 8811189 #: includes/bupr-ajax.php:915 1164 1190 msgid "You have already replied to this review." 1165 1191 msgstr "" 1166 1192 1167 #: includes/bupr-ajax.php: 8931193 #: includes/bupr-ajax.php:927 1168 1194 msgid "Reply content cannot be empty." 1169 1195 msgstr "" 1170 1196 1171 #: includes/bupr-ajax.php:9 061172 #: includes/templates/bupr- reviews-tab-template.php:3111197 #: includes/bupr-ajax.php:940 1198 #: includes/templates/bupr-owner-reply.php:30 1173 1199 msgid "Profile Owner" 1174 1200 msgstr "" 1175 1201 1176 #: includes/bupr-ajax.php:9 201177 #: includes/templates/bupr- reviews-tab-template.php:3241202 #: includes/bupr-ajax.php:954 1203 #: includes/templates/bupr-owner-reply.php:43 1178 1204 msgid "Owner Response" 1179 1205 msgstr "" 1180 1206 1181 #: includes/bupr-ajax.php:9 321207 #: includes/bupr-ajax.php:966 1182 1208 msgid "Reply added successfully." 1183 1209 msgstr "" 1184 1210 1185 #: includes/bupr-ajax.php:9 531211 #: includes/bupr-ajax.php:987 1186 1212 msgid "Review flagging is disabled." 1187 1213 msgstr "" 1188 1214 1189 #: includes/bupr-ajax.php: 9751215 #: includes/bupr-ajax.php:1009 1190 1216 msgid "You must be logged in to flag a review." 1191 1217 msgstr "" 1192 1218 1193 #: includes/bupr-ajax.php:10 091194 #: includes/templates/bupr-reviews-tab-template.php: 4331219 #: includes/bupr-ajax.php:1043 1220 #: includes/templates/bupr-reviews-tab-template.php:388 1195 1221 msgid "Spam or fake review" 1196 1222 msgstr "" 1197 1223 1198 #: includes/bupr-ajax.php:10 101199 #: includes/templates/bupr-reviews-tab-template.php: 4371224 #: includes/bupr-ajax.php:1044 1225 #: includes/templates/bupr-reviews-tab-template.php:392 1200 1226 msgid "Harassment or abuse" 1201 1227 msgstr "" 1202 1228 1203 #: includes/bupr-ajax.php:10 111204 #: includes/templates/bupr-reviews-tab-template.php: 4411229 #: includes/bupr-ajax.php:1045 1230 #: includes/templates/bupr-reviews-tab-template.php:396 1205 1231 msgid "Inappropriate content" 1206 1232 msgstr "" 1207 1233 1208 #: includes/bupr-ajax.php:10 121209 #: includes/templates/bupr-reviews-tab-template.php:4 451234 #: includes/bupr-ajax.php:1046 1235 #: includes/templates/bupr-reviews-tab-template.php:400 1210 1236 msgid "Conflict of interest" 1211 1237 msgstr "" 1212 1238 1213 #: includes/bupr-ajax.php:10 181239 #: includes/bupr-ajax.php:1052 1214 1240 msgid "Please select a valid reason for flagging." 1215 1241 msgstr "" 1216 1242 1217 #: includes/bupr-ajax.php:10 371243 #: includes/bupr-ajax.php:1071 1218 1244 msgid "You have already flagged this review." 1219 1245 msgstr "" 1220 1246 1221 #: includes/bupr-ajax.php:1 0791247 #: includes/bupr-ajax.php:1115 1222 1248 msgid "Thank you for reporting. This review has been hidden pending admin review." 1223 1249 msgstr "" 1224 1250 1225 #: includes/bupr-ajax.php:1 0801251 #: includes/bupr-ajax.php:1116 1226 1252 msgid "Thank you for reporting. We will review this content." 1227 1253 msgstr "" 1228 1254 1229 1255 #. translators: %s: Number of reviews. 1230 #: includes/bupr-filters.php: 2401231 #: includes/bupr-filters.php: 6071256 #: includes/bupr-filters.php:193 1257 #: includes/bupr-filters.php:408 1232 1258 #, php-format 1233 1259 msgid "%s review" … … 1237 1263 1238 1264 #. translators: 1: Average rating value (e.g. "4.50"). 2: Number of ratings. 1239 #: includes/bupr-filters.php:2 751265 #: includes/bupr-filters.php:228 1240 1266 #, php-format 1241 1267 msgid "Average rating: %1$s based on %2$s rating" … … 1245 1271 1246 1272 #. translators: 1: Average rating value out of 5 (e.g. "4.50"). 2: Number of reviews. 1247 #: includes/bupr-filters.php:2 821273 #: includes/bupr-filters.php:235 1248 1274 #, php-format 1249 1275 msgid "%1$s/5 ( %2$s review )" … … 1253 1279 1254 1280 #. translators: %s: Review label. 1255 #. translators: %s: review label. 1256 #: includes/bupr-filters.php:394 1257 #: includes/bupr-filters.php:406 1258 #: includes/bupr-filters.php:452 1259 #: includes/bupr-filters.php:464 1260 #: includes/bupr-filters.php:485 1261 #: includes/bupr-filters.php:497 1281 #: includes/bupr-filters.php:316 1262 1282 #, php-format 1263 1283 msgid "Add %s" … … 1265 1285 1266 1286 #. translators: %s: Review label. 1267 #: includes/bupr-filters.php: 7341287 #: includes/bupr-filters.php:535 1268 1288 #, php-format 1269 1289 msgid "View %s" 1270 1290 msgstr "" 1271 1291 1272 #: includes/bupr-filters.php: 7381292 #: includes/bupr-filters.php:539 1273 1293 msgid "Approve" 1274 1294 msgstr "" 1275 1295 1276 #. translators: %1$s: Review Label.1277 1296 #. translators: %1$s: Review label. 1278 #: includes/bupr-filters.php:861 1279 #: includes/bupr-filters.php:889 1280 #: includes/bupr-filters.php:904 1297 #: includes/bupr-filters.php:615 1281 1298 #, php-format 1282 1299 msgid "Add %1$s" 1283 1300 msgstr "" 1284 1301 1302 #. translators: %1$s: login URL; %2$s: review label. 1303 #: includes/bupr-filters.php:691 1304 #, php-format 1305 msgid "You must <a href=\"%1$s\">log in</a> to add a %2$s." 1306 msgstr "" 1307 1285 1308 #. translators: %1$s: Review user link; %2$s: review label; %3$s: reviewed user link. 1286 #: includes/bupr-filters.php: 10751309 #: includes/bupr-filters.php:789 1287 1310 #, php-format 1288 1311 msgid "%1$s posted a new %2$s to %3$s" 1289 1312 msgstr "" 1290 1313 1291 #: includes/bupr-filters.php: 12351314 #: includes/bupr-filters.php:956 1292 1315 msgid "Custom Default Gravatar" 1293 1316 msgstr "" … … 1307 1330 msgstr "" 1308 1331 1332 #. translators: %s: review label. 1333 #: includes/bupr-notification.php:65 1334 #, php-format 1335 msgid "A member reported a %s. Check it and dismiss or resolve the report." 1336 msgstr "" 1337 1338 #. translators: 1: member name, 2: review label. 1339 #: includes/bupr-notification.php:71 1340 #, php-format 1341 msgid "%1$s replied to your %2$s" 1342 msgstr "" 1343 1309 1344 #. translators: %s: 1310 #: includes/bupr-notification.php:1 041345 #: includes/bupr-notification.php:129 1311 1346 #, php-format 1312 1347 msgid "A new %s posted." … … 1314 1349 1315 1350 #. translators: %s: 1316 #: includes/bupr-notification.php:1 061351 #: includes/bupr-notification.php:131 1317 1352 #, php-format 1318 1353 msgid "%1$s posted a %2$s" … … 1320 1355 1321 1356 #. translators: %s: 1322 #: includes/bupr-notification.php:1 101357 #: includes/bupr-notification.php:135 1323 1358 #, php-format 1324 1359 msgid "( Pending Approval ) %1$s posted a %2$s" 1325 1360 msgstr "" 1326 1361 1327 #: includes/bupr-scripts.php: 1961362 #: includes/bupr-scripts.php:201 1328 1363 msgid "Enter Keywords...." 1329 1364 msgstr "" 1330 1365 1331 #: includes/bupr-scripts.php: 1971366 #: includes/bupr-scripts.php:202 1332 1367 msgid "Please enter a reply." 1333 1368 msgstr "" 1334 1369 1335 #: includes/bupr-scripts.php: 1981370 #: includes/bupr-scripts.php:203 1336 1371 msgid "Failed to add reply." 1337 1372 msgstr "" 1338 1373 1339 #: includes/bupr-scripts.php: 1991374 #: includes/bupr-scripts.php:204 1340 1375 msgid "Please select a reason." 1341 1376 msgstr "" 1342 1377 1343 #: includes/bupr-scripts.php:20 11378 #: includes/bupr-scripts.php:206 1344 1379 msgid "An error occurred. Please try again." 1345 1380 msgstr "" 1346 1381 1347 1382 #. translators: %d: star position (1-5) in the rating group. 1348 #: includes/bupr-scripts.php:2 091383 #: includes/bupr-scripts.php:214 1349 1384 #, php-format 1350 1385 msgid "Rate %d out of 5" 1351 1386 msgstr "" 1352 1387 1353 #: includes/bupr-scripts.php:21 01388 #: includes/bupr-scripts.php:215 1354 1389 msgid "Rating" 1355 1390 msgstr "" 1356 1391 1357 #: includes/bupr-scripts.php:26 21392 #: includes/bupr-scripts.php:267 1358 1393 msgid "Already Installed & Activated" 1359 1394 msgstr "" 1360 1395 1361 #: includes/bupr-scripts.php:26 31396 #: includes/bupr-scripts.php:268 1362 1397 msgid "There was a problem performing the action." 1363 1398 msgstr "" 1364 1399 1365 #: includes/bupr-scripts.php:26 41400 #: includes/bupr-scripts.php:269 1366 1401 msgid "* Number input is not allowed *" 1367 1402 msgstr "" 1368 1403 1369 #: includes/bupr-scripts.php:2 651404 #: includes/bupr-scripts.php:270 1370 1405 msgid "Approving…" 1371 1406 msgstr "" 1372 1407 1373 #: includes/bupr-scripts.php:2 681408 #: includes/bupr-scripts.php:273 1374 1409 msgid "Add Review criteria eg. Member Response. " 1375 1410 msgstr "" 1376 1411 1377 #: includes/bupr-scripts.php:2701378 msgid "Remove"1379 msgstr ""1380 1381 #: includes/bupr-scripts.php:2711382 msgid "Remove this review criteria"1383 msgstr ""1384 1385 1412 #: includes/bupr-shortcodes.php:176 1386 #: includes/widgets/display-review.php:146 1387 msgid "reviews" 1388 msgstr "" 1389 1413 #: includes/widgets/display-review.php:149 1414 msgid "review" 1415 msgid_plural "reviews" 1416 msgstr[0] "" 1417 msgstr[1] "" 1418 1419 #. translators: %1$s: rating; %2$s: review count; %3$s: item type label 1390 1420 #: includes/bupr-shortcodes.php:184 1391 1421 #, php-format … … 1393 1423 msgstr "" 1394 1424 1425 #. translators: %1$s: review count; %2$s: item type label 1395 1426 #. translators: %1$s: Review count; %2$s: item type label 1396 1427 #: includes/bupr-shortcodes.php:188 1397 #: includes/widgets/display-review.php:17 21428 #: includes/widgets/display-review.php:175 1398 1429 #, php-format 1399 1430 msgid "%1$s %2$s" … … 1401 1432 1402 1433 #: includes/bupr-shortcodes.php:195 1403 #: includes/widgets/display-review.php:18 11434 #: includes/widgets/display-review.php:184 1404 1435 msgid "No members have been reviewed yet." 1405 1436 msgstr "" 1406 1437 1407 1438 #. translators: %s: 1408 #: includes/bupr-shortcodes.php:32 31439 #: includes/bupr-shortcodes.php:325 1409 1440 #, php-format 1410 1441 msgid "Thank you for taking time to write this wonderful %1$s." … … 1412 1443 1413 1444 #. translators: %s: 1414 #: includes/bupr-shortcodes.php:32 61445 #: includes/bupr-shortcodes.php:328 1415 1446 #, php-format 1416 1447 msgid "Thank you for taking time to write this wonderful %1$s. Your %1$s will display after moderator's approval." 1417 1448 msgstr "" 1418 1449 1419 #: includes/bupr-shortcodes.php:39 01450 #: includes/bupr-shortcodes.php:392 1420 1451 msgid "Sorry, You have not been given permission to review the user !!!" 1421 1452 msgstr "" 1422 1453 1423 1454 #. translators: %s: 1424 #: includes/bupr-shortcodes.php:40 21455 #: includes/bupr-shortcodes.php:404 1425 1456 #, php-format 1426 1457 msgid "Fill in details to submit %s" 1427 1458 msgstr "" 1428 1459 1429 #: includes/bupr-shortcodes.php:4 081460 #: includes/bupr-shortcodes.php:410 1430 1461 msgid "--Select--" 1431 1462 msgstr "" 1432 1463 1433 1464 #. translators: %s: review label 1434 #: includes/bupr-shortcodes.php:50 11435 #: includes/bupr-shortcodes.php:50 71465 #: includes/bupr-shortcodes.php:503 1466 #: includes/bupr-shortcodes.php:509 1436 1467 #, php-format 1437 1468 msgid "Enter your %s" … … 1439 1470 1440 1471 #. translators: %s: review label; 1441 #: includes/bupr-shortcodes.php:51 51472 #: includes/bupr-shortcodes.php:517 1442 1473 #, php-format 1443 1474 msgid "Send %s anonymously." 1444 1475 msgstr "" 1445 1476 1446 #: includes/bupr-shortcodes.php:52 11477 #: includes/bupr-shortcodes.php:523 1447 1478 msgid "Please either select a rating or write a review." 1448 1479 msgstr "" 1449 1480 1450 1481 #. translators: %s: 1451 #: includes/bupr-shortcodes.php:52 71482 #: includes/bupr-shortcodes.php:529 1452 1483 #, php-format 1453 1484 msgid "Submit %s" 1454 1485 msgstr "" 1455 1486 1456 #: includes/bupr-shortcodes.php:53 11487 #: includes/bupr-shortcodes.php:533 1457 1488 msgid "Loading..." 1458 1489 msgstr "" … … 1470 1501 msgstr "" 1471 1502 1503 #: includes/templates/bupr-owner-reply.php:53 1504 msgid "Reply to this review" 1505 msgstr "" 1506 1507 #: includes/templates/bupr-owner-reply.php:56 1508 msgid "Write your response..." 1509 msgstr "" 1510 1511 #: includes/templates/bupr-owner-reply.php:59 1512 msgid "Submit Reply" 1513 msgstr "" 1514 1472 1515 #. translators: %s: 1473 1516 #: includes/templates/bupr-reviews-tab-template.php:75 … … 1477 1520 1478 1521 #: includes/templates/bupr-reviews-tab-template.php:101 1522 #: includes/templates/bupr-single-review-template.php:92 1479 1523 msgid "Profile Photo" 1480 1524 msgstr "" … … 1489 1533 msgstr "" 1490 1534 1491 #: includes/templates/bupr-reviews-tab-template.php:334 1492 msgid "Reply to this review" 1493 msgstr "" 1494 1495 #: includes/templates/bupr-reviews-tab-template.php:337 1496 msgid "Write your response..." 1497 msgstr "" 1498 1499 #: includes/templates/bupr-reviews-tab-template.php:340 1500 msgid "Submit Reply" 1501 msgstr "" 1502 1503 #: includes/templates/bupr-reviews-tab-template.php:360 1535 #: includes/templates/bupr-reviews-tab-template.php:314 1504 1536 msgid "Report this review" 1505 1537 msgstr "" 1506 1538 1507 #: includes/templates/bupr-reviews-tab-template.php:3 621539 #: includes/templates/bupr-reviews-tab-template.php:316 1508 1540 msgid "Report" 1509 1541 msgstr "" 1510 1542 1511 1543 #. translators: %s: 1544 #: includes/templates/bupr-reviews-tab-template.php:361 1545 #, php-format 1546 msgid "Unfortunately, there are no %1$s found." 1547 msgstr "" 1548 1549 #: includes/templates/bupr-reviews-tab-template.php:379 1550 msgid "Report Review" 1551 msgstr "" 1552 1553 #: includes/templates/bupr-reviews-tab-template.php:383 1554 msgid "Please select a reason for reporting this review:" 1555 msgstr "" 1556 1512 1557 #: includes/templates/bupr-reviews-tab-template.php:406 1513 #, php-format1514 msgid "Unfortunately, there are no %1$s found."1515 msgstr ""1516 1517 #: includes/templates/bupr-reviews-tab-template.php:4241518 msgid "Report Review"1519 msgstr ""1520 1521 #: includes/templates/bupr-reviews-tab-template.php:4281522 msgid "Please select a reason for reporting this review:"1523 msgstr ""1524 1525 #: includes/templates/bupr-reviews-tab-template.php:4511526 1558 msgid "Submit Report" 1527 1559 msgstr "" 1528 1560 1529 #: includes/templates/bupr-single-review-template.php:3 51561 #: includes/templates/bupr-single-review-template.php:37 1530 1562 msgid "Review author not found." 1563 msgstr "" 1564 1565 #. translators: %s: reviewer display name. 1566 #: includes/templates/bupr-single-review-template.php:94 1567 #, php-format 1568 msgid "Profile photo of %s" 1531 1569 msgstr "" 1532 1570 … … 1544 1582 1545 1583 #. translators: %1$s: aggregate rating; %2$s: Review count; %3$s: item type label 1546 #: includes/widgets/display-review.php:1 691584 #: includes/widgets/display-review.php:172 1547 1585 #, php-format 1548 1586 msgid "%1$s/5 (%2$s %3$s)" 1549 1587 msgstr "" 1550 1588 1551 #: includes/widgets/display-review.php:2 091589 #: includes/widgets/display-review.php:212 1552 1590 msgid "Top Members" 1553 1591 msgstr "" 1554 1592 1555 #: includes/widgets/display-review.php:22 21593 #: includes/widgets/display-review.php:225 1556 1594 msgid "Enter Title" 1557 1595 msgstr "" 1558 1596 1559 #: includes/widgets/display-review.php:22 61597 #: includes/widgets/display-review.php:229 1560 1598 msgid "Display Members" 1561 1599 msgstr "" 1562 1600 1563 #: includes/widgets/display-review.php:23 31601 #: includes/widgets/display-review.php:236 1564 1602 msgid "Top Rated " 1565 1603 msgstr "" 1566 1604 1567 #: includes/widgets/display-review.php:2 381605 #: includes/widgets/display-review.php:241 1568 1606 msgid "Most Reviewed" 1569 1607 msgstr "" 1570 1608 1571 #: includes/widgets/display-review.php:24 41609 #: includes/widgets/display-review.php:247 1572 1610 msgid "Display Avatar " 1573 1611 msgstr "" … … 1587 1625 msgstr "" 1588 1626 1589 #: includes/widgets/member-rating.php:13 21627 #: includes/widgets/member-rating.php:133 1590 1628 msgid "Anonymous" 1591 1629 msgstr "" 1592 1630 1593 1631 #. translators: %1$s: average rating 1594 #: includes/widgets/member-rating.php:16 71632 #: includes/widgets/member-rating.php:168 1595 1633 #, php-format 1596 1634 msgid "%1$s/5" 1597 1635 msgstr "" 1598 1636 1599 #: includes/widgets/member-rating.php:1 791637 #: includes/widgets/member-rating.php:180 1600 1638 msgid "The member has not received a rating yet." 1601 1639 msgstr "" 1602 1640 1603 #: includes/widgets/member-rating.php:21 81641 #: includes/widgets/member-rating.php:219 1604 1642 msgid "Enter Title:" 1605 1643 msgstr "" 1606 1644 1607 #: includes/widgets/member-rating.php:22 21645 #: includes/widgets/member-rating.php:223 1608 1646 msgid "Number of Ratings to Show:" 1609 1647 msgstr "" 1610 1648 1611 #: includes/widgets/member-rating.php:22 61649 #: includes/widgets/member-rating.php:227 1612 1650 msgid "Default Sorting:" 1613 1651 msgstr "" 1614 1652 1615 #: includes/widgets/member-rating.php:22 81653 #: includes/widgets/member-rating.php:229 1616 1654 msgid "Latest" 1617 1655 msgstr "" 1618 1656 1619 #: includes/widgets/member-rating.php:2 291657 #: includes/widgets/member-rating.php:230 1620 1658 msgid "Highest" 1621 1659 msgstr "" 1622 1660 1623 #: includes/widgets/member-rating.php:23 01661 #: includes/widgets/member-rating.php:231 1624 1662 msgid "Lowest" 1625 1663 msgstr "" -
bp-user-profile-reviews/trunk/readme.txt
r3617176 r3736444 4 4 Tags: buddypress, members, reviews, ratings, community 5 5 Requires at least: 6.5 6 Tested up to: 7.0 7 Stable tag: 3.8.0 8 Requires PHP: 8.0 6 Tested up to: 7.1 7 Stable tag: 3.8.1 8 Requires PHP: 8.1 9 Tested with BuddyPress: 14.5.2 9 10 License: GPLv2 or later 10 11 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 73 74 74 75 * English (default) 75 * German (de_DE) and French (fr_FR) translations included76 * German (de_DE), French (fr_FR), Spanish (es_ES), Italian (it_IT) and Portuguese Brazil (pt_BR) translations included 76 77 * Ready for translation in your language with included POT file 77 78 * WPML compatible (wpml-config.xml included) … … 88 89 89 90 * WordPress 6.5 and higher 90 * PHP 8. 0and higher91 * PHP 8.1 and higher 91 92 * BuddyPress 6.0+ or BuddyBoss Platform 1.8+ required, with the Members component active 92 93 * Works with the block editor and classic editor. The two widgets are classic WP_Widget classes, so on a block theme add them through the Legacy Widget block. … … 145 146 146 147 * WordPress 6.5 or higher 147 * PHP 8. 0or higher148 * PHP 8.1 or higher 148 149 * BuddyPress 6.0+ or BuddyBoss Platform 1.8+, with the Members component active 149 150 … … 219 220 = Is the plugin translation ready? = 220 221 221 Yes. German and Frenchtranslations ship with the plugin, and a POT file is included so you can translate into any language. The plugin is WPML compatible and includes RTL support.222 Yes. German, French, Spanish, Italian and Portuguese (Brazil) translations ship with the plugin, and a POT file is included so you can translate into any language. The plugin is WPML compatible and includes RTL support. 222 223 223 224 = Where can I get support? = … … 246 247 247 248 == Changelog == 249 250 = 3.8.1 - October 2026 = 251 252 Moderation and settings-screen fixes. 253 254 * New - The site administrator gets a BuddyPress notification when a review is reported, and the reviewer gets one when the member replies to their review. 255 * New - Reviews hidden by the report threshold now show an Auto-hidden badge with the hide date, an Auto-hidden filter in the Reviews list, and a count on the Overview screen. 256 * Improve - The single review page shows the owner's reply, and the reviewed member can reply from it. 257 * Improve - Settings toggles render as switches again, and the criteria Add and Remove buttons match the rest of the settings screen. 258 * Improve - Email editors use the full row width, subject fields are wider, and settings rows no longer leave large gaps on phones. 259 * Improve - Member review counts in the admin bar and profile tab read the cached total instead of loading every review on each page view. 260 * Improve - Approval email fields show and hide as soon as Auto Approve is switched, without saving first. 261 * Improve - Members who already reported a review see Reported instead of a Report button that fails. 262 * Improve - The top members widget and shortcode skip members with no reviews and say 1 review instead of 1 reviews. 263 * Improve - The logged-out Add Review prompt is translatable and returns visitors to the review form after logging in. 264 * Improve - The Edit Review button uses the same readable style as Report in light and dark mode. 265 * Fix - A review hidden by the report threshold, unpublished or trashed is removed from the activity stream and the activity REST API. 266 * Fix - Re-approving or editing a review no longer posts a duplicate activity entry. 267 * Fix - Clearing the Auto-Hide Threshold field no longer switches auto-hide off; a blank or invalid value falls back to 5 reports. 268 * Fix - Several General settings rows were nested inside the Approval Email section, which broke their alignment. 269 * Fix - Turning Multiple Criteria off now hides the criteria builder. 270 * Fix - The Overview screen shows a Turn on link for every disabled feature. 271 * Fix - Criteria rows use the same Remove label whether they were saved or just added. 272 * Fix - The Member Review widget now picks up the Rating Color setting on pages outside BuddyPress. 273 * Fix - Review cards in Reign dark mode now use Reign's own dark colors. 274 * Fix - Report, Edit Review and the report dialog close button stay readable on hover in dark mode. 275 * Fix - Unchecking Show Review Button is now saved explicitly. 276 * Fix - The WordPress Dark admin color scheme no longer makes the settings header text unreadable. 277 * Fix - Editing a review no longer publishes it; pending and report-hidden reviews stay hidden until approved. 278 * Fix - The Update Review setting is now enforced, not only by hiding the Edit button. 279 * Fix - A submitted review is stored with each rating on its own criterion, and an empty review is refused. 280 * Fix - A refused review submission keeps what the member typed, and the confirmation message stays on screen. 281 * Fix - Dismissed reports no longer count toward auto-hide, and dismissing the reports on a review they hid publishes it again. 282 * Fix - Deleting a review recalculates the member's rating and removes its activity entry. 283 * Fix - Notification email formatting is kept when saved, so emails are no longer one run-on paragraph. 284 * Fix - The Anonymous flag is ignored in emails when Anonymous Reviews is off. 285 * Fix - Owner replies are only accepted on published reviews. 286 * Fix - Approving a review respects the Email Notifications and BuddyPress Notifications switches, and a review restored by dismissing its reports no longer re-sends the "new review" email. 287 * Fix - The bulk Dismiss Reports action restores a review hidden by reports, the same as dismissing a single review. 288 * Fix - The Member Rating widget respects Number of Ratings to Show, and shows the default avatar for anonymous reviews. 289 * Fix - The Add Review tab no longer shows on your own profile, where a review could never be submitted. 290 * Fix - Mark Resolved now stops the resolved reports counting toward auto-hide, the same as Dismiss Reports. 291 * Fix - The Add Review button, the Add Review tab and the review form's member list accept a member with any allowed role, not only their first role. 292 * Fix - A custom plural review label shows as typed on the profile tab with BuddyPress Legacy templates. 293 * Fix - The Reviewer Roles, Reviewee Roles, Criteria and Display settings describe what they really do. 294 * Fix - The review form and dialogs no longer overflow the screen on themes without a box-sizing reset, such as Twenty Twenty-Five. 295 * Fix - Report dialog Submit and Cancel buttons keep their own styles inside BuddyPress pages. 296 * Fix - Removed BuddyPress 12 deprecation notices from profile links. 297 * Fix - Bulk-activating several plugins no longer stops after this one, and activating it from WP-CLI no longer exits early. 298 * Security - Approving a review from the Reviews list now requires the Editor capability; Contributors and Authors could previously approve any pending review. 299 * Security - The Reviewer Roles and Reviewee Roles settings are now enforced when a review is submitted, not only by hiding the Add Review button. 300 * Security - Pending and report-hidden reviews are no longer readable at their direct link, and a review only shows on the profile it belongs to. 301 * Security - Anonymous reviews no longer reveal the reviewer in the avatar text on the single review page. 302 * Security - Reviews no longer have public pages, archives, feeds or search results, which showed the author of an anonymous review; old review links redirect to the review on the member's profile. 303 * Security - The top members list shows display names instead of login usernames. 304 * Security - Dismissing or resolving reports requires the Editor capability. 305 * Security - The review submit and approve actions no longer accept logged-out requests. 248 306 249 307 = 3.8.0 - July 2026 = … … 327 385 == Upgrade Notice == 328 386 387 = 3.8.1 = 388 Security and moderation update: pending and report-hidden reviews stay private, review approval and report moderation need the Editor capability, and reviewer role settings are enforced. Recommended for all users. 389 329 390 = 3.8.0 = 330 391 Security update: the review update endpoint now enforces an ownership check, so members can only edit their own reviews. Also includes the rebuilt admin settings screen and a front-end accessibility, dark-mode and RTL pass. Recommended for all users.
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)