Version Description
(2019-03-29) =
- Fixed compatibility with Woocommerce when using the "Product" schema type
Download this release
Release Info
Developer | geminilabs |
Plugin | Site Reviews |
Version | 3.5.4 |
Comparing to | |
See all releases |
Code changes from version 2.17.1 to 3.5.4
- assets/css/site-reviews-admin.css +0 -1
- assets/css/site-reviews.css +0 -1
- assets/css/twenty-eleven.css +0 -1
- assets/css/twenty-fifteen.css +0 -1
- assets/css/twenty-fourteen.css +0 -1
- assets/css/twenty-seventeen.css +0 -1
- assets/css/twenty-sixteen.css +0 -1
- assets/css/twenty-ten.css +0 -1
- assets/css/twenty-thirteen.css +0 -1
- assets/css/twenty-twelve.css +0 -1
- assets/images/addon-images.svg +1 -0
- assets/images/addon-tripadvisor.svg +1 -0
- assets/images/block-icon-form.svg +1 -0
- assets/images/block-icon-reviews.svg +1 -0
- assets/images/block-icon-summary.svg +1 -0
- assets/images/icon.png +0 -0
- assets/images/pinned.svg +1 -0
- assets/images/star-empty.svg +1 -0
- assets/{img/star-empty.svg → images/star-error.svg} +1 -2
- assets/images/star-full.svg +1 -0
- assets/images/star-half.svg +1 -0
- assets/img/booking.svg +0 -14
- assets/img/facebook.svg +0 -11
- assets/img/google.svg +0 -15
- assets/img/icon.png +0 -0
- assets/img/pinned.svg +0 -6
- assets/img/star-filled.svg +0 -6
- assets/img/star-half.svg +0 -6
- assets/img/tripadvisor.svg +0 -21
- assets/img/yelp.svg +0 -14
- assets/js/mce-plugin.js +0 -1
- assets/js/recaptcha.js +0 -1
- assets/js/site-reviews-admin.js +0 -1
- assets/js/site-reviews.js +0 -8
- assets/scripts/mce-plugin.js +1 -0
- assets/scripts/site-reviews-admin.js +1 -0
- assets/scripts/site-reviews-blocks.js +1 -0
- assets/scripts/site-reviews.js +1 -0
- assets/styles/custom/bootstrap_4.css +1 -0
- assets/styles/custom/bootstrap_4_custom.css +1 -0
- assets/styles/custom/contact_form_7.css +1 -0
- assets/styles/custom/materialize.css +1 -0
- assets/styles/custom/minimal.css +1 -0
- assets/styles/custom/twentyfifteen.css +1 -0
- assets/styles/custom/twentynineteen.css +1 -0
- assets/styles/custom/twentyseventeen.css +1 -0
- assets/styles/custom/twentysixteen.css +1 -0
- assets/styles/inline-styles.css +1 -0
- assets/styles/site-reviews-admin.css +1 -0
- assets/styles/site-reviews-blocks.css +1 -0
- assets/styles/site-reviews.css +1 -0
- autoload.php +11 -24
- compatibility.php +39 -113
- config/forms/submission-form.php +33 -0
- config/inline-styles.php +8 -0
- config/settings.php +369 -0
- config/styles/bootstrap_4.php +19 -0
- config/styles/bootstrap_4_custom.php +19 -0
- config/styles/contact_form_7.php +19 -0
- config/styles/divi.php +7 -0
- config/styles/materialize.php +18 -0
- config/styles/ninja_forms.php +8 -0
- config/styles/wpforms.php +12 -0
- deprecated.php +113 -0
- helpers.php +116 -69
- languages/readme.txt +0 -5
- languages/site-reviews-en_US.mo +0 -0
- languages/site-reviews-en_US.po +1232 -1176
- languages/site-reviews.pot +874 -843
- loco.xml +0 -22
- plugin/Actions.php +115 -0
- plugin/App.php +0 -315
- plugin/Application.php +271 -0
- plugin/Blacklist.php +0 -56
- plugin/Blocks/BlockGenerator.php +69 -0
- plugin/Blocks/SiteReviewsBlock.php +130 -0
- plugin/Blocks/SiteReviewsFormBlock.php +121 -0
- plugin/Blocks/SiteReviewsSummaryBlock.php +89 -0
- plugin/Commands/ChangeStatus.php +1 -9
- plugin/Commands/CreateReview.php +138 -0
- plugin/Commands/EnqueueAdminAssets.php +13 -0
- plugin/Commands/EnqueueAssets.php +0 -27
- plugin/Commands/RegisterPointers.php +0 -21
- plugin/Commands/RegisterPostType.php +62 -61
- plugin/Commands/RegisterShortcodeButtons.php +0 -21
- plugin/Commands/RegisterShortcodes.php +0 -8
- plugin/Commands/RegisterTaxonomy.php +0 -8
- plugin/Commands/RegisterTinymcePopups.php +13 -0
- plugin/Commands/RegisterWidgets.php +1 -9
- plugin/Commands/SubmitReview.php +0 -47
- plugin/Commands/TogglePinned.php +2 -12
- plugin/Container.php +21 -74
- plugin/Contracts/HooksContract.php +11 -0
- plugin/Contracts/PartialContract.php +11 -0
- plugin/Contracts/ProviderContract.php +13 -0
- plugin/Contracts/ShortcodeContract.php +12 -0
- plugin/Controllers/AdminController.php +232 -0
- plugin/Controllers/AjaxController.php +76 -71
- plugin/Controllers/BaseController.php +0 -138
- plugin/Controllers/BlocksController.php +92 -0
- plugin/Controllers/Controller.php +63 -0
- plugin/Controllers/EditorController.php +399 -0
- plugin/Controllers/EditorController/Customization.php +85 -0
- plugin/Controllers/EditorController/Labels.php +127 -0
- plugin/Controllers/EditorController/Metaboxes.php +40 -0
- plugin/Controllers/ListTableController.php +339 -0
- plugin/Controllers/ListTableController/Columns.php +144 -0
- plugin/Controllers/MainController.php +40 -815
- plugin/Controllers/MenuController.php +199 -0
- plugin/Controllers/PublicController.php +108 -0
- plugin/Controllers/RestCategoryController.php +38 -0
- plugin/Controllers/RestReviewController.php +48 -0
- plugin/Controllers/ReviewController.php +74 -677
- plugin/Controllers/SettingsController.php +115 -0
- plugin/Controllers/TaxonomyController.php +79 -0
- plugin/Database.php +71 -474
- plugin/Database/Cache.php +74 -0
- plugin/Database/CountsManager.php +363 -0
- plugin/Database/DefaultsManager.php +64 -0
- plugin/Database/OptionManager.php +137 -0
- plugin/Database/Options.php +0 -223
- plugin/Database/OptionsContract.php +0 -107
- plugin/Database/QueryBuilder.php +162 -0
- plugin/Database/ReviewManager.php +192 -0
- plugin/Database/SqlQueries.php +231 -0
- plugin/Defaults/BuilderDefaults.php +24 -0
- plugin/Defaults/CreateReviewDefaults.php +33 -0
- plugin/Defaults/DefaultsAbstract.php +44 -0
- plugin/Defaults/EmailDefaults.php +31 -0
- plugin/Defaults/PaginationDefaults.php +24 -0
- plugin/Defaults/PostTypeDefaults.php +38 -0
- plugin/Defaults/ReviewsDefaults.php +28 -0
- plugin/Defaults/SiteReviewsDefaults.php +30 -0
- plugin/Defaults/SiteReviewsFormDefaults.php +25 -0
- plugin/Defaults/SiteReviewsSummaryDefaults.php +28 -0
- plugin/Defaults/SlackDefaults.php +24 -0
- plugin/Defaults/StyleFieldsDefaults.php +25 -0
- plugin/Defaults/StyleValidationDefaults.php +27 -0
- plugin/Defaults/ValidateReviewDefaults.php +28 -0
- plugin/Defaults/ValidationStringsDefaults.php +29 -0
- plugin/Email.php +0 -245
- plugin/Filters.php +72 -0
- plugin/Handlers/ChangeStatus.php +51 -21
- plugin/Handlers/CreateReview.php +46 -0
- plugin/Handlers/EnqueueAdminAssets.php +159 -0
- plugin/Handlers/EnqueueAssets.php +0 -191
- plugin/Handlers/EnqueuePublicAssets.php +137 -0
- plugin/Handlers/RegisterPointers.php +0 -62
- plugin/Handlers/RegisterPostType.php +4 -373
- plugin/Handlers/RegisterShortcodeButtons.php +0 -36
- plugin/Handlers/RegisterShortcodes.php +7 -23
- plugin/Handlers/RegisterTaxonomy.php +3 -92
- plugin/Handlers/RegisterTinymcePopups.php +28 -0
- plugin/Handlers/RegisterWidgets.php +9 -24
- plugin/Handlers/SubmitReview.php +0 -178
- plugin/Handlers/TogglePinned.php +4 -26
- plugin/Helper.php +253 -90
- plugin/Html.php +0 -208
- plugin/Html/Field.php +0 -380
- plugin/Html/Fields/Base.php +0 -143
assets/css/site-reviews-admin.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.glsr-addons{margin:-20px 0 0 -20px}.glsr-addon-wrap{float:left;position:relative;width:100%;box-sizing:border-box;padding:20px 0 0 20px}@media only screen and (min-width:480px){.glsr-addon-wrap{width:50%}}@media only screen and (min-width:782px){.glsr-addon-wrap{width:33.33%}}@media only screen and (min-width:1400px){.glsr-addon-wrap{width:25%}}.glsr-addon{border:1px solid #ddd;box-shadow:0 1px 1px -1px rgba(0,0,0,.1)}.glsr-addon-description{background-color:#fff;padding:1em 15px}.glsr-addon-description p{height:78px}.glsr-addon-description p,.glsr-addon-name{overflow:hidden;text-overflow:ellipsis;margin:0}.glsr-addon-name{height:48px;font-size:15px;font-weight:600;background:hsla(0,0%,100%,.65);box-shadow:inset 0 1px 0 rgba(0,0,0,.1);box-sizing:border-box;white-space:nowrap;padding:15px}.glsr-addon-screenshot{display:block;background-position:50%;background-repeat:no-repeat;background-size:100% auto;border-bottom:1px solid #ddd;padding-top:56.25%}.glsr-addon-screenshot[data-name=booking]{background-image:url(../img/booking.svg);background-color:#00347d}.glsr-addon-screenshot[data-name=facebook]{background-image:url(../img/facebook.svg);background-color:#3b5998}.glsr-addon-screenshot[data-name=google]{background-image:url(../img/google.svg);background-color:#c6dafc}.glsr-addon-screenshot[data-name=tripadvisor]{background-color:#4b7e37;background-image:url(../img/tripadvisor.svg)}.glsr-addon-screenshot[data-name=yelp]{background-image:url(../img/yelp.svg);background-color:#d32323}.glsr-addon-link{position:absolute;right:15px;bottom:10px}@media screen and (max-width:782px){.glsr-addon-link{bottom:5px;text-indent:-100%;padding:6px 10px!important;overflow:hidden}}.glsr-addon-link:after{display:inline-block;content:"\00a0\f504";font-family:dashicons;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:782px){.glsr-addon-link:after{float:right;height:16px;width:16px;content:"\f504";font-size:18px;text-indent:0}}#dashboard_right_now li>span.glsr-review-count:before,#dashboard_right_now li a.glsr-review-count:before{content:"\f459";line-height:.8em}#titlediv #title{margin-bottom:20px}#contentdiv textarea,#titlediv #title{border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);background-color:#fff}#contentdiv textarea,.post-type-site-review .wp-editor-area{width:100%;height:320px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:16px;line-height:1.5;padding:10px;resize:vertical;-webkit-font-smoothing:antialiased!important;overflow-wrap:break-word}body.branch-4 .misc-pub-pinned:before,body.branch-4-1 .misc-pub-pinned:before,body.branch-4-2 .misc-pub-pinned:before,body.branch-4-3 .misc-pub-pinned:before{display:none}body.branch-4 .misc-pub-pinned .pinned-icon,body.branch-4-1 .misc-pub-pinned .pinned-icon,body.branch-4-2 .misc-pub-pinned .pinned-icon,body.branch-4-3 .misc-pub-pinned .pinned-icon{position:relative;display:inline-block;width:20px;padding-right:2px}body.branch-4 .misc-pub-pinned .pinned-icon svg,body.branch-4-1 .misc-pub-pinned .pinned-icon svg,body.branch-4-2 .misc-pub-pinned .pinned-icon svg,body.branch-4-3 .misc-pub-pinned .pinned-icon svg{position:absolute;top:-13px;left:-1px;width:19px;height:18px;color:#888}.misc-pub-pinned:before{display:inline-block;position:relative;content:"\f537";font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;top:0;left:-1px;color:#82878c;padding:0 2px 0 0}.misc-pub-pinned .pinned-status-text{font-weight:600}.misc-pub-pinned .pinned-status-select{margin-top:3px}.glsr-response{display:block;height:6em;width:100%;margin:12px 0 0}.glsr-mce{position:relative;display:inline-block;margin-right:1px}.glsr-mce-menu.mce-menu{display:none;position:absolute;top:100%;left:0;min-width:100%;background:#fff;padding:5px 0;margin:-2px 0 0}.glsr-mce-menu-item.mce-menu-item{cursor:pointer;font-size:14px;white-space:nowrap;padding:6px 12px;margin-bottom:2px}.mce-glsr-mce-popup a{text-decoration:underline}.mce-glsr-mce-popup p{margin-bottom:1em}.mce-glsr-mce-popup p.strong{font-weight:600}.mce-glsr-mce-popup p.no-margin{margin-bottom:0}.mce-glsr-mce-popup p.margin-top{margin-top:1em}.mce-glsr-btn.mce-btn button{box-sizing:border-box;padding:0 8px}.wp-media-buttons button.glsr-mce-button{outline:none;padding-left:5px;margin-right:0}button.glsr-mce-button:after{display:inline-block;position:relative;top:-1px;left:-1px;width:0;height:0;content:"";border-top:6px solid #777;border-right:4px solid transparent;border-left:4px solid transparent}button.glsr-mce-button.active:after{top:-2px;border-top:0;border-bottom:6px solid #32373c}button.glsr-mce-button:active{margin-bottom:5px}button.glsr-mce-button .wp-media-buttons-icon:before{content:"\f459";font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:782px){button.glsr-mce-button .wp-media-buttons-icon:before{font-size:20px!important}}div.sc-wrap{margin-right:1px}body.branch-4 i.mce-i-checkbox,body.branch-4-1 i.mce-i-checkbox,body.branch-4-2 i.mce-i-checkbox{background-image:none}body.branch-4 .glsr-mce-menu .glsr-mce-menu-item:hover,body.branch-4-1 .glsr-mce-menu .glsr-mce-menu-item:hover,body.branch-4-2 .glsr-mce-menu .glsr-mce-menu-item:hover{background:#0073aa;color:#fff}#geminilabs-site-reviews_review.postbox .inside{padding:0;margin:0}.glsr-metabox-table{width:auto;padding:0 12px 12px;margin-top:12px}.glsr-metabox-table td{line-height:1.5;vertical-align:top;padding:0 14px 8px 0}.glsr-metabox-table td:first-child{font-weight:600}.glsr-metabox-table td:last-child{padding-bottom:0}.revert-action{line-height:23px;text-align:right;border-top:1px solid #ddd;background:#f5f5f5;padding:10px}.revert-action .spinner{float:none}.glsr-search-box .description{display:block}.glsr-assigned-post{display:block;margin-left:20px}.glsr-remove-button{position:absolute;left:-4px;width:20px;height:20px;border:none;margin:0;padding:0;background:0 0;cursor:pointer;text-indent:0}.glsr-remove-button:focus .glsr-remove-icon:before,.glsr-remove-button:hover .glsr-remove-icon:before{color:#c00}.glsr-remove-icon:before{margin-left:0;border-radius:50%;color:#0073aa;line-height:1.28;background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.branch-4 .notice-warning{border-color:#ffba00}.glsr-progress{position:relative;display:block;width:300px;height:24px;opacity:.65;text-align:center}@media screen and (max-width:782px){.glsr-progress{height:39px;font-size:16px}}.glsr-progress.active{opacity:1}.glsr-progress *{box-sizing:border-box}.glsr-progress-background,.glsr-progress-bar{height:100%;background-size:40px 40px}.glsr-progress.active .glsr-progress-background,.glsr-progress.active .glsr-progress-bar{transition:width .6s ease;animation:a 1s linear infinite}.glsr-progress-bar{position:relative;width:0;color:#fff;background-color:#616b75;background-image:linear-gradient(-45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);box-shadow:0 1px 0 #4a5259;border-width:1px;border-style:solid;border-color:#616b75 #4a5259 #4a5259;border-radius:3px 0 0 3px;overflow:hidden;z-index:1}.glsr-progress-bar[style="width: 0%;"]{border-width:0}.glsr-progress-bar[style="width: 100%;"]{border-radius:3px}.glsr-progress-background{position:absolute;top:0;left:0;width:100%;height:25px;background-color:#f7f7f7;background-image:linear-gradient(-45deg,#fff 25%,transparent 0,transparent 50%,#fff 0,#fff 75%,transparent 0,transparent);border-radius:3px;box-shadow:inset 0 1px 2px #e5e5e5;border:1px solid #ccc}@media screen and (max-width:782px){.glsr-progress-background{height:40px}}.glsr-progress span{position:absolute;width:300px;left:0;top:0;line-height:23px;color:#555;padding:0 6px}@media screen and (max-width:782px){.glsr-progress span{line-height:38px}}.glsr-progress-bar>span{color:#fff;text-shadow:0 -1px 1px #4a5259,1px 0 1px #4a5259,0 1px 1px #4a5259,-1px 0 1px #4a5259}@keyframes a{0%{background-position:0 0}to{background-position:40px 0}}.glsr-progress.blue .glsr-progress-bar{background-color:#0073aa;box-shadow:0 1px 0 #006799;border-color:#0073aa #006799 #006799}.glsr-progress.blue .glsr-progress-bar>span{text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.glsr-progress.green .glsr-progress-bar{background-color:#46b44f;box-shadow:0 1px 0 #3fa247;border-color:#46b44f #3fa247 #3fa247}.glsr-progress.green .glsr-progress-bar>span{text-shadow:0 -1px 1px #3fa247,1px 0 1px #3fa247,0 1px 1px #3fa247,-1px 0 1px #3fa247}.star-rating .glsr-star{width:16px;font-size:16px;line-height:20px;color:#555}.glsr-card code,.glsr-card pre{white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-card pre{border:1px solid #e5e5e5;border-radius:3px;position:relative;background-color:#f9f9f9;overflow:visible;padding:0}.glsr-card pre code{background:none;max-height:inherit;height:100%;padding:.5em;display:block;overflow:auto}.glsr-card dd{margin:1em 0}.glsr-card dt{font-weight:600;margin:1em 0}.glsr-card code a{text-decoration:none}.wrap h2.nav-tab-wrapper{padding-top:0;margin-top:9px}.float-left{float:left;padding-right:.25em}.glsr-subsubsub{float:none;text-align:left}.glsr-log[readonly]{width:100%;background-color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,87%,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);color:rgba(50,55,60,.75);font-family:"Operator Mono","Fira Code",monaco,monospace;font-weight:300;font-size:13px;-webkit-font-smoothing:antialiased!important;resize:vertical;white-space:pre;overflow:auto;padding:3px 6px}@media only screen and (max-width:782px){.glsr-card{max-width:inherit}}tr.glsr-field li,tr.glsr-field ul{margin:0 auto}.glsr-field ul.inline li{display:inline}.glsr-field ul.inline li:not(:last-child){margin-right:1em}.glsr-field{margin:1em 0;line-height:1.5}.glsr-field>label{display:block}@media screen and (max-width:782px){.glsr-field>label+input.small-text{margin-left:0}}.glsr-field>ul{margin:0}.glsr-field>ul li{margin-bottom:2px}.glsr-field textarea.code,.post-type-site-review .code,.post-type-site-review code{font-family:"Operator Mono","Fira Code",monaco,monospace}body.branch-4 .wrap h1.page-title,body.branch-4-1 .wrap h1.page-title,body.branch-4-2 .wrap h1.page-title{font-size:23px;font-weight:400;line-height:29px;padding:9px 15px 4px 0;margin:0}body.branch-4 .wrap h2.title,body.branch-4-1 .wrap h2.title,body.branch-4-2 .wrap h2.title{color:#23282d;font-size:1.3em;font-weight:600;line-height:1.4em;padding:0;margin:1em 0}body.branch-4 .glsr-card,body.branch-4-1 .glsr-card{position:relative;margin-top:20px;padding:.7em 2em 1em;min-width:255px;max-width:520px;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff}.glsr-hidden{display:none}.glsr-search-box,.glsr-strings-form{position:relative;max-width:800px}.glsr-search-box *,.glsr-strings-form *{box-sizing:border-box}.glsr-search-box{position:relative;margin:1em 0}.glsr-search-box.is-active .spinner{visibility:visible}.glsr-search-box.is-active input[type=search]::-webkit-search-cancel-button{display:none}.glsr-spinner{visibility:hidden;position:absolute;top:6px;right:5px;height:20px;width:20px;background-color:#fff;z-index:5}.glsr-spinner .spinner{margin:0}.loading-content .glsr-spinner{visibility:visible}.glsr-search-input{position:relative;width:100%;font-weight:300;line-height:1.5;padding:3px 5px;margin:0;z-index:2}.site-review_page_settings .glsr-search-input{height:32px;font-size:16px}.glsr-search-results{position:absolute;width:100%;max-height:310px;overflow-x:scroll;-webkit-overflow-scrolling:touch;background-color:#fff;border:1px solid #ddd;border-top:none;box-sizing:border-box;box-shadow:0 1px 1px rgba(0,0,0,.04);margin-top:-1px;z-index:1}.glsr-search-results>div,.glsr-search-results>span{position:relative;display:block;box-sizing:border-box;height:32px;line-height:32px;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #f5f5f5;padding:0 10px;margin-top:-1px;overflow:hidden}.glsr-search-results>div{background-color:#f6fbfd}.glsr-search-results>span:last-of-type{border-bottom-color:transparent}.glsr-search-results>span:active,.glsr-search-results>span:focus,.glsr-search-results>span:hover{color:#fff;background-color:#00a0d2;cursor:pointer;outline:none}.glsr-strings-form{transition:opacity .2s linear}.glsr-focus .glsr-strings-form{opacity:.2;pointer-events:none}.glsr-string-td1,.glsr-string-td2{border-top:none;border-bottom:1px solid #f1f1f1;padding:13px 15px}.glsr-string-td1{max-width:375px;background:#f9f9f9;border-right:1px solid #e1e1e1;border-bottom:1px solid #eee;vertical-align:top}.glsr-string-td2{width:60%;max-width:375px;background-color:#fff}.glsr-strings-table p:not(.row-actions){font-size:14px;font-weight:400;line-height:1.3;color:#000}.glsr-strings-table p.row-actions{margin:0}.glsr-strings-table textarea{display:block;width:100%;margin:0}.glsr-strings-table input[type=text]{display:block;width:100%;margin:0 0 5px}.glsr-strings-table input[type=text]:last-of-type{margin-bottom:0}.glsr-strings-table input[type=text]:active,.glsr-strings-table input[type=text]:focus{position:relative}.glsr-string-tr:last-child .glsr-string-td2,.glsr-string-tr:not(.is-expanded):last-child .glsr-string-td1{border-bottom:none}@media screen and (max-width:782px){.glsr-search-results>span{padding:0 10px}.glsr-string-td1{max-width:none;border-right:none}.glsr-string-td2{max-width:none;padding:13px 15px!important}.glsr-spinner{right:10px}}.glsr-string-tr.ui-sortable-helper{opacity:.8;display:table;box-shadow:0 1px 2px rgba(0,0,0,.1)}.ui-sortable .glsr-string-tr:hover{cursor:move}.ui-sortable-placeholder+.glsr-string-tr .glsr-string-td1{border-top:1px solid #eee}@media screen and (min-width:783px){.ui-sortable-placeholder+.glsr-string-tr .glsr-string-td2{border-top:1px solid #f1f1f1}}.ui-sortable-helper .glsr-string-td1{border-left:1px solid #999}.ui-sortable-helper .glsr-string-td1,.ui-sortable-helper .glsr-string-td2{border-top:1px solid #999!important;border-bottom:1px solid #999!important}.ui-sortable-helper .glsr-string-td2{border-right:1px solid #999}@media screen and (max-width:782px){.ui-sortable-helper .glsr-string-td1{border:1px solid #999}.ui-sortable-helper.is-expanded .glsr-string-td1{border-bottom:none!important}.ui-sortable-helper.is-expanded .glsr-string-td2{border:1px solid #999;border-top-color:#f1f1f1!important}}.glsr-status{max-width:1000px}.glsr-status th.site{width:25%}.glsr-status td{vertical-align:middle}.glsr-status td.site{font-weight:600}.glsr-status td.site span{font-weight:400;font-size:90%}.glsr-status .toggle-row{top:0}.glsr-status .toggle-row:before{top:6px}@media only screen and (min-width:783px){.glsr-status td.total-fetched,.glsr-status th.total-fetched{text-align:center}}@media only screen and (max-width:782px){.glsr-status th.site,.glsr-status tr:not(.inline-edit-row):not(.no-items) td.site{display:table-cell!important;width:230px!important;vertical-align:top;padding:8px 10px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:not(.site){overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 10px 0 260px;margin-left:-250px;margin-bottom:8px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:before{width:240px}}@media only screen and (max-width:691px){.glsr-status th.site,.glsr-status tr:not(.inline-edit-row):not(.no-items) td.site{width:200px!important}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:not(.site){padding-left:230px;margin-left:-220px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:before{width:210px}}@media only screen and (max-width:600px){.glsr-status th.site,.glsr-status tr:not(.inline-edit-row):not(.no-items) td.site{width:170px!important}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:not(.site){padding-left:200px;margin-left:-190px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:before{width:180px}}@media only screen and (max-width:480px){.glsr-status th.site,.glsr-status tr:not(.inline-edit-row):not(.no-items) td.site{width:130px!important}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:not(.site){padding-left:160px;margin-left:-150px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:before{width:140px}}@media only screen and (max-width:425px){.glsr-status td:before{font-weight:600}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:not(.site){padding-left:10px}.glsr-status tr:not(.inline-edit-row):not(.no-items) td.total-fetched~td:before{position:static}}body.branch-4 .glsr-status.striped>tbody>:nth-child(odd),body.branch-4-1 .glsr-status.striped>tbody>:nth-child(odd){background-color:#f9f9f9}body.branch-4 .glsr-status .toggle-row,body.branch-4-1 .glsr-status .toggle-row,body.branch-4-2 .glsr-status .toggle-row{display:none;position:absolute;top:10px;right:8px;width:40px;height:40px;border:none;outline:none;background:transparent;padding:0}body.branch-4 .glsr-status .toggle-row:hover,body.branch-4-1 .glsr-status .toggle-row:hover,body.branch-4-2 .glsr-status .toggle-row:hover{cursor:pointer}body.branch-4 .glsr-status .toggle-row:focus:before,body.branch-4-1 .glsr-status .toggle-row:focus:before,body.branch-4-2 .glsr-status .toggle-row:focus:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}body.branch-4 .glsr-status .toggle-row:active,body.branch-4-1 .glsr-status .toggle-row:active,body.branch-4-2 .glsr-status .toggle-row:active{box-shadow:none}body.branch-4 .glsr-status .toggle-row:before,body.branch-4-1 .glsr-status .toggle-row:before,body.branch-4-2 .glsr-status .toggle-row:before{display:block;position:absolute;top:-5px;left:10px;border-radius:50%;color:#666;content:"\f140";font:normal 20px/1 "dashicons";line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:none;padding:1px 2px 1px 0}body.branch-4 .glsr-status .is-expanded .toggle-row:before,body.branch-4-1 .glsr-status .is-expanded .toggle-row:before,body.branch-4-2 .glsr-status .is-expanded .toggle-row:before{content:"\f142"}@media screen and (max-width:782px){body.branch-4 .glsr-status .column-primary,body.branch-4-1 .glsr-status .column-primary,body.branch-4-2 .glsr-status .column-primary{width:100%}body.branch-4 .glsr-status .column-primary~td,body.branch-4 .glsr-status .column-primary~th,body.branch-4-1 .glsr-status .column-primary~td,body.branch-4-1 .glsr-status .column-primary~th,body.branch-4-2 .glsr-status .column-primary~td,body.branch-4-2 .glsr-status .column-primary~th{display:none}body.branch-4 .glsr-status .column-primary .toggle-row,body.branch-4-1 .glsr-status .column-primary .toggle-row,body.branch-4-2 .glsr-status .column-primary .toggle-row{display:block}body.branch-4 .glsr-status td,body.branch-4-1 .glsr-status td,body.branch-4-2 .glsr-status td{position:relative;clear:both;display:block;width:auto!important}body.branch-4 .glsr-status td.column-primary,body.branch-4-1 .glsr-status td.column-primary,body.branch-4-2 .glsr-status td.column-primary{padding-right:50px}body.branch-4 .glsr-status td.column-primary~td:not(.check-column),body.branch-4-1 .glsr-status td.column-primary~td:not(.check-column),body.branch-4-2 .glsr-status td.column-primary~td:not(.check-column){padding:3px 8px 3px 35%}body.branch-4 .glsr-status td:not(.column-primary):before,body.branch-4-1 .glsr-status td:not(.column-primary):before,body.branch-4-2 .glsr-status td:not(.column-primary):before{position:absolute;left:10px;display:block;overflow:hidden;width:32%;content:attr(data-colname);white-space:nowrap;text-overflow:ellipsis}body.branch-4 .glsr-status .is-expanded td:not(.hidden),body.branch-4-1 .glsr-status .is-expanded td:not(.hidden),body.branch-4-2 .glsr-status .is-expanded td:not(.hidden){display:block;overflow:hidden}body.branch-4-1.post-type-review .fixed .column-rating,body.branch-4-1.post-type-review .fixed .column-reviewer,body.branch-4-1.post-type-review .fixed .column-site,body.branch-4-1.post-type-review .fixed .column-stars,body.branch-4-2.post-type-review .fixed .column-rating,body.branch-4-2.post-type-review .fixed .column-reviewer,body.branch-4-2.post-type-review .fixed .column-site,body.branch-4-2.post-type-review .fixed .column-stars,body.branch-4.post-type-review .fixed .column-rating,body.branch-4.post-type-review .fixed .column-reviewer,body.branch-4.post-type-review .fixed .column-site,body.branch-4.post-type-review .fixed .column-stars{display:none}}.hide-column-tog+.pinned-icon+svg,.post-type-site-review .wp-list-table .approve,.post-type-site-review .wp-list-table .status-pending .unapprove{display:none}.post-type-site-review .wp-list-table .spam .approve,.post-type-site-review .wp-list-table .status-pending .approve,.post-type-site-review .wp-list-table .trash .approve{display:inline}.post-type-site-review .wp-list-table .approve a{color:#006505}.post-type-site-review .wp-list-table .approve a:hover{color:#007f06}.post-type-site-review .wp-list-table .unapprove a{color:#d98500}.post-type-site-review .wp-list-table .unapprove a:hover{color:#f39500}.post-type-site-review .wp-list-table th.column-stars{width:100px}.post-type-site-review .wp-list-table td.column-sticky i{line-height:24px;text-indent:-3px;cursor:pointer}.post-type-site-review .wp-list-table td.column-sticky i:not(.pinned){color:rgba(85,85,85,.2)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending th.check-column{box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td:nth-child(2){box-shadow:inset 0 1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending:not(.is-expanded) td:nth-child(2){box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending.is-expanded td:last-child,.post-type-site-review .wp-list-table tr.status-pending:not(.is-expanded) td:nth-child(2),.post-type-site-review .wp-list-table tr.status-pending th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending td,.post-type-site-review .wp-list-table tr.status-pending th.check-column{background-color:#fef7f1}.post-type-site-review .wp-list-table tr.status-pending th.check-column{position:relative;border-left:4px solid #d54e21;z-index:1}.post-type-site-review .wp-list-table tr.status-pending th.check-column input{margin-left:4px}@media screen and (max-width:782px){body.branch-4-1.post-type-site-review .wp-list-table .column-title,body.branch-4-2.post-type-site-review .wp-list-table .column-title,body.branch-4.post-type-site-review .wp-list-table .column-title{width:auto}body.branch-4-1.post-type-site-review .wp-list-table .column-title~[class*=column-]:not(.column-stars),body.branch-4-2.post-type-site-review .wp-list-table .column-title~[class*=column-]:not(.column-stars),body.branch-4.post-type-site-review .wp-list-table .column-title~[class*=column-]:not(.column-stars){display:none}body.branch-4-1.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td.column-stars,body.branch-4-2.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td.column-stars,body.branch-4.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td.column-stars{box-shadow:inset 0 1px 0 rgba(0,0,0,.07)}body.branch-4-1.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending:not(.is-expanded) td.column-stars,body.branch-4-2.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending:not(.is-expanded) td.column-stars,body.branch-4.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending:not(.is-expanded) td.column-stars{box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}body.branch-4-1.post-type-site-review .wp-list-table tr.status-pending:not(.is-expanded) td.column-stars,body.branch-4-2.post-type-site-review .wp-list-table tr.status-pending:not(.is-expanded) td.column-stars,body.branch-4.post-type-site-review .wp-list-table tr.status-pending:not(.is-expanded) td.column-stars{box-shadow:inset 0 -1px 0 rgba(0,0,0,.07)}}@media screen and (min-width:783px){body.branch-4-1.post-type-site-review .wp-list-table th.column-sticky,body.branch-4-2.post-type-site-review .wp-list-table th.column-sticky,body.branch-4-3.post-type-site-review .wp-list-table th.column-sticky,body.branch-4.post-type-site-review .wp-list-table th.column-sticky{position:relative}body.branch-4-1.post-type-site-review .wp-list-table .dashicons-sticky:before,body.branch-4-1.post-type-site-review .wp-list-table th.column-sticky a:after,body.branch-4-2.post-type-site-review .wp-list-table .dashicons-sticky:before,body.branch-4-2.post-type-site-review .wp-list-table th.column-sticky a:after,body.branch-4-3.post-type-site-review .wp-list-table .dashicons-sticky:before,body.branch-4-3.post-type-site-review .wp-list-table th.column-sticky a:after,body.branch-4.post-type-site-review .wp-list-table .dashicons-sticky:before,body.branch-4.post-type-site-review .wp-list-table th.column-sticky a:after{display:none}body.branch-4-1.post-type-site-review .wp-list-table th.column-sticky svg,body.branch-4-2.post-type-site-review .wp-list-table th.column-sticky svg,body.branch-4-3.post-type-site-review .wp-list-table th.column-sticky svg,body.branch-4.post-type-site-review .wp-list-table th.column-sticky svg{position:absolute;top:10px;width:16px;height:16px}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td{box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending td{box-shadow:inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table th.column-assigned_to,.post-type-site-review .wp-list-table th.column-reviewer,.post-type-site-review .wp-list-table th.column-taxonomy-site-review-category,.post-type-site-review .wp-list-table th.column-type{width:120px}.post-type-site-review .wp-list-table th.column-sticky{width:36px}.post-type-site-review .wp-list-table th.column-sticky span.pinned-icon,.post-type-site-review .wp-list-table th.column-sticky span.sorting-indicator{display:none}.post-type-site-review .wp-list-table th.column-sticky a:after{display:inline-block;position:relative;content:"\f537";font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px;height:20px;line-height:20px;font-size:16px;text-align:center;transition:color .1s ease-in 0}.post-type-site-review .wp-list-table td.column-sticky{padding:8px}.post-type-site-review .wp-list-table td.column-sticky i{text-indent:0}}@media (max-width:480px),screen and (max-width:1100px) and (min-width:782px){body.branch-4-1.post-type-site-review .wp-list-table th.column-date,body.branch-4-2.post-type-site-review .wp-list-table th.column-date,body.branch-4-3.post-type-site-review .wp-list-table th.column-date,body.branch-4.post-type-site-review .wp-list-table th.column-date{width:14%}}::-ms-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}::placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}::-webkit-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}:-moz-placeholder,::-moz-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}:-ms-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}.glsr-field small code{font-size:inherit;padding:0 3px 1px}
|
|
assets/css/site-reviews.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}
|
|
assets/css/twenty-eleven.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#009781;font-size:15px}.gslr-has-errors{color:#bd3500}h3.glsr-form-title{color:#373737;font-size:24px;font-weight:bold;line-height:30px;text-transform:none;letter-spacing:normal}.glsr-form-description{font-size:13px;margin:10px 0}.glsr-form-description span{color:#bd3500}.entry-content .glsr-field input[type=email],.entry-content .glsr-field input[type=text],.entry-content .glsr-field input[type=url],.entry-content .glsr-field textarea,.one .glsr-field input[type=email],.one .glsr-field input[type=text],.one .glsr-field input[type=url],.one .glsr-field textarea{padding:10px}@media (max-width:800px){.entry-content .glsr-field input[type=email],.entry-content .glsr-field input[type=text],.entry-content .glsr-field input[type=url],.entry-content .glsr-field textarea,.one .glsr-field input[type=email],.one .glsr-field input[type=text],.one .glsr-field input[type=url],.one .glsr-field textarea{padding:6px}}.glsr-field-error{color:#bd3500;font-size:13px}.glsr-field label{font-size:13px}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:#bd3500;line-height:13px;font-size:22px;font-weight:600;vertical-align:middle}.glsr-field input[type=email],.glsr-field input[type=text],.glsr-field input[type=url],.glsr-field textarea{position:relative;display:block;width:100%;border-radius:3px;box-sizing:border-box;padding:6px}.glsr-field input[type=submit]{position:relative;background:#222;border:none;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.3);color:#eee;cursor:pointer;text-shadow:0 -1px 0 rgba(0,0,0,.3);padding:5px 22px}.glsr-field input[type=submit]:active{background:#1982d1;color:#bfddf3}.glsr-loader{bottom:1.625em}
|
|
assets/css/twenty-fifteen.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#21759b}.gslr-has-errors{color:#c0392b}.shortcode-reviews-form{border-top:1px solid #eaeaea;border-top:1px solid rgba(51,51,51,.1);padding-top:1.6em}.shortcode-reviews-form>:last-child{margin-bottom:0}@media screen and (min-width:46.25em){.shortcode-reviews-form{padding-top:1.64706em}}@media screen and (min-width:55em){.shortcode-reviews-form{padding-top:1.68421em}}@media screen and (min-width:59.6875em){.shortcode-reviews-form{padding-top:1.6em}}@media screen and (min-width:68.75em){.shortcode-reviews-form{padding-top:1.64706em}}@media screen and (min-width:77.5em){.shortcode-reviews-form{padding-top:1.68421em}}.shortcode-reviews-form h3.glsr-form-title{font-family:"Noto Serif",serif;font-size:18px;font-size:1.8rem;line-height:1.33333;margin-top:0;margin-bottom:1.33333em}@media screen and (min-width:46.25em){.shortcode-reviews-form h3.glsr-form-title{font-size:24px;font-size:2.4rem;line-height:1.16667;margin-bottom:1.16667em}}@media screen and (min-width:55em){.shortcode-reviews-form h3.glsr-form-title{font-size:27px;font-size:2.7rem;line-height:1.18519;margin-bottom:1.18519em}}@media screen and (min-width:59.6875em){.shortcode-reviews-form h3.glsr-form-title{font-size:18px;font-size:1.8rem;line-height:1.33333;margin-bottom:1.33333em}}@media screen and (min-width:68.75em){.shortcode-reviews-form h3.glsr-form-title{font-size:24px;font-size:2.4rem;line-height:1.16667;margin-bottom:1.16667em}}@media screen and (min-width:77.5em){.shortcode-reviews-form h3.glsr-form-title{font-size:27px;font-size:2.7rem;line-height:1.18519;margin-bottom:1.18519em}}.glsr-form-description{color:#707070;color:rgba(51,51,51,.7);margin-bottom:2em}.glsr-form-description span{color:#c0392b}.glsr-field-error,.glsr-form-description{font-family:"Noto Sans",sans-serif;font-size:12px;font-size:1.2rem;line-height:1.5}@media screen and (min-width:46.25em){.glsr-field-error,.glsr-form-description{font-size:14px;font-size:1.4rem}}@media screen and (min-width:55em){.glsr-field-error,.glsr-form-description{font-size:16px;font-size:1.6rem}}@media screen and (min-width:59.6875em){.glsr-field-error,.glsr-form-description{font-size:12px;font-size:1.2rem}}@media screen and (min-width:68.75em){.glsr-field-error,.glsr-form-description{font-size:14px;font-size:1.4rem}}@media screen and (min-width:77.5em){.glsr-field-error,.glsr-form-description{font-size:16px;font-size:1.6rem}}.glsr-field{margin-bottom:1.6em}.glsr-field:last-child{margin-bottom:0}.glsr-field-error{color:#c0392b}.glsr-field label{color:#707070;color:rgba(51,51,51,.7);font-family:"Noto Sans",sans-serif;font-size:12px;font-size:1.2rem;font-weight:700;letter-spacing:.04em;line-height:1.5;text-transform:uppercase}@media screen and (min-width:46.25em){.glsr-field label{font-size:14px;font-size:1.4rem}}@media screen and (min-width:55em){.glsr-field label{font-size:16px;font-size:1.6rem}}@media screen and (min-width:59.6875em){.glsr-field label{font-size:12px;font-size:1.2rem}}@media screen and (min-width:68.75em){.glsr-field label{font-size:14px;font-size:1.4rem}}@media screen and (min-width:77.5em){.glsr-field label{font-size:16px;font-size:1.6rem}}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:#c0392b}.glsr-field input[type=checkbox]:focus{outline:none}.glsr-field input[type=submit]{width:100%}@media screen and (min-width:46.25em){.glsr-field{margin-bottom:1.6471em}}@media screen and (min-width:55em){.glsr-field{margin-bottom:1.6842em}}@media screen and (min-width:59.6875em){.glsr-field{margin-bottom:1.6em}}@media screen and (min-width:68.75em){.glsr-field{margin-bottom:1.6471em}}@media screen and (min-width:77.5em){.glsr-field{margin-bottom:1.6842em}}.glsr-review-response{margin-top:1.6em}.glsr-loader{bottom:12px}@media screen and (min-width:46.25em){.glsr-loader{bottom:16px}}@media screen and (min-width:55em){.glsr-loader{bottom:20px}}@media screen and (min-width:59.6875em){.glsr-loader{bottom:12px}}@media screen and (min-width:68.75em){.glsr-loader{bottom:16px}}@media screen and (min-width:77.5em){.glsr-loader{bottom:20px}}.widget .glsr-review-title{margin-bottom:1em}
|
|
assets/css/twenty-fourteen.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#21759b}.gslr-has-errors{color:#c0392b}h3.glsr-form-title{font:900 16px/1.5 Lato,sans-serif;text-transform:uppercase;margin-top:0;margin-bottom:24px}.glsr-form-description span{color:#c0392b}.shortcode-reviews-form .glsr-form-description{font-size:14px;line-height:1.71429;color:#767676}.glsr-field{margin-bottom:24px}.glsr-field-error,.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:#c0392b}.glsr-field input[type=email],.glsr-field input[type=text],.glsr-field input[type=url]{width:100%}@media screen and (max-width:1079px){#secondary .gl-star-rating[data-star-rating] .gl-star-rating-stars>span{width:21px;height:21px;background-size:21px}#secondary .gl-star-rating-ltr[data-star-rating] .gl-star-rating-stars>span:last-child{margin-right:0}#secondary .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-child{margin-left:0}}.footer-sidebar .glsr-review-response,.primary-sidebar .glsr-review-response{background-color:hsla(0,0%,100%,.075)}.footer-sidebar .glsr-review-response:before,.primary-sidebar .glsr-review-response:before{border-color:hsla(0,0%,100%,.075) transparent}.glsr-loader{bottom:100px}
|
|
assets/css/twenty-seventeen.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-loader{bottom:7em}@media screen and (min-width:48em){.glsr-loader{bottom:7.5em}}
|
|
assets/css/twenty-sixteen.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-title{font-family:Montserrat,"Helvetica Neue",sans-serif;font-size:23px;font-size:1.4375rem;font-weight:700;line-height:1.3125;border-top:4px solid #1a1a1a;padding-top:1.21739em;margin-bottom:1.21739em}.glsr-form-description{color:#686868;font-size:13px;font-size:.8125rem;line-height:1.61538;margin-bottom:2.15385em}.glsr-form-description span{color:#007acc}.glsr-form-messages{color:#007acc;font-family:Montserrat,"Helvetica Neue",sans-serif}.gslr-has-errors{color:#e4002e}.glsr-field{margin-bottom:1.75em}.glsr-field-error{color:#e4002e;font-size:13px;font-size:.8125rem;line-height:1.61538}.glsr-field-error:first-child{margin-top:.53846em}.glsr-field label:not([for^=terms]){font-family:Montserrat,"Helvetica Neue",sans-serif;color:#686868;font-size:13px;font-size:.8125rem;letter-spacing:.07692em;line-height:1.61538;margin-bottom:.53846em;text-transform:uppercase}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{font-family:Merriweather,Georgia,serif;color:#007acc}.glsr-field ::-webkit-input-placeholder{font-family:Merriweather,Georgia,serif}.glsr-field :-moz-placeholder,.glsr-field ::-moz-placeholder{font-family:Merriweather,Georgia,serif}.glsr-field :-ms-input-placeholder{font-family:Merriweather,Georgia,serif}.glsr-loader{bottom:2.947368421em;font-size:1.1875rem;margin:14px 0}@media screen and (min-width:44.375em){.glsr-loader{bottom:4.421052632em}}@media screen and (min-width:61.5625em){.glsr-loader{bottom:5.894736842em}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:5px}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:5px}
|
|
assets/css/twenty-ten.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#2b54d6}.gslr-has-errors{color:#ff4b33}.shortcode-reviews-form{position:relative;border-top:1px solid #e7e7e7;margin:24px 0}#content .glsr-form-title,.glsr-form-title{color:#000;font-size:20px;font-weight:600;font-family:"Helvetica Neue",Arial,Helvetica,"Nimbus Sans L",sans-serif;margin:18px 0}.glsr-form-description span{color:#ff4b33}.glsr-field{margin:0 0 9px}.glsr-field-error,.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:#ff4b33}.glsr-field input[type=email],.glsr-field input[type=text],.glsr-field input[type=url]{width:98%;margin:0}.glsr-field textarea{width:98%}#content .glsr-review-response p{margin-bottom:1em}#content .glsr-review-response p:last-of-type{margin-bottom:0}
|
|
assets/css/twenty-thirteen.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#21759b}.glsr-form-description span,.gslr-has-errors{color:#ed331c}.glsr-field{margin-bottom:12px}.glsr-field-error,.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:#ed331c}.glsr-field input[type=email],.glsr-field input[type=text],.glsr-field input[type=url],.glsr-field textarea{width:100%}#secondary .glsr-review-response{background-color:hsla(0,0%,100%,.075)}#secondary .glsr-review-response:before{border-color:hsla(0,0%,100%,.075) transparent}
|
|
assets/css/twenty-twelve.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 4px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-filled.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}.gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}[id^=geminilabs-site-reviews].widget ul.glsr-reviews{list-style:none}[id^=geminilabs-site-reviews].widget .glsr-review-title,[id^=geminilabs-site-reviews].widget p{margin-bottom:1em}.glsr-reviews{position:relative}.glsr-reviews:after{content:"";display:table;clear:both}.glsr-ajax-navigation,.glsr-navigation,.glsr-review{opacity:1;transition:opacity .5s}.glsr-hide .glsr-ajax-navigation,.glsr-hide .glsr-navigation,.glsr-hide .glsr-review{opacity:0!important}.glsr-hide .glsr-loader{display:block}.glsr-review{margin-bottom:3em}.glsr-review p{white-space:pre-line;margin:0 0 1em}.glsr-review-assigned{display:block;font-style:italic}.glsr-review-date{font-style:italic}.glsr-review-date,.glsr-review-link{white-space:nowrap}.glsr-review-avatar{margin:-8px 0 0;width:36px;height:36px}.glsr-review-avatar img{height:100%;-o-object-fit:cover;object-fit:cover}.glsr-star-empty,.glsr-star-full,.glsr-star-half{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}@media screen and (min-width:56.875em){.glsr-widget [class*=glsr-star-]{width:16px;height:16px;background-size:16px}.glsr-widget .glsr-review-avatar{width:30px;height:30px}}.glsr-star-empty{background-image:url(../img/star-empty.svg)}.glsr-star-full{background-image:url(../img/star-filled.svg)}.glsr-star-half{background-image:url(../img/star-half.svg)}.glsr-hidden{display:none}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026";margin-right:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-review-response{position:relative;font-size:.875em;background-color:rgba(0,0,0,.075);border-radius:2px;padding:1em;margin-top:1.5rem}.glsr-review-response p:last-of-type{margin-bottom:0}.glsr-review-response:before{content:"";display:block;position:absolute;top:-18px;height:0;width:0;border-style:solid;border-color:rgba(0,0,0,.075) transparent}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-reviews .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-ltr [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-left:0}.glsr-ltr .glsr-review-excerpt>span:not(:last-child),.glsr-ltr .glsr-review-meta>span:not(:last-child){margin-right:.5em}.glsr-ltr .glsr-review-avatar{float:left;margin-right:12px}.glsr-ltr .glsr-review-response:before{left:50px;border-width:0 24px 18px 0}.glsr-rtl [id^=geminilabs-site-reviews].widget ul.glsr-reviews{margin-right:0}.glsr-rtl .glsr-review-excerpt>span:not(:last-child),.glsr-rtl .glsr-review-meta>span:not(:last-child){margin-left:.5em}.glsr-rtl .glsr-review-avatar{float:right;margin-left:12px}.glsr-rtl .glsr-review-response:before{right:50px;border-width:0 0 18px 24px}.gl-star-rating[data-star-rating]{line-height:1}.glsr-field-messages{color:#1976d2}.glsr-has-error,.glsr-has-errors{color:#d32f2f}.glsr-field{margin-bottom:1em}.glsr-field-error{display:block;font-size:.875em;color:#d32f2f}.glsr-field ul{list-style-type:none}.glsr-field label{display:block}.glsr-field label[for^=terms]{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{content:"*";color:#d32f2f}.glsr-field select[name=rating]{display:block;height:26px}.glsr-field select[name=rating]:after,.glsr-field select[name=rating]:before{display:none!important}.glsr-recaptcha-holder{margin-top:1em}.glsr-field button[type=submit] span{display:none}.glsr-field button[type=submit][disabled] span{display:inline;position:relative}.glsr-field button[type=submit] span:after,.glsr-field button[type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:b .6s infinite linear}.glsr-field button[type=submit] span:before{border-top-color:transparent;opacity:.5}.glsr-field button[type=submit] span:after{border-color:transparent;border-top-color:currentColor}@keyframes b{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.glsr-ltr .glsr-field.glsr-required label:after,.glsr-ltr .glsr-field label[for^=rating]:after{margin-left:.33em}.glsr-ltr .glsr-field input[type=checkbox]{margin-right:.25em}.glsr-ltr .glsr-field button[type=submit][disabled] span{margin-right:1.65em}.glsr-ltr .glsr-field button[type=submit] span:after,.glsr-ltr .glsr-field button[type=submit] span:before{left:0}.glsr-rtl .glsr-field.glsr-required label:after,.glsr-rtl .glsr-field label[for^=rating]:after{margin-right:.33em}.glsr-rtl .glsr-field input[type=checkbox]{margin-left:.25em}.glsr-rtl .glsr-field button[type=submit][disabled] span{margin-left:1.65em}.glsr-rtl .glsr-field button[type=submit] span:after,.glsr-rtl .glsr-field button[type=submit] span:before{right:0}.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-summary .glsr-review-rating{display:inline-block}.glsr-summary [class*=glsr-star-]{width:26px;height:26px;background-size:24px}.glsr-summary-rating{line-height:1.25;font-size:24px;font-weight:700}.glsr-summary-text{display:block;font-size:14px}.glsr-percentage-bars{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5;margin-bottom:1em}.glsr-bar{display:table-row;white-space:nowrap}.glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-bar-background{position:relative;width:100%}.glsr-bar-background:before{display:block;position:absolute;width:100%;height:12px;content:"";background:rgba(0,0,0,.075)}.glsr-bar-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-bar-count{text-align:right;font-size:14px}.glsr-ltr .glsr-review-rating,.glsr-ltr .glsr-summary-rating{margin-right:10px}.glsr-ltr .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-bar-count{padding-left:10px}.glsr-rtl .glsr-review-rating,.glsr-rtl .glsr-summary-rating{margin-left:10px}.glsr-rtl .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-bar-count{padding-right:10px}.glsr-rtl [class*=glsr-star-]{transform:scaleX(-1)}.glsr-form-messages{color:#0088d0}.gslr-has-errors{color:red}h3.glsr-form-title{margin:24px 0;margin:1.71429rem 0}.glsr-form-description span{color:red}.glsr-field,.shortcode-reviews-form p.glsr-form-description,.widget-area .widget p.glsr-form-description{line-height:1.5;margin:11px 0;margin:.78571rem 0}.glsr-field-error,.glsr-field.glsr-required label:after,.glsr-field label[for^=rating]:after{color:red}.glsr-field label{line-height:1.71429}.glsr-field input[type=email],.glsr-field input[type=text],.glsr-field input[type=url],.glsr-field textarea{width:100%;box-sizing:border-box;font-size:12px;font-size:.85714 rem;line-height:1.71429;padding:10px;padding:.85714 rem}
|
|
assets/images/addon-images.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="1100"><title>images</title><desc>Created with Sketch.</desc><g fill="none"><path fill="#673AB7" d="M0 0h2200v1100H0z"/><path id="Shape" fill="#764EBE" d="M1471.44 1148.7c-5.22-19.06 4.76-39.34 23.6-46.57 11.17-4.3 23.1-3.08 32.82 2.3l9.1 61.06c-3.5 3.6-7.74 6.6-12.62 8.67l-52.9-25.5zm-121.63-58.62c-2.42-17.52 7.4-35.05 24.6-41.66 20.08-7.7 42.58 2.32 50.28 22.38 6.9 17.98-.43 37.93-16.48 47.4l-58.4-28.12zm-120.96-58.3c-.3-15.9 9.25-31.03 24.96-37.06 20.05-7.7 42.55 2.32 50.25 22.38 6.33 16.48.7 34.6-12.65 44.83l-62.57-30.15zm277.9-69.37c-6.06-4.26-10.97-10.33-13.83-17.8-5.04-13.15-2.46-27.36 5.57-37.76l8.27 55.58zM682.6 1170.9c-3.2-3.5-5.8-7.64-7.6-12.33-7.7-20.06 2.3-42.56 22.37-50.26 20.05-7.7 42.56 2.34 50.25 22.4 1.02 2.65 1.73 5.34 2.15 8.04l-67.17 32.17zm82.6-39.57c-1.18-1.94-2.2-4.02-3.05-6.22-7.7-20.04 2.32-42.54 22.38-50.24 20.06-7.7 42.56 2.32 50.26 22.38.06.22.14.43.22.65l-69.83 33.44zm83.92-40.2c-7.33-19.92 2.68-42.1 22.57-49.74 17.9-6.9 37.74.36 47.27 16.26l-69.86 33.47zm85.24-40.82c-2.82-17.74 7.03-35.65 24.5-42.36 15.4-5.9 32.27-1.36 42.74 10.17l-67.24 32.2zm86.74-41.53c.78-14.87 10.12-28.6 24.9-34.28 12.73-4.9 26.43-2.65 36.72 4.75l-61.62 29.52zm87.27-35.03c1.34-14.26 10.53-27.23 24.8-32.7 20.06-7.7 42.56 2.3 50.26 22.36 5.78 15.05 1.58 31.47-9.35 42l-65.7-31.67zm386.46-91.33c-15.3-.36-29.57-9.8-35.4-24.95-7.7-20.05 2.33-42.56 22.4-50.25.56-.23 1.14-.44 1.72-.63l11.28 75.83zm-820.4 213.83l12.38-76.6c12.1 2.86 22.6 11.44 27.38 23.9 7.7 20.06-2.32 42.56-22.38 50.26-5.73 2.2-11.64 2.94-17.36 2.43zM1470.4 718.3l10.75 72.08c-1.56.86-3.2 1.62-4.9 2.28-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.56 22.37-50.26 7.3-2.8 14.93-3.25 22.05-1.73zM697.24 955.14l7.5-46.5c3.62-3.43 7.95-6.23 12.9-8.12 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.05-2.32 42.55-22.38 50.25-18.55 7.12-39.18-.9-48.28-18zm795.36-288.36c-5.64-4.25-10.2-10.07-12.9-17.14-7.7-20.05 2.32-42.56 22.37-50.26 16.6-6.37 34.87-.6 45.04 12.94l-54.5 54.45zM1642 517.56c-9.5-3.94-17.46-11.63-21.44-22-7.7-20.05 2.32-42.55 22.38-50.25 19.75-7.57 41.87 2.03 49.9 21.48L1642 517.56zM728.7 760.34l10-61.9-4.2-4.23c1.1-.53 2.2-1.03 3.37-1.47 20.05-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26-12.86 4.94-26.73 2.6-37.06-5.02zm977.06-437.94l20.87 3.17c9 4.06 16.45 11.54 20.27 21.48 7.7 20.06-2.33 42.56-22.4 50.26-20.04 7.7-42.55-2.3-50.24-22.36-7.7-20.06 2.3-42.56 22.37-50.26 3-1.15 6.06-1.9 9.12-2.28zm87.75 43.83c-14-1.55-26.67-10.68-32.07-24.74-1.4-3.63-2.2-7.33-2.5-11l61.08 9.27-26.5 26.47zM721.1 680.73l-41.55-41.9c1.16-14.47 10.4-27.7 24.85-33.24 20.06-7.7 42.56 2.3 50.26 22.35 7.7 20.06-2.32 42.56-22.38 50.26-3.68 1.4-7.45 2.24-11.2 2.5zm830.84-381.7l76.78 11.68c-1.27 14.36-10.48 27.44-24.83 32.95-20.07 7.7-42.57-2.32-50.27-22.38-2.83-7.36-3.27-15.05-1.7-22.22zm-203.7-30.95l72 10.94c3.9 18.4-6 37.42-24.13 44.37-20.03 7.7-42.54-2.33-50.23-22.4-4.3-11.2-3.07-23.2 2.37-32.93zm95.05 14.44l42.3 6.44c-.77.34-1.54.67-2.34.98-14.12 5.42-29.46 2.05-39.98-7.42zM528.26 486.25c3.93-9.55 11.63-17.53 22.04-21.53 20.07-7.7 42.57 2.32 50.27 22.38 7.63 19.88-2.14 42.15-21.84 50.04l-50.46-50.9zm753.46-286.13l18.1 40.15c-2.34 12.93-11.18 24.37-24.35 29.42-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.05 2.3-42.55 22.37-50.25 11.7-4.5 24.2-2.96 34.13 3.06zm-499.4 75.77l8.4-1.3c16.2-.63 31.73 8.98 37.87 24.95 7.7 20.06-2.3 42.56-22.37 50.26-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.05 2.32-42.56 22.38-50.25 1.32-.52 2.65-.95 3.98-1.3zm60.55-9.17l47.36-7.16 6.58-14.33c8.4 4.2 15.3 11.4 18.93 20.85 7.7 20.05-2.32 42.55-22.38 50.25-20.07 7.7-42.57-2.32-50.27-22.37-3.5-9.13-3.34-18.75-.24-27.26zm397.96-157.28l23.23 51.5c-3.94 9.58-11.65 17.57-22.06 21.57-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.32-42.56 22.37-50.26 8.93-3.43 18.34-3.35 26.7-.44zm-807.8 219.23c5.9 4.27 10.66 10.25 13.46 17.55 6.32 16.47.7 34.6-12.62 44.8L380 336.7l53.03-8.02zm25.44-3.84l75.43-11.4c7.25 19.88-2.77 41.98-22.6 49.6-20.06 7.7-42.56-2.33-50.26-22.38-2-5.2-2.8-10.6-2.55-15.82zm91.4-13.82L622.84 300c-2.3 13-11.16 24.5-24.38 29.57-18.74 7.2-39.6-1.07-48.56-18.55zm369.64-115.16l32.4-70.52c7.76 4.28 14.12 11.2 17.55 20.14 7.7 20.06-2.32 42.56-22.38 50.26-9.25 3.55-19 3.34-27.6.12zm281.3-175.22l26.7 59.22c-4.33 6.83-10.8 12.4-18.94 15.5-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.08 2.32-42.58 22.38-50.28 6.64-2.55 13.55-3.15 20.1-2.1zm-226.14 55.1l32.27-70.25c7.16 4.3 13 10.94 16.22 19.35 7.7 20.06-2.32 42.56-22.37 50.26-8.72 3.36-17.9 3.36-26.12.64zM1161.28-67l29.13 64.6c-4 4.58-9.2 8.3-15.27 10.63-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 4.62-1.77 9.37-2.6 14.04-2.6zm-131.4 22.6l32.08-69.88c6.57 4.32 11.9 10.65 14.92 18.55 7.7 20.05-2.32 42.55-22.38 50.25-8.2 3.15-16.8 3.34-24.63 1.1zm92.28-109.36l30.74 68.17c-3.25 2.77-7.02 5.04-11.24 6.66-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 2.76-1.05 5.57-1.77 8.38-2.18zm-37.08-10.85l16.24-35.38 13.73 30.45c-2.12 1.35-4.4 2.5-6.85 3.43-7.67 2.95-15.7 3.3-23.12 1.5zm404.38 1252.22c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.55 22.37-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.37 50.26zm-120.62-53.7c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.35 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.07-2.32 42.57-22.37 50.27zm-207.78-20.25c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.34 42.56-22.4 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.33 50.25 22.4 7.7 20.05-2.3 42.55-22.37 50.25zm87.16-33.46c-20.06 7.7-42.56-2.33-50.26-22.4-7.7-20.05 2.32-42.55 22.38-50.25 20.05-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm-643.6 147.03c-20.05 7.7-42.55-2.32-50.25-22.37-7.7-20.06 2.3-42.56 22.36-50.26 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.45c-20.03 7.7-42.54-2.32-50.23-22.38-7.7-20.07 2.3-42.57 22.37-50.27 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.33 42.58-22.4 50.28zm87.18-33.46c-20.05 7.7-42.55-2.3-50.25-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.05-7.7 42.55 2.3 50.25 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.57 22.36-50.27 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.4-7.7-20.03 2.32-42.53 22.38-50.23 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.06-2.32 42.56-22.37 50.26zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.55 2.33 50.24 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.07 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.07-7.7 42.57 2.3 50.27 22.37 7.7 20.06-2.32 42.56-22.38 50.26zM832.65 939.7c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.06-2.34 42.56-22.4 50.26zm87.16-33.46c-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.48c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.05-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.32-42.57 22.38-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.07-2.32 42.57-22.38 50.27zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.44c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.56-22.38 50.26zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zM799.2 852.54c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.34 50.25 22.4 7.7 20.05-2.32 42.55-22.37 50.25zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.04 2.32-42.54 22.38-50.24 20.05-7.7 42.56 2.32 50.25 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.32 42.57-22.38 50.27zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.56-2.32-50.25-22.37-7.7-20.07 2.3-42.57 22.37-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.46c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.3-42.56 22.37-50.25 20.05-7.7 42.56 2.3 50.26 22.35 7.7 20.06-2.3 42.56-22.37 50.26zM852.9 731.92c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.57-22.38 50.27zm87.16-33.46c-20.05 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.3-42.56 22.37-50.26 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.46c-20.06 7.7-42.56-2.33-50.26-22.4-7.7-20.04 2.3-42.54 22.35-50.24 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.3 42.56-22.36 50.26zm87.16-33.47c-20.04 7.7-42.54-2.32-50.24-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.06-2.33 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.55 2.32 50.24 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.07 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.08-7.7 42.58 2.32 50.28 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.3-42.55 22.36-50.25 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm-817.9 213.96c-20.07 7.7-42.57-2.32-50.27-22.37-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.15-33.46c-20.05 7.7-42.56-2.3-50.25-22.37-7.7-20.06 2.3-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.34 50.25 22.4 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.46c-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.48c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.3-42.57 22.37-50.27 20.05-7.7 42.56 2.32 50.26 22.37 7.7 20.07-2.3 42.57-22.37 50.27zM1342.4 444c-20.05 7.7-42.55-2.3-50.25-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.34 42.55-22.4 50.25zm87.17-33.44c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.56-22.38 50.26zm87.16-33.46c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.36 50.26zm-817.9 213.96c-20.06 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.3-42.55 22.37-50.25 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.35-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.04 7.7-42.54-2.3-50.24-22.37-7.7-20.04 2.32-42.54 22.37-50.24 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.33 42.56-22.38 50.25zm87.18-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.54 2.3 50.24 22.36 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.05-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.3 42.57-22.37 50.27zm87.16-33.46c-20.07 7.7-42.57-2.3-50.27-22.36-7.7-20.05 2.32-42.55 22.38-50.25 20.08-7.7 42.58 2.3 50.28 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.44c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.3-42.57 22.36-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zM665.35 503.9c-20.04 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.46c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.37-50.26 20.05-7.7 42.56 2.3 50.25 22.36 7.7 20.05-2.3 42.55-22.37 50.25zm87.16-33.45c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.34 42.57-22.4 50.27zm87.17-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.34-42.56 22.4-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.26 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zM544.75 450.2c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.56 22.35-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.04 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.33 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.54 2.32 50.24 22.38 7.7 20.06-2.3 42.56-22.37 50.26zM980.55 282.9c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.36-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.03 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.05-2.33 42.56-22.4 50.26zM1154.9 216c-20.05 7.7-42.55-2.34-50.25-22.4-7.7-20.06 2.32-42.56 22.37-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm-120.62-53.73c-20.05 7.7-42.55-2.3-50.25-22.37-7.7-20.05 2.33-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.06-2.33 42.56-22.38 50.26zm-33.46-87.17c-20.06 7.7-42.56-2.3-50.26-22.37C1030-.8 1040.04-23.3 1060.1-31c20.04-7.7 42.55 2.33 50.24 22.4 7.7 20.05-2.3 42.56-22.37 50.25z"/><path fill="#BADEFB" stroke="#979797" d="M720.83 267.17c-2.02 0-3.66 1.64-3.66 3.66v558.34c0 2.02 1.64 3.66 3.66 3.66h758.34c2.02 0 3.66-1.64 3.66-3.66V270.83c0-2.02-1.64-3.66-3.66-3.66H720.83z"/><path fill="#E2F2FD" d="M1173.73 838.77h-225L1487.5 300l6.1 218.9-319.87 319.87zm-281.6-2.15H810.1l577.4-577.4h82l-577.35 577.4zM754.1 833.4l-41.6-8.4L1275 262.5h50L754.1 833.4z"/><path fill="#27A69A" d="M937.5 787.5l179.74-179.64 74.45 73.84L1298.4 575l185.85 165.77v46.73h3.25V800c0 20.7 8.2 37.5-12.5 37.5H725c-20.7 0-12.5-16.8-12.5-37.5v-12.5h225z"/><path fill="#FDD836" d="M962.5 462.5c0 27.64-22.36 50-50 50s-50-22.36-50-50 22.36-50 50-50 50 22.36 50 50z"/><path fill="#160C33" d="M1483.33 725.2V270.82c0-2.3-1.86-4.16-4.16-4.16H720.83c-2.3 0-4.16 1.86-4.16 4.16V782.5H934.6l167.6-167.65c12.9-11.86 32.7-11.87 45.6 0l45.7 46 83.38-83.4c12.86-12.25 33.1-12.25 46 .03l160.45 147.7zm0 20.27l-171.08-157.5c-6.8-6.83-17.84-6.83-24.67 0L1093.06 782.5h344.44c4.12 0 7.5 3.38 7.5 7.5s-3.38 7.5-7.5 7.5H716.67v31.67c0 2.3 1.86 4.16 4.16 4.16h758.34c2.3 0 4.16-1.86 4.16-4.16v-83.7zM975.88 462.5c0 34.52-27.98 62.5-62.5 62.5-34.52 0-62.5-27.98-62.5-62.5 0-34.52 27.98-62.5 62.5-62.5 34.52 0 62.5 27.98 62.5 62.5zm-62.5 45.83c25.3 0 45.83-20.53 45.83-45.83 0-25.3-20.5-45.83-45.8-45.83s-45.84 20.53-45.84 45.83c0 25.3 20.53 45.83 45.83 45.83zm-9.2 54.17c0-4.58 3.74-8.33 8.32-8.33s8.33 3.75 8.33 8.33v25c0 4.58-3.75 8.33-8.33 8.33s-8.33-3.75-8.33-8.33v-25zm8.32-191.67c-4.58 0-8.33-3.75-8.33-8.33v-25c0-4.58 3.75-8.33 8.33-8.33s8.33 3.75 8.33 8.33v25c0 4.58-3.75 8.33-8.33 8.33zm91.67 91.67c0-4.58 3.75-8.33 8.33-8.33h25c4.58 0 8.33 3.75 8.33 8.33s-3.75 8.33-8.33 8.33h-25c-4.58 0-8.33-3.75-8.33-8.33zm-216.67 8.33c-4.58 0-8.33-3.75-8.33-8.33s3.75-8.33 8.33-8.33h25c4.58 0 8.33 3.75 8.33 8.33s-3.75 8.33-8.33 8.33h-25zM975 579.1c-3 0-5.77-1.6-7.28-4.18l-12.3-21.64c-2.04-3.96-.6-8.8 3.26-11.05 3.8-2.2 8.73-1 11.15 2.72l12.45 21.5c1.1 1.9 1.4 4.2.8 6.3-.54 2.18-1.96 4-3.9 5.13l-.12.07-.1.06c-1.15.78-2.48 1.16-3.77 1.1h-.2zM862.5 384.2c-3 0-5.77-1.58-7.28-4.15l-12.3-21.7c-2.04-3.9-.6-8.75 3.26-11 3.8-2.2 8.73-1 11.16 2.68l12.44 21.54c1.1 1.9 1.4 4.22.8 6.32-.54 2.15-1.96 4-3.9 5.1l-.12.06-.1.07c-1.15.76-2.48 1.13-3.78 1.08h-.18zm136.78 37.02c-3.07-.14-5.87-1.85-7.44-4.55-2.26-3.96-.9-9 3.04-11.32l21.56-12.5.16-.08c2.58-1.65 5.83-1.74 8.54-.25 2.68 1.5 4.32 4.3 4.3 7.4-.08 3.05-1.8 5.85-4.52 7.28l-.15.08-21.77 12.6-.17.13c-1.02.76-2.26 1.18-3.55 1.23zm-191.4 111.32c-.97.72-2.2 1.13-3.47 1.18-3.05-.14-5.86-1.85-7.43-4.56-1.1-1.9-1.4-4.18-.8-6.34.55-2.15 1.97-3.97 3.92-5.1l21.62-12.5c1.93-1.1 4.2-1.4 6.35-.8 2.15.54 3.98 1.96 5.1 3.9 1.1 1.9 1.37 4.2.77 6.4-.58 2.12-2 3.9-4 5.04l-21.65 12.52-.2.12-.2.14zm208.9-.15l-20.98-12.14-.16-.24-.97-.5c-2.72-1.4-4.44-4.17-4.47-7.22-.03-3.07 1.6-5.9 4.27-7.4 2.7-1.5 5.96-1.4 8.6.24l.12.08 21.56 12.5c1.98 1.12 3.38 2.93 3.97 5.1.58 2.12.27 4.4-.86 6.35-1.52 2.68-4.34 4.4-7.4 4.55-1.28-.05-2.5-.47-3.54-1.2l-.17-.13zM821.9 419.9l-21.34-12.34-.22-.22-.57-.3c-2.7-1.4-4.4-4.2-4.44-7.23-.03-3.06 1.6-5.9 4.27-7.4 2.66-1.5 5.95-1.4 8.52.24l.15.1 21.63 12.5c1.97 1.1 3.38 2.92 3.97 5.1.55 2.13.25 4.42-.86 6.34-1.5 2.68-4.33 4.4-7.37 4.55-1.3-.05-2.53-.47-3.55-1.2l-.17-.13zm136.64-36.6l-.08-.07-.08-.04c-3.96-2.38-5.3-7.43-3-11.4l12.48-21.58.06-.1.05-.1c1.38-2.68 4.16-4.4 7.27-4.46 3.03-.03 5.85 1.6 7.35 4.3 1.5 2.68 1.4 5.94-.25 8.57l-.08.12-12.5 21.58c-1.5 2.62-4.26 4.2-7.23 4.17h-.24c-1.33.07-2.66-.3-3.76-1zM857.26 574.95c-1.46 2.6-4.2 4.2-7.2 4.27-1.45.03-2.8-.34-3.83-1.04l-.14-.1-.16-.08c-1.95-1.1-3.35-2.92-3.94-5.1-.57-2.1-.26-4.38.87-6.34l12.5-21.62.04-.1.07-.07c1.4-2.7 4.2-4.42 7.23-4.45 3.05-.07 5.9 1.58 7.4 4.27 1.5 2.65 1.4 5.94-.23 8.5l-.1.16-12.5 21.62v.04zM708.33 250h783.34c4.6 0 8.33 3.73 8.33 8.33v583.34c0 4.6-3.73 8.33-8.33 8.33H708.33c-4.6 0-8.33-3.73-8.33-8.33V258.33c0-4.6 3.73-8.33 8.33-8.33zm406.6 377.43L959.15 783.16h111.8l109.34-109.5-46.3-46.23c-5.27-5.22-13.8-5.22-19.08 0z"/></g></svg>
|
assets/images/addon-tripadvisor.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="1100"><title>tripadvisor</title><desc>Created with Sketch.</desc><g fill="none"><path fill="#00A680" d="M0 0h2200v1100H0z"/><path id="Shape" fill="#00AF87" d="M1471.44 1148.7c-5.22-19.06 4.76-39.34 23.6-46.57 11.17-4.3 23.1-3.08 32.82 2.3l9.1 61.06c-3.5 3.6-7.74 6.6-12.62 8.67l-52.9-25.5zm-121.63-58.62c-2.42-17.52 7.4-35.05 24.6-41.66 20.08-7.7 42.58 2.32 50.28 22.38 6.9 17.98-.43 37.93-16.48 47.4l-58.4-28.12zm-120.96-58.3c-.3-15.9 9.25-31.03 24.96-37.06 20.05-7.7 42.55 2.32 50.25 22.38 6.33 16.48.7 34.6-12.65 44.83l-62.57-30.15zm277.9-69.37c-6.06-4.26-10.97-10.33-13.83-17.8-5.04-13.15-2.46-27.36 5.57-37.76l8.27 55.58zM682.6 1170.9c-3.2-3.5-5.8-7.64-7.6-12.33-7.7-20.06 2.3-42.56 22.37-50.26 20.05-7.7 42.56 2.34 50.25 22.4 1.02 2.65 1.73 5.34 2.15 8.04l-67.17 32.17zm82.6-39.57c-1.18-1.94-2.2-4.02-3.05-6.22-7.7-20.04 2.32-42.54 22.38-50.24 20.06-7.7 42.56 2.32 50.26 22.38.06.22.14.43.22.65l-69.83 33.44zm83.92-40.2c-7.33-19.92 2.68-42.1 22.57-49.74 17.9-6.9 37.74.36 47.27 16.26l-69.86 33.47zm85.24-40.82c-2.82-17.74 7.03-35.65 24.5-42.36 15.4-5.9 32.27-1.36 42.74 10.17l-67.24 32.2zm86.74-41.53c.78-14.87 10.12-28.6 24.9-34.28 12.73-4.9 26.43-2.65 36.72 4.75l-61.62 29.52zm87.27-35.03c1.34-14.26 10.53-27.23 24.8-32.7 20.06-7.7 42.56 2.3 50.26 22.36 5.78 15.05 1.58 31.47-9.35 42l-65.7-31.67zm386.46-91.33c-15.3-.36-29.57-9.8-35.4-24.95-7.7-20.05 2.33-42.56 22.4-50.25.56-.23 1.14-.44 1.72-.63l11.28 75.83zm-820.4 213.83l12.38-76.6c12.1 2.86 22.6 11.44 27.38 23.9 7.7 20.06-2.32 42.56-22.38 50.26-5.73 2.2-11.64 2.94-17.36 2.43zM1470.4 718.3l10.75 72.08c-1.56.86-3.2 1.62-4.9 2.28-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.56 22.37-50.26 7.3-2.8 14.93-3.25 22.05-1.73zM697.24 955.14l7.5-46.5c3.62-3.43 7.95-6.23 12.9-8.12 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.05-2.32 42.55-22.38 50.25-18.55 7.12-39.18-.9-48.28-18zm795.36-288.36c-5.64-4.25-10.2-10.07-12.9-17.14-7.7-20.05 2.32-42.56 22.37-50.26 16.6-6.37 34.87-.6 45.04 12.94l-54.5 54.45zM1642 517.56c-9.5-3.94-17.46-11.63-21.44-22-7.7-20.05 2.32-42.55 22.38-50.25 19.75-7.57 41.87 2.03 49.9 21.48L1642 517.56zM728.7 760.34l10-61.9-4.2-4.23c1.1-.53 2.2-1.03 3.37-1.47 20.05-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26-12.86 4.94-26.73 2.6-37.06-5.02zm977.06-437.94l20.87 3.17c9 4.06 16.45 11.54 20.27 21.48 7.7 20.06-2.33 42.56-22.4 50.26-20.04 7.7-42.55-2.3-50.24-22.36-7.7-20.06 2.3-42.56 22.37-50.26 3-1.15 6.06-1.9 9.12-2.28zm87.75 43.83c-14-1.55-26.67-10.68-32.07-24.74-1.4-3.63-2.2-7.33-2.5-11l61.08 9.27-26.5 26.47zM721.1 680.73l-41.55-41.9c1.16-14.47 10.4-27.7 24.85-33.24 20.06-7.7 42.56 2.3 50.26 22.35 7.7 20.06-2.32 42.56-22.38 50.26-3.68 1.4-7.45 2.24-11.2 2.5zm830.84-381.7l76.78 11.68c-1.27 14.36-10.48 27.44-24.83 32.95-20.07 7.7-42.57-2.32-50.27-22.38-2.83-7.36-3.27-15.05-1.7-22.22zm-203.7-30.95l72 10.94c3.9 18.4-6 37.42-24.13 44.37-20.03 7.7-42.54-2.33-50.23-22.4-4.3-11.2-3.07-23.2 2.37-32.93zm95.05 14.44l42.3 6.44c-.77.34-1.54.67-2.34.98-14.12 5.42-29.46 2.05-39.98-7.42zM528.26 486.25c3.93-9.55 11.63-17.53 22.04-21.53 20.07-7.7 42.57 2.32 50.27 22.38 7.63 19.88-2.14 42.15-21.84 50.04l-50.46-50.9zm753.46-286.13l18.1 40.15c-2.34 12.93-11.18 24.37-24.35 29.42-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.05 2.3-42.55 22.37-50.25 11.7-4.5 24.2-2.96 34.13 3.06zm-499.4 75.77l8.4-1.3c16.2-.63 31.73 8.98 37.87 24.95 7.7 20.06-2.3 42.56-22.37 50.26-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.05 2.32-42.56 22.38-50.25 1.32-.52 2.65-.95 3.98-1.3zm60.55-9.17l47.36-7.16 6.58-14.33c8.4 4.2 15.3 11.4 18.93 20.85 7.7 20.05-2.32 42.55-22.38 50.25-20.07 7.7-42.57-2.32-50.27-22.37-3.5-9.13-3.34-18.75-.24-27.26zm397.96-157.28l23.23 51.5c-3.94 9.58-11.65 17.57-22.06 21.57-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.32-42.56 22.37-50.26 8.93-3.43 18.34-3.35 26.7-.44zm-807.8 219.23c5.9 4.27 10.66 10.25 13.46 17.55 6.32 16.47.7 34.6-12.62 44.8L380 336.7l53.03-8.02zm25.44-3.84l75.43-11.4c7.25 19.88-2.77 41.98-22.6 49.6-20.06 7.7-42.56-2.33-50.26-22.38-2-5.2-2.8-10.6-2.55-15.82zm91.4-13.82L622.84 300c-2.3 13-11.16 24.5-24.38 29.57-18.74 7.2-39.6-1.07-48.56-18.55zm369.64-115.16l32.4-70.52c7.76 4.28 14.12 11.2 17.55 20.14 7.7 20.06-2.32 42.56-22.38 50.26-9.25 3.55-19 3.34-27.6.12zm281.3-175.22l26.7 59.22c-4.33 6.83-10.8 12.4-18.94 15.5-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.08 2.32-42.58 22.38-50.28 6.64-2.55 13.55-3.15 20.1-2.1zm-226.14 55.1l32.27-70.25c7.16 4.3 13 10.94 16.22 19.35 7.7 20.06-2.32 42.56-22.37 50.26-8.72 3.36-17.9 3.36-26.12.64zM1161.28-67l29.13 64.6c-4 4.58-9.2 8.3-15.27 10.63-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 4.62-1.77 9.37-2.6 14.04-2.6zm-131.4 22.6l32.08-69.88c6.57 4.32 11.9 10.65 14.92 18.55 7.7 20.05-2.32 42.55-22.38 50.25-8.2 3.15-16.8 3.34-24.63 1.1zm92.28-109.36l30.74 68.17c-3.25 2.77-7.02 5.04-11.24 6.66-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 2.76-1.05 5.57-1.77 8.38-2.18zm-37.08-10.85l16.24-35.38 13.73 30.45c-2.12 1.35-4.4 2.5-6.85 3.43-7.67 2.95-15.7 3.3-23.12 1.5zm404.38 1252.22c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.55 22.37-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.37 50.26zm-120.62-53.7c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.35 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.07-2.32 42.57-22.37 50.27zm-207.78-20.25c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.34 42.56-22.4 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.33 50.25 22.4 7.7 20.05-2.3 42.55-22.37 50.25zm87.16-33.46c-20.06 7.7-42.56-2.33-50.26-22.4-7.7-20.05 2.32-42.55 22.38-50.25 20.05-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm-643.6 147.03c-20.05 7.7-42.55-2.32-50.25-22.37-7.7-20.06 2.3-42.56 22.36-50.26 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.45c-20.03 7.7-42.54-2.32-50.23-22.38-7.7-20.07 2.3-42.57 22.37-50.27 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.33 42.58-22.4 50.28zm87.18-33.46c-20.05 7.7-42.55-2.3-50.25-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.05-7.7 42.55 2.3 50.25 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.57 22.36-50.27 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.4-7.7-20.03 2.32-42.53 22.38-50.23 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.06-2.32 42.56-22.37 50.26zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.55 2.33 50.24 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.07 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.07-7.7 42.57 2.3 50.27 22.37 7.7 20.06-2.32 42.56-22.38 50.26zM832.65 939.7c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.06-2.34 42.56-22.4 50.26zm87.16-33.46c-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.48c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.05-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.32-42.57 22.38-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.07-2.32 42.57-22.38 50.27zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.44c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.56-22.38 50.26zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zM799.2 852.54c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.34 50.25 22.4 7.7 20.05-2.32 42.55-22.37 50.25zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.04 2.32-42.54 22.38-50.24 20.05-7.7 42.56 2.32 50.25 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.32 42.57-22.38 50.27zm87.16-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.56-2.32-50.25-22.37-7.7-20.07 2.3-42.57 22.37-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.46c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.3-42.56 22.37-50.25 20.05-7.7 42.56 2.3 50.26 22.35 7.7 20.06-2.3 42.56-22.37 50.26zM852.9 731.92c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.57-22.38 50.27zm87.16-33.46c-20.05 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.3-42.56 22.37-50.26 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.46c-20.06 7.7-42.56-2.33-50.26-22.4-7.7-20.04 2.3-42.54 22.35-50.24 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.3 42.56-22.36 50.26zm87.16-33.47c-20.04 7.7-42.54-2.32-50.24-22.37-7.7-20.06 2.32-42.56 22.38-50.26 20.05-7.7 42.55 2.32 50.25 22.37 7.7 20.06-2.33 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.3-50.26-22.37-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.55 2.32 50.24 22.38 7.7 20.05-2.3 42.56-22.37 50.25zm87.16-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.07 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.08-7.7 42.58 2.32 50.28 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.3-42.55 22.36-50.25 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm-817.9 213.96c-20.07 7.7-42.57-2.32-50.27-22.37-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zm87.15-33.46c-20.05 7.7-42.56-2.3-50.25-22.37-7.7-20.06 2.3-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.34 50.25 22.4 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.46c-20.06 7.7-42.56-2.34-50.26-22.4-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.48c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.05 2.32-42.56 22.38-50.25 20.06-7.7 42.56 2.3 50.26 22.36 7.7 20.06-2.32 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.3-42.57 22.37-50.27 20.05-7.7 42.56 2.32 50.26 22.37 7.7 20.07-2.3 42.57-22.37 50.27zM1342.4 444c-20.05 7.7-42.55-2.3-50.25-22.36-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.34 42.55-22.4 50.25zm87.17-33.44c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.56-22.38 50.26zm87.16-33.46c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.3 42.56-22.36 50.26zm-817.9 213.96c-20.06 7.7-42.57-2.32-50.27-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.46c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.05 2.3-42.55 22.37-50.25 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.38 50.26zm87.17-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.35-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.04 7.7-42.54-2.3-50.24-22.37-7.7-20.04 2.32-42.54 22.37-50.24 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.33 42.56-22.38 50.25zm87.18-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.54 2.3 50.24 22.36 7.7 20.06-2.3 42.56-22.37 50.26zm87.16-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.05-7.7 42.56 2.32 50.26 22.38 7.7 20.07-2.3 42.57-22.37 50.27zm87.16-33.46c-20.07 7.7-42.57-2.3-50.27-22.36-7.7-20.05 2.32-42.55 22.38-50.25 20.08-7.7 42.58 2.3 50.28 22.36 7.7 20.06-2.32 42.56-22.38 50.26zm87.15-33.44c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.07 2.3-42.57 22.36-50.27 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.05-2.32 42.55-22.38 50.25zM665.35 503.9c-20.04 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.34-42.56 22.4-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.37 50.26zm87.16-33.46c-20.08 7.7-42.58-2.32-50.28-22.38-7.7-20.05 2.32-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.37 7.7 20.06-2.32 42.56-22.37 50.26zm87.14-33.46c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.37-50.26 20.05-7.7 42.56 2.3 50.25 22.36 7.7 20.05-2.3 42.55-22.37 50.25zm87.16-33.45c-20.05 7.7-42.55-2.32-50.25-22.38-7.7-20.08 2.32-42.58 22.38-50.28 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.34 42.57-22.4 50.27zm87.17-33.46c-20.06 7.7-42.56-2.3-50.26-22.36-7.7-20.06 2.34-42.56 22.4-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm87.16-33.44c-20.05 7.7-42.56-2.32-50.26-22.38-7.7-20.05 2.32-42.56 22.38-50.26 20.06-7.68 42.56 2.33 50.26 22.4 7.7 20.05-2.3 42.55-22.36 50.25zM544.75 450.2c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.3-42.56 22.35-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.3 42.55-22.36 50.25zm87.16-33.46c-20.04 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.06-2.33 42.56-22.38 50.26zm87.18-33.46c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.33-42.56 22.4-50.26 20.04-7.7 42.54 2.32 50.24 22.38 7.7 20.06-2.3 42.56-22.37 50.26zM980.55 282.9c-20.06 7.7-42.56-2.32-50.26-22.37-7.7-20.06 2.3-42.56 22.36-50.26 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.16-33.45c-20.03 7.7-42.54-2.32-50.24-22.38-7.7-20.06 2.32-42.56 22.38-50.26 20.06-7.7 42.56 2.34 50.26 22.4 7.7 20.05-2.33 42.56-22.4 50.26zM1154.9 216c-20.05 7.7-42.55-2.34-50.25-22.4-7.7-20.06 2.32-42.56 22.37-50.26 20.05-7.7 42.55 2.32 50.25 22.38 7.7 20.06-2.32 42.56-22.38 50.26zm-120.62-53.73c-20.05 7.7-42.55-2.3-50.25-22.37-7.7-20.05 2.33-42.55 22.38-50.25 20.06-7.7 42.56 2.32 50.26 22.38 7.7 20.05-2.32 42.55-22.38 50.25zm87.17-33.45c-20.06 7.7-42.56-2.32-50.26-22.38-7.7-20.06 2.32-42.56 22.37-50.26 20.06-7.7 42.56 2.3 50.26 22.37 7.7 20.06-2.33 42.56-22.38 50.26zm-33.46-87.17c-20.06 7.7-42.56-2.3-50.26-22.37C1030-.8 1040.04-23.3 1060.1-31c20.04-7.7 42.55 2.33 50.24 22.4 7.7 20.05-2.3 42.56-22.37 50.25z"/><g transform="translate(578.928 275)"><path fill="#fff" d="M395.26 459.93c0 18.63-11.2 30.65-28.56 30.65-10.55 0-17.94-6.97-17.94-16.96 0-13.13 12.53-20.34 35.3-20.34h11.24v6.68l-.04-.03zm-19.28-65.03c-13.4 0-25.15 2.52-35.92 7.7l-.67.3.2 18.7 1.74-.93c10.3-5.78 20.03-8.68 28.93-8.68 15.87 0 24.98 9.06 24.98 24.96v.93h-12.53c-36.06 0-55.92 13.05-55.92 36.8 0 19.03 14.37 32.34 34.9 32.34 15.1 0 26.8-5.92 35.12-17.14v15.66h19.8v-65.43c0-30.05-13.62-45.23-40.55-45.23h-.1zm105.2 94.2c-16.7 0-27.1-14.57-27.1-38.02 0-23.5 10.47-38.7 26.67-38.7 18.14 0 28.98 14.48 28.98 38.7 0 23.1-11.22 38.05-28.55 38.05v-.04zm28.55-143.3v66.33c-8.08-11.26-19.36-17.23-33.83-17.23-26.8 0-44.8 22.03-44.8 54.9 0 33.84 18.25 57.43 44.38 57.43 15.5 0 27.53-6.8 35.94-20.2v18.53h20.26v-159.8h-21.95v.04zm119.93 51.64l-31.12 62.4-28.7-62.42-24.72.1 52.98 108.1 54.46-108.1h-22.92v-.06l.02-.02zm315.9 17.5V397.4l-20.02.03v108.12h21.92v-54.3c0-22.7 9.57-35.28 26.9-35.28 2.57 0 5 .38 7.96 1.22l1.42.44.74-21.37-9.42-.76c-12.73 0-23 6.9-29.42 19.4h-.08zm-94.14-19.97c-33 0-53.42 21.68-53.42 56.6 0 34.94 20.43 56.6 53.42 56.6 33.08 0 53.64-21.7 53.64-56.58 0-34.9-20.56-56.6-53.64-56.6v-.04zm.27 95.25c-18.28 0-30.5-15.64-30.5-38.94 0-23.37 12.22-39.1 30.5-39.1 18.45 0 30.4 15.37 30.4 39.12 0 23.7-11.95 38.95-30.45 38.95l.03-.03zm-140.34-65.05c0 15.22 10.46 23.2 29.74 32.65 12.18 6 18.55 9.5 18.55 17.94 0 8.63-7.84 14.24-19.92 14.24-8.6 0-18.1-2.45-27.54-7.08l-1.6-.78-.7 19.06.8.3c9 3.57 18.47 5.35 28.26 5.35 26.82 0 44.14-12.8 44.14-32.58 0-16.47-10.96-24.86-29.95-33.72-13.9-6.52-19.74-10.35-19.74-17.3 0-6.52 6.47-10.77 16.53-10.77 9.06 0 17.9 2 26.27 6l1.54.77 1-18.7-.88-.22c-9.13-2.74-18.08-4.1-26.67-4.1-23.8 0-39.77 11.65-39.77 28.98h-.05l-.03-.02zm-49.77-59.42c0 7.18 5.87 13.04 13.06 13.04 7.2 0 13.04-5.88 13.04-13.06 0-7.2-5.84-13.05-13.03-13.05-7.2 0-13.05 5.9-13.05 13.13v-.07l-.02-.02zm22.92 31.7h-20.8v108.1h21.93v-108.1h-1.12zm335.58 7.16h2.1c2.68 0 3.95-.9 3.95-2.8 0-2.06-1.34-2.93-4.2-2.93h-1.77v5.75h-.07zm2.75-9.44c6.2 0 9.3 2.13 9.3 6.23 0 2.73-1.66 4.9-4.56 5.77l4.75 9.4h-6.5l-4-8.53h-1.75v8.53h-5.88v-21.4h8.63zm-11.48-.45c-3.2 3.2-4.83 7.27-4.83 11.58 0 4.23 1.56 8.02 4.56 11.13 3.07 3.13 7.08 4.9 11.35 4.9 4.23 0 8.24-1.64 11.35-4.67 3.08-2.9 4.74-6.96 4.74-11.35 0-4.3-1.55-8.23-4.5-11.23-3.13-3.17-7.14-4.86-11.5-4.86s-8.17 1.55-11.17 4.5zm25.24-2.13c3.6 3.65 5.5 8.46 5.5 13.7 0 5.42-2 10.3-5.8 13.9-3.9 3.7-8.76 5.7-13.8 5.7-5.27 0-10.17-2.07-13.93-5.94-3.65-3.8-5.63-8.55-5.63-13.65 0-5.16 2.1-10.23 5.97-14.02 3.66-3.6 8.33-5.56 13.58-5.56 5.44 0 10.38 2.06 14.14 5.93v-.08z"/><path fill="#0A0A08" d="M42.24 364.8l-19.76 6.82v25.82H.58v17.27h21.27v55.57c0 26.42 9.02 37.17 31.1 37.17 5.63 0 10.97-.67 16.3-2.12l.9-.2-.22-18.04-1.56.58c-4.32 1.52-7.72 2.23-10.35 2.23-10.37 0-14.24-5.84-14.24-21.6v-53.64h25.3V397.4H43.8v-33.1l-1.56.53m68.4 50.08v-17.5l-20.03.05v108.12h21.9v-54.3c0-22.7 9.57-35.28 26.9-35.28 2.5 0 4.93.37 7.9 1.2l1.4.46.75-21.37-9.42-.77c-12.68 0-23 6.9-29.38 19.4m54.98-49.17c0 7.16 5.85 13.02 13.04 13.02 7.2 0 13.07-5.86 13.07-13.05 0-7.18-5.86-13.04-13.07-13.04-7.2 0-13.04 5.9-13.04 13.12m22.88 31.66h-20.76v108.1h21.95V397.44h-1.17m78.57-2.54c-15.07 0-27.72 7.12-36.17 20.1v-17.5H210.9v152.2h21.96v-59.05c7.88 10.75 19.25 16.64 33.4 16.64 27.7 0 45.62-22.7 45.62-57.88 0-32.58-18.03-54.48-44.8-54.48m-6.02 94.58c-17.36 0-28.15-14.82-28.15-38.68 0-23 11.37-37.83 28.95-37.83 16.92 0 27.05 14.07 27.05 37.6 0 24.06-10.7 38.9-27.93 38.9"/><path fill="#000" d="M292.07 97.8c-6.13-25-24.8-49.8-24.8-49.8l79.27-.06C393.77 17.18 453.7.66 520.04.66c64.05 0 121.98 16.08 169.5 46.7l84.15.06s-18.96 25.14-24.98 50.33c7.08 9.42 12.9 20.04 17.2 31.6 24.24 65.26-9.4 138.02-75.04 162.18-31.76 11.64-66.18 10.3-96.98-3.82-18.52-8.5-34.36-21-46.6-36.5l-27.17 40.48-27-40.1c-23.3 28.82-59 47.25-98.96 47.25-69.9 0-126.84-56.6-126.84-126.18 0-28 9.2-53.88 24.73-74.84"/><path fill="#FAC415" d="M396.16 46.42C432.56 30.9 474.62 22.67 520 22.67c45.46 0 86.54 8.2 122.82 24.33-13.28.42-26.73 2.94-39.82 7.76-31.75 11.64-57.1 34.98-71.3 65.6-6.12 13.3-9.85 27.28-11.13 41.4C515 97.9 461.53 47.46 396.17 46.5v-.06z"/><ellipse id="Oval" cx="394.132" cy="173.079" fill="#fff" rx="101.231" ry="100.745"/><ellipse id="Oval" cx="646.945" cy="173.079" fill="#fff" rx="101.231" ry="100.745"/><ellipse id="Oval" cx="394.16" cy="173.079" fill="#0A0A08" rx="62.66" ry="62.36"/><ellipse id="Oval" cx="646.89" cy="173.079" fill="#0A0A08" rx="62.66" ry="62.36"/><ellipse id="Oval" cx="394.16" cy="173.079" fill="#fff" rx="41.077" ry="40.88"/><ellipse id="Oval" cx="646.89" cy="173.079" fill="#fff" rx="41.077" ry="40.88"/><ellipse cx="394.16" cy="173.079" fill="#EE6946" rx="20.887" ry="20.787"/><ellipse cx="646.89" cy="173.079" fill="#00AF87" rx="20.887" ry="20.787"/></g></g></svg>
|
assets/images/block-icon-form.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22"><path d="M11 2L8 8l-6 .75 4.13 4.62L5 20l6-3 6 3-1.12-6.63L20 8.75 14 8l-3-6zm0 2.24l2.34 4.7L18 9.5l-3.2 3.57.88 5.15L11 15.88V4.24zm8.28-.9v.97H16V7h-1V.7h4.5v.96H16v1.7h3.28z"/></svg>
|
assets/images/block-icon-reviews.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22"><path d="M11 2L8 8l-6 .75 4.13 4.62L5 20l6-3 6 3-1.12-6.63L20 8.75 14 8l-3-6zm0 2.24l2.34 4.7L18 9.5l-3.2 3.57.88 5.15L11 15.88V4.24zM14.68.7h2.6c1.44 0 2.22.65 2.22 1.82 0 1.07-.8 1.8-2.1 1.83L19.48 7h-1.26l-2-2.65h-.52V7h-1.02V.7zm2.57.95H15.7v1.78h1.55c.82 0 1.2-.3 1.2-.9 0-.6-.4-.88-1.2-.88z"/></svg>
|
assets/images/block-icon-summary.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22"><path d="M11 2L8 8l-6 .75 4.13 4.62L5 20l6-3 6 3-1.12-6.63L20 8.75 14 8l-3-6zm0 2.24l2.34 4.7L18 9.5l-3.2 3.57.88 5.15L11 15.88V4.24zm8.4-2.97l-.5.83c-.54-.35-1.13-.54-1.77-.54-.84 0-1.42.36-1.42.94 0 .52.5.72 1.32.84l.44.06c1.02.14 2.03.56 2.03 1.73 0 1.28-1.17 2-2.54 2-.85 0-1.88-.3-2.53-.86l.55-.8c.43.4 1.25.68 1.98.68.82 0 1.47-.35 1.47-.93 0-.5-.5-.72-1.42-.85l-.48-.07c-.93-.13-1.87-.57-1.87-1.74 0-1.27 1.12-1.97 2.5-1.97.9 0 1.63.25 2.26.67z"/></svg>
|
assets/images/icon.png
ADDED
Binary file
|
assets/images/pinned.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800"><title>pinned</title><path fill="currentColor" d="M450 1l900-1-1 258c-62.07 13.33-113.63 44.83-154.67 94.5-41.05 49.67-61.57 107.17-61.57 172.5v50c.67 65.33 21.36 122.67 62.07 172 40.7 49.33 92.43 80.67 155.17 94l-1 258h-341.38l-1 257c0 51.33-11.35 137.67-34.04 259-22.7 121.33-46.72 182-72.08 182-26.03 0-50.56-60.67-73.58-182-23.03-121.33-34.54-207.67-34.54-259v-256L450 1099l1-258c62.07-12.67 113.46-43.83 154.17-93.5 40.7-49.67 61.07-107.17 61.07-172.5v-50c0-65.33-20.36-122.83-61.07-172.5-40.7-49.67-92.43-81.17-155.17-94.5V1z"/></svg>
|
assets/images/star-empty.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800"><title>star-empty</title><path fill="#ffb900" d="M900 0l300 600 600 75-413 462 113 663-600-300-600 300 112-663L0 675l600-75L900 0zm0 224L666 693l-465 58 318 356-87 515 468-234 468 234-87-515 318-356-465-58-234-469z"/></svg>
|
assets/{img/star-empty.svg → images/star-error.svg}
RENAMED
@@ -1,6 +1,5 @@
|
|
1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800">
|
2 |
-
<
|
3 |
-
<g fill="#ffb900">
|
4 |
<path d="M900 0l300 600 600 75-413 462 113 663-600-300-600 300 112-663L0 675l600-75L900 0zm0 224L666 693l-465 58 318 356-87 515 468-234 468 234-87-515 318-356-465-58-234-469z"/>
|
5 |
</g>
|
6 |
</svg>
|
1 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800">
|
2 |
+
<g fill="#D32F2F">
|
|
|
3 |
<path d="M900 0l300 600 600 75-413 462 113 663-600-300-600 300 112-663L0 675l600-75L900 0zm0 224L666 693l-465 58 318 356-87 515 468-234 468 234-87-515 318-356-465-58-234-469z"/>
|
4 |
</g>
|
5 |
</svg>
|
assets/images/star-full.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800"><title>star-full</title><path fill="#ffb900" d="M900 0L600 600 0 675l412 462-112 663 600-300 600 300-113-663 413-462-600-75z"/></svg>
|
assets/images/star-half.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800"><title>star-half</title><path fill="#ffb900" d="M900 0L600 600 0 675l413 462-113 663 600-300 600 300-112-663 412-462-600-75L900 0zm0 224l234 469 465 58-318 356 87 515-468-234V224z"/></svg>
|
assets/img/booking.svg
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 540">
|
2 |
-
<title>booking-reviews</title>
|
3 |
-
<clipPath>
|
4 |
-
<path d="M0 0h960v540H0z"/>
|
5 |
-
</clipPath>
|
6 |
-
<g fill="none">
|
7 |
-
<path fill="#00347D" d="M0 0h960v540H0z"/>
|
8 |
-
<path fill="#003E8C" d="M676.33 566.25c2.26-.97 4.22-2.36 5.84-4.03l-4.2-28.26c-4.5-2.5-10.03-3.06-15.2-1.07-8.73 3.32-13.35 12.7-10.93 21.53l24.5 11.8zm-53.78-25.92c7.43-4.4 10.83-13.62 7.63-21.95-3.56-9.3-13.98-13.92-23.27-10.36-7.95 3.06-12.5 11.17-11.37 19.3l27.03 13zm-54.07-26.06c6.17-4.73 8.8-13.12 5.86-20.75-3.57-9.3-14-13.93-23.27-10.36-7.28 2.8-11.7 9.8-11.56 17.15l29 13.98zm95.87-71.8c-3.72 4.8-4.92 11.4-2.58 17.48 1.33 3.45 3.6 6.26 6.4 8.25l-3.82-25.74zM317.7 549.82c-.2-1.25-.52-2.5-1-3.72-3.55-9.28-13.97-13.92-23.26-10.35-9.3 3.56-13.92 13.98-10.36 23.27.83 2.17 2.04 4.1 3.53 5.7l31.1-14.9zm39.48-18.9c-.04-.1-.08-.2-.1-.3-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27.4 1 .86 1.98 1.4 2.88l32.34-15.48zm38.87-18.63c-4.4-7.37-13.6-10.73-21.9-7.55-9.2 3.54-13.84 13.8-10.45 23.04l32.35-15.5zm38.25-18.33c-4.85-5.34-12.65-7.45-19.8-4.7-8.07 3.1-12.64 11.4-11.33 19.6L434.3 494zm37.56-18c-4.76-3.42-11.1-4.46-17-2.2-6.85 2.63-11.17 9-11.53 15.88L471.86 476zm42.3 12.12c5.06-4.88 7-12.5 4.33-19.46-3.6-9.28-14-13.92-23.3-10.36-6.6 2.53-10.85 8.54-11.47 15.14l30.42 14.66zm143.28-92.07c-.27.1-.53.2-.8.3-9.28 3.55-13.92 13.97-10.36 23.26 2.7 7 9.3 11.37 16.4 11.54l-5.24-35.1zm-368.9 98.64c5.6 1.33 10.46 5.3 12.68 11.07 3.56 9.3-1.07 19.7-10.36 23.27-2.65 1.03-5.4 1.38-8.03 1.14l5.72-35.47zm367.8-106.13c-.73.4-1.5.75-2.28 1.05-9.3 3.56-19.7-1.08-23.27-10.37-3.58-9.3 1.05-19.7 10.34-23.27 3.38-1.3 6.9-1.5 10.2-.8l4.98 33.38zm-359.5 54.76c1.68-1.58 3.7-2.88 5.97-3.76 9.3-3.56 19.73 1.08 23.3 10.36 3.56 9.3-1.08 19.7-10.37 23.27-8.58 3.3-18.14-.42-22.35-8.34l3.48-21.52zm390.03-137.2c-4.7-6.26-13.17-8.93-20.85-5.98-9.3 3.57-13.93 14-10.36 23.27 1.25 3.26 3.36 5.95 5.97 7.9l25.24-25.2zm67.47-67.37c-3.72-9-13.96-13.45-23.1-9.94-9.3 3.54-13.93 13.96-10.36 23.25 1.84 4.8 5.5 8.36 9.92 10.18l23.54-23.5zm-443.7 105.3c.5-.25 1-.48 1.55-.7 9.26-3.55 19.7 1.1 23.25 10.37 3.56 9.3-1.08 19.7-10.36 23.27-5.97 2.3-12.4 1.2-17.17-2.32l4.63-28.66-1.94-1.98zm459.34-170.68c4.17 1.88 7.62 5.34 9.4 9.95 3.56 9.3-1.08 19.7-10.37 23.27-9.27 3.56-19.7-1.07-23.25-10.36-3.56-9.27 1.07-19.7 10.36-23.25 1.4-.53 2.8-.88 4.23-1.06l9.66 1.46zm14.97 2.27c.13 1.7.5 3.42 1.15 5.1 2.5 6.5 8.37 10.74 14.85 11.45l12.27-12.25-28.27-4.3zM285.2 318.38c.53-6.7 4.8-12.83 11.5-15.4 9.28-3.56 19.7 1.08 23.27 10.37 3.56 9.28-1.08 19.7-10.36 23.27-1.7.65-3.43 1.03-5.17 1.15l-19.23-19.4zm439.46-151.92c-.6 6.64-4.85 12.7-11.5 15.25-9.28 3.58-19.7-1.06-23.27-10.35-1.3-3.4-1.53-6.97-.8-10.3l35.55 5.42zm-96.53-14.67c1.8 8.5-2.78 17.3-11.17 20.52-9.3 3.57-19.7-1.07-23.27-10.36-2-5.2-1.44-10.74 1.1-15.25l33.32 5.08zm30.26 4.6c-.37.14-.73.3-1.1.43-6.53 2.5-13.63.95-18.5-3.43l19.6 3zM238.5 271.3c9.12-3.66 13.64-13.97 10.1-23.17-3.56-9.3-13.97-13.93-23.26-10.36-4.82 1.85-8.4 5.54-10.2 9.96l23.36 23.57zm333.9-137.45c-1.1 5.98-5.2 11.28-11.3 13.62-9.27 3.56-19.7-1.08-23.26-10.36-3.56-9.27 1.08-19.7 10.36-23.25 5.4-2.08 11.2-1.37 15.8 1.4l8.4 18.6zm-235.72 15.9c7.5-.3 14.7 4.15 17.52 11.55 3.57 9.28-1.07 19.7-10.36 23.27-9.28 3.56-19.7-1.08-23.27-10.36-3.56-9.27 1.08-19.7 10.36-23.25.62-.24 1.23-.44 1.85-.6l3.9-.6zm49.12-13.6c3.88 1.94 7.08 5.28 8.76 9.66 3.56 9.3-1.07 19.7-10.36 23.3-9.3 3.55-19.7-1.1-23.27-10.37-1.62-4.23-1.55-8.68-.1-12.62l21.92-3.3 3.05-6.64zm170.03-39.02c-1.82 4.43-5.38 8.13-10.2 9.98-9.3 3.6-19.7-1.05-23.28-10.34-3.56-9.3 1.08-19.7 10.36-23.27 4.16-1.6 8.5-1.56 12.4-.2l10.74 23.84zM171.45 203.65c6.16-4.73 8.77-13.12 5.84-20.74-1.3-3.37-3.53-6.13-6.26-8.1l-24.55 3.7 24.94 25.16zm46.3-35.93c3.36 9.2-1.28 19.44-10.46 22.96-9.3 3.57-19.73-1.07-23.3-10.36-.92-2.4-1.3-4.9-1.17-7.32l34.92-5.28zm41.18-6.22c-1.07 6.02-5.17 11.34-11.3 13.7-8.66 3.32-18.33-.5-22.47-8.6l33.77-5.1zM411.3 80.63c3.6 1.98 6.54 5.2 8.12 9.33 3.57 9.3-1.07 19.7-10.36 23.27-4.27 1.64-8.8 1.54-12.76.05l15-32.65zm127.6-21.06c-2 3.17-5 5.74-8.77 7.2-9.28 3.55-19.7-1.1-23.27-10.37-3.56-9.3 1.08-19.7 10.36-23.27 3.08-1.2 6.28-1.47 9.3-.98l12.38 27.42zM436.78 25.14c3.3 2 6 5.08 7.5 8.97 3.57 9.3-1.06 19.73-10.35 23.3-4.04 1.54-8.28 1.54-12.1.3l14.95-32.55zm84.94-3.66c-1.86 2.12-4.26 3.84-7.08 4.92-9.3 3.56-19.7-1.07-23.27-10.36-3.56-9.3 1.07-19.7 10.36-23.27 2.14-.82 4.34-1.2 6.5-1.2l13.5 29.9zm-59.47-51.8c3.04 2 5.5 4.93 6.9 8.6 3.57 9.27-1.07 19.7-10.36 23.26-3.8 1.45-7.8 1.54-11.4.5l14.84-32.36zm42.1 13.28c-1.5 1.28-3.25 2.34-5.2 3.08-9.3 3.57-19.7-1.07-23.27-10.36-3.56-9.28 1.07-19.7 10.36-23.27 1.28-.47 2.58-.8 3.88-1l14.23 31.57zM486.83-55.9c-.98.62-2.04 1.16-3.17 1.6-3.55 1.35-7.27 1.52-10.7.68l7.5-16.38 6.37 14.1zm173.35 582.06c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.9 23.3 10.35zm-55.85-24.87c9.3-3.58 13.93-14 10.36-23.28-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.5c9.26-3.57 13.9-14 10.34-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm-96.23-9.38c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.97-10.37 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.57-13.92 14-10.36 23.28 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.57-13.94 14-10.37 23.28 3.57 9.27 14 13.9 23.28 10.35zm-298 68.08c9.3-3.56 13.93-13.98 10.37-23.27-3.57-9.3-14-13.92-23.27-10.36-9.28 3.56-13.92 13.97-10.35 23.26 3.56 9.3 13.98 13.92 23.26 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.57-13.92 14-10.36 23.28 3.56 9.3 13.97 13.92 23.26 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.57-13.93 14-10.36 23.28 3.56 9.27 13.98 13.9 23.27 10.35zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.94-23.27-10.37-9.26 3.6-13.9 14-10.36 23.3 3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.37zm40.35-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.95 23.27 10.38zm40.35-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.57-9.27-13.98-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-14 10.37-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm-257.62 52.58c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-13.98-13.9-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.56 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.28-3.56 13.92-13.98 10.35-23.27-3.56-9.3-13.98-13.9-23.27-10.35-9.3 3.57-13.92 13.98-10.36 23.27 3.56 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.56 9.3 14 13.92 23.26 10.36zm40.36-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.58-9.3-14-13.93-23.28-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.35-15.48c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.97-13.93-23.26-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm-297.98 68.1c9.27-3.58 13.9-14 10.35-23.28-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.34-15.5c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.35zM502 355.37c9.3-3.56 13.94-13.98 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.27-14-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.3-3.57 13.93-14 10.36-23.28-3.56-9.28-13.98-13.9-23.27-10.35-9.26 3.57-13.9 13.98-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.27 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.27-3.55 13.9-13.97 10.34-23.25-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.92 13.97-10.36 23.26 3.57 9.28 14 13.92 23.28 10.36zm-338.36 83.6c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.28-13.97-13.9-23.26-10.35-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36zM405.8 346c9.3-3.56 13.93-13.97 10.37-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.55 9.28 13.97 13.92 23.25 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.27 3.56-13.9 13.98-10.34 23.27 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.28 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.26-3.55 13.9-13.97 10.34-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.92 23.28 10.35zm40.33-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.57-9.3-14-13.93-23.28-10.37-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.55 13.9-13.97 10.35-23.26-3.57-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.57 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.92-23.25-10.36-9.3 3.57-13.93 13.98-10.37 23.27 3.57 9.3 14 13.94 23.27 10.37zm-378.7 99.06c9.3-3.56 13.94-13.98 10.37-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.57-9.28-14-13.92-23.27-10.36-9.28 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.92 23.27 10.35zm40.36-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.58-13.92 14-10.36 23.28 3.56 9.3 14 13.94 23.26 10.37zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.28-14-13.92-23.27-10.35-9.3 3.56-13.94 13.98-10.37 23.27 3.57 9.28 14 13.92 23.28 10.36zm40.34-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.92-23.27-10.36-9.27 3.57-13.9 13.98-10.34 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.6-9.28-14-13.92-23.3-10.35-9.3 3.56-13.92 13.98-10.35 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.6 9.28 14 13.92 23.3 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.27-3.56 13.9-13.98 10.34-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.94 14-10.37 23.27 3.56 9.3 13.98 13.93 23.26 10.36zM278.6 255.9c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.37-9.26 3.57-13.9 14-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.58 9.3 14 13.93 23.3 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.25 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.27-3.55 13.9-13.97 10.34-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 13.98-10.36 23.27 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.6-13.93 14-10.36 23.3 3.56 9.3 13.98 13.92 23.27 10.35zm40.35-15.5c9.3-3.56 13.92-13.97 10.35-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.58 9.27 14 13.9 23.28 10.34zm40.35-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.56-9.3-13.97-13.95-23.26-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm-297.98 68.08c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.3-14-13.92-23.27-10.36-9.3 3.6-13.93 14-10.36 23.3 3.57 9.3 14 13.9 23.28 10.35zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.27 14 13.9 23.27 10.34zm40.36-15.48c9.28-3.57 13.9-14 10.35-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm121.06-46.48c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.3-3.55 13.93-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.93 14-10.37 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zM449.4 97.74c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.58-13.9 14-10.35 23.3 3.57 9.27 13.98 13.9 23.27 10.35zm40.37-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.26 14 13.9 23.28 10.34zm-15.5-40.35c9.3-3.58 13.93-14 10.37-23.3-3.57-9.3-14-13.9-23.27-10.35-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36z"/>
|
9 |
-
<ellipse fill="#fff" cx="414.946" cy="222.281" rx="10.624" ry="10.624"/>
|
10 |
-
<path fill="#fff" d="M556.4 238.9c-3.46 0-6.12 1.4-7.46 3.93l-.52.97-.84-.74c-2.96-2.54-8.24-5.57-16.8-5.57-17.1 0-28.6 12.8-28.6 31.9 0 19.06 11.9 32.38 28.94 32.38 5.8 0 10.4-1.35 14.04-4.12l1.4-1.04v1.76c0 8.58-5.54 13.3-15.56 13.3-4.9 0-9.32-1.18-12.3-2.26-3.86-1.17-6.12-.2-7.7 3.68l-1.44 3.58-2.06 5.24 1.26.68c6.43 3.4 14.78 5.42 22.34 5.42 15.56 0 33.7-7.95 33.7-30.37l.08-58.76h-8.47zm-22.02 46.9c-10 0-13.56-8.73-13.56-16.88 0-3.6.9-15.3 12.58-15.3 5.8 0 13.56 1.65 13.56 15.9 0 13.45-6.86 16.28-12.58 16.28zm-61.4-48.18c-9.35 0-15.3 4.15-18.64 7.67l-1.12 1.12-.4-1.54c-.98-3.78-4.3-5.84-9.3-5.84h-8.23l.05 64.06h18.25v-29.5c0-2.9.4-5.4 1.14-7.68 2.04-6.9 7.7-11.2 14.8-11.2 5.7 0 7.9 3 7.9 10.76v27.9c0 6.64 3.1 9.75 9.72 9.75h8.7l-.03-40.75c0-16.2-7.9-24.77-22.85-24.77v.02zm-57.8 1.44h-8.65l.05 49.56v14.5h9.25c.1 0 .2.03.33.03l4.3-.02h4.28v-.03h.03l.03-54.3c0-6.55-3.13-9.73-9.6-9.73h-.03zm-31.43 33.54c-.78-1.44-1.63-2.6-2.55-3.57l-.6-.63.6-.6c.92-.94 1.8-2.05 2.7-3.34l17.07-25.42h-20.72l-12.87 19.9c-.72 1.04-2.2 1.6-4.38 1.6h-2.95v-37.57c0-7.52-4.7-8.55-9.73-8.55h-8.67v88.72h18.4v-26.6h1.72c2.1 0 3.52.24 4.18 1.38l10.16 19.16c2.83 5.2 5.66 6.07 10.96 6.07h14.1l-10.5-17.36-6.95-13.18.05-.02zm-82.2-34.83c-19.4 0-33.46 13.95-33.46 33.2 0 19.2 14.04 33.16 33.43 33.16 19.42 0 33.56-13.95 33.56-33.16 0-19.23-14.14-33.18-33.57-33.18v-.03zm0 50.84c-9.16 0-15.52-7.26-15.52-17.64 0-10.4 6.36-17.67 15.5-17.67 9.2 0 15.65 7.3 15.65 17.67 0 10.56-6.3 17.66-15.64 17.66v-.02zm-71.75-50.83c-19.37 0-33.43 13.95-33.43 33.2 0 19.2 14.08 33.16 33.43 33.16 19.43 0 33.57-13.95 33.57-33.16 0-19.23-14.13-33.18-33.57-33.18v-.03zm0 50.84c-9.16 0-15.5-7.26-15.5-17.64 0-10.4 6.34-17.67 15.5-17.67 9.2 0 15.65 7.3 15.65 17.67 0 10.56-6.3 17.66-15.65 17.66v-.02zm-49-30.93l-2.72-1.52 2.35-2c2.73-2.34 7.3-7.6 7.3-16.73 0-13.95-10.82-22.95-27.55-22.95h-21.25c-4.97.2-8.96 4.2-9.02 9.22v79.1l8.8.04H160.56c18.6 0 30.64-10.14 30.64-25.8 0-8.48-3.9-15.7-10.42-19.37zm-19 30.2h-14.87v-17.8c0-3.8 1.46-5.76 4.7-6.22h10.16c7.22 0 11.9 4.56 11.9 11.94 0 7.58-4.56 12.06-11.9 12.08zm-14.87-47.94v-4.7c0-4.07 1.72-6.03 5.52-6.25h7.62c6.5 0 10.42 3.9 10.42 10.43 0 4.96-2.68 10.8-10.2 10.8h-13.37v-10.27z"/>
|
11 |
-
<ellipse fill="#009FE2" cx="582.698" cy="293.181" rx="10.624" ry="10.624"/>
|
12 |
-
<path fill="#009FE2" d="M808.2 237.83c-7.55 0-14.9 3.56-19.6 9.52l-1.34 1.67-1.04-1.88c-3.4-6.2-9.2-9.32-17.3-9.32-8.47 0-14.18 4.74-16.8 7.56l-1.75 1.86-.68-2.47c-.97-3.52-4.12-5.48-8.92-5.48h-7.65l-.08 63.8h17.44v-28.16c0-2.47.3-4.9.9-7.46 1.7-6.82 6.26-14.14 13.95-13.4 4.74.45 7.07 4.1 7.07 11.2v37.8h17.55v-28.15c0-3.1.3-5.4 1-7.7 1.4-6.5 6.17-13.16 13.6-13.16 5.37 0 7.36 3.03 7.36 11.22v28.48c0 6.45 2.86 9.32 9.32 9.32h8.2v-40.72c0-16.3-7.14-24.55-21.24-24.55zm-115.14-.05c-19.43 0-33.47 13.95-33.47 33.2 0 19.2 14.05 33.16 33.44 33.16 19.43 0 33.56-13.94 33.56-33.16 0-19.23-14.15-33.17-33.57-33.17l.03-.02zm0 50.84c-9.18 0-15.56-7.26-15.56-17.65 0-10.4 6.4-17.66 15.54-17.66 9.18 0 15.65 7.3 15.65 17.68 0 10.56-6.32 17.66-15.66 17.66l.02-.02zm-43.57-7.64c-.06.05-7.57 7.95-17.45 7.95-9 0-18.1-5.5-18.1-17.83 0-10.65 7.05-18.1 17.15-18.1 3.28 0 7 1.18 7.6 3.16l.06.33c1.35 4.47 5.4 4.7 6.22 4.7h9.56v-8.34c0-11-14.02-15-23.47-15-20.15 0-34.8 14.02-34.8 33.36s14.5 33.37 34.45 33.37c17.3 0 26.72-11.4 26.8-11.5l.52-.64-7.56-12.55-1 1.08z"/>
|
13 |
-
</g>
|
14 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/facebook.svg
DELETED
@@ -1,11 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 540">
|
2 |
-
<title>facebook-reviews</title>
|
3 |
-
<clipPath>
|
4 |
-
<path d="M0 0h960v540H0z"/>
|
5 |
-
</clipPath>
|
6 |
-
<g fill="none">
|
7 |
-
<path fill="#3B5998" d="M0 0h960v540H0z"/>
|
8 |
-
<path fill="#4161A1" d="M676.33 566.25c2.26-.97 4.22-2.36 5.84-4.03l-4.2-28.26c-4.5-2.5-10.03-3.06-15.2-1.07-8.73 3.3-13.35 12.7-10.93 21.52l24.5 11.8zm-53.78-25.92c7.43-4.4 10.83-13.62 7.63-21.95-3.56-9.3-13.98-13.92-23.27-10.36-7.94 3.06-12.5 11.17-11.36 19.3l27.03 13zm-54.07-26.06c6.17-4.73 8.8-13.12 5.86-20.75-3.57-9.3-14-13.93-23.27-10.36-7.28 2.8-11.7 9.8-11.56 17.15l29 14zm95.87-71.8c-3.72 4.8-4.92 11.4-2.58 17.48 1.33 3.45 3.6 6.26 6.4 8.25l-3.82-25.74zM317.7 549.82c-.2-1.25-.52-2.5-1-3.72-3.55-9.28-13.97-13.92-23.26-10.35-9.3 3.56-13.92 13.98-10.36 23.27.83 2.17 2.04 4.1 3.53 5.7l31.1-14.9zm39.48-18.9c-.04-.1-.08-.2-.1-.3-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27.4 1 .86 1.98 1.4 2.88l32.34-15.48zm38.87-18.63c-4.4-7.38-13.6-10.74-21.9-7.56-9.2 3.54-13.84 13.8-10.45 23.04l32.35-15.5zm38.25-18.34c-4.85-5.34-12.65-7.45-19.8-4.7-8.07 3.1-12.64 11.4-11.33 19.6L434.3 494zm37.56-18c-4.76-3.42-11.1-4.46-17-2.2-6.85 2.63-11.17 9-11.53 15.88L471.86 476zm42.3 12.12c5.06-4.88 7-12.5 4.33-19.46-3.6-9.28-14-13.92-23.3-10.36-6.6 2.53-10.86 8.54-11.48 15.14l30.42 14.66zM657.44 396c-.27.1-.53.2-.8.3-9.28 3.56-13.92 13.98-10.36 23.27 2.7 7 9.3 11.37 16.4 11.54l-5.24-35.1zm-368.9 98.65c5.6 1.33 10.46 5.3 12.68 11.07 3.56 9.3-1.07 19.7-10.36 23.27-2.65 1.02-5.4 1.37-8.03 1.13l5.72-35.47zm367.8-106.13c-.73.4-1.5.75-2.28 1.05-9.3 3.56-19.7-1.08-23.27-10.37-3.6-9.3 1.04-19.7 10.33-23.27 3.38-1.3 6.9-1.5 10.2-.8l4.98 33.38zm-359.5 54.76c1.68-1.58 3.7-2.88 5.97-3.76 9.3-3.56 19.74 1.08 23.3 10.36 3.57 9.3-1.07 19.7-10.36 23.27-8.58 3.3-18.14-.42-22.35-8.34l3.47-21.5zm390.03-137.2c-4.7-6.26-13.17-8.93-20.85-5.98-9.3 3.57-13.93 14-10.36 23.27 1.25 3.26 3.36 5.95 5.97 7.9l25.24-25.2zm67.47-67.37c-3.72-9-13.96-13.44-23.1-9.93-9.3 3.54-13.93 13.96-10.36 23.25 1.84 4.8 5.5 8.36 9.92 10.18l23.54-23.5zM310.64 344c.5-.24 1-.47 1.55-.7 9.25-3.54 19.7 1.1 23.24 10.38 3.56 9.3-1.08 19.7-10.36 23.27-5.97 2.3-12.4 1.2-17.17-2.32l4.64-28.66-1.94-1.98zm459.34-170.67c4.17 1.88 7.62 5.34 9.4 9.95 3.56 9.3-1.08 19.7-10.37 23.27-9.26 3.56-19.7-1.07-23.24-10.36-3.56-9.28 1.07-19.7 10.36-23.26 1.4-.53 2.8-.88 4.23-1.06l9.66 1.46zm14.97 2.27c.13 1.7.5 3.42 1.15 5.1 2.5 6.5 8.37 10.74 14.85 11.45l12.27-12.25-28.27-4.3zM285.2 318.38c.53-6.7 4.8-12.83 11.5-15.4 9.28-3.56 19.7 1.08 23.27 10.37 3.56 9.28-1.08 19.7-10.36 23.27-1.7.65-3.42 1.03-5.16 1.15l-19.23-19.4zm439.46-151.92c-.6 6.64-4.85 12.7-11.5 15.25-9.28 3.6-19.7-1.05-23.27-10.34-1.3-3.4-1.54-6.97-.8-10.3l35.54 5.42zm-96.53-14.67c1.8 8.5-2.78 17.3-11.17 20.5-9.3 3.58-19.7-1.06-23.27-10.35-2-5.2-1.45-10.74 1.1-15.25l33.3 5.08zm30.26 4.6c-.38.13-.74.3-1.1.42-6.54 2.5-13.64.95-18.5-3.43l19.6 3zM238.5 271.3c9.12-3.66 13.64-13.97 10.1-23.17-3.56-9.3-13.97-13.93-23.26-10.36-4.82 1.85-8.4 5.54-10.2 9.96l23.36 23.57zm333.9-137.45c-1.1 5.98-5.2 11.28-11.3 13.62-9.27 3.56-19.7-1.08-23.26-10.36-3.56-9.26 1.08-19.7 10.36-23.24 5.4-2.08 11.2-1.37 15.8 1.4l8.4 18.6zm-235.72 15.9c7.5-.3 14.7 4.15 17.52 11.55 3.57 9.28-1.07 19.7-10.36 23.27-9.28 3.56-19.7-1.08-23.27-10.36-3.56-9.26 1.08-19.7 10.36-23.24.62-.24 1.23-.44 1.85-.6l3.9-.6zm49.12-13.6c3.88 1.94 7.08 5.28 8.76 9.66 3.56 9.3-1.07 19.7-10.36 23.3-9.3 3.56-19.7-1.1-23.27-10.36-1.62-4.23-1.55-8.68-.1-12.62l21.92-3.3 3.05-6.64zm170.03-39.02c-1.82 4.43-5.38 8.13-10.2 9.98-9.3 3.6-19.7-1.04-23.28-10.33-3.56-9.3 1.08-19.7 10.36-23.27 4.17-1.6 8.5-1.56 12.4-.2l10.75 23.84zM171.45 203.65c6.16-4.73 8.77-13.12 5.84-20.74-1.3-3.36-3.54-6.12-6.27-8.1l-24.55 3.7 24.94 25.17zm46.3-35.93c3.36 9.2-1.28 19.44-10.46 22.96-9.3 3.57-19.74-1.07-23.3-10.36-.93-2.4-1.3-4.9-1.18-7.32l34.92-5.28zm41.18-6.22c-1.07 6.02-5.17 11.34-11.3 13.7-8.66 3.32-18.33-.5-22.47-8.6l33.77-5.1zM411.3 80.63c3.6 1.98 6.54 5.2 8.12 9.33 3.57 9.3-1.07 19.7-10.36 23.27-4.27 1.64-8.8 1.54-12.76.05l15-32.65zm127.6-21.06c-2 3.17-5 5.74-8.77 7.2-9.28 3.55-19.7-1.1-23.27-10.37-3.56-9.3 1.08-19.7 10.36-23.27 3.08-1.2 6.28-1.47 9.3-.98l12.38 27.42zM436.78 25.14c3.3 2 6 5.08 7.5 8.97 3.57 9.3-1.06 19.74-10.35 23.3-4.04 1.55-8.28 1.55-12.1.3l14.95-32.54zm84.94-3.66c-1.86 2.12-4.26 3.84-7.08 4.92-9.3 3.56-19.7-1.07-23.27-10.36-3.56-9.3 1.07-19.7 10.36-23.27 2.14-.82 4.34-1.2 6.5-1.2l13.5 29.9zm-59.47-51.8c3.04 2 5.5 4.93 6.9 8.6 3.57 9.27-1.07 19.7-10.36 23.26-3.8 1.45-7.8 1.54-11.4.5l14.83-32.36zm42.1 13.28c-1.5 1.28-3.25 2.34-5.2 3.08-9.3 3.57-19.7-1.07-23.27-10.36-3.56-9.28 1.07-19.7 10.36-23.27 1.28-.46 2.58-.8 3.88-1L504.35-17zM486.83-55.9c-.98.62-2.04 1.16-3.17 1.6-3.55 1.35-7.27 1.52-10.7.68l7.5-16.38 6.37 14.1zm173.35 582.06c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.96-23.27-10.4-9.3 3.57-13.93 14-10.36 23.28 3.6 9.3 14 13.9 23.3 10.35zm-55.85-24.87c9.3-3.6 13.93-14 10.36-23.3-3.6-9.3-14-13.92-23.3-10.35-9.28 3.56-13.9 13.98-10.36 23.26 3.57 9.3 13.98 13.94 23.27 10.37zm40.36-15.5c9.25-3.58 13.9-14 10.33-23.3-3.57-9.27-14-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm-96.24-9.4c9.3-3.55 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.97-10.37 23.26 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.93-13.96 10.36-23.25-3.57-9.3-14-13.93-23.28-10.36-9.3 3.56-13.92 14-10.36 23.27 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.47c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.57-13.94 14-10.37 23.28 3.56 9.27 14 13.9 23.27 10.35zm-298 68.08c9.3-3.55 13.93-13.97 10.37-23.26-3.57-9.3-14-13.92-23.27-10.36-9.28 3.56-13.92 13.97-10.35 23.26 3.56 9.3 13.98 13.92 23.26 10.36zm40.36-15.5c9.3-3.55 13.93-13.96 10.36-23.25-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 14-10.36 23.27 3.56 9.3 13.97 13.92 23.26 10.36zm40.36-15.47c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.57-13.93 14-10.36 23.28 3.56 9.27 13.98 13.9 23.27 10.35zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.94-23.26-10.37-9.26 3.6-13.9 14-10.36 23.3 3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.58-9.3-14-13.94-23.28-10.37-9.3 3.57-13.94 14-10.37 23.28 3.56 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.55-9.3-13.97-13.93-23.26-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.95 23.27 10.38zm40.35-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.57-9.28-13.98-13.9-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.28-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm-257.62 52.58c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-13.98-13.9-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.56 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.28-3.56 13.92-13.98 10.35-23.27-3.56-9.3-13.98-13.9-23.27-10.35-9.3 3.57-13.92 13.98-10.36 23.27 3.56 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.56-9.3-13.98-13.9-23.26-10.35-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.35-15.48c9.3-3.58 13.93-14 10.36-23.28-3.55-9.3-13.97-13.93-23.26-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.56 9.3 14 13.92 23.26 10.36zm40.36-15.5c9.3-3.57 13.93-14 10.37-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.56-13.94 13.98-10.37 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.36-15.5c9.3-3.56 13.94-14 10.37-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.55 13.92-13.97 10.36-23.25-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.92 13.97-10.36 23.26 3.56 9.27 13.98 13.9 23.27 10.35zm-297.98 68.1c9.27-3.57 13.9-14 10.35-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.34-15.5c9.3-3.56 13.93-14 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 14-10.37 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.25-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.55 9.27 13.97 13.9 23.26 10.35zm40.36-15.5c9.28-3.54 13.92-13.96 10.36-23.25-3.58-9.28-14-13.92-23.28-10.36-9.3 3.56-13.93 14-10.36 23.26 3.55 9.28 13.97 13.92 23.26 10.35zM502 355.38c9.3-3.56 13.94-13.98 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.26-14-13.9-23.27-10.34-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.3-3.58 13.93-14 10.36-23.3-3.56-9.27-13.98-13.9-23.27-10.34-9.25 3.57-13.9 13.98-10.33 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.58 13.92-14 10.36-23.28-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.6 9.3 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.57 13.93-13.98 10.36-23.27-3.6-9.3-14-13.93-23.3-10.36-9.28 3.56-13.9 13.98-10.36 23.27 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.26-3.56 13.9-13.98 10.33-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.92 13.97-10.36 23.26 3.57 9.28 14 13.92 23.28 10.36zm-338.37 83.6c9.3-3.57 13.93-14 10.36-23.28-3.56-9.28-13.98-13.9-23.27-10.35-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36zM405.8 346c9.3-3.56 13.93-13.97 10.37-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.36-9.3 3.54-13.93 13.96-10.37 23.25 3.54 9.28 13.96 13.92 23.24 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.26 3.56-13.9 13.98-10.33 23.27 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.57-13.93 14-10.36 23.28 3.6 9.28 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.6-9.3-14-13.93-23.3-10.36-9.28 3.56-13.9 13.98-10.36 23.26 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.25-3.55 13.9-13.97 10.33-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.9 23.28 10.34zm40.32-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.57-9.3-14-13.94-23.28-10.38-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.55 13.9-13.97 10.35-23.26-3.57-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.56 9.3 14 13.94 23.27 10.37zm40.34-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.9-23.25-10.35-9.3 3.57-13.93 13.98-10.37 23.27 3.57 9.3 14 13.94 23.27 10.37zm-378.7 99.06c9.3-3.56 13.94-13.98 10.37-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.9 23.27 10.34zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.94-23.26-10.38-9.28 3.58-13.92 14-10.36 23.28 3.56 9.3 14 13.94 23.26 10.37zm40.36-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.36-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.9-23.26-10.35-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.28-14-13.92-23.27-10.35-9.3 3.56-13.94 13.98-10.37 23.27 3.56 9.28 14 13.92 23.27 10.36zm40.34-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.54-13.93 13.96-10.36 23.25 3.56 9.28 13.98 13.92 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.9-23.27-10.35-9.28 3.57-13.9 13.98-10.35 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.3-3.57 13.93-13.98 10.37-23.27-3.6-9.28-14-13.92-23.3-10.35-9.3 3.56-13.92 13.98-10.35 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.6 9.28 14 13.92 23.3 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.54-13.92 13.96-10.35 23.25 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.27-3.56 13.9-13.98 10.34-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.56-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.36-15.48c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.58-13.94 14-10.37 23.28 3.56 9.3 13.98 13.93 23.26 10.36zM278.6 255.9c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.37-9.27 3.57-13.9 14-10.35 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.93 23.3 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.54-13.92 13.96-10.35 23.24 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.27-3.55 13.9-13.97 10.34-23.26-3.55-9.28-13.97-13.92-23.26-10.36-9.28 3.57-13.92 13.98-10.36 23.27 3.58 9.3 14 13.93 23.28 10.36zM440 193.94c9.3-3.56 13.93-13.98 10.37-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.6-13.92 14-10.35 23.3 3.56 9.3 13.98 13.93 23.27 10.36zm40.36-15.5c9.3-3.56 13.92-13.97 10.35-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.58 9.26 14 13.9 23.28 10.33zm40.35-15.48c9.3-3.57 13.93-13.98 10.37-23.27-3.56-9.3-13.97-13.96-23.26-10.4-9.3 3.57-13.92 14-10.35 23.28 3.55 9.27 13.97 13.9 23.26 10.35zm-297.97 68.08c9.28-3.56 13.92-13.98 10.36-23.27-3.58-9.3-14-13.92-23.28-10.36-9.3 3.6-13.93 14-10.36 23.3 3.57 9.3 14 13.9 23.28 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.26 14 13.9 23.27 10.33zm40.36-15.48c9.28-3.57 13.9-14 10.35-23.27-3.58-9.3-14-13.96-23.28-10.4-9.3 3.57-13.93 14-10.36 23.28 3.56 9.27 13.98 13.9 23.27 10.35zm121.06-46.48c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.94 14-10.37 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.3-3.55 13.93-13.97 10.36-23.26-3.55-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.93 14-10.37 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.48c9.3-3.56 13.93-13.98 10.37-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm-55.8-24.86c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.6-13.9 14-10.35 23.3 3.57 9.28 13.98 13.9 23.27 10.36zm40.37-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.25 14 13.9 23.28 10.33zm-15.5-40.35c9.3-3.6 13.93-14 10.37-23.3-3.57-9.3-14-13.9-23.27-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.58 9.3 14 13.94 23.28 10.37z"/>
|
9 |
-
<path fill="#fff" d="M500.92 246.9c-5.35 0-9.2 1.77-13.12 3.56v40.45c3.75.37 5.9.37 9.45.37 12.85 0 14.6-5.88 14.6-14.1v-19.32c0-6.06-2-10.94-10.93-10.94zm-85.3-2.2c-8.92 0-10.96 4.9-10.96 10.96v3.4h21.88v-3.4c0-6.06-2.03-10.95-10.93-10.95zm-165.28 42.12c0 4.8 2.26 7.28 7.25 7.28 5.35 0 8.52-1.74 12.43-3.54v-9.6h-11.7c-5.56 0-8 1.04-8 5.86zm333.57-39.9c-8.92 0-12 4.87-12 10.93V280c0 6.07 3.08 10.96 12 10.96 8.9 0 12.03-4.9 12.03-10.97v-22.15c0-6.06-3.12-10.94-12.02-10.94zm-377.3 64.72h-26.25v-63.52h-13.12v-21.9h13.12V213.1c0-17.85 7.4-28.47 28.43-28.47h17.52v21.9h-10.95c-8.2 0-8.73 3.06-8.73 8.77l-.03 10.96h19.82l-2.32 21.9h-17.5v63.5zm89.68.16H274.4l-.94-5.53c-10 5.53-18.9 6.43-24.78 6.43-16.04 0-24.58-10.72-24.58-25.54 0-17.48 9.96-23.72 27.8-23.72h18.13v-3.78c0-8.92-1.03-11.54-14.75-11.54h-22.44l2.2-21.9h24.52c30.12 0 36.72 9.52 36.72 33.62v51.96zm74.38-62.08c-13.6-2.33-17.52-2.84-24.07-2.84-11.78 0-15.33 2.6-15.33 12.58v18.9c0 10 3.55 12.6 15.32 12.6 6.54 0 10.45-.53 24.06-2.87v21.34c-11.92 2.67-19.7 3.38-26.26 3.38-28.17 0-39.37-14.82-39.37-36.23v-15.34c0-21.42 11.2-36.27 39.37-36.27 6.57 0 14.34.7 26.26 3.38v21.34zm82.13 26.87h-48.14v1.76c0 10 3.56 12.6 15.32 12.6 10.57 0 17.02-.53 30.6-2.87v21.34c-13.1 2.67-19.92 3.38-32.78 3.38-28.17 0-39.38-14.82-39.38-36.23v-17.54c0-18.73 8.3-34.07 37.2-34.07 28.86 0 37.17 15.16 37.17 34.06v17.53zm85.3.4c0 20.7-5.92 35.78-41.74 35.78-12.93 0-20.52-1.14-34.8-3.34V191.18l26.24-4.38v41.37c5.67-2.1 13-3.18 19.7-3.18 26.23 0 30.6 11.76 30.6 30.66V277zm84.1.45c0 17.85-7.37 35.16-38.2 35.16-30.84 0-38.35-17.3-38.35-35.15v-17.23c0-17.86 7.5-35.17 38.35-35.17 30.83 0 38.2 17.3 38.2 35.17v17.23zm84.04 0c0 17.85-7.38 35.16-38.2 35.16-30.85 0-38.35-17.3-38.35-35.15v-17.23c0-17.86 7.5-35.17 38.34-35.17 30.82 0 38.2 17.3 38.2 35.17v17.23zm86.24 34.2h-28.43L740 271.48v40.14h-26.25V191.18L740 186.8v77.55l24.05-38.12h28.43l-26.25 41.6 26.25 43.8zM667.95 246.9c-8.9 0-12 4.9-12 10.95V280c0 6.07 3.1 10.96 12 10.96S680 286.06 680 280v-22.15c0-6.06-3.15-10.94-12.05-10.94zM807.46 296.66c4.42 0 7.94 3.6 7.94 8.1 0 4.57-3.52 8.13-7.97 8.13-4.43 0-8.02-3.57-8.02-8.14 0-4.5 3.6-8.1 8.03-8.1h.03zm-.03 1.26c-3.56 0-6.47 3.06-6.47 6.84 0 3.85 2.9 6.87 6.5 6.87 3.6.04 6.47-3.02 6.47-6.84s-2.87-6.88-6.47-6.88h-.03zm-1.5 11.56h-1.45v-9.04c.75-.1 1.47-.22 2.55-.22 1.37 0 2.26.3 2.8.68.54.4.83 1 .83 1.87 0 1.2-.8 1.9-1.75 2.2v.08c.8.14 1.33.86 1.5 2.2.22 1.4.44 1.93.6 2.23h-1.52c-.22-.3-.43-1.12-.62-2.3-.2-1.16-.8-1.6-1.94-1.6h-1v3.9zm0-5h1.03c1.18 0 2.2-.44 2.2-1.56 0-.8-.58-1.58-2.2-1.58-.47 0-.8.03-1.04.07v3.07z"/>
|
10 |
-
</g>
|
11 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/google.svg
DELETED
@@ -1,15 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 540">
|
2 |
-
<title>google-reviews</title>
|
3 |
-
<clipPath>
|
4 |
-
<path d="M0 0h960v540H0z"/>
|
5 |
-
</clipPath>
|
6 |
-
<g fill="none">
|
7 |
-
<path fill="#C6DAFC" d="M0 0h960v540H0z"/>
|
8 |
-
<path fill="#D3E3FC" d="M676.33 566.25c2.26-.97 4.22-2.36 5.84-4.03l-4.2-28.26c-4.5-2.5-10.03-3.06-15.2-1.07-8.73 3.32-13.35 12.7-10.93 21.53l24.5 11.8zm-53.78-25.92c7.43-4.4 10.83-13.62 7.63-21.95-3.56-9.3-13.98-13.92-23.27-10.36-7.95 3.06-12.5 11.17-11.37 19.3l27.03 13zm-54.07-26.06c6.17-4.73 8.8-13.12 5.86-20.75-3.57-9.3-14-13.93-23.27-10.36-7.28 2.8-11.7 9.8-11.56 17.15l29 13.98zm95.87-71.8c-3.72 4.8-4.92 11.4-2.58 17.48 1.33 3.45 3.6 6.26 6.4 8.25l-3.82-25.74zM317.7 549.82c-.2-1.25-.52-2.5-1-3.72-3.55-9.28-13.97-13.92-23.26-10.35-9.3 3.56-13.92 13.98-10.36 23.27.83 2.17 2.04 4.1 3.53 5.7l31.1-14.9zm39.48-18.9c-.04-.1-.08-.2-.1-.3-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27.4 1 .86 1.98 1.4 2.88l32.34-15.48zm38.87-18.63c-4.4-7.37-13.6-10.73-21.9-7.55-9.2 3.54-13.84 13.8-10.45 23.04l32.35-15.5zm38.25-18.33c-4.85-5.34-12.65-7.45-19.8-4.7-8.07 3.1-12.64 11.4-11.33 19.6L434.3 494zm37.56-18c-4.76-3.42-11.1-4.46-17-2.2-6.85 2.63-11.17 9-11.53 15.88L471.86 476zm42.3 12.12c5.06-4.88 7-12.5 4.33-19.46-3.6-9.28-14-13.92-23.3-10.36-6.6 2.53-10.85 8.54-11.47 15.14l30.42 14.66zm143.28-92.07c-.27.1-.53.2-.8.3-9.28 3.55-13.92 13.97-10.36 23.26 2.7 7 9.3 11.37 16.4 11.54l-5.24-35.1zm-368.9 98.64c5.6 1.33 10.46 5.3 12.68 11.07 3.56 9.3-1.07 19.7-10.36 23.27-2.65 1.03-5.4 1.38-8.03 1.14l5.72-35.47zm367.8-106.13c-.73.4-1.5.75-2.28 1.05-9.3 3.56-19.7-1.08-23.27-10.37-3.58-9.3 1.05-19.7 10.34-23.27 3.38-1.3 6.9-1.5 10.2-.8l4.98 33.38zm-359.5 54.76c1.68-1.58 3.7-2.88 5.97-3.76 9.3-3.56 19.73 1.08 23.3 10.36 3.56 9.3-1.08 19.7-10.37 23.27-8.58 3.3-18.14-.42-22.35-8.34l3.48-21.52zm390.03-137.2c-4.7-6.26-13.17-8.93-20.85-5.98-9.3 3.57-13.93 14-10.36 23.27 1.25 3.26 3.36 5.95 5.97 7.9l25.24-25.2zm67.47-67.37c-3.72-9-13.96-13.45-23.1-9.94-9.3 3.54-13.93 13.96-10.36 23.25 1.84 4.8 5.5 8.36 9.92 10.18l23.54-23.5zm-443.7 105.3c.5-.25 1-.48 1.55-.7 9.26-3.55 19.7 1.1 23.25 10.37 3.56 9.3-1.08 19.7-10.36 23.27-5.97 2.3-12.4 1.2-17.17-2.32l4.63-28.66-1.94-1.98zm459.34-170.68c4.17 1.88 7.62 5.34 9.4 9.95 3.56 9.3-1.08 19.7-10.37 23.27-9.27 3.56-19.7-1.07-23.25-10.36-3.56-9.27 1.07-19.7 10.36-23.25 1.4-.53 2.8-.88 4.23-1.06l9.66 1.46zm14.97 2.27c.13 1.7.5 3.42 1.15 5.1 2.5 6.5 8.37 10.74 14.85 11.45l12.27-12.25-28.27-4.3zM285.2 318.38c.53-6.7 4.8-12.83 11.5-15.4 9.28-3.56 19.7 1.08 23.27 10.37 3.56 9.28-1.08 19.7-10.36 23.27-1.7.65-3.43 1.03-5.17 1.15l-19.23-19.4zm439.46-151.92c-.6 6.64-4.85 12.7-11.5 15.25-9.28 3.58-19.7-1.06-23.27-10.35-1.3-3.4-1.53-6.97-.8-10.3l35.55 5.42zm-96.53-14.67c1.8 8.5-2.78 17.3-11.17 20.52-9.3 3.57-19.7-1.07-23.27-10.36-2-5.2-1.44-10.74 1.1-15.25l33.32 5.08zm30.26 4.6c-.37.14-.73.3-1.1.43-6.53 2.5-13.63.95-18.5-3.43l19.6 3zM238.5 271.3c9.12-3.66 13.64-13.97 10.1-23.17-3.56-9.3-13.97-13.93-23.26-10.36-4.82 1.85-8.4 5.54-10.2 9.96l23.36 23.57zm333.9-137.45c-1.1 5.98-5.2 11.28-11.3 13.62-9.27 3.56-19.7-1.08-23.26-10.36-3.56-9.27 1.08-19.7 10.36-23.25 5.4-2.08 11.2-1.37 15.8 1.4l8.4 18.6zm-235.72 15.9c7.5-.3 14.7 4.15 17.52 11.55 3.57 9.28-1.07 19.7-10.36 23.27-9.28 3.56-19.7-1.08-23.27-10.36-3.56-9.27 1.08-19.7 10.36-23.25.62-.24 1.23-.44 1.85-.6l3.9-.6zm49.12-13.6c3.88 1.94 7.08 5.28 8.76 9.66 3.56 9.3-1.07 19.7-10.36 23.3-9.3 3.55-19.7-1.1-23.27-10.37-1.62-4.23-1.55-8.68-.1-12.62l21.92-3.3 3.05-6.64zm170.03-39.02c-1.82 4.43-5.38 8.13-10.2 9.98-9.3 3.6-19.7-1.05-23.28-10.34-3.56-9.3 1.08-19.7 10.36-23.27 4.16-1.6 8.5-1.56 12.4-.2l10.74 23.84zM171.45 203.65c6.16-4.73 8.77-13.12 5.84-20.74-1.3-3.37-3.53-6.13-6.26-8.1l-24.55 3.7 24.94 25.16zm46.3-35.93c3.36 9.2-1.28 19.44-10.46 22.96-9.3 3.57-19.73-1.07-23.3-10.36-.92-2.4-1.3-4.9-1.17-7.32l34.92-5.28zm41.18-6.22c-1.07 6.02-5.17 11.34-11.3 13.7-8.66 3.32-18.33-.5-22.47-8.6l33.77-5.1zM411.3 80.63c3.6 1.98 6.54 5.2 8.12 9.33 3.57 9.3-1.07 19.7-10.36 23.27-4.27 1.64-8.8 1.54-12.76.05l15-32.65zm127.6-21.06c-2 3.17-5 5.74-8.77 7.2-9.28 3.55-19.7-1.1-23.27-10.37-3.56-9.3 1.08-19.7 10.36-23.27 3.08-1.2 6.28-1.47 9.3-.98l12.38 27.42zM436.78 25.14c3.3 2 6 5.08 7.5 8.97 3.57 9.3-1.06 19.73-10.35 23.3-4.04 1.54-8.28 1.54-12.1.3l14.95-32.55zm84.94-3.66c-1.86 2.12-4.26 3.84-7.08 4.92-9.3 3.56-19.7-1.07-23.27-10.36-3.56-9.3 1.07-19.7 10.36-23.27 2.14-.82 4.34-1.2 6.5-1.2l13.5 29.9zm-59.47-51.8c3.04 2 5.5 4.93 6.9 8.6 3.57 9.27-1.07 19.7-10.36 23.26-3.8 1.45-7.8 1.54-11.4.5l14.84-32.36zm42.1 13.28c-1.5 1.28-3.25 2.34-5.2 3.08-9.3 3.57-19.7-1.07-23.27-10.36-3.56-9.28 1.07-19.7 10.36-23.27 1.28-.47 2.58-.8 3.88-1l14.23 31.57zM486.83-55.9c-.98.62-2.04 1.16-3.17 1.6-3.55 1.35-7.27 1.52-10.7.68l7.5-16.38 6.37 14.1zm173.35 582.06c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.9 23.3 10.35zm-55.85-24.87c9.3-3.58 13.93-14 10.36-23.28-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.5c9.26-3.57 13.9-14 10.34-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm-96.23-9.38c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.97-10.37 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.57-13.92 14-10.36 23.28 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.57-13.94 14-10.37 23.28 3.57 9.27 14 13.9 23.28 10.35zm-298 68.08c9.3-3.56 13.93-13.98 10.37-23.27-3.57-9.3-14-13.92-23.27-10.36-9.28 3.56-13.92 13.97-10.35 23.26 3.56 9.3 13.98 13.92 23.26 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.57-13.92 14-10.36 23.28 3.56 9.3 13.97 13.92 23.26 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.57-13.93 14-10.36 23.28 3.56 9.27 13.98 13.9 23.27 10.35zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.94-23.27-10.37-9.26 3.6-13.9 14-10.36 23.3 3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.37zm40.35-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.95 23.27 10.38zm40.35-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.57-9.27-13.98-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-14 10.37-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm-257.62 52.58c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-13.98-13.9-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.56 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.28-3.56 13.92-13.98 10.35-23.27-3.56-9.3-13.98-13.9-23.27-10.35-9.3 3.57-13.92 13.98-10.36 23.27 3.56 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.56 9.3 14 13.92 23.26 10.36zm40.36-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.58-9.3-14-13.93-23.28-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.35-15.48c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.97-13.93-23.26-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm-297.98 68.1c9.27-3.58 13.9-14 10.35-23.28-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.34-15.5c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.35zM502 355.37c9.3-3.56 13.94-13.98 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.27-14-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.3-3.57 13.93-14 10.36-23.28-3.56-9.28-13.98-13.9-23.27-10.35-9.26 3.57-13.9 13.98-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.27 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.27-3.55 13.9-13.97 10.34-23.25-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.92 13.97-10.36 23.26 3.57 9.28 14 13.92 23.28 10.36zm-338.36 83.6c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.28-13.97-13.9-23.26-10.35-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36zM405.8 346c9.3-3.56 13.93-13.97 10.37-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.55 9.28 13.97 13.92 23.25 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.27 3.56-13.9 13.98-10.34 23.27 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.28 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.26-3.55 13.9-13.97 10.34-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.92 23.28 10.35zm40.33-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.57-9.3-14-13.93-23.28-10.37-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.55 13.9-13.97 10.35-23.26-3.57-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.57 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.92-23.25-10.36-9.3 3.57-13.93 13.98-10.37 23.27 3.57 9.3 14 13.94 23.27 10.37zm-378.7 99.06c9.3-3.56 13.94-13.98 10.37-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.57-9.28-14-13.92-23.27-10.36-9.28 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.92 23.27 10.35zm40.36-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.58-13.92 14-10.36 23.28 3.56 9.3 14 13.94 23.26 10.37zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.28-14-13.92-23.27-10.35-9.3 3.56-13.94 13.98-10.37 23.27 3.57 9.28 14 13.92 23.28 10.36zm40.34-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.92-23.27-10.36-9.27 3.57-13.9 13.98-10.34 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.6-9.28-14-13.92-23.3-10.35-9.3 3.56-13.92 13.98-10.35 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.6 9.28 14 13.92 23.3 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.27-3.56 13.9-13.98 10.34-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.94 14-10.37 23.27 3.56 9.3 13.98 13.93 23.26 10.36zM278.6 255.9c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.37-9.26 3.57-13.9 14-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.58 9.3 14 13.93 23.3 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.25 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.27-3.55 13.9-13.97 10.34-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 13.98-10.36 23.27 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.6-13.93 14-10.36 23.3 3.56 9.3 13.98 13.92 23.27 10.35zm40.35-15.5c9.3-3.56 13.92-13.97 10.35-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.58 9.27 14 13.9 23.28 10.34zm40.35-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.56-9.3-13.97-13.95-23.26-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm-297.98 68.08c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.3-14-13.92-23.27-10.36-9.3 3.6-13.93 14-10.36 23.3 3.57 9.3 14 13.9 23.28 10.35zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.27 14 13.9 23.27 10.34zm40.36-15.48c9.28-3.57 13.9-14 10.35-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm121.06-46.48c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.3-3.55 13.93-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.93 14-10.37 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zM449.4 97.74c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.58-13.9 14-10.35 23.3 3.57 9.27 13.98 13.9 23.27 10.35zm40.37-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.26 14 13.9 23.28 10.34zm-15.5-40.35c9.3-3.58 13.93-14 10.37-23.3-3.57-9.3-14-13.9-23.27-10.35-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36z"/>
|
9 |
-
<path stroke="#99BAF9" stroke-width="2" d="M606 246H483v51h70.8c-6.6 32.4-34.2 51-70.8 51-43.2 0-78-34.8-78-78s34.8-78 78-78c18.6 0 35.4 6.6 48.6 17.4L570 171c-23.4-20.4-53.4-33-87-33-73.2 0-132 58.8-132 132s58.8 132 132 132c66 0 126-48 126-132 0-7.8-1.2-16.2-3-24z"/>
|
10 |
-
<path fill="#4285F4" d="M553.8 297H483v-51h123c1.8 7.8 3 16.2 3 24 0 43.02-15.74 76.6-39.96 99.13L526.9 336.5c13.77-8.7 23.36-22.1 26.9-39.5z"/>
|
11 |
-
<path fill="#34A853" d="M526.9 336.5C515 344 499.95 348 483 348c-34.66 0-63.9-22.4-74.12-53.57l-44.38 34.02C385.96 372.12 430.82 402 483 402c32.2 0 62.96-11.42 86.04-32.87L526.9 336.5z"/>
|
12 |
-
<path fill="#FBBC05" d="M408.9 294.54c-2.53-7.7-3.9-15.96-3.9-24.54 0-8.58 1.37-16.83 3.9-24.54l-44.38-33.95C355.86 229.13 351 248.97 351 270s4.86 40.88 13.52 58.5l44.4-33.96z"/>
|
13 |
-
<path fill="#EA4335" d="M408.9 245.46C419.16 214.36 448.4 192 483 192c18.6 0 35.4 6.6 48.6 17.4L570 171c-23.4-20.4-53.4-33-87-33-52.16 0-97 29.86-118.48 73.5l44.4 33.96z"/>
|
14 |
-
</g>
|
15 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/icon.png
DELETED
Binary file
|
assets/img/pinned.svg
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800">
|
2 |
-
<title>pinned</title>
|
3 |
-
<g fill="none">
|
4 |
-
<path fill="currentColor" d="M450 1l900-1-1 258c-62.07 13.33-113.63 44.83-154.67 94.5-41.05 49.67-61.57 107.17-61.57 172.5v50c.67 65.33 21.36 122.67 62.07 172 40.7 49.33 92.43 80.67 155.17 94l-1 258h-341.38l-1 257c0 51.33-11.35 137.67-34.04 259-22.7 121.33-46.72 182-72.08 182-26.03 0-50.56-60.67-73.58-182-23.03-121.33-34.54-207.67-34.54-259v-256L450 1099l1-258c62.07-12.67 113.46-43.83 154.17-93.5 40.7-49.67 61.07-107.17 61.07-172.5v-50c0-65.33-20.36-122.83-61.07-172.5-40.7-49.67-92.43-81.17-155.17-94.5V1z"/>
|
5 |
-
</g>
|
6 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/star-filled.svg
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800">
|
2 |
-
<title>star-filled</title>
|
3 |
-
<g fill="#ffb900">
|
4 |
-
<path d="M900 0L600 600 0 675l412 462-112 663 600-300 600 300-113-663 413-462-600-75z"/>
|
5 |
-
</g>
|
6 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/star-half.svg
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1800 1800">
|
2 |
-
<title>star-half</title>
|
3 |
-
<g fill="#ffb900">
|
4 |
-
<path d="M900 0L600 600 0 675l413 462-113 663 600-300 600 300-112-663 412-462-600-75L900 0zm0 224l234 469 465 58-318 356 87 515-468-234V224z"/>
|
5 |
-
</g>
|
6 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/tripadvisor.svg
DELETED
@@ -1,21 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 540">
|
2 |
-
<title>tripadvisor-reviews</title>
|
3 |
-
<clipPath>
|
4 |
-
<path d="M0 0h960v540H0z"/>
|
5 |
-
</clipPath>
|
6 |
-
<g fill="none">
|
7 |
-
<path fill="#4B7E37" d="M0 0h960v540H0z"/>
|
8 |
-
<path fill="#558A42" d="M676.33 566.25c2.26-.97 4.22-2.36 5.84-4.03l-4.2-28.26c-4.5-2.5-10.03-3.06-15.2-1.07-8.73 3.32-13.35 12.7-10.93 21.53l24.5 11.8zm-53.78-25.92c7.43-4.4 10.83-13.62 7.63-21.95-3.56-9.3-13.98-13.92-23.27-10.36-7.95 3.06-12.5 11.17-11.37 19.3l27.03 13zm-54.07-26.06c6.17-4.73 8.8-13.12 5.86-20.75-3.57-9.3-14-13.93-23.27-10.36-7.28 2.8-11.7 9.8-11.56 17.15l29 13.98zm95.87-71.8c-3.72 4.8-4.92 11.4-2.58 17.48 1.33 3.45 3.6 6.26 6.4 8.25l-3.82-25.74zM317.7 549.82c-.2-1.25-.52-2.5-1-3.72-3.55-9.28-13.97-13.92-23.26-10.35-9.3 3.56-13.92 13.98-10.36 23.27.83 2.17 2.04 4.1 3.53 5.7l31.1-14.9zm39.48-18.9c-.04-.1-.08-.2-.1-.3-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27.4 1 .86 1.98 1.4 2.88l32.34-15.48zm38.87-18.63c-4.4-7.37-13.6-10.73-21.9-7.55-9.2 3.54-13.84 13.8-10.45 23.04l32.35-15.5zm38.25-18.33c-4.85-5.34-12.65-7.45-19.8-4.7-8.07 3.1-12.64 11.4-11.33 19.6L434.3 494zm37.56-18c-4.76-3.42-11.1-4.46-17-2.2-6.85 2.63-11.17 9-11.53 15.88L471.86 476zm42.3 12.12c5.06-4.88 7-12.5 4.33-19.46-3.6-9.28-14-13.92-23.3-10.36-6.6 2.53-10.85 8.54-11.47 15.14l30.42 14.66zm143.28-92.07c-.27.1-.53.2-.8.3-9.28 3.55-13.92 13.97-10.36 23.26 2.7 7 9.3 11.37 16.4 11.54l-5.24-35.1zm-368.9 98.64c5.6 1.33 10.46 5.3 12.68 11.07 3.56 9.3-1.07 19.7-10.36 23.27-2.65 1.03-5.4 1.38-8.03 1.14l5.72-35.47zm367.8-106.13c-.73.4-1.5.75-2.28 1.05-9.3 3.56-19.7-1.08-23.27-10.37-3.58-9.3 1.05-19.7 10.34-23.27 3.38-1.3 6.9-1.5 10.2-.8l4.98 33.38zm-359.5 54.76c1.68-1.58 3.7-2.88 5.97-3.76 9.3-3.56 19.73 1.08 23.3 10.36 3.56 9.3-1.08 19.7-10.37 23.27-8.58 3.3-18.14-.42-22.35-8.34l3.48-21.52zm390.03-137.2c-4.7-6.26-13.17-8.93-20.85-5.98-9.3 3.57-13.93 14-10.36 23.27 1.25 3.26 3.36 5.95 5.97 7.9l25.24-25.2zm67.47-67.37c-3.72-9-13.96-13.45-23.1-9.94-9.3 3.54-13.93 13.96-10.36 23.25 1.84 4.8 5.5 8.36 9.92 10.18l23.54-23.5zm-443.7 105.3c.5-.25 1-.48 1.55-.7 9.26-3.55 19.7 1.1 23.25 10.37 3.56 9.3-1.08 19.7-10.36 23.27-5.97 2.3-12.4 1.2-17.17-2.32l4.63-28.66-1.94-1.98zm459.34-170.68c4.17 1.88 7.62 5.34 9.4 9.95 3.56 9.3-1.08 19.7-10.37 23.27-9.27 3.56-19.7-1.07-23.25-10.36-3.56-9.27 1.07-19.7 10.36-23.25 1.4-.53 2.8-.88 4.23-1.06l9.66 1.46zm14.97 2.27c.13 1.7.5 3.42 1.15 5.1 2.5 6.5 8.37 10.74 14.85 11.45l12.27-12.25-28.27-4.3zM285.2 318.38c.53-6.7 4.8-12.83 11.5-15.4 9.28-3.56 19.7 1.08 23.27 10.37 3.56 9.28-1.08 19.7-10.36 23.27-1.7.65-3.43 1.03-5.17 1.15l-19.23-19.4zm439.46-151.92c-.6 6.64-4.85 12.7-11.5 15.25-9.28 3.58-19.7-1.06-23.27-10.35-1.3-3.4-1.53-6.97-.8-10.3l35.55 5.42zm-96.53-14.67c1.8 8.5-2.78 17.3-11.17 20.52-9.3 3.57-19.7-1.07-23.27-10.36-2-5.2-1.44-10.74 1.1-15.25l33.32 5.08zm30.26 4.6c-.37.14-.73.3-1.1.43-6.53 2.5-13.63.95-18.5-3.43l19.6 3zM238.5 271.3c9.12-3.66 13.64-13.97 10.1-23.17-3.56-9.3-13.97-13.93-23.26-10.36-4.82 1.85-8.4 5.54-10.2 9.96l23.36 23.57zm333.9-137.45c-1.1 5.98-5.2 11.28-11.3 13.62-9.27 3.56-19.7-1.08-23.26-10.36-3.56-9.27 1.08-19.7 10.36-23.25 5.4-2.08 11.2-1.37 15.8 1.4l8.4 18.6zm-235.72 15.9c7.5-.3 14.7 4.15 17.52 11.55 3.57 9.28-1.07 19.7-10.36 23.27-9.28 3.56-19.7-1.08-23.27-10.36-3.56-9.27 1.08-19.7 10.36-23.25.62-.24 1.23-.44 1.85-.6l3.9-.6zm49.12-13.6c3.88 1.94 7.08 5.28 8.76 9.66 3.56 9.3-1.07 19.7-10.36 23.3-9.3 3.55-19.7-1.1-23.27-10.37-1.62-4.23-1.55-8.68-.1-12.62l21.92-3.3 3.05-6.64zm170.03-39.02c-1.82 4.43-5.38 8.13-10.2 9.98-9.3 3.6-19.7-1.05-23.28-10.34-3.56-9.3 1.08-19.7 10.36-23.27 4.16-1.6 8.5-1.56 12.4-.2l10.74 23.84zM171.45 203.65c6.16-4.73 8.77-13.12 5.84-20.74-1.3-3.37-3.53-6.13-6.26-8.1l-24.55 3.7 24.94 25.16zm46.3-35.93c3.36 9.2-1.28 19.44-10.46 22.96-9.3 3.57-19.73-1.07-23.3-10.36-.92-2.4-1.3-4.9-1.17-7.32l34.92-5.28zm41.18-6.22c-1.07 6.02-5.17 11.34-11.3 13.7-8.66 3.32-18.33-.5-22.47-8.6l33.77-5.1zM411.3 80.63c3.6 1.98 6.54 5.2 8.12 9.33 3.57 9.3-1.07 19.7-10.36 23.27-4.27 1.64-8.8 1.54-12.76.05l15-32.65zm127.6-21.06c-2 3.17-5 5.74-8.77 7.2-9.28 3.55-19.7-1.1-23.27-10.37-3.56-9.3 1.08-19.7 10.36-23.27 3.08-1.2 6.28-1.47 9.3-.98l12.38 27.42zM436.78 25.14c3.3 2 6 5.08 7.5 8.97 3.57 9.3-1.06 19.73-10.35 23.3-4.04 1.54-8.28 1.54-12.1.3l14.95-32.55zm84.94-3.66c-1.86 2.12-4.26 3.84-7.08 4.92-9.3 3.56-19.7-1.07-23.27-10.36-3.56-9.3 1.07-19.7 10.36-23.27 2.14-.82 4.34-1.2 6.5-1.2l13.5 29.9zm-59.47-51.8c3.04 2 5.5 4.93 6.9 8.6 3.57 9.27-1.07 19.7-10.36 23.26-3.8 1.45-7.8 1.54-11.4.5l14.84-32.36zm42.1 13.28c-1.5 1.28-3.25 2.34-5.2 3.08-9.3 3.57-19.7-1.07-23.27-10.36-3.56-9.28 1.07-19.7 10.36-23.27 1.28-.47 2.58-.8 3.88-1l14.23 31.57zM486.83-55.9c-.98.62-2.04 1.16-3.17 1.6-3.55 1.35-7.27 1.52-10.7.68l7.5-16.38 6.37 14.1zm173.35 582.06c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.9 23.3 10.35zm-55.85-24.87c9.3-3.58 13.93-14 10.36-23.28-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.5c9.26-3.57 13.9-14 10.34-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm-96.23-9.38c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.97-10.37 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.57-13.92 14-10.36 23.28 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.57-13.94 14-10.37 23.28 3.57 9.27 14 13.9 23.28 10.35zm-298 68.08c9.3-3.56 13.93-13.98 10.37-23.27-3.57-9.3-14-13.92-23.27-10.36-9.28 3.56-13.92 13.97-10.35 23.26 3.56 9.3 13.98 13.92 23.26 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.57-13.92 14-10.36 23.28 3.56 9.3 13.97 13.92 23.26 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.57-13.93 14-10.36 23.28 3.56 9.27 13.98 13.9 23.27 10.35zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.94-23.27-10.37-9.26 3.6-13.9 14-10.36 23.3 3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.37zm40.35-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.95 23.27 10.38zm40.35-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.57-9.27-13.98-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-14 10.37-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm-257.62 52.58c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-13.98-13.9-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.56 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.28-3.56 13.92-13.98 10.35-23.27-3.56-9.3-13.98-13.9-23.27-10.35-9.3 3.57-13.92 13.98-10.36 23.27 3.56 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.56 9.3 14 13.92 23.26 10.36zm40.36-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.58-9.3-14-13.93-23.28-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.35-15.48c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.97-13.93-23.26-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm-297.98 68.1c9.27-3.58 13.9-14 10.35-23.28-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.34-15.5c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 14-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.35zM502 355.37c9.3-3.56 13.94-13.98 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.27-14-13.9-23.27-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.3-3.57 13.93-14 10.36-23.28-3.56-9.28-13.98-13.9-23.27-10.35-9.26 3.57-13.9 13.98-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.3 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.27 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.27-3.55 13.9-13.97 10.34-23.25-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.92 13.97-10.36 23.26 3.57 9.28 14 13.92 23.28 10.36zm-338.36 83.6c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.28-13.97-13.9-23.26-10.35-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36zM405.8 346c9.3-3.56 13.93-13.97 10.37-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.55 9.28 13.97 13.92 23.25 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.27 3.56-13.9 13.98-10.34 23.27 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.58 9.28 14 13.92 23.3 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.58-9.3-14-13.93-23.3-10.36-9.27 3.56-13.9 13.98-10.35 23.26 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.26-3.55 13.9-13.97 10.34-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.57 9.3 14 13.92 23.28 10.35zm40.33-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.57-9.3-14-13.93-23.28-10.37-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.55 13.9-13.97 10.35-23.26-3.57-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.57 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.92-23.25-10.36-9.3 3.57-13.93 13.98-10.37 23.27 3.57 9.3 14 13.94 23.27 10.37zm-378.7 99.06c9.3-3.56 13.94-13.98 10.37-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.3-3.55 13.93-13.97 10.37-23.26-3.57-9.28-14-13.92-23.27-10.36-9.28 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.92 23.27 10.35zm40.36-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.58-13.92 14-10.36 23.28 3.56 9.3 14 13.94 23.26 10.37zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.94 23.27 10.37zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.27-3.57 13.9-13.98 10.35-23.27-3.57-9.28-14-13.92-23.27-10.35-9.3 3.56-13.94 13.98-10.37 23.27 3.57 9.28 14 13.92 23.28 10.36zm40.34-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.92-23.27-10.36-9.27 3.57-13.9 13.98-10.34 23.27 3.56 9.3 13.98 13.94 23.26 10.37zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.6-9.28-14-13.92-23.3-10.35-9.3 3.56-13.92 13.98-10.35 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.6 9.28 14 13.92 23.3 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.27-3.56 13.9-13.98 10.34-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.94 14-10.37 23.27 3.56 9.3 13.98 13.93 23.26 10.36zM278.6 255.9c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.37-9.26 3.57-13.9 14-10.34 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.58 9.3 14 13.93 23.3 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.25 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.27-3.55 13.9-13.97 10.34-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 13.98-10.36 23.27 3.58 9.3 14 13.93 23.28 10.36zm40.34-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.6-13.93 14-10.36 23.3 3.56 9.3 13.98 13.92 23.27 10.35zm40.35-15.5c9.3-3.56 13.92-13.97 10.35-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.58 9.27 14 13.9 23.28 10.34zm40.35-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.56-9.3-13.97-13.95-23.26-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.27 13.97 13.9 23.26 10.35zm-297.98 68.08c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.3-14-13.92-23.27-10.36-9.3 3.6-13.93 14-10.36 23.3 3.57 9.3 14 13.9 23.28 10.35zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.27 14 13.9 23.27 10.34zm40.36-15.48c9.28-3.57 13.9-14 10.35-23.27-3.57-9.3-13.98-13.95-23.27-10.38-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm121.06-46.48c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.3-3.55 13.93-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.93 14-10.37 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zM449.4 97.74c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.58-13.9 14-10.35 23.3 3.57 9.27 13.98 13.9 23.27 10.35zm40.37-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.26 14 13.9 23.28 10.34zm-15.5-40.35c9.3-3.58 13.93-14 10.37-23.3-3.57-9.3-14-13.9-23.27-10.35-9.3 3.57-13.93 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36z"/>
|
9 |
-
<path fill="#fff" d="M405.25 391.43c0 11.1-6.67 18.26-17 18.26-6.3 0-10.7-4.16-10.7-10.12 0-7.82 7.47-12.12 21.03-12.12h6.7v3.98h-.03zm-11.48-38.75c-8 0-15 1.5-21.4 4.6l-.4.17.13 11.14 1.03-.57c6.14-3.44 11.94-5.17 17.24-5.17 9.46 0 14.88 5.4 14.88 14.88v.56h-7.46c-21.5 0-33.33 7.78-33.33 21.92 0 11.35 8.56 19.28 20.8 19.28 9 0 15.95-3.53 20.9-10.2v9.3H418v-38.98c0-17.9-8.13-26.94-24.18-26.94h-.05zm62.68 56.12c-9.95 0-16.14-8.67-16.14-22.65 0-14 6.24-23.05 15.9-23.05 10.8 0 17.26 8.62 17.26 23.05 0 13.76-6.68 22.67-17 22.67v-.02zm17-85.38v39.52c-4.8-6.7-11.53-10.26-20.15-10.26-15.96 0-26.7 13.13-26.7 32.7 0 20.17 10.88 34.23 26.45 34.23 9.23 0 16.4-4.05 21.42-12.02v11.03h12.07v-95.2h-13.08v.02zm71.47 30.77l-18.54 37.17-17.1-37.2-14.73.06 31.56 64.42 32.47-64.4H544.9v-.05h.02zm188.23 10.4v-10.44l-11.94.03v64.4h13.08v-32.35c0-13.52 5.7-21 16.02-21 1.54 0 2.98.2 4.75.72l.84.26.43-12.73-5.6-.45c-7.6 0-13.72 4.1-17.54 11.56h-.04zm-56.1-11.88c-19.65 0-31.83 12.9-31.83 33.72s12.18 33.74 31.83 33.74c19.7 0 31.96-12.93 31.96-33.73 0-20.8-12.24-33.7-31.95-33.7v-.03zm.16 56.75c-10.87 0-18.16-9.32-18.16-23.2 0-13.93 7.3-23.3 18.17-23.3 11.02 0 18.14 9.16 18.14 23.3 0 14.13-7.12 23.22-18.14 23.22v-.03zm-83.6-38.76c0 9.08 6.24 13.84 17.72 19.47 7.26 3.58 11.05 5.66 11.05 10.68 0 5.15-4.67 8.5-11.87 8.5-5.12 0-10.78-1.47-16.4-4.23l-.96-.46-.4 11.35.47.2c5.36 2.12 11 3.18 16.85 3.18 15.98 0 26.3-7.63 26.3-19.4 0-9.83-6.54-14.83-17.85-20.1-8.3-3.9-11.77-6.17-11.77-10.3 0-3.9 3.85-6.43 9.84-6.43 5.4 0 10.67 1.2 15.65 3.58l.93.46.6-11.15-.53-.14c-5.44-1.62-10.77-2.43-15.9-2.43-14.15 0-23.68 6.94-23.68 17.27h-.02l-.02-.03zm-29.65-35.4c0 4.3 3.5 7.78 7.8 7.78 4.27 0 7.76-3.5 7.76-7.77 0-4.28-3.48-7.76-7.76-7.76-4.3 0-7.78 3.52-7.78 7.82v-.04zm13.66 18.9h-12.38v64.4h13.07v-64.4h-.68zm199.97 4.26h1.24c1.6 0 2.36-.53 2.36-1.67 0-1.24-.8-1.76-2.5-1.76h-1.05v3.42h-.03zm1.63-5.64c3.68 0 5.54 1.28 5.54 3.72 0 1.63-1 2.9-2.72 3.44l2.84 5.6H781l-2.4-5.08h-1.03v5.08h-3.52v-12.74h5.15v-.02zm-6.85-.26c-1.9 1.9-2.87 4.32-2.87 6.9 0 2.5.92 4.77 2.7 6.62 1.84 1.86 4.23 2.92 6.78 2.92 2.52 0 4.9-.98 6.76-2.78 1.83-1.73 2.83-4.15 2.83-6.77 0-2.57-.93-4.9-2.7-6.7-1.85-1.88-4.24-2.88-6.84-2.88-2.6 0-4.86.92-6.65 2.68zm15.04-1.27c2.14 2.16 3.26 5.02 3.26 8.14 0 3.24-1.2 6.14-3.45 8.3-2.3 2.2-5.22 3.38-8.22 3.38-3.14 0-6.06-1.23-8.3-3.54-2.17-2.25-3.35-5.1-3.35-8.13 0-3.07 1.24-6.1 3.55-8.35 2.18-2.15 4.96-3.32 8.1-3.32 3.23 0 6.17 1.24 8.4 3.55v-.03z"/>
|
10 |
-
<path fill="#0A0A08" d="M194.9 334.75l-11.76 4.06v15.4H170.1v10.28h12.67v33.1c0 15.74 5.37 22.14 18.52 22.14 3.35 0 6.53-.4 9.7-1.26l.55-.13-.14-10.74-.92.34c-2.57.9-4.6 1.32-6.16 1.32-6.18 0-8.5-3.47-8.5-12.86v-31.96h15.1v-10.28h-15.1v-19.72l-.92.32m40.76 29.84v-10.44l-11.94.03v64.4h13.05v-32.35c0-13.52 5.7-21 16.02-21 1.5 0 2.94.2 4.7.72l.85.26.44-12.73-5.62-.45c-7.56 0-13.7 4.1-17.5 11.56m32.75-29.3c0 4.28 3.5 7.76 7.77 7.76 4.3 0 7.78-3.48 7.78-7.77 0-4.3-3.48-7.78-7.78-7.78-4.28 0-7.77 3.53-7.77 7.83m13.63 18.85H269.7v64.4h13.06v-64.4h-.7m46.83-1.52c-9 0-16.52 4.24-21.56 11.97v-10.42H295.4v90.68h13.1v-35.17c4.7 6.4 11.46 9.92 19.9 9.92 16.5 0 27.17-13.53 27.17-34.48 0-19.42-10.74-32.47-26.7-32.47m-3.57 56.36c-10.35 0-16.78-8.83-16.78-23.04 0-13.7 6.76-22.55 17.24-22.55 10.08 0 16.1 8.38 16.1 22.4 0 14.33-6.35 23.2-16.62 23.2M343.77 175.66c-3.65-14.9-14.77-29.68-14.77-29.68l47.22-.03c28.15-18.33 63.86-28.17 103.38-28.17 38.17 0 72.68 9.57 101 27.82l50.13.03s-11.28 14.98-14.86 30c4.2 5.6 7.68 11.93 10.25 18.82 14.44 38.9-5.6 82.24-44.72 96.64-18.9 6.92-39.42 6.13-57.78-2.3-11.03-5.06-20.47-12.5-27.76-21.74l-16.2 24.1-16.1-23.88c-13.86 17.17-35.13 28.15-58.94 28.15-41.65 0-75.57-33.72-75.57-75.2 0-16.66 5.48-32.1 14.73-44.57"/>
|
11 |
-
<path fill="#E8C56C" d="M405.8 145.04c21.68-9.25 46.74-14.15 73.8-14.15 27.07 0 51.54 4.88 73.16 14.5-7.9.23-15.93 1.74-23.73 4.6-18.9 6.95-34 20.85-42.48 39.1-3.65 7.93-5.87 16.25-6.63 24.67-3.32-38.06-35.18-68.1-74.13-68.7v-.03z"/>
|
12 |
-
<ellipse fill="#fff" cx="404.583" cy="220.508" rx="60.317" ry="60.028"/>
|
13 |
-
<ellipse fill="#fff" cx="555.218" cy="220.508" rx="60.317" ry="60.028"/>
|
14 |
-
<ellipse fill="#0A0A08" cx="404.6" cy="220.508" rx="37.335" ry="37.156"/>
|
15 |
-
<ellipse fill="#0A0A08" cx="555.185" cy="220.508" rx="37.335" ry="37.156"/>
|
16 |
-
<ellipse fill="#fff" cx="404.6" cy="220.508" rx="24.475" ry="24.358"/>
|
17 |
-
<ellipse fill="#fff" cx="555.185" cy="220.508" rx="24.475" ry="24.358"/>
|
18 |
-
<ellipse fill="#922826" cx="404.6" cy="220.508" rx="12.445" ry="12.385"/>
|
19 |
-
<ellipse fill="#548C40" cx="555.185" cy="220.508" rx="12.445" ry="12.385"/>
|
20 |
-
</g>
|
21 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/img/yelp.svg
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 540">
|
2 |
-
<title>yelp-reviews</title>
|
3 |
-
<clipPath>
|
4 |
-
<path d="M0 0h960v540H0z"/>
|
5 |
-
</clipPath>
|
6 |
-
<g fill="none">
|
7 |
-
<path fill="#D32323" d="M0 0h960v540H0z"/>
|
8 |
-
<path fill="#DB4123" d="M676.33 566.25c2.26-.97 4.22-2.36 5.84-4.03l-4.2-28.26c-4.5-2.5-10.03-3.06-15.2-1.07-8.73 3.33-13.35 12.72-10.93 21.54l24.5 11.8zm-53.78-25.92c7.43-4.4 10.83-13.62 7.63-21.95-3.56-9.3-13.98-13.92-23.27-10.36-7.96 3.06-12.5 11.17-11.38 19.3l27.03 13zm-54.07-26.06c6.17-4.73 8.8-13.12 5.86-20.75-3.57-9.3-14-13.93-23.27-10.36-7.28 2.8-11.7 9.8-11.56 17.15l28.98 13.97zm95.87-71.8c-3.72 4.8-4.92 11.4-2.58 17.48 1.33 3.45 3.6 6.26 6.4 8.25l-3.82-25.74zM317.7 549.82c-.2-1.25-.52-2.5-1-3.72-3.55-9.28-13.97-13.92-23.26-10.35-9.3 3.56-13.92 13.98-10.36 23.27.83 2.17 2.04 4.1 3.53 5.7l31.1-14.9zm39.48-18.9c-.04-.1-.08-.2-.1-.3-3.58-9.3-14-13.94-23.28-10.37-9.3 3.56-13.93 13.98-10.36 23.27.4 1 .86 1.98 1.4 2.88l32.34-15.48zm38.87-18.63c-4.4-7.36-13.6-10.72-21.9-7.54-9.2 3.54-13.84 13.8-10.45 23.04l32.35-15.5zm38.25-18.32c-4.85-5.34-12.65-7.45-19.8-4.7-8.07 3.1-12.64 11.4-11.33 19.6L434.3 494zm37.56-18c-4.76-3.42-11.1-4.46-17-2.2-6.85 2.63-11.17 9-11.53 15.88L471.86 476zm42.3 12.12c5.06-4.87 7-12.48 4.33-19.45-3.58-9.28-14-13.92-23.28-10.36-6.6 2.53-10.86 8.54-11.48 15.14l30.42 14.66zm143.28-92.06c-.27.1-.53.2-.8.3-9.28 3.55-13.92 13.97-10.36 23.26 2.7 7.02 9.3 11.38 16.4 11.55l-5.24-35.1zm-368.9 98.64c5.6 1.33 10.46 5.3 12.68 11.07 3.56 9.3-1.07 19.7-10.36 23.27-2.65 1.02-5.4 1.37-8.03 1.13l5.72-35.47zm367.8-106.13c-.73.4-1.5.75-2.28 1.05-9.3 3.57-19.7-1.07-23.27-10.36-3.57-9.3 1.06-19.7 10.35-23.27 3.38-1.3 6.9-1.5 10.2-.8l4.98 33.38zm-359.5 54.76c1.68-1.58 3.7-2.88 5.97-3.76 9.3-3.56 19.72 1.08 23.28 10.36 3.57 9.3-1.07 19.7-10.36 23.27-8.58 3.3-18.14-.42-22.35-8.34l3.48-21.52zm390.03-137.2c-4.7-6.26-13.17-8.93-20.85-5.98-9.3 3.57-13.93 14-10.36 23.27 1.25 3.27 3.36 5.96 5.97 7.92l25.24-25.2zm67.47-67.37c-3.72-9-13.96-13.45-23.1-9.94-9.3 3.55-13.93 13.97-10.36 23.26 1.84 4.8 5.5 8.36 9.92 10.18l23.54-23.5zm-443.7 105.3c.5-.25 1-.48 1.55-.7 9.27-3.55 19.7 1.1 23.26 10.37 3.56 9.3-1.08 19.7-10.36 23.27-5.96 2.3-12.38 1.2-17.16-2.32l4.63-28.66-1.94-1.97zm459.34-170.68c4.17 1.88 7.62 5.34 9.4 9.95 3.56 9.3-1.08 19.7-10.37 23.27-9.28 3.56-19.7-1.07-23.26-10.36-3.56-9.28 1.07-19.7 10.36-23.26 1.4-.53 2.8-.88 4.22-1.06l9.66 1.47zm14.97 2.27c.13 1.7.5 3.42 1.15 5.1 2.5 6.5 8.37 10.74 14.85 11.45l12.27-12.25-28.27-4.3zM285.2 318.38c.53-6.7 4.8-12.83 11.5-15.4 9.28-3.56 19.7 1.08 23.27 10.37 3.56 9.28-1.08 19.7-10.36 23.27-1.7.65-3.44 1.03-5.18 1.15l-19.23-19.4zm439.46-151.92c-.6 6.64-4.85 12.7-11.5 15.25-9.28 3.57-19.7-1.07-23.27-10.36-1.3-3.4-1.52-6.97-.8-10.3l35.56 5.42zm-96.53-14.67c1.8 8.5-2.78 17.3-11.17 20.53-9.3 3.57-19.7-1.07-23.27-10.36-2-5.2-1.43-10.74 1.1-15.25l33.33 5.07zm30.26 4.6c-.36.15-.72.3-1.08.44-6.54 2.5-13.64.95-18.52-3.43l19.6 3zM238.5 271.3c9.12-3.66 13.64-13.97 10.1-23.17-3.56-9.3-13.97-13.93-23.26-10.36-4.82 1.85-8.4 5.54-10.2 9.96l23.36 23.57zM572.4 133.85c-1.1 5.98-5.2 11.28-11.3 13.62-9.27 3.56-19.7-1.08-23.26-10.36-3.56-9.28 1.08-19.7 10.36-23.26 5.4-2.08 11.2-1.37 15.8 1.4l8.4 18.6zm-235.72 15.9c7.5-.3 14.7 4.15 17.52 11.55 3.57 9.28-1.07 19.7-10.36 23.27-9.28 3.56-19.7-1.08-23.27-10.36-3.56-9.28 1.08-19.7 10.36-23.26.62-.24 1.23-.44 1.85-.6l3.9-.6zm49.12-13.6c3.88 1.94 7.08 5.28 8.76 9.66 3.56 9.3-1.07 19.7-10.36 23.28-9.3 3.56-19.7-1.08-23.27-10.36-1.62-4.23-1.55-8.68-.1-12.62l21.92-3.3 3.05-6.65zm170.03-39.02c-1.82 4.43-5.38 8.13-10.2 9.98-9.3 3.58-19.7-1.06-23.28-10.35-3.56-9.3 1.08-19.7 10.36-23.27 4.15-1.58 8.5-1.55 12.38-.2l10.75 23.85zM171.45 203.65c6.16-4.73 8.77-13.12 5.84-20.74-1.3-3.38-3.52-6.14-6.25-8.12l-24.55 3.7 24.95 25.17zm46.3-35.93c3.36 9.2-1.28 19.44-10.46 22.96-9.3 3.57-19.72-1.07-23.28-10.36-.93-2.4-1.3-4.9-1.18-7.32l34.92-5.28zm41.18-6.22c-1.07 6.02-5.17 11.34-11.3 13.7-8.66 3.32-18.33-.5-22.47-8.6l33.77-5.1zM411.3 80.63c3.6 1.98 6.54 5.2 8.12 9.33 3.57 9.3-1.07 19.7-10.36 23.27-4.27 1.64-8.8 1.54-12.76.05l15-32.65zm127.6-21.06c-2 3.17-5 5.74-8.77 7.2-9.28 3.55-19.7-1.1-23.27-10.37-3.56-9.3 1.08-19.7 10.36-23.27 3.08-1.2 6.28-1.47 9.3-.98l12.38 27.42zM436.78 25.14c3.3 2 6 5.08 7.5 8.97 3.57 9.3-1.06 19.72-10.35 23.28-4.04 1.55-8.28 1.55-12.1.3l14.95-32.54zm84.94-3.66c-1.86 2.12-4.26 3.84-7.08 4.92-9.3 3.56-19.7-1.07-23.27-10.36-3.56-9.3 1.07-19.7 10.36-23.27 2.14-.82 4.34-1.2 6.5-1.2l13.5 29.9zm-59.47-51.8c3.04 2 5.5 4.93 6.9 8.6 3.57 9.27-1.07 19.7-10.36 23.26-3.8 1.45-7.78 1.54-11.4.5l14.85-32.36zm42.1 13.28c-1.5 1.28-3.25 2.34-5.2 3.08-9.3 3.57-19.7-1.07-23.27-10.36-3.56-9.28 1.07-19.7 10.36-23.27 1.28-.48 2.58-.8 3.88-1l14.23 31.56zM486.83-55.9c-.98.62-2.04 1.16-3.17 1.6-3.55 1.35-7.27 1.52-10.7.68l7.5-16.38 6.37 14.1zm173.35 582.06c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.94-23.27-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.3 14 13.92 23.28 10.36zm-55.85-24.87c9.3-3.57 13.93-14 10.36-23.27-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.57 9.3 13.98 13.93 23.27 10.36zm40.36-15.5c9.27-3.56 13.9-13.98 10.35-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm-96.22-9.37c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.57-13.93 13.98-10.37 23.27 3.58 9.3 14 13.93 23.28 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.57-13.92 14-10.36 23.28 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.94 13.98-10.37 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm-298 68.08c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.92-23.27-10.36-9.28 3.57-13.92 13.98-10.35 23.27 3.56 9.3 13.98 13.92 23.26 10.36zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.57-13.92 14-10.36 23.28 3.57 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.58-9.3-14-13.93-23.28-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.94-23.27-10.37C430.1 437 425.45 447.4 429 456.7c3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.37zm40.35-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.94 23.27 10.37zm40.35-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.27-13.97-13.9-23.26-10.35-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-14 10.37-23.28-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.26 10.36zm-257.62 52.58c9.3-3.56 13.92-13.98 10.36-23.27-3.57-9.27-13.98-13.9-23.27-10.35-9.3 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.28-3.56 13.92-13.98 10.35-23.27-3.56-9.3-13.98-13.92-23.27-10.36-9.3 3.57-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.35-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.37 23.26 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm40.35-15.48c9.3-3.57 13.94-14 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.57-13.92 14-10.36 23.28 3.57 9.28 14 13.92 23.27 10.36zm40.37-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm-297.98 68.1c9.27-3.58 13.9-14 10.35-23.28-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.34-15.5c9.3-3.57 13.93-14 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.57-13.92 14-10.36 23.28 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.5c9.3-3.56 13.92-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.56 9.27 13.98 13.9 23.27 10.35zm40.36-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.35zM502 355.37c9.3-3.56 13.94-13.98 10.37-23.27-3.56-9.3-13.98-13.93-23.27-10.37-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.94 23.27 10.37zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.28-13.98-13.9-23.27-10.35-9.27 3.57-13.9 13.98-10.35 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.28-3.56 13.92-13.97 10.36-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.3 14 13.92 23.28 10.36zm40.35-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.3 14 13.92 23.27 10.36zm40.36-15.5c9.28-3.56 13.9-13.98 10.35-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zM365.44 361.5c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.28-13.97-13.9-23.26-10.35-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.37-23.26-3.57-9.3-13.98-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.56 9.28 13.98 13.92 23.26 10.36zm40.36-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.9 13.98-10.35 23.27 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.55-13.93 13.97-10.36 23.26 3.57 9.28 14 13.92 23.28 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.5c9.27-3.55 13.9-13.97 10.35-23.26-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.34-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.57-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.94 13.98-10.37 23.27 3.56 9.28 13.98 13.92 23.27 10.35zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.55-9.3-13.97-13.93-23.25-10.37-9.3 3.57-13.93 13.98-10.37 23.27 3.57 9.3 14 13.93 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.37-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.28-3.55 13.92-13.97 10.36-23.26-3.57-9.28-14-13.92-23.27-10.36-9.28 3.57-13.92 14-10.35 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.58-13.92 14-10.36 23.28 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.58-9.28-14-13.92-23.28-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.35zm40.35-15.48c9.3-3.56 13.93-13.98 10.36-23.27-3.56-9.3-13.98-13.93-23.26-10.37-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.26 10.36zm40.36-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.35-9.3 3.56-13.94 13.98-10.37 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.55-9.3-13.97-13.93-23.26-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.92 23.27 10.36zm40.36-15.48c9.3-3.57 13.93-14 10.37-23.27-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm-378.7 99.06c9.3-3.56 13.94-13.98 10.38-23.27-3.57-9.3-14-13.93-23.27-10.37-9.28 3.57-13.92 13.98-10.35 23.27 3.56 9.3 13.98 13.93 23.26 10.36zm40.37-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.37zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.58-9.28-14-13.92-23.28-10.35-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.58 9.28 14 13.92 23.28 10.36zm40.36-15.48c9.28-3.57 13.92-14 10.36-23.27-3.57-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm40.35-15.5c9.28-3.56 13.92-13.98 10.35-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.56-13.92 13.98-10.36 23.26 3.57 9.3 14 13.93 23.27 10.36zm40.35-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.97-13.92-23.26-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.3-3.56 13.93-13.98 10.37-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.26 10.36zM278.62 255.9c9.3-3.56 13.93-13.98 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.37-9.27 3.57-13.9 14-10.35 23.27 3.57 9.3 14 13.93 23.27 10.36zm40.36-15.5c9.3-3.55 13.92-13.97 10.36-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.3 3.57-13.92 14-10.36 23.27 3.57 9.3 14 13.93 23.28 10.36zm40.36-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.26 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.28-3.55 13.92-13.97 10.35-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 13.98-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.35-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.56-9.3-13.98-13.92-23.26-10.36-9.3 3.58-13.93 14-10.36 23.28 3.56 9.3 13.98 13.93 23.27 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.56-9.3-13.98-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.37 23.27 3.57 9.28 14 13.9 23.27 10.35zm40.36-15.48c9.28-3.57 13.92-13.98 10.36-23.27-3.57-9.3-13.98-13.94-23.27-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.55 9.28 13.97 13.92 23.26 10.36zm-297.98 68.08c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.3-14-13.92-23.27-10.36-9.3 3.58-13.93 14-10.36 23.28 3.57 9.3 14 13.92 23.28 10.36zm40.35-15.5c9.3-3.56 13.93-13.97 10.36-23.26-3.57-9.3-14-13.93-23.28-10.36-9.28 3.56-13.92 13.98-10.36 23.27 3.57 9.28 14 13.9 23.27 10.35zm40.36-15.48c9.28-3.57 13.9-14 10.35-23.27-3.57-9.3-13.98-13.94-23.27-10.37-9.3 3.56-13.93 13.98-10.36 23.27 3.56 9.28 13.98 13.92 23.27 10.36zm121.06-46.48c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.37-9.3 3.57-13.93 14-10.36 23.27 3.55 9.3 13.97 13.93 23.26 10.36zm40.35-15.5c9.3-3.55 13.94-13.97 10.37-23.26-3.56-9.28-13.98-13.92-23.27-10.36-9.28 3.57-13.92 14-10.36 23.27 3.57 9.3 13.98 13.93 23.27 10.36zm40.37-15.48c9.28-3.56 13.92-13.98 10.36-23.27-3.57-9.28-14-13.92-23.27-10.36-9.3 3.57-13.93 14-10.36 23.27 3.56 9.3 13.98 13.93 23.27 10.36zm-55.85-24.86c9.3-3.57 13.93-14 10.36-23.27-3.56-9.3-13.98-13.93-23.27-10.36-9.28 3.57-13.9 14-10.35 23.28 3.57 9.28 13.98 13.92 23.27 10.36zm40.36-15.5c9.28-3.56 13.92-13.98 10.36-23.26-3.57-9.3-14-13.93-23.27-10.36-9.3 3.56-13.93 13.98-10.36 23.27 3.57 9.27 14 13.9 23.28 10.35zm-15.5-40.35c9.3-3.57 13.93-14 10.37-23.28-3.57-9.3-14-13.92-23.27-10.36-9.3 3.57-13.93 13.98-10.36 23.27 3.56 9.3 13.98 13.93 23.26 10.36z"/>
|
9 |
-
<path fill="#C7C6C2" d="M626.86 150c-.68 0-1.4 0-2.1.1-7.68.6-15.38 1.93-22.86 3.93-7.52 2-14.83 4.7-21.78 8.05-6.8 3.22-12 9.2-14.23 16.4-2.25 7.17-1.38 15.1 2.38 21.63l17.95 31.1c-2.44-.72-5-1.1-7.57-1.1-11.52 0-21.78 7.24-25.6 18.07-3.1-2.56-6.56-4.83-10.44-6.62-6.86-3.28-14.46-4.98-22.13-4.98-5.56 0-11 .9-16.12 2.68-3.97-1.97-8.35-2.98-12.83-2.98-5.37 0-10.67 1.5-15.2 4.32v-1.44c0-16.02-13.07-29.05-29.1-29.05-16.1 0-29.1 13.04-29.1 29.06v10.74c-.6-.54-1.26-1.07-1.9-1.55-12.22-9.7-25.64-11.16-32.5-11.16-5.37 0-19 1.1-31.62 10.73-3.58-4.38-8.35-7.6-13.87-9.3-2.84-.9-5.76-1.32-8.65-1.32-12.7 0-23.77 7.98-27.8 19.94l-1.7-3.43c-4.9-10-15.2-16.46-26.36-16.46-4.42 0-8.86 1.02-12.83 3-7.06 3.42-12.34 9.38-14.9 16.78-2.5 7.4-2.03 15.36 1.4 22.37l25.2 51.57c-7.46 3.5-12.82 9.84-15.12 18.02-2.45 8.64-.9 17.64 4.3 24.74 4.05 5.5 12.02 12.1 26.9 12.53h1.67c25.18 0 36.2-14.7 41.05-27.05.53-1.38.98-2.7 1.4-3.94v-.1l5.2-16.7c8.94 16.4 24.84 25.45 44.8 25.45h.6c16.3-.15 29.52-4.7 39.37-13.48 5.37 8.26 14.52 13.27 24.4 13.27 5.37 0 10.65-1.5 15.2-4.32v1.4c0 16.02 13.02 29.05 29.04 29.05 7.67 0 14.86-2.9 20.3-8.23 5.06-4.9 8.04-11.34 8.64-18.2 17.8-.3 28.85-7.87 35.02-14.23 9.2-9.4 14.44-22.8 15.6-39.83 1.6.36 3.28.48 4.9.48.9 0 1.7 0 2.5-.06-3.46 5.27-4.98 11.68-4.24 18.04.9 7.75 5.16 14.76 11.58 19.18 10.32 7.1 22.25 11.93 34.54 14.02 1.5.24 3.04.35 4.53.35 13.28 0 24.3-9.4 26.67-22.08 5.13 5.97 12.53 9.43 20.6 9.43 6.25 0 12.4-2.2 17.3-6.2 9.53-7.94 17.47-18.1 22.87-29.4 3.4-7 3.6-15.2.48-22.36-2.53-5.9-7.07-10.66-12.7-13.53 5.72-2.62 10.44-7.2 13.12-13 3.37-7.04 3.5-15.22.4-22.37-5.08-11.64-12.45-21.78-21.97-30.22-4.98-4.4-11.33-6.8-17.95-6.8-7.46 0-14.56 3.04-19.63 8.35v-36.18c0-14.98-12.17-27.15-27.15-27.15h.1-.04z"/>
|
10 |
-
<path fill="#fff" d="M626.86 151.85c13.96 0 25.3 11.33 25.3 25.3v41.25l.48-.75c4.7-6.98 12.52-11.12 21-11.12 6.14 0 12.08 2.24 16.7 6.26 9.3 8.25 16.56 18.2 21.48 29.58 2.9 6.7 2.77 14.32-.3 20.88-3.16 6.57-8.95 11.52-15.93 13.52l-.84.24.8.3c6.95 2.2 12.53 7.33 15.45 14 2.94 6.73 2.8 14.33-.34 20.9-5.28 11.03-13.04 20.97-22.44 28.75-4.53 3.73-10.23 5.8-16.1 5.8-8.77 0-16.8-4.5-21.48-11.94l-.45-.72v.9c-.5 13.67-11.64 24.4-25.28 24.4-1.4 0-2.8-.1-4.17-.35-12.05-2-23.72-6.74-33.8-13.66-6.05-4.13-9.96-10.66-10.83-17.9-.9-7.23 1.43-14.48 6.33-19.88l.5-.65-.83.2c-2.03.45-4.12.7-6.18.7-2.3 0-4.47-.3-6.62-.9-.6 11.63-3.34 28.7-15.2 40.86-6.04 6.27-17.02 13.63-34.7 13.63h-.7c-.38 14.7-12.43 26.55-27.2 26.55-14.97 0-27.14-12.22-27.14-27.22l-.1-4.95c-4.6 3.8-10.55 6.05-17 6.05-10.34 0-19.38-5.8-23.98-14.32-7.57 7.46-19.98 14.32-39.85 14.56h-.6c-19.6 0-35.1-8.95-43.67-25.24-.6-1.07-1.07-2.14-1.58-3.28l-6.56 21.12v.12c-.4 1.26-.84 2.5-1.34 3.88-4.63 11.75-15.22 25.8-39.32 25.8h-1.6c-14.15-.3-21.67-6.56-25.48-11.78-4.87-6.56-6.33-15-4-23.12 2.38-8.4 8.1-14.6 15.8-17.6l-25.94-53.4c-3.3-6.56-3.7-14-1.32-21 2.4-6.9 7.34-12.52 13.93-15.74 3.76-1.8 7.9-2.78 12.06-2.78 10.44 0 20.13 6.06 24.7 15.42l3.75 7.67 1.2-3.8c3.58-11.63 14.1-19.4 26.25-19.4 2.68 0 5.46.46 8.05 1.27 5.82 1.8 10.74 5.36 14.2 10.2 12.53-10.38 26.4-11.52 31.92-11.52 6.65 0 19.57 1.43 31.32 10.74 1.8 1.42 3.43 2.97 4.92 4.47V239.1c0-14.97 12.23-27.2 27.15-27.2 15 0 27.13 12.23 27.13 27.2v4.98c4.77-3.75 10.68-6.02 17.12-6.02 4.57 0 8.9 1.13 12.7 3.16 5.08-1.85 10.63-2.8 16.24-2.8 7.36 0 14.76 1.67 21.35 4.77 4.83 2.32 8.83 5.15 12.1 8.34.25-.77.5-1.55.72-2.3 3.5-10.3 13.13-17.2 24-17.2 3.8 0 7.62.9 11.08 2.56l.78.36-20.58-35.7c-3.58-6.16-4.4-13.52-2.3-20.24 2.1-6.7 6.92-12.3 13.25-15.3 6.86-3.28 14.02-5.96 21.47-7.93 7.3-2 14.92-3.3 22.46-3.9.66-.05 1.35-.08 2-.08v.06l.03-.03z"/>
|
11 |
-
<path fill="#C0282A" d="M582.03 250.35l33.56 16.34c6.43 3.16 5.42 12.64-1.5 14.37l-36.25 9.04c-4.47 1.12-8.95-2-9.54-6.6-1.1-9.9 0-19.7 3.08-28.7 1.5-4.4 6.5-6.48 10.65-4.48v.03zm13.42 69.02l24.97-27.74c4.77-5.3 13.66-1.73 13.42 5.43l-1.3 37.3c-.2 4.67-4.4 8.1-8.96 7.33-9.66-1.62-18.8-5.38-26.76-10.84-3.87-2.63-4.47-8.06-1.37-11.5zm59.15-36.92l35.5 11.63c4.48 1.4 6.57 6.4 4.63 10.6-4.18 8.73-10.2 16.5-17.75 22.75-3.58 2.98-8.95 2.1-11.46-1.88l-19.77-31.62c-3.8-6.12 2.08-13.63 8.88-11.43l-.03-.05zm36.1-22.56l-35.8 10.26c-6.92 2-12.53-5.73-8.5-11.7l20.88-30.93c2.57-3.88 7.97-4.57 11.43-1.5 7.17 6.27 13.04 14.2 17 23.33 1.8 4.3-.47 9.25-4.94 10.53h-.06zm-83.73-87.1c-6.48 1.78-12.62 4.02-18.5 6.85-4 1.88-5.52 6.86-3.28 10.74l35.04 60.72c3.94 6.8 14.32 4 14.32-3.87v-70.1c0-4.48-3.8-8.06-8.23-7.67-6.42.5-12.9 1.6-19.33 3.34l-.03-.03z"/>
|
12 |
-
<path fill="#0C0D0B" d="M532.72 301.1c-.15 18.13-4.33 23.9-13.63 23.9-8.66 0-13.14-5.3-13.82-18.78-.15-1.8-.15-3.37-.15-4.98 0-1.28 0-2.57.1-3.88.8-14.74 3.7-19.7 10.58-21.18 11.7-2.68 17.16 3.88 16.83 24.9h.08zm19.03-4.6c0-12.53-1.55-29.84-17.45-37.38-8.95-4.27-20.05-4.18-28.55.7-1.7 1.03-3.4 2.1-4.9 3.24-1-4.18-4.76-7.34-9.33-7.34-5.28 0-9.54 4.32-9.54 9.63v95.55c0 5.28 4.26 9.54 9.54 9.54 5.3 0 9.64-4.3 9.64-9.6v-25.06l.83 1.34c3.87 3.52 10.08 6.63 15.86 6.8 36.5 1.2 34.1-38.68 33.9-47.43zm-94.86 38.18c0 5.37-4.33 9.66-9.64 9.66-5.37 0-9.67-4.3-9.67-9.6V239.1c0-5.28 4.32-9.6 9.6-9.6 5.28 0 9.54 4.32 9.54 9.6v95.55h.12l.03.03zm-87.4-43.85c.6-13.3 10.73-15.5 15.2-15.5 4.57 0 14.62 2.22 15.22 15.68-.12.75-.42 1.14-.84 1.14h-28.75c-.45 0-.72-.48-.8-1.34l-.04.03zm4.17 17.12h35.3c4.76-.36 9.3-4.33 9.32-10.68 0 0 0 0 0-.06v-.47c-1.8-35.08-24.3-40.15-34.5-40.15-10.6 0-34.68 6.27-34.68 45.28.15 14.62 3.64 42.96 34.12 42.66 15.5-.12 25.3-5.37 30.9-13.27 1.08-2.18 1.74-4.18 1.7-6.42-.08-5.2-4.77-10.26-10.26-8.44-2.47.83-4.83 3.27-9.33 6.94-8.47 4.95-18.2 4.18-22.85-1.64-1.73-2.18-3.04-5.37-3.73-9.25-.12-.44-.15-.9-.15-1.28 0-2.24 1.2-3.1 4.12-3.22h.03zm-78.75 24.4l-30.04-61.48c-2.4-4.92-.36-10.83 4.53-13.2 4.93-2.5 10.84-.43 13.23 4.46l23.26 47.6 14.3-46.23c1.62-5.16 7.17-8.05 12.36-6.47 5.2 1.58 8.1 7.16 6.5 12.32l-24.76 80.03v.06c-.3.9-.6 1.8-.95 2.63-4.1 10.44-11.54 14.9-24.1 14.6-12.4-.28-14.32-7.6-12.98-12.42 1.5-5.3 5.97-6.87 10.3-6.87 4.38 0 6.67 0 8.17-1.1 2.26-1.73 4.05-6.26.23-14.08l-.08.06.02.1z"/>
|
13 |
-
</g>
|
14 |
-
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/mce-plugin.js
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
!function(n){"use strict";window.tinymce.PluginManager.add("glsr_shortcode",function(n){n.addCommand("GLSR_Shortcode",function(){GLSR.shortcode.create(n.id)})})}();
|
|
assets/js/recaptcha.js
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
"use strict";var glsr_render_recaptcha=function(){var e,c;[].forEach.call(document.querySelectorAll(".glsr-submit-review-form"),function(r){r.onsubmit=null,(c=r.querySelector(".glsr-recaptcha-holder"))&&(c.innerHTML="",e=grecaptcha.render(c,{callback:function(r){GLSR.submitForm(r)},"expired-callback":function(){grecaptcha.reset(e)}},!0))})};
|
|
assets/js/site-reviews-admin.js
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
"use strict";var GLSR={addons:{},keys:{ENTER:13,ESC:27,SPACE:32,UP:38,DOWN:40},pinned:{},shortcode:{},translation:{},colorControls:function(){"object"==typeof jQuery.wp&&"function"==typeof jQuery.wp.wpColorPicker&&jQuery(document).find('input[type="text"].color-picker-hex').each(function(){var e=jQuery(this),t=e.data("colorpicker")||{};e.wpColorPicker(t)})},dismissNotices:function(){jQuery(".notice.is-dismissible").each(function(){var e=jQuery(this);e.fadeTo(100,0,function(){e.slideUp(100,function(){e.remove()})})})},getURLParameter:function(e){return decodeURIComponent((new RegExp("[?|&]"+e+"=([^&;]+?)(&|#|;|$)").exec(location.search)||[null,""])[1].replace(/\+/g,"%20"))||null},insertNotices:function(e){(e=e||!1)&&(jQuery("#glsr-notices").length||(jQuery("#message.notice").remove(),jQuery("form#post").before('<div id="glsr-notices" />')),jQuery("#glsr-notices").html(e),jQuery(document).trigger("wp-updates-notice-added"))},isUndefined:function(e){return void 0===e},normalizeValue:function(e){return-1<["true","on","1"].indexOf(e)||!(-1<["false","off","0"].indexOf(e))&&e},normalizeValues:function(e){return e.map(GLSR.normalizeValue)},onChangeStatus:function(s){var e=this.href.match(/post=([0-9]+)/)[1],t=this.href.match(/action=([a-z]+)/)[1];if(!GLSR.isUndefined(t)&&!GLSR.isUndefined(e)){var i={action:"change-review-status",status:t,post_id:e};GLSR.postAjax(s,i,function(e){var t=jQuery(s.target);t.closest("tr").removeClass("status-pending status-publish").addClass(e.class),t.closest("td.column-title").find("strong").html(e.link)})}},onClearLog:function(e){GLSR.postAjax(e,{action:"clear-log"},function(e){GLSR.insertNotices(e.notices),jQuery("#log-file").val(e.log)})},onFieldChange:function(){var t=jQuery(this).closest("form").find("[data-depends]");if(t.length)for(var e=this.getAttribute("name"),s=this.getAttribute("type"),i=0;i<t.length;i++)try{var n,o=JSON.parse(t[i].getAttribute("data-depends"));if(o.name!==e)continue;n="checkbox"===s?!!this.checked:jQuery.isArray(o.value)?-1!==jQuery.inArray(GLSR.normalizeValue(this.value),GLSR.normalizeValues(o.value)):GLSR.normalizeValue(o.value)===GLSR.normalizeValue(this.value),GLSR.toggleHiddenField(t[i],n)}catch(e){console.error("JSON Error: "+t[i])}},pointers:function(e){jQuery(e.target).pointer({content:e.options.content,position:e.options.position,close:function(){jQuery.post(ajaxurl,{pointer:e.id,action:"dismiss-wp-pointer"})}}).pointer("open").pointer("sendToTop"),jQuery(document).on("wp-window-resized",function(){jQuery(e.target).pointer("reposition")})},postAjax:function(e,t,s){e.preventDefault();var i=jQuery(e.target);if(!i.is(":disabled")){var n={action:site_reviews.action,request:t};i.prop("disabled",!0),jQuery.post(site_reviews.ajaxurl,n,function(e){"function"==typeof s&&s(e),i.prop("disabled",!1)},"json")}},textareaResize:function(e){var t=e[0];t.style.height="auto",t.style.height=320<t.scrollHeight?t.scrollHeight+"px":"320px"},toggleHiddenField:function(e,t){var s=jQuery(e).closest(".glsr-field");s.length&&(t?s.removeClass("hidden"):s.addClass("hidden"))}};GLSR.pinned.events=function(){var t=jQuery("#pinned-status-select");jQuery("a.cancel-pinned-status").on("click",function(e){e.preventDefault(),t.slideUp("fast").siblings("a.edit-pinned-status").show().focus(),t.find("select").val("0"===jQuery("#hidden-pinned-status").val()?1:0)}),jQuery("a.edit-pinned-status").on("click",function(e){e.preventDefault(),t.is(":hidden")&&(t.slideDown("fast",function(){t.find("select").focus()}),jQuery(this).hide())}),jQuery("a.save-pinned-status").on("click",function(e){e.preventDefault(),t.slideUp("fast").siblings("a.edit-pinned-status").show().focus(),GLSR.pinned.save(jQuery(this))}),jQuery("table").on("click","td.sticky i",GLSR.pinned.onToggle)},GLSR.pinned.onToggle=function(){var t=jQuery(this),e={action:site_reviews.action,request:{action:"toggle-pinned",id:t[0].getAttribute("data-id")}};jQuery.post(site_reviews.ajaxurl,e,function(e){e.pinned?t.addClass("pinned"):t.removeClass("pinned")})},GLSR.pinned.save=function(t){var e={action:site_reviews.action,request:{action:"toggle-pinned",id:jQuery("#post_ID").val(),pinned:jQuery("#pinned-status").val()}};jQuery.post(site_reviews.ajaxurl,e,function(e){jQuery("#pinned-status").val(0|!e.pinned),jQuery("#hidden-pinned-status").val(0|e.pinned),jQuery("#pinned-status-text").text(e.pinned?t.data("yes"):t.data("no")),GLSR.insertNotices(e.notices)})},GLSR.search=function(e,t){this.el="[object String]"===Object.prototype.toString.call(e)?jQuery(e):e,this.options=t,this.searchTerm=null,this.init()},GLSR.search.prototype={defaults:{action:null,exclude:[],onInit:null,onResultClick:null,results:{},selected:-1,selectedClass:"glsr-selected-result",selectorEntries:".glsr-strings-table tbody",selectorResults:".glsr-search-results",selectorSearch:".glsr-search-input"},init:function(){this.options=jQuery.extend({},this.defaults,this.options),this.el.length&&(this.options.entriesEl=this.el.parent().find(this.options.selectorEntries),this.options.resultsEl=this.el.find(this.options.selectorResults),this.options.searchEl=this.el.find(this.options.selectorSearch),this.options.searchEl.attr("aria-describedby","live-search-desc"),"function"==typeof this.options.onInit&&this.options.onInit.call(this),this.initEvents())},initEvents:function(){this.options.searchEl.on("input",_.debounce(this.onSearchInput.bind(this),500)),this.options.searchEl.on("keyup",this.onSearchKeyup.bind(this)),jQuery(document).on("click",this.onDocumentClick.bind(this)),jQuery(document).on("keydown",this.onDocumentKeydown.bind(this))},abort:function(){void 0!==this.searchRequest&&this.searchRequest.abort()},clearResults:function(){this.abort(),this.options.resultsEl.empty(),this.el.removeClass("is-active"),jQuery("body").removeClass("glsr-focus")},displayResults:function(e){jQuery("body").addClass("glsr-focus"),this.options.resultsEl.append(e),this.options.resultsEl.children("span").on("click",this.onResultClick.bind(this))},navigateResults:function(e){this.options.selected+=e,this.options.results.removeClass(this.options.selectedClass),this.options.selected<0&&(this.options.selected=-1,this.options.searchEl.focus()),this.options.selected>=this.options.results.length&&(this.options.selected=this.options.results.length-1),0<=this.options.selected&&this.options.results.eq(this.options.selected).addClass(this.options.selectedClass).focus()},onDocumentClick:function(e){jQuery(e.target).find(this.el).length&&jQuery("body").hasClass("glsr-focus")&&this.clearResults()},onDocumentKeydown:function(e){if(this.options.results){if(GLSR.keys.ESC===e.which&&this.clearResults(),GLSR.keys.ENTER===e.which||GLSR.keys.SPACE===e.which){var t=this.options.resultsEl.find("."+this.options.selectedClass);t&&t.trigger("click")}GLSR.keys.UP===e.which&&(e.preventDefault(),this.navigateResults(-1)),GLSR.keys.DOWN===e.which&&(e.preventDefault(),this.navigateResults(1))}},onResultClick:function(e){e.preventDefault(),"function"==typeof this.options.onResultClick&&this.options.onResultClick.call(this,e),this.clearResults()},onSearchInput:function(e){return this.abort(),this.searchTerm===e.target.value&&this.options.results.length?this.displayResults(this.options.results):(this.options.resultsEl.empty(),this.options.selected=-1,this.searchTerm=e.target.value,""===this.searchTerm?this.reset():(this.el.addClass("is-active"),void(this.searchRequest=wp.ajax.post(site_reviews.action,{_nonce:site_reviews.ajaxnonce,request:{action:this.options.action,exclude:this.options.exclude,search:this.searchTerm}}).done(function(e){this.el.removeClass("is-active"),this.displayResults(e.items?e.items:e.empty),this.options.results=this.options.resultsEl.children(),delete this.searchRequest}.bind(this)))))},onSearchKeyup:function(e){GLSR.keys.ESC===e.which&&this.reset(),GLSR.keys.ENTER===e.which&&this.onSearchInput(e)},reset:function(){this.clearResults(),this.options.results={},this.options.searchEl.val("")}},GLSR.search.prototype.deleteEntry=function(e){var t=this.options.entriesEl.children("tr").eq(e),s=this;t.find("td").css({backgroundColor:"#faafaa"}),t.fadeOut(350,function(){jQuery(this).remove(),s.options.results={},s.reindexRows(),s.setVisibility()})},GLSR.search.prototype.makeSortable=function(){this.options.entriesEl.on("click","a.delete",this.onEntryDelete.bind(this)),this.options.entriesEl.sortable({items:"tr",tolerance:"pointer",start:function(e,t){t.placeholder.height(t.helper[0].scrollHeight)},sort:function(e,t){var s=e.pageY-jQuery(this).offsetParent().offset().top-t.helper.outerHeight(!0)/2;t.helper.css({top:s+"px"})}})},GLSR.search.prototype.onEntryDelete=function(e){e.preventDefault(),this.deleteEntry(jQuery(e.target).closest("tr").index())},GLSR.search.prototype.onUnassign=function(e){e.preventDefault();var t=this.el.find(".description");this.el.find("input#assigned_to").val(""),t.find("a").css({color:"#c00"}),t.fadeOut("fast",function(){jQuery(this).html("").show()})},GLSR.search.prototype.reindexRows=function(){var i=this;this.options.exclude=[],this.options.entriesEl.children("tr").each(function(s){jQuery(this).find(".glsr-string-td2").children().filter(":input").each(function(){var e=jQuery(this),t=e.attr("name").replace(/\[\d+\]/i,"["+s+"]");e.attr("name",t),e.is("[data-id]")&&i.options.exclude.push({id:e.val()})})})},GLSR.search.prototype.setVisibility=function(){var e=0<this.options.entriesEl.children().length?"remove":"add";this.options.entriesEl.parent()[e+"Class"]("glsr-hidden")},GLSR.shortcode.close=function(e){var t=jQuery(e=e||".glsr-mce-button");t.length&&t.removeClass("active").parent().find(".glsr-mce-menu").hide()},GLSR.shortcode.open=function(e){jQuery(e).addClass("active").parent().find(".glsr-mce-menu").show()},GLSR.shortcode.toggle=function(e){e.preventDefault(),jQuery(this).hasClass("active")?GLSR.shortcode.close(this):GLSR.shortcode.open(this)},GLSR.shortcode.trigger=function(e){e.preventDefault(),GLSR.shortcode.current=jQuery(this).attr("data-shortcode"),GLSR.shortcode.current&&(tinymce.get(window.wpActiveEditor)?tinymce.execCommand("GLSR_Shortcode"):(jQuery("#scTemp").length||(jQuery("body").append('<textarea id="scTemp" style="display: none;" />'),tinymce.init({mode:"exact",elements:"scTemp",external_plugins:site_reviews.tinymce,plugins:["glsr_shortcode","wplink"]})),setTimeout(function(){tinymce.execCommand("GLSR_Shortcode")},200)),setTimeout(function(){GLSR.shortcode.close()},100))},GLSR.shortcode.create=function(e){var o=tinymce.get(e);if(o){var t={action:site_reviews.action,request:{action:"mce-shortcode",shortcode:GLSR.shortcode.current}};jQuery.post(site_reviews.ajaxurl,t,function(n){if(n.body){if(0===n.body.length)return window.send_to_editor("["+n.shortcode+"]"),void GLSR.shortcode.destroy();var e=[{text:n.ok,classes:"btn glsr-btn primary",onclick:function(){var e,t,s,i;for(var n in i=o.windowManager.getWindows()[0],s=!0,t=site_reviews.shortcodes[GLSR.shortcode.current])if(t.hasOwnProperty(n)&&void 0!==(e=i.find("#"+n)[0])&&""===e.state.data.value){s=!1,alert(t[n]);break}s&&i.submit()}},{text:n.close,onclick:"close"}],t={title:n.title,body:n.body,classes:"glsr-mce-popup",minWidth:320,buttons:e,onsubmit:function(e){var t="",s=GLSR.shortcode.normalize(e.data);for(var i in s)s.hasOwnProperty(i)&&""!==s[i]&&(t+=" "+i+'="'+s[i]+'"');window.send_to_editor("["+n.shortcode+t+"]")},onclose:function(){GLSR.shortcode.destroy()}};n.ok.constructor===Array&&(t.buttons[0].text=n.ok[0],t.buttons[0].onclick="close",delete t.buttons[1]),o.windowManager.open(t)}})}},GLSR.shortcode.normalize=function(e){var t={site_reviews:["author","avatar","date","excerpt","rating","response","title"],site_reviews_form:["email","name","terms","title"],site_reviews_summary:["bars","rating","stars","summary"]},s=[];for(var i in e)if(e.hasOwnProperty(i)){if(t.hasOwnProperty(GLSR.shortcode.current)){var n="";0===i.lastIndexOf("hide_",0)&&(n=i.substring(5)),-1<t[GLSR.shortcode.current].indexOf(n)&&(e[i]&&s.push(n),delete e[i])}"count"!==i||jQuery.isNumeric(e[i])||(e[i]=""),"id"===i&&(e[i]=(+new Date).toString(36))}return e.hide=s.join(","),e},GLSR.shortcode.destroy=function(){var e=jQuery("#scTemp");e.length&&(tinymce.get("scTemp").remove(),e.remove())},jQuery(function(n){var e=GLSR.getURLParameter("fix"),t=n("#contentdiv > textarea");e&&n('td [data-key="'+e+'"]').focus(),t.length&&(GLSR.textareaResize(t),n(document).on("wp-window-resized.editor-expand",function(){GLSR.textareaResize(t)})),n("form").on("change",":input",GLSR.onFieldChange),n("form").on("click","#clear-log",GLSR.onClearLog),GLSR.colorControls(),GLSR.pinned.events(),n.each(site_reviews_pointers.pointers,function(e,t){GLSR.pointers(t)}),n(document).on("click",function(e){n(e.target).closest(".glsr-mce").length||GLSR.shortcode.close()}),n(document).on("click",".glsr-mce-button",GLSR.shortcode.toggle),n(document).on("click",".glsr-mce-menu-item",GLSR.shortcode.trigger),n(document).on("click","a.change-site-review-status",GLSR.onChangeStatus),n(document).on("click",".branch-4 .toggle-row, .branch-4-1 .toggle-row, .branch-4-2 .toggle-row",function(){n(this).closest("tr").toggleClass("is-expanded")}),new GLSR.search("#glsr-search-translations",{action:"search-translations",onInit:function(){this.makeSortable()},onResultClick:function(e){var s=n(e.target),t=s.data("entry"),i=wp.template("glsr-string-"+(t.p1?"plural":"single"));t.index=this.options.entriesEl.children().length,t.prefix=this.options.resultsEl.data("prefix"),i&&(this.options.entriesEl.append(i(t)),this.options.exclude.push({id:t.id}),this.options.results=this.options.results.filter(function(e,t){return t!==s.get(0)})),this.setVisibility()}}),new GLSR.search("#glsr-search-posts",{action:"search-posts",onInit:function(){this.el.on("click",".glsr-remove-button",this.onUnassign.bind(this))},onResultClick:function(e){var t=n(e.target),s=wp.template("glsr-assigned-post"),i={url:t.data("url"),title:t.text()};s&&(this.el.find("input#assigned_to").val(t.data("id")),this.el.find(".description").html(s(i)),this.el.on("click",".glsr-remove-button",this.onUnassign.bind(this)),this.reset())}}),n("#glsr-outdated-notice .notice-dismiss").on("click",function(e){GLSR.postAjax(e,{action:"dismiss-outdated-notice"})})});
|
|
assets/js/site-reviews.js
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
/*!
|
2 |
-
* Star Rating
|
3 |
-
* @version: 2.2.2
|
4 |
-
* @author: Paul Ryley (http://geminilabs.io)
|
5 |
-
* @url: https://github.com/geminilabs/star-rating.js
|
6 |
-
* @license: MIT
|
7 |
-
*/
|
8 |
-
!function(t,i,e){"use strict";var r=function(e,t){this.selects="[object String]"==={}.toString.call(e)?i.querySelectorAll(e):[e],this.destroy=function(){this.widgets.forEach(function(e){e.destroy_()})},this.rebuild=function(){this.widgets.forEach(function(e){e.rebuild_()})},this.widgets=[];for(var r=0;r<this.selects.length;r++)if("SELECT"===this.selects[r].tagName){var n=new s(this.selects[r],t);void 0!==n.direction&&this.widgets.push(n)}},s=function(e,t){this.el=e,this.options_=this.extend_({},this.defaults,t||{},JSON.parse(e.getAttribute("data-options"))),this.setStarCount_(),this.stars<1||this.stars>this.options_.maxStars||this.init_()};s.prototype={defaults:{classname:"gl-star-rating",clearable:!0,initialText:"Select a Rating",maxStars:10,onClick:null,showText:!0},init_:function(){this.initEvents_(),this.current=this.selected=this.getSelectedValue_(),this.wrapEl_(),this.buildWidgetEl_(),this.setDirection_(),this.setValue_(this.current),this.handleEvents_("add")},buildLabelEl_:function(){this.options_.showText&&(this.textEl=this.insertSpanEl_(this.widgetEl,{class:this.options_.classname+"-text"},!0))},buildWidgetEl_:function(){var e=this.getOptionValues_(),t=this.insertSpanEl_(this.el,{class:this.options_.classname+"-stars"},!0);for(var r in e)if(e.hasOwnProperty(r)){var n=this.createSpanEl_({"data-value":r,"data-text":e[r]});t.innerHTML+=n.outerHTML}this.widgetEl=t,this.buildLabelEl_()},changeTo_:function(e){(e<0||isNaN(e))&&(e=0),e>this.stars&&(e=this.stars),this.widgetEl.classList.remove("s"+10*this.current),this.widgetEl.classList.add("s"+10*e),this.options_.showText&&(this.textEl.textContent=e<1?this.options_.initialText:this.widgetEl.childNodes[e-1].getAttribute("data-text")),this.current=e},createSpanEl_:function(e){var t=i.createElement("span");for(var r in e=e||{})e.hasOwnProperty(r)&&t.setAttribute(r,e[r]);return t},destroy_:function(){this.handleEvents_("remove");var e=this.el.parentNode;e.parentNode.replaceChild(this.el,e)},eventListener_:function(t,r,e){e.forEach(function(e){t[r+"EventListener"](e,this.events[e])}.bind(this))},extend_:function(){var e=[].slice.call(arguments),r=e[0],n=e.slice(1);return Object.keys(n).forEach(function(e){for(var t in n[e])n[e].hasOwnProperty(t)&&(r[t]=n[e][t])}),r},getIndexFromEvent_:function(e){var t={},r=e.pageX||e.changedTouches[0].pageX,n=this.widgetEl.offsetWidth;return t.ltr=Math.max(r-this.offsetLeft,1),t.rtl=n-t.ltr,Math.min(Math.ceil(t[this.direction]/Math.round(n/this.stars)),this.stars)},getOptionValues_:function(){for(var e=this.el,t={},r={},n=0;n<e.length;n++)this.isValueEmpty_(e[n])||(t[e[n].value]=e[n].text);return Object.keys(t).sort().forEach(function(e){r[e]=t[e]}),r},getSelectedValue_:function(){return parseInt(this.el.options[Math.max(this.el.selectedIndex,0)].value)||0},handleEvents_:function(e){for(var t=this.el;"FORM"!==t.tagName&&1===t.nodeType;)t=t.parentNode;"FORM"===t.tagName&&this.eventListener_(t,e,["reset"]),this.eventListener_(this.el,e,["change","keydown"]),this.eventListener_(this.widgetEl,e,["mousedown","mouseleave","mousemove","mouseover","touchend","touchmove","touchstart"])},initEvents_:function(){this.events={change:this.onChange_.bind(this),keydown:this.onKeydown_.bind(this),mousedown:this.onMousedown_.bind(this),mouseleave:this.onMouseleave_.bind(this),mousemove:this.onMousemove_.bind(this),mouseover:this.onMouseover_.bind(this),reset:this.onReset_.bind(this),touchend:this.onMousedown_.bind(this),touchmove:this.onMousemove_.bind(this),touchstart:this.onMouseover_.bind(this)}},insertSpanEl_:function(e,t,r){var n=this.createSpanEl_(t);return e.parentNode.insertBefore(n,!0===r?e.nextSibling:e),n},isValueEmpty_:function(e){return null===e.getAttribute("value")||""===e.value},onChange_:function(){this.changeTo_(this.getSelectedValue_())},onKeydown_:function(e){if(-1!==["ArrowLeft","ArrowRight"].indexOf(e.key)){var t="ArrowLeft"===e.key?-1:1;"rtl"===this.direction&&(t*=-1),this.setValue_(Math.min(Math.max(this.getSelectedValue_()+t,0),this.stars))}},onMousedown_:function(e){e.preventDefault();var t=this.getIndexFromEvent_(e);if(0!==this.current&&parseFloat(this.selected)===t&&this.options_.clearable)return this.onReset_();this.setValue_(t),"function"==typeof this.options_.onClick&&this.options_.onClick.call(this,this.el)},onMouseleave_:function(e){e.preventDefault(),this.changeTo_(this.selected)},onMousemove_:function(e){e.preventDefault(),this.changeTo_(this.getIndexFromEvent_(e))},onMouseover_:function(e){e.preventDefault();var t=this.widgetEl.getBoundingClientRect();this.offsetLeft=t.left+i.body.scrollLeft},onReset_:function(){var e=this.el.querySelector("[selected]"),t=e?e.value:"";this.el.value=t,this.selected=parseInt(t)||0,this.changeTo_(t)},rebuild_:function(){this.el.parentNode.classList.contains(this.options_.classname)&&this.destroy_(),this.init_()},setDirection_:function(){var e=this.el.parentNode;this.direction=t.getComputedStyle(e,null).getPropertyValue("direction"),e.classList.add(this.options_.classname+"-"+this.direction)},setValue_:function(e){this.el.value=e,this.selected=e,this.changeTo_(e)},setStarCount_:function(){for(var e=this.el,t=this.stars=0;t<e.length;t++)if(!this.isValueEmpty_(e[t])){if(isNaN(parseFloat(e[t].value))||!isFinite(e[t].value))return void(this.stars=0);this.stars++}},wrapEl_:function(){this.insertSpanEl_(this.el,{class:this.options_.classname,"data-star-rating":""}).appendChild(this.el)}},"function"==typeof define&&define.amd?define([],function(){return r}):"object"==typeof module&&module.exports?module.exports=r:t.StarRating=r}(window,document);var GLSR={addClass:function(e,t){e.classList?e.classList.add(t):GLSR.hasClass(e,t)||(e.className+=" "+t)},convertValue:function(e){return GLSR.isNumeric(e)?parseFloat(e):"true"===e||"false"!==e&&(""!==e&&null!==e?e:void 0)},getAjax:function(e,t){var r=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");return r.open("GET",e),r.onreadystatechange=function(){3<r.readyState&&200===r.status&&t(r.responseText)},r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.send(),r},hasClass:function(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)},inArray:function(e,t){for(var r=t.length;r--;)if(t[r]===e)return!0;return!1},isNumeric:function(e){return!(isNaN(parseFloat(e))||!isFinite(e))},isString:function(e){return"[object String]"===Object.prototype.toString.call(e)},on:function(t,e,r){GLSR.isString(e)&&(e=document.querySelectorAll(e)),[].forEach.call(e,function(e){e.addEventListener(t,r)})},off:function(t,e,r){GLSR.isString(e)&&(e=document.querySelectorAll(e)),[].forEach.call(e,function(e){e.removeEventListener(t,r)})},parseFormData:function(e,o){o=!!o||!1;for(var t=/[^\[\]]+/g,r={},a={},l=function(e,t,r,n){var i=r.shift();if(n=n?n+"."+i:i,r.length)t[i]||(t[i]={}),l(e,t[i],r,n);else{var s=o?GLSR.convertValue(e.value):e.value;if(n in a&&"radio"!==e.type&&!t[i].isArray()?t[i]=i in t?[t[i]]:[]:a[n]=!0,GLSR.inArray(e.type,["radio","checkbox"])&&!e.checked)return;t[i]?t[i].push(s):t[i]=s}},n=0;n<e.length;n++){var i=e[n];if(i.name&&!i.disabled&&!GLSR.inArray(i.type,["file","reset","submit","button"])){var s=i.name.match(t);s.length||(s=[i.name]),l(i,r,s)}}return r},postAjax:function(e,t,r){var n="string"!=typeof t?GLSR.serialize(t):t,i=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");return i.open("POST",e),i.onreadystatechange=function(){3<i.readyState&&200===i.status&&r(JSON.parse(i.responseText))},i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),i.send(n),i},removeClass:function(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp("\\b"+t+"\\b","g"),"")},serialize:function(e,t){var r=[];for(var n in e)if(e.hasOwnProperty(n)){var i=t?t+"["+n+"]":n,s=e[n];r.push("object"==typeof s?GLSR.serialize(s,i):encodeURIComponent(i)+"="+encodeURIComponent(s))}return r.join("&")},toggleClass:function(e,t){GLSR.hasClass(e,t)?GLSR.removeClass(e,t):GLSR.addClass(e,t)},insertAfter:function(e,t,r){var n=GLSR.createEl(t,r);return e.parentNode.insertBefore(n,e.nextSibling),n},appendTo:function(e,t,r){var n=GLSR.createEl(t,r);return e.appendChild(n),n},createEl:function(e,t){var r="string"==typeof e?document.createElement(e):e;for(var n in t=t||{})t.hasOwnProperty(n)&&r.setAttribute(n,t[n]);return r},SCROLL_TIME:468,activeForm:null,recaptcha:{},buildFormData:function(e){return void 0===e&&(e=""),{action:site_reviews.action,request:GLSR.parseFormData(GLSR.activeForm),"g-recaptcha-response":e}},clearFieldError:function(e){var t=e.closest(".glsr-field");if(null!==t){var r=t.querySelector(".glsr-field-errors");GLSR.removeClass(t,"glsr-has-error"),null!==r&&r.parentNode.removeChild(r)}},clearFormErrors:function(){var e=GLSR.activeForm;GLSR.clearFormMessages();for(var t=0;t<e.length;t++)GLSR.clearFieldError(e[t])},clearFormMessages:function(){var e=GLSR.activeForm.querySelector(".glsr-form-messages");e&&(e.innerHTML="")},createExceprts:function(e){for(var t=(e=e||document).querySelectorAll(".glsr-hidden-text"),r=0;r<t.length;r++){var n=GLSR.insertAfter(t[r],"span",{class:"glsr-read-more"});GLSR.appendTo(n,"a",{href:"#","data-text":t[r].getAttribute("data-show-less")}).innerHTML=t[r].getAttribute("data-show-more")}GLSR.on("click",".glsr-read-more a",GLSR.onClickReadMore)},createStarRatings:function(){new StarRating("select.glsr-star-rating",{clearable:!1,showText:!1,onClick:GLSR.clearFieldError})},enableSubmitButton:function(){GLSR.activeForm.querySelector('[type="submit"]').removeAttribute("disabled")},getSelectorOfElement:function(e){if(e&&e.nodeType===e.ELEMENT_NODE)return e.nodeName.toLowerCase()+(e.id?"#"+e.id.trim():"")+(e.className?"."+e.className.trim().replace(/\s+/g,"."):"")},now:function(){return window.performance&&window.performance.now?window.performance.now():Date.now()},onClickPagination:function(n){n.preventDefault();var i=this.closest(".glsr-reviews"),s=GLSR.getSelectorOfElement(i);GLSR.addClass(i,"glsr-hide"),GLSR.getAjax(this.href,function(e){var t=document.implementation.createHTMLDocument("new");t.documentElement.innerHTML=e;var r=s?t.querySelectorAll(s):"";if(1===r.length)return i.innerHTML=r[0].innerHTML,GLSR.scrollToTop(i),GLSR.removeClass(i,"glsr-hide"),GLSR.on("click",".glsr-ajax-navigation a",GLSR.onClickPagination),window.history.pushState(null,"",n.target.href),void GLSR.createExceprts(i);window.location=n.target.href})},onClickReadMore:function(e){e.preventDefault();var t=e.target,r=t.parentNode.previousSibling,n=t.getAttribute("data-text");GLSR.toggleClass(r,"glsr-hidden"),GLSR.toggleClass(r,"glsr-visible"),t.setAttribute("data-text",t.innerText),t.innerText=n}};GLSR.recaptcha.addListeners=function(){var e=GLSR.recaptcha.overlay();"[object HTMLDivElement]"===Object.prototype.toString.call(e)&&(e.addEventListener("click",GLSR.enableSubmitButton,!1),window.addEventListener("keyup",GLSR.recaptcha.onKeyup.bind(e),!1))},GLSR.recaptcha.execute=function(){var e=GLSR.recaptcha.id();return-1!==e?grecaptcha.execute(e):GLSR.submitForm(!1)},GLSR.recaptcha.id=function(){return GLSR.recaptcha.search(function(e,t){if("[object HTMLDivElement]"===Object.prototype.toString.call(e))return e.closest("form")===GLSR.activeForm?t:void 0})},GLSR.recaptcha.onKeyup=function(e){27===e.keyCode&&(GLSR.enableSubmitButton(),GLSR.recaptcha.removeListeners(this))},GLSR.recaptcha.overlay=function(){return GLSR.recaptcha.search(function(e){if("[object Object]"===Object.prototype.toString.call(e)){for(var t in e)if(e.hasOwnProperty(t)&&"[object HTMLDivElement]"===Object.prototype.toString.call(e[t])&&""===e[t].className)return e[t].firstChild;return!1}})},GLSR.recaptcha.removeListeners=function(e){e.removeEventListener("click",GLSR.enableSubmitButton,!1),window.removeEventListener("keyup",GLSR.recaptcha.onKeyup,!1)},GLSR.recaptcha.reset=function(){var e=GLSR.recaptcha.id();-1!==e&&grecaptcha.reset(e)},GLSR.recaptcha.search=function(e){var t=-1;if(window.hasOwnProperty("___grecaptcha_cfg")){var r,n,i=window.___grecaptcha_cfg.clients;for(r in i)for(n in i[r])if(t=e(i[r][n],r))return t}return t},GLSR.setDirection=function(){for(var e=document.querySelectorAll(".glsr-widget, .glsr-shortcode"),t=0;t<e.length;t++){var r=window.getComputedStyle(e[t],null).getPropertyValue("direction");e[t].classList.add("glsr-"+r)}},GLSR.scrollToTop=function(e,t){var r;t=t||16;for(var n=0;n<site_reviews.ajaxpagination.length;n++)(r=document.querySelector(site_reviews.ajaxpagination[n]))&&"fixed"===window.getComputedStyle(r).getPropertyValue("position")&&(t+=r.clientHeight);var i=e.getBoundingClientRect().top-t;0<i||("requestAnimationFrame"in window!=!1?GLSR.scrollToTopStep({endY:i,offset:window.pageYOffset,startTime:GLSR.now(),startY:e.scrollTop}):window.scroll(0,window.pageYOffset+i))},GLSR.scrollToTopStep=function(e){var t=(GLSR.now()-e.startTime)/GLSR.SCROLL_TIME;t=1<t?1:t;var r=.5*(1-Math.cos(Math.PI*t)),n=e.startY+(e.endY-e.startY)*r;window.scroll(0,e.offset+n),n!==e.endY&&window.requestAnimationFrame(GLSR.scrollToTopStep.bind(window,e))},GLSR.showFormErrors=function(e){var t,r;if(e)for(var n in e)if(e.hasOwnProperty(n)){t=GLSR.activeForm.querySelector('[name="'+n+'"]').closest(".glsr-field"),GLSR.addClass(t,"glsr-has-error"),null===(r=t.querySelector(".glsr-field-errors"))&&(r=GLSR.appendTo(t,"span",{class:"glsr-field-errors"}));for(var i=0;i<e[n].errors.length;i++)null!==e[n].errors[i]&&(r.innerHTML+='<span class="glsr-field-error">'+e[n].errors[i]+"</span>")}},GLSR.showFormMessage=function(e){var t=GLSR.activeForm.querySelector('input[name="form_id"]'),r=GLSR.activeForm.querySelector(".glsr-form-messages");null===r&&(r=GLSR.insertAfter(t,"div",{class:"glsr-form-messages"})),e.errors?GLSR.addClass(r,"gslr-has-errors"):GLSR.removeClass(r,"gslr-has-errors"),r.innerHTML="<p>"+e.message+"</p>"},GLSR.submitForm=function(e){GLSR.activeForm.querySelector('[type="submit"]').setAttribute("disabled",""),GLSR.addClass(GLSR.activeForm,"glsr-loading"),GLSR.postAjax(site_reviews.ajaxurl,GLSR.buildFormData(e),function(e){if(!0===e.recaptcha)return GLSR.recaptcha.execute();"reset"===e.recaptcha&&GLSR.recaptcha.reset(),!1===e.errors&&(GLSR.recaptcha.reset(),GLSR.activeForm.reset()),GLSR.showFormErrors(e.errors),GLSR.showFormMessage(e),GLSR.enableSubmitButton(),GLSR.removeClass(GLSR.activeForm,"glsr-loading"),e.form=GLSR.activeForm,document.dispatchEvent(new CustomEvent("site-reviews/after/submission",{detail:e})),GLSR.activeForm=null})},GLSR.on("change","form.glsr-submit-review-form",function(e){GLSR.clearFieldError(e.target)}),GLSR.on("submit","form.glsr-submit-review-form",function(e){GLSR.hasClass(this,"no-ajax")||(e.preventDefault(),GLSR.activeForm=this,GLSR.recaptcha.addListeners(),GLSR.clearFormErrors(),GLSR.submitForm())}),GLSR.on("click",'.glsr-field [type="submit"]',function(){this.closest("form").onsubmit=null,HTMLFormElement.prototype._submit=HTMLFormElement.prototype.submit,HTMLFormElement.prototype.submit=function(){var e=this.querySelector("#g-recaptcha-response");null===e||null===this.querySelector(".glsr-field")?this._submit():GLSR.submitForm(e.value)}}),GLSR.on("click",".glsr-ajax-navigation a",GLSR.onClickPagination),GLSR.init=function(){GLSR.setDirection(),GLSR.createExceprts(),GLSR.createStarRatings()},GLSR.onLoaded=function(){document.removeEventListener("DOMContentLoaded",GLSR.onLoaded),window.removeEventListener("load",GLSR.onLoaded),GLSR.init()},"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(GLSR.init):(document.addEventListener("DOMContentLoaded",GLSR.onLoaded),window.addEventListener("load",GLSR.onLoaded));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/scripts/mce-plugin.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(o){"use strict";window.tinymce.PluginManager.add("glsr_shortcode",function(o){o.addCommand("GLSR_Shortcode",function(){GLSR.shortcode.create(o.id)})})}();
|
assets/scripts/site-reviews-admin.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(n){"use strict";GLSR.Ajax=function(t,i,s){this.event=i||null,this.form=s||null,this.notice=null,this.request=t||{}},GLSR.Ajax.prototype={post:function(t){this.event?this.t(t):this.i(t)},s:function(t){var i={action:GLSR.action,_ajax_request:!0};if(this.form){var s=new GLSR.Serializer(this.form);s[GLSR.nameprefix]&&(this.request=s[GLSR.nameprefix])}return this.n(t),i[GLSR.nameprefix]=this.request,i},n:function(t){this.request._nonce||(GLSR.nonce[this.request._action]?this.request._nonce=GLSR.nonce[this.request._action]:t&&(this.request._nonce=t.closest("form").find("#_wpnonce").val()))},i:function(i,s){n.post(GLSR.ajaxurl,this.s(s)).done(function(t){"function"==typeof i&&i(t.data,t.success),s&&s.prop("disabled",!1)}).always(function(t){t.data?t.data.notices&&GLSR.Notices(t.data.notices):GLSR.Notices('<div class="notice notice-error inline is-dismissible"><p>Unknown error.</p></div>')})},t:function(t){this.event.preventDefault();var i=n(this.event.currentTarget);i.is(":disabled")||(i.prop("disabled",!0),this.i(t,i))}}}(jQuery),function(t){"use strict";GLSR.ColorPicker=function(){"object"==typeof t.wp&&"function"==typeof t.wp.wpColorPicker&&t(document).find("input[type=text].color-picker-hex").each(function(){t(this).wpColorPicker(t(this).data("colorpicker")||{})})}}(jQuery),function(){"use strict";GLSR.Forms=function(t){this.el=document.querySelector(t),this.el&&(this.depends=this.el.querySelectorAll("[data-depends]"),this.depends.length&&this.e())},GLSR.Forms.prototype={e:function(){for(var t=this.el.elements,i=0;i<t.length;i++)-1!==["INPUT","SELECT"].indexOf(t[i].nodeName)&&t[i].addEventListener("change",this.o.bind(this))},h:function(t,i){if(Array.isArray(i.value)){if("checkbox"===t.type){var s=!1;return[].map.call(t.closest("form").querySelectorAll('input[name="'+t.name+'"]:checked'),function(t){~i.value.indexOf(t.value)&&(s=!0)}),s}return-1!==this.c(i.value).indexOf(this.r(t.value))}return"checkbox"===t.type?!!t.checked:this.r(i.value)===this.r(t.value)},r:function(t){return-1!==["true","on","yes","1"].indexOf(t)||-1===["false","off","no","0"].indexOf(t)&&t},c:function(t){return t.map(this.r)},o:function(n){this.depends.forEach(function(t){var i,s=t.getAttribute("data-depends");if(s){try{i=JSON.parse(s)}catch(t){return console.log(s),console.error(t)}i.name===n.currentTarget.name&&this.u(t,this.h(n.currentTarget,i))}}.bind(this))},u:function(t,i){var s=t.closest(".glsr-field");s&&s.classList[i?"remove":"add"]("hidden")}}}(),function(i){"use strict";GLSR.Notices=function(t){t&&(i("#glsr-notices").length||(i("#message.notice").remove(),i("form#post").before('<div id="glsr-notices" />')),i("#glsr-notices").html(t),i(document).trigger("wp-updates-notice-added"))}}(jQuery),function(s){"use strict";GLSR.Pinned=function(){this.el=s("#pinned-status-select"),this.el&&(this.cancel=s("a.cancel-pinned-status"),this.cancel.on("click",this.a.bind(this)),this.edit=s("a.edit-pinned-status"),this.edit.on("click",this.l.bind(this)),this.save=s("a.save-pinned-status"),this.save.on("click",this.d.bind(this))),s("table td.pinned i").on("click",this.f.bind(this))},GLSR.Pinned.prototype={p:function(){this.el.slideUp("fast"),this.edit.show().focus()},a:function(t){t.preventDefault(),this.p(),this.el.find("select").val("0"===s("#hidden-pinned-status").val()?1:0)},l:function(t){t.preventDefault(),this.el.is(":hidden")&&(this.el.slideDown("fast",function(){this.el.find("select").focus()}.bind(this)),this.edit.hide())},d:function(t){t.preventDefault(),this.p(),this.target=t.currentTarget;var i={_action:"toggle-pinned",id:s("#post_ID").val(),pinned:s("#pinned-status").val()};new GLSR.Ajax(i).post(this.v.bind(this))},f:function(t){t.preventDefault(),this.target=t.currentTarget;var i={_action:"toggle-pinned",id:t.currentTarget.getAttribute("data-id")};new GLSR.Ajax(i).post(this.g.bind(this))},v:function(t){s("#pinned-status").val(0|!t.pinned),s("#hidden-pinned-status").val(0|t.pinned),s("#pinned-status-text").text(t.pinned?this.target.dataset.yes:this.target.dataset.no),GLSR.Notices(t.notices)},g:function(t){this.target.classList[t.pinned?"add":"remove"]("pinned")}}}(jQuery),function(i){"use strict";GLSR.Pointers=function(){i.each(GLSR.pointers,function(t,i){this.e(i)}.bind(this))},GLSR.Pointers.prototype={S:function(t){i.post(GLSR.ajaxurl,{action:"dismiss-wp-pointer",pointer:t})},e:function(t){i(t.target).pointer({content:t.options.content,position:t.options.position,close:this.S.bind(null,t.id)}).pointer("open").pointer("sendToTop"),i(document).on("wp-window-resized",function(){i(t.target).pointer("reposition")})}}}(jQuery),function(t,s,e){"use strict";GLSR.Search=function(t,i){this.el=e(t),this.options=i,this.searchTerm=null,this.e()},GLSR.Search.prototype={defaults:{action:null,exclude:[],onInit:null,onResultClick:null,results:{},selected:-1,selectedClass:"glsr-selected-result",selectorEntries:".glsr-strings-table tbody",selectorResults:".glsr-search-results",selectorSearch:".glsr-search-input"},e:function(){this.options=e.extend({},this.defaults,this.options),this.el.length&&(this.options.entriesEl=this.el.parent().find(this.options.selectorEntries),this.options.resultsEl=this.el.find(this.options.selectorResults),this.options.searchEl=this.el.find(this.options.selectorSearch),this.options.searchEl.attr("aria-describedby","live-search-desc"),"function"==typeof this.options.onInit&&this.options.onInit.call(this),this.m())},m:function(){this.options.searchEl.on("input",t.debounce(this.R.bind(this),500)),this.options.searchEl.on("keyup",this.L.bind(this)),this.options.searchEl.on("keydown keypress",function(t){GLSR.keys.ENTER===t.which&&t.preventDefault()}),e(document).on("click",this.w.bind(this)),e(document).on("keydown",this.G.bind(this))},y:function(){void 0!==this.searchRequest&&this.searchRequest.abort()},b:function(){this.y(),this.options.resultsEl.empty(),this.el.removeClass("is-active"),e("body").removeClass("glsr-focus")},k:function(t){var i=this.options.entriesEl.children("tr").eq(t),s=this;i.find("td").css({backgroundColor:"#faafaa"}),i.fadeOut(350,function(){e(this).remove(),s.options.results={},s.x(),s.C()})},j:function(t){e("body").addClass("glsr-focus"),this.options.resultsEl.append(t),this.options.resultsEl.children("span").on("click",this.T.bind(this))},z:function(){this.options.entriesEl.on("click","a.delete",this.Q.bind(this)),this.options.entriesEl.sortable({items:"tr",tolerance:"pointer",start:function(t,i){i.placeholder.height(i.helper[0].scrollHeight)},sort:function(t,i){var s=t.pageY-e(this).offsetParent().offset().top-i.helper.outerHeight(!0)/2;i.helper.css({top:s+"px"})}})},P:function(t){this.options.selected+=t,this.options.results.removeClass(this.options.selectedClass),this.options.selected<0&&(this.options.selected=-1,this.options.searchEl.focus()),this.options.selected>=this.options.results.length&&(this.options.selected=this.options.results.length-1),0<=this.options.selected&&this.options.results.eq(this.options.selected).addClass(this.options.selectedClass).focus()},w:function(t){e(t.target).find(this.el).length&&e("body").hasClass("glsr-focus")&&this.b()},G:function(t){if(!e.isEmptyObject(this.options.results)){if(GLSR.keys.ESC===t.which&&this.b(),GLSR.keys.ENTER===t.which||GLSR.keys.SPACE===t.which){var i=this.options.resultsEl.find("."+this.options.selectedClass);i&&i.trigger("click")}GLSR.keys.UP===t.which&&(t.preventDefault(),this.P(-1)),GLSR.keys.DOWN===t.which&&(t.preventDefault(),this.P(1))}},Q:function(t){t.preventDefault(),this.k(e(t.currentTarget).closest("tr").index())},T:function(t){t.preventDefault(),"function"==typeof this.options.onResultClick&&this.options.onResultClick.call(this,t),this.b()},R:function(t){if(this.y(),this.searchTerm===t.currentTarget.value&&this.options.results.length)return this.j(this.options.results);if(this.options.resultsEl.empty(),this.options.selected=-1,this.searchTerm=t.currentTarget.value,""===this.searchTerm)return this.D();this.el.addClass("is-active");var i={};i[GLSR.nameprefix]={_action:this.options.action,_nonce:this.el.find("#_search_nonce").val(),exclude:this.options.exclude,search:this.searchTerm},this.searchRequest=s.ajax.post(GLSR.action,i).done(function(t){this.el.removeClass("is-active"),this.j(t.items?t.items:t.empty),this.options.results=this.options.resultsEl.children(),delete this.searchRequest}.bind(this))},L:function(t){GLSR.keys.ESC===t.which&&this.D(),GLSR.keys.ENTER===t.which&&(this.R(t),t.preventDefault())},I:function(t){t.preventDefault();var i=this.el.find(".description");this.el.find("input#assigned_to").val(""),i.find("a").css({color:"#c00"}),i.fadeOut("fast",function(){e(this).html("").show()})},x:function(){var n=this;this.options.exclude=[],this.options.entriesEl.children("tr").each(function(s){e(this).find(".glsr-string-td2").children().filter(":input").each(function(){var t=e(this),i=t.attr("name").replace(/\[\d+\]/i,"["+s+"]");t.attr("name",i),t.is("[data-id]")&&n.options.exclude.push({id:t.val()})})})},D:function(){this.b(),this.options.results={},this.options.searchEl.val("")},C:function(){var t=0<this.options.entriesEl.children().length?"remove":"add";this.options.entriesEl.parent()[t+"Class"]("glsr-hidden")}}}(window._,window.wp,jQuery),function(n){"use strict";GLSR.Serializer=function(t){return this.data={},this.form=n(t),this.pushes={},this.init()},GLSR.Serializer.prototype={patterns:{validate:/^[a-z_-][a-z0-9_-]*(?:\[(?:\d*|[a-z0-9_-]+)\])*$/i,key:/[a-z0-9_-]+|(?=\[\])/gi,named:/^[a-z0-9_-]+$/i,push:/^$/,fixed:/^\d+$/},addPair:function(t){this.patterns.validate.test(t.name)&&(this.data=n.extend(!0,this.data,this.makeObject(t.name,this.encode(t))))},build:function(t,i,s){return t[i]=s,t},encode:function(t){switch(n('[name="'+t.name+'"]',this.form).attr("type")){case"checkbox":return"on"===t.value||t.value;default:return t.value}},incrementPush:function(t){return void 0===this.pushes[t]&&(this.pushes[t]=0),this.pushes[t]++},init:function(){var t=this.form.serializeArray();if(n.isArray(t))for(var i=0,s=t.length;i<s;i++)this.addPair(t[i]);return this.data},makeObject:function(t,i){for(var s,n=t.match(this.patterns.key);void 0!==(s=n.pop());)if(this.patterns.push.test(s)){var e=this.incrementPush(t.replace(/\[\]$/,""));i=this.build([],e,i)}else this.patterns.fixed.test(s)?i=this.build([],s,i):this.patterns.named.test(s)&&(i=this.build({},s,i));return i}}}(jQuery),function(n){"use strict";GLSR.Shortcode=function(t){this.current=null,this.editor=null,this.create=function(t){if(this.editor=tinymce.get(t),this.editor){var i={_action:"mce-shortcode",shortcode:this.current};new GLSR.Ajax(i).post(this.A.bind(this))}};var i=document.querySelectorAll(t);i.length&&i.forEach(function(t){var i=t.querySelector("button"),s=t.querySelectorAll(".mce-menu-item");i&&s.length&&this.e(t,i,s)}.bind(this))},GLSR.Shortcode.prototype={N:{},V:[],e:function(i,s,t){document.addEventListener("click",this.$.bind(this,i,s)),s.addEventListener("click",this.O.bind(this,i,s)),t.forEach(function(t){t.addEventListener("click",this.U.bind(this,i,s))}.bind(this))},F:function(){tinymce.execCommand("GLSR_Shortcode")},H:function(){n("#scTemp").length?this.F():(n("body").append('<textarea id="scTemp" style="display:none!important;"/>'),tinymce.init({elements:"scTemp",external_plugins:GLSR.tinymce,mode:"exact",plugins:["glsr_shortcode","wplink"]}),setTimeout(function(){this.F()}.bind(this),200))},S:function(t,i){n(i).removeClass("active"),n(t).find(".glsr-mce-menu").hide()},K:function(){var t=n("#scTemp");t.length&&(tinymce.get("scTemp").remove(),t.remove()),this.N={},this.V=[]},A:function(t){if(t){if(0===t.body.length)return window.send_to_editor("["+t.shortcode+"]"),void this.K();var i=this.W(t);t.ok.constructor===Array&&(i.buttons[0].text=t.ok[0],i.buttons[0].onclick="close",delete i.buttons[1]),this.editor.windowManager.open(i)}},q:function(t){for(var i in this.N=t,this.V=[],t)t.hasOwnProperty(i)&&(this.B(i),this.J(i),this.M(i));this.N.hide=this.V.join(",")},B:function(t){"count"!==t||n.isNumeric(this.N[t])||(this.N[t]="")},J:function(t){if(GLSR.hideoptions.hasOwnProperty(this.current)){var i=t.substring("hide_".length);-1!==Object.keys(GLSR.hideoptions[this.current]).indexOf(i)&&(this.N[t]&&this.V.push(i),delete this.N[t])}},M:function(t){"id"===t&&(this.N[t]=(+new Date).toString(36))},$:function(t,i,s){n(s.target).closest(n(t)).length||this.S(t,i)},O:function(t,i,s){s.preventDefault(),s.currentTarget.classList.contains("active")?this.S(t,i):this.X(t,i)},U:function(t,i,s){s.preventDefault(),this.current=s.currentTarget.dataset.shortcode,this.current&&(tinymce.get(window.wpActiveEditor)?this.F():this.H(),setTimeout(function(){this.S(t,i)}.bind(this),100))},X:function(t,i){n(i).addClass("active"),n(t).find(".glsr-mce-menu").show()},Y:function(t){return[{classes:"btn glsr-btn primary",onclick:this.Z.bind(this),text:t.ok},{onclick:"close",text:t.close}]},W:function(t){return{title:t.title,body:t.body,classes:"glsr-mce-popup",minWidth:320,buttons:this.Y(t),onsubmit:this.tt.bind(this,t),onclose:this.K.bind(this)}},tt:function(t,i){var s="";for(var n in this.q(i.data),this.N)this.N.hasOwnProperty(n)&&""!==this.N[n]&&(s+=" "+n+'="'+this.N[n]+'"');window.send_to_editor("["+t.shortcode+s+"]")},Z:function(){var t=this.editor.windowManager.getWindows()[0];this.it(t)&&t.submit()},it:function(t){var i,s=!0,n=GLSR.shortcodes[this.current];for(var e in n)if(n.hasOwnProperty(e)&&void 0!==(i=t.find("#"+e)[0])&&""===i.state.data.value){s=!1,alert(n[e]);break}return s}}}(jQuery),function(e){"use strict";GLSR.Status=function(t){var i=document.querySelectorAll(t);i.length&&i.forEach(function(t){t.addEventListener("click",this.st)}.bind(this))},GLSR.Status.prototype={st:function(s){var t=s.currentTarget.href.match(/post=([0-9]+)/),i=s.currentTarget.href.match(/action=([a-z]+)/);if(null!==t&&null!==i){var n={_action:"change-status",_nonce:GLSR.nonce["change-status"],post_id:t[1],status:i[1]};new GLSR.Ajax(n,s).post(function(t){if(t.class){var i=e(s.target);i.closest("tr").removeClass("status-pending status-publish").addClass(t.class),i.closest("td.column-title").find("strong").html(t.link),t.counts&&i.closest(".wrap").find("ul.subsubsub").html(t.counts)}})}}}}(jQuery),function(i){"use strict";GLSR.Sync=function(){this.button=i("button#sync-reviews"),this.progressbar=i(".glsr-progress"),this.service=null,i("form").on("click","#sync-reviews",this.nt.bind(this)),i(document).on("wp-window-resized",this.et),i(window).on("hashchange",this.et),this.et()},GLSR.Sync.prototype={ot:function(t){i(".service-"+this.service+" td.column-last_sync").text(t.last_sync),i(".service-"+this.service+" td.column-total_fetched a").text(t.total),this.ht(!1)},nt:function(t){t.preventDefault(),this.service=i('[name="'+GLSR.nameprefix+'[service]"]').val(),this.service&&(this.ht(!0),this.ct())},et:function(){var t=i(".glsr-progress").width();t&&i(".glsr-progress span").width(t)},ct:function(){var t={_action:"sync-reviews",service:this.service,stage:"fetch"};new GLSR.Ajax(t).post(this.rt.bind(this))},rt:function(t){var i={_action:"sync-reviews",job_id:t.job_id,service:this.service,stage:"progress"},s=t.finished?this.ut.bind(this,t):this.rt.bind(this);this.at(t.message),this.lt(t.percent),setTimeout(function(){new GLSR.Ajax(i).post(s)},1500)},ut:function(t){var i=0;try{i=t.meta.pagination.current_page}catch(t){}var s={_action:"sync-reviews",page:i+1,service:this.service,stage:"reviews"};this.at(t.message),t.percent_synced&&100<=t.percent_synced?this.ot(t):new GLSR.Ajax(s).post(this.ut.bind(this))},at:function(t){i(".glsr-progress-status",this.progressbar).text(t)},lt:function(t){t=(t||0)+"%",i(".glsr-progress-bar",this.progressbar).outerWidth(t)},ht:function(t){if(!0===t&&(this.at(this.progressbar.data("active-text")),this.lt(),this.button.prop("disabled",!0),window.requestAnimationFrame(function(){this.progressbar.addClass("active")}.bind(this))),!1===t)return this.service=null,this.button.prop("disabled",!1),void this.progressbar.removeClass("active");window.requestAnimationFrame(this.ht.bind(this))}}}(jQuery),function(n){"use strict";GLSR.Tabs=function(t){this.options=n.extend({},this.defaults,t),this.active=document.querySelector("input[name=_active_tab]"),this.referrer=document.querySelector("input[name=_wp_http_referer]"),this.tabs=document.querySelectorAll(this.options.tabSelector),this.views=document.querySelectorAll(this.options.viewSelector),this.active&&this.referrer&&this.tabs&&this.views&&this.e()},GLSR.Tabs.prototype={defaults:{tabSelector:".glsr-nav-tab",viewSelector:".glsr-nav-view"},e:function(){var s=this;n(window).on("hashchange",s.dt.bind(s)),[].forEach.call(s.tabs,function(t,i){(location.hash?t.getAttribute("href").slice(1)===location.hash.slice(2):0===i)&&s.ft(t),t.addEventListener("click",s.st.bind(s)),t.addEventListener("touchend",s.st.bind(s))}.bind(s)),n(s.options.viewSelector).on("click","a",function(){var t=n(n(this).data("expand")),i=t.parent();i.removeClass("collapsed"),s.pt(i),i.removeClass("collapsed"),t.removeClass("closed").find(".handlediv").attr("aria-expanded",!0)})},vt:function(t){return t?"add":"remove"},st:function(t){t.preventDefault();var i=t.currentTarget;i.blur(),this._t(i),this.ft(i),location.hash="!"+i.getAttribute("href").slice(1)},dt:function(){for(var t=location.hash.split("#!")[1],i=0;i<this.views.length;i++)if(t===this.views[i].id){this.ft(this.tabs[i]);break}},gt:function(t){var i=this.referrer.value.split("#")[0]+"#!"+this.views[t].id;this.referrer.value=i},ft:function(n){[].forEach.call(this.tabs,function(t,i){var s=this.vt(t===n);"add"===s&&(this.active.value=this.views[i].id,this.gt(i),this.St(i)),t.classList[s]("nav-tab-active")}.bind(this))},St:function(n){[].forEach.call(this.views,function(t,i){var s=this.vt(i!==n);t.classList[s]("ui-tabs-hide")}.bind(this))},pt:function(t){var i=t.hasClass("collapsed")?"remove":"add";t[i+"Class"]("collapsed").find(".glsr-card.postbox")[i+"Class"]("closed").find(".handlediv").attr("aria-expanded","add"!==i)},_t:function(t){if(t.classList.contains("nav-tab-active")){var i=n(t.getAttribute("href"));this.pt(i)}}}}(jQuery),function(i){"use strict";GLSR.TextareaResize=function(){var t=document.querySelector("#contentdiv > textarea");t&&(this.mt(t),i(document).on("wp-window-resized.editor-expand",function(){this.mt(t)}.bind(this)))},GLSR.TextareaResize.prototype={mt:function(t){var i=320<t.scrollHeight?t.scrollHeight:320;t.style.height="auto",t.style.height=i+"px"}}}(jQuery),function(s){"use strict";GLSR.Tools=function(){s("form").on("click","#clear-console",this.Rt,this.st.bind(this)),s("form").on("click","#fetch-console",this.Rt,this.st.bind(this)),s("form").on("click","#count-reviews",this.st.bind(this))},GLSR.Tools.prototype={Rt:function(t,i){i&&s("#log-file").val(t.console)},st:function(s){new GLSR.Ajax({},s,s.currentTarget.closest("form")).post(function(t,i){"function"==typeof s.data&&s.data(t,i)})}}}(jQuery),GLSR.keys={DOWN:40,ENTER:13,ESC:27,SPACE:32,UP:38},jQuery(function(e){GLSR.shortcode=new GLSR.Shortcode(".glsr-mce"),GLSR.ColorPicker(),new GLSR.Forms("form.glsr-form"),new GLSR.Pinned,new GLSR.Pointers,new GLSR.Search("#glsr-search-posts",{action:"search-posts",onInit:function(){this.el.on("click",".glsr-remove-button",this.I.bind(this))},onResultClick:function(t){var i=e(t.currentTarget),s=wp.template("glsr-assigned-post"),n={url:i.data("url"),title:i.text()};s&&(this.el.find("input#assigned_to").val(i.data("id")),this.el.find(".description").html(s(n)),this.el.on("click",".glsr-remove-button",this.I.bind(this)),this.D())}}),new GLSR.Search("#glsr-search-translations",{action:"search-translations",onInit:function(){this.z()},onResultClick:function(t){var s=e(t.currentTarget),i=s.data("entry"),n=wp.template("glsr-string-"+(i.p1?"plural":"single"));i.index=this.options.entriesEl.children().length,i.prefix=this.options.resultsEl.data("prefix"),n&&(this.options.entriesEl.append(n(i)),this.options.exclude.push({id:i.id}),this.options.results=this.options.results.filter(function(t,i){return i!==s.get(0)})),this.C()}}),new GLSR.Status("a.glsr-change-status"),new GLSR.Tabs,new GLSR.TextareaResize,new GLSR.Tools,new GLSR.Sync,e(".glsr-card.postbox").addClass("closed").find(".handlediv").attr("aria-expanded",!1).closest(".glsr-nav-view").addClass("collapsed"),e(".glsr-card.postbox .glsr-card-header").on("click",function(){var t=e(this).parent(),i=t.closest(".glsr-nav-view"),s=t.hasClass("closed")?"remove":"add";t[s+"Class"]("closed").find(".handlediv").attr("aria-expanded","add"!==s),s=0<i.find(".glsr-card.postbox").not(".closed").length?"remove":"add",i[s+"Class"]("collapsed")}),e(".glsr-support-step").not(":checked").length<1&&e(".glsr-card-result").removeClass("hidden"),e(".glsr-support-step").on("change",function(){var t=0<e(".glsr-support-step").not(":checked").length?"add":"remove";e(".glsr-card-result")[t+"Class"]("hidden")})});
|
assets/scripts/site-reviews-blocks.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(e,t,i,n,s){"use strict";var o=window.wp.i18n.__,a=GLSR.nameprefix+"/form",l=n.createElement,r=i.InspectorControls,c=i.InspectorAdvancedControls,u=t.PanelBody,p=t.ServerSideRender,v=t.TextControl,h=t.SelectControl,w={label:"- "+o("Select","site-reviews")+" -",value:""},d=[];wp.apiFetch({path:"/site-reviews/v1/categories"}).then(function(e){d.push(w),$.each(e,function(e,t){d.push({label:t.name,value:t.id})})});var g=function(e,o,t,a){return l("div",{className:"components-base-control__field"},l("input",{checked:-1<a.attributes.hide.split(",").indexOf(o),className:"components-checkbox-control__input",id:"inspector-checkbox-control-hide-"+e,type:"checkbox",value:1,onChange:function(e){var t,i,n,s;t=o,i=e.target.checked,n=a,s=_.without(n.attributes.hide.split(","),""),i?s.push(t):s=_.without(s,t),n.setAttributes({hide:s.toString()})}}),l("label",{className:"components-checkbox-control__label",htmlFor:"inspector-checkbox-control-hide-"+e},t))};e.registerBlockType(a,{attributes:{assign_to:{default:"",type:"string"},category:{default:"",type:"string"},className:{default:"",type:"string"},hide:{default:"",type:"string"},id:{default:"",type:"string"}},category:GLSR.nameprefix,description:o("Display a review submission form.","site-reviews"),edit:function(t){return[l(r,{key:"inspector"},l(u,{title:o("Settings","site-reviews")},l(v,{help:o('Assign reviews to a post ID. You can also enter "post_id" to use the ID of the current page, or "parent_id" to use the ID of the parent page.',"site-reviews"),label:o("Assign To","site-reviews"),onChange:function(e){t.setAttributes({assign_to:e})},type:"text",value:t.attributes.assign_to}),l(h,{help:o("Assign reviews to a category.","site-reviews"),label:o("Category","site-reviews"),onChange:function(e){t.setAttributes({category:e})},options:d,value:t.attributes.category}),function(e,t){var i=0,n=["div",{className:"components-base-control"}];for(var s in e)e.hasOwnProperty(s)&&(n.push(g(i,s,e[s],t)),i++);return l.apply(null,n)}.apply(null,[GLSR.hideoptions.site_reviews_form,t]))),l(c,null,l(v,{label:o("Custom ID","site-reviews"),onChange:function(e){t.setAttributes({id:e})},type:"text",value:t.attributes.id})),l(p,{block:a,attributes:t.attributes})]},icon:l(t.SVG,{width:"22px",height:"22px",viewBox:"0 0 22 22",xmlns:"http://www.w3.org/2000/svg"},l(t.Path,{d:"M11 2l-3 6-6 .75 4.13 4.62-1.13 6.63 6-3 6 3-1.12-6.63 4.12-4.62-6-.75-3-6zm0 2.24l2.34 4.69 4.65.58-3.18 3.56.87 5.15-4.68-2.34v-11.64zm8.28-.894v.963h-3.272v2.691h-1.017v-6.3h4.496v.963h-3.479v1.683h3.272z"})),save:function(){return null},title:"Submit a Review"})}(window.wp.blocks,window.wp.components,window.wp.editor,window.wp.element),function(e,t,i,n,s){"use strict";var o=window.wp.i18n.__,a=GLSR.nameprefix+"/reviews",l=n.createElement,r=i.InspectorControls,c=i.InspectorAdvancedControls,u=t.PanelBody,p=t.ServerSideRender,v=t.TextControl,h=t.ToggleControl,w=t.RangeControl,d=t.SelectControl,g={label:"- "+o("Select","site-reviews")+" -",value:""},m=[];wp.apiFetch({path:"/site-reviews/v1/categories"}).then(function(e){m.push(g),$.each(e,function(e,t){m.push({label:t.name,value:t.id})})});var f=[];wp.apiFetch({path:"/site-reviews/v1/types"}).then(function(e){e.length<2||(f.push(g),$.each(e,function(e,t){f.push({label:t.name,value:t.slug})}))});var b=function(e,o,t,a){return l("div",{className:"components-base-control__field"},l("input",{checked:-1<a.attributes.hide.split(",").indexOf(o),className:"components-checkbox-control__input",id:"inspector-checkbox-control-hide-"+e,type:"checkbox",value:1,onChange:function(e){var t,i,n,s;t=o,i=e.target.checked,n=a,s=_.without(n.attributes.hide.split(","),""),i?s.push(t):s=_.without(s,t),n.setAttributes({hide:s.toString()})}}),l("label",{className:"components-checkbox-control__label",htmlFor:"inspector-checkbox-control-hide-"+e},t))};e.registerBlockType(a,{attributes:{assigned_to:{default:"",type:"string"},category:{default:"",type:"string"},className:{default:"",type:"string"},count:{default:5,type:"number"},hide:{default:"",type:"string"},id:{default:"",type:"string"},pagination:{default:"",type:"string"},post_id:{default:"",type:"string"},rating:{default:1,type:"number"},schema:{default:!1,type:"boolean"},type:{default:"",type:"string"}},category:GLSR.nameprefix,description:o("Display your most recent reviews.","site-reviews"),edit:function(t){return t.attributes.post_id=$("#post_ID").val(),[l(r,{key:"inspector"},l(u,{title:o("Settings","site-reviews")},l(v,{help:o('Limit reviews to those assigned to this post ID. You can also enter "post_id" to use the ID of the current page, or "parent_id" to use the ID of the parent page.',"site-reviews"),label:o("Assigned To","site-reviews"),onChange:function(e){t.setAttributes({assigned_to:e})},type:"text",value:t.attributes.assigned_to}),l(d,{help:o("Limit reviews to a specific category.","site-reviews"),label:o("Category","site-reviews"),onChange:function(e){t.setAttributes({category:e})},options:m,value:t.attributes.category}),l(d,{help:o("Pagination should only be enabled once per page.","site-reviews"),label:o("Pagination","site-reviews"),onChange:function(e){t.setAttributes({pagination:e})},options:[g,{label:o("Enabled","site-reviews"),value:"true"},{label:o("Enabled (using ajax)","site-reviews"),value:"ajax"}],value:t.attributes.pagination}),l(d,{help:o("Limit reviews to a specific type.","site-reviews"),label:o("Type","site-reviews"),onChange:function(e){t.setAttributes({type:e})},options:f,value:t.attributes.type}),l(w,{help:o("Limit reviews to a minimum rating.","site-reviews"),label:o("Minimum Rating","site-reviews"),onChange:function(e){t.setAttributes({rating:e})},min:0,max:5,value:t.attributes.rating}),l(w,{help:o("The number of reviews to show.","site-reviews"),label:o("Review Count","site-reviews"),onChange:function(e){t.setAttributes({count:e})},min:1,max:50,value:t.attributes.count}),l(h,{help:o("The schema should only be enabled once per page.","site-reviews"),label:o("Enable the schema?","site-reviews"),checked:t.attributes.schema,onChange:function(e){t.setAttributes({schema:e})}}),function(e,t){var i=0,n=["div",{className:"components-base-control"}];for(var s in e)e.hasOwnProperty(s)&&(n.push(b(i,s,e[s],t)),i++);return l.apply(null,n)}.apply(null,[GLSR.hideoptions.site_reviews,t]))),l(c,null,l(v,{label:o("Custom ID","site-reviews"),onChange:function(e){t.setAttributes({id:e})},type:"text",value:t.attributes.id})),l(p,{block:a,attributes:t.attributes})]},icon:l(t.SVG,{width:"22px",height:"22px",viewBox:"0 0 22 22",xmlns:"http://www.w3.org/2000/svg"},l(t.Path,{d:"M11 2l-3 6-6 .75 4.13 4.62-1.13 6.63 6-3 6 3-1.12-6.63 4.12-4.62-6-.75-3-6zm0 2.24l2.34 4.69 4.65.58-3.18 3.56.87 5.15-4.68-2.34v-11.64zm3.681-3.54h2.592c1.449 0 2.232.648 2.232 1.823 0 1.071-.819 1.782-2.102 1.827l2.075 2.651h-1.26l-2.007-2.651h-.513v2.651h-1.017v-6.3zm2.565.954h-1.548v1.773h1.548c.819 0 1.202-.297 1.202-.905 0-.599-.405-.869-1.202-.869z"})),save:function(){return null},title:"Latest Reviews"})}(window.wp.blocks,window.wp.components,window.wp.editor,window.wp.element),function(e,t,i,n,s){"use strict";var o=window.wp.i18n.__,l=n.createElement,a=i.InspectorControls,r=t.PanelBody,c=t.ServerSideRender,u=t.TextControl,p=t.ToggleControl,v=t.RangeControl,h=t.SelectControl,w={label:"- "+o("Select","site-reviews")+" -",value:""},d=[];wp.apiFetch({path:"/site-reviews/v1/categories"}).then(function(e){d.push(w),$.each(e,function(e,t){d.push({label:t.name,value:t.id})})});var g=[];wp.apiFetch({path:"/site-reviews/v1/types"}).then(function(e){e.length<2||(g.push(w),$.each(e,function(e,t){g.push({label:t.name,value:t.slug})}))});var m=function(e,o,t,a){return l("div",{className:"components-base-control__field"},l("input",{checked:-1<a.attributes.hide.split(",").indexOf(o),className:"components-checkbox-control__input",id:"inspector-checkbox-control-hide-"+e,type:"checkbox",value:1,onChange:function(e){var t,i,n,s;t=o,i=e.target.checked,n=a,s=_.without(n.attributes.hide.split(","),""),i?s.push(t):s=_.without(s,t),n.setAttributes({hide:s.toString()})}}),l("label",{className:"components-checkbox-control__label",htmlFor:"inspector-checkbox-control-hide-"+e},t))};e.registerBlockType(GLSR.nameprefix+"/summary",{attributes:{assigned_to:{default:"",type:"string"},category:{default:"",type:"string"},className:{default:"",type:"string"},hide:{default:"",type:"string"},post_id:{default:"",type:"string"},rating:{default:1,type:"number"},schema:{default:!1,type:"boolean"},type:{default:"",type:"string"}},category:GLSR.nameprefix,description:o("Display a summary of your reviews.","site-reviews"),edit:function(t){return t.attributes.post_id=$("#post_ID").val(),[l(a,{key:"inspector"},l(r,{title:o("Settings","site-reviews")},l(u,{help:o('Limit reviews to those assigned to this post ID. You can also enter "post_id" to use the ID of the current page, or "parent_id" to use the ID of the parent page.',"site-reviews"),label:o("Assigned To","site-reviews"),onChange:function(e){t.setAttributes({assigned_to:e})},type:"text",value:t.attributes.assigned_to}),l(h,{help:o("Limit reviews to a specific category.","site-reviews"),label:o("Category","site-reviews"),onChange:function(e){t.setAttributes({category:e})},options:d,value:t.attributes.category}),l(h,{help:o("Limit reviews to a specific type.","site-reviews"),label:o("Type","site-reviews"),onChange:function(e){t.setAttributes({type:e})},options:g,value:t.attributes.type}),l(v,{help:o("Limit reviews to a minimum rating.","site-reviews"),label:o("Minimum Rating","site-reviews"),onChange:function(e){t.setAttributes({rating:e})},min:0,max:5,value:t.attributes.rating}),l(p,{help:o("The schema should only be enabled once per page.","site-reviews"),label:o("Enable the schema?","site-reviews"),checked:t.attributes.schema,onChange:function(e){t.setAttributes({schema:e})}}),function(e,t){var i=0,n=["div",{className:"components-base-control"}];for(var s in e)e.hasOwnProperty(s)&&(n.push(m(i,s,e[s],t)),i++);return l.apply(null,n)}.apply(null,[GLSR.hideoptions.site_reviews_summary,t]))),l(c,{block:GLSR.nameprefix+"/summary",attributes:t.attributes})]},icon:l(t.SVG,{width:"22px",height:"22px",viewBox:"0 0 22 22",xmlns:"http://www.w3.org/2000/svg"},l(t.Path,{d:"M11 2l-3 6-6 .75 4.13 4.62-1.13 6.63 6-3 6 3-1.12-6.63 4.12-4.62-6-.75-3-6zm0 2.24l2.34 4.69 4.65.58-3.18 3.56.87 5.15-4.68-2.34v-11.64zm8.415-2.969l-.518.824c-.536-.342-1.13-.54-1.769-.54-.842 0-1.418.365-1.418.941 0 .522.491.725 1.31.842l.437.059c1.022.14 2.03.563 2.03 1.733 0 1.283-1.161 1.985-2.525 1.985-.855 0-1.881-.284-2.534-.846l.554-.81c.432.396 1.247.693 1.976.693.824 0 1.472-.351 1.472-.932 0-.495-.495-.725-1.418-.851l-.491-.068c-.936-.131-1.868-.572-1.868-1.742 0-1.265 1.121-1.967 2.484-1.967.918 0 1.643.257 2.277.68z"})),save:function(){return null},title:"Summary"})}(window.wp.blocks,window.wp.components,window.wp.editor,window.wp.element);
|
assets/scripts/site-reviews.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(i,e,t){"use strict";var h="star-rating",s=function(t,i){this.selects="[object String]"==={}.toString.call(t)?e.querySelectorAll(t):[t],this.destroy=function(){this.widgets.forEach(function(t){t.t()})},this.rebuild=function(){this.widgets.forEach(function(t){t.i()})},this.widgets=[];for(var s=0;s<this.selects.length;s++)if("SELECT"===this.selects[s].tagName&&!this.selects[s][h]){var n=new o(this.selects[s],i);void 0!==n.direction&&this.widgets.push(n)}},o=function(t,i){this.el=t,this.s=this.n({},this.e,i||{},JSON.parse(t.getAttribute("data-options"))),this.h(),this.stars<1||this.stars>this.s.maxStars||this.o()};o.prototype={e:{classname:"gl-star-rating",clearable:!0,initialText:"Select a Rating",maxStars:10,showText:!0},o:function(){this.r(),this.current=this.selected=this.a(),this.u(),this.c(),this.f(),this.d(this.current),this.l("add"),this.el[h]=!0},v:function(){this.s.showText&&(this.textEl=this.m(this.widgetEl,{class:this.s.classname+"-text"},!0))},c:function(){var t=this._(),i=this.m(this.el,{class:this.s.classname+"-stars"},!0);for(var s in t){var n=this.p({"data-value":s,"data-text":t[s]});i.innerHTML+=n.outerHTML}this.widgetEl=i,this.v()},w:function(t){(t<0||isNaN(t))&&(t=0),t>this.stars&&(t=this.stars),this.widgetEl.classList.remove("s"+10*this.current),this.widgetEl.classList.add("s"+10*t),this.s.showText&&(this.textEl.textContent=t<1?this.s.initialText:this.widgetEl.childNodes[t-1].dataset.text),this.current=t},p:function(t){var i=e.createElement("span");for(var s in t=t||{})i.setAttribute(s,t[s]);return i},t:function(){this.l("remove");var t=this.el.parentNode;t.parentNode.replaceChild(this.el,t),delete this.el[h]},g:function(i,s,t){t.forEach(function(t){i[s+"EventListener"](t,this.events[t])}.bind(this))},n:function(){var t=[].slice.call(arguments),s=t[0],n=t.slice(1);return Object.keys(n).forEach(function(t){for(var i in n[t])n[t].hasOwnProperty(i)&&(s[i]=n[t][i])}),s},S:function(t){var i={},s=t.pageX||t.changedTouches[0].pageX,n=this.widgetEl.offsetWidth;return i.ltr=Math.max(s-this.offsetLeft,1),i.rtl=n-i.ltr,Math.min(Math.ceil(i[this.direction]/Math.round(n/this.stars)),this.stars)},_:function(){for(var t=this.el,i={},s={},n=0;n<t.length;n++)this.b(t[n])||(i[t[n].value]=t[n].text);return Object.keys(i).sort().forEach(function(t){s[t]=i[t]}),s},a:function(){return parseInt(this.el.options[Math.max(this.el.selectedIndex,0)].value)||0},l:function(t){var i=this.el.closest("form");i&&"FORM"===i.tagName&&this.g(i,t,["reset"]),this.g(this.el,t,["change","keydown"]),this.g(this.widgetEl,t,["mousedown","mouseleave","mousemove","mouseover","touchend","touchmove","touchstart"])},r:function(){this.events={change:this.L.bind(this),keydown:this.R.bind(this),mousedown:this.x.bind(this),mouseleave:this.G.bind(this),mousemove:this.T.bind(this),mouseover:this.F.bind(this),reset:this.j.bind(this),touchend:this.x.bind(this),touchmove:this.T.bind(this),touchstart:this.F.bind(this)}},m:function(t,i,s){var n=this.p(i);return t.parentNode.insertBefore(n,!0===s?t.nextSibling:t),n},b:function(t){return null===t.getAttribute("value")||""===t.value},L:function(){this.w(this.a())},R:function(t){if(~["ArrowLeft","ArrowRight"].indexOf(t.key)){var i="ArrowLeft"===t.key?-1:1;"rtl"===this.direction&&(i*=-1),this.d(Math.min(Math.max(this.a()+i,0),this.stars)),this.M()}},x:function(t){t.preventDefault();var i=this.S(t);if(0!==this.current&&parseFloat(this.selected)===i&&this.s.clearable)return this.j(),void this.M();this.d(i),this.M()},G:function(t){t.preventDefault(),this.w(this.selected)},T:function(t){t.preventDefault(),this.w(this.S(t))},F:function(t){t.preventDefault();var i=this.widgetEl.getBoundingClientRect();this.offsetLeft=i.left+e.body.scrollLeft},j:function(){var t=this.el.querySelector("[selected]"),i=t?t.value:"";this.el.value=i,this.selected=parseInt(i)||0,this.w(i)},i:function(){this.el.parentNode.classList.contains(this.s.classname)&&this.t(),this.o()},f:function(){var t=this.el.parentNode;this.direction=i.getComputedStyle(t,null).getPropertyValue("direction"),t.classList.add(this.s.classname+"-"+this.direction)},d:function(t){this.el.value=this.selected=t,this.w(t)},h:function(){for(var t=this.el,i=this.stars=0;i<t.length;i++)if(!this.b(t[i])){if(isNaN(parseFloat(t[i].value))||!isFinite(t[i].value))return void(this.stars=0);this.stars++}},M:function(){this.el.dispatchEvent(new Event("change"))},u:function(){this.m(this.el,{class:this.s.classname,"data-star-rating":""}).appendChild(this.el)}},"function"==typeof define&&define.amd?define([],function(){return s}):"object"==typeof module&&module.exports?module.exports=s:i.StarRating=s}(window,document),function(){"use strict";GLSR.Ajax=function(){},GLSR.Ajax.prototype={get:function(t,i,s){this.k(i),this.xhr.open("GET",t,!0),this.xhr.responseType="text",this.y(s),this.xhr.send()},C:function(t){return"json"===this.xhr.responseType?t({message:this.xhr.statusText},!1):"text"===this.xhr.responseType?t(this.xhr.statusText):void console.log(this.xhr)},O:function(t){if(0===this.xhr.status||200<=this.xhr.status&&this.xhr.status<300||304===this.xhr.status){if("json"===this.xhr.responseType)return t(this.xhr.response.data,this.xhr.response.success);if("text"===this.xhr.responseType)return t(this.xhr.responseText);console.log(this.xhr)}else this.C(t)},isFileSupported:function(){var t=document.createElement("INPUT");return t.type="file","files"in t},isFormDataSupported:function(){return!!window.FormData},isUploadSupported:function(){var t=new XMLHttpRequest;return!!(t&&"upload"in t&&"onprogress"in t.upload)},post:function(t,i,s){this.k(i),this.xhr.open("POST",GLSR.ajaxurl,!0),this.xhr.responseType="json",this.y(s),this.xhr.send(this.D(t))},k:function(t){this.xhr=new XMLHttpRequest,this.xhr.onload=this.O.bind(this,t),this.xhr.onerror=this.C.bind(this,t)},I:function(i,s,n){return"object"!=typeof s||s instanceof Date||s instanceof File?i.append(n,s||""):Object.keys(s).forEach(function(t){s.hasOwnProperty(t)&&(i=this.I(i,s[t],n?n[t]:t))}.bind(this)),i},D:function(t){var i=t;return"[object HTMLFormElement]"===Object.prototype.toString.call(t)&&(i=new FormData(t)),"[object FormData]"!==Object.prototype.toString.call(i)&&(i=new FormData),i.append("action",GLSR.action),i.append("_ajax_request",!0),i},y:function(t){for(var i in(t=t||{})["X-Requested-With"]="XMLHttpRequest",t)t.hasOwnProperty(i)&&this.xhr.setRequestHeader(i,t[i])}}}(),function(){"use strict";GLSR.Excerpts=function(t){this.o(t||document)},GLSR.Excerpts.prototype={config:{hiddenClass:"glsr-hidden",hiddenTextSelector:".glsr-hidden-text",readMoreClass:"glsr-read-more",visibleClass:"glsr-visible"},N:function(t){var i=document.createElement("span"),s=document.createElement("a");s.setAttribute("href","#"),s.setAttribute("data-text",t.getAttribute("data-show-less")),s.innerHTML=t.getAttribute("data-show-more"),s.addEventListener("click",this.P.bind(this)),i.setAttribute("class",this.config.readMoreClass),i.appendChild(s),t.parentNode.insertBefore(i,t.nextSibling)},P:function(t){t.preventDefault();var i=t.currentTarget,s=i.parentNode.previousSibling,n=i.getAttribute("data-text");s.classList.toggle(this.config.hiddenClass),s.classList.toggle(this.config.visibleClass),i.setAttribute("data-text",i.innerText),i.innerText=n},o:function(t){for(var i=t.querySelectorAll(this.config.hiddenTextSelector),s=0;s<i.length;s++)this.N(i[s])}}}(),function(){"use strict";var e=function(t,i){this.button=i,this.config=GLSR.validationconfig,this.form=t,this.recaptcha=new GLSR.Recaptcha(this),this.strings=GLSR.validationstrings,this.useAjax=this.q(),this.validation=new GLSR.Validation(t)};e.prototype={V:function(t,i,s){t.classList[s?"add":"remove"](i)},A:function(){this.button.setAttribute("disabled","")},H:function(){this.button.removeAttribute("disabled")},B:function(t,i){var s=!0===i;"unset"!==t.recaptcha?("reset"===t.recaptcha&&this.recaptcha.U(),s&&(this.recaptcha.U(),this.form.reset()),this.W(t.errors),this.X(t.message,s),this.H(),t.form=this.form,document.dispatchEvent(new CustomEvent("site-reviews/after/submission",{detail:t})),s&&""!==t.redirect&&(window.location=t.redirect)):this.recaptcha.Y()},o:function(){this.form.addEventListener("submit",this.z.bind(this)),this.J(),this.recaptcha.K()},J:function(){new StarRating("select.glsr-star-rating",{clearable:!1,showText:!1})},q:function(){var i=new GLSR.Ajax,s=!0;return[].forEach.call(this.form.elements,function(t){"file"===t.type&&(s=i.isFileSupported()&&i.isUploadSupported())}),s&&!this.form.classList.contains("no-ajax")},z:function(t){if(!this.validation.$())return t.preventDefault(),void this.X(this.strings.errors,!1);this.Q(),(this.form["g-recaptcha-response"]&&""===this.form["g-recaptcha-response"].value||this.useAjax)&&(t.preventDefault(),this.Z())},Q:function(){this.X("",!0),this.validation.U()},W:function(t){if(t)for(var i in t)if(t.hasOwnProperty(i)){var s=GLSR.nameprefix?GLSR.nameprefix+"["+i+"]":i,n=this.form.querySelector('[name="'+s+'"]');this.validation.tt(n,t[i]),this.validation.it(n.validation,"add")}},X:function(t,i){var s=this.form.querySelector("."+this.config.message_tag_class);null===s&&((s=document.createElement(this.config.message_tag)).className=this.config.message_tag_class,this.button.parentNode.insertBefore(s,this.button.nextSibling)),this.V(s,this.config.message_error_class,!i),this.V(s,this.config.message_success_class,i),s.classList.remove(this.config.message_initial_class),s.innerHTML=t},Z:function(t){(new GLSR.Ajax).isFormDataSupported()?(this.A(),this.form[GLSR.nameprefix+"[_counter]"].value=t||0,(new GLSR.Ajax).post(this.form,this.B.bind(this))):this.X(this.strings.unsupported,!1)}},GLSR.Forms=function(t){var i,s;this.nodeList=document.querySelectorAll("form.glsr-form"),this.forms=[];for(var n=0;n<this.nodeList.length;n++)(s=this.nodeList[n].querySelector("[type=submit]"))&&(i=new e(this.nodeList[n],s),t&&i.o(),this.forms.push(i))}}(),function(){"use strict";var i=function(t){this.el=t,this.r()};i.prototype={config:{hideClass:"glsr-hide",linkSelector:".glsr-navigation a",scrollTime:468},st:function(t){for(var i=0;t=t.previousSibling;)1===t.nodeType&&i++;return i},nt:function(t){if(t.nodeName)return this.et(this.ht(t))},et:function(t){if(""!==t.id)return"#"+t.id;var i="";return t.parent&&(i=this.et(t.parent)+" > "),i+t.name+":nth-child("+(t.index+1)+")"},ht:function(t){var i={id:t.id,index:this.st(t),name:t.nodeName.toLowerCase(),parent:null};return t.parentElement&&t.parentElement!==document.body&&(i.parent=this.ht(t.parentElement)),i},ot:function(t){return t.className?"."+t.className.trim().replace(/\s+/g,"."):""},rt:function(t){return t.id?"#"+t.id.trim():""},B:function(t,i,s){var n=document.implementation.createHTMLDocument("x");n.documentElement.innerHTML=s;var e=i?n.querySelectorAll(i):"";if(1===e.length)return this.el.innerHTML=e[0].innerHTML,this.at(this.el),this.el.classList.remove(this.config.hideClass),this.r(),window.history.pushState(null,"",t),void new GLSR.Excerpts(this.el);window.location=t},r:function(){for(var t=this.el.querySelectorAll(this.config.linkSelector),i=0;i<t.length;i++)t[i].addEventListener("click",this.P.bind(this))},P:function(t){t.preventDefault();var i=this.nt(this.el);this.el.classList.add(this.config.hideClass),(new GLSR.Ajax).get(t.currentTarget.href,this.B.bind(this,t.currentTarget.href,i))},at:function(t,i){var s;i=i||16;for(var n=0;n<GLSR.ajaxpagination.length;n++)(s=document.querySelector(GLSR.ajaxpagination[n]))&&"fixed"===window.getComputedStyle(s).getPropertyValue("position")&&(i+=s.clientHeight);var e=t.getBoundingClientRect().top-i;0<e||this.ut({endY:e,offset:window.pageYOffset,startTime:window.performance.now(),startY:t.scrollTop})},ut:function(t){var i=(window.performance.now()-t.startTime)/this.config.scrollTime;i=1<i?1:i;var s=.5*(1-Math.cos(Math.PI*i)),n=t.startY+(t.endY-t.startY)*s;window.scroll(0,t.offset+n),n!==t.endY&&window.requestAnimationFrame(this.ut.bind(this,t))}},GLSR.Pagination=function(){this.navs=[];var t=document.querySelectorAll(".glsr-ajax-pagination");t.length&&t.forEach(function(t){this.navs.push(new i(t))}.bind(this))}}(),function(){"use strict";GLSR.Recaptcha=function(t){this.Form=t,this.counter=0,this.id=-1,this.is_submitting=!1,this.observer=new MutationObserver(function(t){var i=t.pop();i.target&&"visible"!==i.target.style.visibility&&(this.observer.disconnect(),setTimeout(function(){this.is_submitting||this.Form.H()}.bind(this),250))}.bind(this))},GLSR.Recaptcha.prototype={Y:function(){if(-1!==this.id)return this.counter=0,this.ct(this.id),void grecaptcha.execute(this.id);setTimeout(function(){this.counter++,this.Z.call(this.Form,this.counter)}.bind(this),1e3)},ct:function(t){var i=window.___grecaptcha_cfg.clients[t];for(var s in i)if(i.hasOwnProperty(s)&&"[object String]"===Object.prototype.toString.call(i[s])){var n=document.querySelector("iframe[name=c-"+i[s]+"]");if(n){this.observer.observe(n.parentElement.parentElement,{attributeFilter:["style"],attributes:!0});break}}},K:function(){this.Form.form.onsubmit=null;var t=this.Form.form.querySelector(".glsr-recaptcha-holder");t&&(t.innerHTML="",this.ft(t))},ft:function(t){setTimeout(function(){if("undefined"==typeof grecaptcha||void 0===grecaptcha.render)return this.ft(t);this.id=grecaptcha.render(t,{callback:this.Z.bind(this.Form,this.counter),"expired-callback":this.U.bind(this),isolated:!0},!0)}.bind(this),250)},U:function(){this.counter=0,this.is_submitting=!1,-1!==this.id&&grecaptcha.reset(this.id)},Z:function(t){if(this.recaptcha.is_submitting=!0,!this.useAjax)return this.A(),void this.form.submit();this.Z(t)}}}(),function(){"use strict";function s(t){var i='input[name="'+t.getAttribute("name")+'"]:checked';return t.validation.form.querySelectorAll(i).length}var h={email:{fn:function(t){return!t||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}},max:{fn:function(t,i){return!t||("checkbox"===this.type?s(this)<=parseInt(i):parseFloat(t)<=parseFloat(i))}},maxlength:{fn:function(t,i){return!t||t.length<=parseInt(i)}},min:{fn:function(t,i){return!t||("checkbox"===this.type?s(this)>=parseInt(i):parseFloat(t)>=parseFloat(i))}},minlength:{fn:function(t,i){return!t||t.length>=parseInt(i)}},number:{fn:function(t){return!t||!isNaN(parseFloat(t))},priority:2},required:{fn:function(t){return"radio"===this.type||"checkbox"===this.type?s(this):void 0!==t&&""!==t},priority:99,halt:!0}};GLSR.Validation=function(t){this.config=GLSR.validationconfig,this.form=t,this.form.setAttribute("novalidate",""),this.strings=GLSR.validationstrings,this.o()},GLSR.Validation.prototype={dt:["required","max","maxlength","min","minlength","pattern"],lt:"input:not([type^=hidden]):not([type^=submit]), select, textarea",vt:function(t){var i=~["radio","checkbox"].indexOf(t.getAttribute("type"))||"SELECT"===t.nodeName?"change":"input";t.addEventListener(i,function(t){this.$(t.target)}.bind(this))},mt:function(t,i,s){[].forEach.call(t,function(t){~this.dt.indexOf(t.name)?this._t(i,s,t.name,t.value):"type"===t.name&&this._t(i,s,t.value)}.bind(this))},_t:function(t,i,s,n){if(h[s]&&(h[s].name=s,t.push(h[s]),n)){var e=n.split(",");e.unshift(null),i[s]=e}},U:function(){for(var t in this.fields)this.fields.hasOwnProperty(t)&&(this.fields[t].errorElements=null,this.fields[t].input.classList.remove(this.config.input_error_class));[].map.call(this.form.querySelectorAll("."+this.config.error_tag_class),function(t){t.parentNode.classList.remove(this.config.field_error_class),t.parentNode.removeChild(t)}.bind(this))},n:function(){var t=[].slice.call(arguments),s=t[0],n=t.slice(1);return Object.keys(n).forEach(function(t){for(var i in n[t])n[t].hasOwnProperty(i)&&(s[i]=n[t][i])}),s},pt:function(t){if(t.errorElements)return t.errorElements;var i,s=t.input.closest("."+this.config.field_class);return s&&null===(i=s.closest("."+this.config.error_tag_class))&&((i=document.createElement(this.config.error_tag)).className=this.config.error_tag_class,s.appendChild(i)),t.errorElements=[s,i]},o:function(){this.fields=[].map.call(this.form.querySelectorAll(this.lt),function(t){return this.wt(t)}.bind(this))},wt:function(t){var i={},s=[];return this.mt(t.attributes,s,i),this.gt(s),this.vt(t),t.validation={form:this.form,input:t,params:i,validators:s}},it:function(t,i){var s=this.pt(t),n="add"===i;t.input.classList[i](this.config.input_error_class),s[0]&&s[0].classList[i](this.config.field_error_class),s[1]&&(s[1].innerHTML=n?t.errors.join("<br>"):"",s[1].style.display=n?"":"none")},tt:function(t,i){t.validation||this.wt(t),t.validation.errors=i},gt:function(t){t.sort(function(t,i){return(i.priority||1)-(t.priority||1)})},$:function(t){var i=!0,s=this.fields;for(var n in t instanceof HTMLElement&&(s=[t.validation]),s)if(s.hasOwnProperty(n)){var e=s[n];this.St(e)?this.it(e,"remove"):(i=!1,this.it(e,"add"))}return i},St:function(t){var i=[],s=!0;for(var n in t.validators)if(t.validators.hasOwnProperty(n)){var e=t.validators[n],h=t.params[e.name]?t.params[e.name]:[];if(h[0]=t.input.value,!e.fn.apply(t.input,h)){s=!1;var o=this.strings[e.name];if(i.push(o.replace(/(\%s)/g,h[1])),!0===e.halt)break}}return t.errors=i,s}}}(),document.addEventListener("DOMContentLoaded",function(){for(var t=document.querySelectorAll(".glsr-widget, .glsr-shortcode"),i=0;i<t.length;i++){var s=window.getComputedStyle(t[i],null).getPropertyValue("direction");t[i].classList.add("glsr-"+s)}document.all&&!window.atob||(new GLSR.Forms(!0),new GLSR.Pagination,new GLSR.Excerpts)});
|
assets/styles/custom/bootstrap_4.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-has-error .invalid-feedback{display:block}
|
assets/styles/custom/bootstrap_4_custom.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-has-error .invalid-feedback{display:block}
|
assets/styles/custom/contact_form_7.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}
|
assets/styles/custom/materialize.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}form.glsr-form textarea.materialize-textarea{padding:.5rem 0}form.glsr-form .glsr-form-message:not(.glsr-has-errors){display:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline-block;height:auto}
|
assets/styles/custom/minimal.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-field{margin-bottom:1em}
|
assets/styles/custom/twentyfifteen.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-field{margin-bottom:1em}.glsr-field-error{font-size:14px;color:#d32f2f}.glsr-field-choice .glsr-field-control{position:relative;top:-2px;margin-right:6px}.glsr-field-choice input{outline:none}.glsr-required label span:after{content:"\002a";color:#d32f2f}.glsr-form-messages{color:#388e3c}.glsr-has-errors{color:#d32f2f}
|
assets/styles/custom/twentynineteen.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.gl-star-rating[data-star-rating]{position:relative;display:block}.gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}.gl-star-rating[data-star-rating]>select:after,.gl-star-rating[data-star-rating]>select:before{display:none!important}.gl-star-rating-ltr[data-star-rating]>select{left:0}.gl-star-rating-rtl[data-star-rating]>select{right:0}.gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}.gl-star-rating-stars{position:relative;display:inline-block;height:34px;vertical-align:middle;cursor:pointer}.gl-star-rating-stars>span{display:inline-block;width:32px;height:32px;background-size:32px;background-repeat:no-repeat;background-image:url(../img/star-empty.svg);margin:0 5.33333px 0 0}.gl-star-rating-stars>span:last-of-type{margin-right:0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 5.33333px}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}.gl-star-rating-text{display:inline-block;position:relative;height:34px;line-height:34px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 16px 0 8px;margin:0 0 0 16px}.gl-star-rating-text:before{position:absolute;top:0;left:-16px;width:0;height:0;content:"";border-style:solid;border-width:17px 16px 17px 0;border-color:transparent #1a1a1a transparent transparent}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 8px 0 16px;margin:0 16px 0 0}.gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-16px;border-width:17px 0 17px 16px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:2.66667em}.glsr-default .glsr-review>div{margin-bottom:.88889em}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 .88889em}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:.71111em;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:1.125em;height:1.125em;font-size:inherit;background-size:1.125em}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:.71111em;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:.35556em}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:inherit}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:.71111em;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:1.125em;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:1.125em;height:1.125em;background-size:1.125em}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-default .glsr-review>div,.glsr-default .glsr-review p{margin-bottom:20px}.glsr-default .glsr-review-title h3{font-size:1.125em}.glsr-default .glsr-field-error,.glsr-default .glsr-review-author,.glsr-default .glsr-review-date{font-size:.71111em}.glsr-default .glsr-review-author,.glsr-default .glsr-review-date{color:#767676;font-weight:500}.glsr-default .glsr-review-rating,.glsr-default .glsr-stars{height:1.13778em;vertical-align:middle}.glsr-default .glsr-review-date{font-style:normal;line-height:1.6;vertical-align:middle}.glsr-default .glsr-review-author,.glsr-default .glsr-review-date,.glsr-default .glsr-review-response strong{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.glsr-default .glsr-review-response p,.glsr-default .glsr-review-response p:last-of-type{font-size:.88889em;line-height:1.6}.glsr-default.glsr-summary{font-size:1em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.glsr-default .glsr-summary-stars{line-height:1.25;font-size:1.125em}.glsr-default .glsr-summary-text{font-size:.71111em}form.glsr-form .glsr-field{line-height:1.6}form.glsr-form label:not(.glsr-checkbox-label){display:inline;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.71111em;color:#767676}form.glsr-form .glsr-field-choice{position:relative;display:block}form.glsr-form .glsr-field-choice input{position:absolute;height:1.42222em;box-sizing:border-box;padding:0}form.glsr-form .glsr-field-choice label{display:inline-block;font-size:.88889em;margin:0}form.glsr-form .glsr-required label span:after{content:"\002a"}form.glsr-form .glsr-form-messages{color:#388e3c}form.glsr-form .glsr-form-messages p{margin-top:.88889em}form.glsr-form .glsr-field-error{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.71111em}form.glsr-form .glsr-field-error,form.glsr-form .glsr-has-errors{color:#d32f2f}form.glsr-form input:not([type=checkbox]):not([type=radio]),form.glsr-form textarea{padding-bottom:.18rem}form.glsr-form input:not([type=checkbox]):not([type=radio]).glsr-is-invalid,form.glsr-form textarea.glsr-is-invalid{border-color:#d32f2f}form.glsr-form .gl-star-rating[data-star-rating]{line-height:1}.glsr-ltr form.glsr-form .glsr-field input[type=checkbox],.glsr-ltr form.glsr-form .glsr-field input[type=radio]{left:0}.glsr-ltr form.glsr-form .glsr-field-choice{padding-left:1.25rem}.glsr-rtl form.glsr-form .glsr-field input[type=checkbox],.glsr-rtl form.glsr-form .glsr-field input[type=radio]{right:0}.glsr-rtl form.glsr-form .glsr-field-choice{padding-right:1.25rem}
|
assets/styles/custom/twentyseventeen.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}form.glsr-form{font-size:16px;line-height:1.5}form.glsr-form .glsr-field-choice{position:relative;display:block;padding-left:1.25rem}form.glsr-form .glsr-field-choice input{box-sizing:border-box;padding:0;position:absolute;margin-top:.3rem;margin-left:-1.25rem}form.glsr-form .glsr-field-choice label{display:inline-block;margin:0}form.glsr-form input.glsr-field-control,form.glsr-form textarea.glsr-field-control{line-height:1.5;font-size:1rem;background-color:#fff;min-height:calc(2.25rem + 2px);background-clip:padding-box;border:1px solid #bdbdbd;border-radius:.15rem;transition:border-color .15s ease-in-out;padding:.375rem .5rem}form.glsr-form input.glsr-field-control:focus,form.glsr-form textarea.glsr-field-control:focus{background-color:#fff;border-color:#9e9e9e;outline:0}form.glsr-form .glsr-required label span:after{content:"\002a";color:#d32f2f}form.glsr-form .glsr-field{margin-bottom:16px}form.glsr-form .glsr-field-error{font-size:14px;color:#d32f2f}form.glsr-form .glsr-form-messages{color:#388e3c}form.glsr-form .glsr-form-messages p{margin-top:16px}form.glsr-form .glsr-has-errors{color:#d32f2f}form.glsr-form input:not([type=checkbox]):not([type=radio]).glsr-is-invalid,form.glsr-form textarea.glsr-is-invalid{border-color:#d32f2f}form.glsr-form .glsr-field-choice input{outline:none}.glsr-ltr form.glsr-form .glsr-field input[type=checkbox],.glsr-ltr form.glsr-form .glsr-field input[type=radio]{margin-right:.5em}.glsr-rtl form.glsr-form .glsr-field input[type=checkbox],.glsr-rtl form.glsr-form .glsr-field input[type=radio]{margin-left:.5em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}.glsr-loader{bottom:7em}@media screen and (min-width:48em){.glsr-loader{bottom:7.5em}}
|
assets/styles/custom/twentysixteen.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] span{display:none}form.glsr-form [type=submit][disabled] span{display:inline;position:relative}form.glsr-form [type=submit] span:after,form.glsr-form [type=submit] span:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] span:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] span:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] span{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] span:after,.glsr-ltr form.glsr-form [type=submit] span:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] span{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] span:after,.glsr-rtl form.glsr-form [type=submit] span:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default .glsr-review-avatar img{display:block}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .star{display:inline-block;width:20px;height:20px;font-size:16px;vertical-align:sub;background-repeat:no-repeat;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}form.glsr-form{font-size:16px;line-height:1.5}form.glsr-form .glsr-field-choice{position:relative;display:block;padding-left:1.25rem}form.glsr-form .glsr-field-choice input{box-sizing:border-box;padding:0;position:absolute;margin-top:.3rem;margin-left:-1.25rem}form.glsr-form .glsr-field-choice label{display:inline-block;margin:0}form.glsr-form :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}form.glsr-form input.glsr-field-control,form.glsr-form textarea.glsr-field-control{line-height:1.5;font-size:1rem;background-color:#fff;min-height:calc(2.25rem + 2px);background-clip:padding-box;border:1px solid #bdbdbd;border-radius:.15rem;transition:border-color .15s ease-in-out;padding:.375rem .5rem}form.glsr-form input.glsr-field-control:focus,form.glsr-form textarea.glsr-field-control:focus{background-color:#fff;border-color:#9e9e9e;outline:0}form.glsr-form .glsr-required label span:after{content:"\002a";color:#d32f2f}form.glsr-form .glsr-field{margin-bottom:16px}form.glsr-form .glsr-field-error{font-size:14px;color:#d32f2f}form.glsr-form .glsr-form-messages{color:#388e3c}form.glsr-form .glsr-form-messages p{margin-top:16px}form.glsr-form .glsr-has-errors{color:#d32f2f}form.glsr-form input:not([type=checkbox]):not([type=radio]).glsr-is-invalid,form.glsr-form textarea.glsr-is-invalid{border-color:#d32f2f}form.glsr-form .glsr-field-choice input{outline:none}.glsr-ltr form.glsr-form .glsr-field input[type=checkbox],.glsr-ltr form.glsr-form .glsr-field input[type=radio]{margin-right:.5em}.glsr-rtl form.glsr-form .glsr-field input[type=checkbox],.glsr-rtl form.glsr-form .glsr-field input[type=radio]{margin-left:.5em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .star{transform:scaleX(-1)}
|
assets/styles/inline-styles.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.gl-star-rating-stars>span,.glsr-star-empty{background-image:url(:star-empty)!important}.glsr-has-error .gl-star-rating-stars>span{background-image:url(:star-error)!important}.glsr-star-half{background-image:url(:star-half)!important}.gl-star-rating-stars.s10>span:first-child,.gl-star-rating-stars.s20>span:nth-child(-1n+2),.gl-star-rating-stars.s30>span:nth-child(-1n+3),.gl-star-rating-stars.s40>span:nth-child(-1n+4),.gl-star-rating-stars.s50>span:nth-child(-1n+5),.gl-star-rating-stars.s60>span:nth-child(-1n+6),.gl-star-rating-stars.s70>span:nth-child(-1n+7),.gl-star-rating-stars.s80>span:nth-child(-1n+8),.gl-star-rating-stars.s90>span:nth-child(-1n+9),.gl-star-rating-stars.s100>span,.glsr-star-full{background-image:url(:star-full)!important}
|
assets/styles/site-reviews-admin.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.glsr-addons{margin:-20px 0 0 -20px}.glsr-addon-wrap{float:left;position:relative;width:100%;box-sizing:border-box;padding:20px 0 0 20px}@media only screen and (min-width:480px){.glsr-addon-wrap{width:50%}}@media only screen and (min-width:782px){.glsr-addon-wrap{width:33.33%}}@media only screen and (min-width:1400px){.glsr-addon-wrap{width:25%}}.glsr-addon{border:1px solid #ddd;box-shadow:0 1px 1px -1px rgba(0,0,0,.1)}.glsr-addon-description{background-color:#fff;padding:1em 15px}.glsr-addon-description p{height:78px;overflow:hidden;text-overflow:ellipsis;margin:0}.glsr-addon-name{font-size:15px;margin-top:0;text-overflow:ellipsis;white-space:nowrap}.glsr-addon-footer{height:48px;background:hsla(0,0%,100%,.65);box-shadow:inset 0 1px 0 rgba(0,0,0,.1);box-sizing:border-box;padding:15px;margin:0;overflow:hidden}.glsr-addon-screenshot{display:block;background-position:50%;background-repeat:no-repeat;background-size:cover;border-bottom:1px solid #ddd;padding-top:56.25%}.glsr-addon-screenshot[data-slug=tripadvisor]{background-color:#4b7e37;background-image:url(../images/addon-tripadvisor.svg)}.glsr-addon-screenshot[data-slug=images]{background-image:url(../images/addon-images.svg);background-color:#4526a0}.glsr-addon-link{position:absolute;right:15px;bottom:10px}@media screen and (max-width:782px){.glsr-addon-link{bottom:5px}}.glsr-addon-link.glsr-external:after{display:inline-block;content:"\00a0\f504";font-family:dashicons;font-size:16px;vertical-align:sub;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:782px){.glsr-addon-link.glsr-external:after{height:16px;width:16px;font-size:18px;text-indent:0}}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.glsr-button{position:relative;white-space:nowrap}.glsr-button:after,.glsr-button:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}.glsr-button:before{border-top-color:transparent;opacity:.5}.glsr-button:after{border-color:transparent;border-top-color:currentColor}.glsr-button[disabled]{padding-left:calc(1em + 15px)}.glsr-button[disabled]:after,.glsr-button[disabled]:before{content:"";left:10px}.glsr-button[disabled] span{visibility:hidden;font-size:0}.glsr-button[disabled] span:after{visibility:visible;content:attr(data-loading);font-size:13px}#dashboard_right_now li>span.glsr-review-count:before,#dashboard_right_now li a.glsr-review-count:before{content:"\f459";line-height:.8em}#titlediv #title{margin-bottom:20px}#contentdiv textarea,#titlediv #title{border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);background-color:#fff}#contentdiv textarea,.post-type-site-review .wp-editor-area{display:block;width:100%;height:320px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:16px;line-height:1.5;padding:10px;resize:vertical;-webkit-font-smoothing:antialiased!important;overflow-wrap:break-word}body.branch-4 .misc-pub-pinned:before,body.branch-4-1 .misc-pub-pinned:before,body.branch-4-2 .misc-pub-pinned:before,body.branch-4-3 .misc-pub-pinned:before{display:none}body.branch-4 .misc-pub-pinned .pinned-icon,body.branch-4-1 .misc-pub-pinned .pinned-icon,body.branch-4-2 .misc-pub-pinned .pinned-icon,body.branch-4-3 .misc-pub-pinned .pinned-icon{position:relative;display:inline-block;width:20px;padding-right:2px}body.branch-4 .misc-pub-pinned .pinned-icon svg,body.branch-4-1 .misc-pub-pinned .pinned-icon svg,body.branch-4-2 .misc-pub-pinned .pinned-icon svg,body.branch-4-3 .misc-pub-pinned .pinned-icon svg{position:absolute;top:-13px;left:-1px;width:19px;height:18px;color:#888}.misc-pub-pinned:before{display:inline-block;position:relative;content:"\f537";font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;top:0;left:-1px;color:#82878c;padding:0 2px 0 0}.misc-pub-pinned .pinned-status-text{font-weight:600}.misc-pub-pinned .pinned-status-select{margin-top:3px}.glsr-response{display:block;height:6em;width:100%;margin:12px 0 0}.glsr-mce{position:relative;display:inline-block;margin-right:1px}.glsr-mce-menu.mce-menu{display:none;position:absolute;top:100%;left:0;min-width:100%;background:#fff;padding:5px 0;margin:-2px 0 0}.glsr-mce-menu-item.mce-menu-item{cursor:pointer;font-size:14px;white-space:nowrap;padding:6px 12px;margin-bottom:2px}.mce-glsr-mce-popup a{text-decoration:underline}.mce-glsr-mce-popup p{margin-bottom:1em}.mce-glsr-mce-popup p.strong{font-weight:600}.mce-glsr-mce-popup p.no-margin{margin-bottom:0}.mce-glsr-mce-popup p.margin-top{margin-top:1em}.mce-glsr-btn.mce-btn button{box-sizing:border-box;padding:0 8px}.wp-media-buttons button.glsr-mce-button{outline:none;padding-left:5px;margin-right:0}button.glsr-mce-button:after{display:inline-block;position:relative;top:-1px;left:-1px;width:0;height:0;content:"";border-top:6px solid #777;border-right:4px solid transparent;border-left:4px solid transparent}button.glsr-mce-button.active:after{top:-2px;border-top:0;border-bottom:6px solid #32373c}button.glsr-mce-button:active{margin-bottom:5px}button.glsr-mce-button .wp-media-buttons-icon:before{content:"\f459";font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:782px){button.glsr-mce-button .wp-media-buttons-icon:before{font-size:20px!important}}div.sc-wrap{margin-right:1px}body.branch-4 i.mce-i-checkbox,body.branch-4-1 i.mce-i-checkbox,body.branch-4-2 i.mce-i-checkbox{background-image:none}body.branch-4 .glsr-mce-menu .glsr-mce-menu-item:hover,body.branch-4-1 .glsr-mce-menu .glsr-mce-menu-item:hover,body.branch-4-2 .glsr-mce-menu .glsr-mce-menu-item:hover{background:#0073aa;color:#fff}#site-reviews_review.postbox .inside{padding:0;margin:0}.glsr-response-postbox{margin-top:20px;margin-bottom:0}.js .glsr-response-postbox .hndle{cursor:default}.js .glsr-response-postbox .toggle-indicator:before{content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.js .glsr-response-postbox.closed .toggle-indicator:before{content:"\f140"}.glsr-metabox-table{width:auto;padding:0 12px 12px;margin-top:12px}.glsr-metabox-table td{line-height:1.5;vertical-align:top;padding:0 14px 8px 0}.glsr-metabox-table td:first-child{font-weight:600}.glsr-metabox-table td:last-child{padding-bottom:0}.revert-action{line-height:23px;text-align:right;border-top:1px solid #ddd;background:#f5f5f5;padding:10px}.revert-action .spinner{float:none}.glsr-search-box .description{display:block}.glsr-assigned-post{display:block;margin-left:20px}.glsr-remove-button{position:absolute;left:-4px;width:20px;height:20px;border:none;margin:0;padding:0;background:0 0;cursor:pointer;text-indent:0}.glsr-remove-button:focus .glsr-remove-icon:before,.glsr-remove-button:hover .glsr-remove-icon:before{color:#c00}.glsr-remove-icon:before{margin-left:0;border-radius:50%;color:#0073aa;line-height:1.28;background:0 0;content:"\f153";display:block;font:400 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.branch-4 .notice-warning{border-color:#ffba00}.glsr-progress{position:relative;display:block;height:28px;opacity:.65;text-align:center;font-size:14px}@media screen and (max-width:782px){.glsr-progress{height:31px}}.glsr-progress.active{opacity:1}.glsr-progress *{box-sizing:border-box}.glsr-progress-background,.glsr-progress-bar{height:100%;background-size:40px 40px}.glsr-progress.active .glsr-progress-background,.glsr-progress.active .glsr-progress-bar{transition:width 2.5s linear;animation:b 1s linear infinite}.glsr-progress-bar{position:relative;width:0;color:#fff;background-color:#616b75;background-image:linear-gradient(-45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);border-width:1px;border-style:solid;border-color:#616b75 #4a5259 #4a5259;border-radius:3px 0 0 3px;overflow:hidden;z-index:1}.glsr-progress-bar[style="width: 0%;"]{border-width:0}.glsr-progress-bar[style="width: 100%;"]{border-radius:3px}.glsr-progress-background{position:absolute;top:0;left:0;width:100%;height:28px;background-color:#f7f7f7;background-image:linear-gradient(-45deg,#fff 25%,transparent 0,transparent 50%,#fff 0,#fff 75%,transparent 0,transparent);border-radius:3px;box-shadow:inset 0 1px 2px #e5e5e5;border:1px solid #ccc}@media screen and (max-width:782px){.glsr-progress-background{height:31px}}.glsr-progress span{position:absolute;left:0;top:0;line-height:26px;color:#555;padding:0 6px}@media screen and (max-width:782px){.glsr-progress span{line-height:29px}}.glsr-progress-bar>span{color:#fff;text-shadow:0 -1px 1px #4a5259,1px 0 1px #4a5259,0 1px 1px #4a5259,-1px 0 1px #4a5259}@keyframes b{0%{background-position:0 0}to{background-position:40px 0}}.glsr-progress .glsr-progress-bar{background-color:#681b98;border-color:#681b98 #591782 #591782}.glsr-progress .glsr-progress-bar>span{text-shadow:0 -1px 1px #591782,1px 0 1px #591782,0 1px 1px #591782,-1px 0 1px #591782}.star-rating .glsr-star{width:16px;font-size:16px;line-height:20px;color:#555}td.glsr-string-td1{position:relative;padding-bottom:2em}td.glsr-string-td1 .row-actions{position:absolute;bottom:10px;z-index:1}td.glsr-string-td2 input[type=text]:last-of-type{margin-bottom:0}td.glsr-string-td2 .description{display:block;padding-top:.5em}.is-invalid td.glsr-string-td2 .description{color:#dc3232}.mobile td.glsr-string-td1 .row-actions,.no-js td.glsr-string-td1 .row-actions,td.glsr-string-td1 .row-actions.visible,tr:hover td.glsr-string-td1 .row-actions{left:10px}.is-invalid td.glsr-string-td1,.is-invalid td.glsr-string-td1>div,.is-invalid td.glsr-string-td2,.is-invalid td.glsr-string-td2>div{position:relative}.is-invalid td.glsr-string-td1>button,.is-invalid td.glsr-string-td1>div,.is-invalid td.glsr-string-td2>button,.is-invalid td.glsr-string-td2>div{z-index:1}.is-invalid td.glsr-string-td1:after,.is-invalid td.glsr-string-td2:after{display:block;position:absolute;content:"";top:-1px;right:-1px;bottom:-1px;left:-1px;background:rgba(220,50,50,.06);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:0}.is-invalid td.glsr-string-td1:after{background:rgba(220,50,50,.08)}.is-invalid td.glsr-string-td2 input[type=text],.is-invalid td.glsr-string-td2 textarea{border-color:#e2cbcb}@media screen and (max-width:782px){.wp-list-table .is-expanded.is-invalid td:not(.hidden){overflow:unset}}@media screen and (max-width:720px){h2 a.glsr-nav-tab,h2 a.glsr-nav-tab.nav-tab-active:hover{transition-property:background,color;border-bottom:1px solid #ccc;margin:10px 10px 0 0}.wrap h2.glsr-nav-tab-wrapper{border-bottom:0}}.glsr-card{max-width:750px;box-sizing:border-box}.glsr-card-result{border:1px solid #e1e1e1;background-color:#f6fbfd;padding:0 1em;margin:1em 0}.glsr-card ol{list-style:decimal;margin-left:1.5em}.glsr-card ul{list-style:disc;margin-left:1.5em}.glsr-heading{color:#000;font-size:14px;font-weight:600}.glsr-card.postbox{padding:0}.glsr-card.postbox .glsr-card-header{position:relative;padding:1em 0 calc(1em + 1px) 1.5em;min-height:48px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.glsr-card.postbox.closed .glsr-card-header{padding-bottom:1em;border-bottom:none}.glsr-card.postbox .glsr-card-header h3{margin:0 48px 0 0;line-height:1.4;font-size:15px}.glsr-card.postbox .inside{padding:0 1.5em;margin:1.5em 0}.glsr-card.postbox .handlediv{position:absolute;top:0;right:0;width:48px;height:100%}.glsr-card.postbox .handlediv .toggle-indicator:before{width:20px;text-indent:-2px;content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.glsr-card.postbox.closed .handlediv .toggle-indicator:before{content:"\f140"}.glsr-card p.submit{margin:0}.glsr-card code,.glsr-card pre{word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.glsr-card pre code{display:block;border-radius:2px;color:#abb2bf;background-color:#282c34;overflow-x:auto;padding:.5em}.glsr-card dd{margin:1em 0}.glsr-card dt{font-weight:600;margin:1em 0}.glsr-card code a{text-decoration:none}.float-left{float:left;padding-right:.25em}.glsr-code[readonly]{width:100%;font-family:"Operator Mono","Fira Code",monaco,monospace;font-weight:300;white-space:pre;-webkit-font-smoothing:antialiased!important}.glsr-code-large{min-height:60vh}@media only screen and (max-width:782px){.glsr-card{max-width:inherit}}tr.glsr-field li,tr.glsr-field ul{margin:0 auto}.glsr-field ul.inline li,.glsr-field ul.inline li div{display:inline}.glsr-field ul.inline li:not(:last-child){margin-right:1em}.glsr-field{margin:1em 0;line-height:1.5}.glsr-field small code{font-size:inherit;padding:0 3px 1px}.glsr-field>label{display:block}@media screen and (max-width:782px){.glsr-field>label+input.small-text{margin-left:0}}.glsr-field>ul{margin:0}.glsr-field>ul li{margin-bottom:2px}.glsr-field textarea.code,.post-type-site-review .code,.post-type-site-review code{font-family:"Operator Mono","Fira Code",monaco,monospace}.glsr-hidden{display:none}.glsr-search-box,.glsr-strings-table{position:relative;max-width:800px}.glsr-search-box *,.glsr-strings-table *{box-sizing:border-box}.glsr-search-box{position:relative;margin:1em 0}.glsr-search-box.is-active .spinner{visibility:visible}.glsr-search-box.is-active input[type=search]::-webkit-search-cancel-button{display:none}.glsr-spinner{visibility:hidden;position:absolute;top:5px;right:5px;height:20px;width:20px;background-color:#fff;z-index:5}.glsr-spinner .spinner{margin:0}.loading-content .glsr-spinner{visibility:visible}.glsr-search-input{position:relative;width:100%;font-weight:300;line-height:1.5;padding:3px 5px;margin:0;z-index:2}.site-review_page_settings .glsr-search-input{height:32px;font-size:16px}.glsr-search-results{position:absolute;top:28px;left:0;width:100%;max-height:310px;overflow-x:scroll;-webkit-overflow-scrolling:touch;background-color:#fff;border:1px solid #ddd;border-top:none;box-sizing:border-box;box-shadow:0 1px 1px rgba(0,0,0,.04);z-index:1}.glsr-search-results>div,.glsr-search-results>span{position:relative;display:block;box-sizing:border-box;height:32px;line-height:32px;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #f5f5f5;padding:0 10px;margin-top:-1px;overflow:hidden}.glsr-search-results>div{background-color:#f6fbfd}.glsr-search-results>span:last-of-type{border-bottom-color:transparent}.glsr-search-results>span:active,.glsr-search-results>span:focus,.glsr-search-results>span:hover{color:#fff;background-color:#00a0d2;cursor:pointer;outline:none}.glsr-strings-table{transition:opacity .2s linear}.glsr-focus .glsr-strings-table{opacity:.2;pointer-events:none}.glsr-string-td1,.glsr-string-td2{border-top:none;border-bottom:1px solid #f1f1f1;padding:13px 15px}.glsr-string-td1{max-width:375px;background:#f9f9f9;border-right:1px solid #e1e1e1;border-bottom:1px solid #eee;vertical-align:top}.glsr-string-td2{width:60%;max-width:375px;background-color:#fff}.glsr-strings-table p:not(.row-actions){font-size:14px;font-weight:400;line-height:1.3;color:#000}.glsr-strings-table p.row-actions{margin:0}.glsr-strings-table textarea{display:block;width:100%;margin:0}.glsr-strings-table input[type=text]{display:block;width:100%;margin:0 0 5px}.glsr-strings-table input[type=text]:active,.glsr-strings-table input[type=text]:focus{position:relative}.glsr-string-tr:last-child .glsr-string-td2,.glsr-string-tr:not(.is-expanded):last-child .glsr-string-td1{border-bottom:none}@media screen and (max-width:782px){.glsr-search-results>span{padding:0 10px}.glsr-string-td1{max-width:none;border-right:none}.glsr-string-td2{max-width:none;padding:13px 15px!important}.glsr-spinner{right:10px}}.glsr-string-tr.ui-sortable-helper{opacity:.8;display:table;box-shadow:0 1px 2px rgba(0,0,0,.1)}.ui-sortable .glsr-string-tr:hover{cursor:move}.ui-sortable-placeholder+.glsr-string-tr .glsr-string-td1{border-top:1px solid #eee}@media screen and (min-width:783px){.ui-sortable-placeholder+.glsr-string-tr .glsr-string-td2{border-top:1px solid #f1f1f1}}.ui-sortable-helper .glsr-string-td1{border-left:1px solid #999}.ui-sortable-helper .glsr-string-td1,.ui-sortable-helper .glsr-string-td2{border-top:1px solid #999!important;border-bottom:1px solid #999!important}.ui-sortable-helper .glsr-string-td2{border-right:1px solid #999}@media screen and (max-width:782px){.ui-sortable-helper .glsr-string-td1{border:1px solid #999}.ui-sortable-helper.is-expanded .glsr-string-td1{border-bottom:none!important}.ui-sortable-helper.is-expanded .glsr-string-td2{border:1px solid #999;border-top-color:#f1f1f1!important}}.glsr-status{max-width:750px}.glsr-status th.column-primary{width:50%}.glsr-status td.column-primary{position:relative;font-size:14px!important;font-weight:600}.glsr-status td.column-primary span{font-weight:400}.glsr-status .toggle-row{top:0}.glsr-status .toggle-row:before{top:6px}.glsr-status tfoot td.glsr-radio-column,.glsr-status thead td.glsr-radio-column{color:#82878c;text-align:center;padding-left:4px}@media screen and (max-width:782px){.glsr-status th input[type=radio]{margin-bottom:8px}.glsr-status tfoot td.glsr-radio-column,.glsr-status thead td.glsr-radio-column{padding-top:4px;padding-left:9px}}.wrap h2.glsr-nav-tab-wrapper{padding-top:0;margin-top:9px}.glsr-nav-view{margin-top:20px}.glsr-subsubsub{float:none;text-align:left}.column-rating .star-rating .star,.glsr-metabox-table .star-rating .star{width:16px;font-size:16px;line-height:20px;color:#555}.column-rating .star-rating .star{margin-top:-2px}.hide-column-tog+.pinned-icon+svg,.post-type-site-review .wp-list-table .approve,.post-type-site-review .wp-list-table .status-pending .unapprove{display:none}.post-type-site-review .wp-list-table .spam .approve,.post-type-site-review .wp-list-table .status-pending .approve,.post-type-site-review .wp-list-table .trash .approve{display:inline}.post-type-site-review .wp-list-table .approve a{color:#006505}.post-type-site-review .wp-list-table .approve a:hover{color:#007f06}.post-type-site-review .wp-list-table .unapprove a{color:#d98500}.post-type-site-review .wp-list-table .unapprove a:hover{color:#f39500}.post-type-site-review .wp-list-table th.column-rating{width:100px}.post-type-site-review .wp-list-table td.column-pinned i{line-height:24px;text-indent:-3px;cursor:pointer}.post-type-site-review .wp-list-table td.column-pinned i:not(.pinned){color:rgba(85,85,85,.2)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending th.check-column{box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td:nth-child(2){box-shadow:inset 0 1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending:not(.is-expanded) td:nth-child(2){box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending.is-expanded td:last-child,.post-type-site-review .wp-list-table tr.status-pending:not(.is-expanded) td:nth-child(2),.post-type-site-review .wp-list-table tr.status-pending th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending td,.post-type-site-review .wp-list-table tr.status-pending th.check-column{background-color:#fef7f1}.post-type-site-review .wp-list-table tr.status-pending th.check-column{position:relative;border-left:4px solid #d54e21;z-index:1}.post-type-site-review .wp-list-table tr.status-pending th.check-column input{margin-left:4px}@media screen and (min-width:783px){.post-type-site-review .wp-list-table :not(.status-pending)+tr.status-pending td{box-shadow:inset 0 1px 0 rgba(0,0,0,.07),inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table tr.status-pending td{box-shadow:inset 0 -1px 0 rgba(0,0,0,.07)}.post-type-site-review .wp-list-table th.column-assigned_to,.post-type-site-review .wp-list-table th.column-review_type,.post-type-site-review .wp-list-table th.column-reviewer,.post-type-site-review .wp-list-table th.column-taxonomy-site-review-category{width:120px}.post-type-site-review .wp-list-table th.column-pinned{width:45px}.post-type-site-review .wp-list-table th.column-pinned span.pinned-icon span{display:none}.post-type-site-review .wp-list-table th.column-pinned span.pinned-icon:after{display:inline-block;position:relative;content:"\f537";font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:16px;height:20px;line-height:22px;font-size:16px;text-align:center;transition:color .1s ease-in 0}.post-type-site-review .wp-list-table th.column-pinned .sorting-indicator{margin-left:3px}.post-type-site-review .wp-list-table td.column-pinned{padding:8px 6px}.post-type-site-review .wp-list-table td.column-pinned i{text-indent:0}}.glsr-no-margins{margin:0!important}::-ms-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}::placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}::-webkit-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}:-moz-placeholder,::-moz-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}:-ms-input-placeholder{color:#72777c!important;font-size:inherit!important;line-height:inherit!important;opacity:1}
|
assets/styles/site-reviews-blocks.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.wp-block .glsr-shortcode{position:relative;min-height:25.6px;padding:14px;z-index:0}.wp-block .glsr-shortcode:before{z-index:-1;content:"";position:absolute;pointer-events:none;top:0;right:0;bottom:0;left:0;background-color:rgba(0,40,40,.028)}.wp-block .glsr-star{display:inline-block;background-repeat:no-repeat;width:20px;height:20px;font-size:inherit;background-size:20px}.wp-block .gl-star-rating-stars>span,.wp-block .glsr-star-empty{background-image:url(../images/star-empty.svg)!important}.wp-block .glsr-has-error .gl-star-rating-stars>span{background-image:url(../images/star-error.svg)!important}.wp-block .glsr-star-half{background-image:url(../images/star-half.svg)!important}.wp-block .gl-star-rating-stars.s10>span:first-child,.wp-block .gl-star-rating-stars.s20>span:nth-child(-1n+2),.wp-block .gl-star-rating-stars.s30>span:nth-child(-1n+3),.wp-block .gl-star-rating-stars.s40>span:nth-child(-1n+4),.wp-block .gl-star-rating-stars.s50>span:nth-child(-1n+5),.wp-block .gl-star-rating-stars.s60>span:nth-child(-1n+6),.wp-block .gl-star-rating-stars.s70>span:nth-child(-1n+7),.wp-block .gl-star-rating-stars.s80>span:nth-child(-1n+8),.wp-block .gl-star-rating-stars.s90>span:nth-child(-1n+9),.wp-block .gl-star-rating-stars.s100>span,.wp-block .glsr-star-full{background-image:url(../images/star-full.svg)!important}.wp-block .glsr-default{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;line-height:1.6}.wp-block .glsr-summary{font-size:16px;position:relative;width:100%;max-width:400px}.wp-block .glsr-summary-rating{display:inline-block;font-size:24px;font-weight:700;vertical-align:middle}.wp-block .glsr-summary-rating+.glsr-summary-stars{padding:0 4px}.wp-block .glsr-summary-stars{display:inline-block;font-size:24px;line-height:1;vertical-align:middle}.wp-block .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.wp-block .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:14px}.wp-block .glsr-bar{display:table-row;white-space:nowrap}.wp-block .glsr-bar>span{display:table-cell;vertical-align:middle}.wp-block .glsr-bar-background{position:relative;width:100%;padding:0 10px}.wp-block .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:calc(100% - 20px);height:12px;background-color:currentColor}.wp-block .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.wp-block .glsr-bar-percent{text-align:right}.wp-block .glsr-reviews{font-size:16px;line-height:1.6}.wp-block .glsr-reviews .glsr-review:not(:last-child),.wp-block .glsr-reviews .glsr-review>div:not(:last-child){margin-bottom:16px}.wp-block .glsr-reviews .glsr-review-content>p{font-size:16px;line-height:1.6;white-space:pre-line;margin:0 0 16px}.wp-block .glsr-reviews .glsr-review-title>h3{font-size:24px;margin:0}.wp-block .glsr-reviews .glsr-review-assigned_to{display:block;font-style:italic}.wp-block .glsr-reviews .glsr-review-author{display:inline-block;vertical-align:top}.wp-block .glsr-reviews .glsr-review-avatar+.glsr-review-author{margin-top:8px;padding:0 8px}.wp-block .glsr-reviews div:not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.wp-block .glsr-reviews .glsr-review-avatar{display:inline-block}.wp-block .glsr-reviews .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.wp-block .glsr-reviews .glsr-hidden-text:before{position:relative!important;display:inline-block!important;content:attr(data-show-more)!important}.wp-block .glsr-reviews .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap;vertical-align:middle}.wp-block .glsr-reviews .glsr-review-rating{display:inline-block;vertical-align:middle;font-size:20px;line-height:1}.wp-block .glsr-reviews .glsr-review-rating+.glsr-review-date{padding:0 4px}.wp-block .glsr-reviews .glsr-review-response{position:relative;clear:both}.wp-block .glsr-reviews .glsr-review-response p{font-size:16px;line-height:1.6;margin:0 0 16px}.wp-block .glsr-reviews .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.wp-block .glsr-reviews .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:16px}.wp-block .glsr-reviews .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 2em 1.5em 0;right:3em}.wp-block .glsr-reviews .glsr-review-response-inner{position:relative;padding:16px;z-index:1}.wp-block .glsr-reviews a{pointer-events:none!important}.wp-block .glsr-rtl .glsr-reviews .glsr-review-response-background:before{left:3em;right:unset;border-right-width:0;border-left-width:2em}.wp-block .glsr-form{line-height:1}.wp-block .glsr-form .glsr-field .glsr-stars{font-size:24px;line-height:1;vertical-align:middle}.wp-block .glsr-form .glsr-field .glsr-star{display:inline-block;width:24px;height:24px;background-size:24px}.wp-block .glsr-form .glsr-field{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:16px;line-height:1.6;margin:0 0 16px}.wp-block .glsr-form .glsr-field label{font-size:14px;font-weight:600;vertical-align:unset}.wp-block .glsr-form .glsr-field input:not([type=radio]):not([type=checkbox]),.wp-block .glsr-form .glsr-field textarea{width:100%;border-color:#8d96a0;border-radius:2px;font-size:13px;min-height:36px;padding:6px 8px;border-radius:4px}.wp-block .glsr-form .glsr-field input[type=checkbox],.wp-block .glsr-form .glsr-field input[type=radio]{margin-right:8px}.wp-block .glsr-form .glsr-field input,.wp-block .glsr-form .glsr-field select,.wp-block .glsr-form .glsr-field textarea{background-color:#fff}.wp-block .glsr-form .glsr-field input,.wp-block .glsr-form .glsr-field label,.wp-block .glsr-form .glsr-field select,.wp-block .glsr-form .glsr-field textarea,.wp-block .glsr-form button{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;pointer-events:none!important}.wp-block .glsr-form .glsr-required label span:after{content:"\002a";padding:0 .25em}.wp-block .glsr-read-more{white-space:nowrap}.wp-block .glsr-block-disabled{font-size:13px;text-align:center}
|
assets/styles/site-reviews.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
form.glsr-form .gl-star-rating[data-star-rating]{position:relative;display:block}form.glsr-form .gl-star-rating[data-star-rating]>select{overflow:hidden;visibility:visible!important;position:absolute!important;top:0;width:1px;height:1px;clip:rect(1px,1px,1px,1px);-webkit-clip-path:circle(1px at 0 0);clip-path:circle(1px at 0 0);white-space:nowrap}form.glsr-form .gl-star-rating[data-star-rating]>select:after,form.glsr-form .gl-star-rating[data-star-rating]>select:before{display:none!important}form.glsr-form .gl-star-rating-ltr[data-star-rating]>select{left:0}form.glsr-form .gl-star-rating-rtl[data-star-rating]>select{right:0}form.glsr-form .gl-star-rating[data-star-rating]>select:focus+.gl-star-rating-stars:before{opacity:.5;display:block;position:absolute;width:100%;height:100%;content:"";outline:1px dotted currentColor;pointer-events:none}form.glsr-form .gl-star-rating-stars{position:relative;display:inline-block;height:26px;vertical-align:middle;cursor:pointer}form.glsr-form .gl-star-rating-stars>span{display:inline-block;width:24px;height:24px;background-size:24px;background-repeat:no-repeat;background-image:none;margin:0 4px 0 0}form.glsr-form .gl-star-rating-stars>span:last-of-type{margin-right:0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span{margin:0 0 0 4px}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-stars>span:last-of-type{margin-left:0}form.glsr-form .gl-star-rating-stars.s10>span:first-child,form.glsr-form .gl-star-rating-stars.s20>span:nth-child(-1n+2),form.glsr-form .gl-star-rating-stars.s30>span:nth-child(-1n+3),form.glsr-form .gl-star-rating-stars.s40>span:nth-child(-1n+4),form.glsr-form .gl-star-rating-stars.s50>span:nth-child(-1n+5),form.glsr-form .gl-star-rating-stars.s60>span:nth-child(-1n+6),form.glsr-form .gl-star-rating-stars.s70>span:nth-child(-1n+7),form.glsr-form .gl-star-rating-stars.s80>span:nth-child(-1n+8),form.glsr-form .gl-star-rating-stars.s90>span:nth-child(-1n+9),form.glsr-form .gl-star-rating-stars.s100>span{background-image:url(../img/star-full.svg)}form.glsr-form .gl-star-rating-text{display:inline-block;position:relative;height:26px;line-height:26px;font-size:.8em;font-weight:600;color:#fff;background-color:#1a1a1a;white-space:nowrap;vertical-align:middle;padding:0 12px 0 6px;margin:0 0 0 12px}form.glsr-form .gl-star-rating-text:before{position:absolute;top:0;left:-12px;width:0;height:0;content:"";border-style:solid;border-width:13px 12px 13px 0;border-color:transparent #1a1a1a transparent transparent}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text{padding:0 6px 0 12px;margin:0 12px 0 0}form.glsr-form .gl-star-rating-rtl[data-star-rating] .gl-star-rating-text:before{left:unset;right:-12px;border-width:13px 0 13px 12px;border-color:transparent transparent transparent #1a1a1a}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}form.glsr-form label{float:none;display:block;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}form.glsr-form label.glsr-checkbox-label,form.glsr-form label.glsr-radio-label{display:inline}form.glsr-form select.glsr-star-rating{visibility:hidden!important;display:block}form.glsr-form input[type=email],form.glsr-form input[type=text],form.glsr-form textarea{float:none;display:block;width:100%;font-size:inherit;line-height:inherit;box-sizing:border-box}form.glsr-form [type=submit]{white-space:nowrap}form.glsr-form [type=submit] .glsr-button-loading{display:none}form.glsr-form [type=submit][disabled] .glsr-button-loading{display:inline;position:relative}form.glsr-form [type=submit] .glsr-button-loading:after,form.glsr-form [type=submit] .glsr-button-loading:before{display:inline-block;position:absolute;top:50%;height:1em;width:1em;content:"";border:.2em solid currentColor;border-radius:100%;box-sizing:border-box;margin:-.5em auto 0;animation:a .5s infinite linear}form.glsr-form [type=submit] .glsr-button-loading:before{opacity:.5;border-top-color:transparent}form.glsr-form [type=submit] .glsr-button-loading:after{border-color:transparent;border-top-color:currentColor}.glsr-ltr form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-right:1.65em}.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-ltr form.glsr-form [type=submit] .glsr-button-loading:before{left:0}.glsr-ltr form.glsr-form .glsr-required label span:after{margin-left:.33em}.glsr-rtl form.glsr-form [type=submit][disabled] .glsr-button-loading{margin-left:1.65em}.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:after,.glsr-rtl form.glsr-form [type=submit] .glsr-button-loading:before{right:0}.glsr-rtl form.glsr-form .glsr-required label span:after{margin-right:.33em}.glsr-disabled .glsr-button{pointer-events:none;cursor:wait;opacity:.5}.glsr-field{position:relative}.glsr-field ul{list-style-type:none}.glsr-error{font-size:.875em}.glsr-hidden{display:none}.glsr-loader{display:none;position:absolute;bottom:0;left:calc(50% - 12px);width:24px;height:24px;border-radius:50%;animation:a .5s infinite linear;transform:translateZ(0);margin:0}.glsr-loader:after,.glsr-loader:before{content:"";position:absolute;width:8px;height:8px;background:rgba(0,0,0,.75);border-radius:50%}.glsr-loader:before{top:0;left:0}.glsr-loader:after{bottom:0;right:0}.glsr-hide .glsr-loader{display:block}.glsr-read-more{white-space:nowrap}.glsr-read-more:before{content:"\2026"}.glsr-ltr .glsr-read-more:before{margin-right:.5em}.glsr-rtl .glsr-read-more:before{margin-left:.5em}.glsr-visible+.glsr-read-more:before{content:""}.glsr-recaptcha-holder{margin-top:1em}.glsr-reviews-wrap{position:relative}.glsr-reviews-wrap:after{display:table;content:"";clear:both}.glsr-reviews-wrap .screen-reader-text,.glsr-summary-wrap .screen-reader-text{position:absolute;height:1px;width:1px;border:0;overflow:hidden;clip:rect(0 0 0 0);word-wrap:normal!important;padding:0;margin:-1px}.glsr-star{display:inline-block;background-repeat:no-repeat}.glsr-default .glsr-navigation:after,.glsr-default .glsr-review:after{content:"";display:table;clear:both}.glsr-default .glsr-review{margin-bottom:48px}.glsr-default .glsr-review>div{margin-bottom:16px}.glsr-default .glsr-review>div:last-of-type{margin-bottom:0}.glsr-default .glsr-review p{white-space:pre-line;margin:0 0 16px}.glsr-default .glsr-navigation>:not(.glsr-loader),.glsr-default .glsr-review{opacity:1;transition:opacity .5s}.glsr-default.glsr-hide .glsr-navigation>:not(.glsr-loader),.glsr-default.glsr-hide .glsr-review{opacity:0!important}.glsr-default .glsr-review-assigned_to{display:block;font-style:italic}.glsr-default .glsr-review-author{display:inline-block;vertical-align:top}.glsr-default .glsr-review-avatar+.glsr-review-author{margin-top:.5em}.glsr-default :not(.glsr-review-avatar)+.glsr-review-author:before{content:"\2014"}.glsr-default .glsr-review-avatar img{display:block;-o-object-fit:cover;object-fit:cover}.glsr-default .glsr-review-content p{line-height:1.5}.glsr-default .glsr-review-date{display:inline-block;font-style:italic;white-space:nowrap}.glsr-default .glsr-review-rating{display:inline-block}.glsr-default .glsr-review-response{position:relative;clear:both}.glsr-default .glsr-review-response p:last-of-type{font-size:14px;margin-bottom:0}.glsr-default .glsr-review-response-background{opacity:.1;position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;border-radius:2px;padding:1em}.glsr-default .glsr-review-response-background:before{content:"";display:block;position:absolute;top:-1.5em;height:0;width:0;border-style:solid;border-color:currentColor transparent;border-width:0 0 1.5em}.glsr-default .glsr-review-response-inner{position:relative;padding:1em;z-index:1}.glsr-default .glsr-star{width:20px;height:20px;font-size:inherit;background-size:20px}.glsr-ltr .glsr-default .glsr-review-avatar{float:left;margin-right:1em}.glsr-ltr .glsr-default .glsr-review-rating{margin-right:.5em}.glsr-ltr .glsr-default .glsr-review-response-background:before{right:3em;border-right-width:2em}.glsr-rtl .glsr-default .glsr-review-avatar{float:right;margin-left:1em}.glsr-rtl .glsr-default .glsr-review-rating{margin-left:.5em}.glsr-rtl .glsr-default .glsr-review-response-background:before{left:3em;border-left-width:2em}form.glsr-form{font-size:16px;line-height:1.5}form.glsr-form .glsr-field-choice{position:relative;display:block;padding-left:1.25rem}form.glsr-form .glsr-field-choice input{box-sizing:border-box;padding:0;position:absolute;margin-top:.3rem;margin-left:-1.25rem}form.glsr-form .glsr-field-choice label{display:inline-block;margin:0}form.glsr-form input.glsr-field-control,form.glsr-form textarea.glsr-field-control{line-height:1.5;font-size:1rem;background-color:#fff;min-height:calc(2.25rem + 2px);background-clip:padding-box;border:1px solid #bdbdbd;border-radius:.15rem;transition:border-color .15s ease-in-out;padding:.375rem .5rem}form.glsr-form input.glsr-field-control:focus,form.glsr-form textarea.glsr-field-control:focus{background-color:#fff;border-color:#9e9e9e;outline:0}form.glsr-form .glsr-required label span:after{content:"\002a";color:#d32f2f}form.glsr-form .glsr-field{margin-bottom:16px}form.glsr-form .glsr-field-error{font-size:14px;color:#d32f2f}form.glsr-form .glsr-form-messages{color:#388e3c}form.glsr-form .glsr-form-messages p{margin-top:16px}form.glsr-form .glsr-has-errors{color:#d32f2f}form.glsr-form input:not([type=checkbox]):not([type=radio]).glsr-is-invalid,form.glsr-form textarea.glsr-is-invalid{border-color:#d32f2f}form.glsr-form .glsr-field-choice input{outline:none}.glsr-ltr form.glsr-form .glsr-field input[type=checkbox],.glsr-ltr form.glsr-form .glsr-field input[type=radio]{margin-right:.5em}.glsr-rtl form.glsr-form .glsr-field input[type=checkbox],.glsr-rtl form.glsr-form .glsr-field input[type=radio]{margin-left:.5em}.glsr-default.glsr-summary{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default.glsr-summary>div{margin-bottom:8px}.glsr-default.glsr-summary>div:last-of-type{margin-bottom:0}.glsr-default .glsr-bar{display:table-row;white-space:nowrap}.glsr-default .glsr-bar>span{display:table-cell;vertical-align:middle}.glsr-default .glsr-bar-background{position:relative;width:100%}.glsr-default .glsr-bar-background:before{opacity:.1;display:block;position:absolute;content:"";width:100%;height:12px;background-color:currentColor}.glsr-default .glsr-bar-background-percent{position:relative;display:block;height:12px;background-color:#ffb900}.glsr-default .glsr-bar-percent{text-align:right;font-size:14px}.glsr-default .glsr-summary-percentage{position:relative;width:100%;max-width:400px;font-size:16px;line-height:1.5}.glsr-default .glsr-summary-rating{display:inline-block;line-height:1.25;font-size:24px;font-weight:700;vertical-align:top}.glsr-default .glsr-summary-stars{display:inline-block}.glsr-default .glsr-summary-stars .glsr-star{width:24px;height:24px;background-size:24px}.glsr-ltr .glsr-default .glsr-bar-label{padding-right:10px}.glsr-ltr .glsr-default .glsr-bar-percent{padding-left:10px}.glsr-ltr .glsr-default .glsr-summary-rating,.glsr-ltr .glsr-default .glsr-summary-stars{margin-right:10px}.glsr-rtl .glsr-default .glsr-bar-label{padding-left:10px}.glsr-rtl .glsr-default .glsr-bar-percent{padding-right:10px}.glsr-rtl .glsr-default .glsr-summary-rating,.glsr-rtl .glsr-default .glsr-summary-stars{margin-left:10px}.glsr-rtl .glsr-default .glsr-summary-stars .glsr-star{transform:scaleX(-1)}
|
autoload.php
CHANGED
@@ -1,36 +1,23 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
defined( 'WPINC' ) || die;
|
12 |
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
spl_autoload_register( function( $class )
|
17 |
-
{
|
18 |
$namespaces = [
|
19 |
-
'GeminiLabs\\SiteReviews\\'
|
20 |
-
'GeminiLabs\\SiteReviews\\Tests\\' => __DIR__
|
21 |
-
'Sepia\\PoParser\\'
|
22 |
-
'Sinergi\\BrowserDetector\\'
|
23 |
-
'Vectorface\\Whip\\'
|
24 |
];
|
25 |
-
|
26 |
-
foreach( $namespaces as $prefix => $base_dir ) {
|
27 |
$len = strlen( $prefix );
|
28 |
-
if( strncmp( $prefix, $
|
29 |
-
$file = $
|
30 |
if( !file_exists( $file ))continue;
|
31 |
require $file;
|
32 |
break;
|
33 |
}
|
34 |
});
|
35 |
-
|
36 |
-
require_once( ABSPATH . WPINC . '/class-phpass.php' );
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
defined( 'WPINC' ) || die;
|
4 |
|
5 |
+
require_once( ABSPATH.WPINC.'/class-phpass.php' );
|
6 |
+
|
7 |
+
spl_autoload_register( function( $className ) {
|
|
|
|
|
8 |
$namespaces = [
|
9 |
+
'GeminiLabs\\SiteReviews\\' => __DIR__.'/plugin/',
|
10 |
+
'GeminiLabs\\SiteReviews\\Tests\\' => __DIR__.'/tests/',
|
11 |
+
'GeminiLabs\\Sepia\\PoParser\\' => __DIR__.'/vendors/sepia/po-parser/',
|
12 |
+
'GeminiLabs\\Sinergi\\BrowserDetector\\' => __DIR__.'/vendors/sinergi/browser-detector/',
|
13 |
+
'GeminiLabs\\Vectorface\\Whip\\' => __DIR__.'/vendors/vectorface/whip/',
|
14 |
];
|
15 |
+
foreach( $namespaces as $prefix => $baseDir ) {
|
|
|
16 |
$len = strlen( $prefix );
|
17 |
+
if( strncmp( $prefix, $className, $len ) !== 0 )continue;
|
18 |
+
$file = $baseDir.str_replace( '\\', '/', substr( $className, $len )).'.php';
|
19 |
if( !file_exists( $file ))continue;
|
20 |
require $file;
|
21 |
break;
|
22 |
}
|
23 |
});
|
|
|
|
compatibility.php
CHANGED
@@ -1,14 +1,30 @@
|
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
-
* @
|
5 |
-
* @
|
6 |
-
* @
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
*/
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
/**
|
14 |
* @param array $scriptHandles
|
@@ -20,110 +36,20 @@ add_filter( 'sbp_exclude_defer_scripts', function( $scriptHandles ) {
|
|
20 |
return array_keys( array_flip( $scriptHandles ));
|
21 |
});
|
22 |
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
return $dom->getElementsByTagName( 'img' )->item(0)->getAttribute( 'src' );
|
41 |
-
}
|
42 |
-
}
|
43 |
-
}
|
44 |
-
|
45 |
-
// Wordpress 4.0 support
|
46 |
-
add_filter( 'script_loader_src', function( $src, $handle ) {
|
47 |
-
global $wp_version;
|
48 |
-
if( version_compare( $wp_version, '4.1', '<' )
|
49 |
-
&& strpos( $handle, '/google-recaptcha' ) !== false
|
50 |
-
&& strpos( $src, ' async defer ' ) === false
|
51 |
-
&& glsr_get_option( 'reviews-form.recaptcha.integration' ) == 'custom' ) {
|
52 |
-
return sprintf( "%s' async defer='defer", $src );
|
53 |
-
}
|
54 |
-
return $src;
|
55 |
-
}, 10, 2 );
|
56 |
-
|
57 |
-
// PHP 5.4 support
|
58 |
-
if( !function_exists( 'array_column' )) {
|
59 |
-
function array_column( $array, $column_name ) {
|
60 |
-
return array_map( function( $element ) use( $column_name ){
|
61 |
-
return $element[$column_name];
|
62 |
-
}, $array );
|
63 |
-
}
|
64 |
-
}
|
65 |
-
|
66 |
-
// Wordpress 4.0-4.6 support
|
67 |
-
if( !function_exists( 'wp_doing_ajax' )) {
|
68 |
-
function wp_doing_ajax() {
|
69 |
-
return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
|
70 |
-
}
|
71 |
-
}
|
72 |
-
|
73 |
-
// Wordpress 4.0-4.4 support
|
74 |
-
if( !function_exists( 'wp_add_inline_script' )) {
|
75 |
-
function wp_add_inline_script( $handle, $data, $position = 'after' ) {
|
76 |
-
if( $handle != glsr_app()->id.'/google-recaptcha' )return;
|
77 |
-
echo '<script>'.$data.'</script>';
|
78 |
-
}
|
79 |
-
}
|
80 |
-
|
81 |
-
// Wordpress 4.0-4.6 support
|
82 |
-
if( !function_exists( 'sanitize_textarea_field' )) {
|
83 |
-
function sanitize_textarea_field( $str ) {
|
84 |
-
$filtered = wp_check_invalid_utf8( $str );
|
85 |
-
if( strpos($filtered, '<') !== false ) {
|
86 |
-
$filtered = wp_pre_kses_less_than( $filtered );
|
87 |
-
$filtered = wp_strip_all_tags( $filtered, false );
|
88 |
-
$filtered = str_replace("<\n", "<\n", $filtered);
|
89 |
-
}
|
90 |
-
$filtered = trim( $filtered );
|
91 |
-
$found = false;
|
92 |
-
while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
|
93 |
-
$filtered = str_replace($match[0], '', $filtered);
|
94 |
-
$found = true;
|
95 |
-
}
|
96 |
-
if( $found ) {
|
97 |
-
$filtered = trim( preg_replace('/ +/', ' ', $filtered) );
|
98 |
-
}
|
99 |
-
return $filtered;
|
100 |
-
}
|
101 |
-
}
|
102 |
-
|
103 |
-
// Wordpress 4.0-4.3 support
|
104 |
-
if( !function_exists( 'get_the_post_thumbnail_url' )) {
|
105 |
-
function get_the_post_thumbnail_url( $post = null, $size = 'post-thumbnail' ) {
|
106 |
-
$post_thumbnail_id = get_post_thumbnail_id( $post );
|
107 |
-
if( !$post_thumbnail_id ) {
|
108 |
-
return false;
|
109 |
-
}
|
110 |
-
return wp_get_attachment_image_url( $post_thumbnail_id, $size );
|
111 |
-
}
|
112 |
-
}
|
113 |
-
|
114 |
-
// Wordpress 4.0-4.3 support
|
115 |
-
if( !function_exists( 'wp_get_attachment_image_url' )) {
|
116 |
-
function wp_get_attachment_image_url( $attachment_id, $size = 'thumbnail', $icon = false ) {
|
117 |
-
$image = wp_get_attachment_image_src( $attachment_id, $size, $icon );
|
118 |
-
return isset( $image['0'] )
|
119 |
-
? $image['0']
|
120 |
-
: false;
|
121 |
-
}
|
122 |
-
}
|
123 |
-
|
124 |
-
// Wordpress 4.0-4.3 support
|
125 |
-
if( !function_exists( 'wp_json_encode' )) {
|
126 |
-
function wp_json_encode( $data ) {
|
127 |
-
return json_encode( $data );
|
128 |
-
}
|
129 |
-
}
|
1 |
<?php
|
2 |
|
3 |
+
defined( 'WPINC' ) || die;
|
4 |
+
|
5 |
/**
|
6 |
+
* @param \GeminiLabs\SiteReviews\Modules\Html\Builder $instance
|
7 |
+
* @return void
|
8 |
+
* @see https://www.elegantthemes.com/gallery/divi/
|
|
|
|
|
9 |
*/
|
10 |
+
add_action( 'site-reviews/customize/divi', function( $instance ) {
|
11 |
+
if( $instance->tag != 'label' || $instance->args['type'] != 'checkbox' )return;
|
12 |
+
$instance->args['text'] = '<i></i>'.$instance->args['text'];
|
13 |
+
});
|
14 |
|
15 |
+
/**
|
16 |
+
* Clears the WP-Super-Cache plugin cache after a review has been submitted
|
17 |
+
* @param \GeminiLabs\SiteReviews\Review $review
|
18 |
+
* @param \GeminiLabs\SiteReviews\Commands\CreateReview $request
|
19 |
+
* @return void
|
20 |
+
* @see https://wordpress.org/plugins/wp-super-cache/
|
21 |
+
*/
|
22 |
+
add_action( 'site-reviews/review/created', function( $review, $request ) {
|
23 |
+
if( !function_exists( 'wp_cache_post_change' ))return;
|
24 |
+
wp_cache_post_change( $request->post_id );
|
25 |
+
if( empty( $review->assigned_to ) || $review->assigned_to == $request->post_id )return;
|
26 |
+
wp_cache_post_change( $review->assigned_to );
|
27 |
+
}, 10, 2 );
|
28 |
|
29 |
/**
|
30 |
* @param array $scriptHandles
|
36 |
return array_keys( array_flip( $scriptHandles ));
|
37 |
});
|
38 |
|
39 |
+
/**
|
40 |
+
* Fix to display all reviews when sorting by rank
|
41 |
+
* @param array $query
|
42 |
+
* @return array
|
43 |
+
* @see https://searchandfilter.com/
|
44 |
+
*/
|
45 |
+
add_filter( 'sf_edit_query_args', function( $query ) {
|
46 |
+
if( !empty( $query['meta_key'] ) && $query['meta_key'] == '_glsr_ranking' ) {
|
47 |
+
unset( $query['meta_key'] );
|
48 |
+
$query['meta_query'] = [
|
49 |
+
'relation' => 'OR',
|
50 |
+
['key' => '_glsr_ranking', 'compare' => 'EXISTS'],
|
51 |
+
['key' => '_glsr_ranking', 'compare' => 'NOT EXISTS'],
|
52 |
+
];
|
53 |
+
}
|
54 |
+
return $query;
|
55 |
+
}, 20 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
config/forms/submission-form.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'rating' => [
|
5 |
+
'label' => __( 'Your overall rating', 'site-reviews' ),
|
6 |
+
'type' => 'rating',
|
7 |
+
],
|
8 |
+
'title' => [
|
9 |
+
'label' => __( 'Title of your review', 'site-reviews' ),
|
10 |
+
'placeholder' => __( 'Summarize your review or highlight an interesting detail', 'site-reviews' ),
|
11 |
+
'type' => 'text',
|
12 |
+
],
|
13 |
+
'content' => [
|
14 |
+
'label' => __( 'Your review', 'site-reviews' ),
|
15 |
+
'placeholder' => __( 'Tell people your review', 'site-reviews' ),
|
16 |
+
'rows' => 5,
|
17 |
+
'type' => 'textarea',
|
18 |
+
],
|
19 |
+
'name' => [
|
20 |
+
'label' => __( 'Your name', 'site-reviews' ),
|
21 |
+
'placeholder' => __( 'Tell us your name', 'site-reviews' ),
|
22 |
+
'type' => 'text',
|
23 |
+
],
|
24 |
+
'email' => [
|
25 |
+
'label' => __( 'Your email', 'site-reviews' ),
|
26 |
+
'placeholder' => __( 'Tell us your email', 'site-reviews' ),
|
27 |
+
'type' => 'email',
|
28 |
+
],
|
29 |
+
'terms' => [
|
30 |
+
'label' => __( 'This review is based on my own experience and is my genuine opinion.', 'site-reviews' ),
|
31 |
+
'type' => 'checkbox',
|
32 |
+
],
|
33 |
+
];
|
config/inline-styles.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
':star-empty' => glsr()->url( 'assets/images/star-empty.svg' ),
|
5 |
+
':star-error' => glsr()->url( 'assets/images/star-error.svg' ),
|
6 |
+
':star-full' => glsr()->url( 'assets/images/star-full.svg' ),
|
7 |
+
':star-half' => glsr()->url( 'assets/images/star-half.svg' ),
|
8 |
+
];
|
config/settings.php
ADDED
@@ -0,0 +1,369 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'settings.general.style' => [
|
5 |
+
'default' => 'default',
|
6 |
+
'description' => __( 'Site Reviews relies on the CSS of your theme to style the submission form. If your theme does not provide proper CSS rules for form elements and you are using a WordPress plugin/theme or CSS Framework listed here, please try selecting it, otherwise choose "Site Reviews (default)".', 'site-reviews' ),
|
7 |
+
'label' => __( 'Plugin Style', 'site-reviews' ),
|
8 |
+
'options' => [
|
9 |
+
'bootstrap_4' => 'CSS Framework: Bootstrap 4',
|
10 |
+
'bootstrap_4_custom' => 'CSS Framework: Bootstrap 4 (Custom Forms)',
|
11 |
+
'contact_form_7' => 'Plugin: Contact Form 7 (v5)',
|
12 |
+
'ninja_forms' => 'Plugin: Ninja Forms (v3)',
|
13 |
+
'wpforms' => 'Plugin: WPForms Lite (v1)',
|
14 |
+
'default' => __( 'Site Reviews (default)', 'site-reviews' ),
|
15 |
+
'minimal' => __( 'Site Reviews (minimal)', 'site-reviews' ),
|
16 |
+
'divi' => 'Theme: Divi (v3)',
|
17 |
+
'materialize' => 'Theme: Materialize',
|
18 |
+
'twentyfifteen' => 'Theme: Twenty Fifteen',
|
19 |
+
'twentyseventeen' => 'Theme: Twenty Seventeen',
|
20 |
+
'twentynineteen' => 'Theme: Twenty Nineteen',
|
21 |
+
],
|
22 |
+
'type' => 'select',
|
23 |
+
],
|
24 |
+
'settings.general.require.approval' => [
|
25 |
+
'default' => 'no',
|
26 |
+
'description' => __( 'Set the status of new review submissions to "unapproved".', 'site-reviews' ),
|
27 |
+
'label' => __( 'Require Approval', 'site-reviews' ),
|
28 |
+
'type' => 'yes_no',
|
29 |
+
],
|
30 |
+
'settings.general.require.login' => [
|
31 |
+
'default' => 'no',
|
32 |
+
'description' => __( 'Only allow review submissions from registered users.', 'site-reviews' ),
|
33 |
+
'label' => __( 'Require Login', 'site-reviews' ),
|
34 |
+
'type' => 'yes_no',
|
35 |
+
],
|
36 |
+
'settings.general.require.login_register' => [
|
37 |
+
'default' => 'no',
|
38 |
+
'depends_on' => ['settings.general.require.login' => 'yes'],
|
39 |
+
'description' => sprintf( __( 'Show a link for a new user to register. The %s Membership option must be enabled in General Settings for this to work.', 'site-reviews' ),
|
40 |
+
'<a href="'.admin_url( 'options-general.php#users_can_register' ).'">'.__( 'Anyone can register', 'site-reviews' ).'</a>'
|
41 |
+
),
|
42 |
+
'label' => __( 'Show Registration Link', 'site-reviews' ),
|
43 |
+
'type' => 'yes_no',
|
44 |
+
],
|
45 |
+
'settings.general.support.polylang' => [
|
46 |
+
'default' => 'no',
|
47 |
+
'description' => sprintf( __( 'Integrate with the %s plugin to calculate ratings for all languages of a post.', 'site-reviews' ),
|
48 |
+
'<a href="https://wordpress.org/plugins/polylang/">Polylang</a>'
|
49 |
+
),
|
50 |
+
'label' => __( 'Integrate with Polylang', 'site-reviews' ),
|
51 |
+
'type' => 'yes_no',
|
52 |
+
],
|
53 |
+
'settings.general.notifications' => [
|
54 |
+
'default' => [],
|
55 |
+
'label' => __( 'Notifications', 'site-reviews' ),
|
56 |
+
'options' => [
|
57 |
+
'admin' => __( 'Send to administrator', 'site-reviews' ).' <code>'.(string)get_option( 'admin_email' ).'</code>',
|
58 |
+
'author' => __( 'Send to author of the page that the review is assigned to', 'site-reviews' ),
|
59 |
+
'custom' => __( 'Send to one or more email addresses', 'site-reviews' ),
|
60 |
+
'slack' => __( 'Send to <a href="https://slack.com/">Slack</a>', 'site-reviews' ),
|
61 |
+
],
|
62 |
+
'type' => 'checkbox',
|
63 |
+
],
|
64 |
+
'settings.general.notification_email' => [
|
65 |
+
'default' => '',
|
66 |
+
'depends_on' => ['settings.general.notifications' => ['custom']],
|
67 |
+
'label' => __( 'Send Notification Emails To', 'site-reviews' ),
|
68 |
+
'placeholder' => __( 'Separate multiple emails with a comma', 'site-reviews' ),
|
69 |
+
'type' => 'text',
|
70 |
+
],
|
71 |
+
'settings.general.notification_slack' => [
|
72 |
+
'default' => '',
|
73 |
+
'depends_on' => ['settings.general.notifications' => ['slack']],
|
74 |
+
'description' => sprintf( __( 'To send notifications to Slack, create a new %s and then paste the provided Webhook URL in the field above.', 'site-reviews' ),
|
75 |
+
'<a href="https://api.slack.com/incoming-webhooks">'.__( 'Incoming WebHook', 'site-reviews' ).'</a>'
|
76 |
+
),
|
77 |
+
'label' => __( 'Slack Webhook URL', 'site-reviews' ),
|
78 |
+
'type' => 'text',
|
79 |
+
],
|
80 |
+
'settings.general.notification_message' => [
|
81 |
+
'default' => glsr( 'Modules\Html\Template' )->build( 'templates/email-notification' ),
|
82 |
+
'depends_on' => ['settings.general.notifications' => ['admin', 'author', 'custom', 'slack']],
|
83 |
+
'description' => __(
|
84 |
+
'To restore the default text, save an empty template. '.
|
85 |
+
'If you are sending notifications to Slack then this template will only be used as a fallback in the event that <a href="https://api.slack.com/docs/attachments">Message Attachments</a> have been disabled. Available template tags:'.
|
86 |
+
'<br><code>{review_rating}</code> The review rating number (1-5)'.
|
87 |
+
'<br><code>{review_title}</code> The review title'.
|
88 |
+
'<br><code>{review_content}</code> The review content'.
|
89 |
+
'<br><code>{review_author}</code> The review author'.
|
90 |
+
'<br><code>{review_email}</code> The email of the review author'.
|
91 |
+
'<br><code>{review_ip}</code> The IP address of the review author'.
|
92 |
+
'<br><code>{review_link}</code> The link to edit/view a review',
|
93 |
+
'site-reviews'
|
94 |
+
),
|
95 |
+
'label' => __( 'Notification Template', 'site-reviews' ),
|
96 |
+
'rows' => 10,
|
97 |
+
'type' => 'code',
|
98 |
+
],
|
99 |
+
'settings.reviews.date.format' => [
|
100 |
+
'default' => '',
|
101 |
+
'description' => sprintf( __( 'The default date format is the one set in your %s.', 'site-reviews' ),
|
102 |
+
'<a href="'.admin_url( 'options-general.php#date_format_custom' ).'">'.__( 'WordPress settings', 'site-reviews' ).'</a>'
|
103 |
+
),
|
104 |
+
'label' => __( 'Date Format', 'site-reviews' ),
|
105 |
+
'options' => [
|
106 |
+
'' => __( 'Use the default date format', 'site-reviews' ),
|
107 |
+
'relative' => __( 'Use a relative date format', 'site-reviews' ),
|
108 |
+
'custom' => __( 'Use a custom date format', 'site-reviews' ),
|
109 |
+
],
|
110 |
+
'type' => 'select',
|
111 |
+
],
|
112 |
+
'settings.reviews.date.custom' => [
|
113 |
+
'default' => get_option( 'date_format' ),
|
114 |
+
'depends_on' => ['settings.reviews.date.format' => 'custom'],
|
115 |
+
'description' => __( 'Enter a custom date format (<a href="https://codex.wordpress.org/Formatting_Date_and_Time">documentation on date and time formatting</a>).', 'site-reviews' ),
|
116 |
+
'label' => __( 'Custom Date Format', 'site-reviews' ),
|
117 |
+
'type' => 'text',
|
118 |
+
],
|
119 |
+
'settings.reviews.assigned_links' => [
|
120 |
+
'default' => 'no',
|
121 |
+
'description' => __( 'Display a link to the assigned post of a review.', 'site-reviews' ),
|
122 |
+
'label' => __( 'Enable Assigned Links', 'site-reviews' ),
|
123 |
+
'type' => 'yes_no',
|
124 |
+
],
|
125 |
+
'settings.reviews.avatars' => [
|
126 |
+
'default' => 'no',
|
127 |
+
'description' => __( 'Display reviewer avatars. These are generated from the email address of the reviewer using <a href="https://gravatar.com">Gravatar</a>.', 'site-reviews' ),
|
128 |
+
'label' => __( 'Enable Avatars', 'site-reviews' ),
|
129 |
+
'type' => 'yes_no',
|
130 |
+
],
|
131 |
+
'settings.reviews.avatars_regenerate' => [
|
132 |
+
'default' => 'no',
|
133 |
+
'depends_on' => ['settings.reviews.avatars' => 'yes'],
|
134 |
+
'description' => __( 'Regenerate the avatar whenever a local review is shown?', 'site-reviews' ),
|
135 |
+
'label' => __( 'Regenerate Avatars', 'site-reviews' ),
|
136 |
+
'type' => 'yes_no',
|
137 |
+
],
|
138 |
+
'settings.reviews.avatars_size' => [
|
139 |
+
'default' => 40,
|
140 |
+
'depends_on' => ['settings.reviews.avatars' => 'yes'],
|
141 |
+
'description' => __( 'Set the avatar size in pixels.', 'site-reviews' ),
|
142 |
+
'label' => __( 'Avatar Size', 'site-reviews' ),
|
143 |
+
'type' => 'number',
|
144 |
+
],
|
145 |
+
'settings.reviews.excerpts' => [
|
146 |
+
'default' => 'yes',
|
147 |
+
'description' => __( 'Display an excerpt instead of the full review.', 'site-reviews' ),
|
148 |
+
'label' => __( 'Enable Excerpts', 'site-reviews' ),
|
149 |
+
'type' => 'yes_no',
|
150 |
+
],
|
151 |
+
'settings.reviews.excerpts_length' => [
|
152 |
+
'default' => 55,
|
153 |
+
'depends_on' => ['settings.reviews.excerpts' => 'yes'],
|
154 |
+
'description' => __( 'Set the excerpt word length.', 'site-reviews' ),
|
155 |
+
'label' => __( 'Excerpt Length', 'site-reviews' ),
|
156 |
+
'type' => 'number',
|
157 |
+
],
|
158 |
+
'settings.reviews.fallback' => [
|
159 |
+
'default' => 'no',
|
160 |
+
'description' => sprintf( __( 'Display the fallback text when there are no reviews to display. This can be changed on the %s page. You may also override this by using the "fallback" option on the shortcode. The default fallback text is: %s', 'site-reviews' ),
|
161 |
+
'<a href="'.admin_url( 'edit.php?post_type=site-review&page=settings#!translations' ).'">'.__( 'Translations', 'site-reviews' ).'</a>',
|
162 |
+
'<code>'.__( 'There are no reviews yet. Be the first one to write one.', 'site-reviews' ).'</code>'
|
163 |
+
),
|
164 |
+
'label' => __( 'Enable Fallback Text', 'site-reviews' ),
|
165 |
+
'type' => 'yes_no',
|
166 |
+
],
|
167 |
+
'settings.schema.type.default' => [
|
168 |
+
'default' => 'LocalBusiness',
|
169 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_type</code>',
|
170 |
+
'label' => __( 'Default Schema Type', 'site-reviews' ),
|
171 |
+
'options' => [
|
172 |
+
'LocalBusiness' => __( 'Local Business', 'site-reviews' ),
|
173 |
+
'Product' => __( 'Product', 'site-reviews' ),
|
174 |
+
'custom' => __( 'Custom', 'site-reviews' ),
|
175 |
+
],
|
176 |
+
'type' => 'select',
|
177 |
+
],
|
178 |
+
'settings.schema.type.custom' => [
|
179 |
+
'default' => '',
|
180 |
+
'depends_on' => ['settings.schema.type.default' => 'custom'],
|
181 |
+
'description' => '<a href="https://schema.org/docs/schemas.html">'.__( 'View more information on schema types here', 'site-reviews' ).'</a>',
|
182 |
+
'label' => __( 'Custom Schema Type', 'site-reviews' ),
|
183 |
+
'type' => 'text',
|
184 |
+
],
|
185 |
+
'settings.schema.name.default' => [
|
186 |
+
'default' => 'post',
|
187 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_name</code>',
|
188 |
+
'label' => __( 'Default Name', 'site-reviews' ),
|
189 |
+
'options' => [
|
190 |
+
'post' => __( 'Use the assigned or current page title', 'site-reviews' ),
|
191 |
+
'custom' => __( 'Enter a custom title', 'site-reviews' ),
|
192 |
+
],
|
193 |
+
'type' => 'select',
|
194 |
+
],
|
195 |
+
'settings.schema.name.custom' => [
|
196 |
+
'default' => '',
|
197 |
+
'depends_on' => ['settings.schema.name.default' => 'custom'],
|
198 |
+
'label' => __( 'Custom Name', 'site-reviews' ),
|
199 |
+
'type' => 'text',
|
200 |
+
],
|
201 |
+
'settings.schema.description.default' => [
|
202 |
+
'default' => 'post',
|
203 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_description</code>',
|
204 |
+
'label' => __( 'Default Description', 'site-reviews' ),
|
205 |
+
'options' => [
|
206 |
+
'post' => __( 'Use the assigned or current page excerpt', 'site-reviews' ),
|
207 |
+
'custom' => __( 'Enter a custom description', 'site-reviews' ),
|
208 |
+
],
|
209 |
+
'type' => 'select',
|
210 |
+
],
|
211 |
+
'settings.schema.description.custom' => [
|
212 |
+
'default' => '',
|
213 |
+
'depends_on' => ['settings.schema.description.default' => 'custom'],
|
214 |
+
'label' => __( 'Custom Description', 'site-reviews' ),
|
215 |
+
'type' => 'text',
|
216 |
+
],
|
217 |
+
'settings.schema.url.default' => [
|
218 |
+
'default' => 'post',
|
219 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_url</code>',
|
220 |
+
'label' => __( 'Default URL', 'site-reviews' ),
|
221 |
+
'options' => [
|
222 |
+
'post' => __( 'Use the assigned or current page URL', 'site-reviews' ),
|
223 |
+
'custom' => __( 'Enter a custom URL', 'site-reviews' ),
|
224 |
+
],
|
225 |
+
'type' => 'select',
|
226 |
+
],
|
227 |
+
'settings.schema.url.custom' => [
|
228 |
+
'default' => '',
|
229 |
+
'depends_on' => ['settings.schema.url.default' => 'custom'],
|
230 |
+
'label' => __( 'Custom URL', 'site-reviews' ),
|
231 |
+
'type' => 'text',
|
232 |
+
],
|
233 |
+
'settings.schema.image.default' => [
|
234 |
+
'default' => 'post',
|
235 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_image</code>',
|
236 |
+
'label' => __( 'Default Image', 'site-reviews' ),
|
237 |
+
'options' => [
|
238 |
+
'post' => __( 'Use the featured image of the assigned or current page', 'site-reviews' ),
|
239 |
+
'custom' => __( 'Enter a custom image URL', 'site-reviews' ),
|
240 |
+
],
|
241 |
+
'type' => 'select',
|
242 |
+
],
|
243 |
+
'settings.schema.image.custom' => [
|
244 |
+
'default' => '',
|
245 |
+
'depends_on' => ['settings.schema.image.default' => 'custom'],
|
246 |
+
'label' => __( 'Custom Image URL', 'site-reviews' ),
|
247 |
+
'type' => 'text',
|
248 |
+
],
|
249 |
+
'settings.schema.address' => [
|
250 |
+
'default' => '',
|
251 |
+
'depends_on' => ['settings.schema.type.default' => 'LocalBusiness'],
|
252 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_address</code>',
|
253 |
+
'label' => __( 'Address', 'site-reviews' ),
|
254 |
+
'placeholder' => '60 29th Street #343, San Francisco, CA 94110, US',
|
255 |
+
'type' => 'text',
|
256 |
+
],
|
257 |
+
'settings.schema.telephone' => [
|
258 |
+
'default' => '',
|
259 |
+
'depends_on' => ['settings.schema.type.default' => 'LocalBusiness'],
|
260 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_telephone</code>',
|
261 |
+
'label' => __( 'Telephone Number', 'site-reviews' ),
|
262 |
+
'placeholder' => '+1 (877) 273-3049',
|
263 |
+
'type' => 'text',
|
264 |
+
],
|
265 |
+
'settings.schema.pricerange' => [
|
266 |
+
'default' => '',
|
267 |
+
'depends_on' => ['settings.schema.type.default' => 'LocalBusiness'],
|
268 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_pricerange</code>',
|
269 |
+
'label' => __( 'Price Range', 'site-reviews' ),
|
270 |
+
'placeholder' => '$$-$$$',
|
271 |
+
'type' => 'text',
|
272 |
+
],
|
273 |
+
'settings.schema.lowprice' => [
|
274 |
+
'default' => '',
|
275 |
+
'depends_on' => ['settings.schema.type.default' => 'Product'],
|
276 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_lowprice</code>',
|
277 |
+
'label' => __( 'Low Price', 'site-reviews' ),
|
278 |
+
'placeholder' => '10.00',
|
279 |
+
'type' => 'text',
|
280 |
+
],
|
281 |
+
'settings.schema.highprice' => [
|
282 |
+
'default' => '',
|
283 |
+
'depends_on' => ['settings.schema.type.default' => 'Product'],
|
284 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_highprice</code>',
|
285 |
+
'label' => __( 'High Price', 'site-reviews' ),
|
286 |
+
'placeholder' => '100.00',
|
287 |
+
'type' => 'text',
|
288 |
+
],
|
289 |
+
'settings.schema.pricecurrency' => [
|
290 |
+
'default' => '',
|
291 |
+
'depends_on' => ['settings.schema.type.default' => 'Product'],
|
292 |
+
'description' => __( 'Custom Field name', 'site-reviews' ).': <code>schema_pricecurrency</code>',
|
293 |
+
'label' => __( 'Price Currency', 'site-reviews' ),
|
294 |
+
'placeholder' => 'USD',
|
295 |
+
'type' => 'text',
|
296 |
+
],
|
297 |
+
'settings.submissions.required' => [
|
298 |
+
'default' => ['content', 'email', 'name', 'rating', 'terms', 'title'],
|
299 |
+
'description' => __( 'Choose which fields should be required in the submission form.', 'site-reviews' ),
|
300 |
+
'label' => __( 'Required Fields', 'site-reviews' ),
|
301 |
+
'options' => [
|
302 |
+
'rating' => __( 'Rating', 'site-reviews' ),
|
303 |
+
'title' => __( 'Title', 'site-reviews' ),
|
304 |
+
'content' => __( 'Review', 'site-reviews' ),
|
305 |
+
'name' => __( 'Name', 'site-reviews' ),
|
306 |
+
'email' => __( 'Email', 'site-reviews' ),
|
307 |
+
'terms' => __( 'Terms', 'site-reviews' ),
|
308 |
+
],
|
309 |
+
'type' => 'checkbox',
|
310 |
+
],
|
311 |
+
'settings.submissions.recaptcha.integration' => [
|
312 |
+
'default' => '',
|
313 |
+
'description' => __( 'Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you will need to <a href="https://www.google.com/recaptcha/admin" target="_blank">sign up</a> for an API key pair for your site.', 'site-reviews' ),
|
314 |
+
'label' => __( 'Invisible reCAPTCHA', 'site-reviews' ),
|
315 |
+
'options' => [
|
316 |
+
'' => 'Do not use reCAPTCHA',
|
317 |
+
'all' => 'Use reCAPTCHA',
|
318 |
+
'guest' => 'Use reCAPTCHA only for guest users',
|
319 |
+
],
|
320 |
+
'type' => 'select',
|
321 |
+
],
|
322 |
+
'settings.submissions.recaptcha.key' => [
|
323 |
+
'default' => '',
|
324 |
+
'depends_on' => ['settings.submissions.recaptcha.integration' => ['all', 'guest']],
|
325 |
+
'label' => __( 'Site Key', 'site-reviews' ),
|
326 |
+
'type' => 'text',
|
327 |
+
],
|
328 |
+
'settings.submissions.recaptcha.secret' => [
|
329 |
+
'default' => '',
|
330 |
+
'depends_on' => ['settings.submissions.recaptcha.integration' => ['all', 'guest']],
|
331 |
+
'label' => __( 'Site Secret', 'site-reviews' ),
|
332 |
+
'type' => 'text',
|
333 |
+
],
|
334 |
+
'settings.submissions.recaptcha.position' => [
|
335 |
+
'default' => 'bottomleft',
|
336 |
+
'depends_on' => ['settings.submissions.recaptcha.integration' => ['all', 'guest']],
|
337 |
+
'description' => __( 'This option may not work consistently if another plugin is loading reCAPTCHA on the same page as Site Reviews.', 'site-reviews' ),
|
338 |
+
'label' => __( 'Badge Position', 'site-reviews' ),
|
339 |
+
'options' => [
|
340 |
+
'bottomleft' => 'Bottom Left',
|
341 |
+
'bottomright' => 'Bottom Right',
|
342 |
+
'inline' => 'Inline',
|
343 |
+
],
|
344 |
+
'type' => 'select',
|
345 |
+
],
|
346 |
+
'settings.submissions.akismet' => [
|
347 |
+
'default' => 'no',
|
348 |
+
'description' => __( 'The <a href="https://akismet.com" target="_blank">Akismet plugin</a> integration provides spam-filtering for your reviews. In order for this setting to have any affect, you will need to first install and activate the Akismet plugin and set up a WordPress.com API key.', 'site-reviews' ),
|
349 |
+
'label' => __( 'Enable Akismet Integration', 'site-reviews' ),
|
350 |
+
'type' => 'yes_no',
|
351 |
+
],
|
352 |
+
'settings.submissions.blacklist.entries' => [
|
353 |
+
'default' => '',
|
354 |
+
'description' => __( 'When a review contains any of these words in its title, content, name, email, or IP address, it will be rejected. One word or IP address per line. It will match inside words, so "press" will match "WordPress".', 'site-reviews' ),
|
355 |
+
'label' => __( 'Review Blacklist', 'site-reviews' ),
|
356 |
+
'rows' => 10,
|
357 |
+
'type' => 'code',
|
358 |
+
],
|
359 |
+
'settings.submissions.blacklist.action' => [
|
360 |
+
'default' => 'unapprove',
|
361 |
+
'description' => __( 'Choose the action that should be taken when a review is blacklisted.', 'site-reviews' ),
|
362 |
+
'label' => __( 'Blacklist Action', 'site-reviews' ),
|
363 |
+
'options' => [
|
364 |
+
'unapprove' => __( 'Require approval', 'site-reviews' ),
|
365 |
+
'reject' => __( 'Reject submission', 'site-reviews' ),
|
366 |
+
],
|
367 |
+
'type' => 'select',
|
368 |
+
],
|
369 |
+
];
|
config/styles/bootstrap_4.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'input' => 'form-control',
|
6 |
+
'input_checkbox' => 'form-check-input',
|
7 |
+
'input_radio' => 'form-check-input',
|
8 |
+
'label_checkbox' => 'form-check-label',
|
9 |
+
'label_radio' => 'form-check-label',
|
10 |
+
'select' => 'form-control',
|
11 |
+
'textarea' => 'form-control',
|
12 |
+
],
|
13 |
+
'validation' => [
|
14 |
+
'error_tag' => 'div',
|
15 |
+
'error_tag_class' => 'invalid-feedback',
|
16 |
+
'field_class' => 'form-group',
|
17 |
+
'input_error_class' => 'is-invalid',
|
18 |
+
],
|
19 |
+
];
|
config/styles/bootstrap_4_custom.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'input' => 'form-control',
|
6 |
+
'input_checkbox' => 'custom-control-input',
|
7 |
+
'input_radio' => 'custom-control-input',
|
8 |
+
'label_checkbox' => 'custom-control-label',
|
9 |
+
'label_radio' => 'custom-control-label',
|
10 |
+
'select' => 'form-control',
|
11 |
+
'textarea' => 'form-control',
|
12 |
+
],
|
13 |
+
'validation' => [
|
14 |
+
'error_tag' => 'div',
|
15 |
+
'error_tag_class' => 'invalid-feedback',
|
16 |
+
'field_class' => 'form-group',
|
17 |
+
'input_error_class' => 'is-invalid',
|
18 |
+
],
|
19 |
+
];
|
config/styles/contact_form_7.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'input' => 'wpcf7-form-control',
|
6 |
+
'input_text' => 'wpcf7-form-control wpcf7-text',
|
7 |
+
'input_email' => 'wpcf7-form-control wpcf7-text wpcf7-email',
|
8 |
+
'select' => 'wpcf7-form-control wpcf7-select',
|
9 |
+
'textarea' => 'wpcf7-form-control wpcf7-textarea',
|
10 |
+
],
|
11 |
+
'validation' => [
|
12 |
+
'error_tag' => 'span',
|
13 |
+
'error_tag_class' => 'wpcf7-not-valid-tip',
|
14 |
+
'input_error_class' => 'wpcf7-not-valid',
|
15 |
+
'message_initial_class' => 'wpcf7-display-none',
|
16 |
+
'message_success_class' => 'wpcf7-mail-sent-ok',
|
17 |
+
'message_tag_class' => 'wpcf7-response-output',
|
18 |
+
],
|
19 |
+
];
|
config/styles/divi.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'label' => 'et_pb_contact_form_label',
|
6 |
+
],
|
7 |
+
];
|
config/styles/materialize.php
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'select' => 'browser-default',
|
6 |
+
'textarea' => 'materialize-textarea',
|
7 |
+
],
|
8 |
+
'pagination' => [
|
9 |
+
'type' => 'list',
|
10 |
+
],
|
11 |
+
'validation' => [
|
12 |
+
'error_tag' => 'span',
|
13 |
+
'input_error_class' => 'wpcf7-not-valid',
|
14 |
+
'error_tag_class' => 'wpcf7-not-valid-tip',
|
15 |
+
'input_error_class' => 'wpcf7-not-valid',
|
16 |
+
'message_tag_class' => 'wpcf7-response-output',
|
17 |
+
],
|
18 |
+
];
|
config/styles/ninja_forms.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'input' => 'ninja-forms-field nf-element',
|
6 |
+
'textarea' => 'ninja-forms-field nf-element',
|
7 |
+
],
|
8 |
+
];
|
config/styles/wpforms.php
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return [
|
4 |
+
'fields' => [
|
5 |
+
'input' => 'wpforms-field-large',
|
6 |
+
'label' => 'wpforms-field-label',
|
7 |
+
'label_checkbox' => 'wpforms-field-label-inline',
|
8 |
+
'label_radio' => 'wpforms-field-label-inline',
|
9 |
+
'select' => 'wpforms-field-large',
|
10 |
+
'textarea' => 'wpforms-field-large',
|
11 |
+
],
|
12 |
+
];
|
deprecated.php
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
defined( 'WPINC' ) || die;
|
4 |
+
|
5 |
+
// Database/ReviewManager.php
|
6 |
+
add_action( 'site-reviews/review/created', function( $review ) {
|
7 |
+
if( has_action( 'site-reviews/local/review/create' )) {
|
8 |
+
glsr()->deprecated[] = 'The "site-reviews/local/review/create" hook has been deprecated. Please use the "site-reviews/review/created" hook instead.';
|
9 |
+
do_action( 'site-reviews/local/review/create', (array)get_post( $review->ID ), (array)$review, $review->ID );
|
10 |
+
}
|
11 |
+
}, 9 );
|
12 |
+
|
13 |
+
// Handlers/CreateReview.php
|
14 |
+
add_action( 'site-reviews/review/submitted', function( $review ) {
|
15 |
+
if( has_action( 'site-reviews/local/review/submitted' )) {
|
16 |
+
glsr()->deprecated[] = 'The "site-reviews/local/review/submitted" hook has been deprecated. Please use the "site-reviews/review/submitted" hook instead.';
|
17 |
+
do_action( 'site-reviews/local/review/submitted', null, $review );
|
18 |
+
}
|
19 |
+
if( has_filter( 'site-reviews/local/review/submitted/message' )) {
|
20 |
+
glsr()->deprecated[] = 'The "site-reviews/local/review/submitted/message" hook has been deprecated.';
|
21 |
+
}
|
22 |
+
}, 9 );
|
23 |
+
|
24 |
+
// Database/ReviewManager.php
|
25 |
+
add_filter( 'site-reviews/create/review-values', function( $values, $command ) {
|
26 |
+
if( has_filter( 'site-reviews/local/review' )) {
|
27 |
+
glsr()->deprecated[] = 'The "site-reviews/local/review" hook has been deprecated. Please use the "site-reviews/create/review-values" hook instead.';
|
28 |
+
return apply_filters( 'site-reviews/local/review', $values, $command );
|
29 |
+
}
|
30 |
+
return $values;
|
31 |
+
}, 9, 2 );
|
32 |
+
|
33 |
+
// Handlers/EnqueuePublicAssets.php
|
34 |
+
add_filter( 'site-reviews/enqueue/public/localize', function( $variables ) {
|
35 |
+
if( has_filter( 'site-reviews/enqueue/localize' )) {
|
36 |
+
glsr()->deprecated[] = 'The "site-reviews/enqueue/localize" hook has been deprecated. Please use the "site-reviews/enqueue/public/localize" hook instead.';
|
37 |
+
return apply_filters( 'site-reviews/enqueue/localize', $variables );
|
38 |
+
}
|
39 |
+
return $variables;
|
40 |
+
}, 9 );
|
41 |
+
|
42 |
+
// Modules/Rating.php
|
43 |
+
add_filter( 'site-reviews/rating/average', function( $average ) {
|
44 |
+
if( has_filter( 'site-reviews/average/rating' )) {
|
45 |
+
glsr()->deprecated[] = 'The "site-reviews/average/rating" hook has been deprecated. Please use the "site-reviews/rating/average" hook instead.';
|
46 |
+
}
|
47 |
+
return $average;
|
48 |
+
}, 9 );
|
49 |
+
|
50 |
+
// Modules/Rating.php
|
51 |
+
add_filter( 'site-reviews/rating/ranking', function( $ranking ) {
|
52 |
+
if( has_filter( 'site-reviews/bayesian/ranking' )) {
|
53 |
+
glsr()->deprecated[] = 'The "site-reviews/bayesian/ranking" hook has been deprecated. Please use the "site-reviews/rating/ranking" hook instead.';
|
54 |
+
}
|
55 |
+
return $ranking;
|
56 |
+
}, 9 );
|
57 |
+
|
58 |
+
// Modules/Html/Partials/SiteReviews.php
|
59 |
+
add_filter( 'site-reviews/review/build/after', function( $renderedFields ) {
|
60 |
+
if( has_filter( 'site-reviews/reviews/review/text' )) {
|
61 |
+
glsr()->deprecated[] = 'The "site-reviews/reviews/review/text" hook has been deprecated. Please use the "site-reviews/review/build/after" hook instead.';
|
62 |
+
}
|
63 |
+
if( has_filter( 'site-reviews/reviews/review/title' )) {
|
64 |
+
glsr()->deprecated[] = 'The "site-reviews/reviews/review/title" hook has been deprecated. Please use the "site-reviews/review/build/after" hook instead.';
|
65 |
+
}
|
66 |
+
return $renderedFields;
|
67 |
+
}, 9 );
|
68 |
+
|
69 |
+
// Modules/Html/Partials/SiteReviews.php
|
70 |
+
add_filter( 'site-reviews/review/build/before', function( $review ) {
|
71 |
+
if( has_filter( 'site-reviews/rendered/review' )) {
|
72 |
+
glsr()->deprecated[] = 'The "site-reviews/rendered/review" hook has been deprecated. Please either use a custom "review.php" template (refer to the documentation), or use the "site-reviews/review/build/after" hook instead.';
|
73 |
+
}
|
74 |
+
if( has_filter( 'site-reviews/rendered/review/meta/order' )) {
|
75 |
+
glsr()->deprecated[] = 'The "site-reviews/rendered/review/meta/order" hook has been deprecated. Please use a custom "review.php" template instead (refer to the documentation).';
|
76 |
+
}
|
77 |
+
if( has_filter( 'site-reviews/rendered/review/order' )) {
|
78 |
+
glsr()->deprecated[] = 'The "site-reviews/rendered/review/order" hook has been deprecated. Please use a custom "review.php" template instead (refer to the documentation).';
|
79 |
+
}
|
80 |
+
if( has_filter( 'site-reviews/rendered/review-form/login-register' )) {
|
81 |
+
glsr()->deprecated[] = 'The "site-reviews/rendered/review-form/login-register" hook has been deprecated. Please use a custom "login-register.php" template instead (refer to the documentation).';
|
82 |
+
}
|
83 |
+
if( has_filter( 'site-reviews/reviews/navigation_links' )) {
|
84 |
+
glsr()->deprecated[] = 'The "site-reviews/reviews/navigation_links" hook has been deprecated. Please use a custom "pagination.php" template instead (refer to the documentation).';
|
85 |
+
}
|
86 |
+
return $review;
|
87 |
+
}, 9 );
|
88 |
+
|
89 |
+
add_filter( 'site-reviews/validate/custom', function( $result, $request ) {
|
90 |
+
if( has_filter( 'site-reviews/validate/review/submission' )) {
|
91 |
+
glsr_log()->notice( 'The "site-reviews/validate/review/submission" hook has been deprecated. Please use the "site-reviews/validate/custom" hook instead.' );
|
92 |
+
return apply_filters( 'site-reviews/validate/review/submission', $result, $request );
|
93 |
+
}
|
94 |
+
return $result;
|
95 |
+
}, 9, 2 );
|
96 |
+
|
97 |
+
add_filter( 'site-reviews/views/file', function( $file, $view, $data ) {
|
98 |
+
if( has_filter( 'site-reviews/addon/views/file' )) {
|
99 |
+
glsr()->deprecated[] = 'The "site-reviews/addon/views/file" hook has been deprecated. Please use the "site-reviews/views/file" hook instead.';
|
100 |
+
$file = apply_filters( 'site-reviews/addon/views/file', $file, $view, $data );
|
101 |
+
}
|
102 |
+
return $file;
|
103 |
+
}, 9, 3 );
|
104 |
+
|
105 |
+
add_action( 'wp_footer', function() {
|
106 |
+
$notices = array_keys( array_flip( glsr()->deprecated ));
|
107 |
+
natsort( $notices );
|
108 |
+
foreach( $notices as $notice ) {
|
109 |
+
glsr_log()->notice( $notice );
|
110 |
+
apply_filters( 'console', $notice ); // Show in Blackbar plugin if installed
|
111 |
+
}
|
112 |
+
});
|
113 |
+
|
helpers.php
CHANGED
@@ -1,119 +1,166 @@
|
|
1 |
<?php
|
|
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
* @
|
7 |
-
* @
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
15 |
|
16 |
/**
|
17 |
-
*
|
18 |
-
*
|
19 |
-
* @return
|
20 |
*/
|
21 |
-
function
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
24 |
|
25 |
/**
|
26 |
-
* Global helper to debug variables
|
27 |
-
*
|
28 |
* @return void
|
29 |
*/
|
30 |
-
function
|
31 |
-
|
|
|
32 |
}
|
33 |
|
34 |
/**
|
35 |
-
*
|
36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
* @return void
|
38 |
*/
|
39 |
-
function
|
40 |
-
|
41 |
-
|
42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
}
|
44 |
-
App::load()->make( 'Log\Logger' )->log( $level, $message );
|
45 |
}
|
46 |
|
47 |
/**
|
48 |
-
*
|
49 |
-
*
|
50 |
-
* @param string $option_path
|
51 |
* @param mixed $fallback
|
52 |
-
* @return
|
53 |
*/
|
54 |
-
function glsr_get_option( $
|
55 |
-
return
|
|
|
|
|
56 |
}
|
57 |
|
58 |
/**
|
59 |
-
* Global helper to get all plugin options
|
60 |
-
*
|
61 |
* @return array
|
62 |
*/
|
63 |
function glsr_get_options() {
|
64 |
-
return
|
65 |
}
|
66 |
|
67 |
/**
|
68 |
-
* Global helper to get a single review
|
69 |
-
*
|
70 |
* @param int $post_id
|
71 |
-
* @return
|
72 |
*/
|
73 |
function glsr_get_review( $post_id ) {
|
74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
}
|
76 |
|
77 |
/**
|
78 |
-
* Global helper to get an array of reviews
|
79 |
-
*
|
80 |
* @return array
|
81 |
*/
|
82 |
-
function glsr_get_reviews(
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
* Global helper to resolve a class instance where $app is not accessible
|
88 |
-
*
|
89 |
-
* @param string $alias
|
90 |
-
* @return class
|
91 |
-
*/
|
92 |
-
function glsr_resolve( $alias ) {
|
93 |
-
return App::load()->make( $alias );
|
94 |
}
|
95 |
|
96 |
/**
|
97 |
-
*
|
98 |
-
*
|
99 |
-
* This function prevents the taxonomy object from containing class recursion
|
100 |
-
*
|
101 |
-
* @return void
|
102 |
*/
|
103 |
-
function
|
104 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
}
|
106 |
|
107 |
/**
|
108 |
-
*
|
109 |
-
*
|
110 |
-
* @return WP_Screen|null
|
111 |
*/
|
112 |
-
function
|
113 |
-
|
114 |
-
$screen = get_current_screen();
|
115 |
-
}
|
116 |
-
return empty( $screen )
|
117 |
-
? (object)array_fill_keys( ['base', 'id', 'post_type', 'parent_base'], null )
|
118 |
-
: $screen;
|
119 |
}
|
1 |
<?php
|
2 |
+
defined( 'WPINC' ) || die;
|
3 |
|
4 |
/**
|
5 |
+
* Alternate method of using the functions without having to use `function_exists()`
|
6 |
+
* Example: apply_filters( 'glsr_get_reviews', [], ['assigned_to' => 'post_id'] );
|
7 |
+
* @param mixed ...
|
8 |
+
* @return mixed
|
|
|
9 |
*/
|
10 |
+
add_filter( 'all', function() {
|
11 |
+
$args = func_get_args();
|
12 |
+
$hook = array_shift( $args );
|
13 |
+
$hooks = array(
|
14 |
+
'glsr',
|
15 |
+
'glsr_calculate_ratings',
|
16 |
+
'glsr_create_review',
|
17 |
+
'glsr_debug',
|
18 |
+
'glsr_get_option', 'glsr_get_options',
|
19 |
+
'glsr_get_review', 'glsr_get_reviews',
|
20 |
+
'glsr_log',
|
21 |
+
'glsr_star_rating',
|
22 |
+
);
|
23 |
+
if( !in_array( $hook, $hooks ) || !function_exists( $hook ))return;
|
24 |
+
add_filter( $hook, function() use( $hook, $args ) {
|
25 |
+
array_shift( $args ); // remove the fallback value
|
26 |
+
return call_user_func_array( $hook, $args );
|
27 |
+
});
|
28 |
+
});
|
29 |
|
30 |
+
/**
|
31 |
+
* @return mixed
|
32 |
+
*/
|
33 |
+
function glsr( $alias = null ) {
|
34 |
+
$app = \GeminiLabs\SiteReviews\Application::load();
|
35 |
+
return !empty( $alias )
|
36 |
+
? $app->make( $alias )
|
37 |
+
: $app;
|
38 |
+
}
|
39 |
|
40 |
/**
|
41 |
+
* array_column() alternative specifically for PHP v7.0.x
|
42 |
+
* @param $column string
|
43 |
+
* @return array
|
44 |
*/
|
45 |
+
function glsr_array_column( array $array, $column ) {
|
46 |
+
$result = array();
|
47 |
+
foreach( $array as $subarray ) {
|
48 |
+
$subarray = (array)$subarray;
|
49 |
+
if( !isset( $subarray[$column] ))continue;
|
50 |
+
$result[] = $subarray[$column];
|
51 |
+
}
|
52 |
+
return $result;
|
53 |
}
|
54 |
|
55 |
/**
|
|
|
|
|
56 |
* @return void
|
57 |
*/
|
58 |
+
function glsr_calculate_ratings() {
|
59 |
+
glsr( 'Controllers\AdminController' )->routerCountReviews( false );
|
60 |
+
glsr_log()->info( __( 'Recalculated rating counts.', 'site-reviews' ));
|
61 |
}
|
62 |
|
63 |
/**
|
64 |
+
* @return \GeminiLabs\SiteReviews\Review|false
|
65 |
+
*/
|
66 |
+
function glsr_create_review( $reviewValues = array() ) {
|
67 |
+
if( !is_array( $reviewValues )) {
|
68 |
+
$reviewValues = array();
|
69 |
+
}
|
70 |
+
$review = new \GeminiLabs\SiteReviews\Commands\CreateReview( $reviewValues );
|
71 |
+
return glsr( 'Database\ReviewManager' )->create( $review );
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @return \WP_Screen|object
|
76 |
+
*/
|
77 |
+
function glsr_current_screen() {
|
78 |
+
if( function_exists( 'get_current_screen' )) {
|
79 |
+
$screen = get_current_screen();
|
80 |
+
}
|
81 |
+
return empty( $screen )
|
82 |
+
? (object)array_fill_keys( ['base', 'id', 'post_type'], null )
|
83 |
+
: $screen;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* @param mixed ...$vars
|
88 |
* @return void
|
89 |
*/
|
90 |
+
function glsr_debug( ...$vars ) {
|
91 |
+
if( count( $vars ) == 1 ) {
|
92 |
+
$value = htmlspecialchars( print_r( $vars[0], true ), ENT_QUOTES, 'UTF-8' );
|
93 |
+
printf( '<div class="glsr-debug"><pre>%s</pre></div>', $value );
|
94 |
+
}
|
95 |
+
else {
|
96 |
+
echo '<div class="glsr-debug-group">';
|
97 |
+
foreach( $vars as $var ) {
|
98 |
+
glsr_debug( $var );
|
99 |
+
}
|
100 |
+
echo '</div>';
|
101 |
}
|
|
|
102 |
}
|
103 |
|
104 |
/**
|
105 |
+
* @param string $path
|
|
|
|
|
106 |
* @param mixed $fallback
|
107 |
+
* @return string|array
|
108 |
*/
|
109 |
+
function glsr_get_option( $path = '', $fallback = '' ) {
|
110 |
+
return is_string( $path )
|
111 |
+
? glsr( 'Database\OptionManager' )->get( 'settings.'.$path, $fallback )
|
112 |
+
: $fallback;
|
113 |
}
|
114 |
|
115 |
/**
|
|
|
|
|
116 |
* @return array
|
117 |
*/
|
118 |
function glsr_get_options() {
|
119 |
+
return glsr( 'Database\OptionManager' )->get( 'settings' );
|
120 |
}
|
121 |
|
122 |
/**
|
|
|
|
|
123 |
* @param int $post_id
|
124 |
+
* @return \GeminiLabs\SiteReviews\Review
|
125 |
*/
|
126 |
function glsr_get_review( $post_id ) {
|
127 |
+
$post = null;
|
128 |
+
if( is_numeric( $post_id )) {
|
129 |
+
$post = get_post( $post_id );
|
130 |
+
}
|
131 |
+
if( !( $post instanceof WP_Post )) {
|
132 |
+
$post = new WP_Post( (object)[] );
|
133 |
+
}
|
134 |
+
return glsr( 'Database\ReviewManager' )->single( $post );
|
135 |
}
|
136 |
|
137 |
/**
|
|
|
|
|
138 |
* @return array
|
139 |
*/
|
140 |
+
function glsr_get_reviews( $args = array() ) {
|
141 |
+
if( !is_array( $args )) {
|
142 |
+
$args = [];
|
143 |
+
}
|
144 |
+
return glsr( 'Database\ReviewManager' )->get( $args );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
}
|
146 |
|
147 |
/**
|
148 |
+
* @return \GeminiLabs\SiteReviews\Modules\Console
|
|
|
|
|
|
|
|
|
149 |
*/
|
150 |
+
function glsr_log() {
|
151 |
+
$args = func_get_args();
|
152 |
+
$context = isset( $args[1] )
|
153 |
+
? $args[1]
|
154 |
+
: [];
|
155 |
+
$console = glsr( 'Modules\Console' );
|
156 |
+
return !empty( $args )
|
157 |
+
? $console->log( 'debug', $args[0], $context )
|
158 |
+
: $console;
|
159 |
}
|
160 |
|
161 |
/**
|
162 |
+
* @return string
|
|
|
|
|
163 |
*/
|
164 |
+
function glsr_star_rating( $rating ) {
|
165 |
+
return glsr( 'Modules\Html\Partial' )->build( 'star-rating', ['rating' => $rating] );
|
|
|
|
|
|
|
|
|
|
|
166 |
}
|
languages/readme.txt
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
== Site Reviews i18n ==
|
2 |
-
|
3 |
-
Do not put custom translations here as they will be deleted on plugin updates. Instead, put custom translations in /wp-content/languages/site-reviews/
|
4 |
-
|
5 |
-
If you would like to translate or improve a translation, email: site-reviews@geminilabs.io
|
|
|
|
|
|
|
|
|
|
languages/site-reviews-en_US.mo
CHANGED
Binary file
|
languages/site-reviews-en_US.po
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
# Copyright (C)
|
2 |
# This file is distributed under the same license as the site-reviews package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
@@ -52,81 +52,51 @@ msgstr "Update WordPress"
|
|
52 |
msgid "You can use the %s plugin to restore %s to the previous version."
|
53 |
msgstr "You can use the %s plugin to restore %s to the previous version."
|
54 |
|
55 |
-
#: plugin/
|
56 |
-
msgid "
|
57 |
-
msgstr "
|
58 |
|
59 |
-
#:
|
60 |
-
msgid "
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
msgid "%s minute ago"
|
71 |
-
msgid_plural "%s minutes ago"
|
72 |
-
msgstr[0] "%s minute ago"
|
73 |
-
msgstr[1] "%s minutes ago"
|
74 |
-
|
75 |
-
#: plugin/Date.php:46
|
76 |
-
msgid "an hour ago"
|
77 |
-
msgid_plural "%s hours ago"
|
78 |
-
msgstr[0] "an hour ago"
|
79 |
-
msgstr[1] "%s hours ago"
|
80 |
-
|
81 |
-
#: plugin/Date.php:47
|
82 |
-
msgid "yesterday"
|
83 |
-
msgid_plural "%s days ago"
|
84 |
-
msgstr[0] "yesterday"
|
85 |
-
msgstr[1] "%s days ago"
|
86 |
-
|
87 |
-
#: plugin/Date.php:48
|
88 |
-
msgid "a week ago"
|
89 |
-
msgid_plural "%s weeks ago"
|
90 |
-
msgstr[0] "a week ago"
|
91 |
-
msgstr[1] "%s weeks ago"
|
92 |
-
|
93 |
-
#: plugin/Date.php:49
|
94 |
-
msgid "%s month ago"
|
95 |
-
msgid_plural "%s months ago"
|
96 |
-
msgstr[0] "%s month ago"
|
97 |
-
msgstr[1] "%s months ago"
|
98 |
|
99 |
-
#:
|
100 |
-
msgid "
|
101 |
-
|
102 |
-
msgstr[0] "%s year ago"
|
103 |
-
msgstr[1] "%s years ago"
|
104 |
|
105 |
-
#:
|
106 |
-
msgid "
|
107 |
-
msgstr "
|
108 |
|
109 |
-
#:
|
110 |
-
msgid "
|
111 |
-
msgstr "
|
112 |
|
113 |
-
#:
|
114 |
-
msgid "Set the status of new review submissions to
|
115 |
-
msgstr "Set the status of new review submissions to
|
116 |
|
117 |
-
#:
|
118 |
-
msgid "Require
|
119 |
-
msgstr "Require
|
120 |
|
121 |
-
#:
|
122 |
msgid "Only allow review submissions from registered users."
|
123 |
msgstr "Only allow review submissions from registered users."
|
124 |
|
125 |
-
#:
|
126 |
-
msgid "
|
127 |
-
msgstr "
|
128 |
|
129 |
-
#:
|
130 |
msgid ""
|
131 |
"Show a link for a new user to register. The %s Membership option must be "
|
132 |
"enabled in General Settings for this to work."
|
@@ -134,43 +104,55 @@ msgstr ""
|
|
134 |
"Show a link for a new user to register. The %s Membership option must be "
|
135 |
"enabled in General Settings for this to work."
|
136 |
|
137 |
-
#:
|
138 |
msgid "Anyone can register"
|
139 |
msgstr "Anyone can register"
|
140 |
|
141 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
msgid "Notifications"
|
143 |
msgstr "Notifications"
|
144 |
|
145 |
-
#:
|
146 |
-
msgid "Do not send review notifications"
|
147 |
-
msgstr "Do not send review notifications"
|
148 |
-
|
149 |
-
#: plugin/Settings.php:198
|
150 |
msgid "Send to administrator"
|
151 |
msgstr "Send to administrator"
|
152 |
|
153 |
-
#:
|
|
|
|
|
|
|
|
|
154 |
msgid "Send to one or more email addresses"
|
155 |
msgstr "Send to one or more email addresses"
|
156 |
|
157 |
-
#:
|
158 |
-
msgid "Send to
|
159 |
-
msgstr "Send to
|
160 |
|
161 |
-
#:
|
162 |
-
msgid "Send
|
163 |
-
msgstr "Send
|
164 |
|
165 |
-
#:
|
166 |
msgid "Separate multiple emails with a comma"
|
167 |
msgstr "Separate multiple emails with a comma"
|
168 |
|
169 |
-
#:
|
170 |
-
msgid "Webhook URL"
|
171 |
-
msgstr "Webhook URL"
|
172 |
-
|
173 |
-
#: plugin/Settings.php:221
|
174 |
msgid ""
|
175 |
"To send notifications to Slack, create a new %s and then paste the provided "
|
176 |
"Webhook URL in the field above."
|
@@ -178,371 +160,329 @@ msgstr ""
|
|
178 |
"To send notifications to Slack, create a new %s and then paste the provided "
|
179 |
"Webhook URL in the field above."
|
180 |
|
181 |
-
#:
|
182 |
msgid "Incoming WebHook"
|
183 |
msgstr "Incoming WebHook"
|
184 |
|
185 |
-
#:
|
186 |
-
msgid "
|
187 |
-
msgstr "
|
188 |
|
189 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
190 |
msgid "Date Format"
|
191 |
msgstr "Date Format"
|
192 |
|
193 |
-
#:
|
194 |
msgid "Use the default date format"
|
195 |
msgstr "Use the default date format"
|
196 |
|
197 |
-
#:
|
198 |
msgid "Use a relative date format"
|
199 |
msgstr "Use a relative date format"
|
200 |
|
201 |
-
#:
|
202 |
msgid "Use a custom date format"
|
203 |
msgstr "Use a custom date format"
|
204 |
|
205 |
-
#:
|
206 |
-
msgid "
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
|
|
|
|
212 |
|
213 |
-
#:
|
214 |
msgid "Custom Date Format"
|
215 |
msgstr "Custom Date Format"
|
216 |
|
217 |
-
#:
|
218 |
-
msgid "Enter a custom date format (%s)."
|
219 |
-
msgstr "Enter a custom date format (%s)."
|
220 |
-
|
221 |
-
#: plugin/Settings.php:281
|
222 |
-
msgid "documentation on date and time formatting"
|
223 |
-
msgstr "documentation on date and time formatting"
|
224 |
-
|
225 |
-
#: plugin/Settings.php:291
|
226 |
-
msgid "Enable Assigned Links"
|
227 |
-
msgstr "Enable Assigned Links"
|
228 |
-
|
229 |
-
#: plugin/Settings.php:292
|
230 |
msgid "Display a link to the assigned post of a review."
|
231 |
msgstr "Display a link to the assigned post of a review."
|
232 |
|
233 |
-
#:
|
234 |
-
msgid "Enable
|
235 |
-
msgstr "Enable
|
236 |
|
237 |
-
#:
|
238 |
msgid ""
|
239 |
"Display reviewer avatars. These are generated from the email address of the "
|
240 |
-
"reviewer using
|
241 |
msgstr ""
|
242 |
"Display reviewer avatars. These are generated from the email address of the "
|
243 |
-
"reviewer using
|
|
|
|
|
|
|
|
|
244 |
|
245 |
-
#:
|
246 |
-
msgid "
|
247 |
-
msgstr "
|
248 |
|
249 |
-
#:
|
250 |
-
msgid "
|
251 |
-
msgstr "
|
252 |
|
253 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
254 |
msgid "Display an excerpt instead of the full review."
|
255 |
msgstr "Display an excerpt instead of the full review."
|
256 |
|
257 |
-
#:
|
258 |
-
msgid "
|
259 |
-
msgstr "
|
260 |
|
261 |
-
#:
|
262 |
msgid "Set the excerpt word length."
|
263 |
msgstr "Set the excerpt word length."
|
264 |
|
265 |
-
#:
|
266 |
-
msgid "
|
267 |
-
msgstr "
|
268 |
|
269 |
-
#:
|
270 |
msgid ""
|
271 |
-
"
|
272 |
-
"
|
273 |
-
"
|
274 |
-
"href=\"https://search.google.com/structured-data/testing-tool\">Structured "
|
275 |
-
"Data Testing Tool</a> to test your pages for valid schema data. You may "
|
276 |
-
"override any of these options on a per-post/page basis by using its Custom "
|
277 |
-
"Field name and adding a custom value using the <a "
|
278 |
-
"href=\"https://codex.wordpress.org/Using_Custom_Fields#Usage\">Custom "
|
279 |
-
"Fields</a> metabox."
|
280 |
msgstr ""
|
281 |
-
"
|
282 |
-
"
|
283 |
-
"
|
284 |
-
"href=\"https://search.google.com/structured-data/testing-tool\">Structured "
|
285 |
-
"Data Testing Tool</a> to test your pages for valid schema data. You may "
|
286 |
-
"override any of these options on a per-post/page basis by using its Custom "
|
287 |
-
"Field name and adding a custom value using the <a "
|
288 |
-
"href=\"https://codex.wordpress.org/Using_Custom_Fields#Usage\">Custom "
|
289 |
-
"Fields</a> metabox."
|
290 |
|
291 |
-
#: plugin/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
292 |
msgid "Default Schema Type"
|
293 |
msgstr "Default Schema Type"
|
294 |
|
295 |
-
#:
|
296 |
msgid "Local Business"
|
297 |
msgstr "Local Business"
|
298 |
|
299 |
-
#:
|
300 |
msgid "Product"
|
301 |
msgstr "Product"
|
302 |
|
303 |
-
#:
|
304 |
msgid "Custom"
|
305 |
msgstr "Custom"
|
306 |
|
307 |
-
#:
|
308 |
-
msgid "
|
309 |
-
msgstr "
|
310 |
|
311 |
-
#:
|
312 |
msgid "Custom Schema Type"
|
313 |
msgstr "Custom Schema Type"
|
314 |
|
315 |
-
#:
|
316 |
-
msgid "View more information on schema types here."
|
317 |
-
msgstr "View more information on schema types here."
|
318 |
-
|
319 |
-
#: plugin/Settings.php:354
|
320 |
msgid "Default Name"
|
321 |
msgstr "Default Name"
|
322 |
|
323 |
-
#:
|
324 |
msgid "Use the assigned or current page title"
|
325 |
msgstr "Use the assigned or current page title"
|
326 |
|
327 |
-
#:
|
328 |
-
msgid "Enter a custom
|
329 |
-
msgstr "Enter a custom
|
330 |
-
|
331 |
-
#: plugin/Settings.php:359
|
332 |
-
msgid "Do not set a default name"
|
333 |
-
msgstr "Do not set a default name"
|
334 |
|
335 |
-
#:
|
336 |
-
msgid "Custom Field name: <code>schema_name</code>"
|
337 |
-
msgstr "Custom Field name: <code>schema_name</code>"
|
338 |
-
|
339 |
-
#: plugin/Settings.php:367
|
340 |
msgid "Custom Name"
|
341 |
msgstr "Custom Name"
|
342 |
|
343 |
-
#:
|
344 |
msgid "Default Description"
|
345 |
msgstr "Default Description"
|
346 |
|
347 |
-
#:
|
348 |
msgid "Use the assigned or current page excerpt"
|
349 |
msgstr "Use the assigned or current page excerpt"
|
350 |
|
351 |
-
#:
|
352 |
msgid "Enter a custom description"
|
353 |
msgstr "Enter a custom description"
|
354 |
|
355 |
-
#:
|
356 |
-
msgid "Do not set a default description"
|
357 |
-
msgstr "Do not set a default description"
|
358 |
-
|
359 |
-
#: plugin/Settings.php:383
|
360 |
-
msgid "Custom Field name: <code>schema_description</code>"
|
361 |
-
msgstr "Custom Field name: <code>schema_description</code>"
|
362 |
-
|
363 |
-
#: plugin/Settings.php:389
|
364 |
msgid "Custom Description"
|
365 |
msgstr "Custom Description"
|
366 |
|
367 |
-
#:
|
368 |
msgid "Default URL"
|
369 |
msgstr "Default URL"
|
370 |
|
371 |
-
#:
|
372 |
msgid "Use the assigned or current page URL"
|
373 |
msgstr "Use the assigned or current page URL"
|
374 |
|
375 |
-
#:
|
376 |
msgid "Enter a custom URL"
|
377 |
msgstr "Enter a custom URL"
|
378 |
|
379 |
-
#:
|
380 |
-
msgid "Do not set a default URL"
|
381 |
-
msgstr "Do not set a default URL"
|
382 |
-
|
383 |
-
#: plugin/Settings.php:405
|
384 |
-
msgid "Custom Field name: <code>schema_url</code>"
|
385 |
-
msgstr "Custom Field name: <code>schema_url</code>"
|
386 |
-
|
387 |
-
#: plugin/Settings.php:411
|
388 |
msgid "Custom URL"
|
389 |
msgstr "Custom URL"
|
390 |
|
391 |
-
#:
|
392 |
msgid "Default Image"
|
393 |
msgstr "Default Image"
|
394 |
|
395 |
-
#:
|
396 |
msgid "Use the featured image of the assigned or current page"
|
397 |
msgstr "Use the featured image of the assigned or current page"
|
398 |
|
399 |
-
#:
|
400 |
msgid "Enter a custom image URL"
|
401 |
msgstr "Enter a custom image URL"
|
402 |
|
403 |
-
#:
|
404 |
-
msgid "Do not set a default image"
|
405 |
-
msgstr "Do not set a default image"
|
406 |
-
|
407 |
-
#: plugin/Settings.php:427
|
408 |
-
msgid "Custom Field name: <code>schema_image</code>"
|
409 |
-
msgstr "Custom Field name: <code>schema_image</code>"
|
410 |
-
|
411 |
-
#: plugin/Settings.php:433
|
412 |
msgid "Custom Image URL"
|
413 |
msgstr "Custom Image URL"
|
414 |
|
415 |
-
#:
|
416 |
msgid "Address"
|
417 |
msgstr "Address"
|
418 |
|
419 |
-
#:
|
420 |
-
msgid "Custom Field name: <code>schema_address</code>"
|
421 |
-
msgstr "Custom Field name: <code>schema_address</code>"
|
422 |
-
|
423 |
-
#: plugin/Settings.php:453
|
424 |
msgid "Telephone Number"
|
425 |
msgstr "Telephone Number"
|
426 |
|
427 |
-
#:
|
428 |
-
msgid "Custom Field name: <code>schema_telephone</code>"
|
429 |
-
msgstr "Custom Field name: <code>schema_telephone</code>"
|
430 |
-
|
431 |
-
#: plugin/Settings.php:464
|
432 |
msgid "Price Range"
|
433 |
msgstr "Price Range"
|
434 |
|
435 |
-
#:
|
436 |
-
msgid "Custom Field name: <code>schema_pricerange</code>"
|
437 |
-
msgstr "Custom Field name: <code>schema_pricerange</code>"
|
438 |
-
|
439 |
-
#: plugin/Settings.php:475
|
440 |
msgid "Low Price"
|
441 |
msgstr "Low Price"
|
442 |
|
443 |
-
#:
|
444 |
-
msgid "Custom Field name: <code>schema_lowprice</code>"
|
445 |
-
msgstr "Custom Field name: <code>schema_lowprice</code>"
|
446 |
-
|
447 |
-
#: plugin/Settings.php:486
|
448 |
msgid "High Price"
|
449 |
msgstr "High Price"
|
450 |
|
451 |
-
#:
|
452 |
-
msgid "Custom Field name: <code>schema_highprice</code>"
|
453 |
-
msgstr "Custom Field name: <code>schema_highprice</code>"
|
454 |
-
|
455 |
-
#: plugin/Settings.php:497
|
456 |
msgid "Price Currency"
|
457 |
msgstr "Price Currency"
|
458 |
|
459 |
-
#:
|
460 |
-
msgid "
|
461 |
-
msgstr "
|
462 |
|
463 |
-
#:
|
464 |
msgid "Required Fields"
|
465 |
msgstr "Required Fields"
|
466 |
|
467 |
-
#:
|
|
|
|
|
|
|
|
|
468 |
msgid "Title"
|
469 |
msgstr "Title"
|
470 |
|
471 |
-
#:
|
472 |
msgid "Review"
|
473 |
msgstr "Review"
|
474 |
|
475 |
-
#:
|
476 |
msgid "Name"
|
477 |
msgstr "Name"
|
478 |
|
479 |
-
#:
|
480 |
msgid "Email"
|
481 |
msgstr "Email"
|
482 |
|
483 |
-
#:
|
484 |
-
msgid "
|
485 |
-
msgstr "
|
486 |
-
|
487 |
-
#: plugin/Settings.php:537
|
488 |
-
msgid ""
|
489 |
-
"the %s integration provides spam-filtering for your reviews. In order for "
|
490 |
-
"this setting to have any affect, you will need to first install and "
|
491 |
-
"activate the Akismet plugin and set up a WordPress.com API key."
|
492 |
-
msgstr ""
|
493 |
-
"the %s integration provides spam-filtering for your reviews. In order for "
|
494 |
-
"this setting to have any affect, you will need to first install and "
|
495 |
-
"activate the Akismet plugin and set up a WordPress.com API key."
|
496 |
-
|
497 |
-
#: plugin/Settings.php:538
|
498 |
-
msgid "Akismet plugin"
|
499 |
-
msgstr "Akismet plugin"
|
500 |
-
|
501 |
-
#: plugin/Settings.php:545
|
502 |
-
msgid "Invisible reCAPTCHA"
|
503 |
-
msgstr "Invisible reCAPTCHA"
|
504 |
-
|
505 |
-
#: plugin/Settings.php:547
|
506 |
-
msgid "Do not use reCAPTCHA"
|
507 |
-
msgstr "Do not use reCAPTCHA"
|
508 |
-
|
509 |
-
#: plugin/Settings.php:548
|
510 |
-
msgid "Use reCAPTCHA"
|
511 |
-
msgstr "Use reCAPTCHA"
|
512 |
|
513 |
-
#:
|
514 |
msgid ""
|
515 |
"Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
|
516 |
-
"will need to
|
517 |
-
"a
|
518 |
-
"reCAPTCHA\"."
|
519 |
msgstr ""
|
520 |
"Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
|
521 |
-
"will need to
|
522 |
-
"a
|
523 |
-
"reCAPTCHA\"."
|
524 |
|
525 |
-
#:
|
526 |
-
msgid "
|
527 |
-
msgstr "
|
528 |
|
529 |
-
#:
|
530 |
msgid "Site Key"
|
531 |
msgstr "Site Key"
|
532 |
|
533 |
-
#:
|
534 |
msgid "Site Secret"
|
535 |
msgstr "Site Secret"
|
536 |
|
537 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
538 |
msgid "Badge Position"
|
539 |
msgstr "Badge Position"
|
540 |
|
541 |
-
#:
|
542 |
-
msgid "
|
543 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
544 |
|
545 |
-
#:
|
546 |
msgid ""
|
547 |
"When a review contains any of these words in its title, content, name, "
|
548 |
"email, or IP address, it will be rejected. One word or IP address per line. "
|
@@ -552,1195 +492,1311 @@ msgstr ""
|
|
552 |
"email, or IP address, it will be rejected. One word or IP address per line. "
|
553 |
"It will match inside words, so \"press\" will match \"WordPress\"."
|
554 |
|
555 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
556 |
msgid "Blacklist Action"
|
557 |
msgstr "Blacklist Action"
|
558 |
|
559 |
-
#:
|
|
|
|
|
|
|
|
|
560 |
msgid "Reject submission"
|
561 |
msgstr "Reject submission"
|
562 |
|
563 |
-
#: plugin/
|
564 |
-
msgid "
|
565 |
-
msgstr "
|
566 |
|
567 |
-
#: plugin/
|
568 |
-
msgid "
|
569 |
-
msgstr "
|
570 |
|
571 |
-
#: plugin/
|
572 |
-
msgid "
|
573 |
-
msgstr "
|
574 |
|
575 |
-
#: plugin/
|
576 |
-
msgid "
|
577 |
-
msgstr "
|
578 |
|
579 |
-
#:
|
580 |
-
msgid "
|
581 |
-
msgstr "
|
582 |
|
583 |
-
#:
|
584 |
-
msgid "
|
585 |
-
msgstr "
|
586 |
|
587 |
-
#:
|
588 |
-
msgid "
|
589 |
-
msgstr "
|
590 |
|
591 |
-
#:
|
592 |
-
msgid "
|
593 |
-
msgstr "
|
594 |
|
595 |
-
#:
|
596 |
-
msgid "
|
597 |
-
msgstr "
|
598 |
|
599 |
-
#:
|
600 |
-
msgid "
|
601 |
-
msgstr "
|
602 |
|
603 |
-
#:
|
604 |
-
msgid "
|
605 |
-
msgstr "
|
606 |
|
607 |
-
#:
|
608 |
-
msgid "
|
609 |
-
msgstr "
|
610 |
|
611 |
-
#:
|
612 |
-
msgid "
|
613 |
-
msgstr "
|
614 |
|
615 |
-
#:
|
616 |
-
msgid "
|
617 |
-
msgstr "
|
618 |
|
619 |
-
#: plugin/
|
620 |
-
msgid "
|
621 |
-
msgstr "
|
622 |
|
623 |
-
#: plugin/
|
624 |
-
msgid "
|
625 |
-
msgstr "
|
626 |
|
627 |
-
#: plugin/
|
628 |
-
msgid "
|
629 |
-
msgstr "
|
630 |
|
631 |
-
#: plugin/
|
632 |
-
msgid "
|
633 |
-
msgstr "
|
634 |
|
635 |
-
#: plugin/
|
636 |
-
msgid "
|
637 |
-
msgstr "
|
638 |
|
639 |
-
#: plugin/
|
640 |
-
msgid "
|
641 |
-
|
|
|
|
|
642 |
|
643 |
-
#: plugin/
|
644 |
-
msgid "
|
645 |
-
msgstr "
|
646 |
|
647 |
-
#: plugin/
|
648 |
-
msgid "
|
649 |
-
msgstr "
|
650 |
|
651 |
-
#: plugin/
|
652 |
-
msgid "
|
653 |
-
msgstr "
|
654 |
|
655 |
-
#: plugin/
|
656 |
-
msgid "
|
657 |
-
msgstr "
|
658 |
|
659 |
-
#: plugin/
|
660 |
-
msgid "
|
661 |
-
msgstr "
|
662 |
|
663 |
-
#: plugin/
|
664 |
-
msgid "
|
665 |
-
msgstr "
|
666 |
|
667 |
-
#: plugin/
|
668 |
-
msgid "
|
669 |
-
msgstr "
|
670 |
|
671 |
-
#: plugin/
|
672 |
-
msgid "
|
673 |
-
msgstr "
|
674 |
|
675 |
-
#: plugin/
|
676 |
-
msgid "
|
677 |
-
msgstr "
|
678 |
|
679 |
-
#: plugin/
|
680 |
-
msgid "
|
681 |
-
msgstr "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
682 |
|
683 |
-
#: plugin/Controllers/
|
684 |
-
msgid "
|
685 |
-
msgstr "
|
686 |
|
687 |
-
#: plugin/Controllers/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
688 |
msgid "Okay"
|
689 |
msgstr "Okay"
|
690 |
|
691 |
-
#: plugin/Controllers/AjaxController.php:
|
692 |
msgid "Nothing found."
|
693 |
msgstr "Nothing found."
|
694 |
|
695 |
-
#: plugin/Controllers/MainController.php:
|
696 |
-
msgid "Log was cleared."
|
697 |
-
msgstr "Log was cleared."
|
698 |
-
|
699 |
-
#: plugin/Controllers/MainController.php:135, plugin/Controllers/MainController.php:382, plugin/Controllers/MainController.php:638
|
700 |
-
msgid "Settings"
|
701 |
-
msgstr "Settings"
|
702 |
-
|
703 |
-
#: plugin/Controllers/MainController.php:156
|
704 |
-
msgid "%s Review"
|
705 |
-
msgid_plural "%s Reviews"
|
706 |
-
msgstr[0] "%s Review"
|
707 |
-
msgstr[1] "%s Reviews"
|
708 |
-
|
709 |
-
#: plugin/Controllers/MainController.php:208, plugin/Controllers/MainController.php:256, views/edit/bulk-edit-assigned-to.php:7
|
710 |
msgid "Assigned To"
|
711 |
msgstr "Assigned To"
|
712 |
|
713 |
-
#: plugin/Controllers/
|
714 |
msgid "Details"
|
715 |
msgstr "Details"
|
716 |
|
717 |
-
#: plugin/Controllers/
|
718 |
msgid "Respond Publicly"
|
719 |
msgstr "Respond Publicly"
|
720 |
|
721 |
-
#: plugin/Controllers/
|
722 |
-
msgid "
|
723 |
-
msgstr "
|
724 |
|
725 |
-
#: plugin/Controllers/
|
726 |
-
msgid ""
|
727 |
-
|
728 |
-
"widgets and shortcodes."
|
729 |
-
msgstr ""
|
730 |
-
"You can pin exceptional reviews so that they are always shown first in your "
|
731 |
-
"widgets and shortcodes."
|
732 |
|
733 |
-
#: plugin/Controllers/
|
734 |
-
msgid "
|
735 |
-
msgstr "
|
736 |
|
737 |
-
#: plugin/Controllers/
|
738 |
-
msgid "
|
739 |
-
msgstr "
|
740 |
|
741 |
-
#: plugin/Controllers/
|
742 |
-
msgid "
|
743 |
-
msgstr "
|
744 |
|
745 |
-
#: plugin/Controllers/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
746 |
msgid "Type"
|
747 |
msgstr "Type"
|
748 |
|
749 |
-
#: plugin/Controllers/
|
750 |
-
msgid "
|
751 |
-
msgstr "
|
752 |
|
753 |
-
#: plugin/Controllers/
|
754 |
-
msgid "
|
755 |
-
msgstr "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
756 |
|
757 |
-
#: plugin/Controllers/
|
758 |
-
msgid "
|
759 |
-
msgstr "
|
|
|
|
|
|
|
|
|
760 |
|
761 |
-
#: plugin/Controllers/
|
762 |
msgid "Approve"
|
763 |
msgstr "Approve"
|
764 |
|
765 |
-
#: plugin/Controllers/
|
766 |
-
msgid "Unapprove this review"
|
767 |
-
msgstr "Unapprove this review"
|
768 |
-
|
769 |
-
#: plugin/Controllers/MainController.php:290
|
770 |
msgid "Unapprove"
|
771 |
msgstr "Unapprove"
|
772 |
|
773 |
-
#: plugin/Controllers/
|
774 |
-
msgid "
|
775 |
-
msgstr "
|
776 |
-
|
777 |
-
#: plugin/Controllers/MainController.php:337
|
778 |
-
msgid "Site Reviews Summary"
|
779 |
-
msgstr "Site Reviews Summary"
|
780 |
|
781 |
-
#: plugin/Controllers/MainController.php:
|
782 |
-
msgid "
|
783 |
-
msgstr "
|
784 |
|
785 |
-
#: plugin/Controllers/MainController.php:
|
786 |
-
msgid "
|
787 |
-
msgstr "
|
788 |
|
789 |
-
#: plugin/Controllers/MainController.php:
|
790 |
-
msgid "
|
791 |
-
msgstr "
|
792 |
|
793 |
-
#: plugin/Controllers/MainController.php:
|
794 |
-
msgid "Your site’s most recent
|
795 |
-
msgstr "Your site’s most recent
|
796 |
|
797 |
-
#: plugin/Controllers/MainController.php:
|
798 |
msgid "A \"submit a review\" form for your site."
|
799 |
msgstr "A \"submit a review\" form for your site."
|
800 |
|
801 |
-
#: plugin/Controllers/MainController.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
802 |
msgid "Support"
|
803 |
msgstr "Support"
|
804 |
|
805 |
-
#: plugin/Controllers/
|
|
|
|
|
|
|
|
|
806 |
msgid "Shortcodes"
|
807 |
msgstr "Shortcodes"
|
808 |
|
809 |
-
#: plugin/Controllers/
|
810 |
msgid "Hooks"
|
811 |
msgstr "Hooks"
|
812 |
|
813 |
-
#: plugin/Controllers/
|
814 |
-
msgid "
|
815 |
-
msgstr "
|
816 |
-
|
817 |
-
#: plugin/Controllers/MainController.php:496
|
818 |
-
msgid "Documentation"
|
819 |
-
msgstr "Documentation"
|
820 |
-
|
821 |
-
#: plugin/Controllers/MainController.php:499
|
822 |
-
msgid "System Info"
|
823 |
-
msgstr "System Info"
|
824 |
|
825 |
-
#: plugin/Controllers/
|
826 |
-
msgid "
|
827 |
-
msgstr "
|
828 |
|
829 |
-
#: plugin/Controllers/
|
830 |
msgid "General"
|
831 |
msgstr "General"
|
832 |
|
833 |
-
#: plugin/Controllers/
|
834 |
-
msgid "
|
835 |
-
msgstr "
|
836 |
|
837 |
-
#: plugin/Controllers/
|
838 |
-
msgid "
|
839 |
-
msgstr "
|
840 |
|
841 |
-
#: plugin/Controllers/
|
842 |
msgid "Licenses"
|
843 |
msgstr "Licenses"
|
844 |
|
845 |
-
#: plugin/Controllers/
|
846 |
-
msgid "
|
847 |
-
|
848 |
-
msgstr[0] "Logging disabled."
|
849 |
-
msgstr[1] "Logging enabled."
|
850 |
-
|
851 |
-
#: plugin/Controllers/MainController.php:708
|
852 |
-
msgid "Settings updated."
|
853 |
-
msgstr "Settings updated."
|
854 |
-
|
855 |
-
#: plugin/Controllers/MainController.php:822
|
856 |
-
msgid "Nothing to Revert"
|
857 |
-
msgstr "Nothing to Revert"
|
858 |
-
|
859 |
-
#: plugin/Controllers/MainController.php:823
|
860 |
-
msgid "Revert Changes"
|
861 |
-
msgstr "Revert Changes"
|
862 |
-
|
863 |
-
#: plugin/Controllers/MainController.php:835
|
864 |
-
msgid "Unknown"
|
865 |
-
msgstr "Unknown"
|
866 |
-
|
867 |
-
#: plugin/Controllers/MainController.php:837
|
868 |
-
msgid "%s review"
|
869 |
-
msgstr "%s review"
|
870 |
|
871 |
-
#: plugin/Controllers/
|
872 |
-
msgid "
|
873 |
-
msgstr "
|
874 |
|
875 |
-
#: plugin/Controllers/
|
876 |
-
msgid "
|
877 |
-
msgstr "
|
878 |
|
879 |
-
#: plugin/Controllers/
|
880 |
-
msgid "
|
881 |
-
msgstr "
|
882 |
|
883 |
-
#: plugin/Controllers/
|
884 |
-
msgid "
|
885 |
-
msgstr "
|
886 |
|
887 |
-
#: plugin/Controllers/
|
888 |
-
msgid "
|
889 |
-
|
|
|
|
|
|
|
|
|
890 |
|
891 |
-
#: plugin/Controllers/
|
892 |
-
msgid "
|
893 |
-
msgstr "
|
894 |
|
895 |
-
#: plugin/
|
896 |
-
msgid "
|
897 |
-
msgstr "
|
898 |
|
899 |
-
#: plugin/
|
900 |
-
msgid "
|
901 |
-
msgstr "
|
902 |
|
903 |
-
#: plugin/
|
904 |
-
msgid "
|
905 |
-
msgstr "
|
906 |
|
907 |
-
#: plugin/
|
908 |
-
msgid "
|
909 |
-
|
910 |
-
msgstr[0] "%s review updated."
|
911 |
-
msgstr[1] "%s reviews updated."
|
912 |
|
913 |
-
#: plugin/
|
914 |
-
msgid "
|
915 |
-
|
916 |
-
msgstr[0] "%s review not updated, somebody is editing it."
|
917 |
-
msgstr[1] "%s reviews not updated, somebody is editing them."
|
918 |
|
919 |
-
#: plugin/
|
920 |
-
msgid "%s
|
921 |
-
|
922 |
-
msgstr[0] "%s review permanently deleted."
|
923 |
-
msgstr[1] "%s reviews permanently deleted."
|
924 |
|
925 |
-
#: plugin/
|
926 |
-
msgid "%s
|
927 |
-
|
928 |
-
msgstr[0] "%s review moved to the Trash."
|
929 |
-
msgstr[1] "%s reviews moved to the Trash."
|
930 |
|
931 |
-
#: plugin/
|
932 |
-
msgid "
|
933 |
-
|
934 |
-
msgstr[0] "%s review restored from the Trash."
|
935 |
-
msgstr[1] "%s reviews restored from the Trash."
|
936 |
|
937 |
-
#: plugin/
|
938 |
msgid "Please fix the submission errors."
|
939 |
msgstr "Please fix the submission errors."
|
940 |
|
941 |
-
#: plugin/
|
942 |
-
msgid "
|
943 |
-
msgstr "
|
944 |
|
945 |
-
#: plugin/
|
946 |
-
msgid "
|
947 |
-
msgstr "
|
948 |
|
949 |
-
#: plugin/
|
950 |
-
msgid "
|
951 |
-
msgstr "
|
952 |
|
953 |
-
#: plugin/
|
954 |
-
msgid "
|
955 |
-
msgstr "
|
956 |
|
957 |
-
#: plugin/
|
958 |
-
msgid "
|
959 |
-
msgstr "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
960 |
|
961 |
-
#: plugin/Handlers/ChangeStatus.php:
|
962 |
msgid "Edit"
|
963 |
msgstr "Edit"
|
964 |
|
965 |
-
#: plugin/Handlers/
|
966 |
-
msgid "
|
967 |
-
|
968 |
-
|
969 |
-
msgstr
|
|
|
|
|
970 |
|
971 |
-
#: plugin/Handlers/
|
972 |
-
msgid "
|
973 |
-
msgstr "
|
974 |
|
975 |
-
#: plugin/Handlers/
|
976 |
-
msgid "
|
977 |
-
msgstr "
|
978 |
|
979 |
-
#: plugin/Handlers/
|
980 |
-
msgid "
|
981 |
-
msgstr "
|
982 |
|
983 |
-
#: plugin/
|
984 |
-
msgid "
|
985 |
-
msgstr "
|
986 |
|
987 |
-
#: plugin/
|
988 |
-
msgid "
|
989 |
-
msgstr "
|
990 |
|
991 |
-
#: plugin/
|
992 |
-
msgid "
|
993 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
994 |
|
995 |
-
#: plugin/
|
996 |
-
msgid "
|
997 |
-
|
|
|
|
|
998 |
|
999 |
-
#: plugin/
|
1000 |
-
msgid "
|
1001 |
-
|
|
|
|
|
1002 |
|
1003 |
-
#: plugin/
|
1004 |
-
msgid "
|
1005 |
-
|
|
|
|
|
1006 |
|
1007 |
-
#: plugin/
|
1008 |
-
msgid "
|
1009 |
-
|
|
|
|
|
1010 |
|
1011 |
-
#: plugin/
|
1012 |
-
msgid "
|
1013 |
-
|
|
|
|
|
1014 |
|
1015 |
-
#: plugin/
|
1016 |
-
msgid "
|
1017 |
-
|
|
|
|
|
|
|
|
|
1018 |
|
1019 |
-
#: plugin/Shortcodes/
|
1020 |
msgid "Excellent"
|
1021 |
msgstr "Excellent"
|
1022 |
|
1023 |
-
#: plugin/Shortcodes/
|
1024 |
msgid "Very good"
|
1025 |
msgstr "Very good"
|
1026 |
|
1027 |
-
#: plugin/Shortcodes/
|
1028 |
msgid "Average"
|
1029 |
msgstr "Average"
|
1030 |
|
1031 |
-
#: plugin/Shortcodes/
|
1032 |
msgid "Poor"
|
1033 |
msgstr "Poor"
|
1034 |
|
1035 |
-
#: plugin/Shortcodes/
|
1036 |
msgid "Terrible"
|
1037 |
msgstr "Terrible"
|
1038 |
|
1039 |
-
#: plugin/
|
1040 |
-
msgid "
|
1041 |
-
msgstr "
|
1042 |
-
|
1043 |
-
#: plugin/Traits/SiteReviewsForm.php:105
|
1044 |
-
msgid "logged in"
|
1045 |
-
msgstr "logged in"
|
1046 |
|
1047 |
-
#: plugin/
|
1048 |
-
msgid "
|
1049 |
-
msgstr "
|
1050 |
|
1051 |
-
#: plugin/
|
1052 |
-
msgid "
|
1053 |
-
msgstr "
|
1054 |
|
1055 |
-
#: plugin/
|
1056 |
-
msgid "
|
1057 |
-
msgstr "
|
1058 |
|
1059 |
-
#: plugin/
|
1060 |
-
msgid "
|
1061 |
-
msgstr "
|
1062 |
|
1063 |
-
#: plugin/
|
1064 |
-
msgid "
|
1065 |
-
msgstr "
|
1066 |
|
1067 |
-
#: plugin/
|
1068 |
-
msgid "
|
1069 |
-
|
|
|
|
|
|
|
|
|
1070 |
|
1071 |
-
#: plugin/
|
1072 |
-
msgid "
|
1073 |
-
msgstr "
|
1074 |
|
1075 |
-
#: plugin/
|
1076 |
-
msgid "
|
1077 |
-
msgstr "
|
1078 |
|
1079 |
-
#: plugin/
|
1080 |
-
msgid "
|
1081 |
-
msgstr "
|
1082 |
|
1083 |
-
#: plugin/
|
1084 |
-
msgid "
|
1085 |
-
msgstr "
|
1086 |
|
1087 |
-
#: plugin/
|
1088 |
-
msgid "
|
1089 |
-
msgstr "
|
1090 |
|
1091 |
-
#: plugin/
|
1092 |
-
msgid "Hide the review
|
1093 |
-
msgstr "Hide the review
|
1094 |
|
1095 |
-
#: plugin/
|
1096 |
-
msgid "Hide the
|
1097 |
-
msgstr "Hide the
|
1098 |
|
1099 |
-
#: plugin/
|
1100 |
-
msgid "Hide the
|
1101 |
-
msgstr "Hide the
|
1102 |
|
1103 |
-
#: plugin/
|
1104 |
-
msgid "Hide the
|
1105 |
-
msgstr "Hide the
|
1106 |
|
1107 |
-
#: plugin/
|
1108 |
-
msgid "
|
1109 |
-
msgstr "
|
1110 |
|
1111 |
-
#: plugin/
|
1112 |
-
msgid "
|
1113 |
-
msgstr "
|
1114 |
|
1115 |
-
#: plugin/
|
1116 |
-
msgid "
|
1117 |
-
|
|
|
|
|
1118 |
|
1119 |
-
#: plugin/
|
1120 |
-
msgid "
|
1121 |
-
msgstr "
|
1122 |
|
1123 |
-
#: plugin/
|
1124 |
-
msgid "
|
1125 |
-
msgstr "
|
1126 |
|
1127 |
-
#: plugin/
|
1128 |
-
msgid "
|
1129 |
-
msgstr "
|
1130 |
|
1131 |
-
#: plugin/
|
1132 |
-
msgid "
|
1133 |
-
msgstr "
|
1134 |
|
1135 |
-
#: plugin/
|
1136 |
-
msgid "
|
1137 |
-
msgstr "
|
1138 |
|
1139 |
-
#: plugin/
|
1140 |
-
msgid "
|
1141 |
-
msgstr "
|
1142 |
|
1143 |
-
#: plugin/
|
1144 |
-
msgid "
|
1145 |
-
|
|
|
|
|
|
|
|
|
1146 |
|
1147 |
-
#: plugin/Widgets/
|
1148 |
-
msgid "
|
1149 |
-
msgstr "
|
1150 |
|
1151 |
-
#: plugin/
|
1152 |
-
msgid "
|
1153 |
-
msgstr "
|
1154 |
|
1155 |
-
#: plugin/
|
1156 |
-
msgid "
|
1157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
1158 |
|
1159 |
-
#:
|
1160 |
-
msgid "
|
1161 |
-
msgstr "
|
1162 |
|
1163 |
-
#:
|
1164 |
-
msgid "
|
1165 |
-
msgstr "
|
1166 |
|
1167 |
-
#:
|
1168 |
-
msgid ""
|
1169 |
-
"
|
1170 |
-
"to. You may search by title or ID."
|
1171 |
-
msgstr ""
|
1172 |
-
"Search here for a page or post that you would like to assign this review "
|
1173 |
-
"to. You may search by title or ID."
|
1174 |
|
1175 |
-
#:
|
1176 |
-
msgid "
|
1177 |
-
msgstr "
|
1178 |
|
1179 |
-
#:
|
1180 |
-
msgid "
|
1181 |
-
msgstr "
|
1182 |
|
1183 |
-
#:
|
1184 |
-
msgid "
|
1185 |
-
msgstr "
|
1186 |
|
1187 |
-
#:
|
1188 |
-
msgid "
|
1189 |
-
msgstr "
|
1190 |
|
1191 |
-
#:
|
1192 |
-
msgid "
|
1193 |
-
msgstr "
|
1194 |
|
1195 |
-
#:
|
1196 |
-
msgid "
|
1197 |
-
msgstr "
|
1198 |
|
1199 |
-
#:
|
1200 |
-
msgid "
|
1201 |
-
msgstr "
|
1202 |
|
1203 |
-
#:
|
1204 |
-
msgid "
|
1205 |
-
msgstr "
|
1206 |
|
1207 |
-
#:
|
1208 |
-
msgid "
|
1209 |
-
msgstr "
|
1210 |
|
1211 |
-
#:
|
1212 |
-
msgid "
|
1213 |
-
msgstr "
|
1214 |
|
1215 |
-
#:
|
1216 |
-
msgid "
|
1217 |
-
msgstr "
|
1218 |
|
1219 |
-
#:
|
1220 |
-
msgid "
|
1221 |
-
msgstr "
|
1222 |
|
1223 |
-
#:
|
1224 |
-
msgid "
|
1225 |
-
msgstr "
|
1226 |
|
1227 |
-
#:
|
1228 |
-
msgid "
|
1229 |
-
msgstr "
|
1230 |
|
1231 |
-
#:
|
1232 |
-
msgid "
|
1233 |
-
msgstr "
|
1234 |
|
1235 |
-
#:
|
1236 |
-
msgid "
|
1237 |
-
msgstr "
|
1238 |
|
1239 |
-
#:
|
1240 |
-
msgid "
|
1241 |
-
msgstr "
|
1242 |
|
1243 |
-
#:
|
1244 |
-
msgid "
|
1245 |
-
msgstr "
|
1246 |
|
1247 |
-
#:
|
1248 |
-
msgid "
|
1249 |
-
msgstr "
|
1250 |
|
1251 |
-
#:
|
1252 |
-
msgid "
|
1253 |
-
msgstr "
|
1254 |
|
1255 |
-
#:
|
1256 |
-
msgid "
|
1257 |
-
msgstr "
|
1258 |
|
1259 |
-
#:
|
1260 |
-
msgid "
|
1261 |
-
msgstr "
|
1262 |
|
1263 |
-
#:
|
1264 |
-
msgid "
|
1265 |
-
msgstr "
|
1266 |
|
1267 |
-
#:
|
1268 |
-
msgid "
|
1269 |
-
msgstr "
|
1270 |
|
1271 |
-
#:
|
1272 |
-
msgid "
|
1273 |
-
msgstr "
|
1274 |
|
1275 |
-
#:
|
1276 |
-
msgid "
|
1277 |
-
msgstr "
|
1278 |
|
1279 |
-
#:
|
1280 |
-
msgid "
|
1281 |
-
msgstr "
|
1282 |
|
1283 |
-
#:
|
1284 |
-
msgid "
|
1285 |
-
|
|
|
|
|
|
|
|
|
1286 |
|
1287 |
-
#:
|
1288 |
-
msgid "
|
1289 |
-
msgstr "
|
1290 |
|
1291 |
-
#:
|
1292 |
-
msgid "
|
1293 |
-
msgstr "
|
1294 |
|
1295 |
-
#:
|
1296 |
-
msgid "
|
1297 |
-
msgstr "
|
1298 |
|
1299 |
-
#:
|
1300 |
-
msgid "
|
1301 |
-
msgstr "
|
1302 |
|
1303 |
-
#:
|
1304 |
-
msgid "
|
1305 |
-
msgstr "
|
1306 |
|
1307 |
-
#:
|
1308 |
-
msgid "
|
1309 |
-
msgstr "
|
1310 |
|
1311 |
-
#:
|
1312 |
-
msgid "
|
1313 |
-
msgstr "
|
1314 |
|
1315 |
-
#:
|
1316 |
-
msgid "
|
1317 |
-
msgstr "
|
1318 |
|
1319 |
-
#:
|
1320 |
-
msgid "
|
1321 |
-
msgstr "
|
1322 |
|
1323 |
-
#:
|
1324 |
-
msgid "
|
1325 |
-
msgstr "
|
1326 |
|
1327 |
-
#: plugin/
|
1328 |
-
msgid "
|
1329 |
-
msgstr "
|
1330 |
|
1331 |
-
#: plugin/
|
1332 |
-
msgid "
|
1333 |
-
msgstr "
|
1334 |
|
1335 |
-
#: plugin/
|
1336 |
-
msgid "
|
1337 |
-
msgstr "
|
1338 |
|
1339 |
-
#: plugin/
|
1340 |
-
msgid "
|
1341 |
-
msgstr "
|
1342 |
|
1343 |
-
#: plugin/
|
1344 |
-
msgid "
|
1345 |
-
msgstr "
|
1346 |
|
1347 |
-
#: plugin/
|
1348 |
-
msgid "Review
|
1349 |
-
msgstr "Review
|
1350 |
|
1351 |
-
#: plugin/
|
1352 |
-
msgid "
|
1353 |
-
msgstr "
|
1354 |
|
1355 |
-
#: plugin/
|
1356 |
-
msgid "
|
1357 |
-
msgstr "
|
1358 |
|
1359 |
-
#: plugin/
|
1360 |
-
msgid "
|
1361 |
-
msgstr "
|
1362 |
|
1363 |
-
#: plugin/
|
1364 |
-
msgid "
|
1365 |
-
msgstr "
|
1366 |
|
1367 |
-
#: plugin/
|
1368 |
-
msgid "
|
1369 |
-
msgstr "
|
1370 |
|
1371 |
-
#: plugin/
|
1372 |
-
msgid "
|
1373 |
-
msgstr "
|
1374 |
|
1375 |
-
#: plugin/
|
1376 |
-
msgid "
|
1377 |
-
msgstr "
|
1378 |
|
1379 |
-
#: plugin/
|
1380 |
-
msgid "
|
1381 |
-
msgstr "
|
1382 |
|
1383 |
-
#: plugin/
|
1384 |
-
msgid "
|
1385 |
-
msgstr "
|
1386 |
|
1387 |
-
#: plugin/
|
1388 |
-
msgid "
|
1389 |
-
msgstr "
|
1390 |
|
1391 |
-
#: plugin/
|
1392 |
-
msgid "
|
1393 |
-
msgstr "
|
1394 |
|
1395 |
-
#: plugin/
|
1396 |
-
msgid "
|
1397 |
-
msgstr "
|
1398 |
|
1399 |
-
#: plugin/
|
1400 |
-
msgid "
|
1401 |
-
msgstr "
|
1402 |
|
1403 |
-
#: plugin/
|
1404 |
-
msgid "
|
1405 |
-
msgstr "
|
1406 |
|
1407 |
-
#:
|
1408 |
-
msgid "
|
1409 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
1410 |
|
1411 |
-
#:
|
1412 |
-
msgid "
|
1413 |
-
msgstr "
|
1414 |
|
1415 |
-
#:
|
1416 |
-
msgid "
|
1417 |
-
msgstr "
|
1418 |
|
1419 |
-
#:
|
1420 |
-
msgid "
|
1421 |
-
msgstr "
|
1422 |
|
1423 |
-
#:
|
1424 |
-
msgid "
|
1425 |
-
|
|
|
|
|
|
|
|
|
1426 |
|
1427 |
-
#:
|
1428 |
-
msgid "
|
1429 |
-
msgstr "
|
1430 |
|
1431 |
-
#:
|
1432 |
-
msgid "
|
1433 |
-
msgstr "
|
1434 |
|
1435 |
-
#:
|
1436 |
-
msgid "
|
1437 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1438 |
|
1439 |
-
#:
|
1440 |
-
msgid "
|
1441 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1442 |
|
1443 |
-
#:
|
1444 |
-
msgid "
|
1445 |
-
msgstr "
|
1446 |
|
1447 |
-
#:
|
1448 |
-
msgid "
|
1449 |
-
msgstr "
|
1450 |
|
1451 |
-
#:
|
1452 |
-
msgid "
|
1453 |
-
msgstr "
|
1454 |
|
1455 |
-
#:
|
1456 |
-
msgid "
|
1457 |
-
msgstr "
|
1458 |
|
1459 |
-
#:
|
1460 |
-
msgid "
|
1461 |
-
msgstr "
|
1462 |
|
1463 |
-
#:
|
1464 |
-
msgid "
|
1465 |
-
msgstr "
|
1466 |
|
1467 |
-
#:
|
1468 |
-
msgid "
|
1469 |
-
msgstr "
|
1470 |
|
1471 |
-
#:
|
1472 |
-
msgid "
|
1473 |
-
msgstr "
|
1474 |
|
1475 |
-
#:
|
1476 |
-
msgid "
|
1477 |
-
msgstr "
|
1478 |
|
1479 |
-
#:
|
1480 |
-
msgid ""
|
1481 |
-
"
|
1482 |
-
"(default: disable)"
|
1483 |
-
msgstr ""
|
1484 |
-
"When using pagination this shortcode can only be used once on a page. "
|
1485 |
-
"(default: disable)"
|
1486 |
|
1487 |
-
#:
|
1488 |
-
msgid "
|
1489 |
-
msgstr "
|
1490 |
|
1491 |
-
#:
|
1492 |
-
msgid ""
|
1493 |
-
"
|
1494 |
-
"a comma). You can also enter \"post_id\" to use the ID of the current page."
|
1495 |
-
msgstr ""
|
1496 |
-
"Limit reviews to those assigned to this post ID (separate multiple IDs with "
|
1497 |
-
"a comma). You can also enter \"post_id\" to use the ID of the current page."
|
1498 |
|
1499 |
-
#:
|
1500 |
-
msgid "
|
1501 |
-
msgstr "
|
1502 |
|
1503 |
-
#:
|
1504 |
-
msgid "
|
1505 |
-
msgstr "
|
1506 |
|
1507 |
-
#:
|
1508 |
-
msgid "
|
1509 |
-
msgstr "
|
1510 |
|
1511 |
-
#:
|
1512 |
-
msgid "
|
1513 |
-
msgstr "
|
1514 |
|
1515 |
-
#:
|
1516 |
-
msgid "
|
1517 |
-
msgstr "
|
1518 |
|
1519 |
-
#:
|
1520 |
-
msgid "
|
1521 |
-
msgstr "
|
1522 |
|
1523 |
-
#:
|
1524 |
-
msgid "
|
1525 |
-
msgstr "
|
1526 |
|
1527 |
-
#:
|
1528 |
-
msgid "
|
1529 |
-
msgstr "
|
1530 |
|
1531 |
-
#:
|
1532 |
-
msgid "
|
1533 |
-
msgstr "
|
1534 |
|
1535 |
-
#:
|
1536 |
-
msgid "
|
1537 |
-
msgstr "
|
1538 |
|
1539 |
-
#:
|
1540 |
-
msgid "
|
1541 |
-
msgstr "
|
1542 |
|
1543 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1544 |
msgid ""
|
1545 |
-
"
|
1546 |
-
"
|
1547 |
msgstr ""
|
1548 |
-
"
|
1549 |
-
"
|
1550 |
|
1551 |
-
#:
|
1552 |
-
msgid "
|
1553 |
-
msgstr "
|
1554 |
|
1555 |
-
#:
|
1556 |
-
msgid "
|
1557 |
-
msgstr "
|
1558 |
|
1559 |
-
#:
|
1560 |
-
msgid "
|
1561 |
-
msgstr "
|
1562 |
|
1563 |
-
#:
|
1564 |
-
msgid "
|
1565 |
-
msgstr "
|
1566 |
|
1567 |
-
#:
|
1568 |
-
msgid "
|
1569 |
-
msgstr "
|
1570 |
|
1571 |
-
#:
|
1572 |
-
msgid "
|
1573 |
-
msgstr "
|
1574 |
|
1575 |
-
#:
|
1576 |
-
msgid ""
|
1577 |
-
|
1578 |
-
"separate each with a comma. The defaults labels are: \"Excellent, Very "
|
1579 |
-
"good, Average, Poor, Terrible\"."
|
1580 |
-
msgstr ""
|
1581 |
-
"Enter custom labels for the 1-5 star rating levels (from high to low), and "
|
1582 |
-
"separate each with a comma. The defaults labels are: \"Excellent, Very "
|
1583 |
-
"good, Average, Poor, Terrible\"."
|
1584 |
|
1585 |
-
#:
|
1586 |
-
msgid "
|
1587 |
-
msgstr "
|
1588 |
|
1589 |
-
#:
|
1590 |
-
msgid ""
|
1591 |
-
"
|
1592 |
-
"with a comma). You can also enter 'post_id' to use the ID of the current "
|
1593 |
-
"page."
|
1594 |
-
msgstr ""
|
1595 |
-
"Limit reviews to those assigned to this post ID (separate multiple ID's "
|
1596 |
-
"with a comma). You can also enter 'post_id' to use the ID of the current "
|
1597 |
-
"page."
|
1598 |
|
1599 |
-
#:
|
1600 |
-
msgid "
|
1601 |
-
msgstr "
|
1602 |
|
1603 |
-
#:
|
1604 |
-
msgid "
|
1605 |
-
msgstr "
|
1606 |
|
1607 |
-
#:
|
1608 |
-
msgid "
|
1609 |
-
msgstr "
|
1610 |
|
1611 |
-
#:
|
1612 |
-
msgid "
|
1613 |
-
msgstr "
|
1614 |
|
1615 |
-
#:
|
1616 |
-
msgid "
|
1617 |
-
msgstr "
|
1618 |
|
1619 |
-
#:
|
1620 |
-
msgid "
|
1621 |
-
msgstr "
|
1622 |
|
1623 |
-
#: plugin/
|
1624 |
-
msgid "
|
1625 |
-
msgstr "
|
1626 |
|
1627 |
-
#:
|
1628 |
-
msgid "
|
1629 |
-
|
|
|
|
|
1630 |
|
1631 |
-
#:
|
1632 |
-
msgid ""
|
1633 |
-
"
|
1634 |
-
"display them on your site."
|
1635 |
-
msgstr ""
|
1636 |
-
"Sync your Tripadvisor business reviews with an optional minimum rating and "
|
1637 |
-
"display them on your site."
|
1638 |
|
1639 |
-
#:
|
1640 |
-
msgid ""
|
1641 |
-
"
|
1642 |
-
"them on your site."
|
1643 |
-
msgstr ""
|
1644 |
-
"Sync your Yelp business reviews with an optional minimum rating and display "
|
1645 |
-
"them on your site."
|
1646 |
|
1647 |
-
#:
|
1648 |
-
msgid "
|
1649 |
-
msgstr "
|
1650 |
|
1651 |
-
#:
|
1652 |
-
msgid "
|
1653 |
-
msgstr "
|
1654 |
|
1655 |
-
#:
|
1656 |
-
msgid ""
|
1657 |
-
"
|
1658 |
-
"so don't leave this on."
|
1659 |
-
msgstr ""
|
1660 |
-
"You can enable logging for debugging purposes. Log files can grow quickly, "
|
1661 |
-
"so don't leave this on."
|
1662 |
|
1663 |
-
#:
|
1664 |
-
msgid "
|
1665 |
-
msgstr "
|
1666 |
|
1667 |
-
#:
|
1668 |
-
msgid "
|
1669 |
-
msgstr "
|
1670 |
|
1671 |
-
#:
|
1672 |
-
msgid "
|
1673 |
-
msgstr "
|
1674 |
|
1675 |
-
#:
|
1676 |
-
msgid "
|
1677 |
-
msgstr "
|
1678 |
|
1679 |
-
#:
|
1680 |
-
msgid "
|
1681 |
-
msgstr "
|
1682 |
|
1683 |
-
#:
|
1684 |
-
|
1685 |
-
|
1686 |
-
|
1687 |
-
|
1688 |
-
|
1689 |
-
|
1690 |
-
|
1691 |
-
|
1692 |
-
|
1693 |
-
|
1694 |
-
|
1695 |
-
|
1696 |
-
|
1697 |
-
|
1698 |
-
|
1699 |
-
|
1700 |
-
|
1701 |
-
|
1702 |
-
|
1703 |
-
|
1704 |
-
|
1705 |
-
|
1706 |
-
|
1707 |
-
|
1708 |
-
|
1709 |
-
|
1710 |
-
|
1711 |
-
|
1712 |
-
|
1713 |
-
|
1714 |
-
|
1715 |
-
|
1716 |
-
|
1717 |
-
|
1718 |
-
|
1719 |
-
|
1720 |
-
|
1721 |
-
|
1722 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1723 |
msgctxt ""
|
1724 |
-
"
|
1725 |
"assigned to a post."
|
1726 |
msgid "New %s-star review"
|
1727 |
msgid_plural "New %s-star review of: %s"
|
1728 |
msgstr[0] "New %s-star review"
|
1729 |
msgstr[1] "New %s-star review of: %s"
|
1730 |
|
1731 |
-
#: plugin/Shortcodes/
|
1732 |
-
msgctxt "Do not translate {rating} and {max}, they are template tags."
|
1733 |
-
msgid "{rating} out of {max} stars (based on %d review)"
|
1734 |
-
msgid_plural "{rating} out of {max} stars (based on %d reviews)"
|
1735 |
-
msgstr[0] "{rating} out of {max} stars (based on %d review)"
|
1736 |
-
msgstr[1] "{rating} out of {max} stars (based on %d reviews)"
|
1737 |
-
|
1738 |
-
#: views/menu/status.php:6
|
1739 |
-
msgctxt "configured timezone"
|
1740 |
-
msgid "All dates and times shown here use the WordPress %s."
|
1741 |
-
msgstr "All dates and times shown here use the WordPress %s."
|
1742 |
-
|
1743 |
-
#: plugin/Shortcodes/Buttons/Generator.php:334
|
1744 |
msgctxt "the option label"
|
1745 |
msgid "The \"%s\" option is required."
|
1746 |
-
msgstr "The \"%s\" option is required."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2019 site-reviews
|
2 |
# This file is distributed under the same license as the site-reviews package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
52 |
msgid "You can use the %s plugin to restore %s to the previous version."
|
53 |
msgstr "You can use the %s plugin to restore %s to the previous version."
|
54 |
|
55 |
+
#: helpers.php:60, plugin/Controllers/AdminController.php:164
|
56 |
+
msgid "Recalculated rating counts."
|
57 |
+
msgstr "Recalculated rating counts."
|
58 |
|
59 |
+
#: config/settings.php:6
|
60 |
+
msgid ""
|
61 |
+
"Site Reviews relies on the CSS of your theme to style the submission form. "
|
62 |
+
"If your theme does not provide proper CSS rules for form elements and you "
|
63 |
+
"are using a WordPress plugin/theme or CSS Framework listed here, please try "
|
64 |
+
"selecting it, otherwise choose \"Site Reviews (default)\"."
|
65 |
+
msgstr ""
|
66 |
+
"Site Reviews relies on the CSS of your theme to style the submission form. "
|
67 |
+
"If your theme does not provide proper CSS rules for form elements and you "
|
68 |
+
"are using a WordPress plugin/theme or CSS Framework listed here, please try "
|
69 |
+
"selecting it, otherwise choose \"Site Reviews (default)\"."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
71 |
+
#: config/settings.php:7
|
72 |
+
msgid "Plugin Style"
|
73 |
+
msgstr "Plugin Style"
|
|
|
|
|
74 |
|
75 |
+
#: config/settings.php:14
|
76 |
+
msgid "Site Reviews (default)"
|
77 |
+
msgstr "Site Reviews (default)"
|
78 |
|
79 |
+
#: config/settings.php:15
|
80 |
+
msgid "Site Reviews (minimal)"
|
81 |
+
msgstr "Site Reviews (minimal)"
|
82 |
|
83 |
+
#: config/settings.php:26
|
84 |
+
msgid "Set the status of new review submissions to \"unapproved\"."
|
85 |
+
msgstr "Set the status of new review submissions to \"unapproved\"."
|
86 |
|
87 |
+
#: config/settings.php:27
|
88 |
+
msgid "Require Approval"
|
89 |
+
msgstr "Require Approval"
|
90 |
|
91 |
+
#: config/settings.php:32
|
92 |
msgid "Only allow review submissions from registered users."
|
93 |
msgstr "Only allow review submissions from registered users."
|
94 |
|
95 |
+
#: config/settings.php:33
|
96 |
+
msgid "Require Login"
|
97 |
+
msgstr "Require Login"
|
98 |
|
99 |
+
#: config/settings.php:39
|
100 |
msgid ""
|
101 |
"Show a link for a new user to register. The %s Membership option must be "
|
102 |
"enabled in General Settings for this to work."
|
104 |
"Show a link for a new user to register. The %s Membership option must be "
|
105 |
"enabled in General Settings for this to work."
|
106 |
|
107 |
+
#: config/settings.php:40
|
108 |
msgid "Anyone can register"
|
109 |
msgstr "Anyone can register"
|
110 |
|
111 |
+
#: config/settings.php:42
|
112 |
+
msgid "Show Registration Link"
|
113 |
+
msgstr "Show Registration Link"
|
114 |
+
|
115 |
+
#: config/settings.php:47
|
116 |
+
msgid ""
|
117 |
+
"Integrate with the %s plugin to calculate ratings for all languages of a "
|
118 |
+
"post."
|
119 |
+
msgstr ""
|
120 |
+
"Integrate with the %s plugin to calculate ratings for all languages of a "
|
121 |
+
"post."
|
122 |
+
|
123 |
+
#: config/settings.php:50
|
124 |
+
msgid "Integrate with Polylang"
|
125 |
+
msgstr "Integrate with Polylang"
|
126 |
+
|
127 |
+
#: config/settings.php:55
|
128 |
msgid "Notifications"
|
129 |
msgstr "Notifications"
|
130 |
|
131 |
+
#: config/settings.php:57
|
|
|
|
|
|
|
|
|
132 |
msgid "Send to administrator"
|
133 |
msgstr "Send to administrator"
|
134 |
|
135 |
+
#: config/settings.php:58
|
136 |
+
msgid "Send to author of the page that the review is assigned to"
|
137 |
+
msgstr "Send to author of the page that the review is assigned to"
|
138 |
+
|
139 |
+
#: config/settings.php:59
|
140 |
msgid "Send to one or more email addresses"
|
141 |
msgstr "Send to one or more email addresses"
|
142 |
|
143 |
+
#: config/settings.php:60
|
144 |
+
msgid "Send to <a href=\"https://slack.com/\">Slack</a>"
|
145 |
+
msgstr "Send to <a href=\"https://slack.com/\">Slack</a>"
|
146 |
|
147 |
+
#: config/settings.php:67
|
148 |
+
msgid "Send Notification Emails To"
|
149 |
+
msgstr "Send Notification Emails To"
|
150 |
|
151 |
+
#: config/settings.php:68
|
152 |
msgid "Separate multiple emails with a comma"
|
153 |
msgstr "Separate multiple emails with a comma"
|
154 |
|
155 |
+
#: config/settings.php:74
|
|
|
|
|
|
|
|
|
156 |
msgid ""
|
157 |
"To send notifications to Slack, create a new %s and then paste the provided "
|
158 |
"Webhook URL in the field above."
|
160 |
"To send notifications to Slack, create a new %s and then paste the provided "
|
161 |
"Webhook URL in the field above."
|
162 |
|
163 |
+
#: config/settings.php:75
|
164 |
msgid "Incoming WebHook"
|
165 |
msgstr "Incoming WebHook"
|
166 |
|
167 |
+
#: config/settings.php:77
|
168 |
+
msgid "Slack Webhook URL"
|
169 |
+
msgstr "Slack Webhook URL"
|
170 |
|
171 |
+
#: config/settings.php:95
|
172 |
+
msgid "Notification Template"
|
173 |
+
msgstr "Notification Template"
|
174 |
+
|
175 |
+
#: config/settings.php:101
|
176 |
+
msgid "The default date format is the one set in your %s."
|
177 |
+
msgstr "The default date format is the one set in your %s."
|
178 |
+
|
179 |
+
#: config/settings.php:102
|
180 |
+
msgid "WordPress settings"
|
181 |
+
msgstr "WordPress settings"
|
182 |
+
|
183 |
+
#: config/settings.php:104
|
184 |
msgid "Date Format"
|
185 |
msgstr "Date Format"
|
186 |
|
187 |
+
#: config/settings.php:106
|
188 |
msgid "Use the default date format"
|
189 |
msgstr "Use the default date format"
|
190 |
|
191 |
+
#: config/settings.php:107
|
192 |
msgid "Use a relative date format"
|
193 |
msgstr "Use a relative date format"
|
194 |
|
195 |
+
#: config/settings.php:108
|
196 |
msgid "Use a custom date format"
|
197 |
msgstr "Use a custom date format"
|
198 |
|
199 |
+
#: config/settings.php:115
|
200 |
+
msgid ""
|
201 |
+
"Enter a custom date format (<a "
|
202 |
+
"href=\"https://codex.wordpress.org/Formatting_Date_and_Time\">documentation "
|
203 |
+
"on date and time formatting</a>)."
|
204 |
+
msgstr ""
|
205 |
+
"Enter a custom date format (<a "
|
206 |
+
"href=\"https://codex.wordpress.org/Formatting_Date_and_Time\">documentation "
|
207 |
+
"on date and time formatting</a>)."
|
208 |
|
209 |
+
#: config/settings.php:116
|
210 |
msgid "Custom Date Format"
|
211 |
msgstr "Custom Date Format"
|
212 |
|
213 |
+
#: config/settings.php:121
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
214 |
msgid "Display a link to the assigned post of a review."
|
215 |
msgstr "Display a link to the assigned post of a review."
|
216 |
|
217 |
+
#: config/settings.php:122
|
218 |
+
msgid "Enable Assigned Links"
|
219 |
+
msgstr "Enable Assigned Links"
|
220 |
|
221 |
+
#: config/settings.php:127
|
222 |
msgid ""
|
223 |
"Display reviewer avatars. These are generated from the email address of the "
|
224 |
+
"reviewer using <a href=\"https://gravatar.com\">Gravatar</a>."
|
225 |
msgstr ""
|
226 |
"Display reviewer avatars. These are generated from the email address of the "
|
227 |
+
"reviewer using <a href=\"https://gravatar.com\">Gravatar</a>."
|
228 |
+
|
229 |
+
#: config/settings.php:128
|
230 |
+
msgid "Enable Avatars"
|
231 |
+
msgstr "Enable Avatars"
|
232 |
|
233 |
+
#: config/settings.php:134
|
234 |
+
msgid "Regenerate the avatar whenever a local review is shown?"
|
235 |
+
msgstr "Regenerate the avatar whenever a local review is shown?"
|
236 |
|
237 |
+
#: config/settings.php:135
|
238 |
+
msgid "Regenerate Avatars"
|
239 |
+
msgstr "Regenerate Avatars"
|
240 |
|
241 |
+
#: config/settings.php:141
|
242 |
+
msgid "Set the avatar size in pixels."
|
243 |
+
msgstr "Set the avatar size in pixels."
|
244 |
+
|
245 |
+
#: config/settings.php:142
|
246 |
+
msgid "Avatar Size"
|
247 |
+
msgstr "Avatar Size"
|
248 |
+
|
249 |
+
#: config/settings.php:147
|
250 |
msgid "Display an excerpt instead of the full review."
|
251 |
msgstr "Display an excerpt instead of the full review."
|
252 |
|
253 |
+
#: config/settings.php:148
|
254 |
+
msgid "Enable Excerpts"
|
255 |
+
msgstr "Enable Excerpts"
|
256 |
|
257 |
+
#: config/settings.php:154
|
258 |
msgid "Set the excerpt word length."
|
259 |
msgstr "Set the excerpt word length."
|
260 |
|
261 |
+
#: config/settings.php:155
|
262 |
+
msgid "Excerpt Length"
|
263 |
+
msgstr "Excerpt Length"
|
264 |
|
265 |
+
#: config/settings.php:160
|
266 |
msgid ""
|
267 |
+
"Display the fallback text when there are no reviews to display. This can be "
|
268 |
+
"changed on the %s page. You may also override this by using the "
|
269 |
+
"\"fallback\" option on the shortcode. The default fallback text is: %s"
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
msgstr ""
|
271 |
+
"Display the fallback text when there are no reviews to display. This can be "
|
272 |
+
"changed on the %s page. You may also override this by using the "
|
273 |
+
"\"fallback\" option on the shortcode. The default fallback text is: %s"
|
|
|
|
|
|
|
|
|
|
|
|
|
274 |
|
275 |
+
#: config/settings.php:161, plugin/Controllers/MenuController.php:111
|
276 |
+
msgid "Translations"
|
277 |
+
msgstr "Translations"
|
278 |
+
|
279 |
+
#: config/settings.php:162, plugin/Modules/Html/ReviewsHtml.php:106
|
280 |
+
msgid "There are no reviews yet. Be the first one to write one."
|
281 |
+
msgstr "There are no reviews yet. Be the first one to write one."
|
282 |
+
|
283 |
+
#: config/settings.php:164
|
284 |
+
msgid "Enable Fallback Text"
|
285 |
+
msgstr "Enable Fallback Text"
|
286 |
+
|
287 |
+
#: config/settings.php:169, config/settings.php:187, config/settings.php:203, config/settings.php:219, config/settings.php:235, config/settings.php:252, config/settings.php:260, config/settings.php:268, config/settings.php:276, config/settings.php:284, config/settings.php:292
|
288 |
+
msgid "Custom Field name"
|
289 |
+
msgstr "Custom Field name"
|
290 |
+
|
291 |
+
#: config/settings.php:170
|
292 |
msgid "Default Schema Type"
|
293 |
msgstr "Default Schema Type"
|
294 |
|
295 |
+
#: config/settings.php:172
|
296 |
msgid "Local Business"
|
297 |
msgstr "Local Business"
|
298 |
|
299 |
+
#: config/settings.php:173
|
300 |
msgid "Product"
|
301 |
msgstr "Product"
|
302 |
|
303 |
+
#: config/settings.php:174
|
304 |
msgid "Custom"
|
305 |
msgstr "Custom"
|
306 |
|
307 |
+
#: config/settings.php:181
|
308 |
+
msgid "View more information on schema types here"
|
309 |
+
msgstr "View more information on schema types here"
|
310 |
|
311 |
+
#: config/settings.php:182
|
312 |
msgid "Custom Schema Type"
|
313 |
msgstr "Custom Schema Type"
|
314 |
|
315 |
+
#: config/settings.php:188
|
|
|
|
|
|
|
|
|
316 |
msgid "Default Name"
|
317 |
msgstr "Default Name"
|
318 |
|
319 |
+
#: config/settings.php:190
|
320 |
msgid "Use the assigned or current page title"
|
321 |
msgstr "Use the assigned or current page title"
|
322 |
|
323 |
+
#: config/settings.php:191
|
324 |
+
msgid "Enter a custom title"
|
325 |
+
msgstr "Enter a custom title"
|
|
|
|
|
|
|
|
|
326 |
|
327 |
+
#: config/settings.php:198
|
|
|
|
|
|
|
|
|
328 |
msgid "Custom Name"
|
329 |
msgstr "Custom Name"
|
330 |
|
331 |
+
#: config/settings.php:204
|
332 |
msgid "Default Description"
|
333 |
msgstr "Default Description"
|
334 |
|
335 |
+
#: config/settings.php:206
|
336 |
msgid "Use the assigned or current page excerpt"
|
337 |
msgstr "Use the assigned or current page excerpt"
|
338 |
|
339 |
+
#: config/settings.php:207
|
340 |
msgid "Enter a custom description"
|
341 |
msgstr "Enter a custom description"
|
342 |
|
343 |
+
#: config/settings.php:214
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
344 |
msgid "Custom Description"
|
345 |
msgstr "Custom Description"
|
346 |
|
347 |
+
#: config/settings.php:220
|
348 |
msgid "Default URL"
|
349 |
msgstr "Default URL"
|
350 |
|
351 |
+
#: config/settings.php:222
|
352 |
msgid "Use the assigned or current page URL"
|
353 |
msgstr "Use the assigned or current page URL"
|
354 |
|
355 |
+
#: config/settings.php:223
|
356 |
msgid "Enter a custom URL"
|
357 |
msgstr "Enter a custom URL"
|
358 |
|
359 |
+
#: config/settings.php:230
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
360 |
msgid "Custom URL"
|
361 |
msgstr "Custom URL"
|
362 |
|
363 |
+
#: config/settings.php:236
|
364 |
msgid "Default Image"
|
365 |
msgstr "Default Image"
|
366 |
|
367 |
+
#: config/settings.php:238
|
368 |
msgid "Use the featured image of the assigned or current page"
|
369 |
msgstr "Use the featured image of the assigned or current page"
|
370 |
|
371 |
+
#: config/settings.php:239
|
372 |
msgid "Enter a custom image URL"
|
373 |
msgstr "Enter a custom image URL"
|
374 |
|
375 |
+
#: config/settings.php:246
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
376 |
msgid "Custom Image URL"
|
377 |
msgstr "Custom Image URL"
|
378 |
|
379 |
+
#: config/settings.php:253
|
380 |
msgid "Address"
|
381 |
msgstr "Address"
|
382 |
|
383 |
+
#: config/settings.php:261
|
|
|
|
|
|
|
|
|
384 |
msgid "Telephone Number"
|
385 |
msgstr "Telephone Number"
|
386 |
|
387 |
+
#: config/settings.php:269
|
|
|
|
|
|
|
|
|
388 |
msgid "Price Range"
|
389 |
msgstr "Price Range"
|
390 |
|
391 |
+
#: config/settings.php:277
|
|
|
|
|
|
|
|
|
392 |
msgid "Low Price"
|
393 |
msgstr "Low Price"
|
394 |
|
395 |
+
#: config/settings.php:285
|
|
|
|
|
|
|
|
|
396 |
msgid "High Price"
|
397 |
msgstr "High Price"
|
398 |
|
399 |
+
#: config/settings.php:293
|
|
|
|
|
|
|
|
|
400 |
msgid "Price Currency"
|
401 |
msgstr "Price Currency"
|
402 |
|
403 |
+
#: config/settings.php:299
|
404 |
+
msgid "Choose which fields should be required in the submission form."
|
405 |
+
msgstr "Choose which fields should be required in the submission form."
|
406 |
|
407 |
+
#: config/settings.php:300
|
408 |
msgid "Required Fields"
|
409 |
msgstr "Required Fields"
|
410 |
|
411 |
+
#: config/settings.php:302, plugin/Controllers/EditorController.php:370, plugin/Controllers/MainController.php:32, plugin/Shortcodes/SiteReviewsPopup.php:33
|
412 |
+
msgid "Rating"
|
413 |
+
msgstr "Rating"
|
414 |
+
|
415 |
+
#: config/settings.php:303, plugin/Defaults/PostTypeDefaults.php:17, plugin/Shortcodes/SiteReviewsFormPopup.php:19, plugin/Shortcodes/SiteReviewsPopup.php:20, plugin/Shortcodes/SiteReviewsSummaryPopup.php:19, plugin/Widgets/SiteReviewsFormWidget.php:21, plugin/Widgets/SiteReviewsSummaryWidget.php:21, plugin/Widgets/SiteReviewsWidget.php:21
|
416 |
msgid "Title"
|
417 |
msgstr "Title"
|
418 |
|
419 |
+
#: config/settings.php:304, plugin/Controllers/MainController.php:43
|
420 |
msgid "Review"
|
421 |
msgstr "Review"
|
422 |
|
423 |
+
#: config/settings.php:305, plugin/Controllers/EditorController.php:373
|
424 |
msgid "Name"
|
425 |
msgstr "Name"
|
426 |
|
427 |
+
#: config/settings.php:306, plugin/Controllers/EditorController.php:374
|
428 |
msgid "Email"
|
429 |
msgstr "Email"
|
430 |
|
431 |
+
#: config/settings.php:307
|
432 |
+
msgid "Terms"
|
433 |
+
msgstr "Terms"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
434 |
|
435 |
+
#: config/settings.php:313
|
436 |
msgid ""
|
437 |
"Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
|
438 |
+
"will need to <a href=\"https://www.google.com/recaptcha/admin\" "
|
439 |
+
"target=\"_blank\">sign up</a> for an API key pair for your site."
|
|
|
440 |
msgstr ""
|
441 |
"Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
|
442 |
+
"will need to <a href=\"https://www.google.com/recaptcha/admin\" "
|
443 |
+
"target=\"_blank\">sign up</a> for an API key pair for your site."
|
|
|
444 |
|
445 |
+
#: config/settings.php:314
|
446 |
+
msgid "Invisible reCAPTCHA"
|
447 |
+
msgstr "Invisible reCAPTCHA"
|
448 |
|
449 |
+
#: config/settings.php:325
|
450 |
msgid "Site Key"
|
451 |
msgstr "Site Key"
|
452 |
|
453 |
+
#: config/settings.php:331
|
454 |
msgid "Site Secret"
|
455 |
msgstr "Site Secret"
|
456 |
|
457 |
+
#: config/settings.php:337
|
458 |
+
msgid ""
|
459 |
+
"This option may not work consistently if another plugin is loading "
|
460 |
+
"reCAPTCHA on the same page as Site Reviews."
|
461 |
+
msgstr ""
|
462 |
+
"This option may not work consistently if another plugin is loading "
|
463 |
+
"reCAPTCHA on the same page as Site Reviews."
|
464 |
+
|
465 |
+
#: config/settings.php:338
|
466 |
msgid "Badge Position"
|
467 |
msgstr "Badge Position"
|
468 |
|
469 |
+
#: config/settings.php:348
|
470 |
+
msgid ""
|
471 |
+
"The <a href=\"https://akismet.com\" target=\"_blank\">Akismet plugin</a> "
|
472 |
+
"integration provides spam-filtering for your reviews. In order for this "
|
473 |
+
"setting to have any affect, you will need to first install and activate the "
|
474 |
+
"Akismet plugin and set up a WordPress.com API key."
|
475 |
+
msgstr ""
|
476 |
+
"The <a href=\"https://akismet.com\" target=\"_blank\">Akismet plugin</a> "
|
477 |
+
"integration provides spam-filtering for your reviews. In order for this "
|
478 |
+
"setting to have any affect, you will need to first install and activate the "
|
479 |
+
"Akismet plugin and set up a WordPress.com API key."
|
480 |
+
|
481 |
+
#: config/settings.php:349
|
482 |
+
msgid "Enable Akismet Integration"
|
483 |
+
msgstr "Enable Akismet Integration"
|
484 |
|
485 |
+
#: config/settings.php:354
|
486 |
msgid ""
|
487 |
"When a review contains any of these words in its title, content, name, "
|
488 |
"email, or IP address, it will be rejected. One word or IP address per line. "
|
492 |
"email, or IP address, it will be rejected. One word or IP address per line. "
|
493 |
"It will match inside words, so \"press\" will match \"WordPress\"."
|
494 |
|
495 |
+
#: config/settings.php:355
|
496 |
+
msgid "Review Blacklist"
|
497 |
+
msgstr "Review Blacklist"
|
498 |
+
|
499 |
+
#: config/settings.php:361
|
500 |
+
msgid "Choose the action that should be taken when a review is blacklisted."
|
501 |
+
msgstr "Choose the action that should be taken when a review is blacklisted."
|
502 |
+
|
503 |
+
#: config/settings.php:362
|
504 |
msgid "Blacklist Action"
|
505 |
msgstr "Blacklist Action"
|
506 |
|
507 |
+
#: config/settings.php:364
|
508 |
+
msgid "Require approval"
|
509 |
+
msgstr "Require approval"
|
510 |
+
|
511 |
+
#: config/settings.php:365
|
512 |
msgid "Reject submission"
|
513 |
msgstr "Reject submission"
|
514 |
|
515 |
+
#: plugin/Application.php:192
|
516 |
+
msgid "Local"
|
517 |
+
msgstr "Local"
|
518 |
|
519 |
+
#: plugin/Review.php:154, plugin/Modules/Notification.php:66
|
520 |
+
msgid "Anonymous"
|
521 |
+
msgstr "Anonymous"
|
522 |
|
523 |
+
#: plugin/Router.php:142
|
524 |
+
msgid "There was an error (try refreshing the page)."
|
525 |
+
msgstr "There was an error (try refreshing the page)."
|
526 |
|
527 |
+
#: plugin/Router.php:144
|
528 |
+
msgid "The form could not be submitted. Please notify the site administrator."
|
529 |
+
msgstr "The form could not be submitted. Please notify the site administrator."
|
530 |
|
531 |
+
#: config/forms/submission-form.php:5
|
532 |
+
msgid "Your overall rating"
|
533 |
+
msgstr "Your overall rating"
|
534 |
|
535 |
+
#: config/forms/submission-form.php:9
|
536 |
+
msgid "Title of your review"
|
537 |
+
msgstr "Title of your review"
|
538 |
|
539 |
+
#: config/forms/submission-form.php:10
|
540 |
+
msgid "Summarize your review or highlight an interesting detail"
|
541 |
+
msgstr "Summarize your review or highlight an interesting detail"
|
542 |
|
543 |
+
#: config/forms/submission-form.php:14
|
544 |
+
msgid "Your review"
|
545 |
+
msgstr "Your review"
|
546 |
|
547 |
+
#: config/forms/submission-form.php:15
|
548 |
+
msgid "Tell people your review"
|
549 |
+
msgstr "Tell people your review"
|
550 |
|
551 |
+
#: config/forms/submission-form.php:20
|
552 |
+
msgid "Your name"
|
553 |
+
msgstr "Your name"
|
554 |
|
555 |
+
#: config/forms/submission-form.php:21
|
556 |
+
msgid "Tell us your name"
|
557 |
+
msgstr "Tell us your name"
|
558 |
|
559 |
+
#: config/forms/submission-form.php:25
|
560 |
+
msgid "Your email"
|
561 |
+
msgstr "Your email"
|
562 |
|
563 |
+
#: config/forms/submission-form.php:26
|
564 |
+
msgid "Tell us your email"
|
565 |
+
msgstr "Tell us your email"
|
566 |
|
567 |
+
#: config/forms/submission-form.php:30
|
568 |
+
msgid "This review is based on my own experience and is my genuine opinion."
|
569 |
+
msgstr "This review is based on my own experience and is my genuine opinion."
|
570 |
|
571 |
+
#: plugin/Blocks/SiteReviewsBlock.php:90, plugin/Blocks/SiteReviewsFormBlock.php:79, plugin/Blocks/SiteReviewsSummaryBlock.php:75
|
572 |
+
msgid "You have hidden all of the fields for this block."
|
573 |
+
msgstr "You have hidden all of the fields for this block."
|
574 |
|
575 |
+
#: plugin/Blocks/SiteReviewsBlock.php:124, plugin/Modules/Html/Partials/SiteReviews.php:270
|
576 |
+
msgid "Show more"
|
577 |
+
msgstr "Show more"
|
578 |
|
579 |
+
#: plugin/Controllers/AdminController.php:29
|
580 |
+
msgid "You can pin exceptional reviews so that they are always shown first."
|
581 |
+
msgstr "You can pin exceptional reviews so that they are always shown first."
|
582 |
|
583 |
+
#: plugin/Controllers/AdminController.php:37
|
584 |
+
msgid "Pin Your Reviews"
|
585 |
+
msgstr "Pin Your Reviews"
|
586 |
|
587 |
+
#: plugin/Controllers/AdminController.php:49, plugin/Controllers/MenuController.php:48, views/pages/tools/sync.php:23
|
588 |
+
msgid "Settings"
|
589 |
+
msgstr "Settings"
|
590 |
|
591 |
+
#: plugin/Controllers/AdminController.php:66
|
592 |
+
msgid "%s Review"
|
593 |
+
msgid_plural "%s Reviews"
|
594 |
+
msgstr[0] "%s Review"
|
595 |
+
msgstr[1] "%s Reviews"
|
596 |
|
597 |
+
#: plugin/Controllers/AdminController.php:101, plugin/Controllers/MainController.php:90
|
598 |
+
msgid "Recent Reviews"
|
599 |
+
msgstr "Recent Reviews"
|
600 |
|
601 |
+
#: plugin/Controllers/AdminController.php:102, plugin/Controllers/MainController.php:95
|
602 |
+
msgid "Submit a Review"
|
603 |
+
msgstr "Submit a Review"
|
604 |
|
605 |
+
#: plugin/Controllers/AdminController.php:103, plugin/Controllers/MainController.php:100
|
606 |
+
msgid "Summary of Reviews"
|
607 |
+
msgstr "Summary of Reviews"
|
608 |
|
609 |
+
#: plugin/Controllers/AdminController.php:133
|
610 |
+
msgid "Console cleared."
|
611 |
+
msgstr "Console cleared."
|
612 |
|
613 |
+
#: plugin/Controllers/AdminController.php:141
|
614 |
+
msgid "Console reloaded."
|
615 |
+
msgstr "Console reloaded."
|
616 |
|
617 |
+
#: plugin/Controllers/AdminController.php:203
|
618 |
+
msgid "Please use a valid Site Reviews settings file."
|
619 |
+
msgstr "Please use a valid Site Reviews settings file."
|
620 |
|
621 |
+
#: plugin/Controllers/AdminController.php:207
|
622 |
+
msgid "There were no settings found to import."
|
623 |
+
msgstr "There were no settings found to import."
|
624 |
|
625 |
+
#: plugin/Controllers/AdminController.php:210
|
626 |
+
msgid "Settings imported."
|
627 |
+
msgstr "Settings imported."
|
628 |
|
629 |
+
#: plugin/Controllers/AdminController.php:220
|
630 |
+
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
|
631 |
+
msgstr "The uploaded file exceeds the upload_max_filesize directive in php.ini."
|
632 |
|
633 |
+
#: plugin/Controllers/AdminController.php:221
|
634 |
+
msgid "The uploaded file is too big."
|
635 |
+
msgstr "The uploaded file is too big."
|
636 |
+
|
637 |
+
#: plugin/Controllers/AdminController.php:222
|
638 |
+
msgid "The uploaded file was only partially uploaded."
|
639 |
+
msgstr "The uploaded file was only partially uploaded."
|
640 |
+
|
641 |
+
#: plugin/Controllers/AdminController.php:223
|
642 |
+
msgid "No file was uploaded."
|
643 |
+
msgstr "No file was uploaded."
|
644 |
+
|
645 |
+
#: plugin/Controllers/AdminController.php:224
|
646 |
+
msgid "Missing a temporary folder."
|
647 |
+
msgstr "Missing a temporary folder."
|
648 |
|
649 |
+
#: plugin/Controllers/AdminController.php:225
|
650 |
+
msgid "Failed to write file to disk."
|
651 |
+
msgstr "Failed to write file to disk."
|
652 |
|
653 |
+
#: plugin/Controllers/AdminController.php:226
|
654 |
+
msgid "A PHP extension stopped the file upload."
|
655 |
+
msgstr "A PHP extension stopped the file upload."
|
656 |
+
|
657 |
+
#: plugin/Controllers/AdminController.php:229
|
658 |
+
msgid "Unknown upload error."
|
659 |
+
msgstr "Unknown upload error."
|
660 |
+
|
661 |
+
#: plugin/Controllers/AjaxController.php:61
|
662 |
msgid "Okay"
|
663 |
msgstr "Okay"
|
664 |
|
665 |
+
#: plugin/Controllers/AjaxController.php:93, plugin/Controllers/AjaxController.php:112
|
666 |
msgid "Nothing found."
|
667 |
msgstr "Nothing found."
|
668 |
|
669 |
+
#: plugin/Controllers/EditorController.php:97, plugin/Controllers/MainController.php:29, plugin/Shortcodes/SiteReviewsPopup.php:59, plugin/Shortcodes/SiteReviewsSummaryPopup.php:27, views/partials/editor/bulk-edit-assigned-to.php:7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
670 |
msgid "Assigned To"
|
671 |
msgstr "Assigned To"
|
672 |
|
673 |
+
#: plugin/Controllers/EditorController.php:98
|
674 |
msgid "Details"
|
675 |
msgstr "Details"
|
676 |
|
677 |
+
#: plugin/Controllers/EditorController.php:100, views/partials/editor/metabox-response.php:3
|
678 |
msgid "Respond Publicly"
|
679 |
msgstr "Respond Publicly"
|
680 |
|
681 |
+
#: plugin/Controllers/EditorController.php:167, plugin/Modules/Html/Fields/YesNo.php:37
|
682 |
+
msgid "No"
|
683 |
+
msgstr "No"
|
684 |
|
685 |
+
#: plugin/Controllers/EditorController.php:168, plugin/Modules/Html/Fields/YesNo.php:38
|
686 |
+
msgid "Yes"
|
687 |
+
msgstr "Yes"
|
|
|
|
|
|
|
|
|
688 |
|
689 |
+
#: plugin/Controllers/EditorController.php:220
|
690 |
+
msgid "%s reviews are read-only."
|
691 |
+
msgstr "%s reviews are read-only."
|
692 |
|
693 |
+
#: plugin/Controllers/EditorController.php:303
|
694 |
+
msgid "Revert Changes"
|
695 |
+
msgstr "Revert Changes"
|
696 |
|
697 |
+
#: plugin/Controllers/EditorController.php:309
|
698 |
+
msgid "Nothing to Revert"
|
699 |
+
msgstr "Nothing to Revert"
|
700 |
|
701 |
+
#: plugin/Controllers/EditorController.php:325
|
702 |
+
msgid "Unknown"
|
703 |
+
msgstr "Unknown"
|
704 |
+
|
705 |
+
#: plugin/Controllers/EditorController.php:360
|
706 |
+
msgid "Unregistered user"
|
707 |
+
msgstr "Unregistered user"
|
708 |
+
|
709 |
+
#: plugin/Controllers/EditorController.php:367
|
710 |
+
msgid "RE:"
|
711 |
+
msgstr "RE:"
|
712 |
+
|
713 |
+
#: plugin/Controllers/EditorController.php:371, plugin/Controllers/MainController.php:31, plugin/Shortcodes/TinymcePopupGenerator.php:136
|
714 |
msgid "Type"
|
715 |
msgstr "Type"
|
716 |
|
717 |
+
#: plugin/Controllers/EditorController.php:372, plugin/Defaults/PostTypeDefaults.php:18
|
718 |
+
msgid "Date"
|
719 |
+
msgstr "Date"
|
720 |
|
721 |
+
#: plugin/Controllers/EditorController.php:375
|
722 |
+
msgid "User"
|
723 |
+
msgstr "User"
|
724 |
+
|
725 |
+
#: plugin/Controllers/EditorController.php:376
|
726 |
+
msgid "IP Address"
|
727 |
+
msgstr "IP Address"
|
728 |
+
|
729 |
+
#: plugin/Controllers/EditorController.php:377
|
730 |
+
msgid "Avatar"
|
731 |
+
msgstr "Avatar"
|
732 |
+
|
733 |
+
#: plugin/Controllers/ListTableController.php:43
|
734 |
+
msgid "%s review updated."
|
735 |
+
msgid_plural "%s reviews updated."
|
736 |
+
msgstr[0] "%s review updated."
|
737 |
+
msgstr[1] "%s reviews updated."
|
738 |
+
|
739 |
+
#: plugin/Controllers/ListTableController.php:44
|
740 |
+
msgid "%s review not updated, somebody is editing it."
|
741 |
+
msgid_plural "%s reviews not updated, somebody is editing them."
|
742 |
+
msgstr[0] "%s review not updated, somebody is editing it."
|
743 |
+
msgstr[1] "%s reviews not updated, somebody is editing them."
|
744 |
+
|
745 |
+
#: plugin/Controllers/ListTableController.php:45
|
746 |
+
msgid "%s review permanently deleted."
|
747 |
+
msgid_plural "%s reviews permanently deleted."
|
748 |
+
msgstr[0] "%s review permanently deleted."
|
749 |
+
msgstr[1] "%s reviews permanently deleted."
|
750 |
+
|
751 |
+
#: plugin/Controllers/ListTableController.php:46
|
752 |
+
msgid "%s review moved to the Trash."
|
753 |
+
msgid_plural "%s reviews moved to the Trash."
|
754 |
+
msgstr[0] "%s review moved to the Trash."
|
755 |
+
msgstr[1] "%s reviews moved to the Trash."
|
756 |
+
|
757 |
+
#: plugin/Controllers/ListTableController.php:47
|
758 |
+
msgid "%s review restored from the Trash."
|
759 |
+
msgid_plural "%s reviews restored from the Trash."
|
760 |
+
msgstr[0] "%s review restored from the Trash."
|
761 |
+
msgstr[1] "%s reviews restored from the Trash."
|
762 |
|
763 |
+
#: plugin/Controllers/ListTableController.php:79
|
764 |
+
msgid "Submitted"
|
765 |
+
msgstr "Submitted"
|
766 |
+
|
767 |
+
#: plugin/Controllers/ListTableController.php:106, plugin/Controllers/ListTableController.php:172, plugin/Controllers/EditorController/Labels.php:117, plugin/Controllers/EditorController/Labels.php:118
|
768 |
+
msgid "Unapproved"
|
769 |
+
msgstr "Unapproved"
|
770 |
|
771 |
+
#: plugin/Controllers/ListTableController.php:123, plugin/Controllers/EditorController/Labels.php:120
|
772 |
msgid "Approve"
|
773 |
msgstr "Approve"
|
774 |
|
775 |
+
#: plugin/Controllers/ListTableController.php:124
|
|
|
|
|
|
|
|
|
776 |
msgid "Unapprove"
|
777 |
msgstr "Unapprove"
|
778 |
|
779 |
+
#: plugin/Controllers/ListTableController.php:171, plugin/Controllers/EditorController/Labels.php:18, plugin/Controllers/EditorController/Labels.php:121
|
780 |
+
msgid "Approved"
|
781 |
+
msgstr "Approved"
|
|
|
|
|
|
|
|
|
782 |
|
783 |
+
#: plugin/Controllers/MainController.php:30
|
784 |
+
msgid "Author"
|
785 |
+
msgstr "Author"
|
786 |
|
787 |
+
#: plugin/Controllers/MainController.php:33, views/partials/editor/pinned.php:4
|
788 |
+
msgid "Pinned"
|
789 |
+
msgstr "Pinned"
|
790 |
|
791 |
+
#: plugin/Controllers/MainController.php:39, plugin/Controllers/MenuController.php:108, views/pages/tools/sync.php:10, views/pages/tools/sync.php:31
|
792 |
+
msgid "Reviews"
|
793 |
+
msgstr "Reviews"
|
794 |
|
795 |
+
#: plugin/Controllers/MainController.php:89
|
796 |
+
msgid "Your site’s most recent reviews."
|
797 |
+
msgstr "Your site’s most recent reviews."
|
798 |
|
799 |
+
#: plugin/Controllers/MainController.php:94
|
800 |
msgid "A \"submit a review\" form for your site."
|
801 |
msgstr "A \"submit a review\" form for your site."
|
802 |
|
803 |
+
#: plugin/Controllers/MainController.php:99
|
804 |
+
msgid "A summary of your site’s reviews."
|
805 |
+
msgstr "A summary of your site’s reviews."
|
806 |
+
|
807 |
+
#: plugin/Controllers/MenuController.php:49
|
808 |
+
msgid "Tools"
|
809 |
+
msgstr "Tools"
|
810 |
+
|
811 |
+
#: plugin/Controllers/MenuController.php:50
|
812 |
+
msgid "Add-ons"
|
813 |
+
msgstr "Add-ons"
|
814 |
+
|
815 |
+
#: plugin/Controllers/MenuController.php:51, views/pages/tools/sync.php:25
|
816 |
+
msgid "Documentation"
|
817 |
+
msgstr "Documentation"
|
818 |
+
|
819 |
+
#: plugin/Controllers/MenuController.php:81
|
820 |
msgid "Support"
|
821 |
msgstr "Support"
|
822 |
|
823 |
+
#: plugin/Controllers/MenuController.php:82
|
824 |
+
msgid "FAQ"
|
825 |
+
msgstr "FAQ"
|
826 |
+
|
827 |
+
#: plugin/Controllers/MenuController.php:83
|
828 |
msgid "Shortcodes"
|
829 |
msgstr "Shortcodes"
|
830 |
|
831 |
+
#: plugin/Controllers/MenuController.php:84
|
832 |
msgid "Hooks"
|
833 |
msgstr "Hooks"
|
834 |
|
835 |
+
#: plugin/Controllers/MenuController.php:85
|
836 |
+
msgid "Functions"
|
837 |
+
msgstr "Functions"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
838 |
|
839 |
+
#: plugin/Controllers/MenuController.php:86, plugin/Controllers/MenuController.php:112
|
840 |
+
msgid "Addons"
|
841 |
+
msgstr "Addons"
|
842 |
|
843 |
+
#: plugin/Controllers/MenuController.php:107, plugin/Controllers/MenuController.php:136
|
844 |
msgid "General"
|
845 |
msgstr "General"
|
846 |
|
847 |
+
#: plugin/Controllers/MenuController.php:109
|
848 |
+
msgid "Submissions"
|
849 |
+
msgstr "Submissions"
|
850 |
|
851 |
+
#: plugin/Controllers/MenuController.php:110, plugin/Shortcodes/SiteReviewsPopup.php:64, plugin/Shortcodes/SiteReviewsSummaryPopup.php:32
|
852 |
+
msgid "Schema"
|
853 |
+
msgstr "Schema"
|
854 |
|
855 |
+
#: plugin/Controllers/MenuController.php:113
|
856 |
msgid "Licenses"
|
857 |
msgstr "Licenses"
|
858 |
|
859 |
+
#: plugin/Controllers/MenuController.php:137, views/pages/tools/sync.php:57
|
860 |
+
msgid "Sync Reviews"
|
861 |
+
msgstr "Sync Reviews"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
862 |
|
863 |
+
#: plugin/Controllers/MenuController.php:138
|
864 |
+
msgid "Console"
|
865 |
+
msgstr "Console"
|
866 |
|
867 |
+
#: plugin/Controllers/MenuController.php:139
|
868 |
+
msgid "System Info"
|
869 |
+
msgstr "System Info"
|
870 |
|
871 |
+
#: plugin/Controllers/SettingsController.php:29
|
872 |
+
msgid "Settings updated."
|
873 |
+
msgstr "Settings updated."
|
874 |
|
875 |
+
#: plugin/Controllers/SettingsController.php:106
|
876 |
+
msgid "Please install/activate the Polylang plugin to enable integration."
|
877 |
+
msgstr "Please install/activate the Polylang plugin to enable integration."
|
878 |
|
879 |
+
#: plugin/Controllers/SettingsController.php:110
|
880 |
+
msgid ""
|
881 |
+
"Please update the Polylang plugin to v2.3.0 or greater to enable "
|
882 |
+
"integration."
|
883 |
+
msgstr ""
|
884 |
+
"Please update the Polylang plugin to v2.3.0 or greater to enable "
|
885 |
+
"integration."
|
886 |
|
887 |
+
#: plugin/Controllers/TaxonomyController.php:39
|
888 |
+
msgid "Filter by category"
|
889 |
+
msgstr "Filter by category"
|
890 |
|
891 |
+
#: plugin/Defaults/PaginationDefaults.php:16
|
892 |
+
msgid "Page"
|
893 |
+
msgstr "Page"
|
894 |
|
895 |
+
#: plugin/Defaults/PaginationDefaults.php:19
|
896 |
+
msgid "Next →"
|
897 |
+
msgstr "Next →"
|
898 |
|
899 |
+
#: plugin/Defaults/PaginationDefaults.php:20
|
900 |
+
msgid "← Previous"
|
901 |
+
msgstr "← Previous"
|
902 |
|
903 |
+
#: plugin/Defaults/SlackDefaults.php:15
|
904 |
+
msgid "View Review"
|
905 |
+
msgstr "View Review"
|
|
|
|
|
906 |
|
907 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:15
|
908 |
+
msgid "This field must be accepted."
|
909 |
+
msgstr "This field must be accepted."
|
|
|
|
|
910 |
|
911 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:16
|
912 |
+
msgid "This field value must be between %s and %s."
|
913 |
+
msgstr "This field value must be between %s and %s."
|
|
|
|
|
914 |
|
915 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:17
|
916 |
+
msgid "This field must have between %s and %s characters."
|
917 |
+
msgstr "This field must have between %s and %s characters."
|
|
|
|
|
918 |
|
919 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:18
|
920 |
+
msgid "This field requires a valid e-mail address."
|
921 |
+
msgstr "This field requires a valid e-mail address."
|
|
|
|
|
922 |
|
923 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:19, plugin/Modules/Validator/ValidateReview.php:254
|
924 |
msgid "Please fix the submission errors."
|
925 |
msgstr "Please fix the submission errors."
|
926 |
|
927 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:20
|
928 |
+
msgid "Maximum value for this field is %s."
|
929 |
+
msgstr "Maximum value for this field is %s."
|
930 |
|
931 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:21
|
932 |
+
msgid "This field allows a maximum of %s characters."
|
933 |
+
msgstr "This field allows a maximum of %s characters."
|
934 |
|
935 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:22
|
936 |
+
msgid "Minimum value for this field is %s."
|
937 |
+
msgstr "Minimum value for this field is %s."
|
938 |
|
939 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:23
|
940 |
+
msgid "This field requires a minimum of %s characters."
|
941 |
+
msgstr "This field requires a minimum of %s characters."
|
942 |
|
943 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:24
|
944 |
+
msgid "This field requires a number."
|
945 |
+
msgstr "This field requires a number."
|
946 |
+
|
947 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:25
|
948 |
+
msgid "This field is required."
|
949 |
+
msgstr "This field is required."
|
950 |
+
|
951 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:26
|
952 |
+
msgid "The review could not be submitted (unsupported browser)."
|
953 |
+
msgstr "The review could not be submitted (unsupported browser)."
|
954 |
|
955 |
+
#: plugin/Handlers/ChangeStatus.php:39, views/partials/editor/pinned.php:7
|
956 |
msgid "Edit"
|
957 |
msgstr "Edit"
|
958 |
|
959 |
+
#: plugin/Handlers/CreateReview.php:20
|
960 |
+
msgid ""
|
961 |
+
"Your review could not be submitted and the error has been logged. Please "
|
962 |
+
"notify the site admin."
|
963 |
+
msgstr ""
|
964 |
+
"Your review could not be submitted and the error has been logged. Please "
|
965 |
+
"notify the site admin."
|
966 |
|
967 |
+
#: plugin/Handlers/CreateReview.php:23
|
968 |
+
msgid "Your review has been submitted!"
|
969 |
+
msgstr "Your review has been submitted!"
|
970 |
|
971 |
+
#: plugin/Handlers/TogglePinned.php:24
|
972 |
+
msgid "Review pinned."
|
973 |
+
msgstr "Review pinned."
|
974 |
|
975 |
+
#: plugin/Handlers/TogglePinned.php:25
|
976 |
+
msgid "Review unpinned."
|
977 |
+
msgstr "Review unpinned."
|
978 |
|
979 |
+
#: plugin/Modules/Console.php:114
|
980 |
+
msgid "Console is empty"
|
981 |
+
msgstr "Console is empty"
|
982 |
|
983 |
+
#: plugin/Modules/Console.php:302
|
984 |
+
msgid "Console was automatically cleared (128 KB maximum size)"
|
985 |
+
msgstr "Console was automatically cleared (128 KB maximum size)"
|
986 |
|
987 |
+
#: plugin/Modules/Date.php:36
|
988 |
+
msgid "%s second ago"
|
989 |
+
msgid_plural "%s seconds ago"
|
990 |
+
msgstr[0] "%s second ago"
|
991 |
+
msgstr[1] "%s seconds ago"
|
992 |
+
|
993 |
+
#: plugin/Modules/Date.php:37
|
994 |
+
msgid "%s minute ago"
|
995 |
+
msgid_plural "%s minutes ago"
|
996 |
+
msgstr[0] "%s minute ago"
|
997 |
+
msgstr[1] "%s minutes ago"
|
998 |
|
999 |
+
#: plugin/Modules/Date.php:38
|
1000 |
+
msgid "an hour ago"
|
1001 |
+
msgid_plural "%s hours ago"
|
1002 |
+
msgstr[0] "an hour ago"
|
1003 |
+
msgstr[1] "%s hours ago"
|
1004 |
|
1005 |
+
#: plugin/Modules/Date.php:39
|
1006 |
+
msgid "yesterday"
|
1007 |
+
msgid_plural "%s days ago"
|
1008 |
+
msgstr[0] "yesterday"
|
1009 |
+
msgstr[1] "%s days ago"
|
1010 |
|
1011 |
+
#: plugin/Modules/Date.php:40
|
1012 |
+
msgid "a week ago"
|
1013 |
+
msgid_plural "%s weeks ago"
|
1014 |
+
msgstr[0] "a week ago"
|
1015 |
+
msgstr[1] "%s weeks ago"
|
1016 |
|
1017 |
+
#: plugin/Modules/Date.php:41
|
1018 |
+
msgid "%s month ago"
|
1019 |
+
msgid_plural "%s months ago"
|
1020 |
+
msgstr[0] "%s month ago"
|
1021 |
+
msgstr[1] "%s months ago"
|
1022 |
|
1023 |
+
#: plugin/Modules/Date.php:42
|
1024 |
+
msgid "%s year ago"
|
1025 |
+
msgid_plural "%s years ago"
|
1026 |
+
msgstr[0] "%s year ago"
|
1027 |
+
msgstr[1] "%s years ago"
|
1028 |
|
1029 |
+
#: plugin/Modules/Translation.php:117
|
1030 |
+
msgid ""
|
1031 |
+
"This custom translation is no longer valid as the original text has been "
|
1032 |
+
"changed or removed."
|
1033 |
+
msgstr ""
|
1034 |
+
"This custom translation is no longer valid as the original text has been "
|
1035 |
+
"changed or removed."
|
1036 |
|
1037 |
+
#: plugin/Shortcodes/Shortcode.php:162
|
1038 |
msgid "Excellent"
|
1039 |
msgstr "Excellent"
|
1040 |
|
1041 |
+
#: plugin/Shortcodes/Shortcode.php:163
|
1042 |
msgid "Very good"
|
1043 |
msgstr "Very good"
|
1044 |
|
1045 |
+
#: plugin/Shortcodes/Shortcode.php:164
|
1046 |
msgid "Average"
|
1047 |
msgstr "Average"
|
1048 |
|
1049 |
+
#: plugin/Shortcodes/Shortcode.php:165
|
1050 |
msgid "Poor"
|
1051 |
msgstr "Poor"
|
1052 |
|
1053 |
+
#: plugin/Shortcodes/Shortcode.php:166
|
1054 |
msgid "Terrible"
|
1055 |
msgstr "Terrible"
|
1056 |
|
1057 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:17, plugin/Shortcodes/SiteReviewsPopup.php:16, plugin/Shortcodes/SiteReviewsSummaryPopup.php:15
|
1058 |
+
msgid "All settings are optional."
|
1059 |
+
msgstr "All settings are optional."
|
|
|
|
|
|
|
|
|
1060 |
|
1061 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:21, plugin/Shortcodes/SiteReviewsPopup.php:22, plugin/Shortcodes/SiteReviewsSummaryPopup.php:21
|
1062 |
+
msgid "Enter a custom shortcode heading."
|
1063 |
+
msgstr "Enter a custom shortcode heading."
|
1064 |
|
1065 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:24, plugin/Widgets/SiteReviewsFormWidget.php:26
|
1066 |
+
msgid "Description"
|
1067 |
+
msgstr "Description"
|
1068 |
|
1069 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:29
|
1070 |
+
msgid "Enter a custom shortcode description."
|
1071 |
+
msgstr "Enter a custom shortcode description."
|
1072 |
|
1073 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:32
|
1074 |
+
msgid "Automatically assign a category to reviews submitted with this shortcode."
|
1075 |
+
msgstr "Automatically assign a category to reviews submitted with this shortcode."
|
1076 |
|
1077 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:34
|
1078 |
+
msgid "Assign To"
|
1079 |
+
msgstr "Assign To"
|
1080 |
|
1081 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:36
|
1082 |
+
msgid ""
|
1083 |
+
"Assign submitted reviews to a custom page/post ID. You can also enter "
|
1084 |
+
"\"post_id\" to assign reviews to the ID of the current page."
|
1085 |
+
msgstr ""
|
1086 |
+
"Assign submitted reviews to a custom page/post ID. You can also enter "
|
1087 |
+
"\"post_id\" to assign reviews to the ID of the current page."
|
1088 |
|
1089 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:39, plugin/Shortcodes/SiteReviewsPopup.php:73, plugin/Shortcodes/SiteReviewsSummaryPopup.php:41
|
1090 |
+
msgid "Classes"
|
1091 |
+
msgstr "Classes"
|
1092 |
|
1093 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:41, plugin/Shortcodes/SiteReviewsPopup.php:75, plugin/Shortcodes/SiteReviewsSummaryPopup.php:43
|
1094 |
+
msgid "Add custom CSS classes to the shortcode."
|
1095 |
+
msgstr "Add custom CSS classes to the shortcode."
|
1096 |
|
1097 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:46, plugin/Shortcodes/SiteReviewsPopup.php:80, plugin/Shortcodes/SiteReviewsSummaryPopup.php:48
|
1098 |
+
msgid "Hide"
|
1099 |
+
msgstr "Hide"
|
1100 |
|
1101 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:11
|
1102 |
+
msgid "Hide the rating field"
|
1103 |
+
msgstr "Hide the rating field"
|
1104 |
|
1105 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:12
|
1106 |
+
msgid "Hide the title field"
|
1107 |
+
msgstr "Hide the title field"
|
1108 |
|
1109 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:13
|
1110 |
+
msgid "Hide the review field"
|
1111 |
+
msgstr "Hide the review field"
|
1112 |
|
1113 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:14
|
1114 |
+
msgid "Hide the name field"
|
1115 |
+
msgstr "Hide the name field"
|
1116 |
|
1117 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:15
|
1118 |
+
msgid "Hide the email field"
|
1119 |
+
msgstr "Hide the email field"
|
1120 |
|
1121 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:16
|
1122 |
+
msgid "Hide the terms field"
|
1123 |
+
msgstr "Hide the terms field"
|
1124 |
|
1125 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:25
|
1126 |
+
msgid "Count"
|
1127 |
+
msgstr "Count"
|
1128 |
|
1129 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:30
|
1130 |
+
msgid "How many reviews would you like to display (default: 10)?"
|
1131 |
+
msgstr "How many reviews would you like to display (default: 10)?"
|
1132 |
|
1133 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:36, plugin/Shortcodes/SiteReviewsPopup.php:37, plugin/Shortcodes/SiteReviewsPopup.php:38, plugin/Shortcodes/SiteReviewsPopup.php:39, plugin/Shortcodes/SiteReviewsPopup.php:40, plugin/Widgets/SiteReviewsWidget.php:35, plugin/Widgets/SiteReviewsWidget.php:36, plugin/Widgets/SiteReviewsWidget.php:37, plugin/Widgets/SiteReviewsWidget.php:38, plugin/Widgets/SiteReviewsWidget.php:39, plugin/Controllers/ListTableController/Columns.php:113
|
1134 |
+
msgid "%s star"
|
1135 |
+
msgid_plural "%s stars"
|
1136 |
+
msgstr[0] "%s star"
|
1137 |
+
msgstr[1] "%s stars"
|
1138 |
|
1139 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:41
|
1140 |
+
msgid "Unrated"
|
1141 |
+
msgstr "Unrated"
|
1142 |
|
1143 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:43
|
1144 |
+
msgid "What is the minimum rating to display (default: 1 star)?"
|
1145 |
+
msgstr "What is the minimum rating to display (default: 1 star)?"
|
1146 |
|
1147 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:46
|
1148 |
+
msgid "Pagination"
|
1149 |
+
msgstr "Pagination"
|
1150 |
|
1151 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:49
|
1152 |
+
msgid "Enable"
|
1153 |
+
msgstr "Enable"
|
1154 |
|
1155 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:50
|
1156 |
+
msgid "Enable (using ajax)"
|
1157 |
+
msgstr "Enable (using ajax)"
|
1158 |
|
1159 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:51
|
1160 |
+
msgid "Disable"
|
1161 |
+
msgstr "Disable"
|
1162 |
|
1163 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:53
|
1164 |
+
msgid ""
|
1165 |
+
"When using pagination this shortcode can only be used once on a page. "
|
1166 |
+
"(default: disable)"
|
1167 |
+
msgstr ""
|
1168 |
+
"When using pagination this shortcode can only be used once on a page. "
|
1169 |
+
"(default: disable)"
|
1170 |
|
1171 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:56, plugin/Widgets/SiteReviewsWidget.php:45
|
1172 |
+
msgid "Which type of review would you like to display?"
|
1173 |
+
msgstr "Which type of review would you like to display?"
|
1174 |
|
1175 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:57, plugin/Shortcodes/SiteReviewsSummaryPopup.php:25
|
1176 |
+
msgid "Limit reviews to this category."
|
1177 |
+
msgstr "Limit reviews to this category."
|
1178 |
|
1179 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:61, plugin/Shortcodes/SiteReviewsSummaryPopup.php:29
|
1180 |
+
msgid ""
|
1181 |
+
"Limit reviews to those assigned to this post ID (separate multiple IDs with "
|
1182 |
+
"a comma). You can also enter \"post_id\" to use the ID of the current page, "
|
1183 |
+
"or \"parent_id\" to use the ID of the parent page."
|
1184 |
+
msgstr ""
|
1185 |
+
"Limit reviews to those assigned to this post ID (separate multiple IDs with "
|
1186 |
+
"a comma). You can also enter \"post_id\" to use the ID of the current page, "
|
1187 |
+
"or \"parent_id\" to use the ID of the parent page."
|
1188 |
|
1189 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:67, plugin/Shortcodes/SiteReviewsSummaryPopup.php:35
|
1190 |
+
msgid "Enable rich snippets"
|
1191 |
+
msgstr "Enable rich snippets"
|
1192 |
|
1193 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:68, plugin/Shortcodes/SiteReviewsSummaryPopup.php:36
|
1194 |
+
msgid "Disable rich snippets"
|
1195 |
+
msgstr "Disable rich snippets"
|
1196 |
|
1197 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:70, plugin/Shortcodes/SiteReviewsSummaryPopup.php:38
|
1198 |
+
msgid "Rich snippets are disabled by default."
|
1199 |
+
msgstr "Rich snippets are disabled by default."
|
|
|
|
|
|
|
|
|
1200 |
|
1201 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:11
|
1202 |
+
msgid "Hide the title"
|
1203 |
+
msgstr "Hide the title"
|
1204 |
|
1205 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:12, plugin/Shortcodes/SiteReviewsSummaryShortcode.php:11
|
1206 |
+
msgid "Hide the rating"
|
1207 |
+
msgstr "Hide the rating"
|
1208 |
|
1209 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:13
|
1210 |
+
msgid "Hide the date"
|
1211 |
+
msgstr "Hide the date"
|
1212 |
|
1213 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:14
|
1214 |
+
msgid "Hide the assigned to link (if shown)"
|
1215 |
+
msgstr "Hide the assigned to link (if shown)"
|
1216 |
|
1217 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:15
|
1218 |
+
msgid "Hide the content"
|
1219 |
+
msgstr "Hide the content"
|
1220 |
|
1221 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:16
|
1222 |
+
msgid "Hide the avatar (if shown)"
|
1223 |
+
msgstr "Hide the avatar (if shown)"
|
1224 |
|
1225 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:17
|
1226 |
+
msgid "Hide the author"
|
1227 |
+
msgstr "Hide the author"
|
1228 |
|
1229 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:18
|
1230 |
+
msgid "Hide the response"
|
1231 |
+
msgstr "Hide the response"
|
1232 |
|
1233 |
+
#: plugin/Shortcodes/SiteReviewsSummaryPopup.php:24, plugin/Widgets/SiteReviewsSummaryWidget.php:27
|
1234 |
+
msgid "Which type of review would you like to use?"
|
1235 |
+
msgstr "Which type of review would you like to use?"
|
1236 |
|
1237 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:12
|
1238 |
+
msgid "Hide the stars"
|
1239 |
+
msgstr "Hide the stars"
|
1240 |
|
1241 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:13
|
1242 |
+
msgid "Hide the summary"
|
1243 |
+
msgstr "Hide the summary"
|
1244 |
|
1245 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:14
|
1246 |
+
msgid "Hide the percentage bars"
|
1247 |
+
msgstr "Hide the percentage bars"
|
1248 |
|
1249 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:15
|
1250 |
+
msgid "Hide if no reviews are found"
|
1251 |
+
msgstr "Hide if no reviews are found"
|
1252 |
|
1253 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:44
|
1254 |
+
msgid "Close"
|
1255 |
+
msgstr "Close"
|
1256 |
|
1257 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:45
|
1258 |
+
msgid "Insert Shortcode"
|
1259 |
+
msgstr "Insert Shortcode"
|
1260 |
|
1261 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:50
|
1262 |
+
msgid "Shortcode"
|
1263 |
+
msgstr "Shortcode"
|
1264 |
|
1265 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:80
|
1266 |
+
msgid "Category"
|
1267 |
+
msgstr "Category"
|
1268 |
|
1269 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:204
|
1270 |
+
msgid "- Select -"
|
1271 |
+
msgstr "- Select -"
|
1272 |
|
1273 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:308
|
1274 |
+
msgid "Some of the shortcode options are required."
|
1275 |
+
msgstr "Some of the shortcode options are required."
|
1276 |
|
1277 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:31
|
1278 |
+
msgid "Automatically assign a category"
|
1279 |
+
msgstr "Automatically assign a category"
|
1280 |
|
1281 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:33
|
1282 |
+
msgid "Do not assign a category"
|
1283 |
+
msgstr "Do not assign a category"
|
1284 |
|
1285 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:38
|
1286 |
+
msgid "You may also enter %s to assign to the current post."
|
1287 |
+
msgstr "You may also enter %s to assign to the current post."
|
1288 |
|
1289 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:39
|
1290 |
+
msgid "Assign reviews to a custom page/post ID"
|
1291 |
+
msgstr "Assign reviews to a custom page/post ID"
|
1292 |
|
1293 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:44, plugin/Widgets/SiteReviewsSummaryWidget.php:49, plugin/Widgets/SiteReviewsWidget.php:67
|
1294 |
+
msgid "Enter any custom CSS classes here"
|
1295 |
+
msgstr "Enter any custom CSS classes here"
|
1296 |
|
1297 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:29
|
1298 |
+
msgid "All review types"
|
1299 |
+
msgstr "All review types"
|
1300 |
|
1301 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:35
|
1302 |
+
msgid "Limit summary to this category"
|
1303 |
+
msgstr "Limit summary to this category"
|
1304 |
|
1305 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:37, plugin/Widgets/SiteReviewsWidget.php:55
|
1306 |
+
msgid "All Categories"
|
1307 |
+
msgstr "All Categories"
|
1308 |
|
1309 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:43, plugin/Widgets/SiteReviewsWidget.php:61
|
1310 |
+
msgid ""
|
1311 |
+
"Separate multiple ID's with a comma. You may also enter %s to automatically "
|
1312 |
+
"represent the current page/post ID."
|
1313 |
+
msgstr ""
|
1314 |
+
"Separate multiple ID's with a comma. You may also enter %s to automatically "
|
1315 |
+
"represent the current page/post ID."
|
1316 |
|
1317 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:44
|
1318 |
+
msgid "Limit summary to reviews assigned to a page/post ID"
|
1319 |
+
msgstr "Limit summary to reviews assigned to a page/post ID"
|
1320 |
|
1321 |
+
#: plugin/Widgets/SiteReviewsWidget.php:27
|
1322 |
+
msgid "How many reviews would you like to display?"
|
1323 |
+
msgstr "How many reviews would you like to display?"
|
1324 |
|
1325 |
+
#: plugin/Widgets/SiteReviewsWidget.php:32
|
1326 |
+
msgid "What is the minimum rating to display?"
|
1327 |
+
msgstr "What is the minimum rating to display?"
|
1328 |
|
1329 |
+
#: plugin/Widgets/SiteReviewsWidget.php:47
|
1330 |
+
msgid "All Reviews"
|
1331 |
+
msgstr "All Reviews"
|
1332 |
|
1333 |
+
#: plugin/Widgets/SiteReviewsWidget.php:53
|
1334 |
+
msgid "Limit reviews to this category"
|
1335 |
+
msgstr "Limit reviews to this category"
|
1336 |
|
1337 |
+
#: plugin/Widgets/SiteReviewsWidget.php:62
|
1338 |
+
msgid "Limit reviews to those assigned to this page/post ID"
|
1339 |
+
msgstr "Limit reviews to those assigned to this page/post ID"
|
1340 |
|
1341 |
+
#: plugin/Controllers/EditorController/Labels.php:17, plugin/Controllers/EditorController/Labels.php:122
|
1342 |
+
msgid "Save as Unapproved"
|
1343 |
+
msgstr "Save as Unapproved"
|
1344 |
|
1345 |
+
#: plugin/Controllers/EditorController/Labels.php:93
|
1346 |
+
msgid "Review has been approved and published."
|
1347 |
+
msgstr "Review has been approved and published."
|
1348 |
|
1349 |
+
#: plugin/Controllers/EditorController/Labels.php:94
|
1350 |
+
msgid "Review draft updated."
|
1351 |
+
msgstr "Review draft updated."
|
1352 |
|
1353 |
+
#: plugin/Controllers/EditorController/Labels.php:95
|
1354 |
+
msgid "Preview review"
|
1355 |
+
msgstr "Preview review"
|
1356 |
|
1357 |
+
#: plugin/Controllers/EditorController/Labels.php:96
|
1358 |
+
msgid "Review approved and published."
|
1359 |
+
msgstr "Review approved and published."
|
1360 |
|
1361 |
+
#: plugin/Controllers/EditorController/Labels.php:97
|
1362 |
+
msgid "Review restored to revision from %s."
|
1363 |
+
msgstr "Review restored to revision from %s."
|
1364 |
|
1365 |
+
#: plugin/Controllers/EditorController/Labels.php:98
|
1366 |
+
msgid "Review has been reverted to its original submission state."
|
1367 |
+
msgstr "Review has been reverted to its original submission state."
|
1368 |
|
1369 |
+
#: plugin/Controllers/EditorController/Labels.php:99
|
1370 |
+
msgid "Review saved."
|
1371 |
+
msgstr "Review saved."
|
1372 |
|
1373 |
+
#: plugin/Controllers/EditorController/Labels.php:100
|
1374 |
+
msgid "Review scheduled for: %s."
|
1375 |
+
msgstr "Review scheduled for: %s."
|
1376 |
|
1377 |
+
#: plugin/Controllers/EditorController/Labels.php:101
|
1378 |
+
msgid "Review submitted."
|
1379 |
+
msgstr "Review submitted."
|
1380 |
|
1381 |
+
#: plugin/Controllers/EditorController/Labels.php:102
|
1382 |
+
msgid "Review has been unapproved and is now pending."
|
1383 |
+
msgstr "Review has been unapproved and is now pending."
|
1384 |
|
1385 |
+
#: plugin/Controllers/EditorController/Labels.php:103
|
1386 |
+
msgid "Review updated."
|
1387 |
+
msgstr "Review updated."
|
1388 |
|
1389 |
+
#: plugin/Controllers/EditorController/Labels.php:104
|
1390 |
+
msgid "View review"
|
1391 |
+
msgstr "View review"
|
1392 |
|
1393 |
+
#: plugin/Controllers/EditorController/Labels.php:119
|
1394 |
+
msgid "Privately Approved"
|
1395 |
+
msgstr "Privately Approved"
|
1396 |
|
1397 |
+
#: plugin/Controllers/ListTableController/Columns.php:72
|
1398 |
+
msgid "Unsupported Type"
|
1399 |
+
msgstr "Unsupported Type"
|
1400 |
|
1401 |
+
#: plugin/Controllers/ListTableController/Columns.php:116
|
1402 |
+
msgid "Filter by rating"
|
1403 |
+
msgstr "Filter by rating"
|
1404 |
|
1405 |
+
#: plugin/Controllers/ListTableController/Columns.php:122
|
1406 |
+
msgid "All ratings"
|
1407 |
+
msgstr "All ratings"
|
1408 |
|
1409 |
+
#: plugin/Controllers/ListTableController/Columns.php:134
|
1410 |
+
msgid "Filter by type"
|
1411 |
+
msgstr "Filter by type"
|
1412 |
|
1413 |
+
#: plugin/Controllers/ListTableController/Columns.php:140
|
1414 |
+
msgid "All types"
|
1415 |
+
msgstr "All types"
|
1416 |
|
1417 |
+
#: plugin/Modules/Validator/ValidateReview.php:181
|
1418 |
+
msgid "This review has been flagged as possible spam and cannot be submitted."
|
1419 |
+
msgstr "This review has been flagged as possible spam and cannot be submitted."
|
1420 |
|
1421 |
+
#: plugin/Modules/Validator/ValidateReview.php:194
|
1422 |
+
msgid "Your review cannot be submitted at this time."
|
1423 |
+
msgstr "Your review cannot be submitted at this time."
|
1424 |
|
1425 |
+
#: plugin/Modules/Validator/ValidateReview.php:212, plugin/Modules/Validator/ValidateReview.php:223
|
1426 |
+
msgid "The review submission failed. Please notify the site administrator."
|
1427 |
+
msgstr "The review submission failed. Please notify the site administrator."
|
1428 |
|
1429 |
+
#: plugin/Modules/Validator/ValidateReview.php:242
|
1430 |
+
msgid "The reCAPTCHA failed to load, please refresh the page and try again."
|
1431 |
+
msgstr "The reCAPTCHA failed to load, please refresh the page and try again."
|
1432 |
|
1433 |
+
#: plugin/Modules/Validator/ValidateReview.php:243
|
1434 |
+
msgid "The reCAPTCHA verification failed, please try again."
|
1435 |
+
msgstr "The reCAPTCHA verification failed, please try again."
|
1436 |
|
1437 |
+
#: views/pages/addons/index.php:6
|
1438 |
+
msgid ""
|
1439 |
+
"Now that Site Reviews v3.0 (a major overhaul of the plugin) has been "
|
1440 |
+
"released, the only thing delaying the add-ons is the distribution platform "
|
1441 |
+
"which is currently being built. Expect to see them in the coming months!"
|
1442 |
+
msgstr ""
|
1443 |
+
"Now that Site Reviews v3.0 (a major overhaul of the plugin) has been "
|
1444 |
+
"released, the only thing delaying the add-ons is the distribution platform "
|
1445 |
+
"which is currently being built. Expect to see them in the coming months!"
|
1446 |
|
1447 |
+
#: views/pages/addons/index.php:7
|
1448 |
+
msgid "Thank you for your patience."
|
1449 |
+
msgstr "Thank you for your patience."
|
1450 |
|
1451 |
+
#: views/pages/addons/index.php:9
|
1452 |
+
msgid "Add-ons extend the functionality of Site Reviews."
|
1453 |
+
msgstr "Add-ons extend the functionality of Site Reviews."
|
1454 |
|
1455 |
+
#: views/pages/addons/index.php:14
|
1456 |
+
msgid "Allow your visitors to submit multiple images with their reviews."
|
1457 |
+
msgstr "Allow your visitors to submit multiple images with their reviews."
|
1458 |
|
1459 |
+
#: views/pages/addons/index.php:23
|
1460 |
+
msgid ""
|
1461 |
+
"Sync your Tripadvisor reviews to your website and manage them with Site "
|
1462 |
+
"Reviews."
|
1463 |
+
msgstr ""
|
1464 |
+
"Sync your Tripadvisor reviews to your website and manage them with Site "
|
1465 |
+
"Reviews."
|
1466 |
|
1467 |
+
#: views/pages/documentation/addons.php:8, views/pages/documentation/faq.php:7, views/pages/documentation/faq.php:36, views/pages/documentation/faq.php:64, views/pages/documentation/faq.php:90, views/pages/documentation/faq.php:121, views/pages/documentation/faq.php:143, views/pages/documentation/faq.php:156, views/pages/documentation/faq.php:181, views/pages/documentation/faq.php:208, views/pages/documentation/faq.php:246, views/pages/documentation/faq.php:259, views/pages/documentation/functions.php:7, views/pages/documentation/functions.php:41, views/pages/documentation/functions.php:97, views/pages/documentation/functions.php:122, views/pages/documentation/functions.php:151, views/pages/documentation/functions.php:177, views/pages/documentation/functions.php:229, views/pages/documentation/functions.php:303, views/pages/documentation/functions.php:327, views/pages/documentation/functions.php:355, views/pages/documentation/hooks.php:9, views/pages/documentation/hooks.php:32, views/pages/documentation/hooks.php:55, views/pages/documentation/hooks.php:74, views/pages/documentation/hooks.php:93, views/pages/documentation/hooks.php:113, views/pages/documentation/hooks.php:137, views/pages/documentation/hooks.php:163, views/pages/documentation/shortcodes.php:7, views/pages/documentation/shortcodes.php:81, views/pages/documentation/shortcodes.php:129, views/pages/documentation/support.php:7, views/pages/documentation/support.php:35, views/pages/documentation/support.php:63
|
1468 |
+
msgid "Toggle documentation panel"
|
1469 |
+
msgstr "Toggle documentation panel"
|
1470 |
|
1471 |
+
#: views/pages/documentation/index.php:5
|
1472 |
+
msgid "Click an active tab to expand/collapse all sections."
|
1473 |
+
msgstr "Click an active tab to expand/collapse all sections."
|
1474 |
|
1475 |
+
#: views/pages/settings/schema.php:3
|
1476 |
+
msgid ""
|
1477 |
+
"The JSON-LD schema appears in Google's search results and shows the star "
|
1478 |
+
"rating and other information about your reviews. If the schema has been "
|
1479 |
+
"enabled in your shortcodes, you can use Google's <a "
|
1480 |
+
"href=\"https://search.google.com/structured-data/testing-tool\">Structured "
|
1481 |
+
"Data Testing Tool</a> to test your pages for valid schema data."
|
1482 |
+
msgstr ""
|
1483 |
+
"The JSON-LD schema appears in Google's search results and shows the star "
|
1484 |
+
"rating and other information about your reviews. If the schema has been "
|
1485 |
+
"enabled in your shortcodes, you can use Google's <a "
|
1486 |
+
"href=\"https://search.google.com/structured-data/testing-tool\">Structured "
|
1487 |
+
"Data Testing Tool</a> to test your pages for valid schema data."
|
1488 |
|
1489 |
+
#: views/pages/settings/schema.php:4
|
1490 |
+
msgid ""
|
1491 |
+
"You may override any of these options on a per-post/page basis by using its "
|
1492 |
+
"Custom Field name and adding a custom value using the <a "
|
1493 |
+
"href=\"https://codex.wordpress.org/Using_Custom_Fields#Usage\">Custom "
|
1494 |
+
"Fields</a> metabox."
|
1495 |
+
msgstr ""
|
1496 |
+
"You may override any of these options on a per-post/page basis by using its "
|
1497 |
+
"Custom Field name and adding a custom value using the <a "
|
1498 |
+
"href=\"https://codex.wordpress.org/Using_Custom_Fields#Usage\">Custom "
|
1499 |
+
"Fields</a> metabox."
|
1500 |
|
1501 |
+
#: views/pages/settings/translations.php:5
|
1502 |
+
msgid "Search for translatable text"
|
1503 |
+
msgstr "Search for translatable text"
|
1504 |
|
1505 |
+
#: views/pages/settings/translations.php:9
|
1506 |
+
msgid "Search here for text to translate..."
|
1507 |
+
msgstr "Search here for text to translate..."
|
1508 |
|
1509 |
+
#: views/pages/settings/translations.php:16
|
1510 |
+
msgid "Original Text"
|
1511 |
+
msgstr "Original Text"
|
1512 |
|
1513 |
+
#: views/pages/settings/translations.php:17
|
1514 |
+
msgid "Custom Translation"
|
1515 |
+
msgstr "Custom Translation"
|
1516 |
|
1517 |
+
#: views/pages/tools/console.php:7
|
1518 |
+
msgid "Download Console"
|
1519 |
+
msgstr "Download Console"
|
1520 |
|
1521 |
+
#: views/pages/tools/console.php:13
|
1522 |
+
msgid "Reloading..."
|
1523 |
+
msgstr "Reloading..."
|
1524 |
|
1525 |
+
#: views/pages/tools/console.php:13
|
1526 |
+
msgid "Reload"
|
1527 |
+
msgstr "Reload"
|
1528 |
|
1529 |
+
#: views/pages/tools/console.php:20
|
1530 |
+
msgid "Clearing..."
|
1531 |
+
msgstr "Clearing..."
|
1532 |
|
1533 |
+
#: views/pages/tools/console.php:20
|
1534 |
+
msgid "Clear"
|
1535 |
+
msgstr "Clear"
|
1536 |
|
1537 |
+
#: views/pages/tools/general.php:10
|
1538 |
+
msgid "Export Settings"
|
1539 |
+
msgstr "Export Settings"
|
|
|
|
|
|
|
|
|
1540 |
|
1541 |
+
#: views/pages/tools/general.php:22
|
1542 |
+
msgid "Import Settings"
|
1543 |
+
msgstr "Import Settings"
|
1544 |
|
1545 |
+
#: views/pages/tools/general.php:35
|
1546 |
+
msgid "Recalculating Counts..."
|
1547 |
+
msgstr "Recalculating Counts..."
|
|
|
|
|
|
|
|
|
1548 |
|
1549 |
+
#: views/pages/tools/general.php:35
|
1550 |
+
msgid "Recalculate Counts"
|
1551 |
+
msgstr "Recalculate Counts"
|
1552 |
|
1553 |
+
#: views/pages/tools/sync.php:9
|
1554 |
+
msgid "Service"
|
1555 |
+
msgstr "Service"
|
1556 |
|
1557 |
+
#: views/pages/tools/sync.php:11, views/pages/tools/sync.php:34
|
1558 |
+
msgid "Last Sync"
|
1559 |
+
msgstr "Last Sync"
|
1560 |
|
1561 |
+
#: views/pages/tools/sync.php:24
|
1562 |
+
msgid "License"
|
1563 |
+
msgstr "License"
|
1564 |
|
1565 |
+
#: views/pages/tools/sync.php:28
|
1566 |
+
msgid "Show more details"
|
1567 |
+
msgstr "Show more details"
|
1568 |
|
1569 |
+
#: views/pages/tools/sync.php:43
|
1570 |
+
msgid "Please wait..."
|
1571 |
+
msgstr "Please wait..."
|
1572 |
|
1573 |
+
#: views/pages/tools/sync.php:45, views/pages/tools/sync.php:48
|
1574 |
+
msgid "Inactive"
|
1575 |
+
msgstr "Inactive"
|
1576 |
|
1577 |
+
#: views/pages/tools/sync.php:57
|
1578 |
+
msgid "Syncing..."
|
1579 |
+
msgstr "Syncing..."
|
1580 |
|
1581 |
+
#: views/pages/tools/system-info.php:7
|
1582 |
+
msgid "Download System Info"
|
1583 |
+
msgstr "Download System Info"
|
1584 |
|
1585 |
+
#: views/partials/addons/addon.php:16
|
1586 |
+
msgid "Installed"
|
1587 |
+
msgstr "Installed"
|
1588 |
|
1589 |
+
#: views/partials/addons/addon.php:20
|
1590 |
+
msgid "Activate"
|
1591 |
+
msgstr "Activate"
|
1592 |
|
1593 |
+
#: views/partials/addons/addon.php:25
|
1594 |
+
msgid "More Info"
|
1595 |
+
msgstr "More Info"
|
1596 |
+
|
1597 |
+
#: views/partials/editor/assigned-post.php:6
|
1598 |
+
msgid "Remove assignment"
|
1599 |
+
msgstr "Remove assignment"
|
1600 |
+
|
1601 |
+
#: views/partials/editor/metabox-assigned-to.php:6
|
1602 |
+
msgid "Type to search..."
|
1603 |
+
msgstr "Type to search..."
|
1604 |
+
|
1605 |
+
#: views/partials/editor/metabox-assigned-to.php:9
|
1606 |
msgid ""
|
1607 |
+
"Search here for a page or post that you would like to assign this review "
|
1608 |
+
"to. You may search by title or ID."
|
1609 |
msgstr ""
|
1610 |
+
"Search here for a page or post that you would like to assign this review "
|
1611 |
+
"to. You may search by title or ID."
|
1612 |
|
1613 |
+
#: views/partials/editor/metabox-categories.php:7
|
1614 |
+
msgid "Most Used"
|
1615 |
+
msgstr "Most Used"
|
1616 |
|
1617 |
+
#: views/partials/editor/metabox-response.php:5
|
1618 |
+
msgid "If you need to publicly respond to this review, enter your response here."
|
1619 |
+
msgstr "If you need to publicly respond to this review, enter your response here."
|
1620 |
|
1621 |
+
#: views/partials/editor/pinned.php:8
|
1622 |
+
msgid "Edit pinned status"
|
1623 |
+
msgstr "Edit pinned status"
|
1624 |
|
1625 |
+
#: views/partials/editor/pinned.php:13
|
1626 |
+
msgid "Pin"
|
1627 |
+
msgstr "Pin"
|
1628 |
|
1629 |
+
#: views/partials/editor/pinned.php:14
|
1630 |
+
msgid "Unpin"
|
1631 |
+
msgstr "Unpin"
|
1632 |
|
1633 |
+
#: views/partials/editor/pinned.php:16
|
1634 |
+
msgid "OK"
|
1635 |
+
msgstr "OK"
|
1636 |
|
1637 |
+
#: views/partials/editor/pinned.php:17
|
1638 |
+
msgid "Cancel"
|
1639 |
+
msgstr "Cancel"
|
|
|
|
|
|
|
|
|
|
|
|
|
1640 |
|
1641 |
+
#: views/partials/editor/review.php:4
|
1642 |
+
msgid "no title"
|
1643 |
+
msgstr "no title"
|
1644 |
|
1645 |
+
#: views/partials/editor/review.php:15
|
1646 |
+
msgid "Toggle panel: Public Response"
|
1647 |
+
msgstr "Toggle panel: Public Response"
|
|
|
|
|
|
|
|
|
|
|
|
|
1648 |
|
1649 |
+
#: views/partials/editor/review.php:19
|
1650 |
+
msgid "Public Response"
|
1651 |
+
msgstr "Public Response"
|
1652 |
|
1653 |
+
#: views/partials/translations/plural.php:4, views/partials/translations/single.php:4
|
1654 |
+
msgid "Show custom translation"
|
1655 |
+
msgstr "Show custom translation"
|
1656 |
|
1657 |
+
#: views/partials/translations/plural.php:11, views/partials/translations/single.php:10
|
1658 |
+
msgid "Delete translation string"
|
1659 |
+
msgstr "Delete translation string"
|
1660 |
|
1661 |
+
#: views/partials/translations/plural.php:11, views/partials/translations/single.php:10
|
1662 |
+
msgid "Delete"
|
1663 |
+
msgstr "Delete"
|
1664 |
|
1665 |
+
#: views/partials/translations/plural.php:19
|
1666 |
+
msgid "singular"
|
1667 |
+
msgstr "singular"
|
1668 |
|
1669 |
+
#: views/partials/translations/plural.php:20
|
1670 |
+
msgid "plural"
|
1671 |
+
msgstr "plural"
|
1672 |
|
1673 |
+
#: plugin/Modules/Html/Fields/Rating.php:25
|
1674 |
+
msgid "Select a Rating"
|
1675 |
+
msgstr "Select a Rating"
|
1676 |
|
1677 |
+
#: plugin/Modules/Html/Fields/Rating.php:27
|
1678 |
+
msgid "%s Star"
|
1679 |
+
msgid_plural "%s Stars"
|
1680 |
+
msgstr[0] "%s Star"
|
1681 |
+
msgstr[1] "%s Stars"
|
1682 |
|
1683 |
+
#: plugin/Modules/Html/Partials/Pagination.php:28
|
1684 |
+
msgid "Site Reviews navigation"
|
1685 |
+
msgstr "Site Reviews navigation"
|
|
|
|
|
|
|
|
|
1686 |
|
1687 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:130
|
1688 |
+
msgid "Review of %s"
|
1689 |
+
msgstr "Review of %s"
|
|
|
|
|
|
|
|
|
1690 |
|
1691 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:214
|
1692 |
+
msgid "Response from %s"
|
1693 |
+
msgstr "Response from %s"
|
1694 |
|
1695 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:231
|
1696 |
+
msgid "No Title"
|
1697 |
+
msgstr "No Title"
|
1698 |
|
1699 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:269
|
1700 |
+
msgid "Show less"
|
1701 |
+
msgstr "Show less"
|
|
|
|
|
|
|
|
|
1702 |
|
1703 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:122
|
1704 |
+
msgid "Submit your review"
|
1705 |
+
msgstr "Submit your review"
|
1706 |
|
1707 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:161
|
1708 |
+
msgid "logged in"
|
1709 |
+
msgstr "logged in"
|
1710 |
|
1711 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:163
|
1712 |
+
msgid "You must be %s to submit a review."
|
1713 |
+
msgstr "You must be %s to submit a review."
|
1714 |
|
1715 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:174
|
1716 |
+
msgid "register"
|
1717 |
+
msgstr "register"
|
1718 |
|
1719 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:176
|
1720 |
+
msgid "You may also %s for an account."
|
1721 |
+
msgstr "You may also %s for an account."
|
1722 |
|
1723 |
+
#: plugin/Commands/RegisterPostType.php:48
|
1724 |
+
msgctxt "Add New Post"
|
1725 |
+
msgid "Add New %s"
|
1726 |
+
msgstr "Add New %s"
|
1727 |
+
|
1728 |
+
#: plugin/Commands/RegisterPostType.php:49
|
1729 |
+
msgctxt "All Posts"
|
1730 |
+
msgid "All %s"
|
1731 |
+
msgstr "All %s"
|
1732 |
+
|
1733 |
+
#: plugin/Commands/RegisterPostType.php:50
|
1734 |
+
msgctxt "Post Archives"
|
1735 |
+
msgid "%s Archives"
|
1736 |
+
msgstr "%s Archives"
|
1737 |
+
|
1738 |
+
#: plugin/Commands/RegisterPostType.php:51
|
1739 |
+
msgctxt "Edit Post"
|
1740 |
+
msgid "Edit %s"
|
1741 |
+
msgstr "Edit %s"
|
1742 |
+
|
1743 |
+
#: plugin/Commands/RegisterPostType.php:52
|
1744 |
+
msgctxt "Insert into Post"
|
1745 |
+
msgid "Insert into %s"
|
1746 |
+
msgstr "Insert into %s"
|
1747 |
+
|
1748 |
+
#: plugin/Commands/RegisterPostType.php:55
|
1749 |
+
msgctxt "New Post"
|
1750 |
+
msgid "New %s"
|
1751 |
+
msgstr "New %s"
|
1752 |
+
|
1753 |
+
#: plugin/Commands/RegisterPostType.php:56
|
1754 |
+
msgctxt "No Posts found"
|
1755 |
+
msgid "No %s found"
|
1756 |
+
msgstr "No %s found"
|
1757 |
+
|
1758 |
+
#: plugin/Commands/RegisterPostType.php:57
|
1759 |
+
msgctxt "No Posts found in Trash"
|
1760 |
+
msgid "No %s found in Trash"
|
1761 |
+
msgstr "No %s found in Trash"
|
1762 |
+
|
1763 |
+
#: plugin/Commands/RegisterPostType.php:58
|
1764 |
+
msgctxt "Search Posts"
|
1765 |
+
msgid "Search %s"
|
1766 |
+
msgstr "Search %s"
|
1767 |
+
|
1768 |
+
#: plugin/Commands/RegisterPostType.php:60
|
1769 |
+
msgctxt "Uploaded to this Post"
|
1770 |
+
msgid "Uploaded to this %s"
|
1771 |
+
msgstr "Uploaded to this %s"
|
1772 |
+
|
1773 |
+
#: plugin/Commands/RegisterPostType.php:61
|
1774 |
+
msgctxt "View Post"
|
1775 |
+
msgid "View %s"
|
1776 |
+
msgstr "View %s"
|
1777 |
+
|
1778 |
+
#: plugin/Controllers/ListTableController.php:129
|
1779 |
+
msgctxt "Approve the review"
|
1780 |
+
msgid "%s this review"
|
1781 |
+
msgstr "%s this review"
|
1782 |
+
|
1783 |
+
#: plugin/Modules/Notification.php:129
|
1784 |
msgctxt ""
|
1785 |
+
"This string differs depending on whether or not the review has been "
|
1786 |
"assigned to a post."
|
1787 |
msgid "New %s-star review"
|
1788 |
msgid_plural "New %s-star review of: %s"
|
1789 |
msgstr[0] "New %s-star review"
|
1790 |
msgstr[1] "New %s-star review of: %s"
|
1791 |
|
1792 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:314
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1793 |
msgctxt "the option label"
|
1794 |
msgid "The \"%s\" option is required."
|
1795 |
+
msgstr "The \"%s\" option is required."
|
1796 |
+
|
1797 |
+
#: plugin/Modules/Html/Partials/SiteReviewsSummary.php:142
|
1798 |
+
msgctxt "Do not translate {rating}, {max}, and {num}, they are template tags."
|
1799 |
+
msgid "{rating} out of {max} stars (based on {num} review)"
|
1800 |
+
msgid_plural "{rating} out of {max} stars (based on {num} reviews)"
|
1801 |
+
msgstr[0] "{rating} out of {max} stars (based on {num} review)"
|
1802 |
+
msgstr[1] "{rating} out of {max} stars (based on {num} reviews)"
|
languages/site-reviews.pot
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
# Copyright (C)
|
2 |
# This file is distributed under the same license as the site-reviews package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
@@ -43,1599 +43,1630 @@ msgstr ""
|
|
43 |
msgid "You can use the %s plugin to restore %s to the previous version."
|
44 |
msgstr ""
|
45 |
|
46 |
-
#: plugin/
|
47 |
-
msgid "
|
48 |
msgstr ""
|
49 |
|
50 |
-
#:
|
51 |
-
msgid "
|
52 |
msgstr ""
|
53 |
|
54 |
-
#:
|
55 |
-
msgid "
|
56 |
-
|
57 |
-
msgstr[0] ""
|
58 |
-
msgstr[1] ""
|
59 |
-
|
60 |
-
#: plugin/Date.php:45
|
61 |
-
msgid "%s minute ago"
|
62 |
-
msgid_plural "%s minutes ago"
|
63 |
-
msgstr[0] ""
|
64 |
-
msgstr[1] ""
|
65 |
-
|
66 |
-
#: plugin/Date.php:46
|
67 |
-
msgid "an hour ago"
|
68 |
-
msgid_plural "%s hours ago"
|
69 |
-
msgstr[0] ""
|
70 |
-
msgstr[1] ""
|
71 |
-
|
72 |
-
#: plugin/Date.php:47
|
73 |
-
msgid "yesterday"
|
74 |
-
msgid_plural "%s days ago"
|
75 |
-
msgstr[0] ""
|
76 |
-
msgstr[1] ""
|
77 |
-
|
78 |
-
#: plugin/Date.php:48
|
79 |
-
msgid "a week ago"
|
80 |
-
msgid_plural "%s weeks ago"
|
81 |
-
msgstr[0] ""
|
82 |
-
msgstr[1] ""
|
83 |
-
|
84 |
-
#: plugin/Date.php:49
|
85 |
-
msgid "%s month ago"
|
86 |
-
msgid_plural "%s months ago"
|
87 |
-
msgstr[0] ""
|
88 |
-
msgstr[1] ""
|
89 |
-
|
90 |
-
#: plugin/Date.php:50
|
91 |
-
msgid "%s year ago"
|
92 |
-
msgid_plural "%s years ago"
|
93 |
-
msgstr[0] ""
|
94 |
-
msgstr[1] ""
|
95 |
|
96 |
-
#:
|
97 |
-
msgid "
|
98 |
msgstr ""
|
99 |
|
100 |
-
#:
|
101 |
-
msgid "
|
102 |
msgstr ""
|
103 |
|
104 |
-
#:
|
105 |
-
msgid "Set the status of new review submissions to
|
106 |
msgstr ""
|
107 |
|
108 |
-
#:
|
109 |
-
msgid "Require
|
110 |
msgstr ""
|
111 |
|
112 |
-
#:
|
113 |
msgid "Only allow review submissions from registered users."
|
114 |
msgstr ""
|
115 |
|
116 |
-
#:
|
117 |
-
msgid "
|
118 |
msgstr ""
|
119 |
|
120 |
-
#:
|
121 |
msgid "Show a link for a new user to register. The %s Membership option must be enabled in General Settings for this to work."
|
122 |
msgstr ""
|
123 |
|
124 |
-
#:
|
125 |
msgid "Anyone can register"
|
126 |
msgstr ""
|
127 |
|
128 |
-
#:
|
129 |
-
msgid "
|
|
|
|
|
|
|
|
|
130 |
msgstr ""
|
131 |
|
132 |
-
#:
|
133 |
-
msgid "
|
134 |
msgstr ""
|
135 |
|
136 |
-
#:
|
|
|
|
|
|
|
|
|
137 |
msgid "Send to administrator"
|
138 |
msgstr ""
|
139 |
|
140 |
-
#:
|
141 |
-
msgid "Send to
|
142 |
msgstr ""
|
143 |
|
144 |
-
#:
|
145 |
-
msgid "Send to
|
146 |
msgstr ""
|
147 |
|
148 |
-
#:
|
149 |
-
msgid "Send
|
150 |
msgstr ""
|
151 |
|
152 |
-
#:
|
153 |
-
msgid "
|
154 |
msgstr ""
|
155 |
|
156 |
-
#:
|
157 |
-
msgid "
|
158 |
msgstr ""
|
159 |
|
160 |
-
#:
|
161 |
msgid "To send notifications to Slack, create a new %s and then paste the provided Webhook URL in the field above."
|
162 |
msgstr ""
|
163 |
|
164 |
-
#:
|
165 |
msgid "Incoming WebHook"
|
166 |
msgstr ""
|
167 |
|
168 |
-
#:
|
169 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
msgstr ""
|
171 |
|
172 |
-
#:
|
173 |
msgid "Date Format"
|
174 |
msgstr ""
|
175 |
|
176 |
-
#:
|
177 |
msgid "Use the default date format"
|
178 |
msgstr ""
|
179 |
|
180 |
-
#:
|
181 |
msgid "Use a relative date format"
|
182 |
msgstr ""
|
183 |
|
184 |
-
#:
|
185 |
msgid "Use a custom date format"
|
186 |
msgstr ""
|
187 |
|
188 |
-
#:
|
189 |
-
msgid "
|
190 |
msgstr ""
|
191 |
|
192 |
-
#:
|
193 |
-
msgid "
|
194 |
msgstr ""
|
195 |
|
196 |
-
#:
|
197 |
-
msgid "
|
198 |
msgstr ""
|
199 |
|
200 |
-
#:
|
201 |
-
msgid "
|
202 |
msgstr ""
|
203 |
|
204 |
-
#:
|
205 |
-
msgid "
|
206 |
msgstr ""
|
207 |
|
208 |
-
#:
|
209 |
-
msgid "Enable
|
210 |
msgstr ""
|
211 |
|
212 |
-
#:
|
213 |
-
msgid "
|
214 |
msgstr ""
|
215 |
|
216 |
-
#:
|
217 |
-
msgid "
|
|
|
|
|
|
|
|
|
218 |
msgstr ""
|
219 |
|
220 |
-
#:
|
221 |
-
msgid "
|
222 |
msgstr ""
|
223 |
|
224 |
-
#:
|
225 |
-
msgid "
|
226 |
msgstr ""
|
227 |
|
228 |
-
#:
|
229 |
msgid "Enable Excerpts"
|
230 |
msgstr ""
|
231 |
|
232 |
-
#:
|
233 |
-
msgid "
|
234 |
msgstr ""
|
235 |
|
236 |
-
#:
|
237 |
msgid "Excerpt Length"
|
238 |
msgstr ""
|
239 |
|
240 |
-
#:
|
241 |
-
msgid "
|
|
|
|
|
|
|
|
|
242 |
msgstr ""
|
243 |
|
244 |
-
#: plugin/
|
245 |
-
msgid "
|
246 |
msgstr ""
|
247 |
|
248 |
-
#:
|
249 |
-
msgid "
|
250 |
msgstr ""
|
251 |
|
252 |
-
#:
|
|
|
|
|
|
|
|
|
253 |
msgid "Default Schema Type"
|
254 |
msgstr ""
|
255 |
|
256 |
-
#:
|
257 |
msgid "Local Business"
|
258 |
msgstr ""
|
259 |
|
260 |
-
#:
|
261 |
msgid "Product"
|
262 |
msgstr ""
|
263 |
|
264 |
-
#:
|
265 |
msgid "Custom"
|
266 |
msgstr ""
|
267 |
|
268 |
-
#:
|
269 |
-
msgid "
|
270 |
msgstr ""
|
271 |
|
272 |
-
#:
|
273 |
msgid "Custom Schema Type"
|
274 |
msgstr ""
|
275 |
|
276 |
-
#:
|
277 |
-
msgid "View more information on schema types here."
|
278 |
-
msgstr ""
|
279 |
-
|
280 |
-
#: plugin/Settings.php:354
|
281 |
msgid "Default Name"
|
282 |
msgstr ""
|
283 |
|
284 |
-
#:
|
285 |
msgid "Use the assigned or current page title"
|
286 |
msgstr ""
|
287 |
|
288 |
-
#:
|
289 |
-
msgid "Enter a custom
|
290 |
msgstr ""
|
291 |
|
292 |
-
#:
|
293 |
-
msgid "Do not set a default name"
|
294 |
-
msgstr ""
|
295 |
-
|
296 |
-
#: plugin/Settings.php:361
|
297 |
-
msgid "Custom Field name: <code>schema_name</code>"
|
298 |
-
msgstr ""
|
299 |
-
|
300 |
-
#: plugin/Settings.php:367
|
301 |
msgid "Custom Name"
|
302 |
msgstr ""
|
303 |
|
304 |
-
#:
|
305 |
msgid "Default Description"
|
306 |
msgstr ""
|
307 |
|
308 |
-
#:
|
309 |
msgid "Use the assigned or current page excerpt"
|
310 |
msgstr ""
|
311 |
|
312 |
-
#:
|
313 |
msgid "Enter a custom description"
|
314 |
msgstr ""
|
315 |
|
316 |
-
#:
|
317 |
-
msgid "Do not set a default description"
|
318 |
-
msgstr ""
|
319 |
-
|
320 |
-
#: plugin/Settings.php:383
|
321 |
-
msgid "Custom Field name: <code>schema_description</code>"
|
322 |
-
msgstr ""
|
323 |
-
|
324 |
-
#: plugin/Settings.php:389
|
325 |
msgid "Custom Description"
|
326 |
msgstr ""
|
327 |
|
328 |
-
#:
|
329 |
msgid "Default URL"
|
330 |
msgstr ""
|
331 |
|
332 |
-
#:
|
333 |
msgid "Use the assigned or current page URL"
|
334 |
msgstr ""
|
335 |
|
336 |
-
#:
|
337 |
msgid "Enter a custom URL"
|
338 |
msgstr ""
|
339 |
|
340 |
-
#:
|
341 |
-
msgid "Do not set a default URL"
|
342 |
-
msgstr ""
|
343 |
-
|
344 |
-
#: plugin/Settings.php:405
|
345 |
-
msgid "Custom Field name: <code>schema_url</code>"
|
346 |
-
msgstr ""
|
347 |
-
|
348 |
-
#: plugin/Settings.php:411
|
349 |
msgid "Custom URL"
|
350 |
msgstr ""
|
351 |
|
352 |
-
#:
|
353 |
msgid "Default Image"
|
354 |
msgstr ""
|
355 |
|
356 |
-
#:
|
357 |
msgid "Use the featured image of the assigned or current page"
|
358 |
msgstr ""
|
359 |
|
360 |
-
#:
|
361 |
msgid "Enter a custom image URL"
|
362 |
msgstr ""
|
363 |
|
364 |
-
#:
|
365 |
-
msgid "Do not set a default image"
|
366 |
-
msgstr ""
|
367 |
-
|
368 |
-
#: plugin/Settings.php:427
|
369 |
-
msgid "Custom Field name: <code>schema_image</code>"
|
370 |
-
msgstr ""
|
371 |
-
|
372 |
-
#: plugin/Settings.php:433
|
373 |
msgid "Custom Image URL"
|
374 |
msgstr ""
|
375 |
|
376 |
-
#:
|
377 |
msgid "Address"
|
378 |
msgstr ""
|
379 |
|
380 |
-
#:
|
381 |
-
msgid "Custom Field name: <code>schema_address</code>"
|
382 |
-
msgstr ""
|
383 |
-
|
384 |
-
#: plugin/Settings.php:453
|
385 |
msgid "Telephone Number"
|
386 |
msgstr ""
|
387 |
|
388 |
-
#:
|
389 |
-
msgid "Custom Field name: <code>schema_telephone</code>"
|
390 |
-
msgstr ""
|
391 |
-
|
392 |
-
#: plugin/Settings.php:464
|
393 |
msgid "Price Range"
|
394 |
msgstr ""
|
395 |
|
396 |
-
#:
|
397 |
-
msgid "Custom Field name: <code>schema_pricerange</code>"
|
398 |
-
msgstr ""
|
399 |
-
|
400 |
-
#: plugin/Settings.php:475
|
401 |
msgid "Low Price"
|
402 |
msgstr ""
|
403 |
|
404 |
-
#:
|
405 |
-
msgid "Custom Field name: <code>schema_lowprice</code>"
|
406 |
-
msgstr ""
|
407 |
-
|
408 |
-
#: plugin/Settings.php:486
|
409 |
msgid "High Price"
|
410 |
msgstr ""
|
411 |
|
412 |
-
#:
|
413 |
-
msgid "Custom Field name: <code>schema_highprice</code>"
|
414 |
-
msgstr ""
|
415 |
-
|
416 |
-
#: plugin/Settings.php:497
|
417 |
msgid "Price Currency"
|
418 |
msgstr ""
|
419 |
|
420 |
-
#:
|
421 |
-
msgid "
|
422 |
msgstr ""
|
423 |
|
424 |
-
#:
|
425 |
msgid "Required Fields"
|
426 |
msgstr ""
|
427 |
|
428 |
-
#:
|
|
|
|
|
|
|
|
|
429 |
msgid "Title"
|
430 |
msgstr ""
|
431 |
|
432 |
-
#:
|
433 |
msgid "Review"
|
434 |
msgstr ""
|
435 |
|
436 |
-
#:
|
437 |
msgid "Name"
|
438 |
msgstr ""
|
439 |
|
440 |
-
#:
|
441 |
msgid "Email"
|
442 |
msgstr ""
|
443 |
|
444 |
-
#:
|
445 |
-
msgid "
|
446 |
-
msgstr ""
|
447 |
-
|
448 |
-
#: plugin/Settings.php:537
|
449 |
-
msgid "the %s integration provides spam-filtering for your reviews. In order for this setting to have any affect, you will need to first install and activate the Akismet plugin and set up a WordPress.com API key."
|
450 |
msgstr ""
|
451 |
|
452 |
-
#:
|
453 |
-
msgid "
|
454 |
msgstr ""
|
455 |
|
456 |
-
#:
|
457 |
msgid "Invisible reCAPTCHA"
|
458 |
msgstr ""
|
459 |
|
460 |
-
#:
|
461 |
-
msgid "Do not use reCAPTCHA"
|
462 |
-
msgstr ""
|
463 |
-
|
464 |
-
#: plugin/Settings.php:548
|
465 |
-
msgid "Use reCAPTCHA"
|
466 |
-
msgstr ""
|
467 |
-
|
468 |
-
#: plugin/Settings.php:549
|
469 |
-
msgctxt "plugin name"
|
470 |
-
msgid "Use 3rd-party plugin: Invisible reCaptcha"
|
471 |
-
msgstr ""
|
472 |
-
|
473 |
-
#: plugin/Settings.php:551
|
474 |
-
msgid "Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you will need to %s for an API key pair for your site. If you are already using a reCAPTCHA plugin listed here, please select it; otherwise choose \"Use reCAPTCHA\"."
|
475 |
-
msgstr ""
|
476 |
-
|
477 |
-
#: plugin/Settings.php:552
|
478 |
-
msgid "sign up"
|
479 |
-
msgstr ""
|
480 |
-
|
481 |
-
#: plugin/Settings.php:559
|
482 |
msgid "Site Key"
|
483 |
msgstr ""
|
484 |
|
485 |
-
#:
|
486 |
msgid "Site Secret"
|
487 |
msgstr ""
|
488 |
|
489 |
-
#:
|
490 |
-
msgid "
|
491 |
-
msgstr ""
|
492 |
-
|
493 |
-
#: plugin/Settings.php:591
|
494 |
-
msgid "Review Blacklist"
|
495 |
-
msgstr ""
|
496 |
-
|
497 |
-
#: plugin/Settings.php:592
|
498 |
-
msgid "When a review contains any of these words in its title, content, name, email, or IP address, it will be rejected. One word or IP address per line. It will match inside words, so \"press\" will match \"WordPress\"."
|
499 |
-
msgstr ""
|
500 |
-
|
501 |
-
#: plugin/Settings.php:600
|
502 |
-
msgid "Blacklist Action"
|
503 |
-
msgstr ""
|
504 |
-
|
505 |
-
#: plugin/Settings.php:603
|
506 |
-
msgid "Reject submission"
|
507 |
-
msgstr ""
|
508 |
-
|
509 |
-
#: plugin/Settings.php:605
|
510 |
-
msgid "Choose the action that should be taken when a review is blacklisted."
|
511 |
-
msgstr ""
|
512 |
-
|
513 |
-
#: plugin/Strings.php:24
|
514 |
-
msgid "Add New Review"
|
515 |
msgstr ""
|
516 |
|
517 |
-
#:
|
518 |
-
msgid "
|
519 |
msgstr ""
|
520 |
|
521 |
-
#:
|
522 |
-
msgid "
|
523 |
msgstr ""
|
524 |
|
525 |
-
#:
|
526 |
-
msgid "
|
527 |
msgstr ""
|
528 |
|
529 |
-
#:
|
530 |
-
msgid "
|
531 |
msgstr ""
|
532 |
|
533 |
-
#:
|
534 |
-
msgid "
|
535 |
msgstr ""
|
536 |
|
537 |
-
#:
|
538 |
-
msgid "
|
539 |
msgstr ""
|
540 |
|
541 |
-
#:
|
542 |
-
msgid "
|
543 |
msgstr ""
|
544 |
|
545 |
-
#:
|
546 |
-
msgid "
|
547 |
msgstr ""
|
548 |
|
549 |
-
#:
|
550 |
-
msgid "
|
551 |
msgstr ""
|
552 |
|
553 |
-
#: plugin/
|
554 |
-
msgid "
|
555 |
msgstr ""
|
556 |
|
557 |
-
#: plugin/
|
558 |
-
msgid "
|
559 |
msgstr ""
|
560 |
|
561 |
-
#: plugin/
|
562 |
-
msgid "
|
563 |
msgstr ""
|
564 |
|
565 |
-
#: plugin/
|
566 |
-
msgid "
|
567 |
msgstr ""
|
568 |
|
569 |
-
#:
|
570 |
-
msgid "
|
571 |
msgstr ""
|
572 |
|
573 |
-
#:
|
574 |
-
msgid "
|
575 |
msgstr ""
|
576 |
|
577 |
-
#:
|
578 |
-
msgid "
|
579 |
msgstr ""
|
580 |
|
581 |
-
#:
|
582 |
-
msgid "
|
583 |
msgstr ""
|
584 |
|
585 |
-
#:
|
586 |
-
msgid "
|
587 |
msgstr ""
|
588 |
|
589 |
-
#:
|
590 |
-
msgid "
|
591 |
msgstr ""
|
592 |
|
593 |
-
#:
|
594 |
-
msgid "
|
595 |
msgstr ""
|
596 |
|
597 |
-
#:
|
598 |
-
msgid "
|
599 |
msgstr ""
|
600 |
|
601 |
-
#:
|
602 |
-
msgid "
|
603 |
msgstr ""
|
604 |
|
605 |
-
#:
|
606 |
-
msgid "
|
607 |
msgstr ""
|
608 |
|
609 |
-
#: plugin/
|
610 |
-
msgid "
|
611 |
msgstr ""
|
612 |
|
613 |
-
#: plugin/
|
614 |
-
|
615 |
-
msgid "This field must be between :min and :max."
|
616 |
msgstr ""
|
617 |
|
618 |
-
#: plugin/
|
619 |
-
msgctxt "
|
620 |
-
msgid "
|
621 |
msgstr ""
|
622 |
|
623 |
-
#: plugin/
|
624 |
-
|
|
|
625 |
msgstr ""
|
626 |
|
627 |
-
#: plugin/
|
628 |
-
msgctxt "
|
629 |
-
msgid "
|
630 |
msgstr ""
|
631 |
|
632 |
-
#: plugin/
|
633 |
-
msgctxt "
|
634 |
-
msgid "
|
635 |
msgstr ""
|
636 |
|
637 |
-
#: plugin/
|
638 |
-
msgctxt "
|
639 |
-
msgid "
|
640 |
msgstr ""
|
641 |
|
642 |
-
#: plugin/
|
643 |
-
msgctxt "
|
644 |
-
msgid "
|
645 |
msgstr ""
|
646 |
|
647 |
-
#: plugin/
|
648 |
-
|
|
|
649 |
msgstr ""
|
650 |
|
651 |
-
#: plugin/
|
652 |
-
|
|
|
653 |
msgstr ""
|
654 |
|
655 |
-
#: plugin/Commands/RegisterPostType.php:
|
656 |
-
|
|
|
657 |
msgstr ""
|
658 |
|
659 |
-
#: plugin/
|
660 |
-
|
|
|
661 |
msgstr ""
|
662 |
|
663 |
-
#: plugin/
|
664 |
-
|
|
|
665 |
msgstr ""
|
666 |
|
667 |
-
#: plugin/Controllers/
|
668 |
-
msgid "
|
669 |
msgstr ""
|
670 |
|
671 |
-
#: plugin/Controllers/
|
672 |
-
msgid "
|
673 |
msgstr ""
|
674 |
|
675 |
-
#: plugin/Controllers/
|
676 |
msgid "Settings"
|
677 |
msgstr ""
|
678 |
|
679 |
-
#: plugin/Controllers/
|
680 |
msgid "%s Review"
|
681 |
msgid_plural "%s Reviews"
|
682 |
msgstr[0] ""
|
683 |
msgstr[1] ""
|
684 |
|
685 |
-
#: plugin/Controllers/
|
686 |
-
msgid "
|
687 |
-
msgstr ""
|
688 |
-
|
689 |
-
#: plugin/Controllers/MainController.php:209
|
690 |
-
msgid "Details"
|
691 |
-
msgstr ""
|
692 |
-
|
693 |
-
#: plugin/Controllers/MainController.php:210, views/edit/metabox-response.php:3
|
694 |
-
msgid "Respond Publicly"
|
695 |
-
msgstr ""
|
696 |
-
|
697 |
-
#: plugin/Controllers/MainController.php:224
|
698 |
-
msgid "Pin Your Reviews"
|
699 |
-
msgstr ""
|
700 |
-
|
701 |
-
#: plugin/Controllers/MainController.php:225
|
702 |
-
msgid "You can pin exceptional reviews so that they are always shown first in your widgets and shortcodes."
|
703 |
-
msgstr ""
|
704 |
-
|
705 |
-
#: plugin/Controllers/MainController.php:246, plugin/Controllers/MainController.php:631, views/menu/status.php:16
|
706 |
-
msgid "Reviews"
|
707 |
-
msgstr ""
|
708 |
-
|
709 |
-
#: plugin/Controllers/MainController.php:247
|
710 |
-
msgid "Site Reviews"
|
711 |
-
msgstr ""
|
712 |
-
|
713 |
-
#: plugin/Controllers/MainController.php:257, plugin/Shortcodes/Buttons/SiteReviews.php:119
|
714 |
-
msgid "Author"
|
715 |
-
msgstr ""
|
716 |
-
|
717 |
-
#: plugin/Controllers/MainController.php:258, plugin/Controllers/MainController.php:851
|
718 |
-
msgid "Type"
|
719 |
-
msgstr ""
|
720 |
-
|
721 |
-
#: plugin/Controllers/MainController.php:259, plugin/Controllers/MainController.php:850, plugin/Shortcodes/Buttons/SiteReviews.php:68, plugin/Shortcodes/Buttons/SiteReviews.php:139, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:63, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:109
|
722 |
-
msgid "Rating"
|
723 |
msgstr ""
|
724 |
|
725 |
-
#: plugin/Controllers/
|
726 |
-
msgid "
|
727 |
msgstr ""
|
728 |
|
729 |
-
#: plugin/Controllers/MainController.php:
|
730 |
-
msgid "
|
731 |
msgstr ""
|
732 |
|
733 |
-
#: plugin/Controllers/
|
734 |
-
msgid "
|
735 |
msgstr ""
|
736 |
|
737 |
-
#: plugin/Controllers/
|
738 |
-
msgid "
|
739 |
msgstr ""
|
740 |
|
741 |
-
#: plugin/Controllers/
|
742 |
-
msgid "
|
743 |
msgstr ""
|
744 |
|
745 |
-
#: plugin/Controllers/
|
746 |
-
msgid "
|
747 |
msgstr ""
|
748 |
|
749 |
-
#: plugin/Controllers/
|
750 |
-
msgid "
|
751 |
msgstr ""
|
752 |
|
753 |
-
#: plugin/Controllers/
|
754 |
-
msgid "
|
755 |
msgstr ""
|
756 |
|
757 |
-
#: plugin/Controllers/
|
758 |
-
msgid "
|
759 |
msgstr ""
|
760 |
|
761 |
-
#: plugin/Controllers/
|
762 |
-
msgid "
|
763 |
msgstr ""
|
764 |
|
765 |
-
#: plugin/Controllers/
|
766 |
-
msgid "
|
767 |
msgstr ""
|
768 |
|
769 |
-
#: plugin/Controllers/
|
770 |
-
msgid "
|
771 |
msgstr ""
|
772 |
|
773 |
-
#: plugin/Controllers/
|
774 |
-
msgid "
|
775 |
msgstr ""
|
776 |
|
777 |
-
#: plugin/Controllers/
|
778 |
-
msgid "
|
779 |
msgstr ""
|
780 |
|
781 |
-
#: plugin/Controllers/
|
782 |
-
msgid "
|
783 |
msgstr ""
|
784 |
|
785 |
-
#: plugin/Controllers/
|
786 |
-
msgid "
|
787 |
msgstr ""
|
788 |
|
789 |
-
#: plugin/Controllers/
|
790 |
-
msgid "
|
791 |
msgstr ""
|
792 |
|
793 |
-
#: plugin/Controllers/MainController.php:
|
794 |
-
msgid "
|
795 |
msgstr ""
|
796 |
|
797 |
-
#: plugin/Controllers/
|
798 |
-
msgid "
|
799 |
msgstr ""
|
800 |
|
801 |
-
#: plugin/Controllers/
|
802 |
-
msgid "
|
803 |
msgstr ""
|
804 |
|
805 |
-
#: plugin/Controllers/
|
806 |
-
msgid "
|
807 |
msgstr ""
|
808 |
|
809 |
-
#: plugin/Controllers/
|
810 |
-
msgid "
|
811 |
msgstr ""
|
812 |
|
813 |
-
#: plugin/Controllers/
|
814 |
-
msgid "
|
815 |
msgstr ""
|
816 |
|
817 |
-
#: plugin/Controllers/
|
818 |
-
msgid "
|
819 |
-
msgid_plural "Logging enabled."
|
820 |
-
msgstr[0] ""
|
821 |
-
msgstr[1] ""
|
822 |
-
|
823 |
-
#: plugin/Controllers/MainController.php:708
|
824 |
-
msgid "Settings updated."
|
825 |
msgstr ""
|
826 |
|
827 |
-
#: plugin/Controllers/
|
828 |
msgid "Nothing to Revert"
|
829 |
msgstr ""
|
830 |
|
831 |
-
#: plugin/Controllers/
|
832 |
-
msgid "Revert Changes"
|
833 |
-
msgstr ""
|
834 |
-
|
835 |
-
#: plugin/Controllers/MainController.php:835
|
836 |
msgid "Unknown"
|
837 |
msgstr ""
|
838 |
|
839 |
-
#: plugin/Controllers/
|
840 |
-
msgid "%s review"
|
841 |
-
msgstr ""
|
842 |
-
|
843 |
-
#: plugin/Controllers/MainController.php:845
|
844 |
msgid "Unregistered user"
|
845 |
msgstr ""
|
846 |
|
847 |
-
#: plugin/Controllers/
|
848 |
msgid "RE:"
|
849 |
msgstr ""
|
850 |
|
851 |
-
#: plugin/Controllers/MainController.php:
|
852 |
-
msgid "
|
853 |
-
msgstr ""
|
854 |
-
|
855 |
-
#: plugin/Controllers/MainController.php:856
|
856 |
-
msgid "IP Address"
|
857 |
-
msgstr ""
|
858 |
-
|
859 |
-
#: plugin/Controllers/MainController.php:857, plugin/Shortcodes/Buttons/SiteReviews.php:124
|
860 |
-
msgid "Avatar"
|
861 |
msgstr ""
|
862 |
|
863 |
-
#: plugin/Controllers/
|
864 |
-
msgid "
|
865 |
msgstr ""
|
866 |
|
867 |
-
#: plugin/Controllers/
|
868 |
-
msgid "
|
869 |
msgstr ""
|
870 |
|
871 |
-
#: plugin/Controllers/
|
872 |
-
msgid "
|
873 |
msgstr ""
|
874 |
|
875 |
-
#: plugin/Controllers/
|
876 |
-
msgid "
|
877 |
msgstr ""
|
878 |
|
879 |
-
#: plugin/Controllers/
|
880 |
msgid "%s review updated."
|
881 |
msgid_plural "%s reviews updated."
|
882 |
msgstr[0] ""
|
883 |
msgstr[1] ""
|
884 |
|
885 |
-
#: plugin/Controllers/
|
886 |
msgid "%s review not updated, somebody is editing it."
|
887 |
msgid_plural "%s reviews not updated, somebody is editing them."
|
888 |
msgstr[0] ""
|
889 |
msgstr[1] ""
|
890 |
|
891 |
-
#: plugin/Controllers/
|
892 |
msgid "%s review permanently deleted."
|
893 |
msgid_plural "%s reviews permanently deleted."
|
894 |
msgstr[0] ""
|
895 |
msgstr[1] ""
|
896 |
|
897 |
-
#: plugin/Controllers/
|
898 |
msgid "%s review moved to the Trash."
|
899 |
msgid_plural "%s reviews moved to the Trash."
|
900 |
msgstr[0] ""
|
901 |
msgstr[1] ""
|
902 |
|
903 |
-
#: plugin/Controllers/
|
904 |
msgid "%s review restored from the Trash."
|
905 |
msgid_plural "%s reviews restored from the Trash."
|
906 |
msgstr[0] ""
|
907 |
msgstr[1] ""
|
908 |
|
909 |
-
#: plugin/Controllers/
|
910 |
-
msgid "
|
911 |
msgstr ""
|
912 |
|
913 |
-
#: plugin/Controllers/
|
914 |
-
msgid "
|
915 |
msgstr ""
|
916 |
|
917 |
-
#: plugin/Controllers/
|
918 |
-
msgid "
|
919 |
msgstr ""
|
920 |
|
921 |
-
#: plugin/Controllers/
|
922 |
-
msgid "
|
923 |
msgstr ""
|
924 |
|
925 |
-
#: plugin/Controllers/
|
926 |
-
|
|
|
927 |
msgstr ""
|
928 |
|
929 |
-
#: plugin/Controllers/
|
930 |
-
msgid "
|
931 |
msgstr ""
|
932 |
|
933 |
-
#: plugin/
|
934 |
-
msgid "
|
935 |
msgstr ""
|
936 |
|
937 |
-
#: plugin/
|
938 |
-
msgid "
|
939 |
-
|
940 |
-
msgstr[0] ""
|
941 |
-
msgstr[1] ""
|
942 |
|
943 |
-
#: plugin/
|
944 |
-
msgid "
|
945 |
msgstr ""
|
946 |
|
947 |
-
#: plugin/
|
948 |
-
msgid "
|
949 |
msgstr ""
|
950 |
|
951 |
-
#: plugin/
|
952 |
-
msgid "
|
953 |
msgstr ""
|
954 |
|
955 |
-
#: plugin/
|
956 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
957 |
msgstr ""
|
958 |
|
959 |
-
#: plugin/
|
|
|
|
|
|
|
|
|
960 |
msgid "Filter by category"
|
961 |
msgstr ""
|
962 |
|
963 |
-
#: plugin/
|
964 |
-
msgid "
|
965 |
msgstr ""
|
966 |
|
967 |
-
#: plugin/
|
968 |
-
|
969 |
-
|
970 |
-
|
971 |
-
|
972 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
973 |
|
974 |
-
#: plugin/
|
975 |
-
msgid "
|
976 |
msgstr ""
|
977 |
|
978 |
-
#: plugin/
|
979 |
-
msgid "
|
980 |
msgstr ""
|
981 |
|
982 |
-
#: plugin/
|
983 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
984 |
msgstr ""
|
985 |
|
986 |
-
#: plugin/
|
987 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
988 |
msgstr ""
|
989 |
|
990 |
-
#: plugin/
|
991 |
-
msgid "
|
992 |
msgstr ""
|
993 |
|
994 |
-
#: plugin/
|
995 |
-
msgid "
|
996 |
msgstr ""
|
997 |
|
998 |
-
#: plugin/
|
999 |
-
|
1000 |
-
|
1001 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1002 |
msgstr[0] ""
|
1003 |
msgstr[1] ""
|
1004 |
|
1005 |
-
#: plugin/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1006 |
msgid "Excellent"
|
1007 |
msgstr ""
|
1008 |
|
1009 |
-
#: plugin/Shortcodes/
|
1010 |
msgid "Very good"
|
1011 |
msgstr ""
|
1012 |
|
1013 |
-
#: plugin/Shortcodes/
|
1014 |
msgid "Average"
|
1015 |
msgstr ""
|
1016 |
|
1017 |
-
#: plugin/Shortcodes/
|
1018 |
msgid "Poor"
|
1019 |
msgstr ""
|
1020 |
|
1021 |
-
#: plugin/Shortcodes/
|
1022 |
msgid "Terrible"
|
1023 |
msgstr ""
|
1024 |
|
1025 |
-
#: plugin/
|
1026 |
-
msgid "
|
1027 |
msgstr ""
|
1028 |
|
1029 |
-
#: plugin/
|
1030 |
-
msgid "
|
1031 |
msgstr ""
|
1032 |
|
1033 |
-
#: plugin/
|
1034 |
-
msgid "
|
1035 |
msgstr ""
|
1036 |
|
1037 |
-
#: plugin/
|
1038 |
-
msgid "
|
1039 |
msgstr ""
|
1040 |
|
1041 |
-
#: plugin/
|
1042 |
-
msgid "
|
1043 |
msgstr ""
|
1044 |
|
1045 |
-
#: plugin/
|
1046 |
-
msgid "
|
1047 |
msgstr ""
|
1048 |
|
1049 |
-
#: plugin/
|
1050 |
-
msgid "
|
1051 |
msgstr ""
|
1052 |
|
1053 |
-
#: plugin/
|
1054 |
-
msgid "
|
1055 |
msgstr ""
|
1056 |
|
1057 |
-
#: plugin/
|
1058 |
-
msgid "
|
1059 |
msgstr ""
|
1060 |
|
1061 |
-
#: plugin/
|
1062 |
-
msgid "
|
1063 |
msgstr ""
|
1064 |
|
1065 |
-
#: plugin/
|
1066 |
-
msgid "
|
1067 |
msgstr ""
|
1068 |
|
1069 |
-
#: plugin/
|
1070 |
-
msgid "
|
1071 |
msgstr ""
|
1072 |
|
1073 |
-
#: plugin/
|
1074 |
-
msgid "
|
1075 |
msgstr ""
|
1076 |
|
1077 |
-
#: plugin/
|
1078 |
-
msgid "Hide the
|
1079 |
msgstr ""
|
1080 |
|
1081 |
-
#: plugin/
|
1082 |
-
msgid "Hide the
|
1083 |
msgstr ""
|
1084 |
|
1085 |
-
#: plugin/
|
1086 |
-
msgid "Hide the
|
1087 |
msgstr ""
|
1088 |
|
1089 |
-
#: plugin/
|
1090 |
-
msgid "
|
1091 |
msgstr ""
|
1092 |
|
1093 |
-
#: plugin/
|
1094 |
-
msgid "
|
1095 |
msgstr ""
|
1096 |
|
1097 |
-
#: plugin/
|
1098 |
-
msgid "
|
1099 |
-
|
|
|
|
|
1100 |
|
1101 |
-
#: plugin/
|
1102 |
-
msgid "
|
1103 |
msgstr ""
|
1104 |
|
1105 |
-
#: plugin/
|
1106 |
-
msgid "
|
1107 |
msgstr ""
|
1108 |
|
1109 |
-
#: plugin/
|
1110 |
-
msgid "
|
1111 |
msgstr ""
|
1112 |
|
1113 |
-
#: plugin/
|
1114 |
-
msgid "
|
1115 |
msgstr ""
|
1116 |
|
1117 |
-
#: plugin/
|
1118 |
-
msgid "
|
1119 |
msgstr ""
|
1120 |
|
1121 |
-
#: plugin/
|
1122 |
-
msgid "
|
1123 |
msgstr ""
|
1124 |
|
1125 |
-
#: plugin/
|
1126 |
-
msgid "
|
1127 |
msgstr ""
|
1128 |
|
1129 |
-
#: plugin/Widgets/
|
1130 |
-
msgid "
|
1131 |
msgstr ""
|
1132 |
|
1133 |
-
#: plugin/
|
1134 |
-
msgid "
|
1135 |
msgstr ""
|
1136 |
|
1137 |
-
#: plugin/
|
1138 |
-
msgid "
|
1139 |
msgstr ""
|
1140 |
|
1141 |
-
#: plugin/
|
1142 |
-
msgid "
|
1143 |
msgstr ""
|
1144 |
|
1145 |
-
#:
|
1146 |
-
msgid "
|
1147 |
msgstr ""
|
1148 |
|
1149 |
-
#:
|
1150 |
-
msgid "
|
1151 |
msgstr ""
|
1152 |
|
1153 |
-
#:
|
1154 |
-
msgid "
|
1155 |
msgstr ""
|
1156 |
|
1157 |
-
#:
|
1158 |
-
msgid "
|
1159 |
msgstr ""
|
1160 |
|
1161 |
-
#:
|
1162 |
-
msgid "
|
1163 |
msgstr ""
|
1164 |
|
1165 |
-
#:
|
1166 |
-
msgid "
|
1167 |
msgstr ""
|
1168 |
|
1169 |
-
#:
|
1170 |
-
msgid "
|
1171 |
msgstr ""
|
1172 |
|
1173 |
-
#:
|
1174 |
-
msgid "
|
1175 |
msgstr ""
|
1176 |
|
1177 |
-
#:
|
1178 |
-
msgid "
|
1179 |
msgstr ""
|
1180 |
|
1181 |
-
#:
|
1182 |
-
msgid "
|
1183 |
msgstr ""
|
1184 |
|
1185 |
-
#:
|
1186 |
-
msgid "
|
1187 |
msgstr ""
|
1188 |
|
1189 |
-
#:
|
1190 |
-
msgid "
|
1191 |
msgstr ""
|
1192 |
|
1193 |
-
#:
|
1194 |
-
|
1195 |
-
msgid "All dates and times shown here use the WordPress %s."
|
1196 |
msgstr ""
|
1197 |
|
1198 |
-
#:
|
1199 |
-
msgid "
|
1200 |
msgstr ""
|
1201 |
|
1202 |
-
#:
|
1203 |
-
msgid "
|
1204 |
msgstr ""
|
1205 |
|
1206 |
-
#:
|
1207 |
-
msgid "
|
1208 |
msgstr ""
|
1209 |
|
1210 |
-
#:
|
1211 |
-
msgid "
|
1212 |
msgstr ""
|
1213 |
|
1214 |
-
#:
|
1215 |
-
msgid "
|
1216 |
msgstr ""
|
1217 |
|
1218 |
-
#:
|
1219 |
-
msgid "
|
1220 |
msgstr ""
|
1221 |
|
1222 |
-
#:
|
1223 |
-
msgid "
|
1224 |
msgstr ""
|
1225 |
|
1226 |
-
#:
|
1227 |
-
msgid "
|
1228 |
msgstr ""
|
1229 |
|
1230 |
-
#:
|
1231 |
-
|
|
|
1232 |
msgstr ""
|
1233 |
|
1234 |
-
#:
|
1235 |
-
msgid "
|
1236 |
msgstr ""
|
1237 |
|
1238 |
-
#:
|
1239 |
-
msgid "
|
1240 |
msgstr ""
|
1241 |
|
1242 |
-
#:
|
1243 |
-
msgid "
|
1244 |
msgstr ""
|
1245 |
|
1246 |
-
#:
|
1247 |
-
msgid "
|
1248 |
msgstr ""
|
1249 |
|
1250 |
-
#:
|
1251 |
-
msgid "
|
1252 |
msgstr ""
|
1253 |
|
1254 |
-
#:
|
1255 |
-
msgid "
|
1256 |
msgstr ""
|
1257 |
|
1258 |
-
#:
|
1259 |
-
msgid "
|
1260 |
msgstr ""
|
1261 |
|
1262 |
-
#:
|
1263 |
-
msgid "
|
1264 |
msgstr ""
|
1265 |
|
1266 |
-
#:
|
1267 |
-
msgid "
|
1268 |
msgstr ""
|
1269 |
|
1270 |
-
#:
|
1271 |
-
msgid "
|
1272 |
msgstr ""
|
1273 |
|
1274 |
-
#:
|
1275 |
-
msgid "
|
1276 |
msgstr ""
|
1277 |
|
1278 |
-
#:
|
1279 |
-
msgid "
|
1280 |
msgstr ""
|
1281 |
|
1282 |
-
#:
|
1283 |
-
msgid "
|
1284 |
msgstr ""
|
1285 |
|
1286 |
-
#:
|
1287 |
-
msgid "
|
1288 |
msgstr ""
|
1289 |
|
1290 |
-
#:
|
1291 |
-
msgid "
|
1292 |
msgstr ""
|
1293 |
|
1294 |
-
#:
|
1295 |
-
msgid "
|
1296 |
msgstr ""
|
1297 |
|
1298 |
-
#:
|
1299 |
-
msgid "
|
1300 |
msgstr ""
|
1301 |
|
1302 |
-
#:
|
1303 |
-
msgid "
|
1304 |
msgstr ""
|
1305 |
|
1306 |
-
#:
|
1307 |
-
msgid "
|
1308 |
msgstr ""
|
1309 |
|
1310 |
-
#:
|
1311 |
-
msgid "
|
1312 |
msgstr ""
|
1313 |
|
1314 |
-
#: plugin/
|
1315 |
-
msgid "
|
1316 |
msgstr ""
|
1317 |
|
1318 |
-
#: plugin/
|
1319 |
-
msgid "
|
1320 |
msgstr ""
|
1321 |
|
1322 |
-
#: plugin/
|
1323 |
-
msgid "
|
1324 |
msgstr ""
|
1325 |
|
1326 |
-
#: plugin/
|
1327 |
-
msgid "
|
1328 |
msgstr ""
|
1329 |
|
1330 |
-
#: plugin/
|
1331 |
-
msgid "
|
1332 |
msgstr ""
|
1333 |
|
1334 |
-
#: plugin/
|
1335 |
-
msgid "Review
|
1336 |
msgstr ""
|
1337 |
|
1338 |
-
#: plugin/
|
1339 |
-
msgid "
|
1340 |
msgstr ""
|
1341 |
|
1342 |
-
#: plugin/
|
1343 |
-
msgid "
|
1344 |
msgstr ""
|
1345 |
|
1346 |
-
#: plugin/
|
1347 |
-
msgid "
|
1348 |
msgstr ""
|
1349 |
|
1350 |
-
#: plugin/
|
1351 |
-
msgid "
|
1352 |
msgstr ""
|
1353 |
|
1354 |
-
#: plugin/
|
1355 |
-
msgid "
|
1356 |
msgstr ""
|
1357 |
|
1358 |
-
#: plugin/
|
1359 |
-
msgid "
|
1360 |
msgstr ""
|
1361 |
|
1362 |
-
#: plugin/
|
1363 |
-
msgid "
|
1364 |
msgstr ""
|
1365 |
|
1366 |
-
#: plugin/
|
1367 |
-
msgid "
|
1368 |
msgstr ""
|
1369 |
|
1370 |
-
#: plugin/
|
1371 |
-
msgid "
|
1372 |
msgstr ""
|
1373 |
|
1374 |
-
#: plugin/
|
1375 |
-
msgid "
|
1376 |
msgstr ""
|
1377 |
|
1378 |
-
#: plugin/
|
1379 |
-
msgid "
|
1380 |
msgstr ""
|
1381 |
|
1382 |
-
#: plugin/
|
1383 |
-
msgid "
|
1384 |
msgstr ""
|
1385 |
|
1386 |
-
#: plugin/
|
1387 |
-
msgid "
|
1388 |
msgstr ""
|
1389 |
|
1390 |
-
#:
|
1391 |
-
msgid "
|
1392 |
msgstr ""
|
1393 |
|
1394 |
-
#:
|
1395 |
-
|
1396 |
-
msgid "The \"%s\" option is required."
|
1397 |
msgstr ""
|
1398 |
|
1399 |
-
#:
|
1400 |
-
msgid "
|
1401 |
msgstr ""
|
1402 |
|
1403 |
-
#:
|
1404 |
-
msgid "
|
1405 |
msgstr ""
|
1406 |
|
1407 |
-
#:
|
1408 |
-
msgid "
|
1409 |
msgstr ""
|
1410 |
|
1411 |
-
#:
|
1412 |
-
msgid "
|
1413 |
msgstr ""
|
1414 |
|
1415 |
-
#:
|
1416 |
-
msgid "
|
1417 |
msgstr ""
|
1418 |
|
1419 |
-
#:
|
1420 |
-
msgid "
|
1421 |
msgstr ""
|
1422 |
|
1423 |
-
#:
|
1424 |
-
msgid "
|
1425 |
msgstr ""
|
1426 |
|
1427 |
-
#:
|
1428 |
-
msgid "
|
1429 |
msgstr ""
|
1430 |
|
1431 |
-
#:
|
1432 |
-
msgid "
|
1433 |
msgstr ""
|
1434 |
|
1435 |
-
#:
|
1436 |
-
msgid "
|
1437 |
msgstr ""
|
1438 |
|
1439 |
-
#:
|
1440 |
-
msgid "
|
1441 |
msgstr ""
|
1442 |
|
1443 |
-
#:
|
1444 |
-
msgid "
|
1445 |
msgstr ""
|
1446 |
|
1447 |
-
#:
|
1448 |
-
msgid "
|
1449 |
msgstr ""
|
1450 |
|
1451 |
-
#:
|
1452 |
-
msgid "
|
1453 |
msgstr ""
|
1454 |
|
1455 |
-
#:
|
1456 |
-
msgid "
|
1457 |
msgstr ""
|
1458 |
|
1459 |
-
#:
|
1460 |
-
msgid "
|
1461 |
msgstr ""
|
1462 |
|
1463 |
-
#:
|
1464 |
-
msgid "
|
1465 |
msgstr ""
|
1466 |
|
1467 |
-
#:
|
1468 |
-
msgid "
|
1469 |
msgstr ""
|
1470 |
|
1471 |
-
#:
|
1472 |
-
msgid "
|
1473 |
msgstr ""
|
1474 |
|
1475 |
-
#:
|
1476 |
-
msgid "
|
1477 |
msgstr ""
|
1478 |
|
1479 |
-
#:
|
1480 |
-
msgid "
|
1481 |
msgstr ""
|
1482 |
|
1483 |
-
#:
|
1484 |
-
msgid "
|
1485 |
msgstr ""
|
1486 |
|
1487 |
-
#:
|
1488 |
-
msgid "
|
1489 |
msgstr ""
|
1490 |
|
1491 |
-
#:
|
1492 |
-
msgid "
|
1493 |
msgstr ""
|
1494 |
|
1495 |
-
#:
|
1496 |
-
msgid "
|
1497 |
msgstr ""
|
1498 |
|
1499 |
-
#:
|
1500 |
-
msgid "
|
1501 |
msgstr ""
|
1502 |
|
1503 |
-
#:
|
1504 |
-
msgid "
|
1505 |
msgstr ""
|
1506 |
|
1507 |
-
#:
|
1508 |
-
msgid "
|
1509 |
msgstr ""
|
1510 |
|
1511 |
-
#:
|
1512 |
-
msgid "
|
1513 |
msgstr ""
|
1514 |
|
1515 |
-
#:
|
1516 |
-
msgid "
|
1517 |
msgstr ""
|
1518 |
|
1519 |
-
#:
|
1520 |
-
msgid "
|
1521 |
msgstr ""
|
1522 |
|
1523 |
-
#:
|
1524 |
-
msgid "
|
1525 |
msgstr ""
|
1526 |
|
1527 |
-
#:
|
1528 |
-
msgid "
|
1529 |
msgstr ""
|
1530 |
|
1531 |
-
#:
|
1532 |
-
msgid "
|
1533 |
msgstr ""
|
1534 |
|
1535 |
-
#:
|
1536 |
-
msgid "
|
1537 |
msgstr ""
|
1538 |
|
1539 |
-
#:
|
1540 |
-
msgid "
|
1541 |
msgstr ""
|
1542 |
|
1543 |
-
#:
|
1544 |
-
msgid "
|
1545 |
msgstr ""
|
1546 |
|
1547 |
-
#:
|
1548 |
-
msgid "
|
1549 |
msgstr ""
|
1550 |
|
1551 |
-
#:
|
1552 |
-
msgid "
|
1553 |
msgstr ""
|
1554 |
|
1555 |
-
#:
|
1556 |
-
msgid "
|
1557 |
msgstr ""
|
1558 |
|
1559 |
-
#:
|
1560 |
-
msgid "
|
1561 |
msgstr ""
|
1562 |
|
1563 |
-
#:
|
1564 |
-
msgid "
|
1565 |
msgstr ""
|
1566 |
|
1567 |
-
#:
|
1568 |
-
msgid "
|
1569 |
msgstr ""
|
1570 |
|
1571 |
-
#:
|
1572 |
-
msgid "
|
1573 |
msgstr ""
|
1574 |
|
1575 |
-
#:
|
1576 |
-
msgid "
|
1577 |
msgstr ""
|
1578 |
|
1579 |
-
#:
|
1580 |
-
msgid "
|
1581 |
msgstr ""
|
1582 |
|
1583 |
-
#:
|
1584 |
-
msgid "
|
1585 |
msgstr ""
|
1586 |
|
1587 |
-
#:
|
1588 |
-
msgid "
|
1589 |
msgstr ""
|
1590 |
|
1591 |
-
#:
|
1592 |
-
msgid "
|
1593 |
msgstr ""
|
1594 |
|
1595 |
-
#:
|
1596 |
-
msgid "
|
1597 |
msgstr ""
|
1598 |
|
1599 |
-
#:
|
1600 |
-
msgid "
|
1601 |
-
|
|
|
|
|
1602 |
|
1603 |
-
#:
|
1604 |
-
msgid "
|
1605 |
msgstr ""
|
1606 |
|
1607 |
-
#:
|
1608 |
-
msgid "
|
1609 |
msgstr ""
|
1610 |
|
1611 |
-
#:
|
1612 |
-
msgid "
|
1613 |
msgstr ""
|
1614 |
|
1615 |
-
#:
|
1616 |
-
msgid "
|
1617 |
msgstr ""
|
1618 |
|
1619 |
-
#:
|
1620 |
-
msgid "
|
1621 |
msgstr ""
|
1622 |
|
1623 |
-
#:
|
1624 |
-
msgid "
|
1625 |
msgstr ""
|
1626 |
|
1627 |
-
#:
|
1628 |
-
msgid "
|
1629 |
msgstr ""
|
1630 |
|
1631 |
-
#:
|
1632 |
-
msgid "
|
1633 |
msgstr ""
|
1634 |
|
1635 |
-
#:
|
1636 |
-
msgid "
|
1637 |
msgstr ""
|
1638 |
|
1639 |
-
#:
|
1640 |
-
msgid "
|
1641 |
msgstr ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2019 site-reviews
|
2 |
# This file is distributed under the same license as the site-reviews package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
43 |
msgid "You can use the %s plugin to restore %s to the previous version."
|
44 |
msgstr ""
|
45 |
|
46 |
+
#: helpers.php:60, plugin/Controllers/AdminController.php:164
|
47 |
+
msgid "Recalculated rating counts."
|
48 |
msgstr ""
|
49 |
|
50 |
+
#: config/settings.php:6
|
51 |
+
msgid "Site Reviews relies on the CSS of your theme to style the submission form. If your theme does not provide proper CSS rules for form elements and you are using a WordPress plugin/theme or CSS Framework listed here, please try selecting it, otherwise choose \"Site Reviews (default)\"."
|
52 |
msgstr ""
|
53 |
|
54 |
+
#: config/settings.php:7
|
55 |
+
msgid "Plugin Style"
|
56 |
+
msgstr ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
|
58 |
+
#: config/settings.php:14
|
59 |
+
msgid "Site Reviews (default)"
|
60 |
msgstr ""
|
61 |
|
62 |
+
#: config/settings.php:15
|
63 |
+
msgid "Site Reviews (minimal)"
|
64 |
msgstr ""
|
65 |
|
66 |
+
#: config/settings.php:26
|
67 |
+
msgid "Set the status of new review submissions to \"unapproved\"."
|
68 |
msgstr ""
|
69 |
|
70 |
+
#: config/settings.php:27
|
71 |
+
msgid "Require Approval"
|
72 |
msgstr ""
|
73 |
|
74 |
+
#: config/settings.php:32
|
75 |
msgid "Only allow review submissions from registered users."
|
76 |
msgstr ""
|
77 |
|
78 |
+
#: config/settings.php:33
|
79 |
+
msgid "Require Login"
|
80 |
msgstr ""
|
81 |
|
82 |
+
#: config/settings.php:39
|
83 |
msgid "Show a link for a new user to register. The %s Membership option must be enabled in General Settings for this to work."
|
84 |
msgstr ""
|
85 |
|
86 |
+
#: config/settings.php:40
|
87 |
msgid "Anyone can register"
|
88 |
msgstr ""
|
89 |
|
90 |
+
#: config/settings.php:42
|
91 |
+
msgid "Show Registration Link"
|
92 |
+
msgstr ""
|
93 |
+
|
94 |
+
#: config/settings.php:47
|
95 |
+
msgid "Integrate with the %s plugin to calculate ratings for all languages of a post."
|
96 |
msgstr ""
|
97 |
|
98 |
+
#: config/settings.php:50
|
99 |
+
msgid "Integrate with Polylang"
|
100 |
msgstr ""
|
101 |
|
102 |
+
#: config/settings.php:55
|
103 |
+
msgid "Notifications"
|
104 |
+
msgstr ""
|
105 |
+
|
106 |
+
#: config/settings.php:57
|
107 |
msgid "Send to administrator"
|
108 |
msgstr ""
|
109 |
|
110 |
+
#: config/settings.php:58
|
111 |
+
msgid "Send to author of the page that the review is assigned to"
|
112 |
msgstr ""
|
113 |
|
114 |
+
#: config/settings.php:59
|
115 |
+
msgid "Send to one or more email addresses"
|
116 |
msgstr ""
|
117 |
|
118 |
+
#: config/settings.php:60
|
119 |
+
msgid "Send to <a href=\"https://slack.com/\">Slack</a>"
|
120 |
msgstr ""
|
121 |
|
122 |
+
#: config/settings.php:67
|
123 |
+
msgid "Send Notification Emails To"
|
124 |
msgstr ""
|
125 |
|
126 |
+
#: config/settings.php:68
|
127 |
+
msgid "Separate multiple emails with a comma"
|
128 |
msgstr ""
|
129 |
|
130 |
+
#: config/settings.php:74
|
131 |
msgid "To send notifications to Slack, create a new %s and then paste the provided Webhook URL in the field above."
|
132 |
msgstr ""
|
133 |
|
134 |
+
#: config/settings.php:75
|
135 |
msgid "Incoming WebHook"
|
136 |
msgstr ""
|
137 |
|
138 |
+
#: config/settings.php:77
|
139 |
+
msgid "Slack Webhook URL"
|
140 |
+
msgstr ""
|
141 |
+
|
142 |
+
#: config/settings.php:83
|
143 |
+
msgstr ""
|
144 |
+
|
145 |
+
#: config/settings.php:95
|
146 |
+
msgid "Notification Template"
|
147 |
+
msgstr ""
|
148 |
+
|
149 |
+
#: config/settings.php:101
|
150 |
+
msgid "The default date format is the one set in your %s."
|
151 |
+
msgstr ""
|
152 |
+
|
153 |
+
#: config/settings.php:102
|
154 |
+
msgid "WordPress settings"
|
155 |
msgstr ""
|
156 |
|
157 |
+
#: config/settings.php:104
|
158 |
msgid "Date Format"
|
159 |
msgstr ""
|
160 |
|
161 |
+
#: config/settings.php:106
|
162 |
msgid "Use the default date format"
|
163 |
msgstr ""
|
164 |
|
165 |
+
#: config/settings.php:107
|
166 |
msgid "Use a relative date format"
|
167 |
msgstr ""
|
168 |
|
169 |
+
#: config/settings.php:108
|
170 |
msgid "Use a custom date format"
|
171 |
msgstr ""
|
172 |
|
173 |
+
#: config/settings.php:115
|
174 |
+
msgid "Enter a custom date format (<a href=\"https://codex.wordpress.org/Formatting_Date_and_Time\">documentation on date and time formatting</a>)."
|
175 |
msgstr ""
|
176 |
|
177 |
+
#: config/settings.php:116
|
178 |
+
msgid "Custom Date Format"
|
179 |
msgstr ""
|
180 |
|
181 |
+
#: config/settings.php:121
|
182 |
+
msgid "Display a link to the assigned post of a review."
|
183 |
msgstr ""
|
184 |
|
185 |
+
#: config/settings.php:122
|
186 |
+
msgid "Enable Assigned Links"
|
187 |
msgstr ""
|
188 |
|
189 |
+
#: config/settings.php:127
|
190 |
+
msgid "Display reviewer avatars. These are generated from the email address of the reviewer using <a href=\"https://gravatar.com\">Gravatar</a>."
|
191 |
msgstr ""
|
192 |
|
193 |
+
#: config/settings.php:128
|
194 |
+
msgid "Enable Avatars"
|
195 |
msgstr ""
|
196 |
|
197 |
+
#: config/settings.php:134
|
198 |
+
msgid "Regenerate the avatar whenever a local review is shown?"
|
199 |
msgstr ""
|
200 |
|
201 |
+
#: config/settings.php:135
|
202 |
+
msgid "Regenerate Avatars"
|
203 |
+
msgstr ""
|
204 |
+
|
205 |
+
#: config/settings.php:141
|
206 |
+
msgid "Set the avatar size in pixels."
|
207 |
msgstr ""
|
208 |
|
209 |
+
#: config/settings.php:142
|
210 |
+
msgid "Avatar Size"
|
211 |
msgstr ""
|
212 |
|
213 |
+
#: config/settings.php:147
|
214 |
+
msgid "Display an excerpt instead of the full review."
|
215 |
msgstr ""
|
216 |
|
217 |
+
#: config/settings.php:148
|
218 |
msgid "Enable Excerpts"
|
219 |
msgstr ""
|
220 |
|
221 |
+
#: config/settings.php:154
|
222 |
+
msgid "Set the excerpt word length."
|
223 |
msgstr ""
|
224 |
|
225 |
+
#: config/settings.php:155
|
226 |
msgid "Excerpt Length"
|
227 |
msgstr ""
|
228 |
|
229 |
+
#: config/settings.php:160
|
230 |
+
msgid "Display the fallback text when there are no reviews to display. This can be changed on the %s page. You may also override this by using the \"fallback\" option on the shortcode. The default fallback text is: %s"
|
231 |
+
msgstr ""
|
232 |
+
|
233 |
+
#: config/settings.php:161, plugin/Controllers/MenuController.php:111
|
234 |
+
msgid "Translations"
|
235 |
msgstr ""
|
236 |
|
237 |
+
#: config/settings.php:162, plugin/Modules/Html/ReviewsHtml.php:106
|
238 |
+
msgid "There are no reviews yet. Be the first one to write one."
|
239 |
msgstr ""
|
240 |
|
241 |
+
#: config/settings.php:164
|
242 |
+
msgid "Enable Fallback Text"
|
243 |
msgstr ""
|
244 |
|
245 |
+
#: config/settings.php:169, config/settings.php:187, config/settings.php:203, config/settings.php:219, config/settings.php:235, config/settings.php:252, config/settings.php:260, config/settings.php:268, config/settings.php:276, config/settings.php:284, config/settings.php:292
|
246 |
+
msgid "Custom Field name"
|
247 |
+
msgstr ""
|
248 |
+
|
249 |
+
#: config/settings.php:170
|
250 |
msgid "Default Schema Type"
|
251 |
msgstr ""
|
252 |
|
253 |
+
#: config/settings.php:172
|
254 |
msgid "Local Business"
|
255 |
msgstr ""
|
256 |
|
257 |
+
#: config/settings.php:173
|
258 |
msgid "Product"
|
259 |
msgstr ""
|
260 |
|
261 |
+
#: config/settings.php:174
|
262 |
msgid "Custom"
|
263 |
msgstr ""
|
264 |
|
265 |
+
#: config/settings.php:181
|
266 |
+
msgid "View more information on schema types here"
|
267 |
msgstr ""
|
268 |
|
269 |
+
#: config/settings.php:182
|
270 |
msgid "Custom Schema Type"
|
271 |
msgstr ""
|
272 |
|
273 |
+
#: config/settings.php:188
|
|
|
|
|
|
|
|
|
274 |
msgid "Default Name"
|
275 |
msgstr ""
|
276 |
|
277 |
+
#: config/settings.php:190
|
278 |
msgid "Use the assigned or current page title"
|
279 |
msgstr ""
|
280 |
|
281 |
+
#: config/settings.php:191
|
282 |
+
msgid "Enter a custom title"
|
283 |
msgstr ""
|
284 |
|
285 |
+
#: config/settings.php:198
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
286 |
msgid "Custom Name"
|
287 |
msgstr ""
|
288 |
|
289 |
+
#: config/settings.php:204
|
290 |
msgid "Default Description"
|
291 |
msgstr ""
|
292 |
|
293 |
+
#: config/settings.php:206
|
294 |
msgid "Use the assigned or current page excerpt"
|
295 |
msgstr ""
|
296 |
|
297 |
+
#: config/settings.php:207
|
298 |
msgid "Enter a custom description"
|
299 |
msgstr ""
|
300 |
|
301 |
+
#: config/settings.php:214
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
302 |
msgid "Custom Description"
|
303 |
msgstr ""
|
304 |
|
305 |
+
#: config/settings.php:220
|
306 |
msgid "Default URL"
|
307 |
msgstr ""
|
308 |
|
309 |
+
#: config/settings.php:222
|
310 |
msgid "Use the assigned or current page URL"
|
311 |
msgstr ""
|
312 |
|
313 |
+
#: config/settings.php:223
|
314 |
msgid "Enter a custom URL"
|
315 |
msgstr ""
|
316 |
|
317 |
+
#: config/settings.php:230
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
318 |
msgid "Custom URL"
|
319 |
msgstr ""
|
320 |
|
321 |
+
#: config/settings.php:236
|
322 |
msgid "Default Image"
|
323 |
msgstr ""
|
324 |
|
325 |
+
#: config/settings.php:238
|
326 |
msgid "Use the featured image of the assigned or current page"
|
327 |
msgstr ""
|
328 |
|
329 |
+
#: config/settings.php:239
|
330 |
msgid "Enter a custom image URL"
|
331 |
msgstr ""
|
332 |
|
333 |
+
#: config/settings.php:246
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
334 |
msgid "Custom Image URL"
|
335 |
msgstr ""
|
336 |
|
337 |
+
#: config/settings.php:253
|
338 |
msgid "Address"
|
339 |
msgstr ""
|
340 |
|
341 |
+
#: config/settings.php:261
|
|
|
|
|
|
|
|
|
342 |
msgid "Telephone Number"
|
343 |
msgstr ""
|
344 |
|
345 |
+
#: config/settings.php:269
|
|
|
|
|
|
|
|
|
346 |
msgid "Price Range"
|
347 |
msgstr ""
|
348 |
|
349 |
+
#: config/settings.php:277
|
|
|
|
|
|
|
|
|
350 |
msgid "Low Price"
|
351 |
msgstr ""
|
352 |
|
353 |
+
#: config/settings.php:285
|
|
|
|
|
|
|
|
|
354 |
msgid "High Price"
|
355 |
msgstr ""
|
356 |
|
357 |
+
#: config/settings.php:293
|
|
|
|
|
|
|
|
|
358 |
msgid "Price Currency"
|
359 |
msgstr ""
|
360 |
|
361 |
+
#: config/settings.php:299
|
362 |
+
msgid "Choose which fields should be required in the submission form."
|
363 |
msgstr ""
|
364 |
|
365 |
+
#: config/settings.php:300
|
366 |
msgid "Required Fields"
|
367 |
msgstr ""
|
368 |
|
369 |
+
#: config/settings.php:302, plugin/Controllers/EditorController.php:370, plugin/Controllers/MainController.php:32, plugin/Shortcodes/SiteReviewsPopup.php:33
|
370 |
+
msgid "Rating"
|
371 |
+
msgstr ""
|
372 |
+
|
373 |
+
#: config/settings.php:303, plugin/Defaults/PostTypeDefaults.php:17, plugin/Shortcodes/SiteReviewsFormPopup.php:19, plugin/Shortcodes/SiteReviewsPopup.php:20, plugin/Shortcodes/SiteReviewsSummaryPopup.php:19, plugin/Widgets/SiteReviewsFormWidget.php:21, plugin/Widgets/SiteReviewsSummaryWidget.php:21, plugin/Widgets/SiteReviewsWidget.php:21
|
374 |
msgid "Title"
|
375 |
msgstr ""
|
376 |
|
377 |
+
#: config/settings.php:304, plugin/Controllers/MainController.php:43
|
378 |
msgid "Review"
|
379 |
msgstr ""
|
380 |
|
381 |
+
#: config/settings.php:305, plugin/Controllers/EditorController.php:373
|
382 |
msgid "Name"
|
383 |
msgstr ""
|
384 |
|
385 |
+
#: config/settings.php:306, plugin/Controllers/EditorController.php:374
|
386 |
msgid "Email"
|
387 |
msgstr ""
|
388 |
|
389 |
+
#: config/settings.php:307
|
390 |
+
msgid "Terms"
|
|
|
|
|
|
|
|
|
391 |
msgstr ""
|
392 |
|
393 |
+
#: config/settings.php:313
|
394 |
+
msgid "Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you will need to <a href=\"https://www.google.com/recaptcha/admin\" target=\"_blank\">sign up</a> for an API key pair for your site."
|
395 |
msgstr ""
|
396 |
|
397 |
+
#: config/settings.php:314
|
398 |
msgid "Invisible reCAPTCHA"
|
399 |
msgstr ""
|
400 |
|
401 |
+
#: config/settings.php:325
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
402 |
msgid "Site Key"
|
403 |
msgstr ""
|
404 |
|
405 |
+
#: config/settings.php:331
|
406 |
msgid "Site Secret"
|
407 |
msgstr ""
|
408 |
|
409 |
+
#: config/settings.php:337
|
410 |
+
msgid "This option may not work consistently if another plugin is loading reCAPTCHA on the same page as Site Reviews."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
411 |
msgstr ""
|
412 |
|
413 |
+
#: config/settings.php:338
|
414 |
+
msgid "Badge Position"
|
415 |
msgstr ""
|
416 |
|
417 |
+
#: config/settings.php:348
|
418 |
+
msgid "The <a href=\"https://akismet.com\" target=\"_blank\">Akismet plugin</a> integration provides spam-filtering for your reviews. In order for this setting to have any affect, you will need to first install and activate the Akismet plugin and set up a WordPress.com API key."
|
419 |
msgstr ""
|
420 |
|
421 |
+
#: config/settings.php:349
|
422 |
+
msgid "Enable Akismet Integration"
|
423 |
msgstr ""
|
424 |
|
425 |
+
#: config/settings.php:354
|
426 |
+
msgid "When a review contains any of these words in its title, content, name, email, or IP address, it will be rejected. One word or IP address per line. It will match inside words, so \"press\" will match \"WordPress\"."
|
427 |
msgstr ""
|
428 |
|
429 |
+
#: config/settings.php:355
|
430 |
+
msgid "Review Blacklist"
|
431 |
msgstr ""
|
432 |
|
433 |
+
#: config/settings.php:361
|
434 |
+
msgid "Choose the action that should be taken when a review is blacklisted."
|
435 |
msgstr ""
|
436 |
|
437 |
+
#: config/settings.php:362
|
438 |
+
msgid "Blacklist Action"
|
439 |
msgstr ""
|
440 |
|
441 |
+
#: config/settings.php:364
|
442 |
+
msgid "Require approval"
|
443 |
msgstr ""
|
444 |
|
445 |
+
#: config/settings.php:365
|
446 |
+
msgid "Reject submission"
|
447 |
msgstr ""
|
448 |
|
449 |
+
#: plugin/Application.php:192
|
450 |
+
msgid "Local"
|
451 |
msgstr ""
|
452 |
|
453 |
+
#: plugin/Review.php:154, plugin/Modules/Notification.php:66
|
454 |
+
msgid "Anonymous"
|
455 |
msgstr ""
|
456 |
|
457 |
+
#: plugin/Router.php:142
|
458 |
+
msgid "There was an error (try refreshing the page)."
|
459 |
msgstr ""
|
460 |
|
461 |
+
#: plugin/Router.php:144
|
462 |
+
msgid "The form could not be submitted. Please notify the site administrator."
|
463 |
msgstr ""
|
464 |
|
465 |
+
#: config/forms/submission-form.php:5
|
466 |
+
msgid "Your overall rating"
|
467 |
msgstr ""
|
468 |
|
469 |
+
#: config/forms/submission-form.php:9
|
470 |
+
msgid "Title of your review"
|
471 |
msgstr ""
|
472 |
|
473 |
+
#: config/forms/submission-form.php:10
|
474 |
+
msgid "Summarize your review or highlight an interesting detail"
|
475 |
msgstr ""
|
476 |
|
477 |
+
#: config/forms/submission-form.php:14
|
478 |
+
msgid "Your review"
|
479 |
msgstr ""
|
480 |
|
481 |
+
#: config/forms/submission-form.php:15
|
482 |
+
msgid "Tell people your review"
|
483 |
msgstr ""
|
484 |
|
485 |
+
#: config/forms/submission-form.php:20
|
486 |
+
msgid "Your name"
|
487 |
msgstr ""
|
488 |
|
489 |
+
#: config/forms/submission-form.php:21
|
490 |
+
msgid "Tell us your name"
|
491 |
msgstr ""
|
492 |
|
493 |
+
#: config/forms/submission-form.php:25
|
494 |
+
msgid "Your email"
|
495 |
msgstr ""
|
496 |
|
497 |
+
#: config/forms/submission-form.php:26
|
498 |
+
msgid "Tell us your email"
|
499 |
msgstr ""
|
500 |
|
501 |
+
#: config/forms/submission-form.php:30
|
502 |
+
msgid "This review is based on my own experience and is my genuine opinion."
|
503 |
msgstr ""
|
504 |
|
505 |
+
#: plugin/Blocks/SiteReviewsBlock.php:90, plugin/Blocks/SiteReviewsFormBlock.php:79, plugin/Blocks/SiteReviewsSummaryBlock.php:75
|
506 |
+
msgid "You have hidden all of the fields for this block."
|
507 |
msgstr ""
|
508 |
|
509 |
+
#: plugin/Blocks/SiteReviewsBlock.php:124, plugin/Modules/Html/Partials/SiteReviews.php:270
|
510 |
+
msgid "Show more"
|
|
|
511 |
msgstr ""
|
512 |
|
513 |
+
#: plugin/Commands/RegisterPostType.php:48
|
514 |
+
msgctxt "Add New Post"
|
515 |
+
msgid "Add New %s"
|
516 |
msgstr ""
|
517 |
|
518 |
+
#: plugin/Commands/RegisterPostType.php:49
|
519 |
+
msgctxt "All Posts"
|
520 |
+
msgid "All %s"
|
521 |
msgstr ""
|
522 |
|
523 |
+
#: plugin/Commands/RegisterPostType.php:50
|
524 |
+
msgctxt "Post Archives"
|
525 |
+
msgid "%s Archives"
|
526 |
msgstr ""
|
527 |
|
528 |
+
#: plugin/Commands/RegisterPostType.php:51
|
529 |
+
msgctxt "Edit Post"
|
530 |
+
msgid "Edit %s"
|
531 |
msgstr ""
|
532 |
|
533 |
+
#: plugin/Commands/RegisterPostType.php:52
|
534 |
+
msgctxt "Insert into Post"
|
535 |
+
msgid "Insert into %s"
|
536 |
msgstr ""
|
537 |
|
538 |
+
#: plugin/Commands/RegisterPostType.php:55
|
539 |
+
msgctxt "New Post"
|
540 |
+
msgid "New %s"
|
541 |
msgstr ""
|
542 |
|
543 |
+
#: plugin/Commands/RegisterPostType.php:56
|
544 |
+
msgctxt "No Posts found"
|
545 |
+
msgid "No %s found"
|
546 |
msgstr ""
|
547 |
|
548 |
+
#: plugin/Commands/RegisterPostType.php:57
|
549 |
+
msgctxt "No Posts found in Trash"
|
550 |
+
msgid "No %s found in Trash"
|
551 |
msgstr ""
|
552 |
|
553 |
+
#: plugin/Commands/RegisterPostType.php:58
|
554 |
+
msgctxt "Search Posts"
|
555 |
+
msgid "Search %s"
|
556 |
msgstr ""
|
557 |
|
558 |
+
#: plugin/Commands/RegisterPostType.php:60
|
559 |
+
msgctxt "Uploaded to this Post"
|
560 |
+
msgid "Uploaded to this %s"
|
561 |
msgstr ""
|
562 |
|
563 |
+
#: plugin/Commands/RegisterPostType.php:61
|
564 |
+
msgctxt "View Post"
|
565 |
+
msgid "View %s"
|
566 |
msgstr ""
|
567 |
|
568 |
+
#: plugin/Controllers/AdminController.php:29
|
569 |
+
msgid "You can pin exceptional reviews so that they are always shown first."
|
570 |
msgstr ""
|
571 |
|
572 |
+
#: plugin/Controllers/AdminController.php:37
|
573 |
+
msgid "Pin Your Reviews"
|
574 |
msgstr ""
|
575 |
|
576 |
+
#: plugin/Controllers/AdminController.php:49, plugin/Controllers/MenuController.php:48, views/pages/tools/sync.php:23
|
577 |
msgid "Settings"
|
578 |
msgstr ""
|
579 |
|
580 |
+
#: plugin/Controllers/AdminController.php:66
|
581 |
msgid "%s Review"
|
582 |
msgid_plural "%s Reviews"
|
583 |
msgstr[0] ""
|
584 |
msgstr[1] ""
|
585 |
|
586 |
+
#: plugin/Controllers/AdminController.php:101, plugin/Controllers/MainController.php:90
|
587 |
+
msgid "Recent Reviews"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
588 |
msgstr ""
|
589 |
|
590 |
+
#: plugin/Controllers/AdminController.php:102, plugin/Controllers/MainController.php:95
|
591 |
+
msgid "Submit a Review"
|
592 |
msgstr ""
|
593 |
|
594 |
+
#: plugin/Controllers/AdminController.php:103, plugin/Controllers/MainController.php:100
|
595 |
+
msgid "Summary of Reviews"
|
596 |
msgstr ""
|
597 |
|
598 |
+
#: plugin/Controllers/AdminController.php:133
|
599 |
+
msgid "Console cleared."
|
600 |
msgstr ""
|
601 |
|
602 |
+
#: plugin/Controllers/AdminController.php:141
|
603 |
+
msgid "Console reloaded."
|
604 |
msgstr ""
|
605 |
|
606 |
+
#: plugin/Controllers/AdminController.php:203
|
607 |
+
msgid "Please use a valid Site Reviews settings file."
|
608 |
msgstr ""
|
609 |
|
610 |
+
#: plugin/Controllers/AdminController.php:207
|
611 |
+
msgid "There were no settings found to import."
|
612 |
msgstr ""
|
613 |
|
614 |
+
#: plugin/Controllers/AdminController.php:210
|
615 |
+
msgid "Settings imported."
|
616 |
msgstr ""
|
617 |
|
618 |
+
#: plugin/Controllers/AdminController.php:220
|
619 |
+
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
|
620 |
msgstr ""
|
621 |
|
622 |
+
#: plugin/Controllers/AdminController.php:221
|
623 |
+
msgid "The uploaded file is too big."
|
624 |
msgstr ""
|
625 |
|
626 |
+
#: plugin/Controllers/AdminController.php:222
|
627 |
+
msgid "The uploaded file was only partially uploaded."
|
628 |
msgstr ""
|
629 |
|
630 |
+
#: plugin/Controllers/AdminController.php:223
|
631 |
+
msgid "No file was uploaded."
|
632 |
msgstr ""
|
633 |
|
634 |
+
#: plugin/Controllers/AdminController.php:224
|
635 |
+
msgid "Missing a temporary folder."
|
636 |
msgstr ""
|
637 |
|
638 |
+
#: plugin/Controllers/AdminController.php:225
|
639 |
+
msgid "Failed to write file to disk."
|
640 |
msgstr ""
|
641 |
|
642 |
+
#: plugin/Controllers/AdminController.php:226
|
643 |
+
msgid "A PHP extension stopped the file upload."
|
644 |
msgstr ""
|
645 |
|
646 |
+
#: plugin/Controllers/AdminController.php:229
|
647 |
+
msgid "Unknown upload error."
|
648 |
msgstr ""
|
649 |
|
650 |
+
#: plugin/Controllers/AjaxController.php:61
|
651 |
+
msgid "Okay"
|
652 |
msgstr ""
|
653 |
|
654 |
+
#: plugin/Controllers/AjaxController.php:93, plugin/Controllers/AjaxController.php:112
|
655 |
+
msgid "Nothing found."
|
656 |
msgstr ""
|
657 |
|
658 |
+
#: plugin/Controllers/EditorController.php:97, plugin/Controllers/MainController.php:29, plugin/Shortcodes/SiteReviewsPopup.php:59, plugin/Shortcodes/SiteReviewsSummaryPopup.php:27, views/partials/editor/bulk-edit-assigned-to.php:7
|
659 |
+
msgid "Assigned To"
|
660 |
msgstr ""
|
661 |
|
662 |
+
#: plugin/Controllers/EditorController.php:98
|
663 |
+
msgid "Details"
|
664 |
msgstr ""
|
665 |
|
666 |
+
#: plugin/Controllers/EditorController.php:100, views/partials/editor/metabox-response.php:3
|
667 |
+
msgid "Respond Publicly"
|
668 |
msgstr ""
|
669 |
|
670 |
+
#: plugin/Controllers/EditorController.php:167, plugin/Modules/Html/Fields/YesNo.php:37
|
671 |
+
msgid "No"
|
672 |
msgstr ""
|
673 |
|
674 |
+
#: plugin/Controllers/EditorController.php:168, plugin/Modules/Html/Fields/YesNo.php:38
|
675 |
+
msgid "Yes"
|
676 |
msgstr ""
|
677 |
|
678 |
+
#: plugin/Controllers/EditorController.php:220
|
679 |
+
msgid "%s reviews are read-only."
|
680 |
msgstr ""
|
681 |
|
682 |
+
#: plugin/Controllers/EditorController.php:303
|
683 |
+
msgid "Revert Changes"
|
|
|
|
|
|
|
|
|
|
|
|
|
684 |
msgstr ""
|
685 |
|
686 |
+
#: plugin/Controllers/EditorController.php:309
|
687 |
msgid "Nothing to Revert"
|
688 |
msgstr ""
|
689 |
|
690 |
+
#: plugin/Controllers/EditorController.php:325
|
|
|
|
|
|
|
|
|
691 |
msgid "Unknown"
|
692 |
msgstr ""
|
693 |
|
694 |
+
#: plugin/Controllers/EditorController.php:360
|
|
|
|
|
|
|
|
|
695 |
msgid "Unregistered user"
|
696 |
msgstr ""
|
697 |
|
698 |
+
#: plugin/Controllers/EditorController.php:367
|
699 |
msgid "RE:"
|
700 |
msgstr ""
|
701 |
|
702 |
+
#: plugin/Controllers/EditorController.php:371, plugin/Controllers/MainController.php:31, plugin/Shortcodes/TinymcePopupGenerator.php:136
|
703 |
+
msgid "Type"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
704 |
msgstr ""
|
705 |
|
706 |
+
#: plugin/Controllers/EditorController.php:372, plugin/Defaults/PostTypeDefaults.php:18
|
707 |
+
msgid "Date"
|
708 |
msgstr ""
|
709 |
|
710 |
+
#: plugin/Controllers/EditorController.php:375
|
711 |
+
msgid "User"
|
712 |
msgstr ""
|
713 |
|
714 |
+
#: plugin/Controllers/EditorController.php:376
|
715 |
+
msgid "IP Address"
|
716 |
msgstr ""
|
717 |
|
718 |
+
#: plugin/Controllers/EditorController.php:377
|
719 |
+
msgid "Avatar"
|
720 |
msgstr ""
|
721 |
|
722 |
+
#: plugin/Controllers/ListTableController.php:43
|
723 |
msgid "%s review updated."
|
724 |
msgid_plural "%s reviews updated."
|
725 |
msgstr[0] ""
|
726 |
msgstr[1] ""
|
727 |
|
728 |
+
#: plugin/Controllers/ListTableController.php:44
|
729 |
msgid "%s review not updated, somebody is editing it."
|
730 |
msgid_plural "%s reviews not updated, somebody is editing them."
|
731 |
msgstr[0] ""
|
732 |
msgstr[1] ""
|
733 |
|
734 |
+
#: plugin/Controllers/ListTableController.php:45
|
735 |
msgid "%s review permanently deleted."
|
736 |
msgid_plural "%s reviews permanently deleted."
|
737 |
msgstr[0] ""
|
738 |
msgstr[1] ""
|
739 |
|
740 |
+
#: plugin/Controllers/ListTableController.php:46
|
741 |
msgid "%s review moved to the Trash."
|
742 |
msgid_plural "%s reviews moved to the Trash."
|
743 |
msgstr[0] ""
|
744 |
msgstr[1] ""
|
745 |
|
746 |
+
#: plugin/Controllers/ListTableController.php:47
|
747 |
msgid "%s review restored from the Trash."
|
748 |
msgid_plural "%s reviews restored from the Trash."
|
749 |
msgstr[0] ""
|
750 |
msgstr[1] ""
|
751 |
|
752 |
+
#: plugin/Controllers/ListTableController.php:79
|
753 |
+
msgid "Submitted"
|
754 |
msgstr ""
|
755 |
|
756 |
+
#: plugin/Controllers/ListTableController.php:106, plugin/Controllers/ListTableController.php:172, plugin/Controllers/EditorController/Labels.php:117, plugin/Controllers/EditorController/Labels.php:118
|
757 |
+
msgid "Unapproved"
|
758 |
msgstr ""
|
759 |
|
760 |
+
#: plugin/Controllers/ListTableController.php:123, plugin/Controllers/EditorController/Labels.php:120
|
761 |
+
msgid "Approve"
|
762 |
msgstr ""
|
763 |
|
764 |
+
#: plugin/Controllers/ListTableController.php:124
|
765 |
+
msgid "Unapprove"
|
766 |
msgstr ""
|
767 |
|
768 |
+
#: plugin/Controllers/ListTableController.php:129
|
769 |
+
msgctxt "Approve the review"
|
770 |
+
msgid "%s this review"
|
771 |
msgstr ""
|
772 |
|
773 |
+
#: plugin/Controllers/ListTableController.php:171, plugin/Controllers/EditorController/Labels.php:18, plugin/Controllers/EditorController/Labels.php:121
|
774 |
+
msgid "Approved"
|
775 |
msgstr ""
|
776 |
|
777 |
+
#: plugin/Controllers/MainController.php:30
|
778 |
+
msgid "Author"
|
779 |
msgstr ""
|
780 |
|
781 |
+
#: plugin/Controllers/MainController.php:33, views/partials/editor/pinned.php:4
|
782 |
+
msgid "Pinned"
|
783 |
+
msgstr ""
|
|
|
|
|
784 |
|
785 |
+
#: plugin/Controllers/MainController.php:39, plugin/Controllers/MenuController.php:108, views/pages/tools/sync.php:10, views/pages/tools/sync.php:31
|
786 |
+
msgid "Reviews"
|
787 |
msgstr ""
|
788 |
|
789 |
+
#: plugin/Controllers/MainController.php:89
|
790 |
+
msgid "Your site’s most recent reviews."
|
791 |
msgstr ""
|
792 |
|
793 |
+
#: plugin/Controllers/MainController.php:94
|
794 |
+
msgid "A \"submit a review\" form for your site."
|
795 |
msgstr ""
|
796 |
|
797 |
+
#: plugin/Controllers/MainController.php:99
|
798 |
+
msgid "A summary of your site’s reviews."
|
799 |
+
msgstr ""
|
800 |
+
|
801 |
+
#: plugin/Controllers/MenuController.php:49
|
802 |
+
msgid "Tools"
|
803 |
+
msgstr ""
|
804 |
+
|
805 |
+
#: plugin/Controllers/MenuController.php:50
|
806 |
+
msgid "Add-ons"
|
807 |
+
msgstr ""
|
808 |
+
|
809 |
+
#: plugin/Controllers/MenuController.php:51, views/pages/tools/sync.php:25
|
810 |
+
msgid "Documentation"
|
811 |
+
msgstr ""
|
812 |
+
|
813 |
+
#: plugin/Controllers/MenuController.php:81
|
814 |
+
msgid "Support"
|
815 |
+
msgstr ""
|
816 |
+
|
817 |
+
#: plugin/Controllers/MenuController.php:82
|
818 |
+
msgid "FAQ"
|
819 |
+
msgstr ""
|
820 |
+
|
821 |
+
#: plugin/Controllers/MenuController.php:83
|
822 |
+
msgid "Shortcodes"
|
823 |
+
msgstr ""
|
824 |
+
|
825 |
+
#: plugin/Controllers/MenuController.php:84
|
826 |
+
msgid "Hooks"
|
827 |
+
msgstr ""
|
828 |
+
|
829 |
+
#: plugin/Controllers/MenuController.php:85
|
830 |
+
msgid "Functions"
|
831 |
+
msgstr ""
|
832 |
+
|
833 |
+
#: plugin/Controllers/MenuController.php:86, plugin/Controllers/MenuController.php:112
|
834 |
+
msgid "Addons"
|
835 |
+
msgstr ""
|
836 |
+
|
837 |
+
#: plugin/Controllers/MenuController.php:107, plugin/Controllers/MenuController.php:136
|
838 |
+
msgid "General"
|
839 |
+
msgstr ""
|
840 |
+
|
841 |
+
#: plugin/Controllers/MenuController.php:109
|
842 |
+
msgid "Submissions"
|
843 |
+
msgstr ""
|
844 |
+
|
845 |
+
#: plugin/Controllers/MenuController.php:110, plugin/Shortcodes/SiteReviewsPopup.php:64, plugin/Shortcodes/SiteReviewsSummaryPopup.php:32
|
846 |
+
msgid "Schema"
|
847 |
+
msgstr ""
|
848 |
+
|
849 |
+
#: plugin/Controllers/MenuController.php:113
|
850 |
+
msgid "Licenses"
|
851 |
+
msgstr ""
|
852 |
+
|
853 |
+
#: plugin/Controllers/MenuController.php:137, views/pages/tools/sync.php:57
|
854 |
+
msgid "Sync Reviews"
|
855 |
+
msgstr ""
|
856 |
+
|
857 |
+
#: plugin/Controllers/MenuController.php:138
|
858 |
+
msgid "Console"
|
859 |
+
msgstr ""
|
860 |
+
|
861 |
+
#: plugin/Controllers/MenuController.php:139
|
862 |
+
msgid "System Info"
|
863 |
+
msgstr ""
|
864 |
+
|
865 |
+
#: plugin/Controllers/SettingsController.php:29
|
866 |
+
msgid "Settings updated."
|
867 |
+
msgstr ""
|
868 |
+
|
869 |
+
#: plugin/Controllers/SettingsController.php:106
|
870 |
+
msgid "Please install/activate the Polylang plugin to enable integration."
|
871 |
msgstr ""
|
872 |
|
873 |
+
#: plugin/Controllers/SettingsController.php:110
|
874 |
+
msgid "Please update the Polylang plugin to v2.3.0 or greater to enable integration."
|
875 |
+
msgstr ""
|
876 |
+
|
877 |
+
#: plugin/Controllers/TaxonomyController.php:39
|
878 |
msgid "Filter by category"
|
879 |
msgstr ""
|
880 |
|
881 |
+
#: plugin/Defaults/PaginationDefaults.php:16
|
882 |
+
msgid "Page"
|
883 |
msgstr ""
|
884 |
|
885 |
+
#: plugin/Defaults/PaginationDefaults.php:19
|
886 |
+
msgid "Next →"
|
887 |
+
msgstr ""
|
888 |
+
|
889 |
+
#: plugin/Defaults/PaginationDefaults.php:20
|
890 |
+
msgid "← Previous"
|
891 |
+
msgstr ""
|
892 |
+
|
893 |
+
#: plugin/Defaults/SlackDefaults.php:15
|
894 |
+
msgid "View Review"
|
895 |
+
msgstr ""
|
896 |
+
|
897 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:15
|
898 |
+
msgid "This field must be accepted."
|
899 |
+
msgstr ""
|
900 |
+
|
901 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:16
|
902 |
+
msgid "This field value must be between %s and %s."
|
903 |
+
msgstr ""
|
904 |
|
905 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:17
|
906 |
+
msgid "This field must have between %s and %s characters."
|
907 |
msgstr ""
|
908 |
|
909 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:18
|
910 |
+
msgid "This field requires a valid e-mail address."
|
911 |
msgstr ""
|
912 |
|
913 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:19, plugin/Modules/Validator/ValidateReview.php:254
|
914 |
+
msgid "Please fix the submission errors."
|
915 |
+
msgstr ""
|
916 |
+
|
917 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:20
|
918 |
+
msgid "Maximum value for this field is %s."
|
919 |
+
msgstr ""
|
920 |
+
|
921 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:21
|
922 |
+
msgid "This field allows a maximum of %s characters."
|
923 |
+
msgstr ""
|
924 |
+
|
925 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:22
|
926 |
+
msgid "Minimum value for this field is %s."
|
927 |
+
msgstr ""
|
928 |
+
|
929 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:23
|
930 |
+
msgid "This field requires a minimum of %s characters."
|
931 |
+
msgstr ""
|
932 |
+
|
933 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:24
|
934 |
+
msgid "This field requires a number."
|
935 |
msgstr ""
|
936 |
|
937 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:25
|
938 |
+
msgid "This field is required."
|
939 |
+
msgstr ""
|
940 |
+
|
941 |
+
#: plugin/Defaults/ValidationStringsDefaults.php:26
|
942 |
+
msgid "The review could not be submitted (unsupported browser)."
|
943 |
+
msgstr ""
|
944 |
+
|
945 |
+
#: plugin/Handlers/ChangeStatus.php:39, views/partials/editor/pinned.php:7
|
946 |
+
msgid "Edit"
|
947 |
+
msgstr ""
|
948 |
+
|
949 |
+
#: plugin/Handlers/CreateReview.php:20
|
950 |
+
msgid "Your review could not be submitted and the error has been logged. Please notify the site admin."
|
951 |
+
msgstr ""
|
952 |
+
|
953 |
+
#: plugin/Handlers/CreateReview.php:23
|
954 |
+
msgid "Your review has been submitted!"
|
955 |
msgstr ""
|
956 |
|
957 |
+
#: plugin/Handlers/TogglePinned.php:24
|
958 |
+
msgid "Review pinned."
|
959 |
msgstr ""
|
960 |
|
961 |
+
#: plugin/Handlers/TogglePinned.php:25
|
962 |
+
msgid "Review unpinned."
|
963 |
msgstr ""
|
964 |
|
965 |
+
#: plugin/Modules/Console.php:114
|
966 |
+
msgid "Console is empty"
|
967 |
+
msgstr ""
|
968 |
+
|
969 |
+
#: plugin/Modules/Console.php:302
|
970 |
+
msgid "Console was automatically cleared (128 KB maximum size)"
|
971 |
+
msgstr ""
|
972 |
+
|
973 |
+
#: plugin/Modules/Date.php:36
|
974 |
+
msgid "%s second ago"
|
975 |
+
msgid_plural "%s seconds ago"
|
976 |
+
msgstr[0] ""
|
977 |
+
msgstr[1] ""
|
978 |
+
|
979 |
+
#: plugin/Modules/Date.php:37
|
980 |
+
msgid "%s minute ago"
|
981 |
+
msgid_plural "%s minutes ago"
|
982 |
+
msgstr[0] ""
|
983 |
+
msgstr[1] ""
|
984 |
+
|
985 |
+
#: plugin/Modules/Date.php:38
|
986 |
+
msgid "an hour ago"
|
987 |
+
msgid_plural "%s hours ago"
|
988 |
+
msgstr[0] ""
|
989 |
+
msgstr[1] ""
|
990 |
+
|
991 |
+
#: plugin/Modules/Date.php:39
|
992 |
+
msgid "yesterday"
|
993 |
+
msgid_plural "%s days ago"
|
994 |
+
msgstr[0] ""
|
995 |
+
msgstr[1] ""
|
996 |
+
|
997 |
+
#: plugin/Modules/Date.php:40
|
998 |
+
msgid "a week ago"
|
999 |
+
msgid_plural "%s weeks ago"
|
1000 |
+
msgstr[0] ""
|
1001 |
+
msgstr[1] ""
|
1002 |
+
|
1003 |
+
#: plugin/Modules/Date.php:41
|
1004 |
+
msgid "%s month ago"
|
1005 |
+
msgid_plural "%s months ago"
|
1006 |
+
msgstr[0] ""
|
1007 |
+
msgstr[1] ""
|
1008 |
+
|
1009 |
+
#: plugin/Modules/Date.php:42
|
1010 |
+
msgid "%s year ago"
|
1011 |
+
msgid_plural "%s years ago"
|
1012 |
msgstr[0] ""
|
1013 |
msgstr[1] ""
|
1014 |
|
1015 |
+
#: plugin/Modules/Notification.php:129
|
1016 |
+
msgctxt "This string differs depending on whether or not the review has been assigned to a post."
|
1017 |
+
msgid "New %s-star review"
|
1018 |
+
msgid_plural "New %s-star review of: %s"
|
1019 |
+
msgstr[0] ""
|
1020 |
+
msgstr[1] ""
|
1021 |
+
|
1022 |
+
#: plugin/Modules/Translation.php:117
|
1023 |
+
msgid "This custom translation is no longer valid as the original text has been changed or removed."
|
1024 |
+
msgstr ""
|
1025 |
+
|
1026 |
+
#: plugin/Shortcodes/Shortcode.php:162
|
1027 |
msgid "Excellent"
|
1028 |
msgstr ""
|
1029 |
|
1030 |
+
#: plugin/Shortcodes/Shortcode.php:163
|
1031 |
msgid "Very good"
|
1032 |
msgstr ""
|
1033 |
|
1034 |
+
#: plugin/Shortcodes/Shortcode.php:164
|
1035 |
msgid "Average"
|
1036 |
msgstr ""
|
1037 |
|
1038 |
+
#: plugin/Shortcodes/Shortcode.php:165
|
1039 |
msgid "Poor"
|
1040 |
msgstr ""
|
1041 |
|
1042 |
+
#: plugin/Shortcodes/Shortcode.php:166
|
1043 |
msgid "Terrible"
|
1044 |
msgstr ""
|
1045 |
|
1046 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:17, plugin/Shortcodes/SiteReviewsPopup.php:16, plugin/Shortcodes/SiteReviewsSummaryPopup.php:15
|
1047 |
+
msgid "All settings are optional."
|
1048 |
msgstr ""
|
1049 |
|
1050 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:21, plugin/Shortcodes/SiteReviewsPopup.php:22, plugin/Shortcodes/SiteReviewsSummaryPopup.php:21
|
1051 |
+
msgid "Enter a custom shortcode heading."
|
1052 |
msgstr ""
|
1053 |
|
1054 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:24, plugin/Widgets/SiteReviewsFormWidget.php:26
|
1055 |
+
msgid "Description"
|
1056 |
msgstr ""
|
1057 |
|
1058 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:29
|
1059 |
+
msgid "Enter a custom shortcode description."
|
1060 |
msgstr ""
|
1061 |
|
1062 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:32
|
1063 |
+
msgid "Automatically assign a category to reviews submitted with this shortcode."
|
1064 |
msgstr ""
|
1065 |
|
1066 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:34
|
1067 |
+
msgid "Assign To"
|
1068 |
msgstr ""
|
1069 |
|
1070 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:36
|
1071 |
+
msgid "Assign submitted reviews to a custom page/post ID. You can also enter \"post_id\" to assign reviews to the ID of the current page."
|
1072 |
msgstr ""
|
1073 |
|
1074 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:39, plugin/Shortcodes/SiteReviewsPopup.php:73, plugin/Shortcodes/SiteReviewsSummaryPopup.php:41
|
1075 |
+
msgid "Classes"
|
1076 |
msgstr ""
|
1077 |
|
1078 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:41, plugin/Shortcodes/SiteReviewsPopup.php:75, plugin/Shortcodes/SiteReviewsSummaryPopup.php:43
|
1079 |
+
msgid "Add custom CSS classes to the shortcode."
|
1080 |
msgstr ""
|
1081 |
|
1082 |
+
#: plugin/Shortcodes/SiteReviewsFormPopup.php:46, plugin/Shortcodes/SiteReviewsPopup.php:80, plugin/Shortcodes/SiteReviewsSummaryPopup.php:48
|
1083 |
+
msgid "Hide"
|
1084 |
msgstr ""
|
1085 |
|
1086 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:11
|
1087 |
+
msgid "Hide the rating field"
|
1088 |
msgstr ""
|
1089 |
|
1090 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:12
|
1091 |
+
msgid "Hide the title field"
|
1092 |
msgstr ""
|
1093 |
|
1094 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:13
|
1095 |
+
msgid "Hide the review field"
|
1096 |
msgstr ""
|
1097 |
|
1098 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:14
|
1099 |
+
msgid "Hide the name field"
|
1100 |
msgstr ""
|
1101 |
|
1102 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:15
|
1103 |
+
msgid "Hide the email field"
|
1104 |
msgstr ""
|
1105 |
|
1106 |
+
#: plugin/Shortcodes/SiteReviewsFormShortcode.php:16
|
1107 |
+
msgid "Hide the terms field"
|
1108 |
msgstr ""
|
1109 |
|
1110 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:25
|
1111 |
+
msgid "Count"
|
1112 |
msgstr ""
|
1113 |
|
1114 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:30
|
1115 |
+
msgid "How many reviews would you like to display (default: 10)?"
|
1116 |
msgstr ""
|
1117 |
|
1118 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:36, plugin/Shortcodes/SiteReviewsPopup.php:37, plugin/Shortcodes/SiteReviewsPopup.php:38, plugin/Shortcodes/SiteReviewsPopup.php:39, plugin/Shortcodes/SiteReviewsPopup.php:40, plugin/Widgets/SiteReviewsWidget.php:35, plugin/Widgets/SiteReviewsWidget.php:36, plugin/Widgets/SiteReviewsWidget.php:37, plugin/Widgets/SiteReviewsWidget.php:38, plugin/Widgets/SiteReviewsWidget.php:39, plugin/Controllers/ListTableController/Columns.php:113
|
1119 |
+
msgid "%s star"
|
1120 |
+
msgid_plural "%s stars"
|
1121 |
+
msgstr[0] ""
|
1122 |
+
msgstr[1] ""
|
1123 |
|
1124 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:41
|
1125 |
+
msgid "Unrated"
|
1126 |
msgstr ""
|
1127 |
|
1128 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:43
|
1129 |
+
msgid "What is the minimum rating to display (default: 1 star)?"
|
1130 |
msgstr ""
|
1131 |
|
1132 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:46
|
1133 |
+
msgid "Pagination"
|
1134 |
msgstr ""
|
1135 |
|
1136 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:49
|
1137 |
+
msgid "Enable"
|
1138 |
msgstr ""
|
1139 |
|
1140 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:50
|
1141 |
+
msgid "Enable (using ajax)"
|
1142 |
msgstr ""
|
1143 |
|
1144 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:51
|
1145 |
+
msgid "Disable"
|
1146 |
msgstr ""
|
1147 |
|
1148 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:53
|
1149 |
+
msgid "When using pagination this shortcode can only be used once on a page. (default: disable)"
|
1150 |
msgstr ""
|
1151 |
|
1152 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:56, plugin/Widgets/SiteReviewsWidget.php:45
|
1153 |
+
msgid "Which type of review would you like to display?"
|
1154 |
msgstr ""
|
1155 |
|
1156 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:57, plugin/Shortcodes/SiteReviewsSummaryPopup.php:25
|
1157 |
+
msgid "Limit reviews to this category."
|
1158 |
msgstr ""
|
1159 |
|
1160 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:61, plugin/Shortcodes/SiteReviewsSummaryPopup.php:29
|
1161 |
+
msgid "Limit reviews to those assigned to this post ID (separate multiple IDs with a comma). You can also enter \"post_id\" to use the ID of the current page, or \"parent_id\" to use the ID of the parent page."
|
1162 |
msgstr ""
|
1163 |
|
1164 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:67, plugin/Shortcodes/SiteReviewsSummaryPopup.php:35
|
1165 |
+
msgid "Enable rich snippets"
|
1166 |
msgstr ""
|
1167 |
|
1168 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:68, plugin/Shortcodes/SiteReviewsSummaryPopup.php:36
|
1169 |
+
msgid "Disable rich snippets"
|
1170 |
msgstr ""
|
1171 |
|
1172 |
+
#: plugin/Shortcodes/SiteReviewsPopup.php:70, plugin/Shortcodes/SiteReviewsSummaryPopup.php:38
|
1173 |
+
msgid "Rich snippets are disabled by default."
|
1174 |
msgstr ""
|
1175 |
|
1176 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:11
|
1177 |
+
msgid "Hide the title"
|
1178 |
msgstr ""
|
1179 |
|
1180 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:12, plugin/Shortcodes/SiteReviewsSummaryShortcode.php:11
|
1181 |
+
msgid "Hide the rating"
|
1182 |
msgstr ""
|
1183 |
|
1184 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:13
|
1185 |
+
msgid "Hide the date"
|
1186 |
msgstr ""
|
1187 |
|
1188 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:14
|
1189 |
+
msgid "Hide the assigned to link (if shown)"
|
1190 |
msgstr ""
|
1191 |
|
1192 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:15
|
1193 |
+
msgid "Hide the content"
|
1194 |
msgstr ""
|
1195 |
|
1196 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:16
|
1197 |
+
msgid "Hide the avatar (if shown)"
|
1198 |
msgstr ""
|
1199 |
|
1200 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:17
|
1201 |
+
msgid "Hide the author"
|
1202 |
msgstr ""
|
1203 |
|
1204 |
+
#: plugin/Shortcodes/SiteReviewsShortcode.php:18
|
1205 |
+
msgid "Hide the response"
|
1206 |
msgstr ""
|
1207 |
|
1208 |
+
#: plugin/Shortcodes/SiteReviewsSummaryPopup.php:24, plugin/Widgets/SiteReviewsSummaryWidget.php:27
|
1209 |
+
msgid "Which type of review would you like to use?"
|
1210 |
msgstr ""
|
1211 |
|
1212 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:12
|
1213 |
+
msgid "Hide the stars"
|
1214 |
msgstr ""
|
1215 |
|
1216 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:13
|
1217 |
+
msgid "Hide the summary"
|
|
|
1218 |
msgstr ""
|
1219 |
|
1220 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:14
|
1221 |
+
msgid "Hide the percentage bars"
|
1222 |
msgstr ""
|
1223 |
|
1224 |
+
#: plugin/Shortcodes/SiteReviewsSummaryShortcode.php:15
|
1225 |
+
msgid "Hide if no reviews are found"
|
1226 |
msgstr ""
|
1227 |
|
1228 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:44
|
1229 |
+
msgid "Close"
|
1230 |
msgstr ""
|
1231 |
|
1232 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:45
|
1233 |
+
msgid "Insert Shortcode"
|
1234 |
msgstr ""
|
1235 |
|
1236 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:50
|
1237 |
+
msgid "Shortcode"
|
1238 |
msgstr ""
|
1239 |
|
1240 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:80
|
1241 |
+
msgid "Category"
|
1242 |
msgstr ""
|
1243 |
|
1244 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:204
|
1245 |
+
msgid "- Select -"
|
1246 |
msgstr ""
|
1247 |
|
1248 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:308
|
1249 |
+
msgid "Some of the shortcode options are required."
|
1250 |
msgstr ""
|
1251 |
|
1252 |
+
#: plugin/Shortcodes/TinymcePopupGenerator.php:314
|
1253 |
+
msgctxt "the option label"
|
1254 |
+
msgid "The \"%s\" option is required."
|
1255 |
msgstr ""
|
1256 |
|
1257 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:31
|
1258 |
+
msgid "Automatically assign a category"
|
1259 |
msgstr ""
|
1260 |
|
1261 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:33
|
1262 |
+
msgid "Do not assign a category"
|
1263 |
msgstr ""
|
1264 |
|
1265 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:38
|
1266 |
+
msgid "You may also enter %s to assign to the current post."
|
1267 |
msgstr ""
|
1268 |
|
1269 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:39
|
1270 |
+
msgid "Assign reviews to a custom page/post ID"
|
1271 |
msgstr ""
|
1272 |
|
1273 |
+
#: plugin/Widgets/SiteReviewsFormWidget.php:44, plugin/Widgets/SiteReviewsSummaryWidget.php:49, plugin/Widgets/SiteReviewsWidget.php:67
|
1274 |
+
msgid "Enter any custom CSS classes here"
|
1275 |
msgstr ""
|
1276 |
|
1277 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:29
|
1278 |
+
msgid "All review types"
|
1279 |
msgstr ""
|
1280 |
|
1281 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:35
|
1282 |
+
msgid "Limit summary to this category"
|
1283 |
msgstr ""
|
1284 |
|
1285 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:37, plugin/Widgets/SiteReviewsWidget.php:55
|
1286 |
+
msgid "All Categories"
|
1287 |
msgstr ""
|
1288 |
|
1289 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:43, plugin/Widgets/SiteReviewsWidget.php:61
|
1290 |
+
msgid "Separate multiple ID's with a comma. You may also enter %s to automatically represent the current page/post ID."
|
1291 |
msgstr ""
|
1292 |
|
1293 |
+
#: plugin/Widgets/SiteReviewsSummaryWidget.php:44
|
1294 |
+
msgid "Limit summary to reviews assigned to a page/post ID"
|
1295 |
msgstr ""
|
1296 |
|
1297 |
+
#: plugin/Widgets/SiteReviewsWidget.php:27
|
1298 |
+
msgid "How many reviews would you like to display?"
|
1299 |
msgstr ""
|
1300 |
|
1301 |
+
#: plugin/Widgets/SiteReviewsWidget.php:32
|
1302 |
+
msgid "What is the minimum rating to display?"
|
1303 |
msgstr ""
|
1304 |
|
1305 |
+
#: plugin/Widgets/SiteReviewsWidget.php:47
|
1306 |
+
msgid "All Reviews"
|
1307 |
msgstr ""
|
1308 |
|
1309 |
+
#: plugin/Widgets/SiteReviewsWidget.php:53
|
1310 |
+
msgid "Limit reviews to this category"
|
1311 |
msgstr ""
|
1312 |
|
1313 |
+
#: plugin/Widgets/SiteReviewsWidget.php:62
|
1314 |
+
msgid "Limit reviews to those assigned to this page/post ID"
|
1315 |
msgstr ""
|
1316 |
|
1317 |
+
#: plugin/Controllers/EditorController/Labels.php:17, plugin/Controllers/EditorController/Labels.php:122
|
1318 |
+
msgid "Save as Unapproved"
|
1319 |
msgstr ""
|
1320 |
|
1321 |
+
#: plugin/Controllers/EditorController/Labels.php:93
|
1322 |
+
msgid "Review has been approved and published."
|
1323 |
msgstr ""
|
1324 |
|
1325 |
+
#: plugin/Controllers/EditorController/Labels.php:94
|
1326 |
+
msgid "Review draft updated."
|
1327 |
msgstr ""
|
1328 |
|
1329 |
+
#: plugin/Controllers/EditorController/Labels.php:95
|
1330 |
+
msgid "Preview review"
|
1331 |
msgstr ""
|
1332 |
|
1333 |
+
#: plugin/Controllers/EditorController/Labels.php:96
|
1334 |
+
msgid "Review approved and published."
|
1335 |
msgstr ""
|
1336 |
|
1337 |
+
#: plugin/Controllers/EditorController/Labels.php:97
|
1338 |
+
msgid "Review restored to revision from %s."
|
1339 |
msgstr ""
|
1340 |
|
1341 |
+
#: plugin/Controllers/EditorController/Labels.php:98
|
1342 |
+
msgid "Review has been reverted to its original submission state."
|
1343 |
msgstr ""
|
1344 |
|
1345 |
+
#: plugin/Controllers/EditorController/Labels.php:99
|
1346 |
+
msgid "Review saved."
|
1347 |
msgstr ""
|
1348 |
|
1349 |
+
#: plugin/Controllers/EditorController/Labels.php:100
|
1350 |
+
msgid "Review scheduled for: %s."
|
1351 |
msgstr ""
|
1352 |
|
1353 |
+
#: plugin/Controllers/EditorController/Labels.php:101
|
1354 |
+
msgid "Review submitted."
|
1355 |
msgstr ""
|
1356 |
|
1357 |
+
#: plugin/Controllers/EditorController/Labels.php:102
|
1358 |
+
msgid "Review has been unapproved and is now pending."
|
1359 |
msgstr ""
|
1360 |
|
1361 |
+
#: plugin/Controllers/EditorController/Labels.php:103
|
1362 |
+
msgid "Review updated."
|
1363 |
msgstr ""
|
1364 |
|
1365 |
+
#: plugin/Controllers/EditorController/Labels.php:104
|
1366 |
+
msgid "View review"
|
1367 |
msgstr ""
|
1368 |
|
1369 |
+
#: plugin/Controllers/EditorController/Labels.php:119
|
1370 |
+
msgid "Privately Approved"
|
1371 |
msgstr ""
|
1372 |
|
1373 |
+
#: plugin/Controllers/ListTableController/Columns.php:72
|
1374 |
+
msgid "Unsupported Type"
|
1375 |
msgstr ""
|
1376 |
|
1377 |
+
#: plugin/Controllers/ListTableController/Columns.php:116
|
1378 |
+
msgid "Filter by rating"
|
1379 |
msgstr ""
|
1380 |
|
1381 |
+
#: plugin/Controllers/ListTableController/Columns.php:122
|
1382 |
+
msgid "All ratings"
|
1383 |
msgstr ""
|
1384 |
|
1385 |
+
#: plugin/Controllers/ListTableController/Columns.php:134
|
1386 |
+
msgid "Filter by type"
|
1387 |
msgstr ""
|
1388 |
|
1389 |
+
#: plugin/Controllers/ListTableController/Columns.php:140
|
1390 |
+
msgid "All types"
|
1391 |
msgstr ""
|
1392 |
|
1393 |
+
#: plugin/Modules/Validator/ValidateReview.php:181
|
1394 |
+
msgid "This review has been flagged as possible spam and cannot be submitted."
|
1395 |
msgstr ""
|
1396 |
|
1397 |
+
#: plugin/Modules/Validator/ValidateReview.php:194
|
1398 |
+
msgid "Your review cannot be submitted at this time."
|
1399 |
msgstr ""
|
1400 |
|
1401 |
+
#: plugin/Modules/Validator/ValidateReview.php:212, plugin/Modules/Validator/ValidateReview.php:223
|
1402 |
+
msgid "The review submission failed. Please notify the site administrator."
|
1403 |
msgstr ""
|
1404 |
|
1405 |
+
#: plugin/Modules/Validator/ValidateReview.php:242
|
1406 |
+
msgid "The reCAPTCHA failed to load, please refresh the page and try again."
|
1407 |
msgstr ""
|
1408 |
|
1409 |
+
#: plugin/Modules/Validator/ValidateReview.php:243
|
1410 |
+
msgid "The reCAPTCHA verification failed, please try again."
|
1411 |
msgstr ""
|
1412 |
|
1413 |
+
#: views/pages/addons/index.php:6
|
1414 |
+
msgid "Now that Site Reviews v3.0 (a major overhaul of the plugin) has been released, the only thing delaying the add-ons is the distribution platform which is currently being built. Expect to see them in the coming months!"
|
1415 |
msgstr ""
|
1416 |
|
1417 |
+
#: views/pages/addons/index.php:7
|
1418 |
+
msgid "Thank you for your patience."
|
|
|
1419 |
msgstr ""
|
1420 |
|
1421 |
+
#: views/pages/addons/index.php:9
|
1422 |
+
msgid "Add-ons extend the functionality of Site Reviews."
|
1423 |
msgstr ""
|
1424 |
|
1425 |
+
#: views/pages/addons/index.php:14
|
1426 |
+
msgid "Allow your visitors to submit multiple images with their reviews."
|
1427 |
msgstr ""
|
1428 |
|
1429 |
+
#: views/pages/addons/index.php:23
|
1430 |
+
msgid "Sync your Tripadvisor reviews to your website and manage them with Site Reviews."
|
1431 |
msgstr ""
|
1432 |
|
1433 |
+
#: views/pages/documentation/addons.php:8, views/pages/documentation/faq.php:7, views/pages/documentation/faq.php:36, views/pages/documentation/faq.php:64, views/pages/documentation/faq.php:90, views/pages/documentation/faq.php:121, views/pages/documentation/faq.php:143, views/pages/documentation/faq.php:156, views/pages/documentation/faq.php:181, views/pages/documentation/faq.php:208, views/pages/documentation/faq.php:246, views/pages/documentation/faq.php:259, views/pages/documentation/functions.php:7, views/pages/documentation/functions.php:41, views/pages/documentation/functions.php:97, views/pages/documentation/functions.php:122, views/pages/documentation/functions.php:151, views/pages/documentation/functions.php:177, views/pages/documentation/functions.php:229, views/pages/documentation/functions.php:303, views/pages/documentation/functions.php:327, views/pages/documentation/functions.php:355, views/pages/documentation/hooks.php:9, views/pages/documentation/hooks.php:32, views/pages/documentation/hooks.php:55, views/pages/documentation/hooks.php:74, views/pages/documentation/hooks.php:93, views/pages/documentation/hooks.php:113, views/pages/documentation/hooks.php:137, views/pages/documentation/hooks.php:163, views/pages/documentation/shortcodes.php:7, views/pages/documentation/shortcodes.php:81, views/pages/documentation/shortcodes.php:129, views/pages/documentation/support.php:7, views/pages/documentation/support.php:35, views/pages/documentation/support.php:63
|
1434 |
+
msgid "Toggle documentation panel"
|
1435 |
msgstr ""
|
1436 |
|
1437 |
+
#: views/pages/documentation/index.php:5
|
1438 |
+
msgid "Click an active tab to expand/collapse all sections."
|
1439 |
msgstr ""
|
1440 |
|
1441 |
+
#: views/pages/settings/schema.php:3
|
1442 |
+
msgid "The JSON-LD schema appears in Google's search results and shows the star rating and other information about your reviews. If the schema has been enabled in your shortcodes, you can use Google's <a href=\"https://search.google.com/structured-data/testing-tool\">Structured Data Testing Tool</a> to test your pages for valid schema data."
|
1443 |
msgstr ""
|
1444 |
|
1445 |
+
#: views/pages/settings/schema.php:4
|
1446 |
+
msgid "You may override any of these options on a per-post/page basis by using its Custom Field name and adding a custom value using the <a href=\"https://codex.wordpress.org/Using_Custom_Fields#Usage\">Custom Fields</a> metabox."
|
1447 |
msgstr ""
|
1448 |
|
1449 |
+
#: views/pages/settings/translations.php:5
|
1450 |
+
msgid "Search for translatable text"
|
1451 |
msgstr ""
|
1452 |
|
1453 |
+
#: views/pages/settings/translations.php:9
|
1454 |
+
msgid "Search here for text to translate..."
|
1455 |
msgstr ""
|
1456 |
|
1457 |
+
#: views/pages/settings/translations.php:16
|
1458 |
+
msgid "Original Text"
|
1459 |
msgstr ""
|
1460 |
|
1461 |
+
#: views/pages/settings/translations.php:17
|
1462 |
+
msgid "Custom Translation"
|
1463 |
msgstr ""
|
1464 |
|
1465 |
+
#: views/pages/tools/console.php:7
|
1466 |
+
msgid "Download Console"
|
1467 |
msgstr ""
|
1468 |
|
1469 |
+
#: views/pages/tools/console.php:13
|
1470 |
+
msgid "Reloading..."
|
1471 |
msgstr ""
|
1472 |
|
1473 |
+
#: views/pages/tools/console.php:13
|
1474 |
+
msgid "Reload"
|
1475 |
msgstr ""
|
1476 |
|
1477 |
+
#: views/pages/tools/console.php:20
|
1478 |
+
msgid "Clearing..."
|
1479 |
msgstr ""
|
1480 |
|
1481 |
+
#: views/pages/tools/console.php:20
|
1482 |
+
msgid "Clear"
|
1483 |
msgstr ""
|
1484 |
|
1485 |
+
#: views/pages/tools/general.php:10
|
1486 |
+
msgid "Export Settings"
|
1487 |
msgstr ""
|
1488 |
|
1489 |
+
#: views/pages/tools/general.php:22
|
1490 |
+
msgid "Import Settings"
|
1491 |
msgstr ""
|
1492 |
|
1493 |
+
#: views/pages/tools/general.php:35
|
1494 |
+
msgid "Recalculating Counts..."
|
1495 |
msgstr ""
|
1496 |
|
1497 |
+
#: views/pages/tools/general.php:35
|
1498 |
+
msgid "Recalculate Counts"
|
1499 |
msgstr ""
|
1500 |
|
1501 |
+
#: views/pages/tools/sync.php:9
|
1502 |
+
msgid "Service"
|
1503 |
msgstr ""
|
1504 |
|
1505 |
+
#: views/pages/tools/sync.php:11, views/pages/tools/sync.php:34
|
1506 |
+
msgid "Last Sync"
|
1507 |
msgstr ""
|
1508 |
|
1509 |
+
#: views/pages/tools/sync.php:24
|
1510 |
+
msgid "License"
|
1511 |
msgstr ""
|
1512 |
|
1513 |
+
#: views/pages/tools/sync.php:28
|
1514 |
+
msgid "Show more details"
|
1515 |
msgstr ""
|
1516 |
|
1517 |
+
#: views/pages/tools/sync.php:43
|
1518 |
+
msgid "Please wait..."
|
1519 |
msgstr ""
|
1520 |
|
1521 |
+
#: views/pages/tools/sync.php:45, views/pages/tools/sync.php:48
|
1522 |
+
msgid "Inactive"
|
1523 |
msgstr ""
|
1524 |
|
1525 |
+
#: views/pages/tools/sync.php:57
|
1526 |
+
msgid "Syncing..."
|
1527 |
msgstr ""
|
1528 |
|
1529 |
+
#: views/pages/tools/system-info.php:7
|
1530 |
+
msgid "Download System Info"
|
1531 |
msgstr ""
|
1532 |
|
1533 |
+
#: views/partials/addons/addon.php:16
|
1534 |
+
msgid "Installed"
|
1535 |
msgstr ""
|
1536 |
|
1537 |
+
#: views/partials/addons/addon.php:20
|
1538 |
+
msgid "Activate"
|
1539 |
msgstr ""
|
1540 |
|
1541 |
+
#: views/partials/addons/addon.php:25
|
1542 |
+
msgid "More Info"
|
1543 |
msgstr ""
|
1544 |
|
1545 |
+
#: views/partials/editor/assigned-post.php:6
|
1546 |
+
msgid "Remove assignment"
|
1547 |
msgstr ""
|
1548 |
|
1549 |
+
#: views/partials/editor/metabox-assigned-to.php:6
|
1550 |
+
msgid "Type to search..."
|
1551 |
msgstr ""
|
1552 |
|
1553 |
+
#: views/partials/editor/metabox-assigned-to.php:9
|
1554 |
+
msgid "Search here for a page or post that you would like to assign this review to. You may search by title or ID."
|
1555 |
msgstr ""
|
1556 |
|
1557 |
+
#: views/partials/editor/metabox-categories.php:7
|
1558 |
+
msgid "Most Used"
|
1559 |
msgstr ""
|
1560 |
|
1561 |
+
#: views/partials/editor/metabox-response.php:5
|
1562 |
+
msgid "If you need to publicly respond to this review, enter your response here."
|
1563 |
msgstr ""
|
1564 |
|
1565 |
+
#: views/partials/editor/pinned.php:8
|
1566 |
+
msgid "Edit pinned status"
|
1567 |
msgstr ""
|
1568 |
|
1569 |
+
#: views/partials/editor/pinned.php:13
|
1570 |
+
msgid "Pin"
|
1571 |
msgstr ""
|
1572 |
|
1573 |
+
#: views/partials/editor/pinned.php:14
|
1574 |
+
msgid "Unpin"
|
1575 |
msgstr ""
|
1576 |
|
1577 |
+
#: views/partials/editor/pinned.php:16
|
1578 |
+
msgid "OK"
|
1579 |
msgstr ""
|
1580 |
|
1581 |
+
#: views/partials/editor/pinned.php:17
|
1582 |
+
msgid "Cancel"
|
1583 |
msgstr ""
|
1584 |
|
1585 |
+
#: views/partials/editor/review.php:4
|
1586 |
+
msgid "no title"
|
1587 |
msgstr ""
|
1588 |
|
1589 |
+
#: views/partials/editor/review.php:15
|
1590 |
+
msgid "Toggle panel: Public Response"
|
1591 |
msgstr ""
|
1592 |
|
1593 |
+
#: views/partials/editor/review.php:19
|
1594 |
+
msgid "Public Response"
|
1595 |
msgstr ""
|
1596 |
|
1597 |
+
#: views/partials/translations/plural.php:4, views/partials/translations/single.php:4
|
1598 |
+
msgid "Show custom translation"
|
1599 |
msgstr ""
|
1600 |
|
1601 |
+
#: views/partials/translations/plural.php:11, views/partials/translations/single.php:10
|
1602 |
+
msgid "Delete translation string"
|
1603 |
msgstr ""
|
1604 |
|
1605 |
+
#: views/partials/translations/plural.php:11, views/partials/translations/single.php:10
|
1606 |
+
msgid "Delete"
|
1607 |
msgstr ""
|
1608 |
|
1609 |
+
#: views/partials/translations/plural.php:19
|
1610 |
+
msgid "singular"
|
1611 |
msgstr ""
|
1612 |
|
1613 |
+
#: views/partials/translations/plural.php:20
|
1614 |
+
msgid "plural"
|
1615 |
msgstr ""
|
1616 |
|
1617 |
+
#: plugin/Modules/Html/Fields/Rating.php:25
|
1618 |
+
msgid "Select a Rating"
|
1619 |
msgstr ""
|
1620 |
|
1621 |
+
#: plugin/Modules/Html/Fields/Rating.php:27
|
1622 |
+
msgid "%s Star"
|
1623 |
+
msgid_plural "%s Stars"
|
1624 |
+
msgstr[0] ""
|
1625 |
+
msgstr[1] ""
|
1626 |
|
1627 |
+
#: plugin/Modules/Html/Partials/Pagination.php:28
|
1628 |
+
msgid "Site Reviews navigation"
|
1629 |
msgstr ""
|
1630 |
|
1631 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:130
|
1632 |
+
msgid "Review of %s"
|
1633 |
msgstr ""
|
1634 |
|
1635 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:214
|
1636 |
+
msgid "Response from %s"
|
1637 |
msgstr ""
|
1638 |
|
1639 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:231
|
1640 |
+
msgid "No Title"
|
1641 |
msgstr ""
|
1642 |
|
1643 |
+
#: plugin/Modules/Html/Partials/SiteReviews.php:269
|
1644 |
+
msgid "Show less"
|
1645 |
msgstr ""
|
1646 |
|
1647 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:122
|
1648 |
+
msgid "Submit your review"
|
1649 |
msgstr ""
|
1650 |
|
1651 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:161
|
1652 |
+
msgid "logged in"
|
1653 |
msgstr ""
|
1654 |
|
1655 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:163
|
1656 |
+
msgid "You must be %s to submit a review."
|
1657 |
msgstr ""
|
1658 |
|
1659 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:174
|
1660 |
+
msgid "register"
|
1661 |
msgstr ""
|
1662 |
|
1663 |
+
#: plugin/Modules/Html/Partials/SiteReviewsForm.php:176
|
1664 |
+
msgid "You may also %s for an account."
|
1665 |
msgstr ""
|
1666 |
+
|
1667 |
+
#: plugin/Modules/Html/Partials/SiteReviewsSummary.php:142
|
1668 |
+
msgctxt "Do not translate {rating}, {max}, and {num}, they are template tags."
|
1669 |
+
msgid "{rating} out of {max} stars (based on {num} review)"
|
1670 |
+
msgid_plural "{rating} out of {max} stars (based on {num} reviews)"
|
1671 |
+
msgstr[0] ""
|
1672 |
+
msgstr[1] ""
|
loco.xml
DELETED
@@ -1,22 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="utf-8"?>
|
2 |
-
<bundle name="Site Reviews">
|
3 |
-
<domain name="site-reviews">
|
4 |
-
<project name="Site Reviews" slug="site-reviews">
|
5 |
-
<source>
|
6 |
-
<directory>.</directory>
|
7 |
-
</source>
|
8 |
-
<target>
|
9 |
-
<directory>languages</directory>
|
10 |
-
</target>
|
11 |
-
<template>
|
12 |
-
<file>languages/site-reviews.pot</file>
|
13 |
-
</template>
|
14 |
-
</project>
|
15 |
-
</domain>
|
16 |
-
<exclude>
|
17 |
-
<directory>.git</directory>
|
18 |
-
<directory>.svn</directory>
|
19 |
-
<directory>node_modules</directory>
|
20 |
-
<directory>vendor</directory>
|
21 |
-
</exclude>
|
22 |
-
</bundle>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Actions.php
ADDED
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Contracts\HooksContract;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\AdminController;
|
8 |
+
use GeminiLabs\SiteReviews\Controllers\BlocksController;
|
9 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController;
|
10 |
+
use GeminiLabs\SiteReviews\Controllers\ListTableController;
|
11 |
+
use GeminiLabs\SiteReviews\Controllers\MainController;
|
12 |
+
use GeminiLabs\SiteReviews\Controllers\MenuController;
|
13 |
+
use GeminiLabs\SiteReviews\Controllers\PublicController;
|
14 |
+
use GeminiLabs\SiteReviews\Controllers\ReviewController;
|
15 |
+
use GeminiLabs\SiteReviews\Controllers\SettingsController;
|
16 |
+
use GeminiLabs\SiteReviews\Controllers\TaxonomyController;
|
17 |
+
use GeminiLabs\SiteReviews\Modules\Console;
|
18 |
+
use GeminiLabs\SiteReviews\Modules\Session;
|
19 |
+
use GeminiLabs\SiteReviews\Router;
|
20 |
+
|
21 |
+
class Actions implements HooksContract
|
22 |
+
{
|
23 |
+
protected $admin;
|
24 |
+
protected $app;
|
25 |
+
protected $blocks;
|
26 |
+
protected $console;
|
27 |
+
protected $editor;
|
28 |
+
protected $listtable;
|
29 |
+
protected $menu;
|
30 |
+
protected $main;
|
31 |
+
protected $public;
|
32 |
+
protected $review;
|
33 |
+
protected $router;
|
34 |
+
protected $session;
|
35 |
+
protected $settings;
|
36 |
+
protected $taxonomy;
|
37 |
+
|
38 |
+
public function __construct( Application $app ) {
|
39 |
+
$this->app = $app;
|
40 |
+
$this->admin = $app->make( AdminController::class );
|
41 |
+
$this->blocks = $app->make( BlocksController::class );
|
42 |
+
$this->console = $app->make( Console::class );
|
43 |
+
$this->editor = $app->make( EditorController::class );
|
44 |
+
$this->listtable = $app->make( ListTableController::class );
|
45 |
+
$this->main = $app->make( MainController::class );
|
46 |
+
$this->menu = $app->make( MenuController::class );
|
47 |
+
$this->public = $app->make( PublicController::class );
|
48 |
+
$this->review = $app->make( ReviewController::class );
|
49 |
+
$this->router = $app->make( Router::class );
|
50 |
+
$this->session = $app->make( Session::class );
|
51 |
+
$this->settings = $app->make( SettingsController::class );
|
52 |
+
$this->taxonomy = $app->make( TaxonomyController::class );
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @return void
|
57 |
+
*/
|
58 |
+
public function run()
|
59 |
+
{
|
60 |
+
add_action( 'admin_enqueue_scripts', [$this->admin, 'enqueueAssets'] );
|
61 |
+
add_action( 'admin_init', [$this->admin, 'registerTinymcePopups'] );
|
62 |
+
add_action( 'media_buttons', [$this->admin, 'renderTinymceButton'], 11 );
|
63 |
+
add_action( 'plugins_loaded', [$this->app, 'getDefaults'], 11 );
|
64 |
+
add_action( 'plugins_loaded', [$this->app, 'registerAddons'] );
|
65 |
+
add_action( 'plugins_loaded', [$this->app, 'registerLanguages'] );
|
66 |
+
add_action( 'plugins_loaded', [$this->app, 'registerReviewTypes'] );
|
67 |
+
add_action( 'upgrader_process_complete', [$this->app, 'upgraded'], 10, 2 );
|
68 |
+
add_action( 'init', [$this->blocks, 'registerAssets'], 9 );
|
69 |
+
add_action( 'init', [$this->blocks, 'registerBlocks'] );
|
70 |
+
add_action( 'admin_footer', [$this->console, 'logOnce'] );
|
71 |
+
add_action( 'wp_footer', [$this->console, 'logOnce'] );
|
72 |
+
add_action( 'admin_enqueue_scripts', [$this->editor, 'customizePostStatusLabels'] );
|
73 |
+
add_action( 'add_meta_boxes_'.Application::POST_TYPE, [$this->editor, 'registerMetaBoxes'] );
|
74 |
+
add_action( 'admin_print_scripts', [$this->editor, 'removeAutosave'], 999 );
|
75 |
+
add_action( 'admin_menu', [$this->editor, 'removeMetaBoxes'] );
|
76 |
+
add_action( 'current_screen', [$this->editor, 'removePostTypeSupport'] );
|
77 |
+
add_action( 'post_submitbox_misc_actions', [$this->editor, 'renderPinnedInPublishMetaBox'] );
|
78 |
+
add_action( 'admin_head', [$this->editor, 'renderReviewFields'] );
|
79 |
+
add_action( 'admin_action_revert', [$this->editor, 'revertReview'] );
|
80 |
+
add_action( 'save_post_'.Application::POST_TYPE, [$this->editor, 'saveMetaboxes'] );
|
81 |
+
add_action( 'admin_action_approve', [$this->listtable, 'approve'] );
|
82 |
+
add_action( 'bulk_edit_custom_box', [$this->listtable, 'renderBulkEditFields'], 10, 2 );
|
83 |
+
add_action( 'restrict_manage_posts', [$this->listtable, 'renderColumnFilters'] );
|
84 |
+
add_action( 'manage_'.Application::POST_TYPE.'_posts_custom_column', [$this->listtable, 'renderColumnValues'], 10, 2 );
|
85 |
+
add_action( 'save_post_'.Application::POST_TYPE, [$this->listtable, 'saveBulkEditFields'] );
|
86 |
+
add_action( 'pre_get_posts', [$this->listtable, 'setQueryForColumn'] );
|
87 |
+
add_action( 'admin_action_unapprove', [$this->listtable, 'unapprove'] );
|
88 |
+
add_action( 'init', [$this->main, 'registerPostType'], 8 );
|
89 |
+
add_action( 'init', [$this->main, 'registerShortcodes'] );
|
90 |
+
add_action( 'init', [$this->main, 'registerTaxonomy'] );
|
91 |
+
add_action( 'widgets_init', [$this->main, 'registerWidgets'] );
|
92 |
+
add_action( 'admin_menu', [$this->menu, 'registerMenuCount'] );
|
93 |
+
add_action( 'admin_menu', [$this->menu, 'registerSubMenus'] );
|
94 |
+
add_action( 'admin_init', [$this->menu, 'setCustomPermissions'], 999 );
|
95 |
+
add_action( 'wp_enqueue_scripts', [$this->public, 'enqueueAssets'], 999 );
|
96 |
+
add_filter( 'site-reviews/builder', [$this->public, 'modifyBuilder'] );
|
97 |
+
add_action( 'wp_footer', [$this->public, 'renderSchema'] );
|
98 |
+
add_action( 'set_object_terms', [$this->review, 'onAfterChangeCategory'], 10, 6 );
|
99 |
+
add_action( 'transition_post_status', [$this->review, 'onAfterChangeStatus'], 10, 3 );
|
100 |
+
add_action( 'site-reviews/review/created', [$this->review, 'onAfterCreate'] );
|
101 |
+
add_action( 'before_delete_post', [$this->review, 'onBeforeDelete'] );
|
102 |
+
add_action( 'update_postmeta', [$this->review, 'onBeforeUpdate'], 10, 4 );
|
103 |
+
add_action( 'admin_init', [$this->router, 'routeAdminPostRequest'] );
|
104 |
+
add_action( 'wp_ajax_'.Application::PREFIX.'action', [$this->router, 'routeAjaxRequest'] );
|
105 |
+
add_action( 'wp_ajax_nopriv_'.Application::PREFIX.'action', [$this->router, 'routeAjaxRequest'] );
|
106 |
+
add_action( 'init', [$this->router, 'routePublicPostRequest'] );
|
107 |
+
add_action( 'site-reviews/schedule/session/purge', [$this->session, 'deleteExpiredSessions'] );
|
108 |
+
add_action( 'admin_init', [$this->settings, 'registerSettings'] );
|
109 |
+
add_action( Application::TAXONOMY.'_term_edit_form_top', [$this->taxonomy, 'disableParents'] );
|
110 |
+
add_action( Application::TAXONOMY.'_term_new_form_tag', [$this->taxonomy, 'disableParents'] );
|
111 |
+
add_action( Application::TAXONOMY.'_add_form_fields', [$this->taxonomy, 'enableParents'] );
|
112 |
+
add_action( Application::TAXONOMY.'_edit_form', [$this->taxonomy, 'enableParents'] );
|
113 |
+
add_action( 'restrict_manage_posts', [$this->taxonomy, 'renderTaxonomyFilter'], 9 );
|
114 |
+
}
|
115 |
+
}
|
plugin/App.php
DELETED
@@ -1,315 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews;
|
12 |
-
|
13 |
-
use GeminiLabs\SiteReviews\Container;
|
14 |
-
|
15 |
-
/**
|
16 |
-
* @property string $file
|
17 |
-
* @property string $id
|
18 |
-
* @property string $name
|
19 |
-
* @property string $path
|
20 |
-
* @property string $prefix
|
21 |
-
* @property array $schemas
|
22 |
-
* @property string $url
|
23 |
-
* @property string $version
|
24 |
-
* @property array $defaults
|
25 |
-
* @property array $mceShortcodes
|
26 |
-
*/
|
27 |
-
final class App extends Container
|
28 |
-
{
|
29 |
-
const CAPABILITY = 'edit_others_pages';
|
30 |
-
const POST_TYPE = 'site-review';
|
31 |
-
const TAXONOMY = 'site-review-category';
|
32 |
-
const PAGED_QUERY_VAR = 'reviews-page';
|
33 |
-
|
34 |
-
public $schemas = [];
|
35 |
-
|
36 |
-
protected $defaults;
|
37 |
-
protected $file;
|
38 |
-
protected $id;
|
39 |
-
protected $name;
|
40 |
-
protected $path;
|
41 |
-
protected $prefix;
|
42 |
-
protected $url;
|
43 |
-
protected $version;
|
44 |
-
|
45 |
-
public function __construct()
|
46 |
-
{
|
47 |
-
// hardcoded path to the plugin file
|
48 |
-
$file = realpath( dirname( __DIR__ ) . '/site-reviews.php' );
|
49 |
-
|
50 |
-
$data = [
|
51 |
-
'id' => 'Text Domain',
|
52 |
-
'name' => 'Plugin Name',
|
53 |
-
'version' => 'Version',
|
54 |
-
];
|
55 |
-
|
56 |
-
$plugin = get_file_data( $file, $data, 'plugin' );
|
57 |
-
|
58 |
-
$this->file = $file;
|
59 |
-
$this->id = 'geminilabs-' . $plugin['id'];
|
60 |
-
$this->name = $plugin['name'];
|
61 |
-
$this->path = plugin_dir_path( $file );
|
62 |
-
$this->prefix = str_replace( '-', '_', $this->id );
|
63 |
-
$this->url = plugin_dir_url( $file );
|
64 |
-
$this->version = $plugin['version'];
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* This is the Application entry point
|
69 |
-
*
|
70 |
-
* @return void
|
71 |
-
*/
|
72 |
-
public function init()
|
73 |
-
{
|
74 |
-
$basename = plugin_basename( $this->file );
|
75 |
-
|
76 |
-
$main = $this->make( 'Controllers\MainController' );
|
77 |
-
$review = $this->make( 'Controllers\ReviewController' );
|
78 |
-
$router = $this->make( 'Router' );
|
79 |
-
$translator = $this->make( 'Translator' );
|
80 |
-
|
81 |
-
// Action Hooks
|
82 |
-
add_action( 'plugins_loaded', [ $this, 'getDefaultSettings'], 11 );
|
83 |
-
add_action( 'plugins_loaded', [ $this, 'registerAddons'] );
|
84 |
-
add_action( 'plugins_loaded', [ $this, 'registerLanguages'] );
|
85 |
-
add_action( 'upgrader_process_complete', [ $this, 'upgrader'], 10, 2 );
|
86 |
-
add_action( 'admin_enqueue_scripts', [ $main, 'enqueueAssets'] );
|
87 |
-
add_action( 'wp_enqueue_scripts', [ $main, 'enqueueAssets'], 999 );
|
88 |
-
add_action( 'admin_menu', [ $main, 'registerMenuCount'] );
|
89 |
-
add_action( 'add_meta_boxes', [ $main, 'registerMetaBox'] );
|
90 |
-
add_action( 'admin_enqueue_scripts', [ $main, 'registerPointers'], 13 );
|
91 |
-
add_action( 'init', [ $main, 'registerPostType'], 8 );
|
92 |
-
add_action( 'admin_init', [ $main, 'registerSettings'] );
|
93 |
-
add_action( 'admin_init', [ $main, 'registerShortcodeButtons'] );
|
94 |
-
add_action( 'init', [ $main, 'registerShortcodes'] );
|
95 |
-
add_action( 'admin_menu', [ $main, 'registerSubMenus'] );
|
96 |
-
add_action( 'init', [ $main, 'registerTaxonomy'] );
|
97 |
-
add_action( 'widgets_init', [ $main, 'registerWidgets'] );
|
98 |
-
add_action( 'post_submitbox_misc_actions', [ $main, 'renderMetaBoxPinned'] );
|
99 |
-
add_action( 'admin_head', [ $main, 'renderReviewFields'] );
|
100 |
-
add_action( 'media_buttons', [ $main, 'renderTinymceButton'], 11 );
|
101 |
-
add_action( 'wp_footer', [ $main, 'renderSchema'] );
|
102 |
-
add_action( 'admin_action_approve', [ $review, 'approve'] );
|
103 |
-
add_action( 'admin_print_scripts', [ $review, 'modifyAutosave'], 999 );
|
104 |
-
add_action( 'current_screen', [ $review, 'modifyFeatures'] );
|
105 |
-
add_action( 'admin_enqueue_scripts', [ $review, 'modifyLocalizedStatusText'] );
|
106 |
-
add_action( 'site-reviews/local/review/create', [ $review, 'onCreateReview'], 10, 3 );
|
107 |
-
add_action( 'save_post_' . static::POST_TYPE, [ $review, 'onSaveReview'], 20, 2 );
|
108 |
-
add_action( 'before_delete_post', [ $review, 'onDeleteReview'] );
|
109 |
-
add_action( 'admin_menu', [ $review, 'removeMetaBoxes'] );
|
110 |
-
add_action( 'bulk_edit_custom_box', [ $review, 'renderBulkEditFields'], 10, 2 );
|
111 |
-
add_action( 'admin_action_revert', [ $review, 'revert'] );
|
112 |
-
add_action( 'save_post_' . static::POST_TYPE, [ $review, 'saveBulkEditFields'] );
|
113 |
-
add_action( 'save_post_' . static::POST_TYPE, [ $review, 'saveEditedReview'] );
|
114 |
-
add_action( 'admin_init', [ $review, 'setPermissions'], 999 );
|
115 |
-
add_action( 'admin_action_unapprove', [ $review, 'unapprove'] );
|
116 |
-
add_action( "wp_ajax_{$this->prefix}_action", [ $router, 'routeAjaxRequests'] );
|
117 |
-
add_action( "wp_ajax_nopriv_{$this->prefix}_action", [ $router, 'routeAjaxRequests'] );
|
118 |
-
add_action( 'admin_init', [ $router, 'routePostRequests'] );
|
119 |
-
add_action( 'init', [ $router, 'routePublicPostRequests'] );
|
120 |
-
add_action( 'admin_init', [ $router, 'routeWebhookRequests'] );
|
121 |
-
|
122 |
-
// Filter Hooks
|
123 |
-
add_filter( 'classic_editor_enabled_editors_for_post_type', [ $main, 'filterEnabledEditors'], 10, 2 );
|
124 |
-
add_filter( 'script_loader_tag', [ $main, 'filterEnqueuedScripts'], 10, 2 );
|
125 |
-
add_filter( 'use_block_editor_for_post_type', [ $main, 'filterUseBlockEditor'], 10, 2 );
|
126 |
-
add_filter( 'plugin_action_links_'.$basename, [ $main, 'registerActionLinks'] );
|
127 |
-
add_filter( 'dashboard_glance_items', [ $main, 'registerDashboardGlanceItems'] );
|
128 |
-
add_filter( 'post_row_actions', [ $main, 'registerRowActions'], 10, 2 );
|
129 |
-
add_filter( 'wp_editor_settings', [ $review, 'modifyEditor'] );
|
130 |
-
add_filter( 'the_editor', [ $review, 'modifyEditorTextarea'] );
|
131 |
-
add_filter( 'gettext', [ $review, 'modifyStatusText'], 10, 3 );
|
132 |
-
add_filter( 'gettext_with_context', [ $review, 'modifyStatusTextWithContext'], 10, 4 );
|
133 |
-
add_filter( 'query_vars', [ $review, 'modifyQueryVars'] );
|
134 |
-
add_filter( 'post_updated_messages', [ $review, 'modifyUpdateMessages'] );
|
135 |
-
add_filter( 'bulk_post_updated_messages', [ $review, 'modifyUpdateMessagesBulk'], 10, 2 );
|
136 |
-
add_filter( 'gettext', [ $translator, 'translateGettext'], 10, 3 );
|
137 |
-
add_filter( 'gettext_with_context', [ $translator, 'translateGettextWithContext'], 10, 4 );
|
138 |
-
add_filter( 'ngettext', [ $translator, 'translateNgettext'], 10, 5 );
|
139 |
-
add_filter( 'ngettext_with_context', [ $translator, 'translateNgettextWithContext'], 10, 6 );
|
140 |
-
|
141 |
-
// Update notification for v3.0
|
142 |
-
add_action( 'admin_notices', [ $main, 'upgradeNotice'] );
|
143 |
-
|
144 |
-
// Disable automatic-updates in preparation for v3.0
|
145 |
-
add_filter( 'auto_update_plugin', function( $update, $item ) {
|
146 |
-
return $item->plugin == plugin_basename( $this->path )
|
147 |
-
? false
|
148 |
-
: $update;
|
149 |
-
}, 999, 2 );
|
150 |
-
}
|
151 |
-
|
152 |
-
/**
|
153 |
-
* Runs on plugin activation
|
154 |
-
*
|
155 |
-
* @return void
|
156 |
-
*/
|
157 |
-
public function activate()
|
158 |
-
{
|
159 |
-
$this->upgrade();
|
160 |
-
|
161 |
-
$this->make( 'Database' )->setDefaults();
|
162 |
-
$this->make( 'Database' )->setOption( 'logging', 0 );
|
163 |
-
|
164 |
-
// Schedule session purge
|
165 |
-
if( !wp_next_scheduled( 'site-reviews/schedule/session/purge' )) {
|
166 |
-
wp_schedule_event( time(), 'twicedaily', 'site-reviews/schedule/session/purge' );
|
167 |
-
}
|
168 |
-
}
|
169 |
-
|
170 |
-
/**
|
171 |
-
* Runs on plugin deactivation
|
172 |
-
*
|
173 |
-
* @return void
|
174 |
-
*/
|
175 |
-
public function deactivate()
|
176 |
-
{
|
177 |
-
$events = ['site-reviews/schedule/session/purge'];
|
178 |
-
|
179 |
-
foreach( $events as $event ) {
|
180 |
-
wp_unschedule_event( (int) wp_next_scheduled( $event ), $event );
|
181 |
-
}
|
182 |
-
}
|
183 |
-
|
184 |
-
/**
|
185 |
-
* Get the default settings
|
186 |
-
*
|
187 |
-
* @return array
|
188 |
-
*/
|
189 |
-
public function getDefaultSettings()
|
190 |
-
{
|
191 |
-
if( empty( $this->defaults )) {
|
192 |
-
$this->defaults = apply_filters( 'site-reviews/addon/defaults',
|
193 |
-
$this->make( 'Settings' )->getSettings()
|
194 |
-
);
|
195 |
-
$this->upgrade();
|
196 |
-
}
|
197 |
-
|
198 |
-
return $this->defaults;
|
199 |
-
}
|
200 |
-
|
201 |
-
/**
|
202 |
-
* Verify permissions
|
203 |
-
*
|
204 |
-
* @return bool
|
205 |
-
*/
|
206 |
-
public function hasPermission()
|
207 |
-
{
|
208 |
-
return !is_admin() || ( is_admin() && current_user_can( static::CAPABILITY ));
|
209 |
-
}
|
210 |
-
|
211 |
-
/**
|
212 |
-
* Register available add-ons
|
213 |
-
*
|
214 |
-
* @return void
|
215 |
-
*/
|
216 |
-
public function registerAddons()
|
217 |
-
{
|
218 |
-
do_action( 'site-reviews/addon/register', $this );
|
219 |
-
}
|
220 |
-
|
221 |
-
/**
|
222 |
-
* Register available languages
|
223 |
-
*
|
224 |
-
* @return void
|
225 |
-
*/
|
226 |
-
public function registerLanguages()
|
227 |
-
{
|
228 |
-
load_plugin_textdomain( 'site-reviews', false, plugin_basename( $this->path ).'/languages/' );
|
229 |
-
}
|
230 |
-
|
231 |
-
/**
|
232 |
-
* Update the plugin versions in the database
|
233 |
-
*
|
234 |
-
* @param string $current
|
235 |
-
* @return void
|
236 |
-
*/
|
237 |
-
public function updateVersion( $current = '' )
|
238 |
-
{
|
239 |
-
$db = $this->make( 'Database' );
|
240 |
-
|
241 |
-
if( empty( $current )) {
|
242 |
-
$current = $db->getOption( 'version' );
|
243 |
-
}
|
244 |
-
|
245 |
-
if( version_compare( $current, $this->version, '<' )) {
|
246 |
-
$db->setOption( 'version', $this->version );
|
247 |
-
}
|
248 |
-
|
249 |
-
if( $current != $this->version ) {
|
250 |
-
$db->setOption( 'version_upgraded_from', $current );
|
251 |
-
}
|
252 |
-
}
|
253 |
-
|
254 |
-
/**
|
255 |
-
* Upgrade routine
|
256 |
-
*
|
257 |
-
* @return void
|
258 |
-
*/
|
259 |
-
public function upgrade()
|
260 |
-
{
|
261 |
-
$version = $this->make( 'Database' )->getOption( 'version' );
|
262 |
-
$upgrade = $this->make( 'Upgrade' );
|
263 |
-
if( version_compare( $version, '2.0.0', '<' )) {
|
264 |
-
$upgrade->options_200();
|
265 |
-
$upgrade->reviewSlug_200();
|
266 |
-
$upgrade->reviewType_200();
|
267 |
-
$upgrade->sidebarWidgets_200();
|
268 |
-
$upgrade->themeMods_200();
|
269 |
-
$upgrade->widgetSiteReviews_200();
|
270 |
-
$upgrade->widgetSiteReviewsForm_200();
|
271 |
-
}
|
272 |
-
if( version_compare( $version, '2.1.0', '<' )) {
|
273 |
-
$upgrade->reviewAssignedTo_210();
|
274 |
-
}
|
275 |
-
if( version_compare( $version, '2.3.0', '<' )) {
|
276 |
-
$upgrade->options_230();
|
277 |
-
$upgrade->translations_230();
|
278 |
-
}
|
279 |
-
if( version_compare( $version, '2.6.0', '<' )) {
|
280 |
-
$upgrade->options_260();
|
281 |
-
}
|
282 |
-
if( version_compare( $version, '2.9.0', '<' )) {
|
283 |
-
$upgrade->reviewAssignedTo_290();
|
284 |
-
}
|
285 |
-
if( version_compare( $version, '2.11.3', '<' )) {
|
286 |
-
$upgrade->sessions_2113();
|
287 |
-
}
|
288 |
-
if( version_compare( $version, '2.12.0', '<' )) {
|
289 |
-
$upgrade->blacklist_2120();
|
290 |
-
$upgrade->reviewAssignedTo_2120();
|
291 |
-
}
|
292 |
-
if( version_compare( $version, '2.13.2', '<' )) {
|
293 |
-
$upgrade->reviewAssignedTo_2132();
|
294 |
-
}
|
295 |
-
$this->updateVersion( $version );
|
296 |
-
}
|
297 |
-
|
298 |
-
/**
|
299 |
-
* Runs on plugin upgrade
|
300 |
-
*
|
301 |
-
* @param mixed $upgrader
|
302 |
-
*
|
303 |
-
* @return null|void
|
304 |
-
*/
|
305 |
-
public function upgrader( $upgrader, array $data )
|
306 |
-
{
|
307 |
-
if( !array_key_exists( 'plugins', $data )
|
308 |
-
|| !in_array( plugin_basename( $this->file ), $data['plugins'] )
|
309 |
-
|| $data['action'] != 'update'
|
310 |
-
|| $data['type'] != 'plugin'
|
311 |
-
)return;
|
312 |
-
|
313 |
-
$this->upgrade();
|
314 |
-
}
|
315 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Application.php
ADDED
@@ -0,0 +1,271 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Actions;
|
6 |
+
use GeminiLabs\SiteReviews\Container;
|
7 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
8 |
+
use GeminiLabs\SiteReviews\Database\DefaultsManager;
|
9 |
+
use GeminiLabs\SiteReviews\Filters;
|
10 |
+
use GeminiLabs\SiteReviews\Modules\Html;
|
11 |
+
use GeminiLabs\SiteReviews\Modules\Upgrader;
|
12 |
+
|
13 |
+
final class Application extends Container
|
14 |
+
{
|
15 |
+
const CAPABILITY = 'edit_others_pages';
|
16 |
+
const CRON_EVENT = 'site-reviews/schedule/session/purge';
|
17 |
+
const ID = 'site-reviews';
|
18 |
+
const PAGED_QUERY_VAR = 'reviews-page';
|
19 |
+
const POST_TYPE = 'site-review';
|
20 |
+
const PREFIX = 'glsr_';
|
21 |
+
const TAXONOMY = 'site-review-category';
|
22 |
+
|
23 |
+
public $defaults;
|
24 |
+
public $deprecated = [];
|
25 |
+
public $file;
|
26 |
+
public $languages;
|
27 |
+
public $mceShortcodes = []; //defined elsewhere
|
28 |
+
public $name;
|
29 |
+
public $reviewTypes;
|
30 |
+
public $schemas = []; //defined elsewhere
|
31 |
+
public $version;
|
32 |
+
|
33 |
+
public function __construct()
|
34 |
+
{
|
35 |
+
static::$instance = $this;
|
36 |
+
$this->file = realpath( trailingslashit( dirname( __DIR__ )).static::ID.'.php' );
|
37 |
+
$plugin = get_file_data( $this->file, [
|
38 |
+
'languages' => 'Domain Path',
|
39 |
+
'name' => 'Plugin Name',
|
40 |
+
'version' => 'Version',
|
41 |
+
], 'plugin' );
|
42 |
+
array_walk( $plugin, function( $value, $key ) {
|
43 |
+
$this->$key = $value;
|
44 |
+
});
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @return void
|
49 |
+
*/
|
50 |
+
public function activate()
|
51 |
+
{
|
52 |
+
$this->make( DefaultsManager::class )->set();
|
53 |
+
$this->scheduleCronJob();
|
54 |
+
$this->upgrade();
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @return void
|
59 |
+
*/
|
60 |
+
public function catchFatalError()
|
61 |
+
{
|
62 |
+
$error = error_get_last();
|
63 |
+
if( $error['type'] !== E_ERROR || strpos( $error['message'], $this->path() ) === false )return;
|
64 |
+
glsr_log()->error( $error['message'] );
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* @param string $name
|
69 |
+
* @return array
|
70 |
+
*/
|
71 |
+
public function config( $name )
|
72 |
+
{
|
73 |
+
$configFile = $this->path( 'config/'.$name.'.php' );
|
74 |
+
$config = file_exists( $configFile )
|
75 |
+
? include $configFile
|
76 |
+
: [];
|
77 |
+
return apply_filters( 'site-reviews/config/'.$name, $config );
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @param string $property
|
82 |
+
* @return string
|
83 |
+
*/
|
84 |
+
public function constant( $property )
|
85 |
+
{
|
86 |
+
$constant = 'static::'.$property;
|
87 |
+
return defined( $constant )
|
88 |
+
? apply_filters( 'site-reviews/const/'.$property, constant( $constant ))
|
89 |
+
: '';
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* @return void
|
94 |
+
*/
|
95 |
+
public function deactivate()
|
96 |
+
{
|
97 |
+
$this->unscheduleCronJob();
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* @param string $view
|
102 |
+
* @return void|string
|
103 |
+
*/
|
104 |
+
public function file( $view )
|
105 |
+
{
|
106 |
+
$view.= '.php';
|
107 |
+
$filePaths = [];
|
108 |
+
if( glsr( Helper::class )->startsWith( 'templates/', $view )) {
|
109 |
+
$filePaths[] = $this->themePath( glsr( Helper::class )->removePrefix( 'templates/', $view ));
|
110 |
+
}
|
111 |
+
$filePaths[] = $this->path( $view );
|
112 |
+
$filePaths[] = $this->path( 'views/'.$view );
|
113 |
+
foreach( $filePaths as $file ) {
|
114 |
+
if( !file_exists( $file ))continue;
|
115 |
+
return $file;
|
116 |
+
}
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* @return array
|
121 |
+
*/
|
122 |
+
public function getDefaults()
|
123 |
+
{
|
124 |
+
if( empty( $this->defaults )) {
|
125 |
+
$this->defaults = $this->make( DefaultsManager::class )->get();
|
126 |
+
$this->upgrade();
|
127 |
+
}
|
128 |
+
return apply_filters( 'site-reviews/get/defaults', $this->defaults );
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* @return bool
|
133 |
+
*/
|
134 |
+
public function hasPermission()
|
135 |
+
{
|
136 |
+
$isAdmin = $this->isAdmin();
|
137 |
+
return !$isAdmin || ( $isAdmin && current_user_can( $this->constant( 'CAPABILITY' )));
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* @return void
|
142 |
+
*/
|
143 |
+
public function init()
|
144 |
+
{
|
145 |
+
$this->make( Actions::class )->run();
|
146 |
+
$this->make( Filters::class )->run();
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* @return bool
|
151 |
+
*/
|
152 |
+
public function isAdmin()
|
153 |
+
{
|
154 |
+
return is_admin() && !wp_doing_ajax();
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* @param string $file
|
159 |
+
* @return string
|
160 |
+
*/
|
161 |
+
public function path( $file = '' )
|
162 |
+
{
|
163 |
+
$path = plugin_dir_path( $this->file ).ltrim( trim( $file ), '/' );
|
164 |
+
return apply_filters( 'site-reviews/path', $path, $file );
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* @return void
|
169 |
+
*/
|
170 |
+
public function registerAddons()
|
171 |
+
{
|
172 |
+
do_action( 'site-reviews/addon/register', $this );
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* @return void
|
177 |
+
*/
|
178 |
+
public function registerLanguages()
|
179 |
+
{
|
180 |
+
load_plugin_textdomain( static::ID, false,
|
181 |
+
trailingslashit( plugin_basename( $this->path() ).'/'.$this->languages )
|
182 |
+
);
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* @return void
|
187 |
+
*/
|
188 |
+
public function registerReviewTypes()
|
189 |
+
{
|
190 |
+
$types = apply_filters( 'site-reviews/addon/types', [] );
|
191 |
+
$this->reviewTypes = wp_parse_args( $types, [
|
192 |
+
'local' => __( 'Local', 'site-reviews' ),
|
193 |
+
]);
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* @param string $view
|
198 |
+
* @return void
|
199 |
+
*/
|
200 |
+
public function render( $view, array $data = [] )
|
201 |
+
{
|
202 |
+
$view = apply_filters( 'site-reviews/render/view', $view, $data );
|
203 |
+
$file = apply_filters( 'site-reviews/views/file', $this->file( $view ), $view, $data );
|
204 |
+
if( !file_exists( $file )) {
|
205 |
+
glsr_log()->error( 'File not found: '.$file );
|
206 |
+
return;
|
207 |
+
}
|
208 |
+
$data = apply_filters( 'site-reviews/views/data', $data, $view );
|
209 |
+
extract( $data );
|
210 |
+
include $file;
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* @return void
|
215 |
+
*/
|
216 |
+
public function scheduleCronJob()
|
217 |
+
{
|
218 |
+
if( wp_next_scheduled( static::CRON_EVENT ))return;
|
219 |
+
wp_schedule_event( time(), 'twicedaily', static::CRON_EVENT );
|
220 |
+
}
|
221 |
+
|
222 |
+
/**
|
223 |
+
* @param string $file
|
224 |
+
* @return string
|
225 |
+
*/
|
226 |
+
public function themePath( $file = '' )
|
227 |
+
{
|
228 |
+
return get_stylesheet_directory().'/'.static::ID.'/'.ltrim( trim( $file ), '/' );
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* @return void
|
233 |
+
*/
|
234 |
+
public function unscheduleCronJob()
|
235 |
+
{
|
236 |
+
wp_unschedule_event( intval( wp_next_scheduled( static::CRON_EVENT )), static::CRON_EVENT );
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* @return void
|
241 |
+
*/
|
242 |
+
public function upgrade()
|
243 |
+
{
|
244 |
+
$this->make( Upgrader::class )->run();
|
245 |
+
}
|
246 |
+
|
247 |
+
/**
|
248 |
+
* @param mixed $upgrader
|
249 |
+
* @return void
|
250 |
+
* @action upgrader_process_complete
|
251 |
+
*/
|
252 |
+
public function upgraded( $upgrader, array $data )
|
253 |
+
{
|
254 |
+
if( !array_key_exists( 'plugins', $data )
|
255 |
+
|| !in_array( plugin_basename( $this->file ), $data['plugins'] )
|
256 |
+
|| $data['action'] != 'update'
|
257 |
+
|| $data['type'] != 'plugin'
|
258 |
+
)return;
|
259 |
+
$this->upgrade();
|
260 |
+
}
|
261 |
+
|
262 |
+
/**
|
263 |
+
* @param string $path
|
264 |
+
* @return string
|
265 |
+
*/
|
266 |
+
public function url( $path = '' )
|
267 |
+
{
|
268 |
+
$url = esc_url( plugin_dir_url( $this->file ).ltrim( trim( $path ), '/' ));
|
269 |
+
return apply_filters( 'site-reviews/url', $url, $path );
|
270 |
+
}
|
271 |
+
}
|
plugin/Blacklist.php
DELETED
@@ -1,56 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.12.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews;
|
12 |
-
|
13 |
-
use GeminiLabs\SiteReviews\Commands\SubmitReview;
|
14 |
-
|
15 |
-
class Blacklist
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* @return bool
|
19 |
-
*/
|
20 |
-
public function isBlacklisted( SubmitReview $review )
|
21 |
-
{
|
22 |
-
$target = implode( "\n", array_filter([
|
23 |
-
$review->author,
|
24 |
-
$review->content,
|
25 |
-
$review->email,
|
26 |
-
$review->ipAddress,
|
27 |
-
$review->title,
|
28 |
-
]));
|
29 |
-
return (bool) apply_filters( 'site-reviews/blacklist/is-blacklisted',
|
30 |
-
$this->check( $target ),
|
31 |
-
$review
|
32 |
-
);
|
33 |
-
}
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @param string $target
|
37 |
-
* @return bool
|
38 |
-
*/
|
39 |
-
protected function check( $target )
|
40 |
-
{
|
41 |
-
$blacklist = trim( glsr_get_option( 'reviews-form.blacklist.entries' ));
|
42 |
-
if( empty( $blacklist )) {
|
43 |
-
return false;
|
44 |
-
}
|
45 |
-
$lines = explode( "\n", $blacklist );
|
46 |
-
foreach( (array) $lines as $line ) {
|
47 |
-
$line = trim( $line );
|
48 |
-
if( empty( $line ) || 256 < strlen( $line ))continue;
|
49 |
-
$pattern = sprintf( '#%s#i', preg_quote( $line, '#' ));
|
50 |
-
if( preg_match( $pattern, $target )) {
|
51 |
-
return true;
|
52 |
-
}
|
53 |
-
}
|
54 |
-
return false;
|
55 |
-
}
|
56 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Blocks/BlockGenerator.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Blocks;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
|
7 |
+
abstract class BlockGenerator
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
public function attributes()
|
13 |
+
{
|
14 |
+
return [];
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @return array
|
19 |
+
*/
|
20 |
+
public function normalize( array $attributes )
|
21 |
+
{
|
22 |
+
$hide = array_flip( explode( ',', $attributes['hide'] ));
|
23 |
+
unset( $hide['if_empty'] );
|
24 |
+
$attributes['hide'] = implode( ',', array_keys( $hide ));
|
25 |
+
if( !isset( $attributes['assigned_to'] )) {
|
26 |
+
return $attributes;
|
27 |
+
}
|
28 |
+
if( $attributes['assigned_to'] == 'post_id' ) {
|
29 |
+
$attributes['assigned_to'] = $attributes['post_id'];
|
30 |
+
}
|
31 |
+
else if( $attributes['assigned_to'] == 'parent_id' ) {
|
32 |
+
$attributes['assigned_to'] = wp_get_post_parent_id( $attributes['post_id'] );
|
33 |
+
}
|
34 |
+
return $attributes;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @return void
|
39 |
+
*/
|
40 |
+
public function register( $block )
|
41 |
+
{
|
42 |
+
if( !function_exists( 'register_block_type' ))return;
|
43 |
+
register_block_type( Application::ID.'/'.$block, [
|
44 |
+
'attributes' => $this->attributes(),
|
45 |
+
'editor_script' => Application::ID.'/blocks',
|
46 |
+
'editor_style' => Application::ID.'/blocks',
|
47 |
+
'render_callback' => [$this, 'render'],
|
48 |
+
'style' => Application::ID,
|
49 |
+
]);
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @return void
|
54 |
+
*/
|
55 |
+
abstract public function render( array $attributes );
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @param mixed $shortcode
|
59 |
+
* @return bool
|
60 |
+
*/
|
61 |
+
protected function hasVisibleFields( $shortcode, array $attributes )
|
62 |
+
{
|
63 |
+
$args = $shortcode->normalize( $attributes );
|
64 |
+
$defaults = $shortcode->getHideOptions();
|
65 |
+
$hide = array_flip( $args['hide'] );
|
66 |
+
unset( $defaults['if_empty'], $hide['if_empty'] );
|
67 |
+
return !empty( array_diff_key( $defaults, $hide ));
|
68 |
+
}
|
69 |
+
}
|
plugin/Blocks/SiteReviewsBlock.php
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Blocks;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Blocks\BlockGenerator;
|
6 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsShortcode as Shortcode;
|
7 |
+
|
8 |
+
class SiteReviewsBlock extends BlockGenerator
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
public function attributes()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'assigned_to' => [
|
17 |
+
'default' => '',
|
18 |
+
'type' => 'string',
|
19 |
+
],
|
20 |
+
'category' => [
|
21 |
+
'default' => '',
|
22 |
+
'type' => 'string',
|
23 |
+
],
|
24 |
+
'className' => [
|
25 |
+
'default' => '',
|
26 |
+
'type' => 'string',
|
27 |
+
],
|
28 |
+
'count' => [
|
29 |
+
'default' => 5,
|
30 |
+
'type' => 'number',
|
31 |
+
],
|
32 |
+
'hide' => [
|
33 |
+
'default' => '',
|
34 |
+
'type' => 'string',
|
35 |
+
],
|
36 |
+
'id' => [
|
37 |
+
'default' => '',
|
38 |
+
'type' => 'string',
|
39 |
+
],
|
40 |
+
'pagination' => [
|
41 |
+
'default' => '',
|
42 |
+
'type' => 'string',
|
43 |
+
],
|
44 |
+
'post_id' => [
|
45 |
+
'default' => '',
|
46 |
+
'type' => 'string',
|
47 |
+
],
|
48 |
+
'rating' => [
|
49 |
+
'default' => 1,
|
50 |
+
'type' => 'number',
|
51 |
+
],
|
52 |
+
'schema' => [
|
53 |
+
'default' => false,
|
54 |
+
'type' => 'boolean',
|
55 |
+
],
|
56 |
+
'type' => [
|
57 |
+
'default' => '',
|
58 |
+
'type' => 'string',
|
59 |
+
],
|
60 |
+
];
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @return string
|
65 |
+
*/
|
66 |
+
public function render( array $attributes )
|
67 |
+
{
|
68 |
+
$attributes['class'] = $attributes['className'];
|
69 |
+
$shortcode = glsr( Shortcode::class );
|
70 |
+
if( filter_input( INPUT_GET, 'context' ) == 'edit' ) {
|
71 |
+
$attributes = $this->normalize( $attributes );
|
72 |
+
$this->filterReviewLinks();
|
73 |
+
$this->filterShortcodeClass();
|
74 |
+
$this->filterShowMoreLinks( 'content' );
|
75 |
+
$this->filterShowMoreLinks( 'response' );
|
76 |
+
if( !$this->hasVisibleFields( $shortcode, $attributes )) {
|
77 |
+
$this->filterInterpolation();
|
78 |
+
}
|
79 |
+
}
|
80 |
+
return $shortcode->buildShortcode( $attributes );
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* @return void
|
85 |
+
*/
|
86 |
+
protected function filterInterpolation()
|
87 |
+
{
|
88 |
+
add_filter( 'site-reviews/interpolate/reviews', function( $context ) {
|
89 |
+
$context['class'] = 'glsr-default glsr-block-disabled';
|
90 |
+
$context['reviews'] = __( 'You have hidden all of the fields for this block.', 'site-reviews' );
|
91 |
+
return $context;
|
92 |
+
});
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* @return void
|
97 |
+
*/
|
98 |
+
protected function filterReviewLinks()
|
99 |
+
{
|
100 |
+
add_filter( 'site-reviews/rendered/template/reviews', function( $template ) {
|
101 |
+
return str_replace( '<a', '<a tabindex="-1"', $template );
|
102 |
+
});
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* @return void
|
107 |
+
*/
|
108 |
+
protected function filterShortcodeClass()
|
109 |
+
{
|
110 |
+
add_filter( 'site-reviews/style', function() {
|
111 |
+
return 'default';
|
112 |
+
});
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* @param string $field
|
117 |
+
* @return void
|
118 |
+
*/
|
119 |
+
protected function filterShowMoreLinks( $field )
|
120 |
+
{
|
121 |
+
add_filter( 'site-reviews/review/wrap/'.$field, function( $value ) {
|
122 |
+
$value = preg_replace(
|
123 |
+
'/(.*)(<span class="glsr-hidden)(.*)(<\/span>)(.*)/s',
|
124 |
+
'$1... <a href="#" class="glsr-read-more" tabindex="-1">'.__( 'Show more', 'site-reviews' ).'</a>$5',
|
125 |
+
$value
|
126 |
+
);
|
127 |
+
return $value;
|
128 |
+
});
|
129 |
+
}
|
130 |
+
}
|
plugin/Blocks/SiteReviewsFormBlock.php
ADDED
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Blocks;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Blocks\BlockGenerator;
|
6 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsFormShortcode as Shortcode;
|
7 |
+
|
8 |
+
class SiteReviewsFormBlock extends BlockGenerator
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
public function attributes()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'assign_to' => [
|
17 |
+
'default' => '',
|
18 |
+
'type' => 'string',
|
19 |
+
],
|
20 |
+
'category' => [
|
21 |
+
'default' => '',
|
22 |
+
'type' => 'string',
|
23 |
+
],
|
24 |
+
'className' => [
|
25 |
+
'default' => '',
|
26 |
+
'type' => 'string',
|
27 |
+
],
|
28 |
+
'hide' => [
|
29 |
+
'default' => '',
|
30 |
+
'type' => 'string',
|
31 |
+
],
|
32 |
+
'id' => [
|
33 |
+
'default' => '',
|
34 |
+
'type' => 'string',
|
35 |
+
],
|
36 |
+
];
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @return string
|
41 |
+
*/
|
42 |
+
public function render( array $attributes )
|
43 |
+
{
|
44 |
+
$attributes['class'] = $attributes['className'];
|
45 |
+
$shortcode = glsr( Shortcode::class );
|
46 |
+
if( filter_input( INPUT_GET, 'context' ) == 'edit' ) {
|
47 |
+
$this->filterFormFields();
|
48 |
+
$this->filterRatingField();
|
49 |
+
$this->filterShortcodeClass();
|
50 |
+
$this->filterSubmitButton();
|
51 |
+
if( !$this->hasVisibleFields( $shortcode, $attributes )) {
|
52 |
+
$this->filterInterpolation();
|
53 |
+
}
|
54 |
+
}
|
55 |
+
return $shortcode->buildShortcode( $attributes );
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @return void
|
60 |
+
*/
|
61 |
+
protected function filterFormFields()
|
62 |
+
{
|
63 |
+
add_filter( 'site-reviews/config/forms/submission-form', function( array $config ) {
|
64 |
+
array_walk( $config, function( &$field ) {
|
65 |
+
$field['disabled'] = true;
|
66 |
+
$field['tabindex'] = '-1';
|
67 |
+
});
|
68 |
+
return $config;
|
69 |
+
});
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* @return void
|
74 |
+
*/
|
75 |
+
protected function filterInterpolation()
|
76 |
+
{
|
77 |
+
add_filter( 'site-reviews/interpolate/reviews-form', function( $context ) {
|
78 |
+
$context['class'] = 'glsr-default glsr-block-disabled';
|
79 |
+
$context['fields'] = __( 'You have hidden all of the fields for this block.', 'site-reviews' );
|
80 |
+
$context['response'] = '';
|
81 |
+
$context['submit_button'] = '';
|
82 |
+
return $context;
|
83 |
+
});
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* @return void
|
88 |
+
*/
|
89 |
+
protected function filterRatingField()
|
90 |
+
{
|
91 |
+
add_filter( 'site-reviews/rendered/field', function( $html, $type, $args ) {
|
92 |
+
if( $args['path'] == 'rating' ) {
|
93 |
+
$stars = '<span class="glsr-stars">';
|
94 |
+
$stars.= str_repeat( '<span class="glsr-star glsr-star-empty" aria-hidden="true"></span>', 5 );
|
95 |
+
$stars.= '</span>';
|
96 |
+
$html = preg_replace( '/(.*)(<select.*)(<\/select>)(.*)/', '$1'.$stars.'$4', $html );
|
97 |
+
}
|
98 |
+
return $html;
|
99 |
+
}, 10, 3 );
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* @return void
|
104 |
+
*/
|
105 |
+
protected function filterShortcodeClass()
|
106 |
+
{
|
107 |
+
add_filter( 'site-reviews/style', function() {
|
108 |
+
return 'default';
|
109 |
+
});
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* @return void
|
114 |
+
*/
|
115 |
+
protected function filterSubmitButton()
|
116 |
+
{
|
117 |
+
add_filter( 'site-reviews/rendered/template/form/submit-button', function( $template ) {
|
118 |
+
return str_replace( 'type="submit"', 'tabindex="-1"', $template );
|
119 |
+
});
|
120 |
+
}
|
121 |
+
}
|
plugin/Blocks/SiteReviewsSummaryBlock.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Blocks;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Blocks\BlockGenerator;
|
6 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsSummaryShortcode as Shortcode;
|
7 |
+
|
8 |
+
class SiteReviewsSummaryBlock extends BlockGenerator
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
public function attributes()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'assigned_to' => [
|
17 |
+
'default' => '',
|
18 |
+
'type' => 'string',
|
19 |
+
],
|
20 |
+
'category' => [
|
21 |
+
'default' => '',
|
22 |
+
'type' => 'string',
|
23 |
+
],
|
24 |
+
'className' => [
|
25 |
+
'default' => '',
|
26 |
+
'type' => 'string',
|
27 |
+
],
|
28 |
+
'hide' => [
|
29 |
+
'default' => '',
|
30 |
+
'type' => 'string',
|
31 |
+
],
|
32 |
+
'post_id' => [
|
33 |
+
'default' => '',
|
34 |
+
'type' => 'string',
|
35 |
+
],
|
36 |
+
'rating' => [
|
37 |
+
'default' => '1',
|
38 |
+
'type' => 'number',
|
39 |
+
],
|
40 |
+
'schema' => [
|
41 |
+
'default' => false,
|
42 |
+
'type' => 'boolean',
|
43 |
+
],
|
44 |
+
'type' => [
|
45 |
+
'default' => '',
|
46 |
+
'type' => 'string',
|
47 |
+
],
|
48 |
+
];
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
public function render( array $attributes )
|
55 |
+
{
|
56 |
+
$attributes['class'] = $attributes['className'];
|
57 |
+
$shortcode = glsr( Shortcode::class );
|
58 |
+
if( filter_input( INPUT_GET, 'context' ) == 'edit' ) {
|
59 |
+
$attributes = $this->normalize( $attributes );
|
60 |
+
$this->filterShortcodeClass();
|
61 |
+
if( !$this->hasVisibleFields( $shortcode, $attributes )) {
|
62 |
+
$this->filterInterpolation();
|
63 |
+
}
|
64 |
+
}
|
65 |
+
return $shortcode->buildShortcode( $attributes );
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* @return void
|
70 |
+
*/
|
71 |
+
protected function filterInterpolation()
|
72 |
+
{
|
73 |
+
add_filter( 'site-reviews/interpolate/reviews-summary', function( $context ) {
|
74 |
+
$context['class'] = 'glsr-default glsr-block-disabled';
|
75 |
+
$context['text'] = __( 'You have hidden all of the fields for this block.', 'site-reviews' );
|
76 |
+
return $context;
|
77 |
+
});
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @return void
|
82 |
+
*/
|
83 |
+
protected function filterShortcodeClass()
|
84 |
+
{
|
85 |
+
add_filter( 'site-reviews/style', function() {
|
86 |
+
return 'default';
|
87 |
+
});
|
88 |
+
}
|
89 |
+
}
|
plugin/Commands/ChangeStatus.php
CHANGED
@@ -1,13 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
class ChangeStatus
|
@@ -17,7 +9,7 @@ class ChangeStatus
|
|
17 |
|
18 |
public function __construct( $input )
|
19 |
{
|
20 |
-
$this->id
|
21 |
$this->status = $input['status'] == 'approve'
|
22 |
? 'publish'
|
23 |
: 'pending';
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
class ChangeStatus
|
9 |
|
10 |
public function __construct( $input )
|
11 |
{
|
12 |
+
$this->id = $input['post_id'];
|
13 |
$this->status = $input['status'] == 'approve'
|
14 |
? 'publish'
|
15 |
: 'pending';
|
plugin/Commands/CreateReview.php
ADDED
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Helper;
|
6 |
+
|
7 |
+
class CreateReview
|
8 |
+
{
|
9 |
+
public $ajax_request;
|
10 |
+
public $assigned_to;
|
11 |
+
public $author;
|
12 |
+
public $avatar;
|
13 |
+
public $blacklisted;
|
14 |
+
public $category;
|
15 |
+
public $content;
|
16 |
+
public $custom;
|
17 |
+
public $date;
|
18 |
+
public $email;
|
19 |
+
public $form_id;
|
20 |
+
public $ip_address;
|
21 |
+
public $post_id;
|
22 |
+
public $rating;
|
23 |
+
public $referer;
|
24 |
+
public $request;
|
25 |
+
public $response;
|
26 |
+
public $terms;
|
27 |
+
public $title;
|
28 |
+
public $url;
|
29 |
+
|
30 |
+
public function __construct( $input )
|
31 |
+
{
|
32 |
+
$this->request = $input;
|
33 |
+
$this->ajax_request = isset( $input['_ajax_request'] );
|
34 |
+
$this->assigned_to = $this->getNumeric( 'assign_to' );
|
35 |
+
$this->author = sanitize_text_field( $this->getUser( 'name' ));
|
36 |
+
$this->avatar = $this->getAvatar();
|
37 |
+
$this->blacklisted = isset( $input['blacklisted'] );
|
38 |
+
$this->category = sanitize_key( $this->get( 'category' ));
|
39 |
+
$this->content = sanitize_textarea_field( $this->get( 'content' ));
|
40 |
+
$this->custom = $this->getCustom();
|
41 |
+
$this->date = $this->getDate( 'date' );
|
42 |
+
$this->email = sanitize_email( $this->getUser( 'email' ));
|
43 |
+
$this->form_id = sanitize_key( $this->get( 'form_id' ));
|
44 |
+
$this->ip_address = $this->get( 'ip_address' );
|
45 |
+
$this->post_id = intval( $this->get( '_post_id' ));
|
46 |
+
$this->rating = intval( $this->get( 'rating' ));
|
47 |
+
$this->referer = $this->get( '_referer' );
|
48 |
+
$this->response = sanitize_textarea_field( $this->get( 'response' ));
|
49 |
+
$this->terms = !empty( $input['terms'] );
|
50 |
+
$this->title = sanitize_text_field( $this->get( 'title' ));
|
51 |
+
$this->url = esc_url_raw( $this->get( 'url' ));
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @param string $key
|
56 |
+
* @return string
|
57 |
+
*/
|
58 |
+
protected function get( $key )
|
59 |
+
{
|
60 |
+
return isset( $this->request[$key] )
|
61 |
+
? (string)$this->request[$key]
|
62 |
+
: '';
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @return string
|
67 |
+
*/
|
68 |
+
protected function getAvatar()
|
69 |
+
{
|
70 |
+
$avatar = $this->get( 'avatar' );
|
71 |
+
return !filter_var( $avatar, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED )
|
72 |
+
? (string)get_avatar_url( $this->get( 'email' ))
|
73 |
+
: $avatar;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @return array
|
78 |
+
*/
|
79 |
+
protected function getCustom()
|
80 |
+
{
|
81 |
+
$unset = [
|
82 |
+
'_action', '_ajax_request', '_counter', '_nonce', '_post_id', '_recaptcha-token',
|
83 |
+
'_referer', 'assign_to', 'category', 'content', 'date', 'email', 'excluded', 'form_id',
|
84 |
+
'gotcha', 'ip_address', 'name', 'rating', 'response', 'terms', 'title', 'url',
|
85 |
+
];
|
86 |
+
$unset = apply_filters( 'site-reviews/create/unset-keys-from-custom', $unset );
|
87 |
+
$custom = $this->request;
|
88 |
+
foreach( $unset as $value ) {
|
89 |
+
unset( $custom[$value] );
|
90 |
+
}
|
91 |
+
return $custom;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* @param string $key
|
96 |
+
* @return string
|
97 |
+
*/
|
98 |
+
protected function getDate( $key )
|
99 |
+
{
|
100 |
+
$date = strtotime( $this->get( $key ));
|
101 |
+
if( $date === false ) {
|
102 |
+
$date = time();
|
103 |
+
}
|
104 |
+
return get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $date ));
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @param string $key
|
109 |
+
* @return string
|
110 |
+
*/
|
111 |
+
protected function getUser( $key )
|
112 |
+
{
|
113 |
+
$value = $this->get( $key );
|
114 |
+
if( empty( $value )) {
|
115 |
+
$user = wp_get_current_user();
|
116 |
+
$userValues = [
|
117 |
+
'email' => 'user_email',
|
118 |
+
'name' => 'display_name',
|
119 |
+
];
|
120 |
+
if( $user->exists() && array_key_exists( $key, $userValues )) {
|
121 |
+
return $user->{$userValues[$key]};
|
122 |
+
}
|
123 |
+
}
|
124 |
+
return $value;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* @param string $key
|
129 |
+
* @return string
|
130 |
+
*/
|
131 |
+
protected function getNumeric( $key )
|
132 |
+
{
|
133 |
+
$value = $this->get( $key );
|
134 |
+
return is_numeric( $value )
|
135 |
+
? $value
|
136 |
+
: '';
|
137 |
+
}
|
138 |
+
}
|
plugin/Commands/EnqueueAdminAssets.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
+
|
5 |
+
class EnqueueAdminAssets
|
6 |
+
{
|
7 |
+
public $pointers;
|
8 |
+
|
9 |
+
public function __construct( array $input )
|
10 |
+
{
|
11 |
+
$this->pointers = $input['pointers'];
|
12 |
+
}
|
13 |
+
}
|
plugin/Commands/EnqueueAssets.php
DELETED
@@ -1,27 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
-
|
13 |
-
class EnqueueAssets
|
14 |
-
{
|
15 |
-
public $handle;
|
16 |
-
public $path;
|
17 |
-
public $url;
|
18 |
-
public $version;
|
19 |
-
|
20 |
-
public function __construct( $input )
|
21 |
-
{
|
22 |
-
$this->handle = $input['handle'];
|
23 |
-
$this->url = $input['url'];
|
24 |
-
$this->path = $input['path'];
|
25 |
-
$this->version = $input['version'];
|
26 |
-
}
|
27 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Commands/RegisterPointers.php
DELETED
@@ -1,21 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
-
|
13 |
-
class RegisterPointers
|
14 |
-
{
|
15 |
-
public $pointers;
|
16 |
-
|
17 |
-
public function __construct( $input )
|
18 |
-
{
|
19 |
-
$this->pointers = $input;
|
20 |
-
}
|
21 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Commands/RegisterPostType.php
CHANGED
@@ -1,82 +1,83 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
|
|
|
|
|
|
14 |
|
15 |
class RegisterPostType
|
16 |
{
|
17 |
public $args;
|
|
|
|
|
|
|
|
|
18 |
|
19 |
public function __construct( $input )
|
20 |
{
|
21 |
-
$
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
$defaults = [
|
27 |
-
'capability_type' => '',
|
28 |
-
'columns' => $columns,
|
29 |
-
'has_archive' => false,
|
30 |
-
'hierarchical' => false,
|
31 |
-
'labels' => [],
|
32 |
-
'map_meta_cap' => true,
|
33 |
-
'menu_icon' => null,
|
34 |
-
'menu_name' => '',
|
35 |
-
'menu_position' => 25,
|
36 |
-
'public' => true,
|
37 |
-
'query_var' => true,
|
38 |
-
'rewrite' => ['slug' => App::POST_TYPE, 'with_front' => false ],
|
39 |
-
'show_in_menu' => true, //'edit.php?post_type=post'
|
40 |
-
'supports' => ['title', 'editor'],
|
41 |
-
'taxonomies' => [],
|
42 |
-
];
|
43 |
-
|
44 |
-
$args = wp_parse_args( $input, $defaults );
|
45 |
-
|
46 |
-
$defaults = [
|
47 |
-
'exclude_from_search' => !$args['public'],
|
48 |
-
'menu_name' => sanitize_title( $args['plural'] ),
|
49 |
-
'post_type' => sanitize_title( $args['single'] ),
|
50 |
-
'publicly_queryable' => $args['public'],
|
51 |
-
'show_in_nav_menus' => $args['public'],
|
52 |
-
'show_ui' => true,
|
53 |
-
];
|
54 |
-
|
55 |
-
$args = wp_parse_args( $args, $defaults );
|
56 |
-
|
57 |
-
$args['labels']['singular_name'] = $args['single'];
|
58 |
-
$args['labels']['name'] = $args['plural'];
|
59 |
-
$args['labels']['menu_name'] = $args['menu_name'];
|
60 |
-
|
61 |
-
$args['columns'] = $this->normalizeColumns( $args['columns'] );
|
62 |
-
|
63 |
-
$this->args = $args;
|
64 |
}
|
65 |
|
66 |
/**
|
67 |
-
* @return
|
68 |
*/
|
69 |
-
protected function
|
70 |
{
|
71 |
-
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
}
|
79 |
-
|
80 |
-
return $columns;
|
81 |
}
|
82 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Defaults\PostTypeDefaults;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
9 |
|
10 |
class RegisterPostType
|
11 |
{
|
12 |
public $args;
|
13 |
+
public $columns;
|
14 |
+
public $plural;
|
15 |
+
public $postType;
|
16 |
+
public $single;
|
17 |
|
18 |
public function __construct( $input )
|
19 |
{
|
20 |
+
$args = glsr( PostTypeDefaults::class )->merge( $input );
|
21 |
+
$this->normalize( $args );
|
22 |
+
$this->normalizeColumns();
|
23 |
+
$this->normalizeLabels();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
}
|
25 |
|
26 |
/**
|
27 |
+
* @return void
|
28 |
*/
|
29 |
+
protected function normalize( array $args )
|
30 |
{
|
31 |
+
foreach( $args as $key => $value ) {
|
32 |
+
$property = glsr( Helper::class )->buildPropertyName( $key );
|
33 |
+
if( !property_exists( $this, $property ))continue;
|
34 |
+
$this->$property = $value;
|
35 |
+
unset( $args[$key] );
|
36 |
+
}
|
37 |
+
$this->args = wp_parse_args( $args, [
|
38 |
+
'menu_name' => $this->plural,
|
39 |
+
]);
|
40 |
+
}
|
41 |
|
42 |
+
/**
|
43 |
+
* @return void
|
44 |
+
*/
|
45 |
+
protected function normalizeLabels()
|
46 |
+
{
|
47 |
+
$this->args['labels'] = wp_parse_args( $this->args['labels'], [
|
48 |
+
'add_new_item' => sprintf( _x( 'Add New %s', 'Add New Post', 'site-reviews' ), $this->plural ),
|
49 |
+
'all_items' => sprintf( _x( 'All %s', 'All Posts', 'site-reviews' ), $this->plural ),
|
50 |
+
'archives' => sprintf( _x( '%s Archives', 'Post Archives', 'site-reviews' ), $this->single ),
|
51 |
+
'edit_item' => sprintf( _x( 'Edit %s', 'Edit Post', 'site-reviews' ), $this->single ),
|
52 |
+
'insert_into_item' => sprintf( _x( 'Insert into %s', 'Insert into Post', 'site-reviews' ), $this->single ),
|
53 |
+
'menu_name' => $this->args['menu_name'],
|
54 |
+
'name' => $this->plural,
|
55 |
+
'new_item' => sprintf( _x( 'New %s', 'New Post', 'site-reviews' ), $this->single ),
|
56 |
+
'not_found' => sprintf( _x( 'No %s found', 'No Posts found', 'site-reviews' ), $this->plural ),
|
57 |
+
'not_found_in_trash' => sprintf( _x( 'No %s found in Trash', 'No Posts found in Trash', 'site-reviews' ), $this->plural ),
|
58 |
+
'search_items' => sprintf( _x( 'Search %s', 'Search Posts', 'site-reviews' ), $this->plural ),
|
59 |
+
'singular_name' => $this->single,
|
60 |
+
'uploaded_to_this_item' => sprintf( _x( 'Uploaded to this %s', 'Uploaded to this Post', 'site-reviews' ), $this->single ),
|
61 |
+
'view_item' => sprintf( _x( 'View %s', 'View Post', 'site-reviews' ), $this->single ),
|
62 |
+
]);
|
63 |
+
unset( $this->args['menu_name'] );
|
64 |
+
}
|
65 |
|
66 |
+
/**
|
67 |
+
* @return void
|
68 |
+
*/
|
69 |
+
protected function normalizeColumns()
|
70 |
+
{
|
71 |
+
$this->columns = ['cb' => ''] + $this->columns;
|
72 |
+
if( array_key_exists( 'category', $this->columns )) {
|
73 |
+
$keys = array_keys( $this->columns );
|
74 |
+
$keys[array_search( 'category', $keys )] = 'taxonomy-'.Application::TAXONOMY;
|
75 |
+
$this->columns = array_combine( $keys, $this->columns );
|
76 |
+
}
|
77 |
+
if( array_key_exists( 'pinned', $this->columns )) {
|
78 |
+
$this->columns['pinned'] = glsr( Builder::class )->span( '<span>'.$this->columns['pinned'].'</span>',
|
79 |
+
['class' => 'pinned-icon']
|
80 |
+
);
|
81 |
}
|
|
|
|
|
82 |
}
|
83 |
}
|
plugin/Commands/RegisterShortcodeButtons.php
DELETED
@@ -1,21 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
-
|
13 |
-
class RegisterShortcodeButtons
|
14 |
-
{
|
15 |
-
public $shortcodes;
|
16 |
-
|
17 |
-
public function __construct( $input )
|
18 |
-
{
|
19 |
-
$this->shortcodes = $input;
|
20 |
-
}
|
21 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Commands/RegisterShortcodes.php
CHANGED
@@ -1,13 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
class RegisterShortcodes
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
class RegisterShortcodes
|
plugin/Commands/RegisterTaxonomy.php
CHANGED
@@ -1,13 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
class RegisterTaxonomy
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
class RegisterTaxonomy
|
plugin/Commands/RegisterTinymcePopups.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
+
|
5 |
+
class RegisterTinymcePopups
|
6 |
+
{
|
7 |
+
public $popups;
|
8 |
+
|
9 |
+
public function __construct( $input )
|
10 |
+
{
|
11 |
+
$this->popups = $input;
|
12 |
+
}
|
13 |
+
}
|
plugin/Commands/RegisterWidgets.php
CHANGED
@@ -1,13 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
class RegisterWidgets
|
@@ -16,6 +8,6 @@ class RegisterWidgets
|
|
16 |
|
17 |
public function __construct( $input )
|
18 |
{
|
19 |
-
$this->widgets =
|
20 |
}
|
21 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
class RegisterWidgets
|
8 |
|
9 |
public function __construct( $input )
|
10 |
{
|
11 |
+
$this->widgets = $input;
|
12 |
}
|
13 |
}
|
plugin/Commands/SubmitReview.php
DELETED
@@ -1,47 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
-
|
13 |
-
class SubmitReview
|
14 |
-
{
|
15 |
-
public $ajaxRequest;
|
16 |
-
public $assignedTo;
|
17 |
-
public $author;
|
18 |
-
public $blacklisted;
|
19 |
-
public $category;
|
20 |
-
public $content;
|
21 |
-
public $email;
|
22 |
-
public $formId;
|
23 |
-
public $ipAddress;
|
24 |
-
public $rating;
|
25 |
-
public $referrer;
|
26 |
-
public $request;
|
27 |
-
public $terms;
|
28 |
-
public $title;
|
29 |
-
|
30 |
-
public function __construct( $input )
|
31 |
-
{
|
32 |
-
$this->ajaxRequest = isset( $input['ajax_request'] );
|
33 |
-
$this->assignedTo = is_numeric( $input['assign_to'] ) ? $input['assign_to'] : '';
|
34 |
-
$this->author = sanitize_text_field( $input['name'] );
|
35 |
-
$this->blacklisted = false;
|
36 |
-
$this->category = sanitize_key( $input['category'] );
|
37 |
-
$this->content = sanitize_textarea_field( $input['content'] );
|
38 |
-
$this->email = sanitize_email( $input['email'] );
|
39 |
-
$this->formId = sanitize_key( $input['form_id'] );
|
40 |
-
$this->ipAddress = glsr_resolve( 'Helper' )->getIpAddress();
|
41 |
-
$this->rating = intval( $input['rating'] );
|
42 |
-
$this->referrer = $input['_wp_http_referer'];
|
43 |
-
$this->request = $input;
|
44 |
-
$this->terms = isset( $input['terms'] );
|
45 |
-
$this->title = sanitize_text_field( $input['title'] );
|
46 |
-
}
|
47 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Commands/TogglePinned.php
CHANGED
@@ -1,13 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Commands;
|
12 |
|
13 |
class TogglePinned
|
@@ -17,11 +9,9 @@ class TogglePinned
|
|
17 |
|
18 |
public function __construct( $input )
|
19 |
{
|
20 |
-
$
|
|
|
21 |
? wp_validate_boolean( $input['pinned'] )
|
22 |
: null;
|
23 |
-
|
24 |
-
$this->id = $input['id'];
|
25 |
-
$this->pinned = $pinned;
|
26 |
}
|
27 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Commands;
|
4 |
|
5 |
class TogglePinned
|
9 |
|
10 |
public function __construct( $input )
|
11 |
{
|
12 |
+
$this->id = $input['id'];
|
13 |
+
$this->pinned = isset( $input['pinned'] )
|
14 |
? wp_validate_boolean( $input['pinned'] )
|
15 |
: null;
|
|
|
|
|
|
|
16 |
}
|
17 |
}
|
plugin/Container.php
CHANGED
@@ -1,53 +1,38 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews;
|
12 |
|
13 |
use Closure;
|
14 |
use Exception;
|
15 |
-
use GeminiLabs\SiteReviews\Providers\ProviderInterface;
|
16 |
use ReflectionClass;
|
17 |
use ReflectionParameter;
|
18 |
|
19 |
abstract class Container
|
20 |
{
|
21 |
-
|
22 |
'instance',
|
23 |
'services',
|
24 |
'storage',
|
25 |
];
|
26 |
|
27 |
/**
|
28 |
-
* The current globally available container (if any).
|
29 |
-
*
|
30 |
* @var static
|
31 |
*/
|
32 |
protected static $instance;
|
33 |
|
34 |
/**
|
35 |
* The container's bound services
|
36 |
-
*
|
37 |
* @var array
|
38 |
*/
|
39 |
protected $services = [];
|
40 |
|
41 |
/**
|
42 |
* The container's storage items
|
43 |
-
*
|
44 |
* @var array
|
45 |
*/
|
46 |
protected $storage = [];
|
47 |
|
48 |
/**
|
49 |
-
* Set/get the globally available instance of the container.
|
50 |
-
*
|
51 |
* @return static
|
52 |
*/
|
53 |
public static function load()
|
@@ -59,31 +44,31 @@ abstract class Container
|
|
59 |
}
|
60 |
|
61 |
/**
|
62 |
-
* Dynamically access container properties.
|
63 |
-
*
|
64 |
* @param string $property
|
65 |
* @return mixed
|
66 |
*/
|
67 |
public function __get( $property )
|
68 |
{
|
69 |
-
if( property_exists( $this, $property ) && !in_array( $property, static
|
70 |
return $this->$property;
|
71 |
}
|
|
|
|
|
|
|
|
|
72 |
return isset( $this->storage[$property] )
|
73 |
? $this->storage[$property]
|
74 |
: null;
|
75 |
}
|
76 |
|
77 |
/**
|
78 |
-
* Dynamically set container properties.
|
79 |
-
*
|
80 |
* @param string $property
|
81 |
* @param string $value
|
82 |
* @return void
|
83 |
*/
|
84 |
public function __set( $property, $value )
|
85 |
{
|
86 |
-
if( !property_exists( $this, $property ) || in_array( $property, static
|
87 |
$this->storage[$property] = $value;
|
88 |
}
|
89 |
else if( !isset( $this->$property )) {
|
@@ -95,15 +80,7 @@ abstract class Container
|
|
95 |
}
|
96 |
|
97 |
/**
|
98 |
-
*
|
99 |
-
*
|
100 |
-
* @return void
|
101 |
-
*/
|
102 |
-
abstract public function init();
|
103 |
-
|
104 |
-
/**
|
105 |
-
* Bind a service to the container.
|
106 |
-
*
|
107 |
* @param string $alias
|
108 |
* @param mixed $concrete
|
109 |
* @return mixed
|
@@ -114,9 +91,7 @@ abstract class Container
|
|
114 |
}
|
115 |
|
116 |
/**
|
117 |
-
*
|
118 |
-
* root namespace. i.e. 'Controller' translates to 'GeminiLabs\Pollux\Controller'
|
119 |
-
*
|
120 |
* @param mixed $abstract
|
121 |
* @return mixed
|
122 |
*/
|
@@ -138,56 +113,31 @@ abstract class Container
|
|
138 |
}
|
139 |
|
140 |
/**
|
141 |
-
|
142 |
-
*
|
143 |
-
* @
|
144 |
-
*/
|
145 |
-
public function register( ProviderInterface $provider )
|
146 |
-
{
|
147 |
-
$provider->register( $this );
|
148 |
-
}
|
149 |
-
|
150 |
-
/**
|
151 |
-
* Register a shared binding in the container.
|
152 |
-
*
|
153 |
-
* @param string $abstract
|
154 |
-
* @param callable|string|null $concrete
|
155 |
* @return void
|
156 |
*/
|
157 |
-
public function singleton( $
|
158 |
{
|
159 |
-
$this->bind( $
|
160 |
}
|
161 |
|
162 |
/**
|
163 |
* Prefix the current namespace to the abstract if absent
|
164 |
-
*
|
165 |
* @param string $abstract
|
166 |
* @return string
|
167 |
*/
|
168 |
protected function addNamespace( $abstract )
|
169 |
{
|
170 |
-
if( strpos( $abstract, __NAMESPACE__ ) === false ) {
|
171 |
-
$abstract = __NAMESPACE__
|
172 |
}
|
173 |
return $abstract;
|
174 |
}
|
175 |
|
176 |
/**
|
177 |
-
*
|
178 |
-
*
|
179 |
-
* @param string $concrete
|
180 |
-
* @throws Exception
|
181 |
-
*/
|
182 |
-
protected function notInstantiable( $concrete )
|
183 |
-
{
|
184 |
-
$message = "Target [$concrete] is not instantiable.";
|
185 |
-
throw new Exception( $message );
|
186 |
-
}
|
187 |
-
|
188 |
-
/**
|
189 |
-
* Resolve a class based dependency from the container.
|
190 |
-
*
|
191 |
* @param mixed $concrete
|
192 |
* @return mixed
|
193 |
* @throws Exception
|
@@ -199,7 +149,7 @@ abstract class Container
|
|
199 |
}
|
200 |
$reflector = new ReflectionClass( $concrete );
|
201 |
if( !$reflector->isInstantiable() ) {
|
202 |
-
|
203 |
}
|
204 |
$constructor = $reflector->getConstructor();
|
205 |
if( empty( $constructor )) {
|
@@ -211,8 +161,7 @@ abstract class Container
|
|
211 |
}
|
212 |
|
213 |
/**
|
214 |
-
* Resolve a class based dependency from the container
|
215 |
-
*
|
216 |
* @return mixed
|
217 |
* @throws Exception
|
218 |
*/
|
@@ -230,8 +179,7 @@ abstract class Container
|
|
230 |
}
|
231 |
|
232 |
/**
|
233 |
-
* Resolve all of the dependencies from the ReflectionParameters
|
234 |
-
*
|
235 |
* @return array
|
236 |
*/
|
237 |
protected function resolveDependencies( array $dependencies )
|
@@ -246,8 +194,7 @@ abstract class Container
|
|
246 |
}
|
247 |
|
248 |
/**
|
249 |
-
* Resolve a single ReflectionParameter dependency
|
250 |
-
*
|
251 |
* @return array|null
|
252 |
*/
|
253 |
protected function resolveDependency( ReflectionParameter $parameter )
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews;
|
4 |
|
5 |
use Closure;
|
6 |
use Exception;
|
|
|
7 |
use ReflectionClass;
|
8 |
use ReflectionParameter;
|
9 |
|
10 |
abstract class Container
|
11 |
{
|
12 |
+
const PROTECTED_PROPERTIES = [
|
13 |
'instance',
|
14 |
'services',
|
15 |
'storage',
|
16 |
];
|
17 |
|
18 |
/**
|
|
|
|
|
19 |
* @var static
|
20 |
*/
|
21 |
protected static $instance;
|
22 |
|
23 |
/**
|
24 |
* The container's bound services
|
|
|
25 |
* @var array
|
26 |
*/
|
27 |
protected $services = [];
|
28 |
|
29 |
/**
|
30 |
* The container's storage items
|
|
|
31 |
* @var array
|
32 |
*/
|
33 |
protected $storage = [];
|
34 |
|
35 |
/**
|
|
|
|
|
36 |
* @return static
|
37 |
*/
|
38 |
public static function load()
|
44 |
}
|
45 |
|
46 |
/**
|
|
|
|
|
47 |
* @param string $property
|
48 |
* @return mixed
|
49 |
*/
|
50 |
public function __get( $property )
|
51 |
{
|
52 |
+
if( property_exists( $this, $property ) && !in_array( $property, static::PROTECTED_PROPERTIES )) {
|
53 |
return $this->$property;
|
54 |
}
|
55 |
+
$constant = 'static::'.strtoupper( $this->make( Helper::class )->snakeCase( $property ));
|
56 |
+
if( defined( $constant )) {
|
57 |
+
return constant( $constant );
|
58 |
+
}
|
59 |
return isset( $this->storage[$property] )
|
60 |
? $this->storage[$property]
|
61 |
: null;
|
62 |
}
|
63 |
|
64 |
/**
|
|
|
|
|
65 |
* @param string $property
|
66 |
* @param string $value
|
67 |
* @return void
|
68 |
*/
|
69 |
public function __set( $property, $value )
|
70 |
{
|
71 |
+
if( !property_exists( $this, $property ) || in_array( $property, static::PROTECTED_PROPERTIES )) {
|
72 |
$this->storage[$property] = $value;
|
73 |
}
|
74 |
else if( !isset( $this->$property )) {
|
80 |
}
|
81 |
|
82 |
/**
|
83 |
+
* Bind a service to the container
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
* @param string $alias
|
85 |
* @param mixed $concrete
|
86 |
* @return mixed
|
91 |
}
|
92 |
|
93 |
/**
|
94 |
+
* Request a service from the container
|
|
|
|
|
95 |
* @param mixed $abstract
|
96 |
* @return mixed
|
97 |
*/
|
113 |
}
|
114 |
|
115 |
/**
|
116 |
+
* Bind a singleton instance to the container
|
117 |
+
* @param string $alias
|
118 |
+
* @param callable|string|null $binding
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
* @return void
|
120 |
*/
|
121 |
+
public function singleton( $alias, $binding )
|
122 |
{
|
123 |
+
$this->bind( $alias, $this->make( $binding ));
|
124 |
}
|
125 |
|
126 |
/**
|
127 |
* Prefix the current namespace to the abstract if absent
|
|
|
128 |
* @param string $abstract
|
129 |
* @return string
|
130 |
*/
|
131 |
protected function addNamespace( $abstract )
|
132 |
{
|
133 |
+
if( strpos( $abstract, __NAMESPACE__ ) === false && !class_exists( $abstract )) {
|
134 |
+
$abstract = __NAMESPACE__.'\\'.$abstract;
|
135 |
}
|
136 |
return $abstract;
|
137 |
}
|
138 |
|
139 |
/**
|
140 |
+
* Resolve a service from the container
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
* @param mixed $concrete
|
142 |
* @return mixed
|
143 |
* @throws Exception
|
149 |
}
|
150 |
$reflector = new ReflectionClass( $concrete );
|
151 |
if( !$reflector->isInstantiable() ) {
|
152 |
+
throw new Exception( 'Target ['.$concrete.'] is not instantiable.' );
|
153 |
}
|
154 |
$constructor = $reflector->getConstructor();
|
155 |
if( empty( $constructor )) {
|
161 |
}
|
162 |
|
163 |
/**
|
164 |
+
* Resolve a class based dependency from the container
|
|
|
165 |
* @return mixed
|
166 |
* @throws Exception
|
167 |
*/
|
179 |
}
|
180 |
|
181 |
/**
|
182 |
+
* Resolve all of the dependencies from the ReflectionParameters
|
|
|
183 |
* @return array
|
184 |
*/
|
185 |
protected function resolveDependencies( array $dependencies )
|
194 |
}
|
195 |
|
196 |
/**
|
197 |
+
* Resolve a single ReflectionParameter dependency
|
|
|
198 |
* @return array|null
|
199 |
*/
|
200 |
protected function resolveDependency( ReflectionParameter $parameter )
|
plugin/Contracts/HooksContract.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Contracts;
|
4 |
+
|
5 |
+
interface HooksContract
|
6 |
+
{
|
7 |
+
/**
|
8 |
+
* @return void
|
9 |
+
*/
|
10 |
+
public function run();
|
11 |
+
}
|
plugin/Contracts/PartialContract.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Contracts;
|
4 |
+
|
5 |
+
interface PartialContract
|
6 |
+
{
|
7 |
+
/**
|
8 |
+
* @return void|string
|
9 |
+
*/
|
10 |
+
public function build( array $args = [] );
|
11 |
+
}
|
plugin/Contracts/ProviderContract.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Contracts;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
|
7 |
+
interface ProviderContract
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return void
|
11 |
+
*/
|
12 |
+
public function register( Application $app );
|
13 |
+
}
|
plugin/Contracts/ShortcodeContract.php
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Contracts;
|
4 |
+
|
5 |
+
interface ShortcodeContract
|
6 |
+
{
|
7 |
+
/**
|
8 |
+
* @params string|array $atts
|
9 |
+
* @return string
|
10 |
+
*/
|
11 |
+
public function buildShortcode( $atts = [] );
|
12 |
+
}
|
plugin/Controllers/AdminController.php
ADDED
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Commands\EnqueueAdminAssets;
|
7 |
+
use GeminiLabs\SiteReviews\Commands\RegisterTinymcePopups;
|
8 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
9 |
+
use GeminiLabs\SiteReviews\Database;
|
10 |
+
use GeminiLabs\SiteReviews\Database\CountsManager;
|
11 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
12 |
+
use GeminiLabs\SiteReviews\Database\SqlQueries;
|
13 |
+
use GeminiLabs\SiteReviews\Helper;
|
14 |
+
use GeminiLabs\SiteReviews\Modules\Console;
|
15 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
16 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
17 |
+
use GeminiLabs\SiteReviews\Modules\System;
|
18 |
+
|
19 |
+
class AdminController extends Controller
|
20 |
+
{
|
21 |
+
/**
|
22 |
+
* @return void
|
23 |
+
* @action admin_enqueue_scripts
|
24 |
+
*/
|
25 |
+
public function enqueueAssets()
|
26 |
+
{
|
27 |
+
$command = new EnqueueAdminAssets([
|
28 |
+
'pointers' => [[
|
29 |
+
'content' => __( 'You can pin exceptional reviews so that they are always shown first.', 'site-reviews' ),
|
30 |
+
'id' => 'glsr-pointer-pinned',
|
31 |
+
'position' => [
|
32 |
+
'edge' => 'right',
|
33 |
+
'align' => 'middle',
|
34 |
+
],
|
35 |
+
'screen' => Application::POST_TYPE,
|
36 |
+
'target' => '#misc-pub-pinned',
|
37 |
+
'title' => __( 'Pin Your Reviews', 'site-reviews' ),
|
38 |
+
]],
|
39 |
+
]);
|
40 |
+
$this->execute( $command );
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @return array
|
45 |
+
* @filter plugin_action_links_site-reviews/site-reviews.php
|
46 |
+
*/
|
47 |
+
public function filterActionLinks( array $links )
|
48 |
+
{
|
49 |
+
$links['settings'] = glsr( Builder::class )->a( __( 'Settings', 'site-reviews' ), [
|
50 |
+
'href' => admin_url( 'edit.php?post_type='.Application::POST_TYPE.'&page=settings' ),
|
51 |
+
]);
|
52 |
+
return $links;
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @param array $items
|
57 |
+
* @return array
|
58 |
+
* @filter dashboard_glance_items
|
59 |
+
*/
|
60 |
+
public function filterDashboardGlanceItems( $items )
|
61 |
+
{
|
62 |
+
$postCount = wp_count_posts( Application::POST_TYPE );
|
63 |
+
if( empty( $postCount->publish )) {
|
64 |
+
return $items;
|
65 |
+
}
|
66 |
+
$text = _n( '%s Review', '%s Reviews', $postCount->publish, 'site-reviews' );
|
67 |
+
$text = sprintf( $text, number_format_i18n( $postCount->publish ));
|
68 |
+
$items = glsr( Helper::class )->consolidateArray( $items );
|
69 |
+
$items[] = current_user_can( get_post_type_object( Application::POST_TYPE )->cap->edit_posts )
|
70 |
+
? glsr( Builder::class )->a( $text, [
|
71 |
+
'class' => 'glsr-review-count',
|
72 |
+
'href' => 'edit.php?post_type='.Application::POST_TYPE,
|
73 |
+
])
|
74 |
+
: glsr( Builder::class )->span( $text, [
|
75 |
+
'class' => 'glsr-review-count',
|
76 |
+
]);
|
77 |
+
return $items;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @param array $plugins
|
82 |
+
* @return array
|
83 |
+
* @filter mce_external_plugins
|
84 |
+
*/
|
85 |
+
public function filterTinymcePlugins( $plugins )
|
86 |
+
{
|
87 |
+
if( current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' )) {
|
88 |
+
$plugins = glsr( Helper::class )->consolidateArray( $plugins );
|
89 |
+
$plugins['glsr_shortcode'] = glsr()->url( 'assets/scripts/mce-plugin.js' );
|
90 |
+
}
|
91 |
+
return $plugins;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* @return void
|
96 |
+
* @action admin_init
|
97 |
+
*/
|
98 |
+
public function registerTinymcePopups()
|
99 |
+
{
|
100 |
+
$command = new RegisterTinymcePopups([
|
101 |
+
'site_reviews' => esc_html__( 'Recent Reviews', 'site-reviews' ),
|
102 |
+
'site_reviews_form' => esc_html__( 'Submit a Review', 'site-reviews' ),
|
103 |
+
'site_reviews_summary' => esc_html__( 'Summary of Reviews', 'site-reviews' ),
|
104 |
+
]);
|
105 |
+
$this->execute( $command );
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* @param string $editorId
|
110 |
+
* @return null|void
|
111 |
+
* @action media_buttons
|
112 |
+
*/
|
113 |
+
public function renderTinymceButton( $editorId )
|
114 |
+
{
|
115 |
+
$allowedEditors = apply_filters( 'site-reviews/tinymce/editor-ids', ['content'], $editorId );
|
116 |
+
if( glsr_current_screen()->base != 'post' || !in_array( $editorId, $allowedEditors ))return;
|
117 |
+
$shortcodes = [];
|
118 |
+
foreach( glsr()->mceShortcodes as $shortcode => $values ) {
|
119 |
+
$shortcodes[$shortcode] = $values;
|
120 |
+
}
|
121 |
+
if( empty( $shortcodes ))return;
|
122 |
+
glsr()->render( 'partials/editor/tinymce', [
|
123 |
+
'shortcodes' => $shortcodes,
|
124 |
+
]);
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* @return void
|
129 |
+
*/
|
130 |
+
public function routerClearConsole()
|
131 |
+
{
|
132 |
+
glsr( Console::class )->clear();
|
133 |
+
glsr( Notice::class )->addSuccess( __( 'Console cleared.', 'site-reviews' ));
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* @return void
|
138 |
+
*/
|
139 |
+
public function routerFetchConsole()
|
140 |
+
{
|
141 |
+
glsr( Notice::class )->addSuccess( __( 'Console reloaded.', 'site-reviews' ));
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* @param bool $showNotice
|
146 |
+
* @return void
|
147 |
+
*/
|
148 |
+
public function routerCountReviews( $showNotice = true )
|
149 |
+
{
|
150 |
+
$countManager = glsr( CountsManager::class );
|
151 |
+
$terms = glsr( Database::class )->getTerms( ['fields' => 'all'] );
|
152 |
+
foreach( $terms as $term ) {
|
153 |
+
$countManager->setTermCounts(
|
154 |
+
$term->term_id,
|
155 |
+
$countManager->buildTermCounts( $term->term_taxonomy_id )
|
156 |
+
);
|
157 |
+
}
|
158 |
+
$postIds = glsr( SqlQueries::class )->getReviewsMeta( 'assigned_to' );
|
159 |
+
foreach( $postIds as $postId ) {
|
160 |
+
$countManager->setPostCounts( $postId, $countManager->buildPostCounts( $postId ));
|
161 |
+
}
|
162 |
+
$countManager->setCounts( $countManager->buildCounts() );
|
163 |
+
if( $showNotice ) {
|
164 |
+
glsr( Notice::class )->clear()->addSuccess( __( 'Recalculated rating counts.', 'site-reviews' ));
|
165 |
+
}
|
166 |
+
glsr( OptionManager::class )->set( 'last_review_count', current_time( 'timestamp' ));
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* @return void
|
171 |
+
*/
|
172 |
+
public function routerDownloadConsole()
|
173 |
+
{
|
174 |
+
$this->download( Application::ID.'-console.txt', glsr( Console::class )->get() );
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* @return void
|
179 |
+
*/
|
180 |
+
public function routerDownloadSystemInfo()
|
181 |
+
{
|
182 |
+
$this->download( Application::ID.'-system-info.txt', glsr( System::class )->get() );
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* @return void
|
187 |
+
*/
|
188 |
+
public function routerExportSettings()
|
189 |
+
{
|
190 |
+
$this->download( Application::ID.'-settings.json', glsr( OptionManager::class )->json() );
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* @return void
|
195 |
+
*/
|
196 |
+
public function routerImportSettings()
|
197 |
+
{
|
198 |
+
$file = $_FILES['import-file'];
|
199 |
+
if( $file['error'] !== UPLOAD_ERR_OK ) {
|
200 |
+
return glsr( Notice::class )->addError( $this->getUploadError( $file['error'] ));
|
201 |
+
}
|
202 |
+
if( $file['type'] !== 'application/json' || !glsr( Helper::class )->endsWith( '.json', $file['name'] )) {
|
203 |
+
return glsr( Notice::class )->addError( __( 'Please use a valid Site Reviews settings file.', 'site-reviews' ));
|
204 |
+
}
|
205 |
+
$settings = json_decode( file_get_contents( $file['tmp_name'] ), true );
|
206 |
+
if( empty( $settings )) {
|
207 |
+
return glsr( Notice::class )->addWarning( __( 'There were no settings found to import.', 'site-reviews' ));
|
208 |
+
}
|
209 |
+
glsr( OptionManager::class )->set( glsr( OptionManager::class )->normalize( $settings ));
|
210 |
+
glsr( Notice::class )->addSuccess( __( 'Settings imported.', 'site-reviews' ));
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* @param int $errorCode
|
215 |
+
* @return string
|
216 |
+
*/
|
217 |
+
protected function getUploadError( $errorCode )
|
218 |
+
{
|
219 |
+
$errors = [
|
220 |
+
UPLOAD_ERR_INI_SIZE => __( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'site-reviews' ),
|
221 |
+
UPLOAD_ERR_FORM_SIZE => __( 'The uploaded file is too big.', 'site-reviews' ),
|
222 |
+
UPLOAD_ERR_PARTIAL => __( 'The uploaded file was only partially uploaded.', 'site-reviews' ),
|
223 |
+
UPLOAD_ERR_NO_FILE => __( 'No file was uploaded.', 'site-reviews' ),
|
224 |
+
UPLOAD_ERR_NO_TMP_DIR => __( 'Missing a temporary folder.', 'site-reviews' ),
|
225 |
+
UPLOAD_ERR_CANT_WRITE => __( 'Failed to write file to disk.', 'site-reviews' ),
|
226 |
+
UPLOAD_ERR_EXTENSION => __( 'A PHP extension stopped the file upload.', 'site-reviews' ),
|
227 |
+
];
|
228 |
+
return !isset( $errors[$errorCode] )
|
229 |
+
? __( 'Unknown upload error.', 'site-reviews' )
|
230 |
+
: $errors[$errorCode];
|
231 |
+
}
|
232 |
+
}
|
plugin/Controllers/AjaxController.php
CHANGED
@@ -1,144 +1,149 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Controllers;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\App;
|
14 |
-
use GeminiLabs\SiteReviews\Controllers\BaseController;
|
15 |
use GeminiLabs\SiteReviews\Commands\ChangeStatus;
|
16 |
use GeminiLabs\SiteReviews\Commands\TogglePinned;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
use WP_Query;
|
18 |
|
19 |
-
class AjaxController extends
|
20 |
{
|
21 |
/**
|
22 |
-
*
|
23 |
*/
|
24 |
-
public function
|
25 |
{
|
26 |
-
|
27 |
-
'post_id' => $request['ID'],
|
28 |
-
]));
|
29 |
}
|
30 |
|
31 |
/**
|
32 |
-
*
|
33 |
-
*
|
34 |
-
* @since 2.0.0
|
35 |
*/
|
36 |
-
public function
|
37 |
{
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Clears the log
|
44 |
-
*/
|
45 |
-
public function ajaxClearLog()
|
46 |
-
{
|
47 |
-
$this->app->make( 'Controllers\MainController' )->postClearLog();
|
48 |
-
wp_send_json([
|
49 |
-
'log' => __( 'Log is empty', 'site-reviews' ),
|
50 |
-
'notices' => $this->notices->show( false ),
|
51 |
]);
|
52 |
}
|
53 |
|
54 |
/**
|
55 |
-
*
|
56 |
*/
|
57 |
-
public function
|
58 |
{
|
59 |
-
|
60 |
-
wp_send_json_success(
|
|
|
|
|
61 |
}
|
62 |
|
63 |
/**
|
64 |
-
*
|
65 |
-
*
|
66 |
-
* @param array $request
|
67 |
*/
|
68 |
-
public function
|
69 |
{
|
70 |
$shortcode = $request['shortcode'];
|
71 |
$response = false;
|
72 |
-
if( array_key_exists( $shortcode,
|
73 |
-
$data =
|
74 |
if( !empty( $data['errors'] )) {
|
75 |
-
$data['btn_okay'] = [
|
76 |
}
|
77 |
$response = [
|
78 |
-
'body'
|
79 |
-
'close'
|
80 |
-
'ok'
|
81 |
'shortcode' => $shortcode,
|
82 |
-
'title'
|
83 |
];
|
84 |
}
|
85 |
-
|
86 |
}
|
87 |
|
88 |
/**
|
89 |
-
*
|
90 |
*/
|
91 |
-
public function
|
92 |
{
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
'
|
97 |
-
'message' => $response,
|
98 |
-
'recaptcha' => $session->get( "{$request['form_id']}-recaptcha", false, true ),
|
99 |
]);
|
100 |
}
|
101 |
|
102 |
/**
|
103 |
-
*
|
104 |
*/
|
105 |
-
public function
|
106 |
{
|
|
|
107 |
wp_send_json_success([
|
108 |
-
'empty' =>
|
109 |
-
'items' => $
|
110 |
]);
|
111 |
}
|
112 |
|
113 |
/**
|
114 |
-
*
|
115 |
*/
|
116 |
-
public function
|
117 |
{
|
118 |
if( empty( $request['exclude'] )) {
|
119 |
$request['exclude'] = [];
|
120 |
}
|
121 |
-
$results =
|
122 |
->search( $request['search'] )
|
123 |
->exclude()
|
124 |
->exclude( $request['exclude'] )
|
125 |
->renderResults();
|
126 |
wp_send_json_success([
|
127 |
-
'empty' =>
|
128 |
'items' => $results,
|
129 |
]);
|
130 |
}
|
131 |
|
132 |
/**
|
133 |
-
*
|
134 |
*/
|
135 |
-
public function
|
136 |
{
|
137 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
|
139 |
-
|
140 |
-
|
141 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
]);
|
143 |
}
|
144 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
|
|
|
|
|
5 |
use GeminiLabs\SiteReviews\Commands\ChangeStatus;
|
6 |
use GeminiLabs\SiteReviews\Commands\TogglePinned;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\AdminController;
|
8 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
9 |
+
use GeminiLabs\SiteReviews\Controllers\PublicController;
|
10 |
+
use GeminiLabs\SiteReviews\Database;
|
11 |
+
use GeminiLabs\SiteReviews\Modules\Console;
|
12 |
+
use GeminiLabs\SiteReviews\Modules\Html;
|
13 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
14 |
+
use GeminiLabs\SiteReviews\Modules\Session;
|
15 |
+
use GeminiLabs\SiteReviews\Modules\Translation;
|
16 |
use WP_Query;
|
17 |
|
18 |
+
class AjaxController extends Controller
|
19 |
{
|
20 |
/**
|
21 |
+
* @return void
|
22 |
*/
|
23 |
+
public function routerChangeStatus( array $request )
|
24 |
{
|
25 |
+
wp_send_json_success( $this->execute( new ChangeStatus( $request )));
|
|
|
|
|
26 |
}
|
27 |
|
28 |
/**
|
29 |
+
* @return void
|
|
|
|
|
30 |
*/
|
31 |
+
public function routerClearConsole()
|
32 |
{
|
33 |
+
glsr( AdminController::class )->routerClearConsole();
|
34 |
+
wp_send_json_success([
|
35 |
+
'console' => glsr( Console::class )->get(),
|
36 |
+
'notices' => glsr( Notice::class )->get(),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
]);
|
38 |
}
|
39 |
|
40 |
/**
|
41 |
+
* @return void
|
42 |
*/
|
43 |
+
public function routerCountReviews()
|
44 |
{
|
45 |
+
glsr( AdminController::class )->routerCountReviews();
|
46 |
+
wp_send_json_success([
|
47 |
+
'notices' => glsr( Notice::class )->get(),
|
48 |
+
]);
|
49 |
}
|
50 |
|
51 |
/**
|
52 |
+
* @return void
|
|
|
|
|
53 |
*/
|
54 |
+
public function routerMceShortcode( array $request )
|
55 |
{
|
56 |
$shortcode = $request['shortcode'];
|
57 |
$response = false;
|
58 |
+
if( array_key_exists( $shortcode, glsr()->mceShortcodes )) {
|
59 |
+
$data = glsr()->mceShortcodes[$shortcode];
|
60 |
if( !empty( $data['errors'] )) {
|
61 |
+
$data['btn_okay'] = [esc_html__( 'Okay', 'site-reviews' )];
|
62 |
}
|
63 |
$response = [
|
64 |
+
'body' => $data['fields'],
|
65 |
+
'close' => $data['btn_close'],
|
66 |
+
'ok' => $data['btn_okay'],
|
67 |
'shortcode' => $shortcode,
|
68 |
+
'title' => $data['title'],
|
69 |
];
|
70 |
}
|
71 |
+
wp_send_json_success( $response );
|
72 |
}
|
73 |
|
74 |
/**
|
75 |
+
* @return void
|
76 |
*/
|
77 |
+
public function routerFetchConsole()
|
78 |
{
|
79 |
+
glsr( AdminController::class )->routerFetchConsole();
|
80 |
+
wp_send_json_success([
|
81 |
+
'console' => glsr( Console::class )->get(),
|
82 |
+
'notices' => glsr( Notice::class )->get(),
|
|
|
|
|
83 |
]);
|
84 |
}
|
85 |
|
86 |
/**
|
87 |
+
* @return void
|
88 |
*/
|
89 |
+
public function routerSearchPosts( array $request )
|
90 |
{
|
91 |
+
$results = glsr( Database::class )->searchPosts( $request['search'] );
|
92 |
wp_send_json_success([
|
93 |
+
'empty' => '<div>'.__( 'Nothing found.', 'site-reviews' ).'</div>',
|
94 |
+
'items' => $results,
|
95 |
]);
|
96 |
}
|
97 |
|
98 |
/**
|
99 |
+
* @return void
|
100 |
*/
|
101 |
+
public function routerSearchTranslations( array $request )
|
102 |
{
|
103 |
if( empty( $request['exclude'] )) {
|
104 |
$request['exclude'] = [];
|
105 |
}
|
106 |
+
$results = glsr( Translation::class )
|
107 |
->search( $request['search'] )
|
108 |
->exclude()
|
109 |
->exclude( $request['exclude'] )
|
110 |
->renderResults();
|
111 |
wp_send_json_success([
|
112 |
+
'empty' => '<div>'.__( 'Nothing found.', 'site-reviews' ).'</div>',
|
113 |
'items' => $results,
|
114 |
]);
|
115 |
}
|
116 |
|
117 |
/**
|
118 |
+
* @return void
|
119 |
*/
|
120 |
+
public function routerSubmitReview( array $request )
|
121 |
{
|
122 |
+
$command = glsr( PublicController::class )->routerSubmitReview( $request );
|
123 |
+
$redirect = trim( strval( get_post_meta( $command->post_id, 'redirect_to', true )));
|
124 |
+
$redirect = apply_filters( 'site-reviews/review/redirect', $redirect, $command );
|
125 |
+
$data = [
|
126 |
+
'errors' => glsr( Session::class )->get( $command->form_id.'errors', false, true ),
|
127 |
+
'message' => glsr( Session::class )->get( $command->form_id.'message', '', true ),
|
128 |
+
'recaptcha' => glsr( Session::class )->get( $command->form_id.'recaptcha', false, true ),
|
129 |
+
'redirect' => $redirect,
|
130 |
+
];
|
131 |
+
if( $data['errors'] === false ) {
|
132 |
+
glsr( Session::class )->clear();
|
133 |
+
wp_send_json_success( $data );
|
134 |
+
}
|
135 |
+
wp_send_json_error( $data );
|
136 |
+
}
|
137 |
|
138 |
+
/**
|
139 |
+
* @return void
|
140 |
+
*/
|
141 |
+
public function routerTogglePinned( array $request )
|
142 |
+
{
|
143 |
+
$isPinned = $this->execute( new TogglePinned( $request ));
|
144 |
+
wp_send_json_success([
|
145 |
+
'notices' => glsr( Notice::class )->get(),
|
146 |
+
'pinned' => $isPinned,
|
147 |
]);
|
148 |
}
|
149 |
}
|
plugin/Controllers/BaseController.php
DELETED
@@ -1,138 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Controllers;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\App;
|
15 |
-
use InvalidArgumentException;
|
16 |
-
use WP_Error;
|
17 |
-
|
18 |
-
abstract class BaseController
|
19 |
-
{
|
20 |
-
/**
|
21 |
-
* @var App
|
22 |
-
*/
|
23 |
-
protected $app;
|
24 |
-
|
25 |
-
/**
|
26 |
-
* @var \GeminiLabs\SiteReviews\Database
|
27 |
-
*/
|
28 |
-
protected $db;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* @var \GeminiLabs\SiteReviews\Html
|
32 |
-
*/
|
33 |
-
protected $html;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @var \GeminiLabs\SiteReviews\Log\Logger
|
37 |
-
*/
|
38 |
-
protected $log;
|
39 |
-
|
40 |
-
/**
|
41 |
-
* @var \GeminiLabs\SiteReviews\Notices
|
42 |
-
*/
|
43 |
-
protected $notices;
|
44 |
-
|
45 |
-
public function __construct( App $app )
|
46 |
-
{
|
47 |
-
$this->app = $app;
|
48 |
-
$this->db = $app->make( 'Database' );
|
49 |
-
$this->html = $app->make( 'Html' );
|
50 |
-
$this->log = $app->make( 'Log\Logger' );
|
51 |
-
$this->notices = $app->make( 'Notices' );
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Send a command to its handler and execute it.
|
56 |
-
*
|
57 |
-
* @param object $command
|
58 |
-
*
|
59 |
-
* @return void|null|array|bool
|
60 |
-
*/
|
61 |
-
public function execute( $command )
|
62 |
-
{
|
63 |
-
$handlerClass = str_replace( 'Commands', 'Handlers', get_class( $command ));
|
64 |
-
|
65 |
-
if( !class_exists( $handlerClass )) {
|
66 |
-
throw new InvalidArgumentException( "Handler {$handlerClass} doesn't exist.");
|
67 |
-
}
|
68 |
-
|
69 |
-
$handler = $this->app->make( $handlerClass );
|
70 |
-
|
71 |
-
try {
|
72 |
-
return $handler->handle( $command );
|
73 |
-
}
|
74 |
-
catch( Exception $e ) {
|
75 |
-
status_header( 400 );
|
76 |
-
$this->notices->addError( new WP_Error( 'reviews_error', $e->getMessage() ));
|
77 |
-
$this->log->error( $e->getMessage() );
|
78 |
-
}
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Render a view and pass any provided data to the view
|
83 |
-
*
|
84 |
-
* @param string $view
|
85 |
-
* @return void
|
86 |
-
*/
|
87 |
-
public function render( $view, array $data = [] )
|
88 |
-
{
|
89 |
-
$data['db'] = $this->db;
|
90 |
-
$data['html'] = $this->html; // singleton
|
91 |
-
$data['log'] = $this->log;
|
92 |
-
$data['notices'] = $this->notices;
|
93 |
-
extract( $data );
|
94 |
-
return include $this->app->path.'views/base.php';
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Render a template and pass any provided data to the view
|
99 |
-
*
|
100 |
-
* @param string $view
|
101 |
-
* @return void
|
102 |
-
*/
|
103 |
-
public function renderTemplate( $view, array $data )
|
104 |
-
{
|
105 |
-
$path = $this->app->path.'views/'.$view.'.php';
|
106 |
-
if( !file_exists( $path ))return;
|
107 |
-
ob_start();
|
108 |
-
include $path;
|
109 |
-
$template = ob_get_clean();
|
110 |
-
foreach( $data as $key => $value ) {
|
111 |
-
if( is_array( $value ))continue;
|
112 |
-
$template = str_replace( sprintf( '{{ data.%s }}', $key ), esc_attr( $value ), $template );
|
113 |
-
}
|
114 |
-
echo $template;
|
115 |
-
}
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Validate form data
|
119 |
-
*
|
120 |
-
* @return bool
|
121 |
-
*/
|
122 |
-
public function validate( array $request, array $rules = [] )
|
123 |
-
{
|
124 |
-
$session = $this->app->make( 'Session' ); // singleton
|
125 |
-
$validator = $this->app->make( 'Validator' );
|
126 |
-
|
127 |
-
$errors = $validator->validate( $request, $rules );
|
128 |
-
|
129 |
-
if( empty( $errors )) {
|
130 |
-
return true;
|
131 |
-
}
|
132 |
-
|
133 |
-
$session->set( "{$request['form_id']}-errors", $errors );
|
134 |
-
$session->set( "{$request['form_id']}-values", $request );
|
135 |
-
|
136 |
-
return false;
|
137 |
-
}
|
138 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Controllers/BlocksController.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
+
|
9 |
+
class BlocksController extends Controller
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param array $categories
|
13 |
+
* @return array
|
14 |
+
* @filter block_categories
|
15 |
+
*/
|
16 |
+
public function filterBlockCategories( $categories )
|
17 |
+
{
|
18 |
+
$categories = glsr( Helper::class )->consolidateArray( $categories );
|
19 |
+
$categories[] = [
|
20 |
+
'icon' => null,
|
21 |
+
'slug' => Application::ID,
|
22 |
+
'title' => glsr()->name,
|
23 |
+
];
|
24 |
+
return $categories;
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @param array $editors
|
29 |
+
* @param string $postType
|
30 |
+
* @return array
|
31 |
+
* @filter classic_editor_enabled_editors_for_post_type
|
32 |
+
* @plugin classic-editor/classic-editor.php
|
33 |
+
*/
|
34 |
+
public function filterEnabledEditors( $editors, $postType )
|
35 |
+
{
|
36 |
+
return $postType == Application::POST_TYPE
|
37 |
+
? ['block_editor' => false, 'classic_editor' => false]
|
38 |
+
: $editors;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @param bool $bool
|
43 |
+
* @param string $postType
|
44 |
+
* @return bool
|
45 |
+
* @filter use_block_editor_for_post_type
|
46 |
+
*/
|
47 |
+
public function filterUseBlockEditor( $bool, $postType )
|
48 |
+
{
|
49 |
+
return $postType == Application::POST_TYPE
|
50 |
+
? false
|
51 |
+
: $bool;
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @return void
|
56 |
+
*/
|
57 |
+
public function registerAssets()
|
58 |
+
{
|
59 |
+
wp_register_style(
|
60 |
+
Application::ID.'/blocks',
|
61 |
+
glsr()->url( 'assets/styles/'.Application::ID.'-blocks.css' ),
|
62 |
+
['wp-edit-blocks'],
|
63 |
+
glsr()->version
|
64 |
+
);
|
65 |
+
wp_register_script(
|
66 |
+
Application::ID.'/blocks',
|
67 |
+
glsr()->url( 'assets/scripts/'.Application::ID.'-blocks.js' ),
|
68 |
+
['wp-api-fetch', 'wp-blocks', 'wp-i18n', 'wp-editor', 'wp-element', Application::ID],
|
69 |
+
glsr()->version
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @return void
|
75 |
+
* @action init
|
76 |
+
*/
|
77 |
+
public function registerBlocks()
|
78 |
+
{
|
79 |
+
$blocks = [
|
80 |
+
'form', 'reviews', 'summary',
|
81 |
+
];
|
82 |
+
foreach( $blocks as $block ) {
|
83 |
+
$id = str_replace( '_reviews', '', Application::ID.'_'.$block );
|
84 |
+
$blockClass = glsr( Helper::class )->buildClassName( $id.'-block', 'Blocks' );
|
85 |
+
if( !class_exists( $blockClass )) {
|
86 |
+
glsr_log()->error( sprintf( 'Class missing (%s)', $blockClass ));
|
87 |
+
continue;
|
88 |
+
}
|
89 |
+
glsr( $blockClass )->register( $block );
|
90 |
+
}
|
91 |
+
}
|
92 |
+
}
|
plugin/Controllers/Controller.php
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use Exception;
|
6 |
+
use GeminiLabs\SiteReviews\Application;
|
7 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
8 |
+
use InvalidArgumentException;
|
9 |
+
use WP_Error;
|
10 |
+
|
11 |
+
abstract class Controller
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @return void
|
15 |
+
*/
|
16 |
+
public function download( $filename, $content )
|
17 |
+
{
|
18 |
+
if( !current_user_can( glsr()->constant( 'CAPABILITY' )))return;
|
19 |
+
nocache_headers();
|
20 |
+
header( 'Content-Type: text/plain' );
|
21 |
+
header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
|
22 |
+
echo html_entity_decode( $content );
|
23 |
+
exit;
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @param object $command
|
28 |
+
* @return mixed
|
29 |
+
* @throws InvalidArgumentException
|
30 |
+
*/
|
31 |
+
public function execute( $command )
|
32 |
+
{
|
33 |
+
$handlerClass = str_replace( 'Commands', 'Handlers', get_class( $command ));
|
34 |
+
if( !class_exists( $handlerClass )) {
|
35 |
+
throw new InvalidArgumentException( 'Handler '.$handlerClass.' not found.' );
|
36 |
+
}
|
37 |
+
try {
|
38 |
+
return glsr( $handlerClass )->handle( $command );
|
39 |
+
}
|
40 |
+
catch( Exception $e ) {
|
41 |
+
status_header( 400 );
|
42 |
+
glsr( Notice::class )->addError( new WP_Error( 'site_reviews_error', $e->getMessage() ));
|
43 |
+
glsr_log()->error( $e->getMessage() );
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @return int
|
49 |
+
*/
|
50 |
+
protected function getPostId()
|
51 |
+
{
|
52 |
+
return intval( filter_input( INPUT_GET, 'post' ));
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @param int $postId
|
57 |
+
* @return bool
|
58 |
+
*/
|
59 |
+
protected function isReviewPostId( $postId )
|
60 |
+
{
|
61 |
+
return get_post_field( 'post_type', $postId ) == Application::POST_TYPE;
|
62 |
+
}
|
63 |
+
}
|
plugin/Controllers/EditorController.php
ADDED
@@ -0,0 +1,399 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController\Customization;
|
8 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController\Labels;
|
9 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController\Metaboxes;
|
10 |
+
use GeminiLabs\SiteReviews\Controllers\ListTableController\Columns;
|
11 |
+
use GeminiLabs\SiteReviews\Database;
|
12 |
+
use GeminiLabs\SiteReviews\Database\ReviewManager;
|
13 |
+
use GeminiLabs\SiteReviews\Helper;
|
14 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
15 |
+
use GeminiLabs\SiteReviews\Modules\Html\Template;
|
16 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
17 |
+
use GeminiLabs\SiteReviews\Review;
|
18 |
+
use WP_Post;
|
19 |
+
use WP_Screen;
|
20 |
+
|
21 |
+
class EditorController extends Controller
|
22 |
+
{
|
23 |
+
/**
|
24 |
+
* @return void
|
25 |
+
* @action admin_enqueue_scripts
|
26 |
+
*/
|
27 |
+
public function customizePostStatusLabels()
|
28 |
+
{
|
29 |
+
glsr( Labels::class )->customizePostStatusLabels();
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @param array $settings
|
34 |
+
* @return array
|
35 |
+
* @filter wp_editor_settings
|
36 |
+
*/
|
37 |
+
public function filterEditorSettings( $settings )
|
38 |
+
{
|
39 |
+
return glsr( Customization::class )->filterEditorSettings(
|
40 |
+
glsr( Helper::class )->consolidateArray( $settings )
|
41 |
+
);
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Modify the WP_Editor html to allow autosizing without breaking the `editor-expand` script
|
46 |
+
* @param string $html
|
47 |
+
* @return string
|
48 |
+
* @filter the_editor
|
49 |
+
*/
|
50 |
+
public function filterEditorTextarea( $html )
|
51 |
+
{
|
52 |
+
return glsr( Customization::class )->filterEditorTextarea( $html );
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @param string $translation
|
57 |
+
* @param string $test
|
58 |
+
* @param string $domain
|
59 |
+
* @return string
|
60 |
+
* @filter gettext
|
61 |
+
*/
|
62 |
+
public function filterPostStatusLabels( $translation, $text, $domain )
|
63 |
+
{
|
64 |
+
return glsr( Labels::class )->filterPostStatusLabels( $translation, $text, $domain );
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* @param string $translation
|
69 |
+
* @param string $test
|
70 |
+
* @param string $domain
|
71 |
+
* @return string
|
72 |
+
* @filter gettext_with_context
|
73 |
+
*/
|
74 |
+
public function filterPostStatusLabelsWithContext( $translation, $text, $context, $domain )
|
75 |
+
{
|
76 |
+
return glsr( Labels::class )->filterPostStatusLabels( $translation, $text, $domain );
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* @param array $messages
|
81 |
+
* @return array
|
82 |
+
* @filter post_updated_messages
|
83 |
+
*/
|
84 |
+
public function filterUpdateMessages( $messages )
|
85 |
+
{
|
86 |
+
return glsr( Labels::class )->filterUpdateMessages(
|
87 |
+
glsr( Helper::class )->consolidateArray( $messages )
|
88 |
+
);
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* @return void
|
93 |
+
* @action add_meta_boxes_{Application::POST_TYPE}
|
94 |
+
*/
|
95 |
+
public function registerMetaBoxes( $post )
|
96 |
+
{
|
97 |
+
add_meta_box( Application::ID.'_assigned_to', __( 'Assigned To', 'site-reviews' ), [$this, 'renderAssignedToMetabox'], null, 'side' );
|
98 |
+
add_meta_box( Application::ID.'_review', __( 'Details', 'site-reviews' ), [$this, 'renderDetailsMetaBox'], null, 'side' );
|
99 |
+
if( get_post_meta( $post->ID, 'review_type', true ) != 'local' )return;
|
100 |
+
add_meta_box( Application::ID.'_response', __( 'Respond Publicly', 'site-reviews' ), [$this, 'renderResponseMetaBox'], null, 'normal' );
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* @return void
|
105 |
+
* @action admin_print_scripts
|
106 |
+
*/
|
107 |
+
public function removeAutosave()
|
108 |
+
{
|
109 |
+
glsr( Customization::class )->removeAutosave();
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* @return void
|
114 |
+
* @action admin_menu
|
115 |
+
*/
|
116 |
+
public function removeMetaBoxes()
|
117 |
+
{
|
118 |
+
glsr( Customization::class )->removeMetaBoxes();
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* @return void
|
123 |
+
*/
|
124 |
+
public function removePostTypeSupport()
|
125 |
+
{
|
126 |
+
glsr( Customization::class )->removePostTypeSupport();
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* @return void
|
131 |
+
* @callback add_meta_box
|
132 |
+
*/
|
133 |
+
public function renderAssignedToMetabox( WP_Post $post )
|
134 |
+
{
|
135 |
+
if( !$this->isReviewPostType( $post ))return;
|
136 |
+
$assignedTo = (string)get_post_meta( $post->ID, 'assigned_to', true );
|
137 |
+
wp_nonce_field( 'assigned_to', '_nonce-assigned-to', false );
|
138 |
+
glsr()->render( 'partials/editor/metabox-assigned-to', [
|
139 |
+
'id' => $assignedTo,
|
140 |
+
'template' => $this->buildAssignedToTemplate( $assignedTo, $post ),
|
141 |
+
]);
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* @return void
|
146 |
+
* @callback add_meta_box
|
147 |
+
*/
|
148 |
+
public function renderDetailsMetaBox( WP_Post $post )
|
149 |
+
{
|
150 |
+
if( !$this->isReviewPostType( $post ))return;
|
151 |
+
$review = glsr( ReviewManager::class )->single( $post );
|
152 |
+
glsr()->render( 'partials/editor/metabox-details', [
|
153 |
+
'button' => $this->buildDetailsMetaBoxRevertButton( $review, $post ),
|
154 |
+
'metabox' => $this->normalizeDetailsMetaBox( $review ),
|
155 |
+
]);
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* @return void
|
160 |
+
* @action post_submitbox_misc_actions
|
161 |
+
*/
|
162 |
+
public function renderPinnedInPublishMetaBox()
|
163 |
+
{
|
164 |
+
if( !$this->isReviewPostType( get_post() ))return;
|
165 |
+
glsr( Template::class )->render( 'partials/editor/pinned', [
|
166 |
+
'context' => [
|
167 |
+
'no' => __( 'No', 'site-reviews' ),
|
168 |
+
'yes' => __( 'Yes', 'site-reviews' ),
|
169 |
+
],
|
170 |
+
'pinned' => wp_validate_boolean( get_post_meta( intval( get_the_ID() ), 'pinned', true )),
|
171 |
+
]);
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* @return void
|
176 |
+
* @callback add_meta_box
|
177 |
+
*/
|
178 |
+
public function renderResponseMetaBox( WP_Post $post )
|
179 |
+
{
|
180 |
+
if( !$this->isReviewPostType( $post ))return;
|
181 |
+
wp_nonce_field( 'response', '_nonce-response', false );
|
182 |
+
glsr()->render( 'partials/editor/metabox-response', [
|
183 |
+
'response' => get_post_meta( $post->ID, 'response', true ),
|
184 |
+
]);
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* @return void
|
189 |
+
* @action edit_form_after_title
|
190 |
+
*/
|
191 |
+
public function renderReviewEditor( WP_Post $post )
|
192 |
+
{
|
193 |
+
if( !$this->isReviewPostType( $post ) || $this->isReviewEditable( $post ))return;
|
194 |
+
glsr()->render( 'partials/editor/review', [
|
195 |
+
'post' => $post,
|
196 |
+
'response' => get_post_meta( $post->ID, 'response', true ),
|
197 |
+
]);
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* @return void
|
202 |
+
* @action admin_head
|
203 |
+
*/
|
204 |
+
public function renderReviewFields()
|
205 |
+
{
|
206 |
+
$screen = glsr_current_screen();
|
207 |
+
if( $screen->base != 'post' || $screen->post_type != Application::POST_TYPE )return;
|
208 |
+
add_action( 'edit_form_after_title', [$this, 'renderReviewEditor'] );
|
209 |
+
add_action( 'edit_form_top', [$this, 'renderReviewNotice'] );
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* @return void
|
214 |
+
* @action edit_form_top
|
215 |
+
*/
|
216 |
+
public function renderReviewNotice( WP_Post $post )
|
217 |
+
{
|
218 |
+
if( !$this->isReviewPostType( $post ) || $this->isReviewEditable( $post ))return;
|
219 |
+
glsr( Notice::class )->addWarning( sprintf(
|
220 |
+
__( '%s reviews are read-only.', 'site-reviews' ),
|
221 |
+
glsr( Columns::class )->buildColumnReviewType( $post->ID )
|
222 |
+
));
|
223 |
+
glsr( Template::class )->render( 'partials/editor/notice', [
|
224 |
+
'context' => [
|
225 |
+
'notices' => glsr( Notice::class )->get(),
|
226 |
+
],
|
227 |
+
]);
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* @return void
|
232 |
+
* @see glsr_categories_meta_box()
|
233 |
+
* @callback register_taxonomy
|
234 |
+
*/
|
235 |
+
public function renderTaxonomyMetabox( WP_Post $post )
|
236 |
+
{
|
237 |
+
if( !$this->isReviewPostType( $post ))return;
|
238 |
+
glsr()->render( 'partials/editor/metabox-categories', [
|
239 |
+
'post' => $post,
|
240 |
+
'tax_name' => Application::TAXONOMY,
|
241 |
+
'taxonomy' => get_taxonomy( Application::TAXONOMY ),
|
242 |
+
]);
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* @return void
|
247 |
+
* @see $this->filterUpdateMessages()
|
248 |
+
* @action admin_action_revert
|
249 |
+
*/
|
250 |
+
public function revertReview()
|
251 |
+
{
|
252 |
+
if( filter_input( INPUT_GET, 'plugin' ) != Application::ID )return;
|
253 |
+
check_admin_referer( 'revert-review_'.( $postId = $this->getPostId() ));
|
254 |
+
glsr( ReviewManager::class )->revert( $postId );
|
255 |
+
$this->redirect( $postId, 52 );
|
256 |
+
}
|
257 |
+
|
258 |
+
/**
|
259 |
+
* @param int $postId
|
260 |
+
* @return void
|
261 |
+
* @action save_post_.Application::POST_TYPE
|
262 |
+
*/
|
263 |
+
public function saveMetaboxes( $postId )
|
264 |
+
{
|
265 |
+
glsr( Metaboxes::class )->saveAssignedToMetabox( $postId );
|
266 |
+
glsr( Metaboxes::class )->saveResponseMetabox( $postId );
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
* @param string $assignedTo
|
271 |
+
* @return string
|
272 |
+
*/
|
273 |
+
protected function buildAssignedToTemplate( $assignedTo, WP_Post $post )
|
274 |
+
{
|
275 |
+
$assignedPost = glsr( Database::class )->getAssignedToPost( $post->ID, $assignedTo );
|
276 |
+
if( !( $assignedPost instanceof WP_Post ))return;
|
277 |
+
return glsr( Template::class )->build( 'partials/editor/assigned-post', [
|
278 |
+
'context' => [
|
279 |
+
'data.url' => (string)get_permalink( $assignedPost ),
|
280 |
+
'data.title' => get_the_title( $assignedPost ),
|
281 |
+
],
|
282 |
+
]);
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* @return string
|
287 |
+
*/
|
288 |
+
protected function buildDetailsMetaBoxRevertButton( Review $review, WP_Post $post )
|
289 |
+
{
|
290 |
+
$isModified = !glsr( Helper::class )->compareArrays(
|
291 |
+
[$review->title, $review->content, $review->date],
|
292 |
+
[
|
293 |
+
get_post_meta( $post->ID, 'title', true ),
|
294 |
+
get_post_meta( $post->ID, 'content', true ),
|
295 |
+
get_post_meta( $post->ID, 'date', true ),
|
296 |
+
]
|
297 |
+
);
|
298 |
+
if( $isModified ) {
|
299 |
+
$revertUrl = wp_nonce_url(
|
300 |
+
admin_url( 'post.php?post='.$post->ID.'&action=revert&plugin='.Application::ID ),
|
301 |
+
'revert-review_'.$post->ID
|
302 |
+
);
|
303 |
+
return glsr( Builder::class )->a( __( 'Revert Changes', 'site-reviews' ), [
|
304 |
+
'class' => 'button button-large',
|
305 |
+
'href' => $revertUrl,
|
306 |
+
'id' => 'revert',
|
307 |
+
]);
|
308 |
+
}
|
309 |
+
return glsr( Builder::class )->button( __( 'Nothing to Revert', 'site-reviews' ), [
|
310 |
+
'class' => 'button button-large',
|
311 |
+
'disabled' => true,
|
312 |
+
'id' => 'revert',
|
313 |
+
]);
|
314 |
+
}
|
315 |
+
|
316 |
+
/**
|
317 |
+
* @param object $review
|
318 |
+
* @return string|void
|
319 |
+
*/
|
320 |
+
protected function getReviewType( $review )
|
321 |
+
{
|
322 |
+
if( count( glsr()->reviewTypes ) < 2 )return;
|
323 |
+
$reviewType = array_key_exists( $review->review_type, glsr()->reviewTypes )
|
324 |
+
? glsr()->reviewTypes[$review->review_type]
|
325 |
+
: __( 'Unknown', 'site-reviews' );
|
326 |
+
if( !empty( $review->url )) {
|
327 |
+
$reviewType = glsr( Builder::class )->a( $reviewType, [
|
328 |
+
'href' => $review->url,
|
329 |
+
'target' => '_blank',
|
330 |
+
]);
|
331 |
+
}
|
332 |
+
return $reviewType;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* @return bool
|
337 |
+
*/
|
338 |
+
protected function isReviewEditable( WP_Post $post )
|
339 |
+
{
|
340 |
+
return $this->isReviewPostType( $post )
|
341 |
+
&& post_type_supports( Application::POST_TYPE, 'title' )
|
342 |
+
&& get_post_meta( $post->ID, 'review_type', true ) == 'local';
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* @param mixed $post
|
347 |
+
* @return bool
|
348 |
+
*/
|
349 |
+
protected function isReviewPostType( $post )
|
350 |
+
{
|
351 |
+
return $post instanceof WP_Post && $post->post_type == Application::POST_TYPE;
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* @return array
|
356 |
+
*/
|
357 |
+
protected function normalizeDetailsMetaBox( Review $review )
|
358 |
+
{
|
359 |
+
$user = empty( $review->user_id )
|
360 |
+
? __( 'Unregistered user', 'site-reviews' )
|
361 |
+
: glsr( Builder::class )->a( get_the_author_meta( 'display_name', $review->user_id ), [
|
362 |
+
'href' => get_author_posts_url( $review->user_id ),
|
363 |
+
]);
|
364 |
+
$email = empty( $review->email )
|
365 |
+
? '—'
|
366 |
+
: glsr( Builder::class )->a( $review->email, [
|
367 |
+
'href' => 'mailto:'.$review->email.'?subject='.esc_attr( __( 'RE:', 'site-reviews' ).' '.$review->title ),
|
368 |
+
]);
|
369 |
+
$metabox = [
|
370 |
+
__( 'Rating', 'site-reviews' ) => glsr_star_rating( $review->rating ),
|
371 |
+
__( 'Type', 'site-reviews' ) => $this->getReviewType( $review ),
|
372 |
+
__( 'Date', 'site-reviews' ) => get_date_from_gmt( $review->date, 'F j, Y' ),
|
373 |
+
__( 'Name', 'site-reviews' ) => $review->author,
|
374 |
+
__( 'Email', 'site-reviews' ) => $email,
|
375 |
+
__( 'User', 'site-reviews' ) => $user,
|
376 |
+
__( 'IP Address', 'site-reviews' ) => $review->ip_address,
|
377 |
+
__( 'Avatar', 'site-reviews' ) => sprintf( '<img src="%s" width="96">', $review->avatar ),
|
378 |
+
];
|
379 |
+
return array_filter( apply_filters( 'site-reviews/metabox/details', $metabox, $review ));
|
380 |
+
}
|
381 |
+
|
382 |
+
/**
|
383 |
+
* @param int $postId
|
384 |
+
* @param int $messageIndex
|
385 |
+
* @return void
|
386 |
+
*/
|
387 |
+
protected function redirect( $postId, $messageIndex )
|
388 |
+
{
|
389 |
+
$referer = wp_get_referer();
|
390 |
+
$hasReferer = !$referer
|
391 |
+
|| strpos( $referer, 'post.php' ) !== false
|
392 |
+
|| strpos( $referer, 'post-new.php' ) !== false;
|
393 |
+
$redirectUri = $hasReferer
|
394 |
+
? remove_query_arg( ['deleted', 'ids', 'trashed', 'untrashed'], $referer )
|
395 |
+
: get_edit_post_link( $postId );
|
396 |
+
wp_safe_redirect( add_query_arg( ['message' => $messageIndex], $redirectUri ));
|
397 |
+
exit;
|
398 |
+
}
|
399 |
+
}
|
plugin/Controllers/EditorController/Customization.php
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers\EditorController;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
|
7 |
+
class Customization
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
public function filterEditorSettings( array $settings )
|
13 |
+
{
|
14 |
+
if( $this->isReviewEditable() ) {
|
15 |
+
$settings = [
|
16 |
+
'media_buttons' => false,
|
17 |
+
'quicktags' => false,
|
18 |
+
'textarea_rows' => 12,
|
19 |
+
'tinymce' => false,
|
20 |
+
];
|
21 |
+
}
|
22 |
+
return $settings;
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @param string $html
|
27 |
+
* @return string
|
28 |
+
*/
|
29 |
+
public function filterEditorTextarea( $html )
|
30 |
+
{
|
31 |
+
if( $this->isReviewEditable() ) {
|
32 |
+
$html = str_replace( '<textarea', '<div id="ed_toolbar"></div><textarea', $html );
|
33 |
+
}
|
34 |
+
return $html;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @return void
|
39 |
+
*/
|
40 |
+
public function removeAutosave()
|
41 |
+
{
|
42 |
+
if( !$this->isReviewEditor() || $this->isReviewEditable() )return;
|
43 |
+
wp_deregister_script( 'autosave' );
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @return void
|
48 |
+
*/
|
49 |
+
public function removeMetaBoxes()
|
50 |
+
{
|
51 |
+
remove_meta_box( 'slugdiv', Application::POST_TYPE, 'advanced' );
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @return void
|
56 |
+
*/
|
57 |
+
public function removePostTypeSupport()
|
58 |
+
{
|
59 |
+
if( !$this->isReviewEditor() || $this->isReviewEditable() )return;
|
60 |
+
remove_post_type_support( Application::POST_TYPE, 'title' );
|
61 |
+
remove_post_type_support( Application::POST_TYPE, 'editor' );
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @return bool
|
66 |
+
*/
|
67 |
+
protected function isReviewEditable()
|
68 |
+
{
|
69 |
+
$postId = intval( filter_input( INPUT_GET, 'post' ));
|
70 |
+
return $postId > 0
|
71 |
+
&& get_post_meta( $postId, 'review_type', true ) == 'local'
|
72 |
+
&& $this->isReviewEditor();
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* @return bool
|
77 |
+
*/
|
78 |
+
protected function isReviewEditor()
|
79 |
+
{
|
80 |
+
$screen = glsr_current_screen();
|
81 |
+
return $screen->base == 'post'
|
82 |
+
&& $screen->id == Application::POST_TYPE
|
83 |
+
&& $screen->post_type == Application::POST_TYPE;
|
84 |
+
}
|
85 |
+
}
|
plugin/Controllers/EditorController/Labels.php
ADDED
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers\EditorController;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use WP_Post;
|
7 |
+
|
8 |
+
class Labels
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return void
|
12 |
+
*/
|
13 |
+
public function customizePostStatusLabels()
|
14 |
+
{
|
15 |
+
global $wp_scripts;
|
16 |
+
$strings = [
|
17 |
+
'savePending' => __( 'Save as Unapproved', 'site-reviews' ),
|
18 |
+
'published' => __( 'Approved', 'site-reviews' ),
|
19 |
+
];
|
20 |
+
if( $this->canModifyTranslation() && isset( $wp_scripts->registered['post']->extra['data'] )) {
|
21 |
+
$l10n = &$wp_scripts->registered['post']->extra['data'];
|
22 |
+
foreach( $strings as $search => $replace ) {
|
23 |
+
$l10n = preg_replace( '/("'.$search.'":")([^"]+)/', "$1".$replace, $l10n );
|
24 |
+
}
|
25 |
+
}
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @param string $translation
|
30 |
+
* @param string $test
|
31 |
+
* @param string $domain
|
32 |
+
* @return string
|
33 |
+
*/
|
34 |
+
public function filterPostStatusLabels( $translation, $text, $domain )
|
35 |
+
{
|
36 |
+
if( $this->canModifyTranslation( $domain )) {
|
37 |
+
$replacements = $this->getStatusLabels();
|
38 |
+
if( array_key_exists( $text, $replacements )) {
|
39 |
+
$translation = $replacements[$text];
|
40 |
+
}
|
41 |
+
}
|
42 |
+
return $translation;
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @return array
|
47 |
+
*/
|
48 |
+
public function filterUpdateMessages( array $messages )
|
49 |
+
{
|
50 |
+
$post = get_post();
|
51 |
+
if( !( $post instanceof WP_Post ))return;
|
52 |
+
$strings = $this->getReviewLabels();
|
53 |
+
$restored = filter_input( INPUT_GET, 'revision' );
|
54 |
+
if( $revisionTitle = wp_post_revision_title( intval( $restored ), false )) {
|
55 |
+
$restored = sprintf( $strings['restored'], $revisionTitle );
|
56 |
+
}
|
57 |
+
$scheduled_date = date_i18n( 'M j, Y @ H:i', strtotime( $post->post_date ));
|
58 |
+
$messages[ Application::POST_TYPE ] = [
|
59 |
+
1 => $strings['updated'],
|
60 |
+
4 => $strings['updated'],
|
61 |
+
5 => $restored,
|
62 |
+
6 => $strings['published'],
|
63 |
+
7 => $strings['saved'],
|
64 |
+
8 => $strings['submitted'],
|
65 |
+
9 => sprintf( $strings['scheduled'], '<strong>'.$scheduled_date.'</strong>' ),
|
66 |
+
10 => $strings['draft_updated'],
|
67 |
+
50 => $strings['approved'],
|
68 |
+
51 => $strings['unapproved'],
|
69 |
+
52 => $strings['reverted'],
|
70 |
+
];
|
71 |
+
return $messages;
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @param string $domain
|
76 |
+
* @return bool
|
77 |
+
*/
|
78 |
+
protected function canModifyTranslation( $domain = 'default' )
|
79 |
+
{
|
80 |
+
if( $domain != 'default' || empty( glsr_current_screen()->base )) {
|
81 |
+
return false;
|
82 |
+
}
|
83 |
+
return glsr_current_screen()->post_type == Application::POST_TYPE
|
84 |
+
&& in_array( glsr_current_screen()->base, ['edit', 'post'] );
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* @return array
|
89 |
+
*/
|
90 |
+
protected function getReviewLabels()
|
91 |
+
{
|
92 |
+
return [
|
93 |
+
'approved' => __( 'Review has been approved and published.', 'site-reviews' ),
|
94 |
+
'draft_updated' => __( 'Review draft updated.', 'site-reviews' ),
|
95 |
+
'preview' => __( 'Preview review', 'site-reviews' ),
|
96 |
+
'published' => __( 'Review approved and published.', 'site-reviews' ),
|
97 |
+
'restored' => __( 'Review restored to revision from %s.', 'site-reviews' ),
|
98 |
+
'reverted' => __( 'Review has been reverted to its original submission state.', 'site-reviews' ),
|
99 |
+
'saved' => __( 'Review saved.', 'site-reviews' ),
|
100 |
+
'scheduled' => __( 'Review scheduled for: %s.', 'site-reviews' ),
|
101 |
+
'submitted' => __( 'Review submitted.', 'site-reviews' ),
|
102 |
+
'unapproved' => __( 'Review has been unapproved and is now pending.', 'site-reviews' ),
|
103 |
+
'updated' => __( 'Review updated.', 'site-reviews' ),
|
104 |
+
'view' => __( 'View review', 'site-reviews' ),
|
105 |
+
];
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Store the labels to avoid unnecessary loops
|
110 |
+
* @return array
|
111 |
+
*/
|
112 |
+
protected function getStatusLabels()
|
113 |
+
{
|
114 |
+
static $labels;
|
115 |
+
if( empty( $labels )) {
|
116 |
+
$labels = [
|
117 |
+
'Pending' => __( 'Unapproved', 'site-reviews' ),
|
118 |
+
'Pending Review' => __( 'Unapproved', 'site-reviews' ),
|
119 |
+
'Privately Published' => __( 'Privately Approved', 'site-reviews' ),
|
120 |
+
'Publish' => __( 'Approve', 'site-reviews' ),
|
121 |
+
'Published' => __( 'Approved', 'site-reviews' ),
|
122 |
+
'Save as Pending' => __( 'Save as Unapproved', 'site-reviews' ),
|
123 |
+
];
|
124 |
+
}
|
125 |
+
return $labels;
|
126 |
+
}
|
127 |
+
}
|
plugin/Controllers/EditorController/Metaboxes.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers\EditorController;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Database\CountsManager;
|
6 |
+
use GeminiLabs\SiteReviews\Database\ReviewManager;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
+
|
9 |
+
class Metaboxes
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param int $postId
|
13 |
+
* @return void
|
14 |
+
*/
|
15 |
+
public function saveAssignedToMetabox( $postId )
|
16 |
+
{
|
17 |
+
if( !wp_verify_nonce( glsr( Helper::class )->filterInput( '_nonce-assigned-to' ), 'assigned_to' ))return;
|
18 |
+
$assignedTo = strval( glsr( Helper::class )->filterInput( 'assigned_to' ));
|
19 |
+
if( get_post_meta( $postId, 'assigned_to', true ) != $assignedTo ) {
|
20 |
+
$review = glsr( ReviewManager::class )->single( get_post( $postId ));
|
21 |
+
glsr( CountsManager::class )->decreasePostCounts( $review );
|
22 |
+
}
|
23 |
+
update_post_meta( $postId, 'assigned_to', $assignedTo );
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @param int $postId
|
28 |
+
* @return mixed
|
29 |
+
*/
|
30 |
+
public function saveResponseMetabox( $postId )
|
31 |
+
{
|
32 |
+
if( !wp_verify_nonce( glsr( Helper::class )->filterInput( '_nonce-response' ), 'response' ))return;
|
33 |
+
$response = strval( glsr( Helper::class )->filterInput( 'response' ));
|
34 |
+
update_post_meta( $postId, 'response', trim( wp_kses( $response, [
|
35 |
+
'a' => ['href' => [], 'title' => []],
|
36 |
+
'em' => [],
|
37 |
+
'strong' => [],
|
38 |
+
])));
|
39 |
+
}
|
40 |
+
}
|
plugin/Controllers/ListTableController.php
ADDED
@@ -0,0 +1,339 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\ListTableController\Columns;
|
8 |
+
use GeminiLabs\SiteReviews\Database;
|
9 |
+
use GeminiLabs\SiteReviews\Helper;
|
10 |
+
use GeminiLabs\SiteReviews\Modules\Html;
|
11 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
12 |
+
use WP_Post;
|
13 |
+
use WP_Query;
|
14 |
+
use WP_Screen;
|
15 |
+
|
16 |
+
class ListTableController extends Controller
|
17 |
+
{
|
18 |
+
/**
|
19 |
+
* @return void
|
20 |
+
* @action admin_action_approve
|
21 |
+
*/
|
22 |
+
public function approve()
|
23 |
+
{
|
24 |
+
if( filter_input( INPUT_GET, 'plugin' ) != Application::ID )return;
|
25 |
+
check_admin_referer( 'approve-review_'.( $postId = $this->getPostId() ));
|
26 |
+
wp_update_post([
|
27 |
+
'ID' => $postId,
|
28 |
+
'post_status' => 'publish',
|
29 |
+
]);
|
30 |
+
wp_safe_redirect( wp_get_referer() );
|
31 |
+
exit;
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* @param array $messages
|
36 |
+
* @return array
|
37 |
+
* @filter bulk_post_updated_messages
|
38 |
+
*/
|
39 |
+
public function filterBulkUpdateMessages( $messages, array $counts )
|
40 |
+
{
|
41 |
+
$messages = glsr( Helper::class )->consolidateArray( $messages );
|
42 |
+
$messages[Application::POST_TYPE] = [
|
43 |
+
'updated' => _n( '%s review updated.', '%s reviews updated.', $counts['updated'], 'site-reviews' ),
|
44 |
+
'locked' => _n( '%s review not updated, somebody is editing it.', '%s reviews not updated, somebody is editing them.', $counts['locked'], 'site-reviews' ),
|
45 |
+
'deleted' => _n( '%s review permanently deleted.', '%s reviews permanently deleted.', $counts['deleted'], 'site-reviews' ),
|
46 |
+
'trashed' => _n( '%s review moved to the Trash.', '%s reviews moved to the Trash.', $counts['trashed'], 'site-reviews' ),
|
47 |
+
'untrashed' => _n( '%s review restored from the Trash.', '%s reviews restored from the Trash.', $counts['untrashed'], 'site-reviews' ),
|
48 |
+
];
|
49 |
+
return $messages;
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @param array $columns
|
54 |
+
* @return array
|
55 |
+
* @filter manage_.Application::POST_TYPE._posts_columns
|
56 |
+
*/
|
57 |
+
public function filterColumnsForPostType( $columns )
|
58 |
+
{
|
59 |
+
$columns = glsr( Helper::class )->consolidateArray( $columns );
|
60 |
+
$postTypeColumns = glsr()->postTypeColumns[Application::POST_TYPE];
|
61 |
+
foreach( $postTypeColumns as $key => &$value ) {
|
62 |
+
if( !array_key_exists( $key, $columns ) || !empty( $value ))continue;
|
63 |
+
$value = $columns[$key];
|
64 |
+
}
|
65 |
+
if( count( glsr( Database::class )->getReviewsMeta( 'review_type' )) < 2 ) {
|
66 |
+
unset( $postTypeColumns['review_type'] );
|
67 |
+
}
|
68 |
+
return array_filter( $postTypeColumns, 'strlen' );
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @param string $status
|
73 |
+
* @return string
|
74 |
+
* @filter post_date_column_status
|
75 |
+
*/
|
76 |
+
public function filterDateColumnStatus( $status, WP_Post $post )
|
77 |
+
{
|
78 |
+
if( $post->post_type == Application::POST_TYPE ) {
|
79 |
+
$status = __( 'Submitted', 'site-reviews' );
|
80 |
+
}
|
81 |
+
return $status;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* @param array $hidden
|
86 |
+
* @return array
|
87 |
+
* @filter default_hidden_columns
|
88 |
+
*/
|
89 |
+
public function filterDefaultHiddenColumns( $hidden, WP_Screen $screen )
|
90 |
+
{
|
91 |
+
if( $screen->id == 'edit-'.Application::POST_TYPE ) {
|
92 |
+
$hidden = glsr( Helper::class )->consolidateArray( $hidden );
|
93 |
+
$hidden = ['reviewer'];
|
94 |
+
}
|
95 |
+
return $hidden;
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* @param array $postStates
|
100 |
+
* @return array
|
101 |
+
* @filter display_post_states
|
102 |
+
*/
|
103 |
+
public function filterPostStates( $postStates, WP_Post $post ) {
|
104 |
+
$postStates = glsr( Helper::class )->consolidateArray( $postStates );
|
105 |
+
if( $post->post_type == Application::POST_TYPE && array_key_exists( 'pending', $postStates )) {
|
106 |
+
$postStates['pending'] = __( 'Unapproved', 'site-reviews' );
|
107 |
+
}
|
108 |
+
return $postStates;
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* @param array $actions
|
113 |
+
* @return array
|
114 |
+
* @filter post_row_actions
|
115 |
+
*/
|
116 |
+
public function filterRowActions( $actions, WP_Post $post )
|
117 |
+
{
|
118 |
+
if( $post->post_type != Application::POST_TYPE || $post->post_status == 'trash' ) {
|
119 |
+
return $actions;
|
120 |
+
}
|
121 |
+
unset( $actions['inline hide-if-no-js'] ); //Remove Quick-edit
|
122 |
+
$rowActions = [
|
123 |
+
'approve' => esc_attr__( 'Approve', 'site-reviews' ),
|
124 |
+
'unapprove' => esc_attr__( 'Unapprove', 'site-reviews' ),
|
125 |
+
];
|
126 |
+
$newActions = [];
|
127 |
+
foreach( $rowActions as $key => $text ) {
|
128 |
+
$newActions[$key] = glsr( Builder::class )->a( $text, [
|
129 |
+
'aria-label' => sprintf( esc_attr_x( '%s this review', 'Approve the review', 'site-reviews' ), $text ),
|
130 |
+
'class' => 'glsr-change-status',
|
131 |
+
'href' => wp_nonce_url(
|
132 |
+
admin_url( 'post.php?post='.$post->ID.'&action='.$key.'&plugin='.Application::ID ),
|
133 |
+
$key.'-review_'.$post->ID
|
134 |
+
),
|
135 |
+
]);
|
136 |
+
}
|
137 |
+
return $newActions + glsr( Helper::class )->consolidateArray( $actions );
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* @param array $columns
|
142 |
+
* @return array
|
143 |
+
* @filter manage_edit-.Application::POST_TYPE._sortable_columns
|
144 |
+
*/
|
145 |
+
public function filterSortableColumns( $columns )
|
146 |
+
{
|
147 |
+
$columns = glsr( Helper::class )->consolidateArray( $columns );
|
148 |
+
$postTypeColumns = glsr()->postTypeColumns[Application::POST_TYPE];
|
149 |
+
unset( $postTypeColumns['cb'] );
|
150 |
+
foreach( $postTypeColumns as $key => $value ) {
|
151 |
+
if( glsr( Helper::class )->startsWith( 'taxonomy', $key ))continue;
|
152 |
+
$columns[$key] = $key;
|
153 |
+
}
|
154 |
+
return $columns;
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Customize the post_type status text
|
159 |
+
* @param string $translation
|
160 |
+
* @param string $single
|
161 |
+
* @param string $plural
|
162 |
+
* @param int $number
|
163 |
+
* @param string $domain
|
164 |
+
* @return string
|
165 |
+
* @filter ngettext
|
166 |
+
*/
|
167 |
+
public function filterStatusText( $translation, $single, $plural, $number, $domain )
|
168 |
+
{
|
169 |
+
if( $this->canModifyTranslation( $domain )) {
|
170 |
+
$strings = [
|
171 |
+
'Published' => __( 'Approved', 'site-reviews' ),
|
172 |
+
'Pending' => __( 'Unapproved', 'site-reviews' ),
|
173 |
+
];
|
174 |
+
foreach( $strings as $search => $replace ) {
|
175 |
+
if( strpos( $single, $search ) === false )continue;
|
176 |
+
$translation = $this->getTranslation([
|
177 |
+
'number' => $number,
|
178 |
+
'plural' => str_replace( $search, $replace, $plural ),
|
179 |
+
'single' => str_replace( $search, $replace, $single ),
|
180 |
+
]);
|
181 |
+
}
|
182 |
+
}
|
183 |
+
return $translation;
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* @param string $columnName
|
188 |
+
* @param string $postType
|
189 |
+
* @return void
|
190 |
+
* @action bulk_edit_custom_box
|
191 |
+
*/
|
192 |
+
public function renderBulkEditFields( $columnName, $postType )
|
193 |
+
{
|
194 |
+
if( $columnName == 'assigned_to' && $postType == Application::POST_TYPE ) {
|
195 |
+
glsr()->render( 'partials/editor/bulk-edit-assigned-to' );
|
196 |
+
};
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* @param string $postType
|
201 |
+
* @return void
|
202 |
+
* @action restrict_manage_posts
|
203 |
+
*/
|
204 |
+
public function renderColumnFilters( $postType )
|
205 |
+
{
|
206 |
+
glsr( Columns::class )->renderFilters( $postType );
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* @param string $column
|
211 |
+
* @param string $postId
|
212 |
+
* @return void
|
213 |
+
* @action manage_posts_custom_column
|
214 |
+
*/
|
215 |
+
public function renderColumnValues( $column, $postId )
|
216 |
+
{
|
217 |
+
glsr( Columns::class )->renderValues( $column, $postId );
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* @param int $postId
|
222 |
+
* @return void
|
223 |
+
* @action save_post_.Application::POST_TYPE
|
224 |
+
*/
|
225 |
+
public function saveBulkEditFields( $postId )
|
226 |
+
{
|
227 |
+
if( !current_user_can( 'edit_posts' ))return;
|
228 |
+
$assignedTo = filter_input( INPUT_GET, 'assigned_to' );
|
229 |
+
if( $assignedTo && get_post( $assignedTo )) {
|
230 |
+
update_post_meta( $postId, 'assigned_to', $assignedTo );
|
231 |
+
}
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* @return void
|
236 |
+
* @action pre_get_posts
|
237 |
+
*/
|
238 |
+
public function setQueryForColumn( WP_Query $query )
|
239 |
+
{
|
240 |
+
if( !$this->hasPermission( $query ))return;
|
241 |
+
$this->setMetaQuery( $query, [
|
242 |
+
'rating', 'review_type',
|
243 |
+
]);
|
244 |
+
$this->setOrderby( $query );
|
245 |
+
}
|
246 |
+
|
247 |
+
/**
|
248 |
+
* @return void
|
249 |
+
* @action admin_action_unapprove
|
250 |
+
*/
|
251 |
+
public function unapprove()
|
252 |
+
{
|
253 |
+
if( filter_input( INPUT_GET, 'plugin' ) != Application::ID )return;
|
254 |
+
check_admin_referer( 'unapprove-review_'.( $postId = $this->getPostId() ));
|
255 |
+
wp_update_post([
|
256 |
+
'ID' => $postId,
|
257 |
+
'post_status' => 'pending',
|
258 |
+
]);
|
259 |
+
wp_safe_redirect( wp_get_referer() );
|
260 |
+
exit;
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Check if the translation string can be modified
|
265 |
+
* @param string $domain
|
266 |
+
* @return bool
|
267 |
+
*/
|
268 |
+
protected function canModifyTranslation( $domain = 'default' )
|
269 |
+
{
|
270 |
+
$screen = glsr_current_screen();
|
271 |
+
return $domain == 'default'
|
272 |
+
&& $screen->base == 'edit'
|
273 |
+
&& $screen->post_type == Application::POST_TYPE;
|
274 |
+
}
|
275 |
+
|
276 |
+
/**
|
277 |
+
* Get the modified translation string
|
278 |
+
* @return string
|
279 |
+
*/
|
280 |
+
protected function getTranslation( array $args )
|
281 |
+
{
|
282 |
+
$defaults = [
|
283 |
+
'number' => 0,
|
284 |
+
'plural' => '',
|
285 |
+
'single' => '',
|
286 |
+
'text' => '',
|
287 |
+
];
|
288 |
+
$args = (object) wp_parse_args( $args, $defaults );
|
289 |
+
$translations = get_translations_for_domain( Application::ID );
|
290 |
+
return $args->text
|
291 |
+
? $translations->translate( $args->text )
|
292 |
+
: $translations->translate_plural( $args->single, $args->plural, $args->number );
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* @return bool
|
297 |
+
*/
|
298 |
+
protected function hasPermission( WP_Query $query )
|
299 |
+
{
|
300 |
+
global $pagenow;
|
301 |
+
return is_admin()
|
302 |
+
&& $query->is_main_query()
|
303 |
+
&& $query->get( 'post_type' ) == Application::POST_TYPE
|
304 |
+
&& $pagenow == 'edit.php';
|
305 |
+
}
|
306 |
+
|
307 |
+
/**
|
308 |
+
* @return void
|
309 |
+
*/
|
310 |
+
protected function setMetaQuery( WP_Query $query, array $metaKeys )
|
311 |
+
{
|
312 |
+
foreach( $metaKeys as $key ) {
|
313 |
+
if( !( $value = filter_input( INPUT_GET, $key )))continue;
|
314 |
+
$metaQuery = (array)$query->get( 'meta_query' );
|
315 |
+
$metaQuery[] = [
|
316 |
+
'key' => $key,
|
317 |
+
'value' => $value,
|
318 |
+
];
|
319 |
+
$query->set( 'meta_query', $metaQuery );
|
320 |
+
}
|
321 |
+
}
|
322 |
+
|
323 |
+
/**
|
324 |
+
* @return void
|
325 |
+
*/
|
326 |
+
protected function setOrderby( WP_Query $query )
|
327 |
+
{
|
328 |
+
$orderby = $query->get( 'orderby' );
|
329 |
+
$columns = glsr()->postTypeColumns[Application::POST_TYPE];
|
330 |
+
unset( $columns['cb'], $columns['title'], $columns['date'] );
|
331 |
+
if( in_array( $orderby, array_keys( $columns ))) {
|
332 |
+
if( $orderby == 'reviewer' ) {
|
333 |
+
$orderby = 'author';
|
334 |
+
}
|
335 |
+
$query->set( 'meta_key', $orderby );
|
336 |
+
$query->set( 'orderby', 'meta_value' );
|
337 |
+
}
|
338 |
+
}
|
339 |
+
}
|
plugin/Controllers/ListTableController/Columns.php
ADDED
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers\ListTableController;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
9 |
+
use WP_Post;
|
10 |
+
|
11 |
+
class Columns
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @param int $postId
|
15 |
+
* @return string
|
16 |
+
*/
|
17 |
+
public function buildColumnAssignedTo( $postId )
|
18 |
+
{
|
19 |
+
$assignedPost = glsr( Database::class )->getAssignedToPost( $postId );
|
20 |
+
$column = '—';
|
21 |
+
if( $assignedPost instanceof WP_Post && $assignedPost->post_status == 'publish' ) {
|
22 |
+
$column = glsr( Builder::class )->a( get_the_title( $assignedPost->ID ), [
|
23 |
+
'href' => (string)get_the_permalink( $assignedPost->ID ),
|
24 |
+
]);
|
25 |
+
}
|
26 |
+
return $column;
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @param int $postId
|
31 |
+
* @return string
|
32 |
+
*/
|
33 |
+
public function buildColumnPinned( $postId )
|
34 |
+
{
|
35 |
+
$pinned = get_post_meta( $postId, 'pinned', true )
|
36 |
+
? 'pinned '
|
37 |
+
: '';
|
38 |
+
return glsr( Builder::class )->i([
|
39 |
+
'class' => $pinned.'dashicons dashicons-sticky',
|
40 |
+
'data-id' => $postId,
|
41 |
+
]);
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @param int $postId
|
46 |
+
* @return string
|
47 |
+
*/
|
48 |
+
public function buildColumnReviewer( $postId )
|
49 |
+
{
|
50 |
+
return strval( get_post_meta( $postId, 'author', true ));
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @param int $postId
|
55 |
+
* @param null|int $rating
|
56 |
+
* @return string
|
57 |
+
*/
|
58 |
+
public function buildColumnRating( $postId )
|
59 |
+
{
|
60 |
+
return glsr_star_rating( intval( get_post_meta( $postId, 'rating', true )));
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @param int $postId
|
65 |
+
* @return string
|
66 |
+
*/
|
67 |
+
public function buildColumnReviewType( $postId )
|
68 |
+
{
|
69 |
+
$type = get_post_meta( $postId, 'review_type', true );
|
70 |
+
return array_key_exists( $type, glsr()->reviewTypes )
|
71 |
+
? glsr()->reviewTypes[$type]
|
72 |
+
: __( 'Unsupported Type', 'site-reviews' );
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* @param string $postType
|
77 |
+
* @return void
|
78 |
+
*/
|
79 |
+
public function renderFilters( $postType )
|
80 |
+
{
|
81 |
+
if( $postType !== Application::POST_TYPE )return;
|
82 |
+
if( !( $status = filter_input( INPUT_GET, 'post_status' ))) {
|
83 |
+
$status = 'publish';
|
84 |
+
}
|
85 |
+
$ratings = glsr( Database::class )->getReviewsMeta( 'rating', $status );
|
86 |
+
$types = glsr( Database::class )->getReviewsMeta( 'review_type', $status );
|
87 |
+
$this->renderFilterRatings( $ratings );
|
88 |
+
$this->renderFilterTypes( $types );
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* @param string $column
|
93 |
+
* @param int $postId
|
94 |
+
* @return void
|
95 |
+
*/
|
96 |
+
public function renderValues( $column, $postId )
|
97 |
+
{
|
98 |
+
$method = glsr( Helper::class )->buildMethodName( $column, 'buildColumn' );
|
99 |
+
echo method_exists( $this, $method )
|
100 |
+
? call_user_func( [$this, $method], $postId )
|
101 |
+
: apply_filters( 'site-reviews/columns/'.$column, '', $postId );
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* @param array $ratings
|
106 |
+
* @return void
|
107 |
+
*/
|
108 |
+
protected function renderFilterRatings( $ratings )
|
109 |
+
{
|
110 |
+
if( empty( $ratings ))return;
|
111 |
+
$ratings = array_flip( array_reverse( $ratings ));
|
112 |
+
array_walk( $ratings, function( &$value, $key ) {
|
113 |
+
$label = _n( '%s star', '%s stars', $key, 'site-reviews' );
|
114 |
+
$value = sprintf( $label, $key );
|
115 |
+
});
|
116 |
+
echo glsr( Builder::class )->label( __( 'Filter by rating', 'site-reviews' ), [
|
117 |
+
'class' => 'screen-reader-text',
|
118 |
+
'for' => 'rating',
|
119 |
+
]);
|
120 |
+
echo glsr( Builder::class )->select([
|
121 |
+
'name' => 'rating',
|
122 |
+
'options' => ['' => __( 'All ratings', 'site-reviews' )] + $ratings,
|
123 |
+
'value' => filter_input( INPUT_GET, 'rating' ),
|
124 |
+
]);
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* @param array $types
|
129 |
+
* @return void
|
130 |
+
*/
|
131 |
+
protected function renderFilterTypes( $types )
|
132 |
+
{
|
133 |
+
if( count( glsr()->reviewTypes ) < 2 )return;
|
134 |
+
echo glsr( Builder::class )->label( __( 'Filter by type', 'site-reviews' ), [
|
135 |
+
'class' => 'screen-reader-text',
|
136 |
+
'for' => 'review_type',
|
137 |
+
]);
|
138 |
+
echo glsr( Builder::class )->select([
|
139 |
+
'name' => 'review_type',
|
140 |
+
'options' => ['' => __( 'All types', 'site-reviews' )] + glsr()->reviewTypes,
|
141 |
+
'value' => filter_input( INPUT_GET, 'review_type' ),
|
142 |
+
]);
|
143 |
+
}
|
144 |
+
}
|
plugin/Controllers/MainController.php
CHANGED
@@ -1,363 +1,52 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Controllers;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
14 |
-
use GeminiLabs\SiteReviews\Commands\EnqueueAssets;
|
15 |
-
use GeminiLabs\SiteReviews\Commands\RegisterPointers;
|
16 |
use GeminiLabs\SiteReviews\Commands\RegisterPostType;
|
17 |
-
use GeminiLabs\SiteReviews\Commands\RegisterShortcodeButtons;
|
18 |
use GeminiLabs\SiteReviews\Commands\RegisterShortcodes;
|
19 |
use GeminiLabs\SiteReviews\Commands\RegisterTaxonomy;
|
20 |
use GeminiLabs\SiteReviews\Commands\RegisterWidgets;
|
21 |
-
use GeminiLabs\SiteReviews\Controllers\
|
22 |
-
use GeminiLabs\SiteReviews\
|
23 |
-
use
|
24 |
-
use
|
25 |
|
26 |
-
class MainController extends
|
27 |
{
|
28 |
/**
|
29 |
* @return void
|
30 |
-
*
|
31 |
-
* @action wp_enqueue_scripts
|
32 |
-
*/
|
33 |
-
public function enqueueAssets()
|
34 |
-
{
|
35 |
-
$command = new EnqueueAssets([
|
36 |
-
'handle' => $this->app->id,
|
37 |
-
'path' => $this->app->path . 'assets/',
|
38 |
-
'url' => $this->app->url . 'assets/',
|
39 |
-
'version' => $this->app->version,
|
40 |
-
]);
|
41 |
-
|
42 |
-
$this->execute( $command );
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @param string $postType
|
47 |
-
* @return array
|
48 |
-
* @filter classic_editor_enabled_editors_for_post_type
|
49 |
-
* @plugin classic-editor/classic-editor.php
|
50 |
-
*/
|
51 |
-
public function filterEnabledEditors( array $editors, $postType )
|
52 |
-
{
|
53 |
-
return $postType == App::POST_TYPE
|
54 |
-
? ['block_editor' => false, 'classic_editor' => false]
|
55 |
-
: $editors;
|
56 |
-
}
|
57 |
-
|
58 |
-
/**
|
59 |
-
* @return string
|
60 |
-
*
|
61 |
-
* @filter script_loader_tag
|
62 |
-
*/
|
63 |
-
public function filterEnqueuedScripts( $tag, $handle )
|
64 |
-
{
|
65 |
-
$scripts = [
|
66 |
-
$this->app->id.'/google-recaptcha',
|
67 |
-
// $this->app->id.'/polyfill',
|
68 |
-
];
|
69 |
-
if( in_array( $handle, apply_filters( 'site-reviews/async-scripts', $scripts ))) {
|
70 |
-
$tag = str_replace( ' src=', ' async src=', $tag );
|
71 |
-
}
|
72 |
-
if( in_array( $handle, apply_filters( 'site-reviews/defer-scripts', $scripts ))) {
|
73 |
-
$tag = str_replace( ' src=', ' defer src=', $tag );
|
74 |
-
}
|
75 |
-
return $tag;
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* @param bool $bool
|
80 |
-
* @param string $postType
|
81 |
-
* @return bool
|
82 |
-
* @filter use_block_editor_for_post_type
|
83 |
-
*/
|
84 |
-
public function filterUseBlockEditor( $bool, $postType )
|
85 |
-
{
|
86 |
-
return $postType == App::POST_TYPE
|
87 |
-
? false
|
88 |
-
: $bool;
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Clears the log
|
93 |
-
*
|
94 |
-
* @return void
|
95 |
-
*/
|
96 |
-
public function postClearLog()
|
97 |
-
{
|
98 |
-
$this->log->clear();
|
99 |
-
$this->notices->addSuccess( __( 'Log was cleared.', 'site-reviews' ));
|
100 |
-
}
|
101 |
-
|
102 |
-
/**
|
103 |
-
* Downloads the log
|
104 |
-
*
|
105 |
-
* @return void
|
106 |
-
*/
|
107 |
-
public function postDownloadLog()
|
108 |
-
{
|
109 |
-
$this->log->download();
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Downloads the system info
|
114 |
-
*
|
115 |
-
* @param string $system_info
|
116 |
-
*
|
117 |
-
* @return void
|
118 |
-
*/
|
119 |
-
public function postDownloadSystemInfo( $system_info )
|
120 |
-
{
|
121 |
-
$this->app->make( 'SystemInfo' )->download( $system_info );
|
122 |
-
}
|
123 |
-
|
124 |
-
/**
|
125 |
-
* Registers the plugin action links on the plugins page
|
126 |
-
*
|
127 |
-
* @return array
|
128 |
-
*
|
129 |
-
* @filter plugin_action_links_reviews/reviews.php
|
130 |
-
*/
|
131 |
-
public function registerActionLinks( array $links )
|
132 |
-
{
|
133 |
-
$settings_url = admin_url( 'edit.php?post_type=site-review&page=settings' );
|
134 |
-
|
135 |
-
$links[] = sprintf( '<a href="%s">%s</a>', $settings_url, __( 'Settings', 'site-reviews' ));
|
136 |
-
|
137 |
-
return $links;
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* Adds the reviews count to the "At a Glance" Dashboard widget
|
142 |
-
*
|
143 |
-
* @return array
|
144 |
-
*
|
145 |
-
* @filter dashboard_glance_items
|
146 |
-
*/
|
147 |
-
public function registerDashboardGlanceItems( array $items )
|
148 |
-
{
|
149 |
-
$post_type = App::POST_TYPE;
|
150 |
-
$num_posts = wp_count_posts( $post_type );
|
151 |
-
|
152 |
-
if( !isset( $num_posts->publish ) || !$num_posts->publish ) {
|
153 |
-
return $items;
|
154 |
-
}
|
155 |
-
|
156 |
-
$text = _n( '%s Review', '%s Reviews', $num_posts->publish, 'site-reviews' );
|
157 |
-
$text = sprintf( $text, number_format_i18n( $num_posts->publish ));
|
158 |
-
|
159 |
-
$post_type_object = get_post_type_object( $post_type );
|
160 |
-
|
161 |
-
$items[] = $post_type_object && current_user_can( $post_type_object->cap->edit_posts )
|
162 |
-
? sprintf( '<a class="glsr-review-count" href="edit.php?post_type=%s">%s</a>', $post_type, $text )
|
163 |
-
: sprintf( '<span class="glsr-review-count">%s</span>', $text );
|
164 |
-
|
165 |
-
return $items;
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* @return void
|
170 |
-
*
|
171 |
-
* @action admin_menu
|
172 |
-
*/
|
173 |
-
public function registerMenuCount()
|
174 |
-
{
|
175 |
-
global $menu, $typenow;
|
176 |
-
|
177 |
-
$post_type = App::POST_TYPE;
|
178 |
-
|
179 |
-
foreach( $menu as $key => $value ) {
|
180 |
-
if( !isset( $value[2] ) || $value[2] !== "edit.php?post_type={$post_type}" )continue;
|
181 |
-
|
182 |
-
$postCount = wp_count_posts( $post_type );
|
183 |
-
|
184 |
-
$menu[ $key ][0] .= sprintf( ' <span class="awaiting-mod count-%d"><span class="pending-count">%s</span></span>',
|
185 |
-
absint( $postCount->pending ),
|
186 |
-
number_format_i18n( $postCount->pending )
|
187 |
-
);
|
188 |
-
|
189 |
-
if( $typenow === $post_type ) {
|
190 |
-
$menu[ $key ][4] .= ' current';
|
191 |
-
}
|
192 |
-
|
193 |
-
break;
|
194 |
-
}
|
195 |
-
}
|
196 |
-
|
197 |
-
/**
|
198 |
-
* @param string $post_type
|
199 |
-
*
|
200 |
-
* @return void
|
201 |
-
*
|
202 |
-
* @action add_meta_boxes_review
|
203 |
-
*/
|
204 |
-
public function registerMetaBox( $post_type )
|
205 |
-
{
|
206 |
-
if( $post_type != App::POST_TYPE )return;
|
207 |
-
|
208 |
-
add_meta_box( "{$this->app->id}_assigned_to", __( 'Assigned To', 'site-reviews' ), [ $this, 'renderAssignedToMetabox'], null, 'side' );
|
209 |
-
add_meta_box( "{$this->app->id}_review", __( 'Details', 'site-reviews' ), [ $this, 'renderMetaBox'], null, 'side' );
|
210 |
-
add_meta_box( "{$this->app->id}_response", __( 'Respond Publicly', 'site-reviews' ), [ $this, 'renderResponseMetaBox'], null, 'normal' );
|
211 |
-
}
|
212 |
-
|
213 |
-
/**
|
214 |
-
* @return void
|
215 |
-
*
|
216 |
-
* @action admin_enqueue_scripts
|
217 |
-
*/
|
218 |
-
public function registerPointers()
|
219 |
-
{
|
220 |
-
$command = new RegisterPointers([[
|
221 |
-
'id' => 'glsr-pointer-pinned',
|
222 |
-
'screen' => App::POST_TYPE,
|
223 |
-
'target' => '#misc-pub-pinned',
|
224 |
-
'title' => __( 'Pin Your Reviews', 'site-reviews' ),
|
225 |
-
'content' => __( 'You can pin exceptional reviews so that they are always shown first in your widgets and shortcodes.', 'site-reviews' ),
|
226 |
-
'position' => [
|
227 |
-
'edge' => 'right', // top, bottom, left, right
|
228 |
-
'align' => 'middle', // top, bottom, left, right, middle
|
229 |
-
],
|
230 |
-
]]);
|
231 |
-
|
232 |
-
$this->execute( $command );
|
233 |
-
}
|
234 |
-
|
235 |
-
/**
|
236 |
-
* @return void
|
237 |
-
*
|
238 |
* @action init
|
239 |
*/
|
240 |
public function registerPostType()
|
241 |
{
|
242 |
-
if(
|
243 |
-
|
244 |
$command = new RegisterPostType([
|
245 |
-
'
|
246 |
-
'
|
247 |
-
|
248 |
-
|
249 |
-
'public' => false,
|
250 |
-
'has_archive' => false,
|
251 |
-
'show_ui' => true,
|
252 |
-
'labels' => glsr_resolve( 'Strings' )->post_type_labels(),
|
253 |
-
'columns' => [
|
254 |
-
'title' => '', // empty values use the default label
|
255 |
-
'category' => '',
|
256 |
'assigned_to' => __( 'Assigned To', 'site-reviews' ),
|
257 |
-
'reviewer'
|
258 |
-
'
|
259 |
-
'
|
260 |
-
'
|
261 |
-
'date'
|
262 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
]);
|
264 |
-
|
265 |
$this->execute( $command );
|
266 |
}
|
267 |
|
268 |
-
/**
|
269 |
-
* Add Approve/Unapprove links and remove Quick-edit
|
270 |
-
*
|
271 |
-
* @return array
|
272 |
-
*
|
273 |
-
* @filter post_row_actions
|
274 |
-
*/
|
275 |
-
public function registerRowActions( array $actions, WP_Post $post )
|
276 |
-
{
|
277 |
-
if( $post->post_type !== App::POST_TYPE || $post->post_status === 'trash' ) {
|
278 |
-
return $actions;
|
279 |
-
}
|
280 |
-
|
281 |
-
$atts = [
|
282 |
-
'approve' => [
|
283 |
-
'aria-label' => esc_attr__( 'Approve this review', 'site-reviews' ),
|
284 |
-
'href' => wp_nonce_url( admin_url( sprintf( 'post.php?post=%s&action=approve', $post->ID )), 'approve-review_' . $post->ID ),
|
285 |
-
'text' => __( 'Approve', 'site-reviews' ),
|
286 |
-
],
|
287 |
-
'unapprove' => [
|
288 |
-
'aria-label' => esc_attr__( 'Unapprove this review', 'site-reviews' ),
|
289 |
-
'href' => wp_nonce_url( admin_url( sprintf( 'post.php?post=%s&action=unapprove', $post->ID )), 'unapprove-review_' . $post->ID ),
|
290 |
-
'text' => __( 'Unapprove', 'site-reviews' ),
|
291 |
-
],
|
292 |
-
];
|
293 |
-
|
294 |
-
$newActions = [];
|
295 |
-
|
296 |
-
foreach( $atts as $key => $values ) {
|
297 |
-
$newActions[ $key ] = sprintf( '<a href="%s" class="change-%s-status" aria-label="%s">%s</a>',
|
298 |
-
$values['href'],
|
299 |
-
App::POST_TYPE,
|
300 |
-
$values['aria-label'],
|
301 |
-
$values['text']
|
302 |
-
);
|
303 |
-
}
|
304 |
-
|
305 |
-
// Remove Quick-edit
|
306 |
-
unset( $actions['inline hide-if-no-js'] );
|
307 |
-
|
308 |
-
return $newActions + $actions;
|
309 |
-
}
|
310 |
-
|
311 |
/**
|
312 |
* @return void
|
313 |
-
*
|
314 |
-
* @action admin_init
|
315 |
-
*/
|
316 |
-
public function registerSettings()
|
317 |
-
{
|
318 |
-
$optionName = $this->db->getOptionName();
|
319 |
-
|
320 |
-
$settings = apply_filters( 'site-reviews/settings', ['logging', 'settings'] );
|
321 |
-
|
322 |
-
foreach( $settings as $setting ) {
|
323 |
-
register_setting( sprintf( '%s-%s', $this->app->id, $setting ), $optionName, [ $this, 'sanitizeSettings' ] );
|
324 |
-
}
|
325 |
-
|
326 |
-
$this->app->make( 'Settings' )->register();
|
327 |
-
}
|
328 |
-
|
329 |
-
/**
|
330 |
-
* @return void
|
331 |
-
*
|
332 |
-
* @action admin_init
|
333 |
-
*/
|
334 |
-
public function registerShortcodeButtons()
|
335 |
-
{
|
336 |
-
$site_reviews = esc_html__( 'Recent Site Reviews', 'site-reviews' );
|
337 |
-
$site_reviews_summary = esc_html__( 'Site Reviews Summary', 'site-reviews' );
|
338 |
-
$site_reviews_form = esc_html__( 'Submit a Site Review', 'site-reviews' );
|
339 |
-
|
340 |
-
$command = new registerShortcodeButtons([
|
341 |
-
'site_reviews' => [
|
342 |
-
'title' => $site_reviews,
|
343 |
-
'label' => $site_reviews,
|
344 |
-
],
|
345 |
-
'site_reviews_summary' => [
|
346 |
-
'title' => $site_reviews_summary,
|
347 |
-
'label' => $site_reviews_summary,
|
348 |
-
],
|
349 |
-
'site_reviews_form' => [
|
350 |
-
'title' => $site_reviews_form,
|
351 |
-
'label' => $site_reviews_form,
|
352 |
-
],
|
353 |
-
]);
|
354 |
-
|
355 |
-
$this->execute( $command );
|
356 |
-
}
|
357 |
-
|
358 |
-
/**
|
359 |
-
* @return void
|
360 |
-
*
|
361 |
* @action init
|
362 |
*/
|
363 |
public function registerShortcodes()
|
@@ -367,514 +56,50 @@ class MainController extends BaseController
|
|
367 |
'site_reviews_form',
|
368 |
'site_reviews_summary',
|
369 |
]);
|
370 |
-
|
371 |
$this->execute( $command );
|
372 |
}
|
373 |
|
374 |
/**
|
375 |
* @return void
|
376 |
-
*
|
377 |
-
* @action admin_menu
|
378 |
-
*/
|
379 |
-
public function registerSubMenus()
|
380 |
-
{
|
381 |
-
$pages = [
|
382 |
-
'settings' => __( 'Settings', 'site-reviews' ),
|
383 |
-
'help' => __( 'Get Help', 'site-reviews' ),
|
384 |
-
'addons' => __( 'Add-Ons', 'site-reviews' ),
|
385 |
-
];
|
386 |
-
|
387 |
-
$pages = apply_filters( 'site-reviews/addon/submenu/pages', $pages );
|
388 |
-
|
389 |
-
foreach( $pages as $slug => $title ) {
|
390 |
-
|
391 |
-
$method = sprintf( 'render%sMenu', ucfirst( $slug ));
|
392 |
-
|
393 |
-
$callback = apply_filters( 'site-reviews/addon/submenu/callback', [ $this, $method ], $slug );
|
394 |
-
|
395 |
-
if( !is_callable( $callback ))continue;
|
396 |
-
|
397 |
-
add_submenu_page( sprintf( 'edit.php?post_type=%s', App::POST_TYPE ), $title, $title, App::CAPABILITY, $slug, $callback );
|
398 |
-
}
|
399 |
-
}
|
400 |
-
|
401 |
-
/**
|
402 |
-
* @return void
|
403 |
-
*
|
404 |
* @action init
|
405 |
*/
|
406 |
public function registerTaxonomy()
|
407 |
{
|
408 |
$command = new RegisterTaxonomy([
|
409 |
-
'hierarchical'
|
410 |
-
'meta_box_cb'
|
411 |
-
'public'
|
|
|
412 |
'show_admin_column' => true,
|
413 |
-
'
|
|
|
414 |
]);
|
415 |
-
|
416 |
$this->execute( $command );
|
417 |
}
|
418 |
|
419 |
/**
|
420 |
* @return void
|
421 |
-
*
|
422 |
* @action widgets_init
|
423 |
*/
|
424 |
public function registerWidgets()
|
425 |
{
|
426 |
$command = new RegisterWidgets([
|
427 |
'site-reviews' => [
|
428 |
-
'
|
429 |
-
'description' => __( 'Your site’s most recent
|
430 |
-
'
|
431 |
],
|
432 |
'site-reviews-form' => [
|
433 |
-
'
|
434 |
'description' => __( 'A "submit a review" form for your site.', 'site-reviews' ),
|
435 |
-
'
|
436 |
-
],
|
437 |
-
]);
|
438 |
-
|
439 |
-
$this->execute( $command );
|
440 |
-
}
|
441 |
-
|
442 |
-
/**
|
443 |
-
* add_submenu_page() callback
|
444 |
-
*
|
445 |
-
* @return void
|
446 |
-
*/
|
447 |
-
public function renderAddonsMenu()
|
448 |
-
{
|
449 |
-
$this->renderMenu( 'addons', [
|
450 |
-
'addons' => __( 'Add-Ons', 'site-reviews' ),
|
451 |
-
]);
|
452 |
-
}
|
453 |
-
|
454 |
-
/**
|
455 |
-
* register_taxonomy() 'meta_box_cb' callback
|
456 |
-
*
|
457 |
-
* @return void
|
458 |
-
*/
|
459 |
-
public function renderAssignedToMetabox( $post )
|
460 |
-
{
|
461 |
-
if( $post->post_type != App::POST_TYPE )return;
|
462 |
-
$assignedTo = (int) get_post_meta( $post->ID, 'assigned_to', true );
|
463 |
-
$template = '';
|
464 |
-
if( $assignedTo && $assignedPost = get_post( $assignedTo )) {
|
465 |
-
ob_start();
|
466 |
-
$this->renderTemplate( 'edit/assigned-post', [
|
467 |
-
'url' => get_permalink( $assignedPost ),
|
468 |
-
'title' => get_the_title( $assignedPost ),
|
469 |
-
]);
|
470 |
-
$template = ob_get_clean();
|
471 |
-
}
|
472 |
-
wp_nonce_field( 'assigned_to', '_nonce-assigned-to', false );
|
473 |
-
$this->render( 'edit/metabox-assigned-to', [
|
474 |
-
'id' => $assignedTo,
|
475 |
-
'template' => $template,
|
476 |
-
]);
|
477 |
-
}
|
478 |
-
|
479 |
-
/**
|
480 |
-
* add_submenu_page() callback
|
481 |
-
*
|
482 |
-
* @return void
|
483 |
-
*/
|
484 |
-
public function renderHelpMenu()
|
485 |
-
{
|
486 |
-
// allow addons to add their own help sections
|
487 |
-
$sections = apply_filters( 'site-reviews/addon/documentation/sections', [
|
488 |
-
'support' => __( 'Support', 'site-reviews' ),
|
489 |
-
'shortcodes' => __( 'Shortcodes', 'site-reviews' ),
|
490 |
-
'hooks' => __( 'Hooks', 'site-reviews' ),
|
491 |
-
'helpers' => __( 'Helper Functions', 'site-reviews' ),
|
492 |
-
]);
|
493 |
-
|
494 |
-
$this->renderMenu( 'help', [
|
495 |
-
'documentation' => [
|
496 |
-
'title' => __( 'Documentation', 'site-reviews' ),
|
497 |
-
'sections' => $sections,
|
498 |
],
|
499 |
-
'
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
}
|
504 |
-
|
505 |
-
/**
|
506 |
-
* @return void
|
507 |
-
*/
|
508 |
-
public function renderMenu( $page, $tabs, $data = [] )
|
509 |
-
{
|
510 |
-
$tabs = $this->normalizeTabs( $tabs );
|
511 |
-
$tab = $this->filterTab( $tabs );
|
512 |
-
$section = $this->filterSection( $tabs, $tab );
|
513 |
-
|
514 |
-
$defaults = [
|
515 |
-
'page' => $page,
|
516 |
-
'tabs' => $tabs,
|
517 |
-
'tabView' => $tab,
|
518 |
-
'tabViewSection' => $section,
|
519 |
-
];
|
520 |
-
|
521 |
-
$data = apply_filters( 'site-reviews/addon/menu/data', $data, $defaults );
|
522 |
-
|
523 |
-
$this->render( 'menu/index', wp_parse_args( $data, $defaults ));
|
524 |
-
}
|
525 |
-
|
526 |
-
/**
|
527 |
-
* add_meta_box() callback
|
528 |
-
*
|
529 |
-
* @return void
|
530 |
-
*/
|
531 |
-
public function renderMetaBox( WP_Post $post )
|
532 |
-
{
|
533 |
-
if( $post->post_type != App::POST_TYPE )return;
|
534 |
-
|
535 |
-
$review = glsr_resolve( 'Helper' )->get( 'review', $post->ID );
|
536 |
-
|
537 |
-
$this->render( 'edit/metabox-details', [
|
538 |
-
'button' => $this->getMetaboxButton( $post, $review ),
|
539 |
-
'metabox' => $this->getMetaboxDetails( $review ),
|
540 |
-
]);
|
541 |
-
}
|
542 |
-
|
543 |
-
/**
|
544 |
-
* @return void
|
545 |
-
* @action post_submitbox_misc_actions
|
546 |
-
*/
|
547 |
-
public function renderMetaBoxPinned()
|
548 |
-
{
|
549 |
-
$post = get_post();
|
550 |
-
if( !( $post instanceof WP_Post ) || $post->post_type != App::POST_TYPE )return;
|
551 |
-
$pinned = get_post_meta( $post->ID, 'pinned', true );
|
552 |
-
$this->render( 'edit/pinned', ['pinned' => $pinned ] );
|
553 |
-
}
|
554 |
-
|
555 |
-
/**
|
556 |
-
* add_meta_box() callback
|
557 |
-
*
|
558 |
-
* @return void
|
559 |
-
*/
|
560 |
-
public function renderResponseMetaBox( WP_Post $post )
|
561 |
-
{
|
562 |
-
if( $post->post_type != App::POST_TYPE )return;
|
563 |
-
|
564 |
-
$review = glsr_resolve( 'Helper' )->get( 'review', $post->ID );
|
565 |
-
|
566 |
-
wp_nonce_field( 'response', '_nonce-response', false );
|
567 |
-
|
568 |
-
$this->render( 'edit/metabox-response', [
|
569 |
-
'response' => $review->response,
|
570 |
-
]);
|
571 |
-
}
|
572 |
-
|
573 |
-
/**
|
574 |
-
* @return void
|
575 |
-
* @action admin_head
|
576 |
-
*/
|
577 |
-
public function renderReviewFields()
|
578 |
-
{
|
579 |
-
$screen = glsr_current_screen();
|
580 |
-
if( $screen->base != 'post' || $screen->post_type != App::POST_TYPE )return;
|
581 |
-
add_action( 'edit_form_after_title', [ $this, 'renderReviewEditor'] );
|
582 |
-
add_action( 'edit_form_top', [ $this, 'renderReviewNotice'] );
|
583 |
-
}
|
584 |
-
|
585 |
-
/**
|
586 |
-
* @return void
|
587 |
-
* @action edit_form_after_title
|
588 |
-
*/
|
589 |
-
public function renderReviewEditor( WP_Post $post )
|
590 |
-
{
|
591 |
-
if( $post->post_type != App::POST_TYPE )return;
|
592 |
-
if( post_type_supports( App::POST_TYPE, 'title' ))return;
|
593 |
-
if( get_post_meta( $post->ID, 'review_type', true ) == 'local' )return;
|
594 |
-
$this->render( 'edit/review', ['post' => $post ] );
|
595 |
-
}
|
596 |
-
|
597 |
-
/**
|
598 |
-
* @return void
|
599 |
-
* @action edit_form_top
|
600 |
-
*/
|
601 |
-
public function renderReviewNotice( WP_Post $post )
|
602 |
-
{
|
603 |
-
if( $post->post_type != App::POST_TYPE )return;
|
604 |
-
if( post_type_supports( App::POST_TYPE, 'title' ))return;
|
605 |
-
$reviewType = get_post_meta( $post->ID, 'review_type', true );
|
606 |
-
if( $reviewType == 'local' )return;
|
607 |
-
$this->notices->addWarning( __( 'This review is read-only.', 'site-reviews' ));
|
608 |
-
$this->render( 'edit/notice' );
|
609 |
-
}
|
610 |
-
|
611 |
-
/**
|
612 |
-
* @return void
|
613 |
-
*
|
614 |
-
* @action wp_footer
|
615 |
-
*/
|
616 |
-
public function renderSchema()
|
617 |
-
{
|
618 |
-
$this->app->make( 'Schema' )->render();
|
619 |
-
}
|
620 |
-
|
621 |
-
/**
|
622 |
-
* add_submenu_page() callback
|
623 |
-
*
|
624 |
-
* @return void
|
625 |
-
*/
|
626 |
-
public function renderSettingsMenu()
|
627 |
-
{
|
628 |
-
// allow addons to add their own setting sections
|
629 |
-
$sections = apply_filters( 'site-reviews/addon/settings/sections', [
|
630 |
-
'general' => __( 'General', 'site-reviews' ),
|
631 |
-
'reviews' => __( 'Reviews', 'site-reviews' ),
|
632 |
-
'reviews-form' => __( 'Submission Form', 'site-reviews' ),
|
633 |
-
'strings' => __( 'Translations', 'site-reviews' ),
|
634 |
-
]);
|
635 |
-
|
636 |
-
$this->renderMenu( 'settings', [
|
637 |
-
'settings' => [
|
638 |
-
'title' => __( 'Settings', 'site-reviews' ),
|
639 |
-
'sections' => $sections,
|
640 |
],
|
641 |
-
'licenses' => __( 'Licenses', 'site-reviews' ),
|
642 |
-
],[
|
643 |
-
'settings' => $this->app->getDefaultSettings(),
|
644 |
]);
|
645 |
-
|
646 |
-
|
647 |
-
/**
|
648 |
-
* register_taxonomy() 'meta_box_cb' callback
|
649 |
-
*
|
650 |
-
* @return void
|
651 |
-
*/
|
652 |
-
public function renderTaxonomyMetabox( $post, $box )
|
653 |
-
{
|
654 |
-
if( $post->post_type != App::POST_TYPE )return;
|
655 |
-
|
656 |
-
$taxonomy = isset( $box['args']['taxonomy'] )
|
657 |
-
? $box['args']['taxonomy']
|
658 |
-
: App::TAXONOMY;
|
659 |
-
|
660 |
-
$this->render( 'edit/metabox-categories', [
|
661 |
-
'post' => $post,
|
662 |
-
'tax_name' => esc_attr( $taxonomy ),
|
663 |
-
'taxonomy' => get_taxonomy( $taxonomy ),
|
664 |
-
]);
|
665 |
-
}
|
666 |
-
|
667 |
-
/**
|
668 |
-
* Adds the shortcode button above the TinyMCE Editor on add/edit screens
|
669 |
-
*
|
670 |
-
* @return null|void
|
671 |
-
*
|
672 |
-
* @action media_buttons
|
673 |
-
*/
|
674 |
-
public function renderTinymceButton()
|
675 |
-
{
|
676 |
-
if( glsr_current_screen()->base != 'post' || glsr_current_screen()->parent_base != 'edit' )return;
|
677 |
-
|
678 |
-
$shortcodes = [];
|
679 |
-
|
680 |
-
foreach( $this->app->mceShortcodes as $shortcode => $values ) {
|
681 |
-
if( !apply_filters( sanitize_title( $shortcode ) . '_condition', true ))continue;
|
682 |
-
$shortcodes[ $shortcode ] = $values;
|
683 |
-
}
|
684 |
-
|
685 |
-
if( empty( $shortcodes ))return;
|
686 |
-
|
687 |
-
$this->render( 'edit/tinymce', ['shortcodes' => $shortcodes ] );
|
688 |
-
}
|
689 |
-
|
690 |
-
/**
|
691 |
-
* register_setting() callback
|
692 |
-
* @param array $input
|
693 |
-
* @return array
|
694 |
-
*/
|
695 |
-
public function sanitizeSettings( $input )
|
696 |
-
{
|
697 |
-
if( !is_array( $input )) {
|
698 |
-
$input = ['settings' => []];
|
699 |
-
}
|
700 |
-
|
701 |
-
$key = key( $input );
|
702 |
-
$message = '';
|
703 |
-
|
704 |
-
if( $key == 'logging' ) {
|
705 |
-
$message = _n( 'Logging disabled.', 'Logging enabled.', (int) empty( $input[$key] ), 'site-reviews' );
|
706 |
-
}
|
707 |
-
else if( $key == 'settings' ) {
|
708 |
-
$message = __( 'Settings updated.', 'site-reviews' );
|
709 |
-
}
|
710 |
-
|
711 |
-
$message = apply_filters( 'site-reviews/settings/notice', $message, $key );
|
712 |
-
|
713 |
-
if( $message ) {
|
714 |
-
$this->notices->addSuccess( $message );
|
715 |
-
}
|
716 |
-
|
717 |
-
$options = array_replace_recursive( $this->db->getOptions(), $input );
|
718 |
-
|
719 |
-
if( isset( $input['settings']['reviews-form'] )) {
|
720 |
-
$reviewsForm = &$options['settings']['reviews-form'];
|
721 |
-
$reviewsForm['required'] = isset( $input['settings']['reviews-form']['required'] )
|
722 |
-
? $input['settings']['reviews-form']['required']
|
723 |
-
: [];
|
724 |
-
}
|
725 |
-
|
726 |
-
if( isset( $input['settings']['strings'] )) {
|
727 |
-
$options['settings']['strings'] = array_values( array_filter( $input['settings']['strings'] ));
|
728 |
-
$allowedTags = ['a' => ['class' => [], 'href' => [], 'target' => []]];
|
729 |
-
array_walk( $options['settings']['strings'], function( &$string ) use( $allowedTags ) {
|
730 |
-
if( isset( $string['s2'] )) {
|
731 |
-
$string['s2'] = wp_kses( $string['s2'], $allowedTags );
|
732 |
-
}
|
733 |
-
if( isset( $string['p2'] )) {
|
734 |
-
$string['p2'] = wp_kses( $string['p2'], $allowedTags );
|
735 |
-
}
|
736 |
-
});
|
737 |
-
}
|
738 |
-
return $options;
|
739 |
-
}
|
740 |
-
|
741 |
-
/**
|
742 |
-
* @return void
|
743 |
-
* @action admin_notices
|
744 |
-
*/
|
745 |
-
public function upgradeNotice() {
|
746 |
-
$dismissed = $this->db->getOption( 'upgrade_notice_dismissed', false );
|
747 |
-
$screen = glsr_current_screen();
|
748 |
-
$hideNotice = $dismissed && in_array( $screen->id, ['dashboard', 'plugins'] );
|
749 |
-
if( $hideNotice
|
750 |
-
|| !version_compare( PHP_VERSION, 5.6, '<' )
|
751 |
-
|| !in_array( $screen->id, [
|
752 |
-
'dashboard',
|
753 |
-
'plugins',
|
754 |
-
'edit-site-review',
|
755 |
-
'edit-site-review-category',
|
756 |
-
'site-review_page_settings',
|
757 |
-
'site-review_page_help',
|
758 |
-
])
|
759 |
-
)return;
|
760 |
-
$this->render( 'menu/notice' );
|
761 |
-
}
|
762 |
-
|
763 |
-
/**
|
764 |
-
* Gets the current menu page tab section
|
765 |
-
*
|
766 |
-
* @param string $tab
|
767 |
-
*
|
768 |
-
* @return string
|
769 |
-
*/
|
770 |
-
protected function filterSection( array $tabs, $tab )
|
771 |
-
{
|
772 |
-
$section = filter_input( INPUT_GET, 'section' );
|
773 |
-
|
774 |
-
if( !$section || !isset( $tabs[ $tab ]['sections'][ $section ] )) {
|
775 |
-
$section = isset( $tabs[ $tab ]['sections'] )
|
776 |
-
? key( $tabs[ $tab ]['sections'] )
|
777 |
-
: '';
|
778 |
-
}
|
779 |
-
|
780 |
-
return $section;
|
781 |
-
}
|
782 |
-
|
783 |
-
/**
|
784 |
-
* Gets the current menu page tab
|
785 |
-
*
|
786 |
-
* @return string
|
787 |
-
*/
|
788 |
-
protected function filterTab( array $tabs )
|
789 |
-
{
|
790 |
-
$tab = filter_input( INPUT_GET, 'tab' );
|
791 |
-
|
792 |
-
if( !$tab || !array_key_exists( $tab, $tabs )) {
|
793 |
-
$tab = key( $tabs );
|
794 |
-
}
|
795 |
-
|
796 |
-
return $tab;
|
797 |
-
}
|
798 |
-
|
799 |
-
/**
|
800 |
-
* Gets the metabox revert button
|
801 |
-
*
|
802 |
-
* @param object $review
|
803 |
-
*
|
804 |
-
* @return string
|
805 |
-
*/
|
806 |
-
protected function getMetaboxButton( WP_Post $post, $review )
|
807 |
-
{
|
808 |
-
$modified = false;
|
809 |
-
|
810 |
-
if( $post->post_title !== $review->title
|
811 |
-
|| $post->post_content !== $review->content
|
812 |
-
|| $post->post_date !== $review->date ) {
|
813 |
-
$modified = true;
|
814 |
-
}
|
815 |
-
|
816 |
-
$revertUrl = wp_nonce_url(
|
817 |
-
admin_url( sprintf( 'post.php?post=%s&action=revert', $post->ID )),
|
818 |
-
'revert-review_' . $post->ID
|
819 |
-
);
|
820 |
-
|
821 |
-
return !$modified
|
822 |
-
? sprintf( '<button id="revert" class="button button-large" disabled>%s</button>', __( 'Nothing to Revert', 'site-reviews' ))
|
823 |
-
: sprintf( '<a href="%s" id="revert" class="button button-large">%s</a>', $revertUrl, __( 'Revert Changes', 'site-reviews' ));
|
824 |
-
}
|
825 |
-
|
826 |
-
/**
|
827 |
-
* Gets the metabox details
|
828 |
-
*
|
829 |
-
* @param object $review
|
830 |
-
* @return array
|
831 |
-
*/
|
832 |
-
protected function getMetaboxDetails( $review )
|
833 |
-
{
|
834 |
-
$reviewTypeFallback = empty( $review->review_type )
|
835 |
-
? __( 'Unknown', 'site-reviews' )
|
836 |
-
: ucfirst( $review->review_type );
|
837 |
-
$reviewType = sprintf( __( '%s review', 'site-reviews' ),
|
838 |
-
glsr_resolve( 'Strings' )->review_types( $review->review_type, $reviewTypeFallback )
|
839 |
-
);
|
840 |
-
if( $review->url ) {
|
841 |
-
$reviewType = sprintf( '<a href="%s" target="_blank">%s</a>', $review->url, $reviewType );
|
842 |
-
}
|
843 |
-
$reviewer = $review->user_id
|
844 |
-
? sprintf( '<a href="%s">%s</a>', get_author_posts_url( $review->user_id ), get_the_author_meta( 'display_name', $review->user_id ))
|
845 |
-
: __( 'Unregistered user', 'site-reviews' );
|
846 |
-
$email = $review->email
|
847 |
-
? sprintf( '<a href="mailto:%1$s?subject=%3$s %2$s">%1$s</a>', $review->email, esc_attr( $review->title ), __( 'RE:', 'site-reviews' ))
|
848 |
-
: '—';
|
849 |
-
$metabox = [
|
850 |
-
__( 'Rating', 'site-reviews' ) => $this->html->renderPartial( 'star-rating', ['rating' => $review->rating] ),
|
851 |
-
__( 'Type', 'site-reviews' ) => $reviewType,
|
852 |
-
__( 'Date', 'site-reviews' ) => get_date_from_gmt( $review->date, 'F j, Y' ),
|
853 |
-
__( 'Reviewer', 'site-reviews' ) => $reviewer,
|
854 |
-
__( 'Name', 'site-reviews' ) => $review->author,
|
855 |
-
__( 'Email', 'site-reviews' ) => $email,
|
856 |
-
__( 'IP Address', 'site-reviews' ) => $review->ip_address,
|
857 |
-
__( 'Avatar', 'site-reviews' ) => sprintf( '<img src="%s" width="96">', $review->avatar ),
|
858 |
-
];
|
859 |
-
return apply_filters( 'site-reviews/metabox/details', $metabox, $review );
|
860 |
-
}
|
861 |
-
|
862 |
-
/**
|
863 |
-
* Normalize the tabs array
|
864 |
-
*
|
865 |
-
* @return array
|
866 |
-
*/
|
867 |
-
protected function normalizeTabs( array $tabs )
|
868 |
-
{
|
869 |
-
foreach( $tabs as $key => $value ) {
|
870 |
-
if( !is_array( $value )) {
|
871 |
-
$tabs[ $key ] = ['title' => $value ];
|
872 |
-
}
|
873 |
-
if( $key == 'licenses' && !apply_filters( 'site-reviews/addon/licenses', false )) {
|
874 |
-
unset( $tabs[ $key ] );
|
875 |
-
}
|
876 |
-
}
|
877 |
-
|
878 |
-
return $tabs;
|
879 |
}
|
880 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
|
|
|
|
6 |
use GeminiLabs\SiteReviews\Commands\RegisterPostType;
|
|
|
7 |
use GeminiLabs\SiteReviews\Commands\RegisterShortcodes;
|
8 |
use GeminiLabs\SiteReviews\Commands\RegisterTaxonomy;
|
9 |
use GeminiLabs\SiteReviews\Commands\RegisterWidgets;
|
10 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
11 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController;
|
12 |
+
use GeminiLabs\SiteReviews\Controllers\RestCategoryController;
|
13 |
+
use GeminiLabs\SiteReviews\Controllers\RestReviewController;
|
14 |
|
15 |
+
class MainController extends Controller
|
16 |
{
|
17 |
/**
|
18 |
* @return void
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
* @action init
|
20 |
*/
|
21 |
public function registerPostType()
|
22 |
{
|
23 |
+
if( !glsr()->hasPermission() )return;
|
|
|
24 |
$command = new RegisterPostType([
|
25 |
+
'capabilities'=> ['create_posts' => 'create_'.Application::POST_TYPE],
|
26 |
+
'columns' => [
|
27 |
+
'title' => '',
|
28 |
+
'category' => '',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
'assigned_to' => __( 'Assigned To', 'site-reviews' ),
|
30 |
+
'reviewer' => __( 'Author', 'site-reviews' ),
|
31 |
+
'review_type' => __( 'Type', 'site-reviews' ),
|
32 |
+
'rating' => __( 'Rating', 'site-reviews' ),
|
33 |
+
'pinned' => __( 'Pinned', 'site-reviews' ),
|
34 |
+
'date' => '',
|
35 |
],
|
36 |
+
'menu_icon' => 'dashicons-star-half',
|
37 |
+
'menu_name' => glsr()->name,
|
38 |
+
'map_meta_cap' => true,
|
39 |
+
'plural' => __( 'Reviews', 'site-reviews' ),
|
40 |
+
'post_type' => Application::POST_TYPE,
|
41 |
+
'rest_controller_class' => RestReviewController::class,
|
42 |
+
'show_in_rest' => true,
|
43 |
+
'single' => __( 'Review', 'site-reviews' ),
|
44 |
]);
|
|
|
45 |
$this->execute( $command );
|
46 |
}
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
/**
|
49 |
* @return void
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
* @action init
|
51 |
*/
|
52 |
public function registerShortcodes()
|
56 |
'site_reviews_form',
|
57 |
'site_reviews_summary',
|
58 |
]);
|
|
|
59 |
$this->execute( $command );
|
60 |
}
|
61 |
|
62 |
/**
|
63 |
* @return void
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
* @action init
|
65 |
*/
|
66 |
public function registerTaxonomy()
|
67 |
{
|
68 |
$command = new RegisterTaxonomy([
|
69 |
+
'hierarchical' => true,
|
70 |
+
'meta_box_cb' => [glsr( EditorController::class ), 'renderTaxonomyMetabox'],
|
71 |
+
'public' => false,
|
72 |
+
'rest_controller_class' => RestCategoryController::class,
|
73 |
'show_admin_column' => true,
|
74 |
+
'show_in_rest' => true,
|
75 |
+
'show_ui' => true,
|
76 |
]);
|
|
|
77 |
$this->execute( $command );
|
78 |
}
|
79 |
|
80 |
/**
|
81 |
* @return void
|
|
|
82 |
* @action widgets_init
|
83 |
*/
|
84 |
public function registerWidgets()
|
85 |
{
|
86 |
$command = new RegisterWidgets([
|
87 |
'site-reviews' => [
|
88 |
+
'class' => 'glsr-widget glsr-widget-site-reviews',
|
89 |
+
'description' => __( 'Your site’s most recent reviews.', 'site-reviews' ),
|
90 |
+
'title' => __( 'Recent Reviews', 'site-reviews' ),
|
91 |
],
|
92 |
'site-reviews-form' => [
|
93 |
+
'class' => 'glsr-widget glsr-widget-site-reviews-form',
|
94 |
'description' => __( 'A "submit a review" form for your site.', 'site-reviews' ),
|
95 |
+
'title' => __( 'Submit a Review', 'site-reviews' ),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
],
|
97 |
+
'site-reviews-summary' => [
|
98 |
+
'class' => 'glsr-widget glsr-widget-site-reviews-summary',
|
99 |
+
'description' => __( 'A summary of your site’s reviews.', 'site-reviews' ),
|
100 |
+
'title' => __( 'Summary of Reviews', 'site-reviews' ),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
],
|
|
|
|
|
|
|
102 |
]);
|
103 |
+
$this->execute( $command );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
}
|
105 |
}
|
plugin/Controllers/MenuController.php
ADDED
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Console;
|
9 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
10 |
+
use GeminiLabs\SiteReviews\Modules\Html\Settings;
|
11 |
+
use GeminiLabs\SiteReviews\Modules\Html\Template;
|
12 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
13 |
+
use GeminiLabs\SiteReviews\Modules\System;
|
14 |
+
|
15 |
+
class MenuController extends Controller
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* @return void
|
19 |
+
* @action admin_menu
|
20 |
+
*/
|
21 |
+
public function registerMenuCount()
|
22 |
+
{
|
23 |
+
global $menu, $typenow;
|
24 |
+
foreach( $menu as $key => $value ) {
|
25 |
+
if( !isset( $value[2] ) || $value[2] != 'edit.php?post_type='.Application::POST_TYPE )continue;
|
26 |
+
$postCount = wp_count_posts( Application::POST_TYPE );
|
27 |
+
$pendingCount = glsr( Builder::class )->span( number_format_i18n( $postCount->pending ), [
|
28 |
+
'class' => 'pending-count',
|
29 |
+
]);
|
30 |
+
$awaitingModeration = glsr( Builder::class )->span( $pendingCount, [
|
31 |
+
'class' => 'awaiting-mod count-'.$postCount->pending,
|
32 |
+
]);
|
33 |
+
$menu[$key][0] .= ' '.$awaitingModeration;
|
34 |
+
if( $typenow === Application::POST_TYPE ) {
|
35 |
+
$menu[$key][4].= ' current';
|
36 |
+
}
|
37 |
+
break;
|
38 |
+
}
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @return void
|
43 |
+
* @action admin_menu
|
44 |
+
*/
|
45 |
+
public function registerSubMenus()
|
46 |
+
{
|
47 |
+
$pages = $this->parseWithFilter( 'submenu/pages', [
|
48 |
+
'settings' => __( 'Settings', 'site-reviews' ),
|
49 |
+
'tools' => __( 'Tools', 'site-reviews' ),
|
50 |
+
'addons' => __( 'Add-ons', 'site-reviews' ),
|
51 |
+
'documentation' => __( 'Documentation', 'site-reviews' ),
|
52 |
+
]);
|
53 |
+
foreach( $pages as $slug => $title ) {
|
54 |
+
$method = glsr( Helper::class )->buildMethodName( 'render-'.$slug.'-menu' );
|
55 |
+
$callback = apply_filters( 'site-reviews/addon/submenu/callback', [$this, $method], $slug );
|
56 |
+
if( !is_callable( $callback ))continue;
|
57 |
+
add_submenu_page( 'edit.php?post_type='.Application::POST_TYPE, $title, $title, glsr()->constant( 'CAPABILITY' ), $slug, $callback );
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @return void
|
63 |
+
* @see $this->registerSubMenus()
|
64 |
+
* @callback add_submenu_page
|
65 |
+
*/
|
66 |
+
public function renderAddonsMenu()
|
67 |
+
{
|
68 |
+
$this->renderPage( 'addons', [
|
69 |
+
'template' => glsr( Template::class ),
|
70 |
+
]);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @return void
|
75 |
+
* @see $this->registerSubMenus()
|
76 |
+
* @callback add_submenu_page
|
77 |
+
*/
|
78 |
+
public function renderDocumentationMenu()
|
79 |
+
{
|
80 |
+
$tabs = $this->parseWithFilter( 'documentation/tabs', [
|
81 |
+
'support' => __( 'Support', 'site-reviews' ),
|
82 |
+
'faq' => __( 'FAQ', 'site-reviews' ),
|
83 |
+
'shortcodes' => __( 'Shortcodes', 'site-reviews' ),
|
84 |
+
'hooks' => __( 'Hooks', 'site-reviews' ),
|
85 |
+
'functions' => __( 'Functions', 'site-reviews' ),
|
86 |
+
'addons' => __( 'Addons', 'site-reviews' ),
|
87 |
+
]);
|
88 |
+
$addons = apply_filters( 'site-reviews/addon/documentation', [] );
|
89 |
+
ksort( $addons );
|
90 |
+
if( empty( $addons )) {
|
91 |
+
unset( $tabs['addons'] );
|
92 |
+
}
|
93 |
+
$this->renderPage( 'documentation', [
|
94 |
+
'addons' => $addons,
|
95 |
+
'tabs' => $tabs,
|
96 |
+
]);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* @return void
|
101 |
+
* @see $this->registerSubMenus()
|
102 |
+
* @callback add_submenu_page
|
103 |
+
*/
|
104 |
+
public function renderSettingsMenu()
|
105 |
+
{
|
106 |
+
$tabs = $this->parseWithFilter( 'settings/tabs', [
|
107 |
+
'general' => __( 'General', 'site-reviews' ),
|
108 |
+
'reviews' => __( 'Reviews', 'site-reviews' ),
|
109 |
+
'submissions' => __( 'Submissions', 'site-reviews' ),
|
110 |
+
'schema' => __( 'Schema', 'site-reviews' ),
|
111 |
+
'translations' => __( 'Translations', 'site-reviews' ),
|
112 |
+
'addons' => __( 'Addons', 'site-reviews' ),
|
113 |
+
'licenses' => __( 'Licenses', 'site-reviews' ),
|
114 |
+
]);
|
115 |
+
if( empty( glsr( Helper::class )->getPathValue( 'settings.addons', glsr()->defaults ))) {
|
116 |
+
unset( $tabs['addons'] );
|
117 |
+
}
|
118 |
+
if( empty( glsr( Helper::class )->getPathValue( 'settings.licenses', glsr()->defaults ))) {
|
119 |
+
unset( $tabs['licenses'] );
|
120 |
+
}
|
121 |
+
$this->renderPage( 'settings', [
|
122 |
+
'notices' => $this->getNotices(),
|
123 |
+
'settings' => glsr( Settings::class ),
|
124 |
+
'tabs' => $tabs,
|
125 |
+
]);
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* @return void
|
130 |
+
* @see $this->registerSubMenus()
|
131 |
+
* @callback add_submenu_page
|
132 |
+
*/
|
133 |
+
public function renderToolsMenu()
|
134 |
+
{
|
135 |
+
$tabs = $this->parseWithFilter( 'tools/tabs', [
|
136 |
+
'general' => __( 'General', 'site-reviews' ),
|
137 |
+
'sync' => __( 'Sync Reviews', 'site-reviews' ),
|
138 |
+
'console' => __( 'Console', 'site-reviews' ),
|
139 |
+
'system-info' => __( 'System Info', 'site-reviews' ),
|
140 |
+
]);
|
141 |
+
if( !apply_filters( 'site-reviews/addon/sync/enable', false )) {
|
142 |
+
unset( $tabs['sync'] );
|
143 |
+
}
|
144 |
+
$this->renderPage( 'tools', [
|
145 |
+
'data' => [
|
146 |
+
'context' => [
|
147 |
+
'base_url' => admin_url( 'edit.php?post_type='.Application::POST_TYPE ),
|
148 |
+
'console' => strval( glsr( Console::class )),
|
149 |
+
'id' => Application::ID,
|
150 |
+
'system' => strval( glsr( System::class )),
|
151 |
+
],
|
152 |
+
'services' => apply_filters( 'site-reviews/addon/sync/services', [] ),
|
153 |
+
],
|
154 |
+
'notices' => $this->getNotices(),
|
155 |
+
'tabs' => $tabs,
|
156 |
+
'template' => glsr( Template::class ),
|
157 |
+
]);
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* @return void
|
162 |
+
* @action admin_init
|
163 |
+
*/
|
164 |
+
public function setCustomPermissions()
|
165 |
+
{
|
166 |
+
foreach( wp_roles()->roles as $role => $value ) {
|
167 |
+
wp_roles()->remove_cap( $role, 'create_'.Application::POST_TYPE );
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* @return string
|
173 |
+
*/
|
174 |
+
protected function getNotices()
|
175 |
+
{
|
176 |
+
return glsr( Builder::class )->div( glsr( Notice::class )->get(), [
|
177 |
+
'id' => 'glsr-notices',
|
178 |
+
]);
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* @param string $hookSuffix
|
183 |
+
* @return array
|
184 |
+
*/
|
185 |
+
protected function parseWithFilter( $hookSuffix, array $args = [] )
|
186 |
+
{
|
187 |
+
return apply_filters( 'site-reviews/addon/'.$hookSuffix, $args );
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* @param string $page
|
192 |
+
* @return void
|
193 |
+
*/
|
194 |
+
protected function renderPage( $page, array $data = [] )
|
195 |
+
{
|
196 |
+
$data['http_referer'] = (string)wp_get_referer();
|
197 |
+
glsr()->render( 'pages/'.$page.'/index', $data );
|
198 |
+
}
|
199 |
+
}
|
plugin/Controllers/PublicController.php
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Commands\CreateReview;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
8 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
9 |
+
use GeminiLabs\SiteReviews\Handlers\EnqueuePublicAssets;
|
10 |
+
use GeminiLabs\SiteReviews\Helper;
|
11 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
12 |
+
use GeminiLabs\SiteReviews\Modules\Schema;
|
13 |
+
use GeminiLabs\SiteReviews\Modules\Style;
|
14 |
+
use GeminiLabs\SiteReviews\Modules\Validator\ValidateReview;
|
15 |
+
|
16 |
+
class PublicController extends Controller
|
17 |
+
{
|
18 |
+
/**
|
19 |
+
* @return void
|
20 |
+
* @action wp_enqueue_scripts
|
21 |
+
*/
|
22 |
+
public function enqueueAssets()
|
23 |
+
{
|
24 |
+
(new EnqueuePublicAssets)->handle();
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @param string $tag
|
29 |
+
* @param string $handle
|
30 |
+
* @return string
|
31 |
+
* @filter script_loader_tag
|
32 |
+
*/
|
33 |
+
public function filterEnqueuedScripts( $tag, $handle )
|
34 |
+
{
|
35 |
+
$scripts = [Application::ID.'/google-recaptcha'];
|
36 |
+
if( in_array( $handle, apply_filters( 'site-reviews/async-scripts', $scripts ))) {
|
37 |
+
$tag = str_replace( ' src=', ' async src=', $tag );
|
38 |
+
}
|
39 |
+
if( in_array( $handle, apply_filters( 'site-reviews/defer-scripts', $scripts ))) {
|
40 |
+
$tag = str_replace( ' src=', ' defer src=', $tag );
|
41 |
+
}
|
42 |
+
return $tag;
|
43 |
+
}
|
44 |
+
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @return array
|
48 |
+
* @filter site-reviews/config/forms/submission-form
|
49 |
+
*/
|
50 |
+
public function filterFieldOrder( array $config )
|
51 |
+
{
|
52 |
+
$order = (array)apply_filters( 'site-reviews/submission-form/order', array_keys( $config ));
|
53 |
+
return array_intersect_key( array_merge( array_flip( $order ), $config ), $config );
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* @param array $vars
|
58 |
+
* @return array
|
59 |
+
* @filter query_vars
|
60 |
+
*/
|
61 |
+
public function filterQueryVars( $vars )
|
62 |
+
{
|
63 |
+
$vars = glsr( Helper::class )->consolidateArray( $vars );
|
64 |
+
$vars[] = glsr()->constant( 'PAGED_QUERY_VAR' );
|
65 |
+
return $vars;
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* @param string $view
|
70 |
+
* @return string
|
71 |
+
* @filter site-reviews/render/view
|
72 |
+
*/
|
73 |
+
public function filterRenderView( $view )
|
74 |
+
{
|
75 |
+
return glsr( Style::class )->filterView( $view );
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* @return void
|
80 |
+
* @action site-reviews/builder
|
81 |
+
*/
|
82 |
+
public function modifyBuilder( Builder $instance )
|
83 |
+
{
|
84 |
+
call_user_func_array( [glsr( Style::class ), 'modifyField'], [&$instance] );
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* @return void
|
89 |
+
* @action wp_footer
|
90 |
+
*/
|
91 |
+
public function renderSchema()
|
92 |
+
{
|
93 |
+
glsr( Schema::class )->render();
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* @return CreateReview
|
98 |
+
*/
|
99 |
+
public function routerSubmitReview( array $request )
|
100 |
+
{
|
101 |
+
$validated = glsr( ValidateReview::class )->validate( $request );
|
102 |
+
$command = new CreateReview( $validated->request );
|
103 |
+
if( empty( $validated->error ) && !$validated->recaptchaIsUnset ) {
|
104 |
+
$this->execute( $command );
|
105 |
+
}
|
106 |
+
return $command;
|
107 |
+
}
|
108 |
+
}
|
plugin/Controllers/RestCategoryController.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use WP_Error;
|
7 |
+
use WP_REST_Request as Request;
|
8 |
+
use WP_REST_Response as Response;
|
9 |
+
use WP_REST_Server as Server;
|
10 |
+
use WP_REST_Term_Meta_Fields;
|
11 |
+
use WP_REST_Terms_Controller as RestController;
|
12 |
+
|
13 |
+
class RestCategoryController extends RestController
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->meta = new WP_REST_Term_Meta_Fields( Application::TAXONOMY );
|
18 |
+
$this->namespace = Application::ID.'/v1';
|
19 |
+
$this->rest_base = 'categories';
|
20 |
+
$this->taxonomy = Application::TAXONOMY;
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @return void
|
25 |
+
*/
|
26 |
+
public function register_routes()
|
27 |
+
{
|
28 |
+
register_rest_route( $this->namespace, '/'.$this->rest_base, [
|
29 |
+
[
|
30 |
+
'args' => $this->get_collection_params(),
|
31 |
+
'callback' => [$this, 'get_items'],
|
32 |
+
'methods' => Server::READABLE,
|
33 |
+
'permission_callback' => [$this, 'get_items_permissions_check'],
|
34 |
+
],
|
35 |
+
'schema' => [$this, 'get_public_item_schema'],
|
36 |
+
]);
|
37 |
+
}
|
38 |
+
}
|
plugin/Controllers/RestReviewController.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use WP_Error;
|
7 |
+
use WP_REST_Post_Meta_Fields;
|
8 |
+
use WP_REST_Posts_Controller as RestController;
|
9 |
+
use WP_REST_Request as Request;
|
10 |
+
use WP_REST_Response as Response;
|
11 |
+
use WP_REST_Server as Server;
|
12 |
+
|
13 |
+
class RestReviewController extends RestController
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->meta = new WP_REST_Post_Meta_Fields( Application::POST_TYPE );
|
18 |
+
$this->namespace = Application::ID.'/v1';
|
19 |
+
$this->post_type = Application::POST_TYPE;
|
20 |
+
$this->rest_base = 'reviews';
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @return void
|
25 |
+
*/
|
26 |
+
public function register_routes()
|
27 |
+
{
|
28 |
+
register_rest_route( $this->namespace, '/types', [
|
29 |
+
'callback' => [$this, 'get_types'],
|
30 |
+
'methods' => Server::READABLE,
|
31 |
+
]);
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* @return WP_Error|Response|mixed
|
36 |
+
*/
|
37 |
+
public function get_types()
|
38 |
+
{
|
39 |
+
$types = [];
|
40 |
+
foreach( glsr()->reviewTypes as $slug => $name ) {
|
41 |
+
$types[] = [
|
42 |
+
'name' => $name,
|
43 |
+
'slug' => $slug,
|
44 |
+
];
|
45 |
+
}
|
46 |
+
return rest_ensure_response( $types );
|
47 |
+
}
|
48 |
+
}
|
plugin/Controllers/ReviewController.php
CHANGED
@@ -1,736 +1,133 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Controllers;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
14 |
-
use GeminiLabs\SiteReviews\
|
15 |
-
use GeminiLabs\SiteReviews\
|
16 |
-
use GeminiLabs\SiteReviews\
|
|
|
|
|
17 |
use WP_Post;
|
18 |
-
use WP_Screen;
|
19 |
|
20 |
-
class ReviewController extends
|
21 |
{
|
22 |
/**
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
* @return void
|
|
|
24 |
*/
|
25 |
-
public function
|
26 |
{
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
}
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Remove the autosave functionality
|
40 |
-
*
|
41 |
-
* @return void
|
42 |
-
* @action admin_print_scripts
|
43 |
-
*/
|
44 |
-
public function modifyAutosave()
|
45 |
-
{
|
46 |
-
if( $this->isEditReview() && !$this->canEditReview() ) {
|
47 |
-
wp_deregister_script( 'autosave' );
|
48 |
}
|
49 |
-
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Modifies the WP_Editor settings
|
53 |
-
*
|
54 |
-
* @return array
|
55 |
-
* @filter wp_editor_settings
|
56 |
-
*/
|
57 |
-
public function modifyEditor( array $settings )
|
58 |
-
{
|
59 |
-
if( $this->canEditReview() ) {
|
60 |
-
$settings = [
|
61 |
-
'textarea_rows' => 12,
|
62 |
-
'media_buttons' => false,
|
63 |
-
'quicktags' => false,
|
64 |
-
'tinymce' => false,
|
65 |
-
];
|
66 |
}
|
67 |
-
|
68 |
-
return $settings;
|
69 |
}
|
70 |
|
71 |
/**
|
72 |
-
*
|
73 |
-
*
|
74 |
-
* @param string $html
|
75 |
-
* @return string
|
76 |
-
* @filter the_editor
|
77 |
-
*/
|
78 |
-
public function modifyEditorTextarea( $html )
|
79 |
-
{
|
80 |
-
if( $this->canEditReview() ) {
|
81 |
-
$html = str_replace( '<textarea', '<div id="ed_toolbar"></div><textarea', $html );
|
82 |
-
}
|
83 |
-
|
84 |
-
return $html;
|
85 |
-
}
|
86 |
-
|
87 |
-
/**
|
88 |
-
* Add a variable to query_vars for custom pagination
|
89 |
-
*
|
90 |
-
* @param array $vars
|
91 |
-
* @return array
|
92 |
-
* @filter query_vars
|
93 |
-
* @todo remove dirty hack
|
94 |
-
*/
|
95 |
-
public function modifyQueryVars( $vars )
|
96 |
-
{
|
97 |
-
$vars[] = App::PAGED_QUERY_VAR;
|
98 |
-
// dirty hack to fix a form submission with a field that has "name" as name
|
99 |
-
if( filter_input( INPUT_POST, 'action' ) == 'post-review'
|
100 |
-
&& !is_null( filter_input( INPUT_POST, 'gotcha' ))) {
|
101 |
-
$index = array_search( 'name', $vars, true );
|
102 |
-
if( false !== $index ) {
|
103 |
-
unset( $vars[$index] );
|
104 |
-
}
|
105 |
-
}
|
106 |
-
return $vars;
|
107 |
-
}
|
108 |
-
|
109 |
-
/**
|
110 |
-
* Remove post_type support for all non-local reviews
|
111 |
-
*
|
112 |
-
* @todo: Move this to addons
|
113 |
* @return void
|
114 |
-
* @action
|
115 |
*/
|
116 |
-
public function
|
117 |
{
|
118 |
-
if( $
|
119 |
-
|
120 |
-
)
|
121 |
-
|
122 |
-
remove_post_type_support( App::POST_TYPE, 'title' );
|
123 |
-
remove_post_type_support( App::POST_TYPE, 'editor' );
|
124 |
-
}
|
125 |
-
|
126 |
-
/**
|
127 |
-
* Customize the post_type status text
|
128 |
-
*
|
129 |
-
* @action admin_enqueue_scripts
|
130 |
-
*/
|
131 |
-
public function modifyLocalizedStatusText()
|
132 |
-
{
|
133 |
-
global $wp_scripts;
|
134 |
-
$strings = [
|
135 |
-
'savePending' => __( 'Save as Unapproved', 'site-reviews' ),
|
136 |
-
'published' => __( 'Approved', 'site-reviews' ),
|
137 |
-
];
|
138 |
-
if( $this->canModifyTranslation() && isset( $wp_scripts->registered['post']->extra['data'] )) {
|
139 |
-
$l10n = &$wp_scripts->registered['post']->extra['data'];
|
140 |
-
foreach( $strings as $search => $replace ) {
|
141 |
-
$l10n = preg_replace( '/("'.$search.'":")([^"]+)/', "$1".$replace, $l10n );
|
142 |
-
}
|
143 |
-
}
|
144 |
-
}
|
145 |
-
|
146 |
-
/**
|
147 |
-
* Customize the post_type status text
|
148 |
-
*
|
149 |
-
* @param string $translation
|
150 |
-
* @param string $test
|
151 |
-
* @param string $domain
|
152 |
-
* @return string
|
153 |
-
* @filter gettext
|
154 |
-
*/
|
155 |
-
public function modifyStatusText( $translation, $text, $domain )
|
156 |
-
{
|
157 |
-
if( $this->canModifyTranslation( $domain )) {
|
158 |
-
$replacements = [
|
159 |
-
'Save as Pending' => __( 'Save as Unapproved', 'site-reviews' ),
|
160 |
-
'Privately Published' => __( 'Privately Approved', 'site-reviews' ),
|
161 |
-
'Published' => __( 'Approved', 'site-reviews' ),
|
162 |
-
'Pending' => __( 'Unapproved', 'site-reviews' ),
|
163 |
-
'Pending Review' => __( 'Unapproved', 'site-reviews' ),
|
164 |
-
];
|
165 |
-
foreach( $replacements as $search => $replacement ) {
|
166 |
-
if( $translation != $search )continue;
|
167 |
-
$translation = $replacement;
|
168 |
-
}
|
169 |
-
}
|
170 |
-
return $translation;
|
171 |
-
}
|
172 |
-
|
173 |
-
/**
|
174 |
-
* Customize the post_type status text
|
175 |
-
*
|
176 |
-
* @param string $translation
|
177 |
-
* @param string $test
|
178 |
-
* @param string $domain
|
179 |
-
* @return string
|
180 |
-
* @filter gettext_with_context
|
181 |
-
*/
|
182 |
-
public function modifyStatusTextWithContext( $translation, $text, $context, $domain )
|
183 |
-
{
|
184 |
-
return $this->modifyStatusText( $translation, $text, $domain );
|
185 |
-
}
|
186 |
-
|
187 |
-
/**
|
188 |
-
* Customize the updated messages array for this post_type
|
189 |
-
*
|
190 |
-
* @return array
|
191 |
-
* @filter post_updated_messages
|
192 |
-
*/
|
193 |
-
public function modifyUpdateMessages( array $messages )
|
194 |
-
{
|
195 |
-
$post = get_post();
|
196 |
-
if( !( $post instanceof WP_Post ) || !$post->ID )return;
|
197 |
-
|
198 |
-
$strings = glsr_resolve( 'Strings' )->post_updated_messages();
|
199 |
-
|
200 |
-
$restored = filter_input( INPUT_GET, 'revision' );
|
201 |
-
if( $revisionTitle = wp_post_revision_title( (int) $restored, false )) {
|
202 |
-
$restored = sprintf( $strings['restored'], $revisionTitle );
|
203 |
}
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
$messages[ App::POST_TYPE ] = [
|
208 |
-
1 => $strings['updated'],
|
209 |
-
4 => $strings['updated'],
|
210 |
-
5 => $restored,
|
211 |
-
6 => $strings['published'],
|
212 |
-
7 => $strings['saved'],
|
213 |
-
8 => $strings['submitted'],
|
214 |
-
9 => sprintf( $strings['scheduled'], sprintf( '<strong>%s</strong>', $scheduled_date )),
|
215 |
-
10 => $strings['draft_updated'],
|
216 |
-
50 => $strings['approved'],
|
217 |
-
51 => $strings['unapproved'],
|
218 |
-
52 => $strings['reverted'],
|
219 |
-
];
|
220 |
-
|
221 |
-
return $messages;
|
222 |
-
}
|
223 |
-
|
224 |
-
/**
|
225 |
-
* Customize the bulk updated messages array for this post_type
|
226 |
-
*
|
227 |
-
* @return array
|
228 |
-
* @filter bulk_post_updated_messages
|
229 |
-
*/
|
230 |
-
public function modifyUpdateMessagesBulk( array $messages, array $counts )
|
231 |
-
{
|
232 |
-
$messages[ App::POST_TYPE ] = [
|
233 |
-
'updated' => _n( '%s review updated.', '%s reviews updated.', $counts['updated'], 'site-reviews' ),
|
234 |
-
'locked' => _n( '%s review not updated, somebody is editing it.', '%s reviews not updated, somebody is editing them.', $counts['locked'], 'site-reviews' ),
|
235 |
-
'deleted' => _n( '%s review permanently deleted.', '%s reviews permanently deleted.', $counts['deleted'], 'site-reviews' ),
|
236 |
-
'trashed' => _n( '%s review moved to the Trash.', '%s reviews moved to the Trash.', $counts['trashed'], 'site-reviews' ),
|
237 |
-
'untrashed' => _n( '%s review restored from the Trash.', '%s reviews restored from the Trash.', $counts['untrashed'], 'site-reviews' ),
|
238 |
-
];
|
239 |
-
|
240 |
-
return $messages;
|
241 |
-
}
|
242 |
-
|
243 |
-
/**
|
244 |
-
* @param array $post_data
|
245 |
-
* @param array $meta
|
246 |
-
* @param int $post_id
|
247 |
-
* @return void
|
248 |
-
*/
|
249 |
-
public function onCreateReview( $post_data, $meta, $post_id )
|
250 |
-
{
|
251 |
-
$review = get_post( $post_id );
|
252 |
-
if( !$review || $review->post_type !== App::POST_TYPE )return;
|
253 |
-
$this->updateAssignedToPost( $review );
|
254 |
-
}
|
255 |
-
|
256 |
-
/**
|
257 |
-
* @param int $post_id
|
258 |
-
* @return void
|
259 |
-
*/
|
260 |
-
public function onDeleteReview( $post_id )
|
261 |
-
{
|
262 |
-
$review = get_post( $post_id );
|
263 |
-
if( !$review || $review->post_type !== App::POST_TYPE )return;
|
264 |
-
$review->post_status = 'deleted'; // important to change the post_status here first!
|
265 |
-
$this->updateAssignedToPost( $review );
|
266 |
-
}
|
267 |
-
|
268 |
-
/**
|
269 |
-
* @param int $post_id
|
270 |
-
* @param WP_Post $review
|
271 |
-
* @return void
|
272 |
-
*/
|
273 |
-
public function onSaveReview( $post_id, $review )
|
274 |
-
{
|
275 |
-
$this->updateAssignedToPost( $review );
|
276 |
-
}
|
277 |
-
|
278 |
-
/**
|
279 |
-
* Submit the review form
|
280 |
-
*
|
281 |
-
* @return mixed
|
282 |
-
* @throws Exception
|
283 |
-
*/
|
284 |
-
public function postSubmitReview( array $request )
|
285 |
-
{
|
286 |
-
$session = $this->app->make( 'Session' );
|
287 |
-
|
288 |
-
// Validation
|
289 |
-
$validatedRequest = $this->validateSubmittedReview( $request );
|
290 |
-
if( !is_array( $validatedRequest )) {
|
291 |
-
return __( 'Please fix the submission errors.', 'site-reviews' );
|
292 |
-
}
|
293 |
-
// Custom validation
|
294 |
-
$customValidation = apply_filters( 'site-reviews/validate/review/submission', true, $validatedRequest );
|
295 |
-
if( $customValidation !== true ) {
|
296 |
-
$session->set( "{$validatedRequest['form_id']}-errors", [] );
|
297 |
-
$session->set( "{$validatedRequest['form_id']}-values", $validatedRequest );
|
298 |
-
return is_string( $customValidation )
|
299 |
-
? $customValidation
|
300 |
-
: __( 'The review submission failed. Please notify the site administrator.', 'site-reviews' );
|
301 |
-
}
|
302 |
-
// Honeypot validation
|
303 |
-
if( !empty( $validatedRequest['gotcha'] )) {
|
304 |
-
$session->set( "{$validatedRequest['form_id']}-errors", [] );
|
305 |
-
glsr_resolve( 'Log\Logger' )->warning( 'The Honeypot caught a bad submission:' );
|
306 |
-
glsr_resolve( 'Log\Logger' )->warning( $validatedRequest );
|
307 |
-
return __( 'The review submission failed. Please notify the site administrator.', 'site-reviews' );
|
308 |
-
}
|
309 |
-
// reCAPTCHA validation
|
310 |
-
$validateRecaptcha = $this->validateRecaptcha();
|
311 |
-
if( is_null( $validateRecaptcha )) {
|
312 |
-
// recaptcha response was empty so it hasn't been set yet
|
313 |
-
$session->set( "{$validatedRequest['form_id']}-recaptcha", true );
|
314 |
-
return;
|
315 |
-
}
|
316 |
-
if( !$validateRecaptcha ) {
|
317 |
-
$session->set( "{$validatedRequest['form_id']}-errors", [] );
|
318 |
-
$session->set( "{$validatedRequest['form_id']}-recaptcha", 'reset' );
|
319 |
-
return __( 'The reCAPTCHA verification failed. Please notify the site administrator.', 'site-reviews' );
|
320 |
-
}
|
321 |
-
|
322 |
-
$submitReview = new SubmitReview( $validatedRequest );
|
323 |
-
|
324 |
-
// Blacklist validation
|
325 |
-
if( $this->app->make( 'GeminiLabs\SiteReviews\Blacklist' )->isBlacklisted( $submitReview )) {
|
326 |
-
$blacklistAction = glsr_get_option( 'reviews-form.blacklist.action' );
|
327 |
-
if( $blacklistAction == 'unapprove' ) {
|
328 |
-
$submitReview->blacklisted = true;
|
329 |
-
}
|
330 |
-
if( $blacklistAction == 'reject' ) {
|
331 |
-
$session->set( "{$validatedRequest['form_id']}-errors", [] );
|
332 |
-
glsr_resolve( 'Log\Logger' )->warning( 'Blacklisted submission detected:' );
|
333 |
-
glsr_resolve( 'Log\Logger' )->warning( $validatedRequest );
|
334 |
-
return __( 'Your review cannot be submitted at this time.', 'site-reviews' );
|
335 |
-
}
|
336 |
-
}
|
337 |
-
|
338 |
-
// Akismet validation
|
339 |
-
if( $this->app->make( 'GeminiLabs\SiteReviews\Akismet' )->isSpam( $submitReview )) {
|
340 |
-
$session->set( "{$validatedRequest['form_id']}-errors", [] );
|
341 |
-
glsr_resolve( 'Log\Logger' )->warning( 'Akismet caught a spam submission:' );
|
342 |
-
glsr_resolve( 'Log\Logger' )->warning( $validatedRequest );
|
343 |
-
return __( 'Your review cannot be submitted at this time. Please try again later.', 'site-reviews' );
|
344 |
-
}
|
345 |
-
|
346 |
-
return $this->execute( $submitReview );
|
347 |
-
}
|
348 |
-
|
349 |
-
/**
|
350 |
-
* @return int|float
|
351 |
-
*/
|
352 |
-
public function recalculatePostAverage( array $reviews )
|
353 |
-
{
|
354 |
-
return apply_filters( 'site-reviews/average/rating',
|
355 |
-
$this->app->make( 'Rating' )->getAverage( $reviews ),
|
356 |
-
$reviews
|
357 |
-
);
|
358 |
-
}
|
359 |
-
|
360 |
-
/**
|
361 |
-
* @return int|float
|
362 |
-
*/
|
363 |
-
public function recalculatePostRanking( array $reviews )
|
364 |
-
{
|
365 |
-
return apply_filters( 'site-reviews/bayesian/ranking',
|
366 |
-
$this->app->make( 'Rating' )->getRankingImdb( $reviews ),
|
367 |
-
$reviews
|
368 |
-
);
|
369 |
-
}
|
370 |
-
|
371 |
-
/**
|
372 |
-
* @return void
|
373 |
-
* @action admin_menu
|
374 |
-
*/
|
375 |
-
public function removeMetaBoxes()
|
376 |
-
{
|
377 |
-
remove_meta_box( 'slugdiv', App::POST_TYPE, 'advanced' );
|
378 |
-
}
|
379 |
-
|
380 |
-
/**
|
381 |
-
* @param string $columnName
|
382 |
-
* @param string $postType
|
383 |
-
* @return void
|
384 |
-
* @action bulk_edit_custom_box
|
385 |
-
*/
|
386 |
-
public function renderBulkEditFields( $columnName, $postType )
|
387 |
-
{
|
388 |
-
if( $columnName == 'assigned_to' && $postType == App::POST_TYPE ) {
|
389 |
-
$this->render( 'edit/bulk-edit-assigned-to' );
|
390 |
-
};
|
391 |
-
}
|
392 |
-
|
393 |
-
/**
|
394 |
-
* @return void
|
395 |
-
*/
|
396 |
-
public function revert()
|
397 |
-
{
|
398 |
-
check_admin_referer( 'revert-review_' . ( $post_id = $this->getPostId() ));
|
399 |
-
|
400 |
-
$this->db->revertReview( $post_id );
|
401 |
-
|
402 |
-
$this->redirect( $post_id, 52 );
|
403 |
-
}
|
404 |
-
|
405 |
-
/**
|
406 |
-
* @param int $post_id
|
407 |
-
* @return mixed
|
408 |
-
*/
|
409 |
-
public function saveAssignedToMetabox( $post_id )
|
410 |
-
{
|
411 |
-
if( !wp_verify_nonce( filter_input( INPUT_POST, '_nonce-assigned-to' ), 'assigned_to' ))return;
|
412 |
-
$assignedTo = filter_input( INPUT_POST, 'assigned_to' );
|
413 |
-
$assignedTo || $assignedTo = '';
|
414 |
-
if( get_post_meta( $post_id, 'assigned_to', true ) != $assignedTo ) {
|
415 |
-
$this->onDeleteReview( $post_id );
|
416 |
}
|
417 |
-
update_post_meta( $post_id, 'assigned_to', $assignedTo );
|
418 |
}
|
419 |
|
420 |
/**
|
421 |
-
* @param int $post_id
|
422 |
* @return void
|
423 |
-
* @action
|
424 |
-
*/
|
425 |
-
public function saveBulkEditFields( $post_id )
|
426 |
-
{
|
427 |
-
$assignedTo = filter_input( INPUT_GET, 'assigned_to' );
|
428 |
-
if( !current_user_can( 'edit_posts' ))return;
|
429 |
-
if( $assignedTo && get_post( $assignedTo )) {
|
430 |
-
update_post_meta( $post_id, 'assigned_to', $assignedTo );
|
431 |
-
}
|
432 |
-
}
|
433 |
-
|
434 |
-
/**
|
435 |
-
* @param int $post_id
|
436 |
-
* @return mixed
|
437 |
*/
|
438 |
-
public function
|
439 |
{
|
440 |
-
|
441 |
-
|
442 |
}
|
443 |
|
444 |
/**
|
445 |
-
* @param int $
|
446 |
-
* @return mixed
|
447 |
-
*/
|
448 |
-
public function saveResponseMetabox( $post_id )
|
449 |
-
{
|
450 |
-
if( !wp_verify_nonce( filter_input( INPUT_POST, '_nonce-response' ), 'response' ))return;
|
451 |
-
$response = filter_input( INPUT_POST, 'response' );
|
452 |
-
$response || $response = '';
|
453 |
-
update_post_meta( $post_id, 'response', trim( wp_kses( $response, [
|
454 |
-
'a' => ['href' => [], 'title' => []],
|
455 |
-
'em' => [],
|
456 |
-
'strong' => [],
|
457 |
-
])));
|
458 |
-
}
|
459 |
-
|
460 |
-
/**
|
461 |
-
* Set/persist custom permissions for the post_type
|
462 |
-
*
|
463 |
* @return void
|
|
|
464 |
*/
|
465 |
-
public function
|
466 |
{
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
}
|
471 |
|
472 |
/**
|
|
|
|
|
|
|
|
|
473 |
* @return void
|
|
|
474 |
*/
|
475 |
-
public function
|
476 |
-
{
|
477 |
-
check_admin_referer( 'unapprove-review_' . ( $post_id = $this->getPostId() ));
|
478 |
-
|
479 |
-
wp_update_post([
|
480 |
-
'ID' => $post_id,
|
481 |
-
'post_status' => 'pending',
|
482 |
-
]);
|
483 |
-
|
484 |
-
wp_safe_redirect( wp_get_referer() );
|
485 |
-
exit;
|
486 |
-
}
|
487 |
-
|
488 |
-
/**
|
489 |
-
* @return bool
|
490 |
-
*/
|
491 |
-
protected function canEditReview()
|
492 |
-
{
|
493 |
-
$postId = filter_input( INPUT_GET, 'post' );
|
494 |
-
|
495 |
-
$reviewType = get_post_meta( $postId, 'review_type', true );
|
496 |
-
|
497 |
-
return $postId > 0
|
498 |
-
&& $reviewType == 'local'
|
499 |
-
&& $this->isEditReview();
|
500 |
-
}
|
501 |
-
|
502 |
-
/**
|
503 |
-
* Check if the translation string can be modified
|
504 |
-
*
|
505 |
-
* @param string $domain
|
506 |
-
* @return bool
|
507 |
-
*/
|
508 |
-
protected function canModifyTranslation( $domain = 'default' )
|
509 |
-
{
|
510 |
-
return glsr_current_screen()->post_type == App::POST_TYPE
|
511 |
-
&& in_array( glsr_current_screen()->base, ['edit', 'post'] )
|
512 |
-
&& $domain == 'default';
|
513 |
-
}
|
514 |
-
|
515 |
-
/**
|
516 |
-
* @return bool
|
517 |
-
*/
|
518 |
-
protected function isEditReview()
|
519 |
{
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
* @return WP_Post|false
|
528 |
-
*/
|
529 |
-
protected function getAssignedToPost( $post_id )
|
530 |
-
{
|
531 |
-
if( $assignedTo = get_post_meta( $post_id, 'assigned_to', true )) {
|
532 |
-
$assignedToPost = get_post( (int) $assignedTo );
|
533 |
-
}
|
534 |
-
return !empty( $assignedToPost )
|
535 |
-
? $assignedToPost
|
536 |
-
: false;
|
537 |
-
}
|
538 |
-
|
539 |
-
/**
|
540 |
-
* @return int
|
541 |
-
*/
|
542 |
-
protected function getPostId()
|
543 |
-
{
|
544 |
-
return (int) filter_input( INPUT_GET, 'post' );
|
545 |
-
}
|
546 |
-
|
547 |
-
/**
|
548 |
-
* Get the modified translation string
|
549 |
-
*
|
550 |
-
* @return string
|
551 |
-
*/
|
552 |
-
protected function getTranslation( array $args )
|
553 |
-
{
|
554 |
-
$defaults = [
|
555 |
-
'number' => 0,
|
556 |
-
'plural' => '',
|
557 |
-
'single' => '',
|
558 |
-
'text' => '',
|
559 |
-
];
|
560 |
-
|
561 |
-
$args = (object) wp_parse_args( $args, $defaults );
|
562 |
-
|
563 |
-
$translations = get_translations_for_domain( 'site-reviews' );
|
564 |
-
|
565 |
-
return $args->text
|
566 |
-
? $translations->translate( $args->text )
|
567 |
-
: $translations->translate_plural( $args->single, $args->plural, $args->number );
|
568 |
}
|
569 |
|
570 |
/**
|
571 |
-
* @param int $
|
572 |
-
* @param int $message_index
|
573 |
* @return void
|
574 |
*/
|
575 |
-
|
576 |
{
|
577 |
-
|
578 |
-
|
579 |
-
$
|
580 |
-
|| strpos( $referer, 'post.php' ) !== false
|
581 |
-
|| strpos( $referer, 'post-new.php' ) !== false;
|
582 |
-
|
583 |
-
|
584 |
-
$redirect = !$hasReferer
|
585 |
-
? add_query_arg( ['message' => $message_index ], get_edit_post_link( $post_id, '' ))
|
586 |
-
: add_query_arg( ['message' => $message_index ], remove_query_arg( ['trashed', 'untrashed', 'deleted', 'ids'], $referer ));
|
587 |
-
|
588 |
-
wp_safe_redirect( $redirect );
|
589 |
-
exit;
|
590 |
}
|
591 |
|
592 |
/**
|
|
|
593 |
* @return void
|
594 |
*/
|
595 |
-
|
596 |
{
|
597 |
-
|
598 |
-
$
|
599 |
-
|
600 |
-
$this->updateReviewIdOfPost( $post, $review, $reviewIds );
|
601 |
-
$updatedReviewIds = array_filter( (array) get_post_meta( $post->ID, '_glsr_review_id' ));
|
602 |
-
if( empty( $updatedReviewIds )) {
|
603 |
-
delete_post_meta( $post->ID, '_glsr_ranking' );
|
604 |
-
delete_post_meta( $post->ID, '_glsr_review_id' );
|
605 |
-
}
|
606 |
-
else if( !$this->app->make( 'Helper' )->compareArrays( $reviewIds, $updatedReviewIds )) {
|
607 |
-
$reviews = $this->db->getReviews([
|
608 |
-
'count' => -1,
|
609 |
-
'post__in' => $updatedReviewIds,
|
610 |
-
]);
|
611 |
-
update_post_meta( $post->ID, '_glsr_average', $this->recalculatePostAverage( $reviews->reviews ));
|
612 |
-
update_post_meta( $post->ID, '_glsr_ranking', $this->recalculatePostRanking( $reviews->reviews ));
|
613 |
-
}
|
614 |
}
|
615 |
|
616 |
/**
|
|
|
617 |
* @return void
|
618 |
*/
|
619 |
-
|
620 |
-
{
|
621 |
-
if( $review->post_status != 'publish' ) {
|
622 |
-
delete_post_meta( $post->ID, '_glsr_review_id', $review->ID );
|
623 |
-
}
|
624 |
-
else if( !in_array( $review->ID, $reviewIds )) {
|
625 |
-
add_post_meta( $post->ID, '_glsr_review_id', $review->ID );
|
626 |
-
}
|
627 |
-
}
|
628 |
-
|
629 |
-
/**
|
630 |
-
* @return bool
|
631 |
-
*/
|
632 |
-
protected function validateCustomRecaptcha( $recaptchaResponse )
|
633 |
-
{
|
634 |
-
$response = wp_remote_get( add_query_arg([
|
635 |
-
'remoteip' => $this->app->make( 'Helper' )->getIpAddress(),
|
636 |
-
'response' => $recaptchaResponse,
|
637 |
-
'secret' => glsr_get_option( 'reviews-form.recaptcha.secret' ),
|
638 |
-
], 'https://www.google.com/recaptcha/api/siteverify' ));
|
639 |
-
if( is_wp_error( $response )) {
|
640 |
-
glsr_resolve( 'Log\Logger' )->error( 'reCAPTCHA: '.$response->get_error_message() );
|
641 |
-
return false;
|
642 |
-
}
|
643 |
-
$result = json_decode( wp_remote_retrieve_body( $response ));
|
644 |
-
if( !empty( $result->success )) {
|
645 |
-
return $result->success;
|
646 |
-
}
|
647 |
-
$errorCodes = [
|
648 |
-
'missing-input-secret' => 'The secret parameter is missing.',
|
649 |
-
'invalid-input-secret' => 'The secret parameter is invalid or malformed.',
|
650 |
-
'missing-input-response' => 'The response parameter is missing.',
|
651 |
-
'invalid-input-response' => 'The response parameter is invalid or malformed.',
|
652 |
-
'bad-request' => 'The request is invalid or malformed.',
|
653 |
-
];
|
654 |
-
foreach( $result->{'error-codes'} as $error ) {
|
655 |
-
glsr_resolve( 'Log\Logger' )->error( 'reCAPTCHA: '.$errorCodes[$error] );
|
656 |
-
}
|
657 |
-
return false;
|
658 |
-
}
|
659 |
-
|
660 |
-
/**
|
661 |
-
* @return bool
|
662 |
-
*/
|
663 |
-
protected function validateRecaptcha()
|
664 |
-
{
|
665 |
-
$integration = glsr_get_option( 'reviews-form.recaptcha.integration' );
|
666 |
-
$recaptchaResponse = filter_input( INPUT_POST, 'g-recaptcha-response' );
|
667 |
-
|
668 |
-
if( !$integration ) {
|
669 |
-
return true;
|
670 |
-
}
|
671 |
-
// if response is empty we need to return null
|
672 |
-
if( empty( $recaptchaResponse ))return;
|
673 |
-
|
674 |
-
if( $integration == 'custom' ) {
|
675 |
-
return $this->validateCustomRecaptcha( $recaptchaResponse );
|
676 |
-
}
|
677 |
-
if( $integration == 'invisible-recaptcha' ) {
|
678 |
-
// if plugin is inactive, return true
|
679 |
-
return apply_filters( 'google_invre_is_valid_request_filter', true );
|
680 |
-
}
|
681 |
-
return false;
|
682 |
-
}
|
683 |
-
|
684 |
-
/**
|
685 |
-
* @return false|array
|
686 |
-
*/
|
687 |
-
protected function validateSubmittedReview( array $request )
|
688 |
{
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
-
'content' => 'required|min:' . $minContentLength,
|
693 |
-
'email' => 'required|email|min:5',
|
694 |
-
'name' => 'required',
|
695 |
-
'rating' => 'required|numeric|between:1,5',
|
696 |
-
'terms' => 'accepted',
|
697 |
-
'title' => 'required',
|
698 |
-
]);
|
699 |
-
|
700 |
-
$rules = array_intersect_key(
|
701 |
-
$defaultRules,
|
702 |
-
array_flip( array_merge( ['rating','terms'], glsr_get_option( 'reviews-form.required', [] )))
|
703 |
-
);
|
704 |
-
|
705 |
-
$excluded = isset( $request['excluded'] )
|
706 |
-
? json_decode( $request['excluded'] )
|
707 |
-
: [];
|
708 |
-
|
709 |
-
// only use the rules for non-excluded values
|
710 |
-
$rules = array_diff_key( $rules, array_flip( $excluded ));
|
711 |
-
|
712 |
-
$user = wp_get_current_user();
|
713 |
-
|
714 |
-
$defaults = [
|
715 |
-
'assign_to' => '',
|
716 |
-
'category' => '',
|
717 |
-
'content' => '',
|
718 |
-
'email' => ( $user->exists() ? $user->user_email : '' ),
|
719 |
-
'form_id' => '',
|
720 |
-
'name' => ( $user->exists() ? $user->display_name : '' ),
|
721 |
-
'rating' => '0',
|
722 |
-
'terms' => '',
|
723 |
-
'title' => '',
|
724 |
-
];
|
725 |
-
|
726 |
-
if( !$this->validate( $request, $rules )) {
|
727 |
-
return false;
|
728 |
-
}
|
729 |
-
|
730 |
-
if( empty( $request['title'] )) {
|
731 |
-
$request['title'] = __( 'No Title', 'site-reviews' );
|
732 |
-
}
|
733 |
-
|
734 |
-
return array_merge( $defaults, $request );
|
735 |
}
|
736 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database;
|
7 |
+
use GeminiLabs\SiteReviews\Database\CountsManager;
|
8 |
+
use GeminiLabs\SiteReviews\Database\ReviewManager;
|
9 |
+
use GeminiLabs\SiteReviews\Helper;
|
10 |
+
use GeminiLabs\SiteReviews\Review;
|
11 |
use WP_Post;
|
|
|
12 |
|
13 |
+
class ReviewController extends Controller
|
14 |
{
|
15 |
/**
|
16 |
+
* @param int $postId
|
17 |
+
* @param array $terms
|
18 |
+
* @param array $termTaxonomyIds
|
19 |
+
* @param string $taxonomySlug
|
20 |
+
* @param bool $append
|
21 |
+
* @param array $oldTermTaxonomyIds
|
22 |
* @return void
|
23 |
+
* @action set_object_terms
|
24 |
*/
|
25 |
+
public function onAfterChangeCategory( $postId, $terms, $termTaxonomyIds, $taxonomySlug, $append, $oldTermTaxonomyIds )
|
26 |
{
|
27 |
+
sort( $termTaxonomyIds );
|
28 |
+
sort( $oldTermTaxonomyIds );
|
29 |
+
if( $termTaxonomyIds === $oldTermTaxonomyIds || !$this->isReviewPostId( $postId ))return;
|
30 |
+
$review = glsr( ReviewManager::class )->single( get_post( $postId ));
|
31 |
+
$ignoredIds = array_intersect( $oldTermTaxonomyIds, $termTaxonomyIds );
|
32 |
+
$decreasedIds = array_diff( $oldTermTaxonomyIds, $ignoredIds );
|
33 |
+
$increasedIds = array_diff( $termTaxonomyIds, $ignoredIds );
|
34 |
+
if( $review->term_ids = glsr( Database::class )->getTermIds( $decreasedIds, 'term_taxonomy_id' )) {
|
35 |
+
glsr( CountsManager::class )->decreaseTermCounts( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
}
|
37 |
+
if( $review->term_ids = glsr( Database::class )->getTermIds( $increasedIds, 'term_taxonomy_id' )) {
|
38 |
+
glsr( CountsManager::class )->increaseTermCounts( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
}
|
|
|
|
|
40 |
}
|
41 |
|
42 |
/**
|
43 |
+
* @param string $oldStatus
|
44 |
+
* @param string $newStatus
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
* @return void
|
46 |
+
* @action transition_post_status
|
47 |
*/
|
48 |
+
public function onAfterChangeStatus( $newStatus, $oldStatus, WP_Post $post )
|
49 |
{
|
50 |
+
if( $post->post_type != Application::POST_TYPE || in_array( $oldStatus, ['new', $newStatus] ))return;
|
51 |
+
$review = glsr( ReviewManager::class )->single( get_post( $post->ID ));
|
52 |
+
if( $post->post_status == 'publish' ) {
|
53 |
+
glsr( CountsManager::class )->increase( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
}
|
55 |
+
else {
|
56 |
+
glsr( CountsManager::class )->decrease( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
}
|
|
|
58 |
}
|
59 |
|
60 |
/**
|
|
|
61 |
* @return void
|
62 |
+
* @action site-reviews/review/created
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
*/
|
64 |
+
public function onAfterCreate( Review $review )
|
65 |
{
|
66 |
+
if( $review->status !== 'publish' )return;
|
67 |
+
glsr( CountsManager::class )->increase( $review );
|
68 |
}
|
69 |
|
70 |
/**
|
71 |
+
* @param int $postId
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
* @return void
|
73 |
+
* @action before_delete_post
|
74 |
*/
|
75 |
+
public function onBeforeDelete( $postId )
|
76 |
{
|
77 |
+
if( !$this->isReviewPostId( $postId ))return;
|
78 |
+
$review = glsr( ReviewManager::class )->single( get_post( $postId ));
|
79 |
+
glsr( CountsManager::class )->decrease( $review );
|
80 |
}
|
81 |
|
82 |
/**
|
83 |
+
* @param int $metaId
|
84 |
+
* @param int $postId
|
85 |
+
* @param string $metaKey
|
86 |
+
* @param mixed $metaValue
|
87 |
* @return void
|
88 |
+
* @action update_postmeta
|
89 |
*/
|
90 |
+
public function onBeforeUpdate( $metaId, $postId, $metaKey, $metaValue )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
{
|
92 |
+
if( !$this->isReviewPostId( $postId )
|
93 |
+
|| !in_array( $metaKey, ['assigned_to', 'rating', 'review_type'] )
|
94 |
+
)return;
|
95 |
+
$review = glsr( ReviewManager::class )->single( get_post( $postId ));
|
96 |
+
if( $review->$metaKey == $metaValue )return;
|
97 |
+
$method = glsr( Helper::class )->buildMethodName( $metaKey, 'onBeforeChange' );
|
98 |
+
call_user_func( [$this, $method], $review, $metaValue );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
}
|
100 |
|
101 |
/**
|
102 |
+
* @param string|int $assignedTo
|
|
|
103 |
* @return void
|
104 |
*/
|
105 |
+
public function onBeforeChangeAssignedTo( Review $review, $assignedTo )
|
106 |
{
|
107 |
+
glsr( CountsManager::class )->decreasePostCounts( $review );
|
108 |
+
$review->assigned_to = $assignedTo;
|
109 |
+
glsr( CountsManager::class )->increasePostCounts( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
}
|
111 |
|
112 |
/**
|
113 |
+
* @param string|int $rating
|
114 |
* @return void
|
115 |
*/
|
116 |
+
public function onBeforeChangeRating( Review $review, $rating )
|
117 |
{
|
118 |
+
glsr( CountsManager::class )->decrease( $review );
|
119 |
+
$review->rating = $rating;
|
120 |
+
glsr( CountsManager::class )->increase( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
}
|
122 |
|
123 |
/**
|
124 |
+
* @param string $reviewType
|
125 |
* @return void
|
126 |
*/
|
127 |
+
public function onBeforeChangeReviewType( Review $review, $reviewType )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
{
|
129 |
+
glsr( CountsManager::class )->decrease( $review );
|
130 |
+
$review->review_type = $reviewType;
|
131 |
+
glsr( CountsManager::class )->increase( $review );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
}
|
133 |
}
|
plugin/Controllers/SettingsController.php
ADDED
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Controllers\Controller;
|
7 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
9 |
+
use GeminiLabs\SiteReviews\Modules\Polylang;
|
10 |
+
|
11 |
+
class SettingsController extends Controller
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @param mixed $input
|
15 |
+
* @return array
|
16 |
+
* @callback register_setting
|
17 |
+
*/
|
18 |
+
public function callbackRegisterSettings( $input )
|
19 |
+
{
|
20 |
+
if( !is_array( $input )) {
|
21 |
+
$input = ['settings' => []];
|
22 |
+
}
|
23 |
+
if( key( $input ) == 'settings' ) {
|
24 |
+
$options = array_replace_recursive( glsr( OptionManager::class )->all(), $input );
|
25 |
+
$options = $this->sanitizeGeneral( $input, $options );
|
26 |
+
$options = $this->sanitizeSubmissions( $input, $options );
|
27 |
+
$options = $this->sanitizeTranslations( $input, $options );
|
28 |
+
if( filter_input( INPUT_POST, 'option_page' ) == Application::ID.'-settings' ) {
|
29 |
+
glsr( Notice::class )->addSuccess( __( 'Settings updated.', 'site-reviews' ));
|
30 |
+
}
|
31 |
+
return $options;
|
32 |
+
}
|
33 |
+
return $input;
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @return void
|
38 |
+
* @action admin_init
|
39 |
+
*/
|
40 |
+
public function registerSettings()
|
41 |
+
{
|
42 |
+
register_setting( Application::ID.'-settings', OptionManager::databaseKey(), [
|
43 |
+
'sanitize_callback' => [$this, 'callbackRegisterSettings'],
|
44 |
+
]);
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @return array
|
49 |
+
*/
|
50 |
+
protected function sanitizeGeneral( array $input, array $options )
|
51 |
+
{
|
52 |
+
$inputForm = $input['settings']['general'];
|
53 |
+
if( $inputForm['support']['polylang'] == 'yes' && !$this->isPolylangActiveAndSupported() ) {
|
54 |
+
$options['settings']['general']['support']['polylang'] = 'no';
|
55 |
+
}
|
56 |
+
if( trim( $inputForm['notification_message'] ) == '' ) {
|
57 |
+
$options['settings']['general']['notification_message'] = glsr()->defaults['settings']['general']['notification_message'];
|
58 |
+
}
|
59 |
+
$options['settings']['general']['notifications'] = isset( $inputForm['notifications'] )
|
60 |
+
? $inputForm['notifications']
|
61 |
+
: [];
|
62 |
+
return $options;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @return array
|
67 |
+
*/
|
68 |
+
protected function sanitizeSubmissions( array $input, array $options )
|
69 |
+
{
|
70 |
+
$inputForm = $input['settings']['submissions'];
|
71 |
+
$options['settings']['submissions']['required'] = isset( $inputForm['required'] )
|
72 |
+
? $inputForm['required']
|
73 |
+
: [];
|
74 |
+
return $options;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* @return array
|
79 |
+
*/
|
80 |
+
protected function sanitizeTranslations( array $input, array $options )
|
81 |
+
{
|
82 |
+
if( isset( $input['settings']['strings'] )) {
|
83 |
+
$options['settings']['strings'] = array_values( array_filter( $input['settings']['strings'] ));
|
84 |
+
$allowedTags = [
|
85 |
+
'a' => ['class' => [], 'href' => [], 'target' => []],
|
86 |
+
'span' => ['class' => []],
|
87 |
+
];
|
88 |
+
array_walk( $options['settings']['strings'], function( &$string ) use( $allowedTags ) {
|
89 |
+
if( isset( $string['s2'] )) {
|
90 |
+
$string['s2'] = wp_kses( $string['s2'], $allowedTags );
|
91 |
+
}
|
92 |
+
if( isset( $string['p2'] )) {
|
93 |
+
$string['p2'] = wp_kses( $string['p2'], $allowedTags );
|
94 |
+
}
|
95 |
+
});
|
96 |
+
}
|
97 |
+
return $options;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* @return bool
|
102 |
+
*/
|
103 |
+
protected function isPolylangActiveAndSupported()
|
104 |
+
{
|
105 |
+
if( !glsr( Polylang::class )->isActive() ) {
|
106 |
+
glsr( Notice::class )->addError( __( 'Please install/activate the Polylang plugin to enable integration.', 'site-reviews' ));
|
107 |
+
return false;
|
108 |
+
}
|
109 |
+
else if( !glsr( Polylang::class )->isSupported() ) {
|
110 |
+
glsr( Notice::class )->addError( __( 'Please update the Polylang plugin to v2.3.0 or greater to enable integration.', 'site-reviews' ));
|
111 |
+
return false;
|
112 |
+
}
|
113 |
+
return true;
|
114 |
+
}
|
115 |
+
}
|
plugin/Controllers/TaxonomyController.php
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Controllers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
7 |
+
|
8 |
+
class TaxonomyController
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return void
|
12 |
+
* @action Application::TAXONOMY._add_form_fields
|
13 |
+
* @action Application::TAXONOMY._edit_form
|
14 |
+
*/
|
15 |
+
public function disableParents()
|
16 |
+
{
|
17 |
+
global $wp_taxonomies;
|
18 |
+
$wp_taxonomies[Application::TAXONOMY]->hierarchical = false;
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @return void
|
23 |
+
* @action Application::TAXONOMY._term_edit_form_top
|
24 |
+
* @action Application::TAXONOMY._term_new_form_tag
|
25 |
+
*/
|
26 |
+
public function enableParents()
|
27 |
+
{
|
28 |
+
global $wp_taxonomies;
|
29 |
+
$wp_taxonomies[Application::TAXONOMY]->hierarchical = true;
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @return void
|
34 |
+
* @action restrict_manage_posts
|
35 |
+
*/
|
36 |
+
public function renderTaxonomyFilter()
|
37 |
+
{
|
38 |
+
if( !is_object_in_taxonomy( glsr_current_screen()->post_type, Application::TAXONOMY ))return;
|
39 |
+
echo glsr( Builder::class )->label( __( 'Filter by category', 'site-reviews' ), [
|
40 |
+
'class' => 'screen-reader-text',
|
41 |
+
'for' => Application::TAXONOMY,
|
42 |
+
]);
|
43 |
+
wp_dropdown_categories([
|
44 |
+
'depth' => 3,
|
45 |
+
'hide_empty' => true,
|
46 |
+
'hide_if_empty' => true,
|
47 |
+
'hierarchical' => true,
|
48 |
+
'name' => Application::TAXONOMY,
|
49 |
+
'orderby' => 'name',
|
50 |
+
'selected' => $this->getSelected(),
|
51 |
+
'show_count' => false,
|
52 |
+
'show_option_all' => $this->getShowOptionAll(),
|
53 |
+
'taxonomy' => Application::TAXONOMY,
|
54 |
+
'value_field' => 'slug',
|
55 |
+
]);
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @return string
|
60 |
+
*/
|
61 |
+
protected function getSelected()
|
62 |
+
{
|
63 |
+
global $wp_query;
|
64 |
+
return isset( $wp_query->query[Application::TAXONOMY] )
|
65 |
+
? $wp_query->query[Application::TAXONOMY]
|
66 |
+
: '';
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @return string
|
71 |
+
*/
|
72 |
+
protected function getShowOptionAll()
|
73 |
+
{
|
74 |
+
$taxonomy = get_taxonomy( Application::TAXONOMY );
|
75 |
+
return $taxonomy
|
76 |
+
? ucfirst( strtolower( $taxonomy->labels->all_items ))
|
77 |
+
: '';
|
78 |
+
}
|
79 |
+
}
|
plugin/Database.php
CHANGED
@@ -1,548 +1,145 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
14 |
-
use GeminiLabs\SiteReviews\Database\
|
15 |
-
use GeminiLabs\SiteReviews\Database\
|
16 |
-
use GeminiLabs\SiteReviews\
|
|
|
|
|
|
|
17 |
use WP_Query;
|
18 |
|
19 |
-
class Database
|
20 |
{
|
21 |
-
use Options;
|
22 |
-
|
23 |
/**
|
24 |
-
* @
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
public function __construct( App $app )
|
29 |
-
{
|
30 |
-
$this->app = $app;
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Save a review to the database
|
35 |
-
*
|
36 |
-
* @param SubmitReview $command
|
37 |
-
* @return int|bool
|
38 |
*/
|
39 |
-
public function
|
40 |
{
|
41 |
-
|
42 |
-
|
43 |
-
'author' => '',
|
44 |
-
'assigned_to' => '',
|
45 |
-
'avatar' => '',
|
46 |
-
'content' => '',
|
47 |
-
'date' => current_time( 'mysql' ),
|
48 |
-
'email' => '',
|
49 |
-
'ip_address' => '',
|
50 |
-
'pinned' => false,
|
51 |
-
'rating' => '',
|
52 |
-
'review_id' => md5( time().serialize( $meta )),
|
53 |
-
'review_type' => 'local',
|
54 |
-
'title' => '',
|
55 |
-
'url' => '',
|
56 |
-
]);
|
57 |
-
if( $post_id = $this->getReviewId( $meta['review_id'] )) {
|
58 |
-
return $post_id;
|
59 |
-
}
|
60 |
-
$post_data = [
|
61 |
-
'comment_status' => 'closed',
|
62 |
-
'ID' => $post_id,
|
63 |
-
'ping_status' => 'closed',
|
64 |
-
'post_content' => $meta['content'],
|
65 |
-
'post_date' => $meta['date'],
|
66 |
-
'post_date_gmt' => get_gmt_from_date( $meta['date'] ),
|
67 |
-
'post_name' => sprintf( '%s-%s', $meta['review_type'], $meta['review_id'] ),
|
68 |
-
'post_status' => 'publish',
|
69 |
-
'post_title' => $meta['title'],
|
70 |
-
'post_type' => App::POST_TYPE,
|
71 |
-
];
|
72 |
-
if( $meta['review_type'] == 'local' ) {
|
73 |
-
if( $this->getOption( 'settings.general.require.approval' ) == 'yes' || $command->blacklisted ) {
|
74 |
-
$post_data['post_status'] = 'pending';
|
75 |
-
}
|
76 |
-
}
|
77 |
-
$post_id = wp_insert_post( $post_data, true );
|
78 |
-
if( is_wp_error( $post_id )) {
|
79 |
-
glsr_resolve( 'Log\Logger' )->error( sprintf( '%s (%s)', $post_id->get_error_message(), $meta['review_id'] ));
|
80 |
-
return false;
|
81 |
}
|
82 |
-
|
83 |
-
|
84 |
-
|
|
|
85 |
}
|
86 |
-
do_action( 'site-reviews/local/review/create', $post_data, $meta, $post_id );
|
87 |
-
return $post_id;
|
88 |
-
}
|
89 |
-
|
90 |
-
/**
|
91 |
-
* Delete review based on a review_id meta value
|
92 |
-
*
|
93 |
-
* @param string $metaReviewId
|
94 |
-
* @return void
|
95 |
-
*/
|
96 |
-
public function deleteReview( $metaReviewId )
|
97 |
-
{
|
98 |
-
$postId = $this->getReviewId( $metaReviewId );
|
99 |
-
if( !empty( $postId )) {
|
100 |
-
wp_delete_post( $postId, true );
|
101 |
-
}
|
102 |
-
}
|
103 |
-
|
104 |
-
/**
|
105 |
-
* @param \WP_Post|null $post
|
106 |
-
* @return null|object
|
107 |
-
*/
|
108 |
-
public function getReview( $post )
|
109 |
-
{
|
110 |
-
if( !isset( $post->ID )
|
111 |
-
|| $post->post_type != App::POST_TYPE
|
112 |
-
)return;
|
113 |
-
$meta = $this->getReviewMeta( $post->ID );
|
114 |
-
$modified = $post->post_title != $meta->title
|
115 |
-
|| $post->post_content != $meta->content
|
116 |
-
|| $post->post_date != $meta->date;
|
117 |
-
$review = (object) [
|
118 |
-
'assigned_to' => $meta->assigned_to,
|
119 |
-
'author' => $meta->author,
|
120 |
-
'avatar' => $meta->avatar,
|
121 |
-
'content' => $post->post_content,
|
122 |
-
'date' => $post->post_date,
|
123 |
-
'email' => $meta->email,
|
124 |
-
'ID' => $post->ID,
|
125 |
-
'ip_address' => $meta->ip_address,
|
126 |
-
'modified' => $modified,
|
127 |
-
'pinned' => $meta->pinned,
|
128 |
-
'post_id' => $post->ID, // provided for backwards compatability
|
129 |
-
'rating' => $meta->rating,
|
130 |
-
'response' => $meta->response,
|
131 |
-
'review_id' => $meta->review_id,
|
132 |
-
'review_type' => $meta->review_type,
|
133 |
-
'status' => $post->post_status,
|
134 |
-
'title' => $post->post_title,
|
135 |
-
'url' => $meta->url,
|
136 |
-
'user_id' => $post->post_author,
|
137 |
-
];
|
138 |
-
return apply_filters( 'site-reviews/get/review', $review, $post );
|
139 |
}
|
140 |
|
141 |
/**
|
142 |
* @param string $metaKey
|
143 |
* @param string $metaValue
|
144 |
-
* @return int
|
145 |
*/
|
146 |
public function getReviewCount( $metaKey = '', $metaValue = '' )
|
147 |
{
|
148 |
-
$metaKey = $this->normalizeMetaKey( $metaKey );
|
149 |
if( !$metaKey ) {
|
150 |
-
return (array)
|
151 |
-
}
|
152 |
-
$counts = wp_cache_get( $this->app->id, $metaKey . '_count' );
|
153 |
-
if( $counts === false ) {
|
154 |
-
global $wpdb;
|
155 |
-
$results = (array) $wpdb->get_results( $wpdb->prepare(
|
156 |
-
"SELECT m.meta_value AS name, COUNT( * ) num_posts " .
|
157 |
-
"FROM {$wpdb->posts} AS p " .
|
158 |
-
"INNER JOIN {$wpdb->postmeta} AS m ON p.ID = m.post_id " .
|
159 |
-
"WHERE p.post_type = '%s' " .
|
160 |
-
"AND m.meta_key = '%s' " .
|
161 |
-
"GROUP BY name",
|
162 |
-
App::POST_TYPE,
|
163 |
-
$metaKey
|
164 |
-
));
|
165 |
-
$counts = [];
|
166 |
-
foreach( $results as $result ) {
|
167 |
-
$counts[$result->name] = $result->num_posts;
|
168 |
-
}
|
169 |
-
wp_cache_set( $this->app->id, $counts, $metaKey . '_count' );
|
170 |
}
|
|
|
171 |
if( !$metaValue ) {
|
172 |
return $counts;
|
173 |
}
|
174 |
-
return isset( $counts[$metaValue] )
|
|
|
|
|
175 |
}
|
176 |
|
177 |
/**
|
178 |
-
*
|
179 |
-
*
|
180 |
-
* @param string $metaReviewId
|
181 |
-
* @return int
|
182 |
-
*/
|
183 |
-
public function getReviewId( $metaReviewId )
|
184 |
-
{
|
185 |
-
global $wpdb;
|
186 |
-
$query = $wpdb->prepare(
|
187 |
-
"SELECT p.ID " .
|
188 |
-
"FROM {$wpdb->posts} AS p " .
|
189 |
-
"INNER JOIN {$wpdb->postmeta} AS m1 ON p.ID = m1.post_id " .
|
190 |
-
"WHERE p.post_type = '%s' " .
|
191 |
-
"AND m1.meta_key = 'review_id' " .
|
192 |
-
"AND m1.meta_value = '%s'",
|
193 |
-
App::POST_TYPE,
|
194 |
-
$metaReviewId
|
195 |
-
);
|
196 |
-
return intval( $wpdb->get_var( $query ));
|
197 |
-
}
|
198 |
-
|
199 |
-
/**
|
200 |
-
* Gets an array of all saved review IDs by review type
|
201 |
-
*
|
202 |
-
* @param string $reviewType
|
203 |
* @return array
|
204 |
*/
|
205 |
-
public function
|
206 |
{
|
207 |
-
|
208 |
-
$query = $wpdb->prepare(
|
209 |
-
"SELECT m1.meta_value AS review_id " .
|
210 |
-
"FROM {$wpdb->posts} AS p " .
|
211 |
-
"INNER JOIN {$wpdb->postmeta} AS m1 ON p.ID = m1.post_id " .
|
212 |
-
"INNER JOIN {$wpdb->postmeta} AS m2 ON p.ID = m2.post_id " .
|
213 |
-
"WHERE p.post_type = '%s' " .
|
214 |
-
"AND m1.meta_key = 'review_id' " .
|
215 |
-
"AND m2.meta_key = 'review_type' " .
|
216 |
-
"AND m2.meta_value = '%s'",
|
217 |
-
App::POST_TYPE,
|
218 |
-
$reviewType
|
219 |
-
);
|
220 |
-
return array_keys( array_flip( $wpdb->get_col( $query )));
|
221 |
}
|
222 |
|
223 |
/**
|
224 |
-
*
|
225 |
-
*
|
226 |
-
* @param int $postId
|
227 |
-
* @return object
|
228 |
-
*/
|
229 |
-
public function getReviewMeta( $postId )
|
230 |
-
{
|
231 |
-
$meta = get_post_type( $postId ) == App::POST_TYPE
|
232 |
-
? array_map( 'array_shift', (array) get_post_meta( $postId ))
|
233 |
-
: [];
|
234 |
-
return (object) $this->normalizeMeta( array_filter( $meta, 'strlen' ));
|
235 |
-
}
|
236 |
-
|
237 |
-
/**
|
238 |
-
* Gets a object of saved review objects
|
239 |
-
*
|
240 |
-
* @return object
|
241 |
-
*/
|
242 |
-
public function getReviews( array $args = [] )
|
243 |
-
{
|
244 |
-
$defaults = [
|
245 |
-
'assigned_to' => '',
|
246 |
-
'category' => '',
|
247 |
-
'count' => 10,
|
248 |
-
'offset' => '',
|
249 |
-
'order' => 'DESC',
|
250 |
-
'orderby' => 'date',
|
251 |
-
'pagination' => false,
|
252 |
-
'post__in' => [],
|
253 |
-
'post__not_in' => [],
|
254 |
-
'rating' => '',
|
255 |
-
'type' => '',
|
256 |
-
];
|
257 |
-
$args = shortcode_atts( $defaults, $args );
|
258 |
-
extract( $args );
|
259 |
-
$meta_query = $this->app->make( 'Query' )->buildMeta([
|
260 |
-
'assigned_to' => [
|
261 |
-
'key' => 'assigned_to',
|
262 |
-
'value' => array_filter( array_map( 'trim', explode( ',', $assigned_to )), 'is_numeric' ),
|
263 |
-
'compare' => 'IN',
|
264 |
-
],
|
265 |
-
'type' => [
|
266 |
-
'key' => 'review_type',
|
267 |
-
'value' => $type,
|
268 |
-
],
|
269 |
-
'rating' => [
|
270 |
-
'key' => 'rating',
|
271 |
-
'value' => $rating,
|
272 |
-
'compare' => '>=',
|
273 |
-
],
|
274 |
-
]);
|
275 |
-
$query = [
|
276 |
-
'meta_key' => 'pinned',
|
277 |
-
'meta_query' => $meta_query,
|
278 |
-
'offset' => $offset ? $offset : '',
|
279 |
-
'order' => $order,
|
280 |
-
'orderby' => "meta_value $orderby",
|
281 |
-
'paged' => $pagination ? $this->app->make( 'Query' )->getPaged() : 1,
|
282 |
-
'post__in' => $post__in,
|
283 |
-
'post__not_in' => $post__not_in,
|
284 |
-
'post_status' => 'publish',
|
285 |
-
'post_type' => App::POST_TYPE,
|
286 |
-
'posts_per_page' => $count ? $count : -1,
|
287 |
-
'tax_query' => $this->app->make( 'Query' )->buildTerms( $this->normalizeTerms( $category )),
|
288 |
-
];
|
289 |
-
$reviews = new WP_Query( $query );
|
290 |
-
return (object) [
|
291 |
-
'reviews' => array_map( [$this, 'getReview'], $reviews->posts ),
|
292 |
-
'max_num_pages' => $reviews->max_num_pages,
|
293 |
-
];
|
294 |
-
}
|
295 |
-
|
296 |
-
/**
|
297 |
-
* Get array of meta values for all of a post_type
|
298 |
-
*
|
299 |
-
* @param string|array $keys
|
300 |
* @param string $status
|
301 |
* @return array
|
302 |
*/
|
303 |
-
public function getReviewsMeta( $
|
304 |
{
|
305 |
-
global $wpdb;
|
306 |
-
$query = $this->app->make( 'Query' );
|
307 |
-
$keys = array_map( [$this, 'normalizeMetaKey'], (array) $keys );
|
308 |
if( $status == 'all' || empty( $status )) {
|
309 |
-
$status = get_post_stati( ['exclude_from_search' => false
|
310 |
}
|
311 |
-
|
312 |
-
$status = $query->buildSqlOr( $status, "p.post_status = '%s'" );
|
313 |
-
$query = $wpdb->prepare(
|
314 |
-
"SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm " .
|
315 |
-
"LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id " .
|
316 |
-
"WHERE p.post_type = '%s' " .
|
317 |
-
"AND ({$keys}) " .
|
318 |
-
"AND ({$status}) " .
|
319 |
-
"ORDER BY pm.meta_value",
|
320 |
-
App::POST_TYPE
|
321 |
-
);
|
322 |
-
return $wpdb->get_col( $query );
|
323 |
-
}
|
324 |
-
|
325 |
-
/**
|
326 |
-
* Gets the review types (default review_type is "local")
|
327 |
-
*
|
328 |
-
* @return array
|
329 |
-
*/
|
330 |
-
public function getReviewTypes()
|
331 |
-
{
|
332 |
-
global $wpdb;
|
333 |
-
$types = $wpdb->get_col(
|
334 |
-
"SELECT DISTINCT(meta_value) " .
|
335 |
-
"FROM {$wpdb->postmeta} " .
|
336 |
-
"WHERE meta_key = 'review_type' " .
|
337 |
-
"ORDER BY meta_value ASC"
|
338 |
-
);
|
339 |
-
$types = array_flip( $types );
|
340 |
-
$labels = $this->app->make( 'Strings' )->review_types();
|
341 |
-
array_walk( $types, function( &$value, $key ) use( $labels ) {
|
342 |
-
$type = array_key_exists( $key, $labels )
|
343 |
-
? $labels[$key]
|
344 |
-
: ucfirst( $key );
|
345 |
-
|
346 |
-
$value = sprintf( __( '%s reviews', 'site-reviews' ), $type );
|
347 |
-
});
|
348 |
-
return $types;
|
349 |
}
|
350 |
|
351 |
/**
|
352 |
-
*
|
353 |
-
*
|
354 |
-
* @param string $taxonomy
|
355 |
* @return array
|
356 |
*/
|
357 |
-
public function
|
358 |
{
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
return is_array( $terms )
|
365 |
-
? $terms
|
366 |
-
: [];
|
367 |
-
}
|
368 |
-
|
369 |
-
/**
|
370 |
-
* Get all meta values for a review
|
371 |
-
*
|
372 |
-
* @return array
|
373 |
-
*/
|
374 |
-
public function normalizeMeta( array $meta )
|
375 |
-
{
|
376 |
-
$defaults = [
|
377 |
-
'author' => __( 'Anonymous', 'site-reviews' ),
|
378 |
-
'assigned_to' => '',
|
379 |
-
'avatar' => '',
|
380 |
-
'content' => '',
|
381 |
-
'date' => '',
|
382 |
-
'email' => '',
|
383 |
-
'ip_address' => '',
|
384 |
-
'pinned' => '',
|
385 |
-
'rating' => '',
|
386 |
-
'response' => '',
|
387 |
-
'review_id' => '',
|
388 |
-
'review_type' => '',
|
389 |
-
'status' => '',
|
390 |
-
'title' => '',
|
391 |
-
'url' => '',
|
392 |
-
];
|
393 |
-
return !empty( $meta )
|
394 |
-
? shortcode_atts( $defaults, $meta )
|
395 |
-
: [];
|
396 |
-
}
|
397 |
-
|
398 |
-
/**
|
399 |
-
* Normalize a review meta key
|
400 |
-
*
|
401 |
-
* @return string
|
402 |
-
*/
|
403 |
-
public function normalizeMetaKey( $metaKey )
|
404 |
-
{
|
405 |
-
$metaKey = strtolower( $metaKey );
|
406 |
-
if( in_array( $metaKey, ['id', 'type'] )) {
|
407 |
-
$metaKey = 'review_' . $metaKey;
|
408 |
}
|
409 |
-
return $
|
410 |
}
|
411 |
|
412 |
/**
|
413 |
-
* Normalize a string of comma-separated terms into an array
|
414 |
-
*
|
415 |
-
* @param string $terms
|
416 |
-
* @param string $taxonomy
|
417 |
* @return array
|
418 |
*/
|
419 |
-
public function
|
420 |
-
{
|
421 |
-
!empty( $taxonomy ) ?: $taxonomy = App::TAXONOMY;
|
422 |
-
$terms = array_map( 'trim', explode( ',', $terms ));
|
423 |
-
$terms = array_map( function( $term ) use( $taxonomy ) {
|
424 |
-
!is_numeric( $term ) ?: $term = intval( $term );
|
425 |
-
$term = term_exists( $term, $taxonomy );
|
426 |
-
if( isset( $term['term_id'] )) {
|
427 |
-
return intval( $term['term_id'] );
|
428 |
-
}
|
429 |
-
}, $terms );
|
430 |
-
return array_filter( $terms );
|
431 |
-
}
|
432 |
-
|
433 |
-
/**
|
434 |
-
* Reverts a review title, date, and content to the originally submitted values
|
435 |
-
*
|
436 |
-
* @param string $postId
|
437 |
-
* @return int
|
438 |
-
*/
|
439 |
-
public function revertReview( $postId )
|
440 |
{
|
441 |
-
$
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
return wp_update_post([
|
447 |
-
'ID' => $post->ID,
|
448 |
-
'post_content' => get_post_meta( $post->ID, 'content', true ),
|
449 |
-
'post_date' => get_post_meta( $post->ID, 'date', true ),
|
450 |
-
'post_title' => get_post_meta( $post->ID, 'title', true ),
|
451 |
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
452 |
}
|
453 |
|
454 |
/**
|
455 |
* @param string $searchTerm
|
456 |
-
* @return string
|
457 |
*/
|
458 |
public function searchPosts( $searchTerm )
|
459 |
{
|
460 |
$args = [
|
461 |
-
'post_type' => 'any',
|
462 |
'post_status' => 'publish',
|
|
|
463 |
];
|
464 |
if( is_numeric( $searchTerm )) {
|
465 |
$args['post__in'] = [$searchTerm];
|
466 |
}
|
467 |
else {
|
468 |
-
$args['s'] = $searchTerm;
|
469 |
-
$args['posts_per_page'] = 10;
|
470 |
$args['orderby'] = 'relevance';
|
|
|
|
|
471 |
}
|
472 |
-
$
|
473 |
-
|
474 |
-
add_filter( 'posts_search', [$query, 'filterSearchByTitle'], 500, 2 );
|
475 |
$search = new WP_Query( $args );
|
476 |
-
remove_filter( 'posts_search', [$
|
477 |
-
if(
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
return $results;
|
491 |
}
|
492 |
-
|
493 |
-
/**
|
494 |
-
* Set the default settings
|
495 |
-
*
|
496 |
-
* @return array
|
497 |
-
*/
|
498 |
-
public function setDefaults( array $args = [] )
|
499 |
-
{
|
500 |
-
$defaultSettings = $currentSettings = [];
|
501 |
-
$defaults = [
|
502 |
-
'data' => null, // provide custom data instead of using defaults
|
503 |
-
'merge' => true, // merge defaults with existing saved settings
|
504 |
-
'update' => true, // save generated defaults to database
|
505 |
-
];
|
506 |
-
$args = shortcode_atts( $defaults, $args );
|
507 |
-
if( !is_array( $args['data'] )) {
|
508 |
-
$args['data'] = $this->app->getDefaultSettings();
|
509 |
-
}
|
510 |
-
if( $args['merge'] ) {
|
511 |
-
$currentSettings = $this->removeEmptyValuesFrom( $this->getOptions() );
|
512 |
-
}
|
513 |
-
foreach( $args['data'] as $path => $value ) {
|
514 |
-
// Don't save the default selector values as they are used anyway by default.
|
515 |
-
if( !!$args['update'] && strpos( $path, '.selectors.' ) !== false ) {
|
516 |
-
$value = '';
|
517 |
-
}
|
518 |
-
$defaultSettings = $this->setValueToPath( $value, $path, $defaultSettings );
|
519 |
-
}
|
520 |
-
$settings = array_replace_recursive( $defaultSettings, $currentSettings );
|
521 |
-
if( $args['update'] ) {
|
522 |
-
$option = get_option( $this->getOptionName(), [] );
|
523 |
-
$option = array_replace_recursive( (array) $option, $settings );
|
524 |
-
update_option( $this->getOptionName(), $option );
|
525 |
-
}
|
526 |
-
return $settings;
|
527 |
-
}
|
528 |
-
|
529 |
-
/**
|
530 |
-
* Set one or more taxonomy terms to a post
|
531 |
-
*
|
532 |
-
* @param int $post_id
|
533 |
-
* @param string $terms
|
534 |
-
* @param string $taxonomy
|
535 |
-
* @return void
|
536 |
-
*/
|
537 |
-
public function setReviewMeta( $post_id, $terms, $taxonomy = '' )
|
538 |
-
{
|
539 |
-
!empty( $taxonomy ) ?: $taxonomy = App::TAXONOMY;
|
540 |
-
$terms = $this->normalizeTerms( $terms, $taxonomy );
|
541 |
-
if( !empty( $terms )) {
|
542 |
-
$result = wp_set_object_terms( $post_id, $terms, $taxonomy );
|
543 |
-
if( is_wp_error( $result )) {
|
544 |
-
glsr_resolve( 'Log\Logger' )->error( sprintf( '%s (%s)', $result->get_error_message(), $taxonomy ));
|
545 |
-
}
|
546 |
-
}
|
547 |
-
}
|
548 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database\Cache;
|
7 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
8 |
+
use GeminiLabs\SiteReviews\Database\QueryBuilder;
|
9 |
+
use GeminiLabs\SiteReviews\Database\SqlQueries;
|
10 |
+
use GeminiLabs\SiteReviews\Modules\Rating;
|
11 |
+
use WP_Post;
|
12 |
use WP_Query;
|
13 |
|
14 |
+
class Database
|
15 |
{
|
|
|
|
|
16 |
/**
|
17 |
+
* @param int $postId
|
18 |
+
* @param string $assignedTo
|
19 |
+
* @return void|WP_Post
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
*/
|
21 |
+
public function getAssignedToPost( $postId, $assignedTo = '' )
|
22 |
{
|
23 |
+
if( empty( $assignedTo )) {
|
24 |
+
$assignedTo = get_post_meta( $postId, 'assigned_to', true );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
+
if( empty( $assignedTo ))return;
|
27 |
+
$assignedPost = get_post( $assignedTo );
|
28 |
+
if( $assignedPost instanceof WP_Post && $assignedPost->ID != $postId ) {
|
29 |
+
return $assignedPost;
|
30 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
}
|
32 |
|
33 |
/**
|
34 |
* @param string $metaKey
|
35 |
* @param string $metaValue
|
36 |
+
* @return array|int
|
37 |
*/
|
38 |
public function getReviewCount( $metaKey = '', $metaValue = '' )
|
39 |
{
|
|
|
40 |
if( !$metaKey ) {
|
41 |
+
return (array)wp_count_posts( Application::POST_TYPE );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
}
|
43 |
+
$counts = glsr( Cache::class )->getReviewCountsFor( $metaKey );
|
44 |
if( !$metaValue ) {
|
45 |
return $counts;
|
46 |
}
|
47 |
+
return isset( $counts[$metaValue] )
|
48 |
+
? $counts[$metaValue]
|
49 |
+
: 0;
|
50 |
}
|
51 |
|
52 |
/**
|
53 |
+
* @param string $metaReviewType
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
* @return array
|
55 |
*/
|
56 |
+
public function getReviewIdsByType( $metaReviewType )
|
57 |
{
|
58 |
+
return glsr( SqlQueries::class )->getReviewIdsByType( $metaReviewType );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
}
|
60 |
|
61 |
/**
|
62 |
+
* @param string $key
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
* @param string $status
|
64 |
* @return array
|
65 |
*/
|
66 |
+
public function getReviewsMeta( $key, $status = 'publish' )
|
67 |
{
|
|
|
|
|
|
|
68 |
if( $status == 'all' || empty( $status )) {
|
69 |
+
$status = get_post_stati( ['exclude_from_search' => false] );
|
70 |
}
|
71 |
+
return glsr( SqlQueries::class )->getReviewsMeta( $key, $status );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
}
|
73 |
|
74 |
/**
|
75 |
+
* @param string $field
|
|
|
|
|
76 |
* @return array
|
77 |
*/
|
78 |
+
public function getTermIds( array $values, $field )
|
79 |
{
|
80 |
+
$termIds = [];
|
81 |
+
foreach( $values as $value ) {
|
82 |
+
$term = get_term_by( $field, $value, Application::TAXONOMY );
|
83 |
+
if( !isset( $term->term_id ))continue;
|
84 |
+
$termIds[] = $term->term_id;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
}
|
86 |
+
return $termIds;
|
87 |
}
|
88 |
|
89 |
/**
|
|
|
|
|
|
|
|
|
90 |
* @return array
|
91 |
*/
|
92 |
+
public function getTerms( array $args = [] )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
{
|
94 |
+
$args = wp_parse_args( $args, [
|
95 |
+
'count' => false,
|
96 |
+
'fields' => 'id=>name',
|
97 |
+
'hide_empty' => false,
|
98 |
+
'taxonomy' => Application::TAXONOMY,
|
|
|
|
|
|
|
|
|
|
|
99 |
]);
|
100 |
+
$terms = get_terms( $args );
|
101 |
+
if( is_wp_error( $terms )) {
|
102 |
+
glsr_log()->error( $terms->get_error_message() );
|
103 |
+
return [];
|
104 |
+
}
|
105 |
+
return $terms;
|
106 |
}
|
107 |
|
108 |
/**
|
109 |
* @param string $searchTerm
|
110 |
+
* @return void|string
|
111 |
*/
|
112 |
public function searchPosts( $searchTerm )
|
113 |
{
|
114 |
$args = [
|
|
|
115 |
'post_status' => 'publish',
|
116 |
+
'post_type' => 'any',
|
117 |
];
|
118 |
if( is_numeric( $searchTerm )) {
|
119 |
$args['post__in'] = [$searchTerm];
|
120 |
}
|
121 |
else {
|
|
|
|
|
122 |
$args['orderby'] = 'relevance';
|
123 |
+
$args['posts_per_page'] = 10;
|
124 |
+
$args['s'] = $searchTerm;
|
125 |
}
|
126 |
+
$queryBuilder = glsr( QueryBuilder::class );
|
127 |
+
add_filter( 'posts_search', [$queryBuilder, 'filterSearchByTitle'], 500, 2 );
|
|
|
128 |
$search = new WP_Query( $args );
|
129 |
+
remove_filter( 'posts_search', [$queryBuilder, 'filterSearchByTitle'], 500 );
|
130 |
+
if( !$search->have_posts() )return;
|
131 |
+
$results = '';
|
132 |
+
while( $search->have_posts() ) {
|
133 |
+
$search->the_post();
|
134 |
+
ob_start();
|
135 |
+
glsr()->render( 'partials/editor/search-result', [
|
136 |
+
'ID' => get_the_ID(),
|
137 |
+
'permalink' => esc_url( (string) get_permalink() ),
|
138 |
+
'title' => esc_attr( get_the_title() ),
|
139 |
+
]);
|
140 |
+
$results .= ob_get_clean();
|
141 |
+
}
|
142 |
+
wp_reset_postdata();
|
143 |
return $results;
|
144 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
}
|
plugin/Database/Cache.php
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database\SqlQueries;
|
7 |
+
|
8 |
+
class Cache
|
9 |
+
{
|
10 |
+
const EXPIRY_TIME = WEEK_IN_SECONDS;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* @return array
|
14 |
+
*/
|
15 |
+
public function getCloudflareIps()
|
16 |
+
{
|
17 |
+
$ipAddresses = get_transient( Application::ID.'_cloudflare_ips' );
|
18 |
+
if( $ipAddresses === false ) {
|
19 |
+
$ipAddresses = array_fill_keys( ['v4', 'v6'], [] );
|
20 |
+
foreach( array_keys( $ipAddresses ) as $version ) {
|
21 |
+
$url = 'https://www.cloudflare.com/ips-'.$version;
|
22 |
+
$response = wp_remote_get( $url );
|
23 |
+
if( is_wp_error( $response )) {
|
24 |
+
glsr_log()->error( $response->get_error_message() );
|
25 |
+
continue;
|
26 |
+
}
|
27 |
+
if(( $statusCode = wp_remote_retrieve_response_code( $response )) != '200' ) {
|
28 |
+
glsr_log()->error( 'Unable to connect to '.$url.' ['.$statusCode.']' );
|
29 |
+
continue;
|
30 |
+
}
|
31 |
+
$ipAddresses[$version] = array_filter(
|
32 |
+
(array)preg_split( '/\R/', wp_remote_retrieve_body( $response ))
|
33 |
+
);
|
34 |
+
}
|
35 |
+
set_transient( Application::ID.'_cloudflare_ips', $ipAddresses, static::EXPIRY_TIME );
|
36 |
+
}
|
37 |
+
return $ipAddresses;
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @param string $metaKey
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function getReviewCountsFor( $metaKey )
|
45 |
+
{
|
46 |
+
$counts = wp_cache_get( Application::ID, $metaKey.'_count' );
|
47 |
+
if( $counts === false ) {
|
48 |
+
$counts = [];
|
49 |
+
$results = glsr( SqlQueries::class )->getReviewCountsFor( $metaKey );
|
50 |
+
foreach( $results as $result ) {
|
51 |
+
$counts[$result->name] = $result->num_posts;
|
52 |
+
}
|
53 |
+
wp_cache_set( Application::ID, $counts, $metaKey.'_count' );
|
54 |
+
}
|
55 |
+
return $counts;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @return string
|
60 |
+
*/
|
61 |
+
public function getRemotePostTest()
|
62 |
+
{
|
63 |
+
$test = get_transient( Application::ID.'_remote_post_test' );
|
64 |
+
if( $test === false ) {
|
65 |
+
$response = wp_remote_post( 'https://api.wordpress.org/stats/php/1.0/' );
|
66 |
+
$test = !is_wp_error( $response )
|
67 |
+
&& in_array( $response['response']['code'], range( 200, 299 ))
|
68 |
+
? 'Works'
|
69 |
+
: 'Does not work';
|
70 |
+
set_transient( Application::ID.'_remote_post_test', $test, static::EXPIRY_TIME );
|
71 |
+
}
|
72 |
+
return $test;
|
73 |
+
}
|
74 |
+
}
|
plugin/Database/CountsManager.php
ADDED
@@ -0,0 +1,363 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
7 |
+
use GeminiLabs\SiteReviews\Database\ReviewManager;
|
8 |
+
use GeminiLabs\SiteReviews\Database\SqlQueries;
|
9 |
+
use GeminiLabs\SiteReviews\Modules\Polylang;
|
10 |
+
use GeminiLabs\SiteReviews\Modules\Rating;
|
11 |
+
use GeminiLabs\SiteReviews\Review;
|
12 |
+
use WP_Post;
|
13 |
+
use WP_Term;
|
14 |
+
|
15 |
+
class CountsManager
|
16 |
+
{
|
17 |
+
const META_AVERAGE = '_glsr_average';
|
18 |
+
const META_COUNT = '_glsr_count';
|
19 |
+
const META_RANKING = '_glsr_ranking';
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @param int $limit
|
23 |
+
* @return array
|
24 |
+
*/
|
25 |
+
public function buildCounts( $limit = 500 )
|
26 |
+
{
|
27 |
+
return $this->build( $limit );
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* @param int $postId
|
32 |
+
* @param int $limit
|
33 |
+
* @return array
|
34 |
+
*/
|
35 |
+
public function buildPostCounts( $postId, $limit = 500 )
|
36 |
+
{
|
37 |
+
return $this->build( $limit, ['post_id' => $postId] );
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @param int $termTaxonomyId
|
42 |
+
* @param int $limit
|
43 |
+
* @return array
|
44 |
+
*/
|
45 |
+
public function buildTermCounts( $termTaxonomyId, $limit = 500 )
|
46 |
+
{
|
47 |
+
return $this->build( $limit, ['term_taxonomy_id' => $termTaxonomyId] );
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @return void
|
52 |
+
*/
|
53 |
+
public function decrease( Review $review )
|
54 |
+
{
|
55 |
+
$this->decreaseCounts( $review );
|
56 |
+
$this->decreasePostCounts( $review );
|
57 |
+
$this->decreaseTermCounts( $review );
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @return void
|
62 |
+
*/
|
63 |
+
public function decreaseCounts( Review $review )
|
64 |
+
{
|
65 |
+
$this->setCounts( $this->decreaseRating(
|
66 |
+
$this->getCounts(),
|
67 |
+
$review->review_type,
|
68 |
+
$review->rating
|
69 |
+
));
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* @return void
|
74 |
+
*/
|
75 |
+
public function decreasePostCounts( Review $review )
|
76 |
+
{
|
77 |
+
if( empty( $counts = $this->getPostCounts( $review->assigned_to )))return;
|
78 |
+
$counts = $this->decreaseRating( $counts, $review->review_type, $review->rating );
|
79 |
+
$this->setPostCounts( $review->assigned_to, $counts );
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* @return void
|
84 |
+
*/
|
85 |
+
public function decreaseTermCounts( Review $review )
|
86 |
+
{
|
87 |
+
foreach( $review->term_ids as $termId ) {
|
88 |
+
if( empty( $counts = $this->getTermCounts( $termId )))continue;
|
89 |
+
$counts = $this->decreaseRating( $counts, $review->review_type, $review->rating );
|
90 |
+
$this->setTermCounts( $termId, $counts );
|
91 |
+
}
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* @return array
|
96 |
+
*/
|
97 |
+
public function flatten( array $reviewCounts, array $args = [] )
|
98 |
+
{
|
99 |
+
$counts = [];
|
100 |
+
array_walk_recursive( $reviewCounts, function( $num, $index ) use( &$counts ) {
|
101 |
+
$counts[$index] = isset( $counts[$index] )
|
102 |
+
? $num + $counts[$index]
|
103 |
+
: $num;
|
104 |
+
});
|
105 |
+
$args = wp_parse_args( $args, [
|
106 |
+
'max' => Rating::MAX_RATING,
|
107 |
+
'min' => Rating::MIN_RATING,
|
108 |
+
]);
|
109 |
+
foreach( $counts as $index => &$num ) {
|
110 |
+
if( $index >= intval( $args['min'] ) && $index <= intval( $args['max'] ))continue;
|
111 |
+
$num = 0;
|
112 |
+
}
|
113 |
+
return $counts;
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* @return array
|
118 |
+
*/
|
119 |
+
public function get( array $args = [] )
|
120 |
+
{
|
121 |
+
$args = wp_parse_args( $args, [
|
122 |
+
'post_ids' => [],
|
123 |
+
'term_ids' => [],
|
124 |
+
'type' => 'local',
|
125 |
+
]);
|
126 |
+
$counts = [];
|
127 |
+
foreach( glsr( Polylang::class )->getPostIds( $args['post_ids'] ) as $postId ) {
|
128 |
+
$counts[] = $this->getPostCounts( $postId );
|
129 |
+
}
|
130 |
+
foreach( $args['term_ids'] as $termId ) {
|
131 |
+
$counts[] = $this->getTermCounts( $termId );
|
132 |
+
}
|
133 |
+
if( empty( $counts )) {
|
134 |
+
$counts[] = $this->getCounts();
|
135 |
+
}
|
136 |
+
return in_array( $args['type'], ['', 'all'] )
|
137 |
+
? $this->normalize( [$this->flatten( $counts )] )
|
138 |
+
: $this->normalize( glsr_array_column( $counts, $args['type'] ));
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* @return array
|
143 |
+
*/
|
144 |
+
public function getCounts()
|
145 |
+
{
|
146 |
+
$counts = glsr( OptionManager::class )->get( 'counts', [] );
|
147 |
+
if( !is_array( $counts )) {
|
148 |
+
glsr_log()->error( 'CountsManager: counts is not an array' )->debug( $counts );
|
149 |
+
return [];
|
150 |
+
}
|
151 |
+
return $counts;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* @param int $postId
|
156 |
+
* @return array
|
157 |
+
*/
|
158 |
+
public function getPostCounts( $postId )
|
159 |
+
{
|
160 |
+
return array_filter( (array)get_post_meta( $postId, static::META_COUNT, true ));
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* @param int $termId
|
165 |
+
* @return array
|
166 |
+
*/
|
167 |
+
public function getTermCounts( $termId )
|
168 |
+
{
|
169 |
+
return array_filter( (array)get_term_meta( $termId, static::META_COUNT, true ));
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* @return void
|
174 |
+
*/
|
175 |
+
public function increase( Review $review )
|
176 |
+
{
|
177 |
+
$this->increaseCounts( $review );
|
178 |
+
$this->increasePostCounts( $review );
|
179 |
+
$this->increaseTermCounts( $review );
|
180 |
+
}
|
181 |
+
|
182 |
+
/**
|
183 |
+
* @return void
|
184 |
+
*/
|
185 |
+
public function increaseCounts( Review $review )
|
186 |
+
{
|
187 |
+
if( empty( $counts = $this->getCounts() )) {
|
188 |
+
$counts = $this->buildCounts();
|
189 |
+
}
|
190 |
+
$this->setCounts( $this->increaseRating(
|
191 |
+
$counts,
|
192 |
+
$review->review_type,
|
193 |
+
$review->rating
|
194 |
+
));
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* @return void
|
199 |
+
*/
|
200 |
+
public function increasePostCounts( Review $review )
|
201 |
+
{
|
202 |
+
if( !( get_post( $review->assigned_to ) instanceof WP_Post ))return;
|
203 |
+
$counts = $this->getPostCounts( $review->assigned_to );
|
204 |
+
$counts = empty( $counts )
|
205 |
+
? $this->buildPostCounts( $review->assigned_to )
|
206 |
+
: $this->increaseRating( $counts, $review->review_type, $review->rating );
|
207 |
+
$this->setPostCounts( $review->assigned_to, $counts );
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* @return void
|
212 |
+
*/
|
213 |
+
public function increaseTermCounts( Review $review )
|
214 |
+
{
|
215 |
+
$terms = glsr( ReviewManager::class )->normalizeTerms( implode( ',', $review->term_ids ));
|
216 |
+
foreach( $terms as $term ) {
|
217 |
+
$counts = $this->getTermCounts( $term['term_id'] );
|
218 |
+
$counts = empty( $counts )
|
219 |
+
? $this->buildTermCounts( $term['term_taxonomy_id'] )
|
220 |
+
: $this->increaseRating( $counts, $review->review_type, $review->rating );
|
221 |
+
$this->setTermCounts( $term['term_id'], $counts );
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* @return void
|
227 |
+
*/
|
228 |
+
public function setCounts( array $reviewCounts )
|
229 |
+
{
|
230 |
+
glsr( OptionManager::class )->set( 'counts', $reviewCounts );
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* @param int $postId
|
235 |
+
* @return void
|
236 |
+
*/
|
237 |
+
public function setPostCounts( $postId, array $reviewCounts )
|
238 |
+
{
|
239 |
+
$ratingCounts = $this->flatten( $reviewCounts );
|
240 |
+
update_post_meta( $postId, static::META_COUNT, $reviewCounts );
|
241 |
+
update_post_meta( $postId, static::META_AVERAGE, glsr( Rating::class )->getAverage( $ratingCounts ));
|
242 |
+
update_post_meta( $postId, static::META_RANKING, glsr( Rating::class )->getRanking( $ratingCounts ));
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* @param int $termId
|
247 |
+
* @return void
|
248 |
+
*/
|
249 |
+
public function setTermCounts( $termId, array $reviewCounts )
|
250 |
+
{
|
251 |
+
$term = get_term( $termId, Application::TAXONOMY );
|
252 |
+
if( !isset( $term->term_id ))return;
|
253 |
+
$ratingCounts = $this->flatten( $reviewCounts );
|
254 |
+
update_term_meta( $termId, static::META_COUNT, $reviewCounts );
|
255 |
+
update_term_meta( $termId, static::META_AVERAGE, glsr( Rating::class )->getAverage( $ratingCounts ));
|
256 |
+
update_term_meta( $termId, static::META_RANKING, glsr( Rating::class )->getRanking( $ratingCounts ));
|
257 |
+
}
|
258 |
+
|
259 |
+
/**
|
260 |
+
* @param int $limit
|
261 |
+
* @return array
|
262 |
+
* @todo verify the additional type checks are needed
|
263 |
+
*/
|
264 |
+
protected function build( $limit, array $args = [] )
|
265 |
+
{
|
266 |
+
$counts = [];
|
267 |
+
$lastPostId = 0;
|
268 |
+
while( $reviews = $this->queryReviews( $args, $lastPostId, $limit )) {
|
269 |
+
$types = array_keys( array_flip( glsr_array_column( $reviews, 'type' )));
|
270 |
+
$types = array_unique( array_merge( ['local'], $types ));
|
271 |
+
foreach( $types as $type ) {
|
272 |
+
$type = $this->normalizeType( $type );
|
273 |
+
if( isset( $counts[$type] ))continue;
|
274 |
+
$counts[$type] = array_fill_keys( range( 0, Rating::MAX_RATING ), 0 );
|
275 |
+
}
|
276 |
+
foreach( $reviews as $review ) {
|
277 |
+
$type = $this->normalizeType( $review->type );
|
278 |
+
$counts[$type][$review->rating]++;
|
279 |
+
}
|
280 |
+
$lastPostId = end( $reviews )->ID;
|
281 |
+
}
|
282 |
+
return $counts;
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* @param string $type
|
287 |
+
* @param int $rating
|
288 |
+
* @return array
|
289 |
+
*/
|
290 |
+
protected function decreaseRating( array $reviewCounts, $type, $rating )
|
291 |
+
{
|
292 |
+
if( isset( $reviewCounts[$type][$rating] )) {
|
293 |
+
$reviewCounts[$type][$rating] = max( 0, $reviewCounts[$type][$rating] - 1 );
|
294 |
+
}
|
295 |
+
return $reviewCounts;
|
296 |
+
}
|
297 |
+
|
298 |
+
/**
|
299 |
+
* @param string $type
|
300 |
+
* @param int $rating
|
301 |
+
* @return array
|
302 |
+
*/
|
303 |
+
protected function increaseRating( array $reviewCounts, $type, $rating )
|
304 |
+
{
|
305 |
+
if( !array_key_exists( $type, glsr()->reviewTypes )) {
|
306 |
+
return $reviewCounts;
|
307 |
+
}
|
308 |
+
if( !array_key_exists( $type, $reviewCounts )) {
|
309 |
+
$reviewCounts[$type] = [];
|
310 |
+
}
|
311 |
+
$reviewCounts = $this->normalize( $reviewCounts );
|
312 |
+
$reviewCounts[$type][$rating] = intval( $reviewCounts[$type][$rating] ) + 1;
|
313 |
+
return $reviewCounts;
|
314 |
+
}
|
315 |
+
|
316 |
+
/**
|
317 |
+
* @return array
|
318 |
+
*/
|
319 |
+
protected function normalize( array $reviewCounts )
|
320 |
+
{
|
321 |
+
if( empty( $reviewCounts )) {
|
322 |
+
$reviewCounts = [[]];
|
323 |
+
}
|
324 |
+
foreach( $reviewCounts as &$counts ) {
|
325 |
+
foreach( range( 0, Rating::MAX_RATING ) as $index ) {
|
326 |
+
if( isset( $counts[$index] ))continue;
|
327 |
+
$counts[$index] = 0;
|
328 |
+
}
|
329 |
+
ksort( $counts );
|
330 |
+
}
|
331 |
+
return $reviewCounts;
|
332 |
+
}
|
333 |
+
|
334 |
+
/**
|
335 |
+
* @param string $type
|
336 |
+
* @return string
|
337 |
+
*/
|
338 |
+
protected function normalizeType( $type )
|
339 |
+
{
|
340 |
+
return empty( $type ) || !is_string( $type )
|
341 |
+
? 'local'
|
342 |
+
: $type;
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* @param int $lastPostId
|
347 |
+
* @param int $limit
|
348 |
+
* @return void|array
|
349 |
+
*/
|
350 |
+
protected function queryReviews( array $args = [], $lastPostId, $limit )
|
351 |
+
{
|
352 |
+
$args = wp_parse_args( $args, array_fill_keys( ['post_id', 'term_taxonomy_id'], '' ));
|
353 |
+
if( empty( array_filter( $args ))) {
|
354 |
+
return glsr( SqlQueries::class )->getReviewCounts( $lastPostId, $limit );
|
355 |
+
}
|
356 |
+
if( !empty( $args['post_id'] )) {
|
357 |
+
return glsr( SqlQueries::class )->getReviewPostCounts( $args['post_id'], $lastPostId, $limit );
|
358 |
+
}
|
359 |
+
if( !empty( $args['term_taxonomy_id'] )) {
|
360 |
+
return glsr( SqlQueries::class )->getReviewTermCounts( $args['term_taxonomy_id'], $lastPostId, $limit );
|
361 |
+
}
|
362 |
+
}
|
363 |
+
}
|
plugin/Database/DefaultsManager.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
|
8 |
+
class DefaultsManager
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
public function defaults()
|
14 |
+
{
|
15 |
+
$settings = $this->settings();
|
16 |
+
$defaults = array_combine( array_keys( $settings ), glsr_array_column( $settings, 'default' ));
|
17 |
+
return wp_parse_args( $defaults, [
|
18 |
+
'version' => '',
|
19 |
+
'version_upgraded_from' => '',
|
20 |
+
]);
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @return array
|
25 |
+
*/
|
26 |
+
public function get()
|
27 |
+
{
|
28 |
+
return glsr( Helper::class )->convertDotNotationArray( $this->defaults() );
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @return array
|
33 |
+
*/
|
34 |
+
public function set()
|
35 |
+
{
|
36 |
+
$settings = glsr( OptionManager::class )->all();
|
37 |
+
$currentSettings = glsr( Helper::class )->removeEmptyArrayValues( $settings );
|
38 |
+
$defaultSettings = array_replace_recursive( $this->get(), $currentSettings );
|
39 |
+
$updatedSettings = array_replace_recursive( $settings, $defaultSettings );
|
40 |
+
update_option( OptionManager::databaseKey(), $updatedSettings );
|
41 |
+
return $defaultSettings;
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @return array
|
46 |
+
*/
|
47 |
+
public function settings()
|
48 |
+
{
|
49 |
+
$settings = apply_filters( 'site-reviews/addon/settings', glsr()->config( 'settings' ));
|
50 |
+
return $this->normalize( $settings );
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @return array
|
55 |
+
*/
|
56 |
+
protected function normalize( array $settings )
|
57 |
+
{
|
58 |
+
array_walk( $settings, function( &$setting ) {
|
59 |
+
if( isset( $setting['default'] ))return;
|
60 |
+
$setting['default'] = '';
|
61 |
+
});
|
62 |
+
return $settings;
|
63 |
+
}
|
64 |
+
}
|
plugin/Database/OptionManager.php
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
use GeminiLabs\SiteReviews\Database\DefaultsManager;
|
8 |
+
|
9 |
+
class OptionManager
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @var array
|
13 |
+
*/
|
14 |
+
protected $options;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @return string
|
18 |
+
*/
|
19 |
+
public static function databaseKey()
|
20 |
+
{
|
21 |
+
return glsr( Helper::class )->snakeCase(
|
22 |
+
Application::ID.'-v'.explode( '.', glsr()->version )[0]
|
23 |
+
);
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @return array
|
28 |
+
*/
|
29 |
+
public function all()
|
30 |
+
{
|
31 |
+
if( empty( $this->options )) {
|
32 |
+
$this->reset();
|
33 |
+
}
|
34 |
+
return $this->options;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @param string $path
|
39 |
+
* @return bool
|
40 |
+
*/
|
41 |
+
public function delete( $path )
|
42 |
+
{
|
43 |
+
$keys = explode( '.', $path );
|
44 |
+
$last = array_pop( $keys );
|
45 |
+
$options = $this->all();
|
46 |
+
$pointer = &$options;
|
47 |
+
foreach( $keys as $key ) {
|
48 |
+
if( !isset( $pointer[$key] ) || !is_array( $pointer[$key] ))continue;
|
49 |
+
$pointer = &$pointer[$key];
|
50 |
+
}
|
51 |
+
unset( $pointer[$last] );
|
52 |
+
return $this->set( $options );
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @param string $path
|
57 |
+
* @param mixed $fallback
|
58 |
+
* @return mixed
|
59 |
+
*/
|
60 |
+
public function get( $path = '', $fallback = '' )
|
61 |
+
{
|
62 |
+
return glsr( Helper::class )->getPathValue( $path, $this->all(), $fallback );
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @param string $path
|
67 |
+
* @return bool
|
68 |
+
*/
|
69 |
+
public function getBool( $path )
|
70 |
+
{
|
71 |
+
return $this->get( $path ) == 'yes'
|
72 |
+
? true
|
73 |
+
: false;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @return string
|
78 |
+
*/
|
79 |
+
public function json()
|
80 |
+
{
|
81 |
+
return json_encode( $this->all() );
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* @return array
|
86 |
+
*/
|
87 |
+
public function normalize( array $options = [] )
|
88 |
+
{
|
89 |
+
$options = wp_parse_args(
|
90 |
+
glsr( Helper::class )->flattenArray( $options ),
|
91 |
+
glsr( DefaultsManager::class )->defaults()
|
92 |
+
);
|
93 |
+
array_walk( $options, function( &$value ) {
|
94 |
+
if( !is_string( $value ))return;
|
95 |
+
$value = wp_kses( $value, wp_kses_allowed_html( 'post' ));
|
96 |
+
});
|
97 |
+
return glsr( Helper::class )->convertDotNotationArray( $options );
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* @return bool
|
102 |
+
*/
|
103 |
+
public function isRecaptchaEnabled()
|
104 |
+
{
|
105 |
+
$integration = $this->get( 'settings.submissions.recaptcha.integration' );
|
106 |
+
return $integration == 'all' || ( $integration == 'guest' && !is_user_logged_in() );
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* @return array
|
111 |
+
*/
|
112 |
+
public function reset()
|
113 |
+
{
|
114 |
+
$options = get_option( static::databaseKey(), [] );
|
115 |
+
if( !is_array( $options ) || empty( $options )) {
|
116 |
+
delete_option( static::databaseKey() );
|
117 |
+
$options = wp_parse_args( glsr()->defaults, ['settings' => []] );
|
118 |
+
}
|
119 |
+
$this->options = $options;
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* @param string|array $pathOrOptions
|
124 |
+
* @param mixed $value
|
125 |
+
* @return bool
|
126 |
+
*/
|
127 |
+
public function set( $pathOrOptions, $value = '' )
|
128 |
+
{
|
129 |
+
if( is_string( $pathOrOptions )) {
|
130 |
+
$pathOrOptions = glsr( Helper::class )->setPathValue( $pathOrOptions, $value, $this->all() );
|
131 |
+
}
|
132 |
+
if( $result = update_option( static::databaseKey(), (array)$pathOrOptions )) {
|
133 |
+
$this->reset();
|
134 |
+
}
|
135 |
+
return $result;
|
136 |
+
}
|
137 |
+
}
|
plugin/Database/Options.php
DELETED
@@ -1,223 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Database;
|
12 |
-
|
13 |
-
/**
|
14 |
-
* @property App $app
|
15 |
-
*/
|
16 |
-
trait Options
|
17 |
-
{
|
18 |
-
/**
|
19 |
-
* Delete a plugin option using dot notation
|
20 |
-
* @param string $path
|
21 |
-
* @param bool|string $isPluginSetting
|
22 |
-
* @return bool
|
23 |
-
*/
|
24 |
-
public function deleteOption( $path, $isPluginSetting = false )
|
25 |
-
{
|
26 |
-
$keys = explode( '.', $path );
|
27 |
-
$last = array_pop( $keys );
|
28 |
-
$options = $this->getOptions( $isPluginSetting );
|
29 |
-
$pointer = &$options;
|
30 |
-
foreach( $keys as $key ) {
|
31 |
-
if( isset( $pointer[$key] ) && is_array( $pointer[$key] )) {
|
32 |
-
$pointer = &$pointer[$key];
|
33 |
-
}
|
34 |
-
}
|
35 |
-
unset( $pointer[$last] );
|
36 |
-
return $this->setOptions( $options, $isPluginSetting );
|
37 |
-
}
|
38 |
-
|
39 |
-
/**
|
40 |
-
* Get an option from the plugin options using dot notation
|
41 |
-
*
|
42 |
-
* @param string $path
|
43 |
-
* @param mixed $fallback
|
44 |
-
* @param bool|string $isPluginSetting
|
45 |
-
*
|
46 |
-
* @return mixed
|
47 |
-
*/
|
48 |
-
public function getOption( $path, $fallback = '', $isPluginSetting = false )
|
49 |
-
{
|
50 |
-
$option = $this->getValueFromPath( $path, $fallback, $this->getOptions( $isPluginSetting ));
|
51 |
-
|
52 |
-
// fallback to default settings
|
53 |
-
if( $isPluginSetting && empty( $option )) {
|
54 |
-
|
55 |
-
$defaultPaths = $this->app->getDefaultSettings();
|
56 |
-
|
57 |
-
if( isset( $defaultPaths[ $path ] )) {
|
58 |
-
$option = $defaultPaths[ $path ];
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
-
return $option;
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Get the plugin options database key
|
67 |
-
*
|
68 |
-
* @return string
|
69 |
-
*/
|
70 |
-
public function getOptionName()
|
71 |
-
{
|
72 |
-
return sprintf( '%s-v%d', $this->app->prefix, explode( '.', $this->app->version )[0] );
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Get the plugin options array
|
77 |
-
*
|
78 |
-
* @param bool|string $isPluginSetting
|
79 |
-
* @return array
|
80 |
-
*/
|
81 |
-
public function getOptions( $isPluginSetting = false )
|
82 |
-
{
|
83 |
-
$options = get_option( $this->getOptionName(), [] );
|
84 |
-
if( !is_array( $options )) {
|
85 |
-
delete_option( $this->getOptionName() );
|
86 |
-
$options = [];
|
87 |
-
}
|
88 |
-
if( $isPluginSetting == 'settings' ) {
|
89 |
-
$options = isset( $options['settings'] ) && is_array( $options['settings'] )
|
90 |
-
? $options['settings']
|
91 |
-
: [];
|
92 |
-
}
|
93 |
-
return $options;
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Get a value from an array of values using a dot-notation path as reference
|
98 |
-
*
|
99 |
-
* @param string $path
|
100 |
-
* @param mixed $fallback
|
101 |
-
*
|
102 |
-
* @return null|mixed
|
103 |
-
*/
|
104 |
-
public function getValueFromPath( $path, $fallback, array $values )
|
105 |
-
{
|
106 |
-
if( empty( $path ))return;
|
107 |
-
|
108 |
-
$keys = explode( '.', $path );
|
109 |
-
|
110 |
-
foreach( $keys as $key ) {
|
111 |
-
if( !isset( $values[ $key ] )) {
|
112 |
-
return $fallback;
|
113 |
-
}
|
114 |
-
$values = $values[ $key ];
|
115 |
-
}
|
116 |
-
|
117 |
-
return $values;
|
118 |
-
}
|
119 |
-
|
120 |
-
/**
|
121 |
-
* Removes empty values from an array
|
122 |
-
*
|
123 |
-
* @return array
|
124 |
-
*/
|
125 |
-
public function removeEmptyValuesFrom( array $array )
|
126 |
-
{
|
127 |
-
$result = [];
|
128 |
-
|
129 |
-
foreach( $array as $key => $value ) {
|
130 |
-
if( !$value )continue;
|
131 |
-
$result[ $key ] = is_array( $value )
|
132 |
-
? $this->removeEmptyValuesFrom( $value )
|
133 |
-
: $value;
|
134 |
-
}
|
135 |
-
|
136 |
-
return $result;
|
137 |
-
}
|
138 |
-
|
139 |
-
/**
|
140 |
-
* Resets an option to the provided value and returns the old value
|
141 |
-
*
|
142 |
-
* @param string $path
|
143 |
-
* @param mixed $value
|
144 |
-
* @param bool|string $isPluginSetting
|
145 |
-
*
|
146 |
-
* @return mixed
|
147 |
-
*/
|
148 |
-
public function resetOption( $path = '', $value, $isPluginSetting = false )
|
149 |
-
{
|
150 |
-
$option = $this->getOption( $path, '', $isPluginSetting );
|
151 |
-
|
152 |
-
$this->setOption( $path, $value, $isPluginSetting );
|
153 |
-
|
154 |
-
return $option;
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Sets an option to the plugin settings array using dot notation
|
159 |
-
*
|
160 |
-
* @param string $path
|
161 |
-
* @param mixed $value
|
162 |
-
* @param bool|string $isPluginSetting
|
163 |
-
*
|
164 |
-
* @return bool
|
165 |
-
*/
|
166 |
-
public function setOption( $path, $value, $isPluginSetting = false )
|
167 |
-
{
|
168 |
-
$options = $this->getOptions();
|
169 |
-
|
170 |
-
if( $isPluginSetting ) {
|
171 |
-
$options['settings'] = $this->setValueToPath( $value, $path, $options['settings'] );
|
172 |
-
}
|
173 |
-
else {
|
174 |
-
$options = $this->setValueToPath( $value, $path, $options );
|
175 |
-
}
|
176 |
-
|
177 |
-
return update_option( $this->getOptionName(), $options );
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
* Set options array to the plugin settings
|
182 |
-
*
|
183 |
-
* @param array $options
|
184 |
-
* @param bool|string $isPluginSetting
|
185 |
-
* @return bool
|
186 |
-
*/
|
187 |
-
public function setOptions( $options, $isPluginSetting = false )
|
188 |
-
{
|
189 |
-
$newOptions = $this->getOptions();
|
190 |
-
if( $isPluginSetting ) {
|
191 |
-
$newOptions['settings'] = $options;
|
192 |
-
}
|
193 |
-
else {
|
194 |
-
$newOptions = $options;
|
195 |
-
}
|
196 |
-
return update_option( $this->getOptionName(), $newOptions );
|
197 |
-
}
|
198 |
-
|
199 |
-
/**
|
200 |
-
* Set a value to an array of values using a dot-notation path as reference
|
201 |
-
*
|
202 |
-
* @param mixed $value
|
203 |
-
* @param string $path
|
204 |
-
*
|
205 |
-
* @return array
|
206 |
-
*/
|
207 |
-
public function setValueToPath( $value, $path, array $values )
|
208 |
-
{
|
209 |
-
$token = strtok( $path, '.' );
|
210 |
-
|
211 |
-
$ref = &$values;
|
212 |
-
|
213 |
-
while( $token !== false ) {
|
214 |
-
$ref = is_array( $ref ) ? $ref : [];
|
215 |
-
$ref = &$ref[ $token ];
|
216 |
-
$token = strtok( '.' );
|
217 |
-
}
|
218 |
-
|
219 |
-
$ref = $value;
|
220 |
-
|
221 |
-
return $values;
|
222 |
-
}
|
223 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Database/OptionsContract.php
DELETED
@@ -1,107 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Database;
|
12 |
-
|
13 |
-
interface OptionsContract
|
14 |
-
{
|
15 |
-
/**
|
16 |
-
* Delete a plugin option using dot notation
|
17 |
-
* @param string $path
|
18 |
-
* @param bool|string $isPluginSetting
|
19 |
-
* @return bool
|
20 |
-
*/
|
21 |
-
public function deleteOption( $path, $isPluginSetting = false );
|
22 |
-
|
23 |
-
/**
|
24 |
-
* Get an option from the plugin options using dot notation
|
25 |
-
*
|
26 |
-
* @param string $path
|
27 |
-
* @param mixed $fallback
|
28 |
-
* @param bool|string $isPluginSetting
|
29 |
-
*
|
30 |
-
* @return mixed
|
31 |
-
*/
|
32 |
-
public function getOption( $path, $fallback = '', $isPluginSetting = false );
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Get the plugin options database key
|
36 |
-
*
|
37 |
-
* @return string
|
38 |
-
*/
|
39 |
-
public function getOptionName();
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Get the plugin options array
|
43 |
-
*
|
44 |
-
* @param bool|string $isPluginSetting
|
45 |
-
*
|
46 |
-
* @return array
|
47 |
-
*/
|
48 |
-
public function getOptions( $isPluginSetting = false );
|
49 |
-
|
50 |
-
/**
|
51 |
-
* Get a value from an array of values using a dot-notation path as reference
|
52 |
-
*
|
53 |
-
* @param string $path
|
54 |
-
* @param mixed $fallback
|
55 |
-
*
|
56 |
-
* @return null|mixed
|
57 |
-
*/
|
58 |
-
public function getValueFromPath( $path, $fallback, array $values );
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Removes empty values from an array
|
62 |
-
*
|
63 |
-
* @return array
|
64 |
-
*/
|
65 |
-
public function removeEmptyValuesFrom( array $array );
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Resets an option to the provided value and returns the old value
|
69 |
-
*
|
70 |
-
* @param string $path
|
71 |
-
* @param mixed $value
|
72 |
-
* @param bool|string $isPluginSetting
|
73 |
-
*
|
74 |
-
* @return mixed
|
75 |
-
*/
|
76 |
-
public function resetOption( $path = '', $value, $isPluginSetting = false );
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Sets an option to the plugin settings array using dot notation
|
80 |
-
*
|
81 |
-
* @param string $path
|
82 |
-
* @param mixed $value
|
83 |
-
* @param bool|string $isPluginSetting
|
84 |
-
*
|
85 |
-
* @return bool
|
86 |
-
*/
|
87 |
-
public function setOption( $path, $value, $isPluginSetting = false );
|
88 |
-
|
89 |
-
/**
|
90 |
-
* Set options array to the plugin settings
|
91 |
-
*
|
92 |
-
* @param array $options
|
93 |
-
* @param bool|string $isPluginSetting
|
94 |
-
* @return bool
|
95 |
-
*/
|
96 |
-
public function setOptions( $options, $isPluginSetting = false );
|
97 |
-
|
98 |
-
/**
|
99 |
-
* Set a value to an array of values using a dot-notation path as reference
|
100 |
-
*
|
101 |
-
* @param mixed $value
|
102 |
-
* @param string $path
|
103 |
-
*
|
104 |
-
* @return array
|
105 |
-
*/
|
106 |
-
public function setValueToPath( $value, $path, array $values );
|
107 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Database/QueryBuilder.php
ADDED
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
use GeminiLabs\SiteReviews\Modules\Polylang;
|
8 |
+
use WP_Query;
|
9 |
+
|
10 |
+
class QueryBuilder
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* Build a WP_Query meta_query/tax_query
|
14 |
+
* @return array
|
15 |
+
*/
|
16 |
+
public function buildQuery( array $keys = [], array $values = [] )
|
17 |
+
{
|
18 |
+
$queries = [];
|
19 |
+
foreach( $keys as $key ) {
|
20 |
+
if( !array_key_exists( $key, $values ))continue;
|
21 |
+
$methodName = glsr( Helper::class )->buildMethodName( $key, __FUNCTION__ );
|
22 |
+
if( !method_exists( $this, $methodName ))continue;
|
23 |
+
$query = call_user_func( [$this, $methodName], $values[$key] );
|
24 |
+
if( is_array( $query )) {
|
25 |
+
$queries[] = $query;
|
26 |
+
}
|
27 |
+
}
|
28 |
+
return $queries;
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @return string
|
33 |
+
*/
|
34 |
+
public function buildSqlLines( array $values, array $conditions )
|
35 |
+
{
|
36 |
+
$string = '';
|
37 |
+
$values = array_filter( $values );
|
38 |
+
foreach( $conditions as $key => $value ) {
|
39 |
+
if( !isset( $values[$key] ))continue;
|
40 |
+
$values[$key] = implode( ',', (array)$values[$key] );
|
41 |
+
$string .= strpos( $value, '%s' ) !== false
|
42 |
+
? sprintf( $value, strval( $values[$key] ))
|
43 |
+
: $value;
|
44 |
+
}
|
45 |
+
return $string;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Build a SQL 'OR' string from an array
|
50 |
+
* @param string|array $values
|
51 |
+
* @param string $sprintfFormat
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
public function buildSqlOr( $values, $sprintfFormat )
|
55 |
+
{
|
56 |
+
if( !is_array( $values )) {
|
57 |
+
$values = explode( ',', $values );
|
58 |
+
}
|
59 |
+
$values = array_filter( array_map( 'trim', (array)$values ));
|
60 |
+
$values = array_map( function( $value ) use( $sprintfFormat ) {
|
61 |
+
return sprintf( $sprintfFormat, $value );
|
62 |
+
}, $values );
|
63 |
+
return implode( ' OR ', $values );
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Search SQL filter for matching against post title only.
|
68 |
+
* @link http://wordpress.stackexchange.com/a/11826/1685
|
69 |
+
* @param string $search
|
70 |
+
* @return string
|
71 |
+
* @filter posts_search
|
72 |
+
*/
|
73 |
+
public function filterSearchByTitle( $search, WP_Query $query )
|
74 |
+
{
|
75 |
+
if( empty( $search ) || empty( $query->get( 'search_terms' ))) {
|
76 |
+
return $search;
|
77 |
+
}
|
78 |
+
global $wpdb;
|
79 |
+
$n = empty( $query->get( 'exact' ))
|
80 |
+
? '%'
|
81 |
+
: '';
|
82 |
+
$search = [];
|
83 |
+
foreach( (array)$query->get( 'search_terms' ) as $term ) {
|
84 |
+
$search[] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $n.$wpdb->esc_like( $term ).$n );
|
85 |
+
}
|
86 |
+
if( !is_user_logged_in() ) {
|
87 |
+
$search[] = "{$wpdb->posts}.post_password = ''";
|
88 |
+
}
|
89 |
+
return ' AND '.implode( ' AND ', $search );
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Get the current page number from the global query
|
94 |
+
* @param bool $isEnabled
|
95 |
+
* @return int
|
96 |
+
*/
|
97 |
+
public function getPaged( $isEnabled = true )
|
98 |
+
{
|
99 |
+
$pagedQuery = !is_front_page()
|
100 |
+
? glsr()->constant( 'PAGED_QUERY_VAR' )
|
101 |
+
: 'page';
|
102 |
+
return $isEnabled
|
103 |
+
? max( 1, intval( get_query_var( $pagedQuery )))
|
104 |
+
: 1;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @param string $value
|
109 |
+
* @return void|array
|
110 |
+
*/
|
111 |
+
protected function buildQueryAssignedTo( $value )
|
112 |
+
{
|
113 |
+
if( empty( $value ))return;
|
114 |
+
$postIds = glsr( Helper::class )->convertStringToArray( $value, 'is_numeric' );
|
115 |
+
return [
|
116 |
+
'compare' => 'IN',
|
117 |
+
'key' => 'assigned_to',
|
118 |
+
'value' => glsr( Polylang::class )->getPostIds( $postIds ),
|
119 |
+
];
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* @param array $value
|
124 |
+
* @return void|array
|
125 |
+
*/
|
126 |
+
protected function buildQueryCategory( $value )
|
127 |
+
{
|
128 |
+
if( empty( $value ))return;
|
129 |
+
return [
|
130 |
+
'field' => 'term_id',
|
131 |
+
'taxonomy' => Application::TAXONOMY,
|
132 |
+
'terms' => $value,
|
133 |
+
];
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* @param string $value
|
138 |
+
* @return void|array
|
139 |
+
*/
|
140 |
+
protected function buildQueryRating( $value )
|
141 |
+
{
|
142 |
+
if( !is_numeric( $value ) || !in_array( intval( $value ), range( 1, 5 )))return;
|
143 |
+
return [
|
144 |
+
'compare' => '>=',
|
145 |
+
'key' => 'rating',
|
146 |
+
'value' => $value,
|
147 |
+
];
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* @param string $value
|
152 |
+
* @return void|array
|
153 |
+
*/
|
154 |
+
protected function buildQueryType( $value )
|
155 |
+
{
|
156 |
+
if( in_array( $value, ['','all'] ))return;
|
157 |
+
return [
|
158 |
+
'key' => 'review_type',
|
159 |
+
'value' => $value,
|
160 |
+
];
|
161 |
+
}
|
162 |
+
}
|
plugin/Database/ReviewManager.php
ADDED
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Commands\CreateReview;
|
7 |
+
use GeminiLabs\SiteReviews\Database\DefaultsManager;
|
8 |
+
use GeminiLabs\SiteReviews\Database\QueryBuilder;
|
9 |
+
use GeminiLabs\SiteReviews\Database\SqlQueries;
|
10 |
+
use GeminiLabs\SiteReviews\Defaults\CreateReviewDefaults;
|
11 |
+
use GeminiLabs\SiteReviews\Defaults\ReviewsDefaults;
|
12 |
+
use GeminiLabs\SiteReviews\Helper;
|
13 |
+
use GeminiLabs\SiteReviews\Review;
|
14 |
+
use GeminiLabs\SiteReviews\Reviews;
|
15 |
+
use WP_Post;
|
16 |
+
use WP_Query;
|
17 |
+
|
18 |
+
class ReviewManager
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* @return false|Review
|
22 |
+
*/
|
23 |
+
public function create( CreateReview $command )
|
24 |
+
{
|
25 |
+
$reviewValues = glsr( CreateReviewDefaults::class )->restrict( (array)$command );
|
26 |
+
$reviewValues = apply_filters( 'site-reviews/create/review-values', $reviewValues, $command );
|
27 |
+
$postValues = [
|
28 |
+
'comment_status' => 'closed',
|
29 |
+
'meta_input' => $reviewValues,
|
30 |
+
'ping_status' => 'closed',
|
31 |
+
'post_content' => $reviewValues['content'],
|
32 |
+
'post_date' => $reviewValues['date'],
|
33 |
+
'post_date_gmt' => get_gmt_from_date( $reviewValues['date'] ),
|
34 |
+
'post_name' => $reviewValues['review_type'].'-'.$reviewValues['review_id'],
|
35 |
+
'post_status' => $this->getNewPostStatus( $reviewValues, $command->blacklisted ),
|
36 |
+
'post_title' => $reviewValues['title'],
|
37 |
+
'post_type' => Application::POST_TYPE,
|
38 |
+
];
|
39 |
+
$postId = wp_insert_post( $postValues, true );
|
40 |
+
if( is_wp_error( $postId )) {
|
41 |
+
glsr_log()->error( $postId->get_error_message() )->debug( $postValues );
|
42 |
+
return false;
|
43 |
+
}
|
44 |
+
$this->setTerms( $postId, $command->category );
|
45 |
+
$review = $this->single( get_post( $postId ));
|
46 |
+
do_action( 'site-reviews/review/created', $review, $command );
|
47 |
+
return $review;
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @param string $metaReviewId
|
52 |
+
* @return void
|
53 |
+
*/
|
54 |
+
public function delete( $metaReviewId )
|
55 |
+
{
|
56 |
+
if( $postId = $this->getPostId( $metaReviewId )) {
|
57 |
+
wp_delete_post( $postId, true );
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @return object
|
63 |
+
*/
|
64 |
+
public function get( array $args = [] )
|
65 |
+
{
|
66 |
+
$args = glsr( ReviewsDefaults::class )->restrict( $args );
|
67 |
+
$metaQuery = glsr( QueryBuilder::class )->buildQuery(
|
68 |
+
['assigned_to', 'type', 'rating'],
|
69 |
+
$args
|
70 |
+
);
|
71 |
+
$taxQuery = glsr( QueryBuilder::class )->buildQuery(
|
72 |
+
['category'],
|
73 |
+
['category' => $this->normalizeTermIds( $args['category'] )]
|
74 |
+
);
|
75 |
+
$paged = glsr( QueryBuilder::class )->getPaged(
|
76 |
+
wp_validate_boolean( $args['pagination'] )
|
77 |
+
);
|
78 |
+
$query = new WP_Query([
|
79 |
+
'meta_key' => 'pinned',
|
80 |
+
'meta_query' => $metaQuery,
|
81 |
+
'offset' => $args['offset'],
|
82 |
+
'order' => $args['order'],
|
83 |
+
'orderby' => 'meta_value '.$args['orderby'],
|
84 |
+
'paged' => $paged,
|
85 |
+
'post__in' => $args['post__in'],
|
86 |
+
'post__not_in' => $args['post__not_in'],
|
87 |
+
'post_status' => 'publish',
|
88 |
+
'post_type' => Application::POST_TYPE,
|
89 |
+
'posts_per_page' => $args['count'],
|
90 |
+
'tax_query' => $taxQuery,
|
91 |
+
]);
|
92 |
+
$results = array_map( [$this, 'single'], $query->posts );
|
93 |
+
$reviews = new Reviews( $results, $query->max_num_pages, $args );
|
94 |
+
return apply_filters( 'site-reviews/get/reviews', $reviews, $query );
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* @param string $metaReviewId
|
99 |
+
* @return int
|
100 |
+
*/
|
101 |
+
public function getPostId( $metaReviewId )
|
102 |
+
{
|
103 |
+
return glsr( SqlQueries::class )->getReviewPostId( $metaReviewId );
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* @param string $commaSeparatedTermIds
|
108 |
+
* @return array
|
109 |
+
*/
|
110 |
+
public function normalizeTermIds( $commaSeparatedTermIds )
|
111 |
+
{
|
112 |
+
$termIds = glsr_array_column( $this->normalizeTerms( $commaSeparatedTermIds ), 'term_id' );
|
113 |
+
return array_unique( array_map( 'intval', $termIds ));
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* @param string $commaSeparatedTermIds
|
118 |
+
* @return array
|
119 |
+
*/
|
120 |
+
public function normalizeTerms( $commaSeparatedTermIds )
|
121 |
+
{
|
122 |
+
$terms = [];
|
123 |
+
$termIds = glsr( Helper::class )->convertStringToArray( $commaSeparatedTermIds );
|
124 |
+
foreach( $termIds as $termId ) {
|
125 |
+
if( is_numeric( $termId )) {
|
126 |
+
$termId = intval( $termId );
|
127 |
+
}
|
128 |
+
$term = term_exists( $termId, Application::TAXONOMY );
|
129 |
+
if( !isset( $term['term_id'] ))continue;
|
130 |
+
$terms[] = $term;
|
131 |
+
}
|
132 |
+
return $terms;
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* @param int $postId
|
137 |
+
* @return void
|
138 |
+
*/
|
139 |
+
public function revert( $postId )
|
140 |
+
{
|
141 |
+
if( get_post_field( 'post_type', $postId ) != Application::POST_TYPE )return;
|
142 |
+
delete_post_meta( $postId, '_edit_last' );
|
143 |
+
$result = wp_update_post([
|
144 |
+
'ID' => $postId,
|
145 |
+
'post_content' => get_post_meta( $postId, 'content', true ),
|
146 |
+
'post_date' => get_post_meta( $postId, 'date', true ),
|
147 |
+
'post_title' => get_post_meta( $postId, 'title', true ),
|
148 |
+
]);
|
149 |
+
if( is_wp_error( $result )) {
|
150 |
+
glsr_log()->error( $result->get_error_message() );
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* @return Review
|
156 |
+
*/
|
157 |
+
public function single( WP_Post $post )
|
158 |
+
{
|
159 |
+
if( $post->post_type != Application::POST_TYPE ) {
|
160 |
+
$post = new WP_Post( (object)[] );
|
161 |
+
}
|
162 |
+
$review = new Review( $post );
|
163 |
+
return apply_filters( 'site-reviews/get/review', $review, $post );
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* @param bool $isBlacklisted
|
168 |
+
* @return string
|
169 |
+
*/
|
170 |
+
protected function getNewPostStatus( array $review, $isBlacklisted )
|
171 |
+
{
|
172 |
+
$requireApproval = glsr( OptionManager::class )->getBool( 'settings.general.require.approval' );
|
173 |
+
return $review['review_type'] == 'local' && ( $requireApproval || $isBlacklisted )
|
174 |
+
? 'pending'
|
175 |
+
: 'publish';
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* @param int $postId
|
180 |
+
* @param string $termIds
|
181 |
+
* @return void
|
182 |
+
*/
|
183 |
+
protected function setTerms( $postId, $termIds )
|
184 |
+
{
|
185 |
+
$termIds = $this->normalizeTermIds( $termIds );
|
186 |
+
if( empty( $termIds ))return;
|
187 |
+
$termTaxonomyIds = wp_set_object_terms( $postId, $termIds, Application::TAXONOMY );
|
188 |
+
if( is_wp_error( $termTaxonomyIds )) {
|
189 |
+
glsr_log()->error( $termTaxonomyIds->get_error_message() );
|
190 |
+
}
|
191 |
+
}
|
192 |
+
}
|
plugin/Database/SqlQueries.php
ADDED
@@ -0,0 +1,231 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Database;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database\QueryBuilder;
|
7 |
+
|
8 |
+
class SqlQueries
|
9 |
+
{
|
10 |
+
protected $db;
|
11 |
+
protected $postType;
|
12 |
+
|
13 |
+
public function __construct()
|
14 |
+
{
|
15 |
+
global $wpdb;
|
16 |
+
$this->db = $wpdb;
|
17 |
+
$this->postType = Application::POST_TYPE;
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @param string $sessionCookiePrefix
|
22 |
+
* @return int|false
|
23 |
+
*/
|
24 |
+
public function deleteAllSessions( $sessionCookiePrefix )
|
25 |
+
{
|
26 |
+
return $this->db->query("
|
27 |
+
DELETE
|
28 |
+
FROM {$this->db->options}
|
29 |
+
WHERE option_name LIKE '{$sessionCookiePrefix}_%'
|
30 |
+
");
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @param string $expiredSessions
|
35 |
+
* @return int|false
|
36 |
+
*/
|
37 |
+
public function deleteExpiredSessions( $expiredSessions )
|
38 |
+
{
|
39 |
+
return $this->db->query("
|
40 |
+
DELETE
|
41 |
+
FROM {$this->db->options}
|
42 |
+
WHERE option_name IN ('{$expiredSessions}')
|
43 |
+
");
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @param string $metaKey
|
48 |
+
* @return array
|
49 |
+
*/
|
50 |
+
public function getReviewCountsFor( $metaKey )
|
51 |
+
{
|
52 |
+
return (array) $this->db->get_results("
|
53 |
+
SELECT m.meta_value AS name, COUNT(*) num_posts
|
54 |
+
FROM {$this->db->posts} AS p
|
55 |
+
INNER JOIN {$this->db->postmeta} AS m ON p.ID = m.post_id
|
56 |
+
WHERE p.post_type = '{$this->postType}'
|
57 |
+
AND m.meta_key = '{$metaKey}'
|
58 |
+
GROUP BY name
|
59 |
+
");
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @param string $sessionCookiePrefix
|
64 |
+
* @param int $limit
|
65 |
+
* @return array
|
66 |
+
*/
|
67 |
+
public function getExpiredSessions( $sessionCookiePrefix, $limit )
|
68 |
+
{
|
69 |
+
return $this->db->get_results("
|
70 |
+
SELECT option_name AS name, option_value AS expiration
|
71 |
+
FROM {$this->db->options}
|
72 |
+
WHERE option_name LIKE '{$sessionCookiePrefix}_expires_%'
|
73 |
+
ORDER BY option_value ASC
|
74 |
+
LIMIT 0, {$limit}
|
75 |
+
");
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* @param int $lastPostId
|
80 |
+
* @param int $limit
|
81 |
+
* @return array
|
82 |
+
*/
|
83 |
+
public function getReviewCounts( $lastPostId = 0, $limit = 500 )
|
84 |
+
{
|
85 |
+
return $this->db->get_results("
|
86 |
+
SELECT p.ID, m1.meta_value AS rating, m2.meta_value AS type
|
87 |
+
FROM {$this->db->posts} AS p
|
88 |
+
INNER JOIN {$this->db->postmeta} AS m1 ON p.ID = m1.post_id
|
89 |
+
INNER JOIN {$this->db->postmeta} AS m2 ON p.ID = m2.post_id
|
90 |
+
WHERE p.ID > {$lastPostId}
|
91 |
+
AND p.post_status = 'publish'
|
92 |
+
AND p.post_type = '{$this->postType}'
|
93 |
+
AND m1.meta_key = 'rating'
|
94 |
+
AND m2.meta_key = 'review_type'
|
95 |
+
ORDER By p.ID
|
96 |
+
ASC LIMIT {$limit}
|
97 |
+
", OBJECT );
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* @param string $metaReviewId
|
102 |
+
* @return int
|
103 |
+
*/
|
104 |
+
public function getReviewPostId( $metaReviewId )
|
105 |
+
{
|
106 |
+
$postId = $this->db->get_var("
|
107 |
+
SELECT p.ID
|
108 |
+
FROM {$this->db->posts} AS p
|
109 |
+
INNER JOIN {$this->db->postmeta} AS m ON p.ID = m.post_id
|
110 |
+
WHERE p.post_type = '{$this->postType}'
|
111 |
+
AND m.meta_key = 'review_id'
|
112 |
+
AND m.meta_value = '{$metaReviewId}'
|
113 |
+
");
|
114 |
+
return intval( $postId );
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* @param string $reviewType
|
119 |
+
* @return array
|
120 |
+
*/
|
121 |
+
public function getReviewIdsByType( $reviewType )
|
122 |
+
{
|
123 |
+
$query = $this->db->get_col("
|
124 |
+
SELECT m1.meta_value AS review_id
|
125 |
+
FROM {$this->db->posts} AS p
|
126 |
+
INNER JOIN {$this->db->postmeta} AS m1 ON p.ID = m1.post_id
|
127 |
+
INNER JOIN {$this->db->postmeta} AS m2 ON p.ID = m2.post_id
|
128 |
+
WHERE p.post_type = '{$this->db->postType}'
|
129 |
+
AND m1.meta_key = 'review_id'
|
130 |
+
AND m2.meta_key = 'review_type'
|
131 |
+
AND m2.meta_value = '{$reviewType}'
|
132 |
+
");
|
133 |
+
return array_keys( array_flip( $query ));
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* @param int $postId
|
138 |
+
* @param int $lastPostId
|
139 |
+
* @param int $limit
|
140 |
+
* @return array
|
141 |
+
*/
|
142 |
+
public function getReviewPostCounts( $postId, $lastPostId = 0, $limit = 500 )
|
143 |
+
{
|
144 |
+
return $this->db->get_results("
|
145 |
+
SELECT p.ID, m1.meta_value AS rating, m2.meta_value AS type
|
146 |
+
FROM {$this->db->posts} AS p
|
147 |
+
INNER JOIN {$this->db->postmeta} AS m1 ON p.ID = m1.post_id
|
148 |
+
INNER JOIN {$this->db->postmeta} AS m2 ON p.ID = m2.post_id
|
149 |
+
INNER JOIN {$this->db->postmeta} AS m3 ON p.ID = m3.post_id
|
150 |
+
WHERE p.ID > {$lastPostId}
|
151 |
+
AND p.post_status = 'publish'
|
152 |
+
AND p.post_type = '{$this->postType}'
|
153 |
+
AND m1.meta_key = 'rating'
|
154 |
+
AND m2.meta_key = 'review_type'
|
155 |
+
AND m3.meta_key = 'assigned_to'
|
156 |
+
AND m3.meta_value = {$postId}
|
157 |
+
ORDER By p.ID
|
158 |
+
ASC LIMIT {$limit}
|
159 |
+
", OBJECT );
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* @param int $greaterThanId
|
164 |
+
* @param int $limit
|
165 |
+
* @return array
|
166 |
+
*/
|
167 |
+
public function getReviewRatingsFromIds( array $postIds, $greaterThanId = 0, $limit = 100 )
|
168 |
+
{
|
169 |
+
sort( $postIds );
|
170 |
+
$postIds = array_slice( $postIds, intval( array_search( $greaterThanId, $postIds )), $limit );
|
171 |
+
$postIds = implode( ',', $postIds );
|
172 |
+
return $this->db->get_results("
|
173 |
+
SELECT p.ID, m.meta_value AS rating
|
174 |
+
FROM {$this->db->posts} AS p
|
175 |
+
INNER JOIN {$this->db->postmeta} AS m ON p.ID = m.post_id
|
176 |
+
WHERE p.ID > {$greaterThanId}
|
177 |
+
AND p.ID IN ('{$postIds}')
|
178 |
+
AND p.post_status = 'publish'
|
179 |
+
AND p.post_type = '{$this->postType}'
|
180 |
+
AND m.meta_key = 'rating'
|
181 |
+
ORDER By p.ID
|
182 |
+
ASC LIMIT {$limit}
|
183 |
+
", OBJECT );
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* @param string $key
|
188 |
+
* @param string $status
|
189 |
+
* @return array
|
190 |
+
*/
|
191 |
+
public function getReviewsMeta( $key, $status = 'publish' )
|
192 |
+
{
|
193 |
+
$queryBuilder = glsr( QueryBuilder::class );
|
194 |
+
$key = $queryBuilder->buildSqlOr( $key, "m.meta_key = '%s'" );
|
195 |
+
$status = $queryBuilder->buildSqlOr( $status, "p.post_status = '%s'" );
|
196 |
+
return $this->db->get_col("
|
197 |
+
SELECT DISTINCT m.meta_value
|
198 |
+
FROM {$this->db->postmeta} m
|
199 |
+
LEFT JOIN {$this->db->posts} p ON p.ID = m.post_id
|
200 |
+
WHERE p.post_type = '{$this->postType}'
|
201 |
+
AND ({$key})
|
202 |
+
AND ({$status})
|
203 |
+
ORDER BY m.meta_value
|
204 |
+
");
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* @param int $termTaxonomyId
|
209 |
+
* @param int $lastPostId
|
210 |
+
* @param int $limit
|
211 |
+
* @return array
|
212 |
+
*/
|
213 |
+
public function getReviewTermCounts( $termTaxonomyId, $lastPostId = 0, $limit = 500 )
|
214 |
+
{
|
215 |
+
return $this->db->get_results("
|
216 |
+
SELECT p.ID, m1.meta_value AS rating, m2.meta_value AS type
|
217 |
+
FROM {$this->db->posts} AS p
|
218 |
+
INNER JOIN {$this->db->postmeta} AS m1 ON p.ID = m1.post_id
|
219 |
+
INNER JOIN {$this->db->postmeta} AS m2 ON p.ID = m2.post_id
|
220 |
+
INNER JOIN {$this->db->term_relationships} AS tr ON p.ID = tr.object_id
|
221 |
+
WHERE p.ID > {$lastPostId}
|
222 |
+
AND p.post_status = 'publish'
|
223 |
+
AND p.post_type = '{$this->postType}'
|
224 |
+
AND m1.meta_key = 'rating'
|
225 |
+
AND m2.meta_key = 'review_type'
|
226 |
+
AND tr.term_taxonomy_id = {$termTaxonomyId}
|
227 |
+
ORDER By p.ID
|
228 |
+
ASC LIMIT {$limit}
|
229 |
+
", OBJECT );
|
230 |
+
}
|
231 |
+
}
|
plugin/Defaults/BuilderDefaults.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class BuilderDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'class' => '',
|
16 |
+
'id' => '',
|
17 |
+
'label' => '',
|
18 |
+
'options' => [],
|
19 |
+
'text' => '',
|
20 |
+
'type' => '',
|
21 |
+
'value' => '',
|
22 |
+
];
|
23 |
+
}
|
24 |
+
}
|
plugin/Defaults/CreateReviewDefaults.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
|
8 |
+
class CreateReviewDefaults extends Defaults
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
protected function defaults()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'assigned_to' => '',
|
17 |
+
'author' => '',
|
18 |
+
'avatar' => '',
|
19 |
+
'content' => '',
|
20 |
+
'custom' => '',
|
21 |
+
'date' => current_time( 'mysql' ),
|
22 |
+
'email' => '',
|
23 |
+
'ip_address' => glsr( Helper::class )->getIpAddress(),
|
24 |
+
'pinned' => false,
|
25 |
+
'rating' => '',
|
26 |
+
'response' => '',
|
27 |
+
'review_id' => md5( time().mt_rand() ),
|
28 |
+
'review_type' => 'local',
|
29 |
+
'title' => '',
|
30 |
+
'url' => '',
|
31 |
+
];
|
32 |
+
}
|
33 |
+
}
|
plugin/Defaults/DefaultsAbstract.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Helper;
|
6 |
+
use ReflectionClass;
|
7 |
+
|
8 |
+
abstract class DefaultsAbstract
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @param string $name
|
12 |
+
* @return void|array
|
13 |
+
*/
|
14 |
+
public function __call( $name, array $args = [] )
|
15 |
+
{
|
16 |
+
if( !method_exists( $this, $name ))return;
|
17 |
+
$defaults = call_user_func_array( [$this, $name], $args );
|
18 |
+
$hookName = (new ReflectionClass( $this ))->getShortName();
|
19 |
+
$hookName = str_replace( 'Defaults', '', $hookName );
|
20 |
+
$hookName = glsr( Helper::class )->dashCase( $hookName );
|
21 |
+
return apply_filters( 'site-reviews/defaults/'.$hookName, $defaults, $name );
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* @return array
|
26 |
+
*/
|
27 |
+
abstract protected function defaults();
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @return array
|
31 |
+
*/
|
32 |
+
protected function merge( array $values = [] )
|
33 |
+
{
|
34 |
+
return wp_parse_args( $values, $this->defaults() );
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @return array
|
39 |
+
*/
|
40 |
+
protected function restrict( array $values = [] )
|
41 |
+
{
|
42 |
+
return shortcode_atts( $this->defaults(), $values );
|
43 |
+
}
|
44 |
+
}
|
plugin/Defaults/EmailDefaults.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class EmailDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
$fromName = wp_specialchars_decode( (string)get_option( 'blogname' ), ENT_QUOTES );
|
15 |
+
$fromEmail = (string)get_option( 'admin_email' );
|
16 |
+
return [
|
17 |
+
'after' => '',
|
18 |
+
'attachments' => [],
|
19 |
+
'bcc' => '',
|
20 |
+
'before' => '',
|
21 |
+
'cc' => '',
|
22 |
+
'from' => $fromName.' <'.$fromEmail.'>',
|
23 |
+
'message' => '',
|
24 |
+
'reply-to' => '',
|
25 |
+
'subject' => '',
|
26 |
+
'template' => '',
|
27 |
+
'template-tags' => [],
|
28 |
+
'to' => '',
|
29 |
+
];
|
30 |
+
}
|
31 |
+
}
|
plugin/Defaults/PaginationDefaults.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
7 |
+
|
8 |
+
class PaginationDefaults extends Defaults
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
protected function defaults()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'before_page_number' => '<span class="meta-nav screen-reader-text">'.__( 'Page', 'site-reviews' ).' </span>',
|
17 |
+
'format' => '?'.glsr()->constant( 'PAGED_QUERY_VAR' ).'=%#%',
|
18 |
+
'mid_size' => 1,
|
19 |
+
'next_text' => __( 'Next →', 'site-reviews' ),
|
20 |
+
'prev_text' => __( '← Previous', 'site-reviews' ),
|
21 |
+
'type' => 'plain',
|
22 |
+
];
|
23 |
+
}
|
24 |
+
}
|
plugin/Defaults/PostTypeDefaults.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
7 |
+
|
8 |
+
class PostTypeDefaults extends Defaults
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
protected function defaults()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'columns' => [
|
17 |
+
'title' => __( 'Title', 'site-reviews' ),
|
18 |
+
'date' => __( 'Date', 'site-reviews' ),
|
19 |
+
],
|
20 |
+
'has_archive' => false,
|
21 |
+
'hierarchical' => false,
|
22 |
+
'labels' => [],
|
23 |
+
'menu_icon' => null,
|
24 |
+
'menu_name' => '',
|
25 |
+
'menu_position' => 25,
|
26 |
+
'plural' => '', //Required
|
27 |
+
'post_type' => '', //Required
|
28 |
+
'public' => false,
|
29 |
+
'query_var' => true,
|
30 |
+
'rewrite' => ['with_front' => false],
|
31 |
+
'show_in_menu' => true,
|
32 |
+
'show_ui' => true,
|
33 |
+
'single' => '', //Required
|
34 |
+
'supports' => ['title', 'editor'],
|
35 |
+
'taxonomies' => [],
|
36 |
+
];
|
37 |
+
}
|
38 |
+
}
|
plugin/Defaults/ReviewsDefaults.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class ReviewsDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'assigned_to' => '',
|
16 |
+
'category' => '',
|
17 |
+
'count' => 10,
|
18 |
+
'offset' => '',
|
19 |
+
'order' => 'DESC',
|
20 |
+
'orderby' => 'date',
|
21 |
+
'pagination' => false,
|
22 |
+
'post__in' => [],
|
23 |
+
'post__not_in' => [],
|
24 |
+
'rating' => '',
|
25 |
+
'type' => '',
|
26 |
+
];
|
27 |
+
}
|
28 |
+
}
|
plugin/Defaults/SiteReviewsDefaults.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class SiteReviewsDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'assigned_to' => '',
|
16 |
+
'category' => '',
|
17 |
+
'class' => '',
|
18 |
+
'count' => 5,
|
19 |
+
'fallback' => '',
|
20 |
+
'hide' => [],
|
21 |
+
'id' => '',
|
22 |
+
'offset' => '',
|
23 |
+
'pagination' => false,
|
24 |
+
'rating' => 1,
|
25 |
+
'schema' => false,
|
26 |
+
'title' => '',
|
27 |
+
'type' => '',
|
28 |
+
];
|
29 |
+
}
|
30 |
+
}
|
plugin/Defaults/SiteReviewsFormDefaults.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class SiteReviewsFormDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'assign_to' => '',
|
16 |
+
'category' => '',
|
17 |
+
'class' => '',
|
18 |
+
'description' => '',
|
19 |
+
'excluded' => '',
|
20 |
+
'hide' => '',
|
21 |
+
'id' => '',
|
22 |
+
'title' => '',
|
23 |
+
];
|
24 |
+
}
|
25 |
+
}
|
plugin/Defaults/SiteReviewsSummaryDefaults.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class SiteReviewsSummaryDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'assigned_to' => '',
|
16 |
+
'category' => '',
|
17 |
+
'class' => '',
|
18 |
+
'hide' => '',
|
19 |
+
'id' => '',
|
20 |
+
'labels' => '',
|
21 |
+
'rating' => 1,
|
22 |
+
'schema' => false,
|
23 |
+
'text' => '',
|
24 |
+
'title' => '',
|
25 |
+
'type' => '',
|
26 |
+
];
|
27 |
+
}
|
28 |
+
}
|
plugin/Defaults/SlackDefaults.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class SlackDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'button_text' => __( 'View Review', 'site-reviews' ),
|
16 |
+
'button_url' => '',
|
17 |
+
'color' => '#665068',
|
18 |
+
'fallback' => '',
|
19 |
+
'icon_url' => glsr()->url( 'assets/images/icon.png' ),
|
20 |
+
'pretext' => '',
|
21 |
+
'username' => glsr()->name,
|
22 |
+
];
|
23 |
+
}
|
24 |
+
}
|
plugin/Defaults/StyleFieldsDefaults.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class StyleFieldsDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'input' => '',
|
16 |
+
'input_checkbox' => '',
|
17 |
+
'input_radio' => '',
|
18 |
+
'label' => '',
|
19 |
+
'label_checkbox' => '',
|
20 |
+
'label_radio' => '',
|
21 |
+
'select' => '',
|
22 |
+
'textarea' => '',
|
23 |
+
];
|
24 |
+
}
|
25 |
+
}
|
plugin/Defaults/StyleValidationDefaults.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class StyleValidationDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'error_tag' => 'div',
|
16 |
+
'error_tag_class' => 'glsr-field-error',
|
17 |
+
'field_class' => 'glsr-field',
|
18 |
+
'field_error_class' => 'glsr-has-error',
|
19 |
+
'input_error_class' => 'glsr-is-invalid',
|
20 |
+
'message_error_class' => 'glsr-has-errors',
|
21 |
+
'message_initial_class' => 'glsr-is-visible',
|
22 |
+
'message_success_class' => 'glsr-has-success',
|
23 |
+
'message_tag' => 'div',
|
24 |
+
'message_tag_class' => 'glsr-form-message',
|
25 |
+
];
|
26 |
+
}
|
27 |
+
}
|
plugin/Defaults/ValidateReviewDefaults.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
|
8 |
+
class ValidateReviewDefaults extends Defaults
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return array
|
12 |
+
*/
|
13 |
+
protected function defaults()
|
14 |
+
{
|
15 |
+
return [
|
16 |
+
'assign_to' => '',
|
17 |
+
'category' => '',
|
18 |
+
'content' => '',
|
19 |
+
'email' => '',
|
20 |
+
'form_id' => '',
|
21 |
+
'ip_address' => glsr( Helper::class )->getIpAddress(), // required for Akismet and Blacklist validation
|
22 |
+
'name' => '',
|
23 |
+
'rating' => '0',
|
24 |
+
'terms' => '',
|
25 |
+
'title' => '',
|
26 |
+
];
|
27 |
+
}
|
28 |
+
}
|
plugin/Defaults/ValidationStringsDefaults.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Defaults;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Defaults\DefaultsAbstract as Defaults;
|
6 |
+
|
7 |
+
class ValidationStringsDefaults extends Defaults
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* @return array
|
11 |
+
*/
|
12 |
+
protected function defaults()
|
13 |
+
{
|
14 |
+
return [
|
15 |
+
'accepted' => __( 'This field must be accepted.', 'site-reviews' ),
|
16 |
+
'between' => __( 'This field value must be between %s and %s.', 'site-reviews' ),
|
17 |
+
'betweenlength' => __( 'This field must have between %s and %s characters.', 'site-reviews' ),
|
18 |
+
'email' => __( 'This field requires a valid e-mail address.', 'site-reviews' ),
|
19 |
+
'errors' => __( 'Please fix the submission errors.', 'site-reviews' ),
|
20 |
+
'max' => __( 'Maximum value for this field is %s.', 'site-reviews' ),
|
21 |
+
'maxlength' => __( 'This field allows a maximum of %s characters.', 'site-reviews' ),
|
22 |
+
'min' => __( 'Minimum value for this field is %s.', 'site-reviews' ),
|
23 |
+
'minlength' => __( 'This field requires a minimum of %s characters.', 'site-reviews' ),
|
24 |
+
'number' => __( 'This field requires a number.', 'site-reviews' ),
|
25 |
+
'required' => __( 'This field is required.', 'site-reviews' ),
|
26 |
+
'unsupported' => __( 'The review could not be submitted (unsupported browser).', 'site-reviews' ),
|
27 |
+
];
|
28 |
+
}
|
29 |
+
}
|
plugin/Email.php
DELETED
@@ -1,245 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews;
|
12 |
-
|
13 |
-
use GeminiLabs\SiteReviews\App;
|
14 |
-
|
15 |
-
class Email
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* @var App
|
19 |
-
*/
|
20 |
-
protected $app;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* @var array
|
24 |
-
*/
|
25 |
-
protected $attachments;
|
26 |
-
|
27 |
-
/**
|
28 |
-
* @var array
|
29 |
-
*/
|
30 |
-
protected $headers;
|
31 |
-
|
32 |
-
/**
|
33 |
-
* @var string
|
34 |
-
*/
|
35 |
-
protected $message;
|
36 |
-
|
37 |
-
/**
|
38 |
-
* @var string
|
39 |
-
*/
|
40 |
-
protected $subject;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* @var string
|
44 |
-
*/
|
45 |
-
protected $to;
|
46 |
-
|
47 |
-
public function __construct( App $app )
|
48 |
-
{
|
49 |
-
$this->app = $app;
|
50 |
-
}
|
51 |
-
|
52 |
-
/**
|
53 |
-
* @return Email
|
54 |
-
*/
|
55 |
-
public function compose( array $email )
|
56 |
-
{
|
57 |
-
$email = $this->normalize( $email );
|
58 |
-
// glsr_log( 'Email to send: '.(string)wp_json_encode( $email ));
|
59 |
-
|
60 |
-
$this->attachments = $email['attachments'];
|
61 |
-
$this->headers = $this->buildHeaders( $email );
|
62 |
-
$this->message = $this->buildHtmlMessage( $email );
|
63 |
-
$this->subject = $email['subject'];
|
64 |
-
$this->to = $email['to'];
|
65 |
-
|
66 |
-
add_action( 'phpmailer_init', [ $this, 'buildPlainTextMessage'] );
|
67 |
-
|
68 |
-
return $this;
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* @return string|null
|
73 |
-
*/
|
74 |
-
public function read( $plaintext = false )
|
75 |
-
{
|
76 |
-
if( !!$plaintext ) {
|
77 |
-
$message = $this->stripHtmlTags( $this->message );
|
78 |
-
|
79 |
-
return apply_filters( 'site-reviews/email/message', $message, 'text', $this );
|
80 |
-
}
|
81 |
-
|
82 |
-
return $this->message;
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* @return void|bool
|
87 |
-
*/
|
88 |
-
public function send()
|
89 |
-
{
|
90 |
-
if( !$this->message || !$this->subject || !$this->to )return;
|
91 |
-
// glsr_log( 'Sending email now...' );
|
92 |
-
$sent = wp_mail(
|
93 |
-
$this->to,
|
94 |
-
$this->subject,
|
95 |
-
$this->message,
|
96 |
-
$this->headers,
|
97 |
-
$this->attachments
|
98 |
-
);
|
99 |
-
// glsr_log( 'Result of wp_mail(): '.var_export( $sent, true ));
|
100 |
-
$this->reset();
|
101 |
-
return $sent;
|
102 |
-
}
|
103 |
-
|
104 |
-
/**
|
105 |
-
* @return void
|
106 |
-
*
|
107 |
-
* @action phpmailer_init
|
108 |
-
*/
|
109 |
-
public function buildPlainTextMessage( $phpmailer )
|
110 |
-
{
|
111 |
-
if( $phpmailer->ContentType === 'text/plain' || !empty( $phpmailer->AltBody ))return;
|
112 |
-
|
113 |
-
$message = $this->stripHtmlTags( $phpmailer->Body );
|
114 |
-
|
115 |
-
$phpmailer->AltBody = apply_filters( 'site-reviews/email/message', $message, 'text', $this );
|
116 |
-
}
|
117 |
-
|
118 |
-
/**
|
119 |
-
* @return array
|
120 |
-
*/
|
121 |
-
protected function buildHeaders( $email )
|
122 |
-
{
|
123 |
-
$allowed = [
|
124 |
-
'bcc',
|
125 |
-
'cc',
|
126 |
-
'from',
|
127 |
-
'reply-to',
|
128 |
-
];
|
129 |
-
|
130 |
-
$headers = array_intersect_key( $email, array_flip( $allowed ));
|
131 |
-
$headers = array_filter( $headers );
|
132 |
-
|
133 |
-
foreach( $headers as $key => $value ) {
|
134 |
-
unset( $headers[ $key ] );
|
135 |
-
$headers[] = "{$key}: {$value}";
|
136 |
-
}
|
137 |
-
|
138 |
-
$headers[] = 'Content-Type: text/html';
|
139 |
-
|
140 |
-
return apply_filters( 'site-reviews/email/headers', $headers, $this );
|
141 |
-
}
|
142 |
-
|
143 |
-
/**
|
144 |
-
* @return string
|
145 |
-
*/
|
146 |
-
protected function buildHtmlMessage( $email )
|
147 |
-
{
|
148 |
-
$html = $this->app->make( 'Html' );
|
149 |
-
|
150 |
-
$template = trim( $this->app->make( 'Database' )->getOption( 'settings.general.notification_message' ));
|
151 |
-
|
152 |
-
if( !empty( $template )) {
|
153 |
-
$message = $html->renderTemplateString( $template, $email['template-tags'] );
|
154 |
-
}
|
155 |
-
else if( $email['template'] ) {
|
156 |
-
$message = $html->renderTemplate( "email/templates/{$email['template']}", $email['template-tags'] );
|
157 |
-
}
|
158 |
-
|
159 |
-
if( !isset( $message )) {
|
160 |
-
$message = $email['message'];
|
161 |
-
}
|
162 |
-
|
163 |
-
$message = $email['before'] . $message . $email['after'];
|
164 |
-
|
165 |
-
$body = $html->renderTemplate( 'email/index', [] );
|
166 |
-
|
167 |
-
$message = strip_shortcodes( $message );
|
168 |
-
$message = wptexturize( $message );
|
169 |
-
$message = wpautop( $message );
|
170 |
-
$message = str_replace( '<> ', '', $message );
|
171 |
-
$message = str_replace( ']]>', ']]>', $message );
|
172 |
-
$message = str_replace( '{message}', $message, $body );
|
173 |
-
$message = stripslashes( $message );
|
174 |
-
|
175 |
-
return apply_filters( 'site-reviews/email/message', $message, 'html', $this );
|
176 |
-
}
|
177 |
-
|
178 |
-
/**
|
179 |
-
* @return array
|
180 |
-
*/
|
181 |
-
protected function normalize( $email )
|
182 |
-
{
|
183 |
-
$fromName = wp_specialchars_decode( (string) get_option( 'blogname' ), ENT_QUOTES );
|
184 |
-
$fromEmail = get_option( 'admin_email' );
|
185 |
-
|
186 |
-
$defaults = [
|
187 |
-
'after' => '',
|
188 |
-
'attachments' => [],
|
189 |
-
'bcc' => '',
|
190 |
-
'before' => '',
|
191 |
-
'cc' => '',
|
192 |
-
'from' => "{$fromName} <{$fromEmail}>",
|
193 |
-
'message' => '',
|
194 |
-
'reply-to' => '',
|
195 |
-
'subject' => '',
|
196 |
-
'template' => '',
|
197 |
-
'template-tags' => [],
|
198 |
-
'to' => '',
|
199 |
-
];
|
200 |
-
|
201 |
-
$email = shortcode_atts( $defaults, $email );
|
202 |
-
|
203 |
-
!empty( $email['reply-to'] ) ?: $email['reply-to'] = $email['from'];
|
204 |
-
|
205 |
-
return apply_filters( 'site-reviews/email/compose', $email, $this );
|
206 |
-
}
|
207 |
-
|
208 |
-
/**
|
209 |
-
* @return void
|
210 |
-
*/
|
211 |
-
protected function reset()
|
212 |
-
{
|
213 |
-
$this->attachments = [];
|
214 |
-
$this->headers = [];
|
215 |
-
$this->message = null;
|
216 |
-
$this->subject = null;
|
217 |
-
$this->to = null;
|
218 |
-
}
|
219 |
-
|
220 |
-
/**
|
221 |
-
* @return string
|
222 |
-
*/
|
223 |
-
protected function stripHtmlTags( $string )
|
224 |
-
{
|
225 |
-
// remove invisible elements
|
226 |
-
$string = preg_replace( '@<(embed|head|noembed|noscript|object|script|style)[^>]*?>.*?</\\1>@siu', '', $string );
|
227 |
-
|
228 |
-
// replace certain elements with a line-break
|
229 |
-
$string = preg_replace( '@</(div|h[1-9]|p|pre|tr)@iu', "\r\n\$0", $string );
|
230 |
-
|
231 |
-
// replace other elements with a space
|
232 |
-
$string = preg_replace( '@</(td|th)@iu', " \$0", $string );
|
233 |
-
|
234 |
-
// add a placeholder for plain-text bullets to list elements
|
235 |
-
$string = preg_replace( '@<(li)[^>]*?>@siu', "\$0-o-^-o-", $string );
|
236 |
-
|
237 |
-
// strip all remaining HTML tags
|
238 |
-
$string = wp_strip_all_tags( $string );
|
239 |
-
$string = wp_specialchars_decode( $string, ENT_QUOTES );
|
240 |
-
$string = preg_replace( '/\v(?:[\v\h]+){2,}/', "\r\n\r\n", $string );
|
241 |
-
$string = str_replace( '-o-^-o-', ' - ', $string );
|
242 |
-
|
243 |
-
return html_entity_decode( $string, ENT_QUOTES, 'UTF-8' );
|
244 |
-
}
|
245 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Filters.php
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Contracts\HooksContract;
|
7 |
+
use GeminiLabs\SiteReviews\Controllers\AdminController;
|
8 |
+
use GeminiLabs\SiteReviews\Controllers\BlocksController;
|
9 |
+
use GeminiLabs\SiteReviews\Controllers\EditorController;
|
10 |
+
use GeminiLabs\SiteReviews\Controllers\ListTableController;
|
11 |
+
use GeminiLabs\SiteReviews\Controllers\MainController;
|
12 |
+
use GeminiLabs\SiteReviews\Controllers\PublicController;
|
13 |
+
use GeminiLabs\SiteReviews\Modules\Translator;
|
14 |
+
|
15 |
+
class Filters implements HooksContract
|
16 |
+
{
|
17 |
+
protected $app;
|
18 |
+
protected $admin;
|
19 |
+
protected $basename;
|
20 |
+
protected $blocks;
|
21 |
+
protected $editor;
|
22 |
+
protected $listtable;
|
23 |
+
protected $main;
|
24 |
+
protected $public;
|
25 |
+
protected $translator;
|
26 |
+
|
27 |
+
public function __construct( Application $app ) {
|
28 |
+
$this->app = $app;
|
29 |
+
$this->admin = $app->make( AdminController::class );
|
30 |
+
$this->basename = plugin_basename( $app->file );
|
31 |
+
$this->blocks = $app->make( BlocksController::class );
|
32 |
+
$this->editor = $app->make( EditorController::class );
|
33 |
+
$this->listtable = $app->make( ListTableController::class );
|
34 |
+
$this->main = $app->make( MainController::class );
|
35 |
+
$this->public = $app->make( PublicController::class );
|
36 |
+
$this->translator = $app->make( Translator::class );
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @return void
|
41 |
+
*/
|
42 |
+
public function run()
|
43 |
+
{
|
44 |
+
add_filter( 'mce_external_plugins', [$this->admin, 'filterTinymcePlugins'], 15 );
|
45 |
+
add_filter( 'plugin_action_links_'.$this->basename, [$this->admin, 'filterActionLinks'] );
|
46 |
+
add_filter( 'dashboard_glance_items', [$this->admin, 'filterDashboardGlanceItems'] );
|
47 |
+
add_filter( 'block_categories', [$this->blocks, 'filterBlockCategories'] );
|
48 |
+
add_filter( 'classic_editor_enabled_editors_for_post_type', [$this->blocks, 'filterEnabledEditors'], 10, 2 );
|
49 |
+
add_filter( 'use_block_editor_for_post_type', [$this->blocks, 'filterUseBlockEditor'], 10, 2 );
|
50 |
+
add_filter( 'wp_editor_settings', [$this->editor, 'filterEditorSettings'] );
|
51 |
+
add_filter( 'the_editor', [$this->editor, 'filterEditorTextarea'] );
|
52 |
+
add_filter( 'gettext', [$this->editor, 'filterPostStatusLabels'], 10, 3 );
|
53 |
+
add_filter( 'gettext_with_context', [$this->editor, 'filterPostStatusLabelsWithContext'], 10, 4 );
|
54 |
+
add_filter( 'post_updated_messages', [$this->editor, 'filterUpdateMessages'] );
|
55 |
+
add_filter( 'bulk_post_updated_messages', [$this->listtable, 'filterBulkUpdateMessages'], 10, 2 );
|
56 |
+
add_filter( 'manage_'.Application::POST_TYPE.'_posts_columns', [$this->listtable, 'filterColumnsForPostType'] );
|
57 |
+
add_filter( 'post_date_column_status', [$this->listtable, 'filterDateColumnStatus'], 10, 2 );
|
58 |
+
add_filter( 'default_hidden_columns', [$this->listtable, 'filterDefaultHiddenColumns'], 10, 2 );
|
59 |
+
add_filter( 'display_post_states', [$this->listtable, 'filterPostStates'], 10, 2 );
|
60 |
+
add_filter( 'post_row_actions', [$this->listtable, 'filterRowActions'], 10, 2 );
|
61 |
+
add_filter( 'manage_edit-'.Application::POST_TYPE.'_sortable_columns', [$this->listtable, 'filterSortableColumns'] );
|
62 |
+
add_filter( 'ngettext', [$this->listtable, 'filterStatusText'], 10, 5 );
|
63 |
+
add_filter( 'script_loader_tag', [$this->public, 'filterEnqueuedScripts'], 10, 2 );
|
64 |
+
add_filter( 'site-reviews/config/forms/submission-form', [$this->public, 'filterFieldOrder'], 11 );
|
65 |
+
add_filter( 'query_vars', [$this->public, 'filterQueryVars'] );
|
66 |
+
add_filter( 'site-reviews/render/view', [$this->public, 'filterRenderView'] );
|
67 |
+
add_filter( 'gettext', [$this->translator, 'filterGettext'], 10, 3 );
|
68 |
+
add_filter( 'gettext_with_context', [$this->translator, 'filterGettextWithContext'], 10, 4 );
|
69 |
+
add_filter( 'ngettext', [$this->translator, 'filterNgettext'], 10, 5 );
|
70 |
+
add_filter( 'ngettext_with_context', [$this->translator, 'filterNgettextWithContext'], 10, 6 );
|
71 |
+
}
|
72 |
+
}
|
plugin/Handlers/ChangeStatus.php
CHANGED
@@ -1,16 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
|
|
13 |
use GeminiLabs\SiteReviews\Commands\ChangeStatus as Command;
|
|
|
14 |
|
15 |
class ChangeStatus
|
16 |
{
|
@@ -20,25 +14,61 @@ class ChangeStatus
|
|
20 |
public function handle( Command $command )
|
21 |
{
|
22 |
$postId = wp_update_post([
|
23 |
-
'ID'
|
24 |
'post_status' => $command->status,
|
25 |
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
$title = _draft_or_post_title( $postId );
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
ob_start();
|
36 |
-
|
37 |
-
|
|
|
38 |
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
}
|
44 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
use GeminiLabs\SiteReviews\Commands\ChangeStatus as Command;
|
7 |
+
use GeminiLabs\SiteReviews\Modules\Html\Builder;
|
8 |
|
9 |
class ChangeStatus
|
10 |
{
|
14 |
public function handle( Command $command )
|
15 |
{
|
16 |
$postId = wp_update_post([
|
17 |
+
'ID' => $command->id,
|
18 |
'post_status' => $command->status,
|
19 |
]);
|
20 |
+
if( is_wp_error( $postId )) {
|
21 |
+
glsr_log()->error( $postId->get_error_message() );
|
22 |
+
return [];
|
23 |
+
}
|
24 |
+
return [
|
25 |
+
'class' => 'status-'.$command->status,
|
26 |
+
'counts' => $this->getStatusLinks(),
|
27 |
+
'link' => $this->getPostLink( $postId ).$this->getPostState( $postId ),
|
28 |
+
];
|
29 |
+
}
|
30 |
|
31 |
+
/**
|
32 |
+
* @param int $postId
|
33 |
+
* @return string
|
34 |
+
*/
|
35 |
+
protected function getPostLink( $postId )
|
36 |
+
{
|
37 |
$title = _draft_or_post_title( $postId );
|
38 |
+
return glsr( Builder::class )->a( $title, [
|
39 |
+
'aria-label' => '“'.esc_attr( $title ).'” ('.__( 'Edit', 'site-reviews' ).')',
|
40 |
+
'class' => 'row-title',
|
41 |
+
'href' => get_edit_post_link( $postId ),
|
42 |
+
]);
|
43 |
+
}
|
44 |
|
45 |
+
/**
|
46 |
+
* @param int $postId
|
47 |
+
* @return string
|
48 |
+
*/
|
49 |
+
protected function getPostState( $postId )
|
50 |
+
{
|
51 |
ob_start();
|
52 |
+
_post_states( get_post( $postId ));
|
53 |
+
return ob_get_clean();
|
54 |
+
}
|
55 |
|
56 |
+
/**
|
57 |
+
* @return void|string
|
58 |
+
*/
|
59 |
+
protected function getStatusLinks()
|
60 |
+
{
|
61 |
+
global $avail_post_stati;
|
62 |
+
require_once( ABSPATH.'wp-admin/includes/class-wp-posts-list-table.php' );
|
63 |
+
$hookName = 'edit-'.Application::POST_TYPE;
|
64 |
+
set_current_screen( $hookName );
|
65 |
+
$avail_post_stati = get_available_post_statuses( Application::POST_TYPE );
|
66 |
+
$table = new \WP_Posts_List_Table( ['screen' => $hookName] );
|
67 |
+
$views = apply_filters( 'views_'.$hookName, $table->get_views() ); // uses compat get_views()
|
68 |
+
if( empty( $views ))return;
|
69 |
+
foreach( $views as $class => $view ) {
|
70 |
+
$views[$class] = "\t<li class='$class'>$view";
|
71 |
+
}
|
72 |
+
return implode( ' |</li>', $views ).'</li>';
|
73 |
}
|
74 |
}
|
plugin/Handlers/CreateReview.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Commands\CreateReview as Command;
|
6 |
+
use GeminiLabs\SiteReviews\Database\ReviewManager;
|
7 |
+
use GeminiLabs\SiteReviews\Modules\Notification;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Session;
|
9 |
+
|
10 |
+
class CreateReview
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* @return void|string
|
14 |
+
*/
|
15 |
+
public function handle( Command $command )
|
16 |
+
{
|
17 |
+
$review = glsr( ReviewManager::class )->create( $command );
|
18 |
+
if( !$review ) {
|
19 |
+
glsr( Session::class )->set( $command->form_id.'errors', [] );
|
20 |
+
glsr( Session::class )->set( $command->form_id.'message', __( 'Your review could not be submitted and the error has been logged. Please notify the site admin.', 'site-reviews' ));
|
21 |
+
return;
|
22 |
+
}
|
23 |
+
glsr( Session::class )->set( $command->form_id.'message', __( 'Your review has been submitted!', 'site-reviews' ));
|
24 |
+
glsr( Notification::class )->send( $review );
|
25 |
+
if( $command->ajax_request )return;
|
26 |
+
wp_safe_redirect( $this->getReferer( $command ));
|
27 |
+
exit;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* @return string
|
32 |
+
*/
|
33 |
+
protected function getReferer( Command $command )
|
34 |
+
{
|
35 |
+
$referer = trim( strval( get_post_meta( $command->post_id, 'redirect_to', true )));
|
36 |
+
$referer = apply_filters( 'site-reviews/review/redirect', $referer, $command );
|
37 |
+
if( empty( $referer )) {
|
38 |
+
$referer = $command->referer;
|
39 |
+
}
|
40 |
+
if( empty( $referer )) {
|
41 |
+
glsr_log()->warning( 'The form referer ($_SERVER[REQUEST_URI]) was empty.' )->info( $command );
|
42 |
+
$referer = home_url();
|
43 |
+
}
|
44 |
+
return $referer;
|
45 |
+
}
|
46 |
+
}
|
plugin/Handlers/EnqueueAdminAssets.php
ADDED
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Commands\EnqueueAdminAssets as Command;
|
7 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsShortcode;
|
8 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsFormShortcode;
|
9 |
+
use GeminiLabs\SiteReviews\Shortcodes\SiteReviewsSummaryShortcode;
|
10 |
+
|
11 |
+
class EnqueueAdminAssets
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @var array
|
15 |
+
*/
|
16 |
+
protected $pointers;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @return void
|
20 |
+
*/
|
21 |
+
public function handle( Command $command )
|
22 |
+
{
|
23 |
+
$this->generatePointers( $command->pointers );
|
24 |
+
$this->enqueueAssets();
|
25 |
+
$this->localizeAssets();
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @return void
|
30 |
+
*/
|
31 |
+
public function enqueueAssets()
|
32 |
+
{
|
33 |
+
wp_enqueue_style(
|
34 |
+
Application::ID,
|
35 |
+
glsr()->url( 'assets/styles/'.Application::ID.'-admin.css' ),
|
36 |
+
[],
|
37 |
+
glsr()->version
|
38 |
+
);
|
39 |
+
if( !$this->isCurrentScreen() )return;
|
40 |
+
wp_enqueue_script(
|
41 |
+
Application::ID,
|
42 |
+
glsr()->url( 'assets/scripts/'.Application::ID.'-admin.js' ),
|
43 |
+
$this->getDependencies(),
|
44 |
+
glsr()->version,
|
45 |
+
true
|
46 |
+
);
|
47 |
+
if( !empty( $this->pointers )) {
|
48 |
+
wp_enqueue_style( 'wp-pointer' );
|
49 |
+
wp_enqueue_script( 'wp-pointer' );
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @return void
|
55 |
+
*/
|
56 |
+
public function localizeAssets()
|
57 |
+
{
|
58 |
+
$variables = [
|
59 |
+
'action' => Application::PREFIX.'action',
|
60 |
+
'addons' => [],
|
61 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
62 |
+
'hideoptions' => [
|
63 |
+
'site_reviews' => glsr( SiteReviewsShortcode::class )->getHideOptions(),
|
64 |
+
'site_reviews_form' => glsr( SiteReviewsFormShortcode::class )->getHideOptions(),
|
65 |
+
'site_reviews_summary' => glsr( SiteReviewsSummaryShortcode::class )->getHideOptions(),
|
66 |
+
],
|
67 |
+
'nameprefix' => Application::ID,
|
68 |
+
'nonce' => [
|
69 |
+
'change-status' => wp_create_nonce( 'change-status' ),
|
70 |
+
'clear-console' => wp_create_nonce( 'clear-console' ),
|
71 |
+
'count-reviews' => wp_create_nonce( 'count-reviews' ),
|
72 |
+
'fetch-console' => wp_create_nonce( 'fetch-console' ),
|
73 |
+
'mce-shortcode' => wp_create_nonce( 'mce-shortcode' ),
|
74 |
+
'sync-reviews' => wp_create_nonce( 'sync-reviews' ),
|
75 |
+
'toggle-pinned' => wp_create_nonce( 'toggle-pinned' ),
|
76 |
+
],
|
77 |
+
'pointers' => $this->pointers,
|
78 |
+
'shortcodes' => [],
|
79 |
+
'tinymce' => [
|
80 |
+
'glsr_shortcode' => glsr()->url( 'assets/scripts/mce-plugin.js' ),
|
81 |
+
],
|
82 |
+
];
|
83 |
+
if( user_can_richedit() ) {
|
84 |
+
$variables['shortcodes'] = $this->localizeShortcodes();
|
85 |
+
}
|
86 |
+
$variables = apply_filters( 'site-reviews/enqueue/admin/localize', $variables );
|
87 |
+
wp_localize_script( Application::ID, 'GLSR', $variables );
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* @return array
|
92 |
+
*/
|
93 |
+
protected function getDependencies()
|
94 |
+
{
|
95 |
+
$dependencies = apply_filters( 'site-reviews/enqueue/admin/dependencies', [] );
|
96 |
+
$dependencies = array_merge( $dependencies, [
|
97 |
+
'jquery', 'jquery-ui-sortable', 'underscore', 'wp-util',
|
98 |
+
]);
|
99 |
+
return $dependencies;
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* @return array
|
104 |
+
*/
|
105 |
+
protected function generatePointer( array $pointer )
|
106 |
+
{
|
107 |
+
return [
|
108 |
+
'id' => $pointer['id'],
|
109 |
+
'options' => [
|
110 |
+
'content' => '<h3>'.$pointer['title'].'</h3><p>'.$pointer['content'].'</p>',
|
111 |
+
'position' => $pointer['position'],
|
112 |
+
],
|
113 |
+
'screen' => $pointer['screen'],
|
114 |
+
'target' => $pointer['target'],
|
115 |
+
];
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* @return void
|
120 |
+
*/
|
121 |
+
protected function generatePointers( array $pointers )
|
122 |
+
{
|
123 |
+
$dismissedPointers = get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true );
|
124 |
+
$dismissedPointers = explode( ',', (string)$dismissedPointers );
|
125 |
+
$generatedPointers = [];
|
126 |
+
foreach( $pointers as $pointer ) {
|
127 |
+
if( $pointer['screen'] != glsr_current_screen()->id )continue;
|
128 |
+
if( in_array( $pointer['id'], $dismissedPointers ))continue;
|
129 |
+
$generatedPointers[] = $this->generatePointer( $pointer );
|
130 |
+
}
|
131 |
+
$this->pointers = $generatedPointers;
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* @return bool
|
136 |
+
*/
|
137 |
+
protected function isCurrentScreen()
|
138 |
+
{
|
139 |
+
$screen = glsr_current_screen();
|
140 |
+
return $screen && ( $screen->post_type == Application::POST_TYPE
|
141 |
+
|| $screen->base == 'post'
|
142 |
+
|| $screen->id == 'dashboard'
|
143 |
+
|| $screen->id == 'widgets'
|
144 |
+
);
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* @return array
|
149 |
+
*/
|
150 |
+
protected function localizeShortcodes()
|
151 |
+
{
|
152 |
+
$variables = [];
|
153 |
+
foreach( glsr()->mceShortcodes as $tag => $args ) {
|
154 |
+
if( empty( $args['required'] ))continue;
|
155 |
+
$variables[$tag] = $args['required'];
|
156 |
+
}
|
157 |
+
return $variables;
|
158 |
+
}
|
159 |
+
}
|
plugin/Handlers/EnqueueAssets.php
DELETED
@@ -1,191 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
-
|
13 |
-
use GeminiLabs\SiteReviews\App;
|
14 |
-
use GeminiLabs\SiteReviews\Commands\EnqueueAssets as Command;
|
15 |
-
|
16 |
-
class EnqueueAssets
|
17 |
-
{
|
18 |
-
/**
|
19 |
-
* @var array
|
20 |
-
*/
|
21 |
-
protected $dependencies;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* @return void
|
25 |
-
*/
|
26 |
-
public function handle( Command $command )
|
27 |
-
{
|
28 |
-
$this->dependencies = glsr_resolve( 'Html' )->getDependencies();
|
29 |
-
$ajaxNonce = wp_create_nonce( glsr_app()->id.'-ajax-nonce' );
|
30 |
-
$variables = [
|
31 |
-
'action' => glsr_app()->prefix.'_action',
|
32 |
-
'ajaxnonce' => $ajaxNonce,
|
33 |
-
'ajaxpagination' => ['#wpadminbar','.site-navigation-fixed'],
|
34 |
-
'ajaxurl' => add_query_arg( '_nonce', $ajaxNonce, admin_url( 'admin-ajax.php' )),
|
35 |
-
];
|
36 |
-
if( is_admin() ) {
|
37 |
-
$this->enqueueAdmin( $command );
|
38 |
-
$this->enqueueTinymce( $command );
|
39 |
-
$variables = array_merge( $variables, [
|
40 |
-
'shortcodes' => $this->localizeShortcodes(),
|
41 |
-
'tinymce' => [
|
42 |
-
'glsr_shortcode' => glsr_app()->url.'assets/js/mce-plugin.js',
|
43 |
-
],
|
44 |
-
]);
|
45 |
-
}
|
46 |
-
else {
|
47 |
-
$this->enqueuePolyfillService( $command );
|
48 |
-
$this->enqueuePublic( $command );
|
49 |
-
}
|
50 |
-
wp_localize_script( $command->handle, 'site_reviews', apply_filters( 'site-reviews/enqueue/localize', $variables ));
|
51 |
-
}
|
52 |
-
|
53 |
-
/**
|
54 |
-
* @return void
|
55 |
-
*/
|
56 |
-
public function enqueueAdmin( Command $command )
|
57 |
-
{
|
58 |
-
$screen = glsr_current_screen();
|
59 |
-
$dependencies = array_merge( $this->dependencies, [
|
60 |
-
'jquery',
|
61 |
-
'jquery-ui-sortable',
|
62 |
-
'underscore',
|
63 |
-
'wp-util',
|
64 |
-
]);
|
65 |
-
wp_enqueue_style(
|
66 |
-
$command->handle,
|
67 |
-
$command->url.'css/site-reviews-admin.css',
|
68 |
-
[],
|
69 |
-
$command->version
|
70 |
-
);
|
71 |
-
if( !( $screen->post_type == App::POST_TYPE
|
72 |
-
|| $screen->base == 'post'
|
73 |
-
|| $screen->id == 'dashboard'
|
74 |
-
|| $screen->id == 'widgets'
|
75 |
-
))return;
|
76 |
-
wp_enqueue_script(
|
77 |
-
$command->handle,
|
78 |
-
$command->url.'js/site-reviews-admin.js',
|
79 |
-
$dependencies,
|
80 |
-
$command->version,
|
81 |
-
true
|
82 |
-
);
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* @return void
|
87 |
-
*/
|
88 |
-
public function enqueuePublic( Command $command )
|
89 |
-
{
|
90 |
-
$currentTheme = sanitize_title( (string) wp_get_theme()->get( 'Name' ));
|
91 |
-
$stylesheet = file_exists( $command->path.'css/'.$currentTheme.'.css' )
|
92 |
-
? $command->url.'css/'.$currentTheme.'.css'
|
93 |
-
: $command->url.'css/site-reviews.css';
|
94 |
-
if( apply_filters( 'site-reviews/assets/css', true )) {
|
95 |
-
wp_enqueue_style( $command->handle, $stylesheet, [], $command->version );
|
96 |
-
}
|
97 |
-
if( glsr_get_option( 'reviews-form.recaptcha.integration' ) == 'custom' ) {
|
98 |
-
$this->enqueueRecaptchaScript( $command );
|
99 |
-
}
|
100 |
-
if( apply_filters( 'site-reviews/assets/js', true )) {
|
101 |
-
$dependencies = apply_filters( 'site-reviews/assets/polyfill', true )
|
102 |
-
? [$command->handle.'/polyfill']
|
103 |
-
: [];
|
104 |
-
$dependencies = apply_filters( 'site-reviews/enqueue/public/dependencies', $dependencies );
|
105 |
-
wp_enqueue_script(
|
106 |
-
$command->handle,
|
107 |
-
$command->url.'js/site-reviews.js',
|
108 |
-
$dependencies,
|
109 |
-
$command->version,
|
110 |
-
true
|
111 |
-
);
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* @return void
|
117 |
-
*/
|
118 |
-
public function enqueuePolyfillService( Command $command )
|
119 |
-
{
|
120 |
-
if( !apply_filters( 'site-reviews/assets/polyfill', true ))return;
|
121 |
-
wp_enqueue_script( $command->handle.'/polyfill', add_query_arg([
|
122 |
-
'features' => 'CustomEvent,Element.prototype.closest,Element.prototype.dataset,Event',
|
123 |
-
'flags' => 'gated',
|
124 |
-
], 'https://cdn.polyfill.io/v2/polyfill.min.js' ));
|
125 |
-
}
|
126 |
-
|
127 |
-
/**
|
128 |
-
* @return void
|
129 |
-
*/
|
130 |
-
public function enqueueRecaptchaScript( Command $command )
|
131 |
-
{
|
132 |
-
wp_enqueue_script( $command->handle.'/google-recaptcha', add_query_arg([
|
133 |
-
'hl' => apply_filters( 'site-reviews/recaptcha/language', get_locale() ),
|
134 |
-
'onload' => 'glsr_render_recaptcha',
|
135 |
-
'render' => 'explicit',
|
136 |
-
], 'https://www.google.com/recaptcha/api.js' ));
|
137 |
-
$inlineScript = file_get_contents( $command->path.'js/recaptcha.js' );
|
138 |
-
wp_add_inline_script( $command->handle.'/google-recaptcha', $inlineScript, 'before' );
|
139 |
-
}
|
140 |
-
|
141 |
-
/**
|
142 |
-
* @return void
|
143 |
-
*/
|
144 |
-
public function enqueueTinymce( Command $command )
|
145 |
-
{
|
146 |
-
add_filter( 'mce_external_plugins', [$this, 'enqueueTinymcePlugins'], 15 );
|
147 |
-
if( user_can_richedit() )return;
|
148 |
-
script_concat_settings();
|
149 |
-
global $concatenate_scripts, $compress_scripts;
|
150 |
-
$suffix = false !== strpos( get_bloginfo( 'version' ), '-src' ) ? '' : '.min';
|
151 |
-
$compressed = $compress_scripts
|
152 |
-
&& $concatenate_scripts
|
153 |
-
&& false !== stripos( filter_input( INPUT_SERVER, 'HTTP_ACCEPT_ENCODING' ), 'gzip' );
|
154 |
-
$script = $compressed
|
155 |
-
? 'wp-tinymce.php?c=1'
|
156 |
-
: 'tinymce'.$suffix.'.js';
|
157 |
-
wp_enqueue_script( 'tinymce', includes_url( 'js/tinymce/'.$script ), $command->version );
|
158 |
-
add_action( 'admin_print_footer_scripts', function() {
|
159 |
-
?>
|
160 |
-
<script type="text/javascript">
|
161 |
-
tinymce.PluginManager.load( 'glsr_shortcode', '<?= glsr_app()->url; ?>assets/js/mce-plugin.js' );
|
162 |
-
</script>
|
163 |
-
<?php
|
164 |
-
}, 100 );
|
165 |
-
}
|
166 |
-
|
167 |
-
/**
|
168 |
-
* @return array
|
169 |
-
*/
|
170 |
-
public function enqueueTinymcePlugins( array $plugins )
|
171 |
-
{
|
172 |
-
if( current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' )) {
|
173 |
-
$plugins['glsr_shortcode'] = glsr_app()->url.'assets/js/mce-plugin.js';
|
174 |
-
}
|
175 |
-
return $plugins;
|
176 |
-
}
|
177 |
-
|
178 |
-
/**
|
179 |
-
* @return array
|
180 |
-
*/
|
181 |
-
protected function localizeShortcodes()
|
182 |
-
{
|
183 |
-
$variables = [];
|
184 |
-
foreach( glsr_app()->mceShortcodes as $tag => $args ) {
|
185 |
-
if( !empty( $args['required'] )) {
|
186 |
-
$variables[$tag] = $args['required'];
|
187 |
-
}
|
188 |
-
}
|
189 |
-
return $variables;
|
190 |
-
}
|
191 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Handlers/EnqueuePublicAssets.php
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
+
use GeminiLabs\SiteReviews\Database\OptionManager;
|
7 |
+
use GeminiLabs\SiteReviews\Defaults\ValidationStringsDefaults;
|
8 |
+
use GeminiLabs\SiteReviews\Modules\Style;
|
9 |
+
use GeminiLabs\SiteReviews\Modules\Validator;
|
10 |
+
|
11 |
+
class EnqueuePublicAssets
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @return void
|
15 |
+
*/
|
16 |
+
public function handle()
|
17 |
+
{
|
18 |
+
$this->enqueueAssets();
|
19 |
+
$this->enqueuePolyfillService();
|
20 |
+
$this->enqueueRecaptchaScript();
|
21 |
+
$this->inlineStyles();
|
22 |
+
$this->localizeAssets();
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @return void
|
27 |
+
*/
|
28 |
+
public function enqueueAssets()
|
29 |
+
{
|
30 |
+
if( apply_filters( 'site-reviews/assets/css', true )) {
|
31 |
+
wp_enqueue_style(
|
32 |
+
Application::ID,
|
33 |
+
$this->getStylesheet(),
|
34 |
+
[],
|
35 |
+
glsr()->version
|
36 |
+
);
|
37 |
+
}
|
38 |
+
if( apply_filters( 'site-reviews/assets/js', true )) {
|
39 |
+
$dependencies = apply_filters( 'site-reviews/assets/polyfill', true )
|
40 |
+
? [Application::ID.'/polyfill']
|
41 |
+
: [];
|
42 |
+
$dependencies = apply_filters( 'site-reviews/enqueue/public/dependencies', $dependencies );
|
43 |
+
wp_enqueue_script(
|
44 |
+
Application::ID,
|
45 |
+
glsr()->url( 'assets/scripts/'.Application::ID.'.js' ),
|
46 |
+
$dependencies,
|
47 |
+
glsr()->version,
|
48 |
+
true
|
49 |
+
);
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @return void
|
55 |
+
*/
|
56 |
+
public function enqueuePolyfillService()
|
57 |
+
{
|
58 |
+
if( !apply_filters( 'site-reviews/assets/polyfill', true ))return;
|
59 |
+
wp_enqueue_script( Application::ID.'/polyfill', add_query_arg([
|
60 |
+
'features' => 'CustomEvent,Element.prototype.closest,Element.prototype.dataset,Event,XMLHttpRequest,MutationObserver',
|
61 |
+
'flags' => 'gated',
|
62 |
+
], 'https://polyfill.io/v3/polyfill.min.js' ));
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @return void
|
67 |
+
*/
|
68 |
+
public function enqueueRecaptchaScript()
|
69 |
+
{
|
70 |
+
// wpforms-recaptcha
|
71 |
+
// google-recaptcha
|
72 |
+
// nf-google-recaptcha
|
73 |
+
if( !glsr( OptionManager::class )->isRecaptchaEnabled() )return;
|
74 |
+
$language = apply_filters( 'site-reviews/recaptcha/language', get_locale() );
|
75 |
+
wp_enqueue_script( Application::ID.'/google-recaptcha', add_query_arg([
|
76 |
+
'hl' => $language,
|
77 |
+
'render' => 'explicit',
|
78 |
+
], 'https://www.google.com/recaptcha/api.js' ));
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* @return void
|
83 |
+
*/
|
84 |
+
public function inlineStyles()
|
85 |
+
{
|
86 |
+
$inlineStylesheetPath = glsr()->path( 'assets/styles/inline-styles.css' );
|
87 |
+
if( !apply_filters( 'site-reviews/assets/css', true ))return;
|
88 |
+
if( !file_exists( $inlineStylesheetPath )) {
|
89 |
+
glsr_log()->error( 'Inline stylesheet is missing: '.$inlineStylesheetPath );
|
90 |
+
return;
|
91 |
+
}
|
92 |
+
$inlineStylesheetValues = glsr()->config( 'inline-styles' );
|
93 |
+
$stylesheet = str_replace(
|
94 |
+
array_keys( $inlineStylesheetValues ),
|
95 |
+
array_values( $inlineStylesheetValues ),
|
96 |
+
file_get_contents( $inlineStylesheetPath )
|
97 |
+
);
|
98 |
+
wp_add_inline_style( Application::ID, $stylesheet );
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* @return void
|
103 |
+
*/
|
104 |
+
public function localizeAssets()
|
105 |
+
{
|
106 |
+
$variables = [
|
107 |
+
'action' => Application::PREFIX.'action',
|
108 |
+
'ajaxpagination' => $this->getFixedSelectorsForPagination(),
|
109 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
110 |
+
'nameprefix' => Application::ID,
|
111 |
+
'validationconfig' => glsr( Style::class )->validation,
|
112 |
+
'validationstrings' => glsr( ValidationStringsDefaults::class )->defaults(),
|
113 |
+
];
|
114 |
+
$variables = apply_filters( 'site-reviews/enqueue/public/localize', $variables );
|
115 |
+
wp_localize_script( Application::ID, 'GLSR', $variables );
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* @return array
|
120 |
+
*/
|
121 |
+
protected function getFixedSelectorsForPagination()
|
122 |
+
{
|
123 |
+
$selectors = ['#wpadminbar','.site-navigation-fixed'];
|
124 |
+
return apply_filters( 'site-reviews/enqueue/public/localize/ajax-pagination', $selectors );
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* @return string
|
129 |
+
*/
|
130 |
+
protected function getStylesheet()
|
131 |
+
{
|
132 |
+
$currentStyle = glsr( Style::class )->style;
|
133 |
+
return file_exists( glsr()->path( 'assets/styles/custom/'.$currentStyle.'.css' ))
|
134 |
+
? glsr()->url( 'assets/styles/custom/'.$currentStyle.'.css' )
|
135 |
+
: glsr()->url( 'assets/styles/'.Application::ID.'.css' );
|
136 |
+
}
|
137 |
+
}
|
plugin/Handlers/RegisterPointers.php
DELETED
@@ -1,62 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
-
|
13 |
-
use GeminiLabs\SiteReviews\App;
|
14 |
-
use GeminiLabs\SiteReviews\Commands\RegisterPointers as Command;
|
15 |
-
|
16 |
-
class RegisterPointers
|
17 |
-
{
|
18 |
-
protected $app;
|
19 |
-
|
20 |
-
public function __construct( App $app )
|
21 |
-
{
|
22 |
-
$this->app = $app;
|
23 |
-
}
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Add pointers to the current screen if they have not yet been dismissed
|
27 |
-
*
|
28 |
-
* @return void
|
29 |
-
*/
|
30 |
-
public function handle( Command $command )
|
31 |
-
{
|
32 |
-
// Get dismissed pointers
|
33 |
-
$dismissed = get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true );
|
34 |
-
$dismissed = explode( ',', (string) $dismissed );
|
35 |
-
|
36 |
-
$pointers = [];
|
37 |
-
|
38 |
-
foreach( $command->pointers as $pointer ) {
|
39 |
-
|
40 |
-
if( $pointer['screen'] != glsr_current_screen()->id || in_array( $pointer['id'], $dismissed ))continue;
|
41 |
-
|
42 |
-
$pointers[] = [
|
43 |
-
'id' => $pointer['id'],
|
44 |
-
'screen' => $pointer['screen'],
|
45 |
-
'target' => $pointer['target'],
|
46 |
-
'options' => [
|
47 |
-
'content' => sprintf( '<h3>%s</h3><p>%s</p>', $pointer['title'], $pointer['content'] ),
|
48 |
-
'position' => $pointer['position'],
|
49 |
-
],
|
50 |
-
];
|
51 |
-
}
|
52 |
-
|
53 |
-
wp_localize_script( $this->app->id, 'site_reviews_pointers', [
|
54 |
-
'pointers' => $pointers,
|
55 |
-
]);
|
56 |
-
|
57 |
-
if( empty( $pointers ))return;
|
58 |
-
|
59 |
-
wp_enqueue_style( 'wp-pointer' );
|
60 |
-
wp_enqueue_script( 'wp-pointer' );
|
61 |
-
}
|
62 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Handlers/RegisterPostType.php
CHANGED
@@ -1,389 +1,20 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\App;
|
14 |
use GeminiLabs\SiteReviews\Commands\RegisterPostType as Command;
|
15 |
-
use WP_Screen;
|
16 |
-
use WP_Query;
|
17 |
|
18 |
class RegisterPostType
|
19 |
{
|
20 |
-
/**
|
21 |
-
* @var App
|
22 |
-
*/
|
23 |
-
protected $app;
|
24 |
-
|
25 |
-
/**
|
26 |
-
* @var array
|
27 |
-
*/
|
28 |
-
protected $columns;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* @var \GeminiLabs\SiteReviews\Database
|
32 |
-
*/
|
33 |
-
protected $db;
|
34 |
-
|
35 |
-
public function __construct( App $app )
|
36 |
-
{
|
37 |
-
$this->app = $app;
|
38 |
-
$this->db = $app->make( 'Database' );
|
39 |
-
}
|
40 |
-
|
41 |
/**
|
42 |
* @return void
|
43 |
*/
|
44 |
public function handle( Command $command )
|
45 |
{
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
if( in_array( $post_type, get_post_types( ['_builtin' => true ] )))return;
|
51 |
-
|
52 |
-
$this->columns = $columns;
|
53 |
-
|
54 |
-
$args = [
|
55 |
-
'description' => '',
|
56 |
-
'labels' => $labels,
|
57 |
-
'taxonomies' => $taxonomies,
|
58 |
-
'supports' => $supports,
|
59 |
-
'map_meta_cap' => $map_meta_cap,
|
60 |
-
'menu_position' => $menu_position,
|
61 |
-
'menu_icon' => $menu_icon,
|
62 |
-
'has_archive' => $has_archive,
|
63 |
-
'public' => $public,
|
64 |
-
'show_in_nav_menus' => $show_in_nav_menus,
|
65 |
-
'show_ui' => $show_ui,
|
66 |
-
'exclude_from_search' => $exclude_from_search,
|
67 |
-
'publicly_queryable' => $publicly_queryable,
|
68 |
-
'capabilities' => ['create_posts' => "create_{$post_type}"],
|
69 |
-
'hierarchical' => $hierarchical,
|
70 |
-
'rewrite' => $rewrite,
|
71 |
-
'query_var' => $query_var,
|
72 |
-
];
|
73 |
-
|
74 |
-
register_post_type( $post_type, $args );
|
75 |
-
|
76 |
-
add_action( 'restrict_manage_posts', [ $this, 'printColumnFilters'] );
|
77 |
-
add_action( "manage_{$post_type}_posts_custom_column", [ $this, 'printColumnValues'] );
|
78 |
-
add_action( 'pre_get_posts', [ $this, 'setColumnQuery'] );
|
79 |
-
|
80 |
-
add_filter( "manage_{$post_type}_posts_columns", [ $this, 'modifycolumns'] );
|
81 |
-
add_filter( 'default_hidden_columns', [ $this, 'modifyColumnsHidden'], 10, 2 );
|
82 |
-
add_filter( "manage_edit-{$post_type}_sortable_columns", [ $this, 'modifyColumnsSortable'] );
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Creates the custom post_type columns
|
87 |
-
*
|
88 |
-
* @return array
|
89 |
-
*
|
90 |
-
* @filter manage_{$post_type}_posts_columns
|
91 |
-
*/
|
92 |
-
public function modifyColumns( array $columns )
|
93 |
-
{
|
94 |
-
$this->columns = ['cb' => ''] + $this->columns;
|
95 |
-
|
96 |
-
array_walk( $this->columns, function( &$value, $key ) use ( $columns ) {
|
97 |
-
if( array_key_exists( $key, $columns ) && empty( $value )) {
|
98 |
-
$value = $columns[ $key ];
|
99 |
-
}
|
100 |
-
else if( $key === 'sticky' ) {
|
101 |
-
// wrap in <span> so we can replace with a dashicon in CSS @media
|
102 |
-
$value = "<span class=\"pinned-icon\">{$value}</span>";
|
103 |
-
// WP < 4.4 support
|
104 |
-
global $wp_version;
|
105 |
-
if( version_compare( $wp_version, '4.4', '<' )) {
|
106 |
-
$value .= file_get_contents( "{$this->app->path}assets/img/pinned.svg" );
|
107 |
-
}
|
108 |
-
}
|
109 |
-
});
|
110 |
-
|
111 |
-
$types = $this->db->getReviewsMeta( 'type' );
|
112 |
-
|
113 |
-
if( count( $types ) < 1 || ( count( $types ) == 1 && $types[0] == 'local' )) {
|
114 |
-
unset( $this->columns['type'] );
|
115 |
-
}
|
116 |
-
|
117 |
-
// remove all keys with null, false, or empty values
|
118 |
-
return array_filter( $this->columns, 'strlen' );
|
119 |
-
}
|
120 |
-
|
121 |
-
/**
|
122 |
-
* Filters the default list of hidden columns
|
123 |
-
*
|
124 |
-
* @return array
|
125 |
-
*
|
126 |
-
* @filter default_hidden_columns
|
127 |
-
*/
|
128 |
-
public function modifyColumnsHidden( array $hidden, WP_Screen $screen )
|
129 |
-
{
|
130 |
-
if( $screen->id == sprintf( 'edit-%s', App::POST_TYPE )) {
|
131 |
-
$hidden = ['reviewer'];
|
132 |
-
}
|
133 |
-
|
134 |
-
return $hidden;
|
135 |
-
}
|
136 |
-
|
137 |
-
/**
|
138 |
-
* Sets which custom post_type columns are sortable
|
139 |
-
*
|
140 |
-
* @return array
|
141 |
-
*
|
142 |
-
* @filter manage_edit-{$post_type}_sortable_columns
|
143 |
-
*/
|
144 |
-
public function modifyColumnsSortable( array $columns )
|
145 |
-
{
|
146 |
-
$columns['assigned_to'] = 'assigned_to';
|
147 |
-
$columns['reviewer'] = 'reviewer';
|
148 |
-
$columns['stars'] = 'rating';
|
149 |
-
$columns['sticky'] = 'pinned';
|
150 |
-
$columns['type'] = 'review_type';
|
151 |
-
|
152 |
-
return $columns;
|
153 |
-
}
|
154 |
-
|
155 |
-
/**
|
156 |
-
* Prints the column filters
|
157 |
-
*
|
158 |
-
* @param string $post_type
|
159 |
-
*
|
160 |
-
* @return void
|
161 |
-
*
|
162 |
-
* @action restrict_manage_posts
|
163 |
-
*/
|
164 |
-
public function printColumnFilters( $post_type )
|
165 |
-
{
|
166 |
-
// WP < 4.4 support
|
167 |
-
if( !$post_type ) {
|
168 |
-
$post_type = get_current_screen()->post_type;
|
169 |
-
}
|
170 |
-
|
171 |
-
if( $post_type !== App::POST_TYPE )return;
|
172 |
-
|
173 |
-
$status = filter_input( INPUT_GET, 'post_status' );
|
174 |
-
$status ?: $status = 'publish';
|
175 |
-
|
176 |
-
$ratings = $this->db->getReviewsMeta( 'rating', $status );
|
177 |
-
$types = $this->db->getReviewsMeta( 'type', $status );
|
178 |
-
|
179 |
-
$this->renderFilterRatings( $ratings );
|
180 |
-
$this->renderFilterTypes( $types );
|
181 |
-
}
|
182 |
-
|
183 |
-
/**
|
184 |
-
* Prints the custom column values
|
185 |
-
*
|
186 |
-
* @param string $column
|
187 |
-
*
|
188 |
-
* @return void
|
189 |
-
*
|
190 |
-
* @action manage_{$post_type}_posts_custom_column
|
191 |
-
*/
|
192 |
-
public function printColumnValues( $column )
|
193 |
-
{
|
194 |
-
global $wp_version;
|
195 |
-
$method = $this->app->make( 'Helper' )->buildMethodName( $column, 'buildColumn' );
|
196 |
-
echo !method_exists( $this, $method )
|
197 |
-
? apply_filters( 'site-reviews/columns/'.$column, '' )
|
198 |
-
: call_user_func([ $this, $method ]);
|
199 |
-
}
|
200 |
-
|
201 |
-
/**
|
202 |
-
* Sets the WP_Query
|
203 |
-
*
|
204 |
-
* @return void
|
205 |
-
*
|
206 |
-
* @action pre_get_posts
|
207 |
-
*/
|
208 |
-
public function setColumnQuery( WP_Query $query )
|
209 |
-
{
|
210 |
-
if( !$this->hasPermission( $query ))return;
|
211 |
-
|
212 |
-
$this->setMeta( $query, [
|
213 |
-
'rating',
|
214 |
-
'review_type',
|
215 |
]);
|
216 |
-
|
217 |
-
$this->setOrderby( $query );
|
218 |
-
}
|
219 |
-
|
220 |
-
/**
|
221 |
-
* @return string
|
222 |
-
*/
|
223 |
-
protected function buildColumnAssignedTo()
|
224 |
-
{
|
225 |
-
$value = $this->app->make( 'Html' )->renderPartial( 'link', [
|
226 |
-
'post_id' => $this->db->getReviewMeta( get_post()->ID )->assigned_to,
|
227 |
-
]);
|
228 |
-
return $value ? $value : '—';
|
229 |
-
}
|
230 |
-
|
231 |
-
/**
|
232 |
-
* @return string
|
233 |
-
*/
|
234 |
-
protected function buildColumnReviewer()
|
235 |
-
{
|
236 |
-
return $this->db->getReviewMeta( get_post()->ID )->author;
|
237 |
-
}
|
238 |
-
|
239 |
-
/**
|
240 |
-
* @return string
|
241 |
-
*/
|
242 |
-
protected function buildColumnStars()
|
243 |
-
{
|
244 |
-
return $this->app->make( 'Html' )->renderPartial( 'star-rating', [
|
245 |
-
'rating' => $this->db->getReviewMeta( get_post()->ID )->rating,
|
246 |
-
]);
|
247 |
-
}
|
248 |
-
|
249 |
-
/**
|
250 |
-
* @return string
|
251 |
-
*/
|
252 |
-
protected function buildColumnSticky()
|
253 |
-
{
|
254 |
-
global $wp_version;
|
255 |
-
|
256 |
-
$post = get_post();
|
257 |
-
$pinned = $this->db->getReviewMeta( $post->ID )->pinned
|
258 |
-
? ' pinned'
|
259 |
-
: '';
|
260 |
-
|
261 |
-
// WP < 4.4 support
|
262 |
-
$fallback = version_compare( $wp_version, '4.4', '<' )
|
263 |
-
? file_get_contents( "{$this->app->path}assets/img/pinned.svg" )
|
264 |
-
: '';
|
265 |
-
|
266 |
-
return sprintf( '<i class="dashicons dashicons-sticky%s" data-id="%s">%s</i>',
|
267 |
-
$pinned,
|
268 |
-
$post->ID,
|
269 |
-
$fallback
|
270 |
-
);
|
271 |
-
}
|
272 |
-
|
273 |
-
/**
|
274 |
-
* @return string
|
275 |
-
*/
|
276 |
-
protected function buildColumnType()
|
277 |
-
{
|
278 |
-
$meta = $this->db->getReviewMeta( get_post()->ID );
|
279 |
-
$types = $this->app->make( 'Strings' )->review_types();
|
280 |
-
return isset( $types[ $meta->review_type ] )
|
281 |
-
? $types[ $meta->review_type ]
|
282 |
-
: $meta->review_type;
|
283 |
-
}
|
284 |
-
|
285 |
-
/**
|
286 |
-
* @return bool
|
287 |
-
*/
|
288 |
-
protected function hasPermission( WP_Query $query )
|
289 |
-
{
|
290 |
-
global $pagenow;
|
291 |
-
return !( !is_admin()
|
292 |
-
|| !$query->is_main_query()
|
293 |
-
|| $query->query['post_type'] != App::POST_TYPE
|
294 |
-
|| $pagenow != 'edit.php'
|
295 |
-
);
|
296 |
-
}
|
297 |
-
|
298 |
-
/**
|
299 |
-
* @param array $ratings
|
300 |
-
*
|
301 |
-
* @return void
|
302 |
-
*/
|
303 |
-
protected function renderFilterRatings( $ratings )
|
304 |
-
{
|
305 |
-
if( empty( $ratings ) || apply_filters( 'site-reviews/disable/filter/ratings', false ))return;
|
306 |
-
|
307 |
-
$ratings = array_flip( array_reverse( $ratings ));
|
308 |
-
|
309 |
-
array_walk( $ratings, function( &$value, $key ) {
|
310 |
-
$label = _n( '%s star', '%s stars', $key, 'site-reviews' );
|
311 |
-
$value = sprintf( $label, $key );
|
312 |
-
});
|
313 |
-
|
314 |
-
$ratings = [ __( 'All ratings', 'site-reviews' ) ] + $ratings;
|
315 |
-
|
316 |
-
printf( '<label class="screen-reader-text" for="rating">%s</label>', __( 'Filter by rating', 'site-reviews' ));
|
317 |
-
|
318 |
-
echo $this->app->make( 'Html' )->renderPartial( 'filterby', [
|
319 |
-
'name' => 'rating',
|
320 |
-
'values' => $ratings,
|
321 |
-
]);
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* @param array $types
|
326 |
-
*
|
327 |
-
* @return void
|
328 |
-
*/
|
329 |
-
protected function renderFilterTypes( $types )
|
330 |
-
{
|
331 |
-
if( count( $types ) < 1
|
332 |
-
|| ( count( $types ) == 1 && $types[0] == 'local' )
|
333 |
-
|| apply_filters( 'site-reviews/disable/filter/types', false )
|
334 |
-
)return;
|
335 |
-
|
336 |
-
$reviewTypes = [ __( 'All types', 'site-reviews' ) ];
|
337 |
-
|
338 |
-
foreach( $types as $type ) {
|
339 |
-
$reviewTypes[ $type ] = $this->app->make( 'Strings' )->review_types( $type, ucfirst( $type ));
|
340 |
-
}
|
341 |
-
|
342 |
-
printf( '<label class="screen-reader-text" for="type">%s</label>', __( 'Filter by type', 'site-reviews' ));
|
343 |
-
|
344 |
-
echo $this->app->make( 'Html' )->renderPartial( 'filterby', [
|
345 |
-
'name' => 'review_type',
|
346 |
-
'values' => $reviewTypes,
|
347 |
-
]);
|
348 |
-
}
|
349 |
-
|
350 |
-
/**
|
351 |
-
* Modifies the WP_Query meta_query value
|
352 |
-
*
|
353 |
-
* @return self
|
354 |
-
*/
|
355 |
-
protected function setMeta( WP_Query $query, array $meta_keys )
|
356 |
-
{
|
357 |
-
foreach( $meta_keys as $key ) {
|
358 |
-
if( !( $value = filter_input( INPUT_GET, $key )))continue;
|
359 |
-
|
360 |
-
$query->query_vars['meta_query'][] = [
|
361 |
-
'key' => $key,
|
362 |
-
'value' => $value,
|
363 |
-
];
|
364 |
-
}
|
365 |
-
|
366 |
-
return $this;
|
367 |
-
}
|
368 |
-
|
369 |
-
/**
|
370 |
-
* Modifies the WP_Query orderby value
|
371 |
-
*
|
372 |
-
* @return self
|
373 |
-
*/
|
374 |
-
protected function setOrderby( WP_Query $query )
|
375 |
-
{
|
376 |
-
$orderby = $query->get( 'orderby' );
|
377 |
-
switch( $orderby ) {
|
378 |
-
case 'assigned_to':
|
379 |
-
case 'author':
|
380 |
-
case 'pinned':
|
381 |
-
case 'rating':
|
382 |
-
case 'review_type':
|
383 |
-
$query->set( 'meta_key', $orderby );
|
384 |
-
$query->set( 'orderby', 'meta_value' );
|
385 |
-
break;
|
386 |
-
}
|
387 |
-
return $this;
|
388 |
}
|
389 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
|
|
5 |
use GeminiLabs\SiteReviews\Commands\RegisterPostType as Command;
|
|
|
|
|
6 |
|
7 |
class RegisterPostType
|
8 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
/**
|
10 |
* @return void
|
11 |
*/
|
12 |
public function handle( Command $command )
|
13 |
{
|
14 |
+
if( in_array( $command->postType, get_post_types( ['_builtin' => true] )))return;
|
15 |
+
register_post_type( $command->postType, $command->args );
|
16 |
+
glsr()->postTypeColumns = wp_parse_args( glsr()->postTypeColumns, [
|
17 |
+
$command->postType => $command->columns,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
}
|
20 |
}
|
plugin/Handlers/RegisterShortcodeButtons.php
DELETED
@@ -1,36 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\Commands\RegisterShortcodeButtons as Command;
|
15 |
-
use ReflectionException;
|
16 |
-
|
17 |
-
class RegisterShortcodeButtons
|
18 |
-
{
|
19 |
-
/**
|
20 |
-
* @return void
|
21 |
-
*/
|
22 |
-
public function handle( Command $command )
|
23 |
-
{
|
24 |
-
$properties = [];
|
25 |
-
|
26 |
-
foreach( $command->shortcodes as $slug => $args ) {
|
27 |
-
|
28 |
-
$className = glsr_resolve( 'Helper' )->buildClassName( $slug, 'Shortcodes\Buttons' );
|
29 |
-
$shortcode = glsr_resolve( $className )->register( $slug, $args );
|
30 |
-
|
31 |
-
$properties[ $slug ] = $shortcode->properties;
|
32 |
-
}
|
33 |
-
|
34 |
-
glsr_app()->mceShortcodes = $properties;
|
35 |
-
}
|
36 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Handlers/RegisterShortcodes.php
CHANGED
@@ -1,18 +1,9 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
13 |
-
use Exception;
|
14 |
use GeminiLabs\SiteReviews\Commands\RegisterShortcodes as Command;
|
15 |
-
use
|
16 |
|
17 |
class RegisterShortcodes
|
18 |
{
|
@@ -21,20 +12,13 @@ class RegisterShortcodes
|
|
21 |
*/
|
22 |
public function handle( Command $command )
|
23 |
{
|
24 |
-
foreach( $command->shortcodes as $
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
add_shortcode( $key, [ glsr_resolve( $shortcodeClass ), 'printShortcode'] );
|
30 |
-
}
|
31 |
-
catch( Exception $e ) {
|
32 |
-
glsr_resolve( 'Log\Logger' )->error( sprintf( 'Error registering shortcode. Message: %s "(%s:%s)"',
|
33 |
-
$e->getMessage(),
|
34 |
-
$e->getFile(),
|
35 |
-
$e->getLine()
|
36 |
-
));
|
37 |
}
|
|
|
38 |
}
|
39 |
}
|
40 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
|
|
5 |
use GeminiLabs\SiteReviews\Commands\RegisterShortcodes as Command;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
|
8 |
class RegisterShortcodes
|
9 |
{
|
12 |
*/
|
13 |
public function handle( Command $command )
|
14 |
{
|
15 |
+
foreach( $command->shortcodes as $shortcode ) {
|
16 |
+
$shortcodeClass = glsr( Helper::class )->buildClassName( $shortcode.'-shortcode', 'Shortcodes' );
|
17 |
+
if( !class_exists( $shortcodeClass )) {
|
18 |
+
glsr_log()->error( sprintf( 'Class missing (%s)', $shortcodeClass ));
|
19 |
+
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
}
|
21 |
+
add_shortcode( $shortcode, [glsr( $shortcodeClass ), 'buildShortcode'] );
|
22 |
}
|
23 |
}
|
24 |
}
|
plugin/Handlers/RegisterTaxonomy.php
CHANGED
@@ -1,107 +1,18 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
14 |
use GeminiLabs\SiteReviews\Commands\RegisterTaxonomy as Command;
|
15 |
|
16 |
class RegisterTaxonomy
|
17 |
{
|
18 |
-
/**
|
19 |
-
* @var App
|
20 |
-
*/
|
21 |
-
protected $app;
|
22 |
-
|
23 |
-
public function __construct( App $app )
|
24 |
-
{
|
25 |
-
$this->app = $app;
|
26 |
-
}
|
27 |
-
|
28 |
/**
|
29 |
* @return void
|
30 |
*/
|
31 |
public function handle( Command $command )
|
32 |
{
|
33 |
-
register_taxonomy(
|
34 |
-
register_taxonomy_for_object_type(
|
35 |
-
|
36 |
-
add_action( App::TAXONOMY . '_term_edit_form_top', [ $this, 'disableParents'] );
|
37 |
-
add_action( App::TAXONOMY . '_term_new_form_tag', [ $this, 'disableParents'] );
|
38 |
-
add_action( App::TAXONOMY . '_add_form_fields', [ $this, 'enableParents'] );
|
39 |
-
add_action( App::TAXONOMY . '_edit_form', [ $this, 'enableParents'] );
|
40 |
-
add_action( 'restrict_manage_posts', [ $this, 'renderFilterTaxonomy'], 9 );
|
41 |
-
}
|
42 |
-
|
43 |
-
/**
|
44 |
-
* @return void
|
45 |
-
*
|
46 |
-
* @action {$taxonomy}_add_form_fields
|
47 |
-
* @action {$taxonomy}_edit_form
|
48 |
-
*/
|
49 |
-
public function disableParents()
|
50 |
-
{
|
51 |
-
global $wp_taxonomies;
|
52 |
-
$wp_taxonomies[ App::TAXONOMY ]->hierarchical = false;
|
53 |
-
}
|
54 |
-
|
55 |
-
/**
|
56 |
-
* @return void
|
57 |
-
*
|
58 |
-
* @action {$taxonomy}_term_edit_form_top
|
59 |
-
* @action {$taxonomy}_term_new_form_tag
|
60 |
-
*/
|
61 |
-
public function enableParents()
|
62 |
-
{
|
63 |
-
global $wp_taxonomies;
|
64 |
-
$wp_taxonomies[ App::TAXONOMY ]->hierarchical = true;
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Create the Taxonomy filter dropdown
|
69 |
-
*
|
70 |
-
* @return void
|
71 |
-
*
|
72 |
-
* @action restrict_manage_posts
|
73 |
-
*/
|
74 |
-
public function renderFilterTaxonomy()
|
75 |
-
{
|
76 |
-
global $wp_query;
|
77 |
-
|
78 |
-
if( apply_filters( 'site-reviews/disable/filter/category', false )
|
79 |
-
|| !is_object_in_taxonomy( get_current_screen()->post_type, App::TAXONOMY )
|
80 |
-
)return;
|
81 |
-
|
82 |
-
printf( '<label class="screen-reader-text" for="%s">%s</label>', App::TAXONOMY, __( 'Filter by category', 'site-reviews' ));
|
83 |
-
|
84 |
-
$selected = isset( $wp_query->query[ App::TAXONOMY ] )
|
85 |
-
? $wp_query->query[ App::TAXONOMY ]
|
86 |
-
: '';
|
87 |
-
|
88 |
-
$taxonomy = get_taxonomy( App::TAXONOMY );
|
89 |
-
$showOptionAll = !empty( $taxonomy )
|
90 |
-
? ucfirst( strtolower( $taxonomy->labels->all_items ))
|
91 |
-
: '';
|
92 |
-
|
93 |
-
wp_dropdown_categories([
|
94 |
-
'depth' => 3,
|
95 |
-
'hide_empty' => true,
|
96 |
-
'hide_if_empty' => true,
|
97 |
-
'hierarchical' => true,
|
98 |
-
'name' => App::TAXONOMY,
|
99 |
-
'orderby' => 'name',
|
100 |
-
'selected' => $selected,
|
101 |
-
'show_count' => false,
|
102 |
-
'show_option_all' => $showOptionAll,
|
103 |
-
'taxonomy' => App::TAXONOMY,
|
104 |
-
'value_field' => 'slug',
|
105 |
-
]);
|
106 |
}
|
107 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
use GeminiLabs\SiteReviews\Commands\RegisterTaxonomy as Command;
|
7 |
|
8 |
class RegisterTaxonomy
|
9 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
/**
|
11 |
* @return void
|
12 |
*/
|
13 |
public function handle( Command $command )
|
14 |
{
|
15 |
+
register_taxonomy( Application::TAXONOMY, Application::POST_TYPE, $command->args );
|
16 |
+
register_taxonomy_for_object_type( Application::TAXONOMY, Application::POST_TYPE );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
}
|
18 |
}
|
plugin/Handlers/RegisterTinymcePopups.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
+
|
5 |
+
use GeminiLabs\SiteReviews\Commands\RegisterTinymcePopups as Command;
|
6 |
+
use GeminiLabs\SiteReviews\Helper;
|
7 |
+
|
8 |
+
class RegisterTinymcePopups
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @return void
|
12 |
+
*/
|
13 |
+
public function handle( Command $command )
|
14 |
+
{
|
15 |
+
foreach( $command->popups as $slug => $label ) {
|
16 |
+
$buttonClass = glsr( Helper::class )->buildClassName( $slug.'-popup', 'Shortcodes' );
|
17 |
+
if( !class_exists( $buttonClass )) {
|
18 |
+
glsr_log()->error( sprintf( 'Class missing (%s)', $buttonClass ));
|
19 |
+
continue;
|
20 |
+
}
|
21 |
+
$shortcode = glsr( $buttonClass )->register( $slug, [
|
22 |
+
'label' => $label,
|
23 |
+
'title' => $label,
|
24 |
+
]);
|
25 |
+
glsr()->mceShortcodes[$slug] = $shortcode->properties;
|
26 |
+
}
|
27 |
+
}
|
28 |
+
}
|
plugin/Handlers/RegisterWidgets.php
CHANGED
@@ -1,17 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
13 |
-
use
|
14 |
use GeminiLabs\SiteReviews\Commands\RegisterWidgets as Command;
|
|
|
15 |
|
16 |
class RegisterWidgets
|
17 |
{
|
@@ -21,23 +14,15 @@ class RegisterWidgets
|
|
21 |
public function handle( Command $command )
|
22 |
{
|
23 |
global $wp_widget_factory;
|
24 |
-
|
25 |
foreach( $command->widgets as $key => $values ) {
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
// bypass register_widget() in order to pass our custom values to the widget
|
31 |
-
$widget = new $widgetClass( sprintf( '%s_%s', glsr_app()->id, $key ), $values['title'], $values );
|
32 |
-
$wp_widget_factory->widgets[ $widgetClass ] = $widget;
|
33 |
-
}
|
34 |
-
catch( Exception $e ) {
|
35 |
-
glsr_resolve( 'Log\Logger' )->error( sprintf( 'Error registering widget. Message: %s "(%s:%s)"',
|
36 |
-
$e->getMessage(),
|
37 |
-
$e->getFile(),
|
38 |
-
$e->getLine()
|
39 |
-
));
|
40 |
}
|
|
|
|
|
|
|
41 |
}
|
42 |
}
|
43 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Application;
|
6 |
use GeminiLabs\SiteReviews\Commands\RegisterWidgets as Command;
|
7 |
+
use GeminiLabs\SiteReviews\Helper;
|
8 |
|
9 |
class RegisterWidgets
|
10 |
{
|
14 |
public function handle( Command $command )
|
15 |
{
|
16 |
global $wp_widget_factory;
|
|
|
17 |
foreach( $command->widgets as $key => $values ) {
|
18 |
+
$widgetClass = glsr( Helper::class )->buildClassName( $key.'-widget', 'Widgets' );
|
19 |
+
if( !class_exists( $widgetClass )) {
|
20 |
+
glsr_log()->error( sprintf( 'Class missing (%s)', $widgetClass ));
|
21 |
+
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
}
|
23 |
+
// Here we bypass register_widget() in order to pass our custom values to the widget
|
24 |
+
$widget = new $widgetClass( Application::ID.'_'.$key, $values['title'], $values );
|
25 |
+
$wp_widget_factory->widgets[$widgetClass] = $widget;
|
26 |
}
|
27 |
}
|
28 |
}
|
plugin/Handlers/SubmitReview.php
DELETED
@@ -1,178 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\Commands\SubmitReview as Command;
|
15 |
-
use ReflectionException;
|
16 |
-
|
17 |
-
class SubmitReview
|
18 |
-
{
|
19 |
-
/**
|
20 |
-
* @return void|string
|
21 |
-
*/
|
22 |
-
public function handle( Command $command )
|
23 |
-
{
|
24 |
-
$review = apply_filters( 'site-reviews/local/review', [
|
25 |
-
'author' => $command->author,
|
26 |
-
'assigned_to' => $command->assignedTo,
|
27 |
-
'avatar' => get_avatar_url( $command->email ),
|
28 |
-
'content' => $command->content,
|
29 |
-
'email' => $command->email,
|
30 |
-
'ip_address' => $command->ipAddress,
|
31 |
-
'rating' => $command->rating,
|
32 |
-
'review_type' => 'local',
|
33 |
-
'title' => $command->title,
|
34 |
-
], $command );
|
35 |
-
$post_id = glsr_resolve( 'Database' )->createReview( $review, $command );
|
36 |
-
glsr_resolve( 'Database' )->setReviewMeta( $post_id, $command->category );
|
37 |
-
$this->sendNotification( $post_id, $command );
|
38 |
-
$successMessage = apply_filters( 'site-reviews/local/review/submitted/message',
|
39 |
-
__( 'Your review has been submitted!', 'site-reviews' ),
|
40 |
-
$command
|
41 |
-
);
|
42 |
-
do_action( 'site-reviews/local/review/submitted', $successMessage, $command );
|
43 |
-
if( $command->ajaxRequest ) {
|
44 |
-
glsr_resolve( 'Session' )->clear();
|
45 |
-
return $successMessage;
|
46 |
-
}
|
47 |
-
glsr_resolve( 'Session' )->set( $command->formId.'-message', $successMessage );
|
48 |
-
wp_safe_redirect( $command->referrer );
|
49 |
-
exit;
|
50 |
-
}
|
51 |
-
|
52 |
-
/**
|
53 |
-
* @return \GeminiLabs\SiteReviews\Email
|
54 |
-
*/
|
55 |
-
protected function createEmailNotification( Command $command, array $args = [] )
|
56 |
-
{
|
57 |
-
$email = [
|
58 |
-
'to' => $args['recipient'],
|
59 |
-
'subject' => $args['notification_title'],
|
60 |
-
'template' => 'review-notification',
|
61 |
-
'template-tags' => [
|
62 |
-
'review_author' => $command->author,
|
63 |
-
'review_content' => $command->content,
|
64 |
-
'review_email' => $command->email,
|
65 |
-
'review_ip' => $command->ipAddress,
|
66 |
-
'review_link' => sprintf( '<a href="%1$s">%1$s</a>', $args['notification_link'] ),
|
67 |
-
'review_rating' => $command->rating,
|
68 |
-
'review_title' => $command->title,
|
69 |
-
],
|
70 |
-
];
|
71 |
-
return glsr_resolve( 'Email' )->compose( $email );
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* @return string
|
76 |
-
*/
|
77 |
-
protected function createWebhookNotification( Command $command, array $args )
|
78 |
-
{
|
79 |
-
$fields = [];
|
80 |
-
$fields[] = ['title' => str_repeat( ':star:', (int) $command->rating )];
|
81 |
-
if( $command->title ) {
|
82 |
-
$fields[] = ['title' => $command->title];
|
83 |
-
}
|
84 |
-
if( $command->content ) {
|
85 |
-
$fields[] = ['value' => $command->content];
|
86 |
-
}
|
87 |
-
if( $command->email ) {
|
88 |
-
$command->email = ' <'.$command->email.'>';
|
89 |
-
}
|
90 |
-
if( $command->author ) {
|
91 |
-
$fields[] = ['value' => trim( $command->author.$command->email.' - '.$command->ipAddress )];
|
92 |
-
}
|
93 |
-
$fields[] = ['value' => sprintf( '<%s|%s>', $args['notification_link'], __( 'View Review', 'site-reviews' ))];
|
94 |
-
return json_encode([
|
95 |
-
'icon_url' => glsr_app()->url.'assets/img/icon.png',
|
96 |
-
'username' => glsr_app()->name,
|
97 |
-
'attachments' => [[
|
98 |
-
'pretext' => $args['notification_title'],
|
99 |
-
'color' => '#665068',
|
100 |
-
'fallback' => $this->createEmailNotification( $command, $args )->read( 'plaintext' ),
|
101 |
-
'fields' => $fields,
|
102 |
-
]],
|
103 |
-
]);
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* @param int $post_id
|
108 |
-
* @return void|bool|array|\WP_Error
|
109 |
-
*/
|
110 |
-
protected function sendNotification( $post_id, Command $command )
|
111 |
-
{
|
112 |
-
$notificationType = glsr_get_option( 'general.notification' );
|
113 |
-
if( !in_array( $notificationType, ['default','custom','webhook'] ))return;
|
114 |
-
$assignedToTitle = get_the_title( (int) $command->assignedTo );
|
115 |
-
$notificationSubject = _nx(
|
116 |
-
'New %s-star review',
|
117 |
-
'New %s-star review of: %s',
|
118 |
-
(int) empty( $assignedToTitle ),
|
119 |
-
'The text is different depending on whether or not the review has been assigned to a post.',
|
120 |
-
'site-reviews'
|
121 |
-
);
|
122 |
-
$notificationTitle = sprintf( '[%s] %s',
|
123 |
-
wp_specialchars_decode( (string) get_option( 'blogname' ), ENT_QUOTES ),
|
124 |
-
sprintf( $notificationSubject, $command->rating, $assignedToTitle )
|
125 |
-
);
|
126 |
-
$args = [
|
127 |
-
'notification_link' => admin_url( sprintf( 'post.php?post=%s&action=edit', $post_id )),
|
128 |
-
'notification_title' => $notificationTitle,
|
129 |
-
'notification_type' => $notificationType,
|
130 |
-
];
|
131 |
-
return $args['notification_type'] == 'webhook'
|
132 |
-
? $this->sendWebhookNotification( $command, $args )
|
133 |
-
: $this->sendEmailNotification( $command, $args );
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* @return bool
|
138 |
-
*/
|
139 |
-
protected function sendEmailNotification( Command $command, array $args )
|
140 |
-
{
|
141 |
-
$args['recipient'] = $args['notification_type'] === 'default'
|
142 |
-
? get_option( 'admin_email' )
|
143 |
-
: glsr_get_option( 'general.notification_email' );
|
144 |
-
$result = !empty( $args['recipient'] )
|
145 |
-
? $this->createEmailNotification( $command, $args )->send()
|
146 |
-
: false;
|
147 |
-
if( !is_bool( $result )) {
|
148 |
-
glsr_log( __( 'Email notification was not sent: missing email, subject, or message.', 'site-reviews' ), 'error' );
|
149 |
-
}
|
150 |
-
if( $result === false ) {
|
151 |
-
glsr_log( __( 'Email notification was not sent: wp_mail() failed.', 'site-reviews' ), 'error' );
|
152 |
-
}
|
153 |
-
return (bool) $result;
|
154 |
-
}
|
155 |
-
|
156 |
-
/**
|
157 |
-
* @return array|\WP_Error
|
158 |
-
*/
|
159 |
-
protected function sendWebhookNotification( Command $command, array $args )
|
160 |
-
{
|
161 |
-
if( !( $endpoint = glsr_get_option( 'general.webhook_url' )))return;
|
162 |
-
$notification = $this->createWebhookNotification( $command, $args );
|
163 |
-
$result = wp_remote_post( $endpoint, [
|
164 |
-
'method' => 'POST',
|
165 |
-
'timeout' => 45,
|
166 |
-
'redirection' => 5,
|
167 |
-
'httpversion' => '1.0',
|
168 |
-
'blocking' => false,
|
169 |
-
'sslverify' => false,
|
170 |
-
'headers' => ['Content-Type' => 'application/json'],
|
171 |
-
'body' => apply_filters( 'site-reviews/webhook/notification', $notification, $command ),
|
172 |
-
]);
|
173 |
-
if( is_wp_error( $result )) {
|
174 |
-
glsr_log( $result->get_error_message(), 'error' );
|
175 |
-
}
|
176 |
-
return $result;
|
177 |
-
}
|
178 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Handlers/TogglePinned.php
CHANGED
@@ -1,30 +1,12 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews\Handlers;
|
12 |
|
13 |
use GeminiLabs\SiteReviews\Commands\TogglePinned as Command;
|
14 |
-
use GeminiLabs\SiteReviews\
|
15 |
|
16 |
class TogglePinned
|
17 |
{
|
18 |
-
/**
|
19 |
-
* @var Notices
|
20 |
-
*/
|
21 |
-
protected $notices;
|
22 |
-
|
23 |
-
public function __construct( Notices $notices )
|
24 |
-
{
|
25 |
-
$this->notices = $notices;
|
26 |
-
}
|
27 |
-
|
28 |
/**
|
29 |
* @return bool
|
30 |
*/
|
@@ -33,21 +15,17 @@ class TogglePinned
|
|
33 |
if( !get_post( $command->id )) {
|
34 |
return false;
|
35 |
}
|
36 |
-
|
37 |
if( is_null( $command->pinned )) {
|
38 |
$meta = get_post_meta( $command->id, 'pinned', true );
|
39 |
$command->pinned = !wp_validate_boolean( $meta );
|
40 |
}
|
41 |
else {
|
42 |
$notice = $command->pinned
|
43 |
-
? __( '
|
44 |
-
: __( '
|
45 |
-
|
46 |
-
$this->notices->addSuccess( $notice );
|
47 |
}
|
48 |
-
|
49 |
update_post_meta( $command->id, 'pinned', $command->pinned );
|
50 |
-
|
51 |
return $command->pinned;
|
52 |
}
|
53 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews\Handlers;
|
4 |
|
5 |
use GeminiLabs\SiteReviews\Commands\TogglePinned as Command;
|
6 |
+
use GeminiLabs\SiteReviews\Modules\Notice;
|
7 |
|
8 |
class TogglePinned
|
9 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
/**
|
11 |
* @return bool
|
12 |
*/
|
15 |
if( !get_post( $command->id )) {
|
16 |
return false;
|
17 |
}
|
|
|
18 |
if( is_null( $command->pinned )) {
|
19 |
$meta = get_post_meta( $command->id, 'pinned', true );
|
20 |
$command->pinned = !wp_validate_boolean( $meta );
|
21 |
}
|
22 |
else {
|
23 |
$notice = $command->pinned
|
24 |
+
? __( 'Review pinned.', 'site-reviews' )
|
25 |
+
: __( 'Review unpinned.', 'site-reviews' );
|
26 |
+
glsr( Notice::class )->addSuccess( $notice );
|
|
|
27 |
}
|
|
|
28 |
update_post_meta( $command->id, 'pinned', $command->pinned );
|
|
|
29 |
return $command->pinned;
|
30 |
}
|
31 |
}
|
plugin/Helper.php
CHANGED
@@ -1,59 +1,53 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2017, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 2.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
namespace GeminiLabs\SiteReviews;
|
12 |
|
13 |
-
use GeminiLabs\SiteReviews\
|
14 |
-
use GeminiLabs\
|
15 |
-
use Vectorface\Whip\Whip;
|
16 |
|
17 |
class Helper
|
18 |
{
|
19 |
/**
|
20 |
-
* @
|
|
|
|
|
21 |
*/
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
24 |
/**
|
25 |
-
* @
|
|
|
|
|
26 |
*/
|
27 |
-
|
28 |
-
|
29 |
-
public function __construct( App $app, Database $db )
|
30 |
{
|
31 |
-
$this->
|
32 |
-
$this->db = $db;
|
33 |
}
|
34 |
|
35 |
/**
|
36 |
* @param string $name
|
37 |
-
* @param string $path
|
38 |
* @return string
|
39 |
*/
|
40 |
-
public function
|
41 |
{
|
42 |
-
|
43 |
-
$className = implode( '', $className );
|
44 |
-
return !empty( $path )
|
45 |
-
? str_replace( '\\\\', '\\', sprintf( '%s\%s', $path, $className ))
|
46 |
-
: $className;
|
47 |
}
|
48 |
|
49 |
/**
|
50 |
-
* @param string $
|
51 |
-
* @param string $prefix
|
52 |
* @return string
|
53 |
*/
|
54 |
-
public function
|
55 |
{
|
56 |
-
|
|
|
57 |
}
|
58 |
|
59 |
/**
|
@@ -66,6 +60,72 @@ class Helper
|
|
66 |
return $arr1 == $arr2;
|
67 |
}
|
68 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
/**
|
70 |
* @param string $needle
|
71 |
* @param string $haystack
|
@@ -80,121 +140,224 @@ class Helper
|
|
80 |
}
|
81 |
|
82 |
/**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
* @param string $prefix
|
84 |
* @return array
|
85 |
*/
|
86 |
-
public function flattenArray( array $array, $prefix = '' )
|
87 |
{
|
88 |
$result = [];
|
89 |
foreach( $array as $key => $value ) {
|
90 |
-
$newKey =
|
91 |
-
if( $this->
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
$result = array_merge( $result, $this->flattenArray( $value, $newKey ));
|
96 |
}
|
97 |
-
else {
|
98 |
-
$result
|
|
|
99 |
}
|
|
|
100 |
}
|
101 |
return $result;
|
102 |
}
|
103 |
|
104 |
/**
|
105 |
-
* @
|
106 |
-
* @return mixed
|
107 |
*/
|
108 |
-
public function
|
109 |
{
|
110 |
-
$
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
}
|
114 |
|
115 |
/**
|
116 |
-
*
|
|
|
|
|
|
|
117 |
*/
|
118 |
-
public function
|
119 |
{
|
120 |
-
$
|
121 |
-
$
|
122 |
-
|
123 |
-
|
124 |
-
|
|
|
125 |
}
|
126 |
-
|
127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
}
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
|
|
|
|
133 |
}
|
134 |
|
135 |
/**
|
136 |
-
* @param
|
137 |
-
* @param string $haystack
|
138 |
* @return bool
|
139 |
*/
|
140 |
-
public function
|
141 |
{
|
142 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
}
|
144 |
|
145 |
/**
|
146 |
-
* @param
|
147 |
-
* @
|
148 |
-
* @return mixed
|
149 |
*/
|
150 |
-
|
151 |
{
|
152 |
-
|
153 |
-
|
154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
}
|
156 |
|
157 |
/**
|
158 |
* @return array
|
159 |
*/
|
160 |
-
|
161 |
{
|
162 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
}
|
164 |
|
165 |
/**
|
166 |
-
* @param
|
167 |
-
* @
|
|
|
168 |
*/
|
169 |
-
|
170 |
{
|
171 |
-
return
|
|
|
|
|
172 |
}
|
173 |
|
174 |
/**
|
|
|
|
|
|
|
175 |
* @return array
|
176 |
*/
|
177 |
-
|
178 |
{
|
179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
}
|
181 |
|
182 |
/**
|
183 |
-
* @param
|
184 |
-
* @return
|
185 |
*/
|
186 |
-
|
187 |
{
|
188 |
-
if( !
|
189 |
-
|
|
|
|
|
|
|
|
|
190 |
}
|
191 |
-
$
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
|
|
|
|
|
|
199 |
}
|
200 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
namespace GeminiLabs\SiteReviews;
|
4 |
|
5 |
+
use GeminiLabs\SiteReviews\Database\Cache;
|
6 |
+
use GeminiLabs\Vectorface\Whip\Whip;
|
|
|
7 |
|
8 |
class Helper
|
9 |
{
|
10 |
/**
|
11 |
+
* @param string $name
|
12 |
+
* @param string $path
|
13 |
+
* @return string
|
14 |
*/
|
15 |
+
public function buildClassName( $name, $path = '' )
|
16 |
+
{
|
17 |
+
$className = $this->camelCase( $name );
|
18 |
+
$path = ltrim( str_replace( __NAMESPACE__, '', $path ), '\\' );
|
19 |
+
return !empty( $path )
|
20 |
+
? __NAMESPACE__.'\\'.$path.'\\'.$className
|
21 |
+
: $className;
|
22 |
+
}
|
23 |
|
24 |
/**
|
25 |
+
* @param string $name
|
26 |
+
* @param string $prefix
|
27 |
+
* @return string
|
28 |
*/
|
29 |
+
public function buildMethodName( $name, $prefix = '' )
|
|
|
|
|
30 |
{
|
31 |
+
return lcfirst( $prefix.$this->buildClassName( $name ));
|
|
|
32 |
}
|
33 |
|
34 |
/**
|
35 |
* @param string $name
|
|
|
36 |
* @return string
|
37 |
*/
|
38 |
+
public function buildPropertyName( $name )
|
39 |
{
|
40 |
+
return lcfirst( $this->buildClassName( $name ));
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
/**
|
44 |
+
* @param string $string
|
|
|
45 |
* @return string
|
46 |
*/
|
47 |
+
public function camelCase( $string )
|
48 |
{
|
49 |
+
$string = ucwords( str_replace( ['-', '_'], ' ', trim( $string )));
|
50 |
+
return str_replace( ' ', '', $string );
|
51 |
}
|
52 |
|
53 |
/**
|
60 |
return $arr1 == $arr2;
|
61 |
}
|
62 |
|
63 |
+
/**
|
64 |
+
* @param mixed $array
|
65 |
+
* @return array
|
66 |
+
*/
|
67 |
+
public function consolidateArray( $array )
|
68 |
+
{
|
69 |
+
return is_array( $array )
|
70 |
+
? $array
|
71 |
+
: [];
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @return array
|
76 |
+
*/
|
77 |
+
public function convertDotNotationArray( array $array )
|
78 |
+
{
|
79 |
+
$results = [];
|
80 |
+
foreach( $array as $path => $value ) {
|
81 |
+
$results = $this->setPathValue( $path, $value, $results );
|
82 |
+
}
|
83 |
+
return $results;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* @param string $name
|
88 |
+
* @return string
|
89 |
+
*/
|
90 |
+
public function convertPathToId( $path, $prefix = '' )
|
91 |
+
{
|
92 |
+
return str_replace( ['[', ']'], ['-', ''], $this->convertPathToName( $path, $prefix ));
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* @param string $path
|
97 |
+
* @return string
|
98 |
+
*/
|
99 |
+
public function convertPathToName( $path, $prefix = '' )
|
100 |
+
{
|
101 |
+
$levels = explode( '.', $path );
|
102 |
+
return array_reduce( $levels, function( $result, $value ) {
|
103 |
+
return $result.= '['.$value.']';
|
104 |
+
}, $prefix );
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @param string $string
|
109 |
+
* @param mixed $callback
|
110 |
+
* @return array
|
111 |
+
*/
|
112 |
+
public function convertStringToArray( $string, $callback = null )
|
113 |
+
{
|
114 |
+
$array = array_map( 'trim', explode( ',', $string ));
|
115 |
+
return $callback
|
116 |
+
? array_filter( $array, $callback )
|
117 |
+
: array_filter( $array );
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* @param string $string
|
122 |
+
* @return string
|
123 |
+
*/
|
124 |
+
public function dashCase( $string )
|
125 |
+
{
|
126 |
+
return str_replace( '_', '-', $this->snakeCase( $string ));
|
127 |
+
}
|
128 |
+
|
129 |
/**
|
130 |
* @param string $needle
|
131 |
* @param string $haystack
|
140 |
}
|
141 |
|
142 |
/**
|
143 |
+
* @param string $key
|
144 |
+
* @return mixed
|
145 |
+
*/
|
146 |
+
public function filterInput( $key, array $request = [] )
|
147 |
+
{
|
148 |
+
if( isset( $request[$key] )) {
|
149 |
+
return $request[$key];
|
150 |
+
}
|
151 |
+
$variable = filter_input( INPUT_POST, $key );
|
152 |
+
if( is_null( $variable ) && isset( $_POST[$key] )) {
|
153 |
+
$variable = $_POST[$key];
|
154 |
+
}
|
155 |
+
return $variable;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* @param string $key
|
160 |
+
* @return array
|
161 |
+
*/
|
162 |
+
public function filterInputArray( $key )
|
163 |
+
{
|
164 |
+
$variable = filter_input( INPUT_POST, $key, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
|
165 |
+
if( empty( $variable ) && !empty( $_POST[$key] ) && is_array( $_POST[$key] )) {
|
166 |
+
$variable = $_POST[$key];
|
167 |
+
}
|
168 |
+
return (array)$variable;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* @param bool $flattenValue
|
173 |
* @param string $prefix
|
174 |
* @return array
|
175 |
*/
|
176 |
+
public function flattenArray( array $array, $flattenValue = false, $prefix = '' )
|
177 |
{
|
178 |
$result = [];
|
179 |
foreach( $array as $key => $value ) {
|
180 |
+
$newKey = ltrim( $prefix.'.'.$key, '.' );
|
181 |
+
if( $this->isIndexedFlatArray( $value )) {
|
182 |
+
if( $flattenValue ) {
|
183 |
+
$value = '['.implode( ', ', $value ).']';
|
184 |
+
}
|
|
|
185 |
}
|
186 |
+
else if( is_array( $value )) {
|
187 |
+
$result = array_merge( $result, $this->flattenArray( $value, $flattenValue, $newKey ));
|
188 |
+
continue;
|
189 |
}
|
190 |
+
$result[$newKey] = $value;
|
191 |
}
|
192 |
return $result;
|
193 |
}
|
194 |
|
195 |
/**
|
196 |
+
* @return string
|
|
|
197 |
*/
|
198 |
+
public function getIpAddress()
|
199 |
{
|
200 |
+
$cloudflareIps = glsr( Cache::class )->getCloudflareIps();
|
201 |
+
$ipv6 = defined( 'AF_INET6' )
|
202 |
+
? $cloudflareIps['v6']
|
203 |
+
: [];
|
204 |
+
return (string)(new Whip( Whip::CLOUDFLARE_HEADERS | Whip::REMOTE_ADDR, [
|
205 |
+
Whip::CLOUDFLARE_HEADERS => [
|
206 |
+
Whip::IPV4 => $cloudflareIps['v4'],
|
207 |
+
Whip::IPV6 => $ipv6,
|
208 |
+
],
|
209 |
+
]))->getValidIpAddress();
|
210 |
}
|
211 |
|
212 |
/**
|
213 |
+
* Get a value from an array of values using a dot-notation path as reference
|
214 |
+
* @param string $path
|
215 |
+
* @param mixed $fallback
|
216 |
+
* @return void|mixed
|
217 |
*/
|
218 |
+
public function getPathValue( $path = '', array $values, $fallback = '' )
|
219 |
{
|
220 |
+
$keys = explode( '.', $path );
|
221 |
+
foreach( $keys as $key ) {
|
222 |
+
if( !isset( $values[$key] )) {
|
223 |
+
return $fallback;
|
224 |
+
}
|
225 |
+
$values = $values[$key];
|
226 |
}
|
227 |
+
return $values;
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* @param string $key
|
232 |
+
* @param string $position
|
233 |
+
* @return array
|
234 |
+
*/
|
235 |
+
public function insertInArray( array $array, array $insert, $key, $position = 'before' )
|
236 |
+
{
|
237 |
+
$keyPosition = intval( array_search( $key, array_keys( $array )));
|
238 |
+
if( 'after' == $position ) {
|
239 |
+
$keyPosition++;
|
240 |
}
|
241 |
+
if( false !== $keyPosition ) {
|
242 |
+
$result = array_slice( $array, 0, $keyPosition );
|
243 |
+
$result = array_merge( $result, $insert );
|
244 |
+
return array_merge( $result, array_slice( $array, $keyPosition ));
|
245 |
+
}
|
246 |
+
return array_merge( $array, $insert );
|
247 |
}
|
248 |
|
249 |
/**
|
250 |
+
* @param mixed $array
|
|
|
251 |
* @return bool
|
252 |
*/
|
253 |
+
public function isIndexedArray( $array )
|
254 |
{
|
255 |
+
if( !is_array( $array )) {
|
256 |
+
return false;
|
257 |
+
}
|
258 |
+
$current = 0;
|
259 |
+
foreach( array_keys( $array ) as $key ) {
|
260 |
+
if( $key !== $current ) {
|
261 |
+
return false;
|
262 |
+
}
|
263 |
+
$current++;
|
264 |
+
}
|
265 |
+
return true;
|
266 |
}
|
267 |
|
268 |
/**
|
269 |
+
* @param mixed $array
|
270 |
+
* @return bool
|
|
|
271 |
*/
|
272 |
+
public function isIndexedFlatArray( $array )
|
273 |
{
|
274 |
+
if( !is_array( $array ) || array_filter( $array, 'is_array' )) {
|
275 |
+
return false;
|
276 |
+
}
|
277 |
+
return $this->isIndexedArray( $array );
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* @param string $string
|
282 |
+
* @param string $prefix
|
283 |
+
* @return string
|
284 |
+
*/
|
285 |
+
public function prefixString( $string, $prefix = '' )
|
286 |
+
{
|
287 |
+
return $prefix.str_replace( $prefix, '', trim( $string ));
|
288 |
}
|
289 |
|
290 |
/**
|
291 |
* @return array
|
292 |
*/
|
293 |
+
public function removeEmptyArrayValues( array $array )
|
294 |
{
|
295 |
+
$result = [];
|
296 |
+
foreach( $array as $key => $value ) {
|
297 |
+
if( !$value )continue;
|
298 |
+
$result[$key] = is_array( $value )
|
299 |
+
? $this->removeEmptyArrayValues( $value )
|
300 |
+
: $value;
|
301 |
+
}
|
302 |
+
return $result;
|
303 |
}
|
304 |
|
305 |
/**
|
306 |
+
* @param string $prefix
|
307 |
+
* @param string $text
|
308 |
+
* @return string
|
309 |
*/
|
310 |
+
public function removePrefix( $prefix, $text )
|
311 |
{
|
312 |
+
return 0 === strpos( $text, $prefix )
|
313 |
+
? substr( $text, strlen( $prefix ))
|
314 |
+
: $text;
|
315 |
}
|
316 |
|
317 |
/**
|
318 |
+
* Set a value to an array of values using a dot-notation path as reference
|
319 |
+
* @param string $path
|
320 |
+
* @param mixed $value
|
321 |
* @return array
|
322 |
*/
|
323 |
+
public function setPathValue( $path, $value, array $values )
|
324 |
{
|
325 |
+
$token = strtok( $path, '.' );
|
326 |
+
$ref = &$values;
|
327 |
+
while( $token !== false ) {
|
328 |
+
$ref = is_array( $ref )
|
329 |
+
? $ref
|
330 |
+
: [];
|
331 |
+
$ref = &$ref[$token];
|
332 |
+
$token = strtok( '.' );
|
333 |
+
}
|
334 |
+
$ref = $value;
|
335 |
+
return $values;
|
336 |
}
|
337 |
|
338 |
/**
|
339 |
+
* @param string $string
|
340 |
+
* @return string
|
341 |
*/
|
342 |
+
public function snakeCase( $string )
|
343 |
{
|
344 |
+
if( !ctype_lower( $string )) {
|
345 |
+
$string = preg_replace( '/\s+/u', '', $string );
|
346 |
+
$string = preg_replace( '/(.)(?=[A-Z])/u', '$1_', $string );
|
347 |
+
$string = function_exists( 'mb_strtolower' )
|
348 |
+
? mb_strtolower( $string, 'UTF-8' )
|
349 |
+
: strtolower( $string );
|
350 |
}
|
351 |
+
return str_replace( '-', '_', $string );
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* @param string $needle
|
356 |
+
* @param string $haystack
|
357 |
+
* @return bool
|
358 |
+
*/
|
359 |
+
public function startsWith( $needle, $haystack )
|
360 |
+
{
|
361 |
+
return substr( $haystack, 0, strlen( $needle )) === $needle;
|
362 |
}
|
363 |
}
|
plugin/Html.php
DELETED
@@ -1,208 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\App;
|
15 |
-
|
16 |
-
class Html
|
17 |
-
{
|
18 |
-
/**
|
19 |
-
* @var App
|
20 |
-
*/
|
21 |
-
protected $app;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* @var array
|
25 |
-
*/
|
26 |
-
protected $forms;
|
27 |
-
|
28 |
-
public function __construct( App $app )
|
29 |
-
{
|
30 |
-
$this->app = $app;
|
31 |
-
$this->forms = [];
|
32 |
-
}
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Add a custom field to the form
|
36 |
-
* @param string $formId
|
37 |
-
* @return \GeminiLabs\SiteReviews\Html\Form|false
|
38 |
-
*/
|
39 |
-
public function addCustomField( $formId, callable $callback )
|
40 |
-
{
|
41 |
-
if( !$this->isForm( $formId ))return;
|
42 |
-
return $this->forms[$formId]->addCustomField( $callback );
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Add a field to an existing form
|
47 |
-
* @param string $formId
|
48 |
-
* @return \GeminiLabs\SiteReviews\Html\Form|false
|
49 |
-
*/
|
50 |
-
public function addField( $formId, array $args = [] )
|
51 |
-
{
|
52 |
-
if( !$this->isForm( $formId ))return;
|
53 |
-
return $this->forms[$formId]->addField( $args );
|
54 |
-
}
|
55 |
-
|
56 |
-
/**
|
57 |
-
* Create a new form
|
58 |
-
* @param string $formId
|
59 |
-
* @return \GeminiLabs\SiteReviews\Html\Form
|
60 |
-
*/
|
61 |
-
public function createForm( $formId, array $args = [] )
|
62 |
-
{
|
63 |
-
if( !$this->isForm( $formId )) {
|
64 |
-
$form = $this->app->make( 'Html\Form' )->normalize( $args );
|
65 |
-
$this->forms[$formId] = $form;
|
66 |
-
}
|
67 |
-
return $this->forms[$formId];
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Return dependencies from all forms
|
72 |
-
* @return array
|
73 |
-
*/
|
74 |
-
public function getDependencies()
|
75 |
-
{
|
76 |
-
$dependencies = [];
|
77 |
-
foreach( $this->forms as $form ) {
|
78 |
-
$dependencies = array_unique(
|
79 |
-
array_merge( $dependencies, $form->dependencies )
|
80 |
-
);
|
81 |
-
}
|
82 |
-
return $dependencies;
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Return dependencies from a specific form
|
87 |
-
* @return array
|
88 |
-
*/
|
89 |
-
public function getFormDependencies( $formId )
|
90 |
-
{
|
91 |
-
return $this->isForm( $formId )
|
92 |
-
? $this->forms[$formId]->dependencies
|
93 |
-
: [];
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Render a field (outside of a form)
|
98 |
-
* @return void|string
|
99 |
-
*/
|
100 |
-
public function renderField( array $args = [] )
|
101 |
-
{
|
102 |
-
$field = $this->app->make( 'Html\Field' )->normalize( $args );
|
103 |
-
return $field->render();
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Render a form then remove it
|
108 |
-
* @param string $formId
|
109 |
-
* @return void|string
|
110 |
-
*/
|
111 |
-
public function renderForm( $formId )
|
112 |
-
{
|
113 |
-
if( !$this->isForm( $formId ))return;
|
114 |
-
$form = $this->forms[$formId];
|
115 |
-
unset( $this->forms[$formId] );
|
116 |
-
return $form->render();
|
117 |
-
}
|
118 |
-
|
119 |
-
/**
|
120 |
-
* Render a partial
|
121 |
-
* @param string $partialName
|
122 |
-
* @return void|string
|
123 |
-
*/
|
124 |
-
public function renderPartial( $partialName, array $args = [] )
|
125 |
-
{
|
126 |
-
$partial = $this->app->make( 'Html\Partial' )->normalize( $partialName, $args );
|
127 |
-
return $partial->render();
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Render a template
|
132 |
-
* @param string $templatePath
|
133 |
-
* @return void|string
|
134 |
-
*/
|
135 |
-
public function renderTemplate( $templatePath, array $args = [] )
|
136 |
-
{
|
137 |
-
$file = $this->app->path . "views/{$templatePath}.php";
|
138 |
-
if( !file_exists( $file ))return;
|
139 |
-
ob_start();
|
140 |
-
include $file;
|
141 |
-
$template = ob_get_clean();
|
142 |
-
return $this->renderTemplateString( $template, $args );
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Render a template string
|
147 |
-
* @param string $template
|
148 |
-
* @return void|string
|
149 |
-
*/
|
150 |
-
public function renderTemplateString( $template, array $args = [] )
|
151 |
-
{
|
152 |
-
if( !empty( $args )) {
|
153 |
-
foreach( $args as $key => $value ) {
|
154 |
-
$template = str_replace( '{' . $key . '}', $value, $template );
|
155 |
-
}
|
156 |
-
}
|
157 |
-
$template = trim( $template );
|
158 |
-
return $template;
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
* Reset the forms array
|
163 |
-
* @return Html
|
164 |
-
*/
|
165 |
-
public function reset()
|
166 |
-
{
|
167 |
-
$this->forms = [];
|
168 |
-
return $this;
|
169 |
-
}
|
170 |
-
|
171 |
-
/**
|
172 |
-
* Set dependencies of a form
|
173 |
-
* @param string $formId
|
174 |
-
* @param bool|string $overwrite
|
175 |
-
* @return void
|
176 |
-
*/
|
177 |
-
public function setFormDependencies( $formId, array $dependencies, $overwrite = false )
|
178 |
-
{
|
179 |
-
if( $this->isForm( $formId ))return;
|
180 |
-
if( !$overwrite || $overwrite == 'merge' ) {
|
181 |
-
$dependencies = array_unique(
|
182 |
-
array_merge( $this->forms[$formId]->dependencies, $dependencies )
|
183 |
-
);
|
184 |
-
}
|
185 |
-
$this->forms[$formId]->dependencies = $dependencies;
|
186 |
-
}
|
187 |
-
|
188 |
-
/**
|
189 |
-
* Return a stored form
|
190 |
-
* @return \GeminiLabs\SiteReviews\Html\Form|false
|
191 |
-
*/
|
192 |
-
public function switchForm( $formId )
|
193 |
-
{
|
194 |
-
return $this->isForm( $formId )
|
195 |
-
? $this->forms[$formId]
|
196 |
-
: false;
|
197 |
-
}
|
198 |
-
|
199 |
-
/**
|
200 |
-
* Check if a form exists
|
201 |
-
* @param string $formId
|
202 |
-
* @return bool
|
203 |
-
*/
|
204 |
-
protected function isForm( $formId )
|
205 |
-
{
|
206 |
-
return isset( $this->forms[$formId] );
|
207 |
-
}
|
208 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Html/Field.php
DELETED
@@ -1,380 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Html;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\App;
|
15 |
-
use ReflectionException;
|
16 |
-
|
17 |
-
class Field
|
18 |
-
{
|
19 |
-
/**
|
20 |
-
* @var App
|
21 |
-
*/
|
22 |
-
protected $app;
|
23 |
-
|
24 |
-
/**
|
25 |
-
* @var array
|
26 |
-
*/
|
27 |
-
protected $args;
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @var array
|
31 |
-
*/
|
32 |
-
protected $dependencies;
|
33 |
-
|
34 |
-
public function __construct( App $app )
|
35 |
-
{
|
36 |
-
$this->app = $app;
|
37 |
-
$this->args = [];
|
38 |
-
$this->dependencies = [];
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* @param string $property
|
43 |
-
* @return mixed
|
44 |
-
* @throws Exception
|
45 |
-
*/
|
46 |
-
public function __get( $property )
|
47 |
-
{
|
48 |
-
if( in_array( $property, ['args', 'dependencies'] )) {
|
49 |
-
return $this->$property;
|
50 |
-
}
|
51 |
-
throw new Exception( 'Invalid ' . __CLASS__ . ' property: ' . $property );
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Get a specific Field
|
56 |
-
*
|
57 |
-
* @return mixed GeminiLabs\SiteReviews\Html\Fields\*
|
58 |
-
*/
|
59 |
-
public function getField( array $args = [] )
|
60 |
-
{
|
61 |
-
if( empty( $args )) {
|
62 |
-
$args = $this->args;
|
63 |
-
}
|
64 |
-
|
65 |
-
$className = sprintf( 'GeminiLabs\SiteReviews\Html\Fields\%s', ucfirst( $args['type'] ));
|
66 |
-
|
67 |
-
if( !class_exists( $className )) {
|
68 |
-
throw new ReflectionException( "Class does not exist: {$className}" );
|
69 |
-
}
|
70 |
-
|
71 |
-
return (new $className( $args ));
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* Normalize the field arguments
|
76 |
-
*
|
77 |
-
* @return $this
|
78 |
-
*/
|
79 |
-
public function normalize( array $args = [] )
|
80 |
-
{
|
81 |
-
$defaults = [
|
82 |
-
'after' => '',
|
83 |
-
'attributes' => '',
|
84 |
-
'before' => '',
|
85 |
-
'class' => '',
|
86 |
-
'default' => null,
|
87 |
-
'depends' => null,
|
88 |
-
'desc' => '',
|
89 |
-
'errors' => [],
|
90 |
-
'inline' => false,
|
91 |
-
'label' => '',
|
92 |
-
'name' => '',
|
93 |
-
'options' => [],
|
94 |
-
'path' => '',
|
95 |
-
'placeholder' => '',
|
96 |
-
'prefix' => '',
|
97 |
-
'render' => true,
|
98 |
-
'suffix' => null,
|
99 |
-
'type' => 'text',
|
100 |
-
'value' => '',
|
101 |
-
];
|
102 |
-
|
103 |
-
$args = $atts = wp_parse_args( $args, $defaults );
|
104 |
-
|
105 |
-
$args['attributes'] = $this->parseAttributes( $atts );
|
106 |
-
$args['id'] = $this->parseId( $atts );
|
107 |
-
$args['inline'] = $this->parseInline( $atts );
|
108 |
-
$args['type'] = $this->parseType( $atts );
|
109 |
-
$args['name'] = $this->parseName( $atts );
|
110 |
-
$args['options'] = (array) $atts['options']; // make sure this is always an array
|
111 |
-
$args['path'] = $atts['name'];
|
112 |
-
$args['prefix'] = $this->parsePrefix( $atts );
|
113 |
-
$args['value'] = $this->parseValue( $atts );
|
114 |
-
|
115 |
-
$this->args = $args;
|
116 |
-
|
117 |
-
$this->dependencies = $this->getField( $args )->dependencies;
|
118 |
-
|
119 |
-
$this->setDataDepends();
|
120 |
-
|
121 |
-
$this->checkForErrors( $atts );
|
122 |
-
|
123 |
-
return $this;
|
124 |
-
}
|
125 |
-
|
126 |
-
/**
|
127 |
-
* Render the field
|
128 |
-
* @return string
|
129 |
-
*/
|
130 |
-
public function render()
|
131 |
-
{
|
132 |
-
if( $this->args['render'] === false )return;
|
133 |
-
|
134 |
-
$field = $this->getField();
|
135 |
-
|
136 |
-
$class = 'glsr-field';
|
137 |
-
$class .= $this->args['errors'] ? ' glsr-has-error' : '';
|
138 |
-
|
139 |
-
$renderedString = '%s';
|
140 |
-
|
141 |
-
if( ( isset( $field->args['required'] ) && $field->args['required'] )
|
142 |
-
|| ( isset( $field->args['attributes']['required'] ) || in_array( 'required', $field->args['attributes'] )) ) {
|
143 |
-
$class .= ' glsr-required';
|
144 |
-
}
|
145 |
-
|
146 |
-
if( !in_array( $field->args['type'], ['hidden', 'honeypot'] )) {
|
147 |
-
$renderedString = sprintf( '<div class="%s">%%s</div>', $class );
|
148 |
-
}
|
149 |
-
|
150 |
-
$rendered = sprintf( $renderedString,
|
151 |
-
$this->args['before'] .
|
152 |
-
$field->generateLabel() .
|
153 |
-
$field->render() .
|
154 |
-
$this->args['after'] .
|
155 |
-
$this->args['errors']
|
156 |
-
);
|
157 |
-
return apply_filters( 'site-reviews/rendered/field', $rendered, $field->args['type'] );
|
158 |
-
}
|
159 |
-
|
160 |
-
/**
|
161 |
-
* Reset the Field
|
162 |
-
*
|
163 |
-
* @return self
|
164 |
-
*/
|
165 |
-
public function reset()
|
166 |
-
{
|
167 |
-
$this->args = [];
|
168 |
-
|
169 |
-
return $this;
|
170 |
-
}
|
171 |
-
|
172 |
-
/**
|
173 |
-
* Check for form submission field errors
|
174 |
-
*
|
175 |
-
* @return void
|
176 |
-
*/
|
177 |
-
protected function checkForErrors( array $atts )
|
178 |
-
{
|
179 |
-
$args = $this->args;
|
180 |
-
|
181 |
-
if( !array_key_exists( $atts['name'], $args['errors'] )) {
|
182 |
-
$this->args['errors'] = ''; // set to an empty string
|
183 |
-
return;
|
184 |
-
}
|
185 |
-
|
186 |
-
$field_errors = $args['errors'][ $atts['name'] ];
|
187 |
-
|
188 |
-
$errors = array_reduce( $field_errors['errors'], function( $carry, $error ) {
|
189 |
-
return $carry . sprintf( '<span class="glsr-field-error">%s</span> ', $error );
|
190 |
-
});
|
191 |
-
|
192 |
-
$this->args['errors'] = sprintf( '<span class="glsr-field-errors">%s</span>', $errors );
|
193 |
-
}
|
194 |
-
|
195 |
-
/**
|
196 |
-
* Parse the field attributes and convert to an array if needed
|
197 |
-
*
|
198 |
-
* @return array
|
199 |
-
*/
|
200 |
-
protected function parseAttributes( array $args )
|
201 |
-
{
|
202 |
-
if( empty( $args['attributes'] )) {
|
203 |
-
return [];
|
204 |
-
}
|
205 |
-
|
206 |
-
$attributes = (array) $args['attributes'];
|
207 |
-
|
208 |
-
foreach( $attributes as $key => $value ) {
|
209 |
-
if( is_string( $key ))continue;
|
210 |
-
unset( $attributes[ $key ] );
|
211 |
-
if( !isset( $attributes[ $value ] )) {
|
212 |
-
$attributes[ $value ] = '';
|
213 |
-
}
|
214 |
-
}
|
215 |
-
|
216 |
-
return $attributes;
|
217 |
-
}
|
218 |
-
|
219 |
-
/**
|
220 |
-
* Parse the field ID from the field path
|
221 |
-
*
|
222 |
-
* @return null|string
|
223 |
-
*/
|
224 |
-
protected function parseId( array $args )
|
225 |
-
{
|
226 |
-
if( isset( $args['id'] ) && !$args['id'] )return;
|
227 |
-
|
228 |
-
!$args['suffix'] ?: $args['suffix'] = "-{$args['suffix']}";
|
229 |
-
|
230 |
-
return str_replace( ['[]','[',']','.'], ['','-','','-'], $this->parseName( $args ) . $args['suffix'] );
|
231 |
-
}
|
232 |
-
|
233 |
-
/**
|
234 |
-
* Parse the field inline
|
235 |
-
*
|
236 |
-
* @return bool
|
237 |
-
*/
|
238 |
-
protected function parseInline( array $args )
|
239 |
-
{
|
240 |
-
return false !== stripos( $args['type'], '_inline' )
|
241 |
-
? true
|
242 |
-
: $args['inline'];
|
243 |
-
}
|
244 |
-
|
245 |
-
/**
|
246 |
-
* Parse the field name
|
247 |
-
*
|
248 |
-
* @return string
|
249 |
-
*/
|
250 |
-
protected function parseName( array $args )
|
251 |
-
{
|
252 |
-
$name = $args['name'];
|
253 |
-
$prefix = $this->parsePrefix( $args );
|
254 |
-
|
255 |
-
if( $prefix === false ) {
|
256 |
-
return $name;
|
257 |
-
}
|
258 |
-
|
259 |
-
$paths = explode( '.', $name );
|
260 |
-
|
261 |
-
return array_reduce( $paths, function( $result, $value ) {
|
262 |
-
return $result .= "[$value]";
|
263 |
-
}, $prefix );
|
264 |
-
}
|
265 |
-
|
266 |
-
/**
|
267 |
-
* Parse the field prefix
|
268 |
-
*
|
269 |
-
* @return string|false
|
270 |
-
*/
|
271 |
-
protected function parsePrefix( array $args )
|
272 |
-
{
|
273 |
-
$prefix = $args['prefix'];
|
274 |
-
|
275 |
-
return ( '' === trim( $prefix ) && $prefix !== false )
|
276 |
-
? $this->app->make( 'Database' )->getOptionName()
|
277 |
-
: $prefix;
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* Parse the field type
|
282 |
-
*
|
283 |
-
* @return string
|
284 |
-
*/
|
285 |
-
protected function parseType( array $args )
|
286 |
-
{
|
287 |
-
$type = $args['type'];
|
288 |
-
|
289 |
-
return false !== stripos( $type, '_inline' )
|
290 |
-
? str_replace( '_inline', '', $type )
|
291 |
-
: $type;
|
292 |
-
}
|
293 |
-
|
294 |
-
/**
|
295 |
-
* Parse the field value
|
296 |
-
*
|
297 |
-
* @return string
|
298 |
-
*/
|
299 |
-
protected function parseValue( array $args )
|
300 |
-
{
|
301 |
-
$default = $args['default'];
|
302 |
-
$name = $args['name'];
|
303 |
-
$prefix = $args['prefix'];
|
304 |
-
$value = $args['value'];
|
305 |
-
|
306 |
-
if( $default == ':placeholder' ) {
|
307 |
-
$default = '';
|
308 |
-
}
|
309 |
-
|
310 |
-
return ( !empty( $value ) || !$name || $prefix === false )
|
311 |
-
? $value
|
312 |
-
: $default;
|
313 |
-
}
|
314 |
-
|
315 |
-
/**
|
316 |
-
* Get the [data-depends] attribute
|
317 |
-
*
|
318 |
-
* @return array|null
|
319 |
-
*/
|
320 |
-
public function getDataDepends()
|
321 |
-
{
|
322 |
-
return $this->setDataDepends();
|
323 |
-
}
|
324 |
-
|
325 |
-
/**
|
326 |
-
* Set the field value
|
327 |
-
*
|
328 |
-
* @return self
|
329 |
-
*/
|
330 |
-
public function setValue()
|
331 |
-
{
|
332 |
-
$name = $this->args['path'];
|
333 |
-
$default = $this->args['default'];
|
334 |
-
|
335 |
-
if( !$name ) {
|
336 |
-
return $this;
|
337 |
-
}
|
338 |
-
|
339 |
-
if( $default == ':placeholder' ) {
|
340 |
-
$default = '';
|
341 |
-
}
|
342 |
-
|
343 |
-
$value = glsr_resolve( 'Database' )->getOption( $name, $default );
|
344 |
-
|
345 |
-
if( !empty( $value ) || $this->args['type'] == 'checkbox' ) {
|
346 |
-
$this->args['value'] = $value;
|
347 |
-
}
|
348 |
-
|
349 |
-
return $this;
|
350 |
-
}
|
351 |
-
|
352 |
-
/**
|
353 |
-
* Set the [data-depends] attribute
|
354 |
-
*
|
355 |
-
* @return null|array
|
356 |
-
*/
|
357 |
-
protected function setDataDepends()
|
358 |
-
{
|
359 |
-
if( !( $depends = $this->args['depends'] ))return;
|
360 |
-
|
361 |
-
$name = $depends;
|
362 |
-
$value = true;
|
363 |
-
|
364 |
-
if( is_array( $depends )) {
|
365 |
-
reset( $depends );
|
366 |
-
$name = key( $depends );
|
367 |
-
$value = $depends[ $name ];
|
368 |
-
}
|
369 |
-
|
370 |
-
$name = $this->parseName([
|
371 |
-
'name' => $name,
|
372 |
-
'prefix' => $this->args['prefix'],
|
373 |
-
]);
|
374 |
-
|
375 |
-
return $this->args['attributes']['data-depends'] = [
|
376 |
-
'name' => $name,
|
377 |
-
'value' => $value,
|
378 |
-
];
|
379 |
-
}
|
380 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plugin/Html/Fields/Base.php
DELETED
@@ -1,366 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* @package GeminiLabs\SiteReviews
|
5 |
-
* @copyright Copyright (c) 2016, Paul Ryley
|
6 |
-
* @license GPLv3
|
7 |
-
* @since 1.0.0
|
8 |
-
* -------------------------------------------------------------------------------------------------
|
9 |
-
*/
|
10 |
-
|
11 |
-
namespace GeminiLabs\SiteReviews\Html\Fields;
|
12 |
-
|
13 |
-
use Exception;
|
14 |
-
use GeminiLabs\SiteReviews\Html\Normalize;
|
15 |
-
|
16 |
-
abstract class Base
|
17 |
-
{
|
18 |
-
/**
|
19 |
-
* @var array
|
20 |
-
*/
|
21 |
-
protected $args;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* @var array
|
25 |
-
*/
|
26 |
-
protected $dependencies = [];
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Whether the field has multiple values
|
30 |
-
*
|
31 |
-
* @var bool
|
32 |
-
*/
|
33 |
-
protected $multi = false;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Whether the field is rendered outside of the form table
|
37 |
-
*
|
38 |
-
* @var bool
|
39 |
-
*/
|
40 |
-
protected $outside = false;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* The field element tag (i.e. "input")
|
44 |
-
*
|
45 |
-
* @var string
|
46 |
-
*/
|
47 |
-
protected $element;
|
48 |
-
|
49 |
-
public function __construct( array $args = [] )
|
50 |
-
{
|
51 |
-
$this->args = $args;
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* @param string $property
|
56 |
-
*
|
57 |
-
* @return mixed
|
58 |
-
* @throws Exception
|
59 |
-
*/
|
60 |
-
public function __get( $property )
|
61 |
-
{
|
62 |
-
if( in_array( $property, [
|
63 |
-
'args',
|
64 |
-
'dependencies',
|
65 |
-
'element',
|
66 |
-
'multi',
|
67 |
-
'outside',
|
68 |
-
])) {
|
69 |
-
return $this->$property;
|
70 |
-
}
|
71 |
-
throw new Exception( 'Invalid ' . __CLASS__ . ' property: ' . $property );
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* Generate the field description
|
76 |
-
*
|
77 |
-
* @param bool $paragraph
|
78 |
-
*
|
79 |
-
* @return null|string
|
80 |
-
*/
|
81 |
-
public function generateDescription( $paragraph = true )
|
82 |
-
{
|
83 |
-
if( !empty( $this->args['desc'] )) {
|
84 |
-
return sprintf( '<p class="description">%s</p>', $this->args['desc'] );
|
85 |
-
}
|
86 |
-
else if( !empty( $this->args['description'] )) {
|
87 |
-
return sprintf( '<small>%s</small>', $this->args['description'] );
|
88 |
-
}
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Generate the field label
|
93 |
-
*
|
94 |
-
* @return null|string
|
95 |
-
*/
|
96 |
-
public function generateLabel()
|
97 |
-
{
|
98 |
-
if( empty( $this->args['label'] ))return;
|
99 |
-
|
100 |
-
$for = !!$this->args['id']
|
101 |
-
? " for=\"{$this->args['id']}\""
|
102 |
-
: '';
|
103 |
-
|
104 |
-
return sprintf( '<label%s>%s</label>', $for, $this->args['label'] );
|
105 |
-
}
|
106 |
-
|
107 |
-
/**
|
108 |
-
* Render this field type
|
109 |
-
*
|
110 |
-
* @return string
|
111 |
-
*/
|
112 |
-
abstract public function render( array $defaults = [] );
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Convert a value to camel case.
|
116 |
-
*
|
117 |
-
* @param string $value
|
118 |
-
*
|
119 |
-
* @return string
|
120 |
-
*/
|
121 |
-
protected function camelCase( $value )
|
122 |
-
{
|
123 |
-
$value = ucwords( str_replace( ['-', '_'], ' ', $value ));
|
124 |
-
|
125 |
-
return lcfirst( str_replace( ' ', '', $value ));
|
126 |
-
}
|
127 |
-
|
128 |
-
/**
|
129 |
-
* Implode the field attributes
|
130 |
-
*
|
131 |
-
* @return string
|
132 |
-
*/
|
133 |
-
protected function implodeAttributes( $defaults = [] )
|
134 |
-
{
|
135 |
-
return $this->normalize( $defaults, 'implode' );
|
136 |
-
}
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Implode multi-field items
|
140 |
-
*
|
141 |
-
* @return null|string
|
142 |
-
*/
|
143 |
-
p
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|