Site Reviews - Version 3.5.4

Version Description

(2019-03-29) =

  • Fixed compatibility with Woocommerce when using the "Product" schema type
Download this release

Release Info

Developer geminilabs
Plugin Icon 128x128 Site Reviews
Version 3.5.4
Comparing to
See all releases

Code changes from version 2.17.1 to 3.5.4

Files changed (160) hide show
  1. assets/css/site-reviews-admin.css +0 -1
  2. assets/css/site-reviews.css +0 -1
  3. assets/css/twenty-eleven.css +0 -1
  4. assets/css/twenty-fifteen.css +0 -1
  5. assets/css/twenty-fourteen.css +0 -1
  6. assets/css/twenty-seventeen.css +0 -1
  7. assets/css/twenty-sixteen.css +0 -1
  8. assets/css/twenty-ten.css +0 -1
  9. assets/css/twenty-thirteen.css +0 -1
  10. assets/css/twenty-twelve.css +0 -1
  11. assets/images/addon-images.svg +1 -0
  12. assets/images/addon-tripadvisor.svg +1 -0
  13. assets/images/block-icon-form.svg +1 -0
  14. assets/images/block-icon-reviews.svg +1 -0
  15. assets/images/block-icon-summary.svg +1 -0
  16. assets/images/icon.png +0 -0
  17. assets/images/pinned.svg +1 -0
  18. assets/images/star-empty.svg +1 -0
  19. assets/{img/star-empty.svg → images/star-error.svg} +1 -2
  20. assets/images/star-full.svg +1 -0
  21. assets/images/star-half.svg +1 -0
  22. assets/img/booking.svg +0 -14
  23. assets/img/facebook.svg +0 -11
  24. assets/img/google.svg +0 -15
  25. assets/img/icon.png +0 -0
  26. assets/img/pinned.svg +0 -6
  27. assets/img/star-filled.svg +0 -6
  28. assets/img/star-half.svg +0 -6
  29. assets/img/tripadvisor.svg +0 -21
  30. assets/img/yelp.svg +0 -14
  31. assets/js/mce-plugin.js +0 -1
  32. assets/js/recaptcha.js +0 -1
  33. assets/js/site-reviews-admin.js +0 -1
  34. assets/js/site-reviews.js +0 -8
  35. assets/scripts/mce-plugin.js +1 -0
  36. assets/scripts/site-reviews-admin.js +1 -0
  37. assets/scripts/site-reviews-blocks.js +1 -0
  38. assets/scripts/site-reviews.js +1 -0
  39. assets/styles/custom/bootstrap_4.css +1 -0
  40. assets/styles/custom/bootstrap_4_custom.css +1 -0
  41. assets/styles/custom/contact_form_7.css +1 -0
  42. assets/styles/custom/materialize.css +1 -0
  43. assets/styles/custom/minimal.css +1 -0
  44. assets/styles/custom/twentyfifteen.css +1 -0
  45. assets/styles/custom/twentynineteen.css +1 -0
  46. assets/styles/custom/twentyseventeen.css +1 -0
  47. assets/styles/custom/twentysixteen.css +1 -0
  48. assets/styles/inline-styles.css +1 -0
  49. assets/styles/site-reviews-admin.css +1 -0
  50. assets/styles/site-reviews-blocks.css +1 -0
  51. assets/styles/site-reviews.css +1 -0
  52. autoload.php +11 -24
  53. compatibility.php +39 -113
  54. config/forms/submission-form.php +33 -0
  55. config/inline-styles.php +8 -0
  56. config/settings.php +369 -0
  57. config/styles/bootstrap_4.php +19 -0
  58. config/styles/bootstrap_4_custom.php +19 -0
  59. config/styles/contact_form_7.php +19 -0
  60. config/styles/divi.php +7 -0
  61. config/styles/materialize.php +18 -0
  62. config/styles/ninja_forms.php +8 -0
  63. config/styles/wpforms.php +12 -0
  64. deprecated.php +113 -0
  65. helpers.php +116 -69
  66. languages/readme.txt +0 -5
  67. languages/site-reviews-en_US.mo +0 -0
  68. languages/site-reviews-en_US.po +1232 -1176
  69. languages/site-reviews.pot +874 -843
  70. loco.xml +0 -22
  71. plugin/Actions.php +115 -0
  72. plugin/App.php +0 -315
  73. plugin/Application.php +271 -0
  74. plugin/Blacklist.php +0 -56
  75. plugin/Blocks/BlockGenerator.php +69 -0
  76. plugin/Blocks/SiteReviewsBlock.php +130 -0
  77. plugin/Blocks/SiteReviewsFormBlock.php +121 -0
  78. plugin/Blocks/SiteReviewsSummaryBlock.php +89 -0
  79. plugin/Commands/ChangeStatus.php +1 -9
  80. plugin/Commands/CreateReview.php +138 -0
  81. plugin/Commands/EnqueueAdminAssets.php +13 -0
  82. plugin/Commands/EnqueueAssets.php +0 -27
  83. plugin/Commands/RegisterPointers.php +0 -21
  84. plugin/Commands/RegisterPostType.php +62 -61
  85. plugin/Commands/RegisterShortcodeButtons.php +0 -21
  86. plugin/Commands/RegisterShortcodes.php +0 -8
  87. plugin/Commands/RegisterTaxonomy.php +0 -8
  88. plugin/Commands/RegisterTinymcePopups.php +13 -0
  89. plugin/Commands/RegisterWidgets.php +1 -9
  90. plugin/Commands/SubmitReview.php +0 -47
  91. plugin/Commands/TogglePinned.php +2 -12
  92. plugin/Container.php +21 -74
  93. plugin/Contracts/HooksContract.php +11 -0
  94. plugin/Contracts/PartialContract.php +11 -0
  95. plugin/Contracts/ProviderContract.php +13 -0
  96. plugin/Contracts/ShortcodeContract.php +12 -0
  97. plugin/Controllers/AdminController.php +232 -0
  98. plugin/Controllers/AjaxController.php +76 -71
  99. plugin/Controllers/BaseController.php +0 -138
  100. plugin/Controllers/BlocksController.php +92 -0
  101. plugin/Controllers/Controller.php +63 -0
  102. plugin/Controllers/EditorController.php +399 -0
  103. plugin/Controllers/EditorController/Customization.php +85 -0
  104. plugin/Controllers/EditorController/Labels.php +127 -0
  105. plugin/Controllers/EditorController/Metaboxes.php +40 -0
  106. plugin/Controllers/ListTableController.php +339 -0
  107. plugin/Controllers/ListTableController/Columns.php +144 -0
  108. plugin/Controllers/MainController.php +40 -815
  109. plugin/Controllers/MenuController.php +199 -0
  110. plugin/Controllers/PublicController.php +108 -0
  111. plugin/Controllers/RestCategoryController.php +38 -0
  112. plugin/Controllers/RestReviewController.php +48 -0
  113. plugin/Controllers/ReviewController.php +74 -677
  114. plugin/Controllers/SettingsController.php +115 -0
  115. plugin/Controllers/TaxonomyController.php +79 -0
  116. plugin/Database.php +71 -474
  117. plugin/Database/Cache.php +74 -0
  118. plugin/Database/CountsManager.php +363 -0
  119. plugin/Database/DefaultsManager.php +64 -0
  120. plugin/Database/OptionManager.php +137 -0
  121. plugin/Database/Options.php +0 -223
  122. plugin/Database/OptionsContract.php +0 -107
  123. plugin/Database/QueryBuilder.php +162 -0
  124. plugin/Database/ReviewManager.php +192 -0
  125. plugin/Database/SqlQueries.php +231 -0
  126. plugin/Defaults/BuilderDefaults.php +24 -0
  127. plugin/Defaults/CreateReviewDefaults.php +33 -0
  128. plugin/Defaults/DefaultsAbstract.php +44 -0
  129. plugin/Defaults/EmailDefaults.php +31 -0
  130. plugin/Defaults/PaginationDefaults.php +24 -0
  131. plugin/Defaults/PostTypeDefaults.php +38 -0
  132. plugin/Defaults/ReviewsDefaults.php +28 -0
  133. plugin/Defaults/SiteReviewsDefaults.php +30 -0
  134. plugin/Defaults/SiteReviewsFormDefaults.php +25 -0
  135. plugin/Defaults/SiteReviewsSummaryDefaults.php +28 -0
  136. plugin/Defaults/SlackDefaults.php +24 -0
  137. plugin/Defaults/StyleFieldsDefaults.php +25 -0
  138. plugin/Defaults/StyleValidationDefaults.php +27 -0
  139. plugin/Defaults/ValidateReviewDefaults.php +28 -0
  140. plugin/Defaults/ValidationStringsDefaults.php +29 -0
  141. plugin/Email.php +0 -245
  142. plugin/Filters.php +72 -0
  143. plugin/Handlers/ChangeStatus.php +51 -21
  144. plugin/Handlers/CreateReview.php +46 -0
  145. plugin/Handlers/EnqueueAdminAssets.php +159 -0
  146. plugin/Handlers/EnqueueAssets.php +0 -191
  147. plugin/Handlers/EnqueuePublicAssets.php +137 -0
  148. plugin/Handlers/RegisterPointers.php +0 -62
  149. plugin/Handlers/RegisterPostType.php +4 -373
  150. plugin/Handlers/RegisterShortcodeButtons.php +0 -36
  151. plugin/Handlers/RegisterShortcodes.php +7 -23
  152. plugin/Handlers/RegisterTaxonomy.php +3 -92
  153. plugin/Handlers/RegisterTinymcePopups.php +28 -0
  154. plugin/Handlers/RegisterWidgets.php +9 -24
  155. plugin/Handlers/SubmitReview.php +0 -178
  156. plugin/Handlers/TogglePinned.php +4 -26
  157. plugin/Helper.php +253 -90
  158. plugin/Html.php +0 -208
  159. plugin/Html/Field.php +0 -380
  160. 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
- <title>star-empty</title>
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
- * PSR-4 autoloader
15
- */
16
- spl_autoload_register( function( $class )
17
- {
18
  $namespaces = [
19
- 'GeminiLabs\\SiteReviews\\' => __DIR__ . '/plugin/',
20
- 'GeminiLabs\\SiteReviews\\Tests\\' => __DIR__ . '/tests/',
21
- 'Sepia\\PoParser\\' => __DIR__ . '/vendor/qcubed/i18n/src/Sepia/',
22
- 'Sinergi\\BrowserDetector\\' => __DIR__ . '/vendor/sinergi/browser-detector/src/',
23
- 'Vectorface\\Whip\\' => __DIR__ . '/vendor/vectorface/whip/src/',
24
  ];
25
-
26
- foreach( $namespaces as $prefix => $base_dir ) {
27
  $len = strlen( $prefix );
28
- if( strncmp( $prefix, $class, $len ) !== 0 )continue;
29
- $file = $base_dir . str_replace( '\\', '/', substr( $class, $len )) . '.php';
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
- * @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
  * @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
- // Wordpress 4.0-4.2 support
24
- if( !function_exists( 'wp_roles' )) {
25
- function wp_roles() {
26
- global $wp_roles;
27
- isset( $wp_roles ) ?: $wp_roles = new WP_Roles;
28
- return $wp_roles;
29
- }
30
- }
31
-
32
- // Wordpress 4.0-4.2 support
33
- if( !function_exists( 'get_avatar_url' )) {
34
- function get_avatar_url( $id_or_email, $args = null ) {
35
- isset( $args['size'] ) ?: $args['size'] = 96;
36
- isset( $args['default'] ) ?: $args['default'] = 'mystery';
37
- if( $avatar = get_avatar( $id_or_email, $args['size'], $args['default'] )) {
38
- $dom = new \DOMDocument;
39
- $dom->loadHTML( $avatar );
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", "&lt;\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
- * @package GeminiLabs\SiteReviews
5
- * @copyright Copyright (c) 2016, Paul Ryley
6
- * @license GPLv3
7
- * @since 2.7.4
8
- * -------------------------------------------------------------------------------------------------
9
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- defined( 'WPINC' ) || die;
12
-
13
- use GeminiLabs\SiteReviews\App;
14
- use GeminiLabs\SiteReviews\Log\LogLevel;
 
 
 
 
 
15
 
16
  /**
17
- * Global helper to return $app
18
- *
19
- * @return App
20
  */
21
- function glsr_app() {
22
- return App::load();
 
 
 
 
 
 
23
  }
24
 
25
  /**
26
- * Global helper to debug variables
27
- *
28
  * @return void
29
  */
30
- function glsr_debug() {
31
- call_user_func_array([ App::load()->make( 'Log\Logger' ), 'display'], func_get_args());
 
32
  }
33
 
34
  /**
35
- * Global helper to log variables
36
- *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  * @return void
38
  */
39
- function glsr_log( $message, $level = 'debug' ) {
40
- $levels = array_values((new ReflectionClass( 'GeminiLabs\SiteReviews\Log\LogLevel' ))->getConstants());
41
- if( !in_array( $level, $levels )) {
42
- $level = LogLevel::DEBUG;
 
 
 
 
 
 
 
43
  }
44
- App::load()->make( 'Log\Logger' )->log( $level, $message );
45
  }
46
 
47
  /**
48
- * Global helper to get a plugin option
49
- *
50
- * @param string $option_path
51
  * @param mixed $fallback
52
- * @return mixed
53
  */
54
- function glsr_get_option( $option_path = '', $fallback = '' ) {
55
- return App::load()->make( 'Helper' )->get( 'option', $option_path, $fallback );
 
 
56
  }
57
 
58
  /**
59
- * Global helper to get all plugin options
60
- *
61
  * @return array
62
  */
63
  function glsr_get_options() {
64
- return App::load()->make( 'Helper' )->get( 'options' );
65
  }
66
 
67
  /**
68
- * Global helper to get a single review
69
- *
70
  * @param int $post_id
71
- * @return null|object
72
  */
73
  function glsr_get_review( $post_id ) {
74
- return App::load()->make( 'Helper' )->get( 'review', $post_id );
 
 
 
 
 
 
 
75
  }
76
 
77
  /**
78
- * Global helper to get an array of reviews
79
- *
80
  * @return array
81
  */
82
- function glsr_get_reviews( array $args = array() ) {
83
- return App::load()->make( 'Helper' )->get( 'reviews', $args );
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
- * register_taxonomy() 'meta_box_cb' callback
98
- *
99
- * This function prevents the taxonomy object from containing class recursion
100
- *
101
- * @return void
102
  */
103
- function glsr_categories_meta_box( $post, $box ) {
104
- App::load()->make( 'Controllers\MainController' )->renderTaxonomyMetabox( $post, $box );
 
 
 
 
 
 
 
105
  }
106
 
107
  /**
108
- * get_current_screen() is unreliable because it is defined on most admin pages, but not all.
109
- *
110
- * @return WP_Screen|null
111
  */
112
- function glsr_current_screen() {
113
- if( function_exists( 'get_current_screen' )) {
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) 2018 site-reviews
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/Database.php:346
56
- msgid "%s reviews"
57
- msgstr "%s reviews"
58
 
59
- #: plugin/Database.php:377
60
- msgid "Anonymous"
61
- msgstr "Anonymous"
62
-
63
- #: plugin/Date.php:44
64
- msgid "%s second ago"
65
- msgid_plural "%s seconds ago"
66
- msgstr[0] "%s second ago"
67
- msgstr[1] "%s seconds ago"
68
-
69
- #: plugin/Date.php:45
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
- #: plugin/Date.php:50
100
- msgid "%s year ago"
101
- msgid_plural "%s years ago"
102
- msgstr[0] "%s year ago"
103
- msgstr[1] "%s years ago"
104
 
105
- #: plugin/Settings.php:161, plugin/Settings.php:258, plugin/Settings.php:516, plugin/Settings.php:620
106
- msgid "Save Settings"
107
- msgstr "Save Settings"
108
 
109
- #: plugin/Settings.php:167, plugin/Settings.php:602
110
- msgid "Require approval"
111
- msgstr "Require approval"
112
 
113
- #: plugin/Settings.php:169
114
- msgid "Set the status of new review submissions to pending."
115
- msgstr "Set the status of new review submissions to pending."
116
 
117
- #: plugin/Settings.php:175
118
- msgid "Require login"
119
- msgstr "Require login"
120
 
121
- #: plugin/Settings.php:176
122
  msgid "Only allow review submissions from registered users."
123
  msgstr "Only allow review submissions from registered users."
124
 
125
- #: plugin/Settings.php:182
126
- msgid "Show registration link"
127
- msgstr "Show registration link"
128
 
129
- #: plugin/Settings.php:186
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
- #: plugin/Settings.php:187
138
  msgid "Anyone can register"
139
  msgstr "Anyone can register"
140
 
141
- #: plugin/Settings.php:194
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  msgid "Notifications"
143
  msgstr "Notifications"
144
 
145
- #: plugin/Settings.php:197
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
- #: plugin/Settings.php:199
 
 
 
 
154
  msgid "Send to one or more email addresses"
155
  msgstr "Send to one or more email addresses"
156
 
157
- #: plugin/Settings.php:200
158
- msgid "Send to %s"
159
- msgstr "Send to %s"
160
 
161
- #: plugin/Settings.php:207
162
- msgid "Send notification emails to"
163
- msgstr "Send notification emails to"
164
 
165
- #: plugin/Settings.php:211
166
  msgid "Separate multiple emails with a comma"
167
  msgstr "Separate multiple emails with a comma"
168
 
169
- #: plugin/Settings.php:217
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
- #: plugin/Settings.php:222
182
  msgid "Incoming WebHook"
183
  msgstr "Incoming WebHook"
184
 
185
- #: plugin/Settings.php:229
186
- msgid "Notification template"
187
- msgstr "Notification template"
188
 
189
- #: plugin/Settings.php:264
 
 
 
 
 
 
 
 
 
 
 
 
190
  msgid "Date Format"
191
  msgstr "Date Format"
192
 
193
- #: plugin/Settings.php:266
194
  msgid "Use the default date format"
195
  msgstr "Use the default date format"
196
 
197
- #: plugin/Settings.php:267
198
  msgid "Use a relative date format"
199
  msgstr "Use a relative date format"
200
 
201
- #: plugin/Settings.php:268
202
  msgid "Use a custom date format"
203
  msgstr "Use a custom date format"
204
 
205
- #: plugin/Settings.php:270
206
- msgid "The default date format is the one set in your %s."
207
- msgstr "The default date format is the one set in your %s."
208
-
209
- #: plugin/Settings.php:271
210
- msgid "WordPress settings"
211
- msgstr "WordPress settings"
 
 
212
 
213
- #: plugin/Settings.php:278
214
  msgid "Custom Date Format"
215
  msgstr "Custom Date Format"
216
 
217
- #: plugin/Settings.php:280
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
- #: plugin/Settings.php:298
234
- msgid "Enable Avatars"
235
- msgstr "Enable Avatars"
236
 
237
- #: plugin/Settings.php:299
238
  msgid ""
239
  "Display reviewer avatars. These are generated from the email address of the "
240
- "reviewer using %s."
241
  msgstr ""
242
  "Display reviewer avatars. These are generated from the email address of the "
243
- "reviewer using %s."
 
 
 
 
244
 
245
- #: plugin/Settings.php:300
246
- msgid "Gravatar"
247
- msgstr "Gravatar"
248
 
249
- #: plugin/Settings.php:307
250
- msgid "Enable Excerpts"
251
- msgstr "Enable Excerpts"
252
 
253
- #: plugin/Settings.php:308
 
 
 
 
 
 
 
 
254
  msgid "Display an excerpt instead of the full review."
255
  msgstr "Display an excerpt instead of the full review."
256
 
257
- #: plugin/Settings.php:314
258
- msgid "Excerpt Length"
259
- msgstr "Excerpt Length"
260
 
261
- #: plugin/Settings.php:316
262
  msgid "Set the excerpt word length."
263
  msgstr "Set the excerpt word length."
264
 
265
- #: plugin/Settings.php:324
266
- msgid "Rich Snippets (schema.org)"
267
- msgstr "Rich Snippets (schema.org)"
268
 
269
- #: plugin/Settings.php:325
270
  msgid ""
271
- "The JSON-LD schema appears in Google's search results and shows the star "
272
- "rating and other information about your reviews. If the schema has been "
273
- "enabled in your shortcodes, you can use Google's <a "
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
- "The JSON-LD schema appears in Google's search results and shows the star "
282
- "rating and other information about your reviews. If the schema has been "
283
- "enabled in your shortcodes, you can use Google's <a "
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/Settings.php:331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  msgid "Default Schema Type"
293
  msgstr "Default Schema Type"
294
 
295
- #: plugin/Settings.php:334
296
  msgid "Local Business"
297
  msgstr "Local Business"
298
 
299
- #: plugin/Settings.php:335
300
  msgid "Product"
301
  msgstr "Product"
302
 
303
- #: plugin/Settings.php:336
304
  msgid "Custom"
305
  msgstr "Custom"
306
 
307
- #: plugin/Settings.php:338
308
- msgid "Custom Field name: <code>schema_type</code>"
309
- msgstr "Custom Field name: <code>schema_type</code>"
310
 
311
- #: plugin/Settings.php:344
312
  msgid "Custom Schema Type"
313
  msgstr "Custom Schema Type"
314
 
315
- #: plugin/Settings.php:348
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
- #: plugin/Settings.php:357
324
  msgid "Use the assigned or current page title"
325
  msgstr "Use the assigned or current page title"
326
 
327
- #: plugin/Settings.php:358
328
- msgid "Enter a custom name"
329
- msgstr "Enter a custom name"
330
-
331
- #: plugin/Settings.php:359
332
- msgid "Do not set a default name"
333
- msgstr "Do not set a default name"
334
 
335
- #: plugin/Settings.php:361
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
- #: plugin/Settings.php:376
344
  msgid "Default Description"
345
  msgstr "Default Description"
346
 
347
- #: plugin/Settings.php:379
348
  msgid "Use the assigned or current page excerpt"
349
  msgstr "Use the assigned or current page excerpt"
350
 
351
- #: plugin/Settings.php:380
352
  msgid "Enter a custom description"
353
  msgstr "Enter a custom description"
354
 
355
- #: plugin/Settings.php:381
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
- #: plugin/Settings.php:398
368
  msgid "Default URL"
369
  msgstr "Default URL"
370
 
371
- #: plugin/Settings.php:401
372
  msgid "Use the assigned or current page URL"
373
  msgstr "Use the assigned or current page URL"
374
 
375
- #: plugin/Settings.php:402
376
  msgid "Enter a custom URL"
377
  msgstr "Enter a custom URL"
378
 
379
- #: plugin/Settings.php:403
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
- #: plugin/Settings.php:420
392
  msgid "Default Image"
393
  msgstr "Default Image"
394
 
395
- #: plugin/Settings.php:423
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
- #: plugin/Settings.php:424
400
  msgid "Enter a custom image URL"
401
  msgstr "Enter a custom image URL"
402
 
403
- #: plugin/Settings.php:425
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
- #: plugin/Settings.php:442
416
  msgid "Address"
417
  msgstr "Address"
418
 
419
- #: plugin/Settings.php:447
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
- #: plugin/Settings.php:458
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
- #: plugin/Settings.php:469
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
- #: plugin/Settings.php:480
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
- #: plugin/Settings.php:491
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
- #: plugin/Settings.php:502
460
- msgid "Custom Field name: <code>schema_pricecurrency</code>"
461
- msgstr "Custom Field name: <code>schema_pricecurrency</code>"
462
 
463
- #: plugin/Settings.php:522
464
  msgid "Required Fields"
465
  msgstr "Required Fields"
466
 
467
- #: plugin/Settings.php:525, plugin/Commands/RegisterPostType.php:22, plugin/Widgets/SiteReviews.php:37, plugin/Widgets/SiteReviewsForm.php:41, plugin/Shortcodes/Buttons/SiteReviews.php:55, plugin/Shortcodes/Buttons/SiteReviews.php:149, plugin/Shortcodes/Buttons/SiteReviewsForm.php:43, plugin/Shortcodes/Buttons/SiteReviewsForm.php:90, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:53
 
 
 
 
468
  msgid "Title"
469
  msgstr "Title"
470
 
471
- #: plugin/Settings.php:526, plugin/Controllers/MainController.php:245
472
  msgid "Review"
473
  msgstr "Review"
474
 
475
- #: plugin/Settings.php:527, plugin/Controllers/MainController.php:854, plugin/Shortcodes/Buttons/SiteReviewsForm.php:80
476
  msgid "Name"
477
  msgstr "Name"
478
 
479
- #: plugin/Settings.php:528, plugin/Controllers/MainController.php:855, plugin/Shortcodes/Buttons/SiteReviewsForm.php:75
480
  msgid "Email"
481
  msgstr "Email"
482
 
483
- #: plugin/Settings.php:535
484
- msgid "Enable Akismet Integration"
485
- msgstr "Enable Akismet Integration"
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
- #: plugin/Settings.php:551
514
  msgid ""
515
  "Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
516
- "will need to %s for an API key pair for your site. If you are already using "
517
- "a reCAPTCHA plugin listed here, please select it; otherwise choose \"Use "
518
- "reCAPTCHA\"."
519
  msgstr ""
520
  "Invisible reCAPTCHA is a free anti-spam service from Google. To use it, you "
521
- "will need to %s for an API key pair for your site. If you are already using "
522
- "a reCAPTCHA plugin listed here, please select it; otherwise choose \"Use "
523
- "reCAPTCHA\"."
524
 
525
- #: plugin/Settings.php:552
526
- msgid "sign up"
527
- msgstr "sign up"
528
 
529
- #: plugin/Settings.php:559
530
  msgid "Site Key"
531
  msgstr "Site Key"
532
 
533
- #: plugin/Settings.php:568
534
  msgid "Site Secret"
535
  msgstr "Site Secret"
536
 
537
- #: plugin/Settings.php:577
 
 
 
 
 
 
 
 
538
  msgid "Badge Position"
539
  msgstr "Badge Position"
540
 
541
- #: plugin/Settings.php:591
542
- msgid "Review Blacklist"
543
- msgstr "Review Blacklist"
 
 
 
 
 
 
 
 
 
 
 
 
544
 
545
- #: plugin/Settings.php:592
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
- #: plugin/Settings.php:600
 
 
 
 
 
 
 
 
556
  msgid "Blacklist Action"
557
  msgstr "Blacklist Action"
558
 
559
- #: plugin/Settings.php:603
 
 
 
 
560
  msgid "Reject submission"
561
  msgstr "Reject submission"
562
 
563
- #: plugin/Settings.php:605
564
- msgid "Choose the action that should be taken when a review is blacklisted."
565
- msgstr "Choose the action that should be taken when a review is blacklisted."
566
 
567
- #: plugin/Strings.php:24
568
- msgid "Add New Review"
569
- msgstr "Add New Review"
570
 
571
- #: plugin/Strings.php:25, plugin/Widgets/SiteReviews.php:71
572
- msgid "All Reviews"
573
- msgstr "All Reviews"
574
 
575
- #: plugin/Strings.php:26
576
- msgid "Review Archives"
577
- msgstr "Review Archives"
578
 
579
- #: plugin/Strings.php:27
580
- msgid "Edit Review"
581
- msgstr "Edit Review"
582
 
583
- #: plugin/Strings.php:28
584
- msgid "Insert into review"
585
- msgstr "Insert into review"
586
 
587
- #: plugin/Strings.php:29
588
- msgid "New Review"
589
- msgstr "New Review"
590
 
591
- #: plugin/Strings.php:30
592
- msgid "No Reviews found"
593
- msgstr "No Reviews found"
594
 
595
- #: plugin/Strings.php:31
596
- msgid "No Reviews found in Trash"
597
- msgstr "No Reviews found in Trash"
598
 
599
- #: plugin/Strings.php:32
600
- msgid "Search Reviews"
601
- msgstr "Search Reviews"
602
 
603
- #: plugin/Strings.php:33
604
- msgid "Uploaded to this review"
605
- msgstr "Uploaded to this review"
606
 
607
- #: plugin/Strings.php:34, plugin/Handlers/SubmitReview.php:93
608
- msgid "View Review"
609
- msgstr "View Review"
610
 
611
- #: plugin/Strings.php:47
612
- msgid "Review has been approved and published."
613
- msgstr "Review has been approved and published."
614
 
615
- #: plugin/Strings.php:48
616
- msgid "Review draft updated."
617
- msgstr "Review draft updated."
618
 
619
- #: plugin/Strings.php:49
620
- msgid "Preview review"
621
- msgstr "Preview review"
622
 
623
- #: plugin/Strings.php:50
624
- msgid "Review approved and published."
625
- msgstr "Review approved and published."
626
 
627
- #: plugin/Strings.php:51
628
- msgid "Review restored to revision from %s."
629
- msgstr "Review restored to revision from %s."
630
 
631
- #: plugin/Strings.php:52
632
- msgid "Review has been reverted to its original submission state."
633
- msgstr "Review has been reverted to its original submission state."
634
 
635
- #: plugin/Strings.php:53
636
- msgid "Review saved."
637
- msgstr "Review saved."
638
 
639
- #: plugin/Strings.php:54
640
- msgid "Review scheduled for: %s."
641
- msgstr "Review scheduled for: %s."
 
 
642
 
643
- #: plugin/Strings.php:55
644
- msgid "Review submitted."
645
- msgstr "Review submitted."
646
 
647
- #: plugin/Strings.php:56
648
- msgid "Review has been unapproved and is now pending."
649
- msgstr "Review has been unapproved and is now pending."
650
 
651
- #: plugin/Strings.php:57
652
- msgid "Review updated."
653
- msgstr "Review updated."
654
 
655
- #: plugin/Strings.php:58
656
- msgid "View review"
657
- msgstr "View review"
658
 
659
- #: plugin/Strings.php:73
660
- msgid "Local"
661
- msgstr "Local"
662
 
663
- #: plugin/Strings.php:86
664
- msgid "This field must be accepted."
665
- msgstr "This field must be accepted."
666
 
667
- #: plugin/Strings.php:89
668
- msgid "This must be a valid email address."
669
- msgstr "This must be a valid email address."
670
 
671
- #: plugin/Strings.php:94
672
- msgid "The format is invalid."
673
- msgstr "The format is invalid."
674
 
675
- #: plugin/Strings.php:95
676
- msgid "This field is required."
677
- msgstr "This field is required."
678
 
679
- #: plugin/Commands/RegisterPostType.php:23, plugin/Controllers/MainController.php:852, plugin/Shortcodes/Buttons/SiteReviews.php:129
680
- msgid "Date"
681
- msgstr "Date"
 
 
 
 
 
 
 
 
 
 
 
 
682
 
683
- #: plugin/Controllers/AjaxController.php:49
684
- msgid "Log is empty"
685
- msgstr "Log is empty"
686
 
687
- #: plugin/Controllers/AjaxController.php:75
 
 
 
 
 
 
 
 
688
  msgid "Okay"
689
  msgstr "Okay"
690
 
691
- #: plugin/Controllers/AjaxController.php:108, plugin/Controllers/AjaxController.php:127
692
  msgid "Nothing found."
693
  msgstr "Nothing found."
694
 
695
- #: plugin/Controllers/MainController.php:99
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/MainController.php:209
714
  msgid "Details"
715
  msgstr "Details"
716
 
717
- #: plugin/Controllers/MainController.php:210, views/edit/metabox-response.php:3
718
  msgid "Respond Publicly"
719
  msgstr "Respond Publicly"
720
 
721
- #: plugin/Controllers/MainController.php:224
722
- msgid "Pin Your Reviews"
723
- msgstr "Pin Your Reviews"
724
 
725
- #: plugin/Controllers/MainController.php:225
726
- msgid ""
727
- "You can pin exceptional reviews so that they are always shown first in your "
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/MainController.php:246, plugin/Controllers/MainController.php:631, views/menu/status.php:16
734
- msgid "Reviews"
735
- msgstr "Reviews"
736
 
737
- #: plugin/Controllers/MainController.php:247
738
- msgid "Site Reviews"
739
- msgstr "Site Reviews"
740
 
741
- #: plugin/Controllers/MainController.php:257, plugin/Shortcodes/Buttons/SiteReviews.php:119
742
- msgid "Author"
743
- msgstr "Author"
744
 
745
- #: plugin/Controllers/MainController.php:258, plugin/Controllers/MainController.php:851
 
 
 
 
 
 
 
 
 
 
 
 
746
  msgid "Type"
747
  msgstr "Type"
748
 
749
- #: 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
750
- msgid "Rating"
751
- msgstr "Rating"
752
 
753
- #: plugin/Controllers/MainController.php:260, views/edit/pinned.php:17
754
- msgid "Pinned"
755
- msgstr "Pinned"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
756
 
757
- #: plugin/Controllers/MainController.php:283
758
- msgid "Approve this review"
759
- msgstr "Approve this review"
 
 
 
 
760
 
761
- #: plugin/Controllers/MainController.php:285
762
  msgid "Approve"
763
  msgstr "Approve"
764
 
765
- #: plugin/Controllers/MainController.php:288
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/MainController.php:336, plugin/Controllers/MainController.php:428
774
- msgid "Recent Site Reviews"
775
- msgstr "Recent Site Reviews"
776
-
777
- #: plugin/Controllers/MainController.php:337
778
- msgid "Site Reviews Summary"
779
- msgstr "Site Reviews Summary"
780
 
781
- #: plugin/Controllers/MainController.php:338, plugin/Controllers/MainController.php:433
782
- msgid "Submit a Site Review"
783
- msgstr "Submit a Site Review"
784
 
785
- #: plugin/Controllers/MainController.php:383
786
- msgid "Get Help"
787
- msgstr "Get Help"
788
 
789
- #: plugin/Controllers/MainController.php:384, plugin/Controllers/MainController.php:450
790
- msgid "Add-Ons"
791
- msgstr "Add-Ons"
792
 
793
- #: plugin/Controllers/MainController.php:429
794
- msgid "Your site’s most recent Local Reviews."
795
- msgstr "Your site’s most recent Local Reviews."
796
 
797
- #: plugin/Controllers/MainController.php:434
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:488
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  msgid "Support"
803
  msgstr "Support"
804
 
805
- #: plugin/Controllers/MainController.php:489
 
 
 
 
806
  msgid "Shortcodes"
807
  msgstr "Shortcodes"
808
 
809
- #: plugin/Controllers/MainController.php:490
810
  msgid "Hooks"
811
  msgstr "Hooks"
812
 
813
- #: plugin/Controllers/MainController.php:491
814
- msgid "Helper Functions"
815
- msgstr "Helper Functions"
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/MainController.php:607
826
- msgid "This review is read-only."
827
- msgstr "This review is read-only."
828
 
829
- #: plugin/Controllers/MainController.php:630
830
  msgid "General"
831
  msgstr "General"
832
 
833
- #: plugin/Controllers/MainController.php:632
834
- msgid "Submission Form"
835
- msgstr "Submission Form"
836
 
837
- #: plugin/Controllers/MainController.php:633
838
- msgid "Translations"
839
- msgstr "Translations"
840
 
841
- #: plugin/Controllers/MainController.php:641
842
  msgid "Licenses"
843
  msgstr "Licenses"
844
 
845
- #: plugin/Controllers/MainController.php:705
846
- msgid "Logging disabled."
847
- msgid_plural "Logging enabled."
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/MainController.php:845
872
- msgid "Unregistered user"
873
- msgstr "Unregistered user"
874
 
875
- #: plugin/Controllers/MainController.php:847
876
- msgid "RE:"
877
- msgstr "RE:"
878
 
879
- #: plugin/Controllers/MainController.php:853
880
- msgid "Reviewer"
881
- msgstr "Reviewer"
882
 
883
- #: plugin/Controllers/MainController.php:856
884
- msgid "IP Address"
885
- msgstr "IP Address"
886
 
887
- #: plugin/Controllers/MainController.php:857, plugin/Shortcodes/Buttons/SiteReviews.php:124
888
- msgid "Avatar"
889
- msgstr "Avatar"
 
 
 
 
890
 
891
- #: plugin/Controllers/ReviewController.php:135, plugin/Controllers/ReviewController.php:159
892
- msgid "Save as Unapproved"
893
- msgstr "Save as Unapproved"
894
 
895
- #: plugin/Controllers/ReviewController.php:136, plugin/Controllers/ReviewController.php:161
896
- msgid "Approved"
897
- msgstr "Approved"
898
 
899
- #: plugin/Controllers/ReviewController.php:160
900
- msgid "Privately Approved"
901
- msgstr "Privately Approved"
902
 
903
- #: plugin/Controllers/ReviewController.php:162, plugin/Controllers/ReviewController.php:163
904
- msgid "Unapproved"
905
- msgstr "Unapproved"
906
 
907
- #: plugin/Controllers/ReviewController.php:233
908
- msgid "%s review updated."
909
- msgid_plural "%s reviews updated."
910
- msgstr[0] "%s review updated."
911
- msgstr[1] "%s reviews updated."
912
 
913
- #: plugin/Controllers/ReviewController.php:234
914
- msgid "%s review not updated, somebody is editing it."
915
- msgid_plural "%s reviews not updated, somebody is editing them."
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/Controllers/ReviewController.php:235
920
- msgid "%s review permanently deleted."
921
- msgid_plural "%s reviews permanently deleted."
922
- msgstr[0] "%s review permanently deleted."
923
- msgstr[1] "%s reviews permanently deleted."
924
 
925
- #: plugin/Controllers/ReviewController.php:236
926
- msgid "%s review moved to the Trash."
927
- msgid_plural "%s reviews moved to the Trash."
928
- msgstr[0] "%s review moved to the Trash."
929
- msgstr[1] "%s reviews moved to the Trash."
930
 
931
- #: plugin/Controllers/ReviewController.php:237
932
- msgid "%s review restored from the Trash."
933
- msgid_plural "%s reviews restored from the Trash."
934
- msgstr[0] "%s review restored from the Trash."
935
- msgstr[1] "%s reviews restored from the Trash."
936
 
937
- #: plugin/Controllers/ReviewController.php:291
938
  msgid "Please fix the submission errors."
939
  msgstr "Please fix the submission errors."
940
 
941
- #: plugin/Controllers/ReviewController.php:300, plugin/Controllers/ReviewController.php:307
942
- msgid "The review submission failed. Please notify the site administrator."
943
- msgstr "The review submission failed. Please notify the site administrator."
944
 
945
- #: plugin/Controllers/ReviewController.php:319
946
- msgid "The reCAPTCHA verification failed. Please notify the site administrator."
947
- msgstr "The reCAPTCHA verification failed. Please notify the site administrator."
948
 
949
- #: plugin/Controllers/ReviewController.php:334
950
- msgid "Your review cannot be submitted at this time."
951
- msgstr "Your review cannot be submitted at this time."
952
 
953
- #: plugin/Controllers/ReviewController.php:343
954
- msgid "Your review cannot be submitted at this time. Please try again later."
955
- msgstr "Your review cannot be submitted at this time. Please try again later."
956
 
957
- #: plugin/Controllers/ReviewController.php:731, plugin/Html/Partials/Reviews.php:281
958
- msgid "No Title"
959
- msgstr "No Title"
 
 
 
 
 
 
 
 
960
 
961
- #: plugin/Handlers/ChangeStatus.php:31, views/edit/pinned.php:21
962
  msgid "Edit"
963
  msgstr "Edit"
964
 
965
- #: plugin/Handlers/RegisterPostType.php:310, plugin/Widgets/SiteReviews.php:56, plugin/Widgets/SiteReviews.php:57, plugin/Widgets/SiteReviews.php:58, plugin/Widgets/SiteReviews.php:59, plugin/Widgets/SiteReviews.php:60, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:65, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:66, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:67, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:68, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:69
966
- msgid "%s star"
967
- msgid_plural "%s stars"
968
- msgstr[0] "%s star"
969
- msgstr[1] "%s stars"
 
 
970
 
971
- #: plugin/Handlers/RegisterPostType.php:314
972
- msgid "All ratings"
973
- msgstr "All ratings"
974
 
975
- #: plugin/Handlers/RegisterPostType.php:316
976
- msgid "Filter by rating"
977
- msgstr "Filter by rating"
978
 
979
- #: plugin/Handlers/RegisterPostType.php:336
980
- msgid "All types"
981
- msgstr "All types"
982
 
983
- #: plugin/Handlers/RegisterPostType.php:342
984
- msgid "Filter by type"
985
- msgstr "Filter by type"
986
 
987
- #: plugin/Handlers/RegisterTaxonomy.php:82
988
- msgid "Filter by category"
989
- msgstr "Filter by category"
990
 
991
- #: plugin/Handlers/SubmitReview.php:39
992
- msgid "Your review has been submitted!"
993
- msgstr "Your review has been submitted!"
 
 
 
 
 
 
 
 
994
 
995
- #: plugin/Handlers/SubmitReview.php:148
996
- msgid "Email notification was not sent: missing email, subject, or message."
997
- msgstr "Email notification was not sent: missing email, subject, or message."
 
 
998
 
999
- #: plugin/Handlers/SubmitReview.php:151
1000
- msgid "Email notification was not sent: wp_mail() failed."
1001
- msgstr "Email notification was not sent: wp_mail() failed."
 
 
1002
 
1003
- #: plugin/Handlers/TogglePinned.php:43
1004
- msgid "The review is pinned."
1005
- msgstr "The review is pinned."
 
 
1006
 
1007
- #: plugin/Handlers/TogglePinned.php:44
1008
- msgid "The review is unpinned."
1009
- msgstr "The review is unpinned."
 
 
1010
 
1011
- #: plugin/Html/Form.php:137
1012
- msgid "Submit"
1013
- msgstr "Submit"
 
 
1014
 
1015
- #: plugin/Html/Form.php:280
1016
- msgid "Save Changes"
1017
- msgstr "Save Changes"
 
 
 
 
1018
 
1019
- #: plugin/Shortcodes/SiteReviewsSummary.php:238, views/submit/index.php:20
1020
  msgid "Excellent"
1021
  msgstr "Excellent"
1022
 
1023
- #: plugin/Shortcodes/SiteReviewsSummary.php:239, views/submit/index.php:21
1024
  msgid "Very good"
1025
  msgstr "Very good"
1026
 
1027
- #: plugin/Shortcodes/SiteReviewsSummary.php:240, views/submit/index.php:22
1028
  msgid "Average"
1029
  msgstr "Average"
1030
 
1031
- #: plugin/Shortcodes/SiteReviewsSummary.php:241, views/submit/index.php:23
1032
  msgid "Poor"
1033
  msgstr "Poor"
1034
 
1035
- #: plugin/Shortcodes/SiteReviewsSummary.php:242, views/submit/index.php:24
1036
  msgid "Terrible"
1037
  msgstr "Terrible"
1038
 
1039
- #: plugin/Traits/SiteReviewsForm.php:104
1040
- msgid "You must be %s to submit a review."
1041
- msgstr "You must be %s to submit a review."
1042
-
1043
- #: plugin/Traits/SiteReviewsForm.php:105
1044
- msgid "logged in"
1045
- msgstr "logged in"
1046
 
1047
- #: plugin/Traits/SiteReviewsForm.php:108
1048
- msgid "You may also %s for an account."
1049
- msgstr "You may also %s for an account."
1050
 
1051
- #: plugin/Traits/SiteReviewsForm.php:109
1052
- msgid "register"
1053
- msgstr "register"
1054
 
1055
- #: plugin/Widgets/SiteReviews.php:44
1056
- msgid "How many reviews would you like to display? "
1057
- msgstr "How many reviews would you like to display? "
1058
 
1059
- #: plugin/Widgets/SiteReviews.php:53
1060
- msgid "What is the minimum rating to display? "
1061
- msgstr "What is the minimum rating to display? "
1062
 
1063
- #: plugin/Widgets/SiteReviews.php:68
1064
- msgid "Which reviews would you like to display? "
1065
- msgstr "Which reviews would you like to display? "
1066
 
1067
- #: plugin/Widgets/SiteReviews.php:79
1068
- msgid "Limit reviews to this category"
1069
- msgstr "Limit reviews to this category"
 
 
 
 
1070
 
1071
- #: plugin/Widgets/SiteReviews.php:82
1072
- msgid "All Categories"
1073
- msgstr "All Categories"
1074
 
1075
- #: plugin/Widgets/SiteReviews.php:89
1076
- msgid "Limit reviews to those assigned to this page/post ID"
1077
- msgstr "Limit reviews to those assigned to this page/post ID"
1078
 
1079
- #: plugin/Widgets/SiteReviews.php:92
1080
- msgid "Separate multiple ID's with a comma"
1081
- msgstr "Separate multiple ID's with a comma"
1082
 
1083
- #: plugin/Widgets/SiteReviews.php:93
1084
- msgid "You may also enter %s to limit assigned reviews to the current page."
1085
- msgstr "You may also enter %s to limit assigned reviews to the current page."
1086
 
1087
- #: plugin/Widgets/SiteReviews.php:99, plugin/Widgets/SiteReviewsForm.php:74
1088
- msgid "Enter any custom CSS classes here"
1089
- msgstr "Enter any custom CSS classes here"
1090
 
1091
- #: plugin/Widgets/SiteReviews.php:108, plugin/Shortcodes/Buttons/SiteReviews.php:120
1092
- msgid "Hide the review author?"
1093
- msgstr "Hide the review author?"
1094
 
1095
- #: plugin/Widgets/SiteReviews.php:109, plugin/Shortcodes/Buttons/SiteReviews.php:125
1096
- msgid "Hide the reviewer avatar if shown?"
1097
- msgstr "Hide the reviewer avatar if shown?"
1098
 
1099
- #: plugin/Widgets/SiteReviews.php:110, plugin/Shortcodes/Buttons/SiteReviews.php:130
1100
- msgid "Hide the review date?"
1101
- msgstr "Hide the review date?"
1102
 
1103
- #: plugin/Widgets/SiteReviews.php:111, plugin/Shortcodes/Buttons/SiteReviews.php:135
1104
- msgid "Hide the review excerpt?"
1105
- msgstr "Hide the review excerpt?"
1106
 
1107
- #: plugin/Widgets/SiteReviews.php:112, plugin/Shortcodes/Buttons/SiteReviews.php:140
1108
- msgid "Hide the review rating?"
1109
- msgstr "Hide the review rating?"
1110
 
1111
- #: plugin/Widgets/SiteReviews.php:113, plugin/Shortcodes/Buttons/SiteReviews.php:145
1112
- msgid "Hide the review response?"
1113
- msgstr "Hide the review response?"
1114
 
1115
- #: plugin/Widgets/SiteReviews.php:114, plugin/Shortcodes/Buttons/SiteReviews.php:150
1116
- msgid "Hide the review title?"
1117
- msgstr "Hide the review title?"
 
 
1118
 
1119
- #: plugin/Widgets/SiteReviewsForm.php:35
1120
- msgid "Your email address will not be published. Required fields are marked %s*%s"
1121
- msgstr "Your email address will not be published. Required fields are marked %s*%s"
1122
 
1123
- #: plugin/Widgets/SiteReviewsForm.php:49, plugin/Shortcodes/Buttons/SiteReviewsForm.php:48
1124
- msgid "Description"
1125
- msgstr "Description"
1126
 
1127
- #: plugin/Widgets/SiteReviewsForm.php:56
1128
- msgid "Automatically assign a category"
1129
- msgstr "Automatically assign a category"
1130
 
1131
- #: plugin/Widgets/SiteReviewsForm.php:58
1132
- msgid "Do not assign a category"
1133
- msgstr "Do not assign a category"
1134
 
1135
- #: plugin/Widgets/SiteReviewsForm.php:65
1136
- msgid "Assign reviews to a custom page/post ID"
1137
- msgstr "Assign reviews to a custom page/post ID"
1138
 
1139
- #: plugin/Widgets/SiteReviewsForm.php:68
1140
- msgid "You may also enter %s to assign to the current post."
1141
- msgstr "You may also enter %s to assign to the current post."
1142
 
1143
- #: plugin/Widgets/SiteReviewsForm.php:83
1144
- msgid "Hide the email field"
1145
- msgstr "Hide the email field"
 
 
 
 
1146
 
1147
- #: plugin/Widgets/SiteReviewsForm.php:84
1148
- msgid "Hide the name field"
1149
- msgstr "Hide the name field"
1150
 
1151
- #: plugin/Widgets/SiteReviewsForm.php:85
1152
- msgid "Hide the terms field"
1153
- msgstr "Hide the terms field"
1154
 
1155
- #: plugin/Widgets/SiteReviewsForm.php:86
1156
- msgid "Hide the title field"
1157
- msgstr "Hide the title field"
 
 
 
 
 
 
1158
 
1159
- #: views/edit/assigned-post.php:5
1160
- msgid "Remove assignment"
1161
- msgstr "Remove assignment"
1162
 
1163
- #: views/edit/metabox-assigned-to.php:6
1164
- msgid "Type to search..."
1165
- msgstr "Type to search..."
1166
 
1167
- #: views/edit/metabox-assigned-to.php:8
1168
- msgid ""
1169
- "Search here for a page or post that you would like to assign this review "
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
- #: views/edit/metabox-categories.php:7
1176
- msgid "Most Used"
1177
- msgstr "Most Used"
1178
 
1179
- #: views/edit/pinned.php:13, plugin/Html/Fields/Yesno.php:23
1180
- msgid "No"
1181
- msgstr "No"
1182
 
1183
- #: views/edit/pinned.php:14, plugin/Html/Fields/Yesno.php:24
1184
- msgid "Yes"
1185
- msgstr "Yes"
1186
 
1187
- #: views/edit/pinned.php:22
1188
- msgid "Edit pinned status"
1189
- msgstr "Edit pinned status"
1190
 
1191
- #: views/edit/pinned.php:30
1192
- msgid "Pin"
1193
- msgstr "Pin"
1194
 
1195
- #: views/edit/pinned.php:31
1196
- msgid "Unpin"
1197
- msgstr "Unpin"
1198
 
1199
- #: views/edit/pinned.php:34
1200
- msgid "OK"
1201
- msgstr "OK"
1202
 
1203
- #: views/edit/pinned.php:35
1204
- msgid "Cancel"
1205
- msgstr "Cancel"
1206
 
1207
- #: views/edit/review.php:4
1208
- msgid "no title"
1209
- msgstr "no title"
1210
 
1211
- #: views/menu/status.php:7
1212
- msgid "configured timezone"
1213
- msgstr "configured timezone"
1214
 
1215
- #: views/menu/status.php:15
1216
- msgid "Site"
1217
- msgstr "Site"
1218
 
1219
- #: views/menu/status.php:17, views/menu/status.php:34
1220
- msgid "Last fetch"
1221
- msgstr "Last fetch"
1222
 
1223
- #: views/menu/status.php:18, views/menu/status.php:37
1224
- msgid "Next scheduled fetch"
1225
- msgstr "Next scheduled fetch"
1226
 
1227
- #: views/menu/status.php:35
1228
- msgid "No fetch has been completed"
1229
- msgstr "No fetch has been completed"
1230
 
1231
- #: views/menu/status.php:38
1232
- msgid "Nothing currently scheduled"
1233
- msgstr "Nothing currently scheduled"
1234
 
1235
- #: views/menu/status.php:58
1236
- msgid "Fetch reviews from"
1237
- msgstr "Fetch reviews from"
1238
 
1239
- #: views/menu/status.php:65
1240
- msgid "Fetch status"
1241
- msgstr "Fetch status"
1242
 
1243
- #: views/menu/status.php:66
1244
- msgid "Fetching reviews..."
1245
- msgstr "Fetching reviews..."
1246
 
1247
- #: views/menu/status.php:78
1248
- msgid "Fetch Reviews"
1249
- msgstr "Fetch Reviews"
1250
 
1251
- #: views/strings/plural.php:6, views/strings/single.php:5
1252
- msgid "Delete translation string"
1253
- msgstr "Delete translation string"
1254
 
1255
- #: views/strings/plural.php:6, views/strings/single.php:5
1256
- msgid "Delete"
1257
- msgstr "Delete"
1258
 
1259
- #: views/strings/plural.php:9, views/strings/single.php:8
1260
- msgid "Show custom translation"
1261
- msgstr "Show custom translation"
1262
 
1263
- #: views/strings/plural.php:16
1264
- msgid "singular"
1265
- msgstr "singular"
1266
 
1267
- #: views/strings/plural.php:17
1268
- msgid "plural"
1269
- msgstr "plural"
1270
 
1271
- #: views/strings/translations.php:4
1272
- msgid "Strings"
1273
- msgstr "Strings"
1274
 
1275
- #: views/strings/translations.php:5
1276
- msgid "Custom Strings"
1277
- msgstr "Custom Strings"
1278
 
1279
- #: views/submit/index.php:13
1280
- msgid "Your overall rating"
1281
- msgstr "Your overall rating"
1282
 
1283
- #: views/submit/index.php:19
1284
- msgid "Select a Rating"
1285
- msgstr "Select a Rating"
 
 
 
 
1286
 
1287
- #: views/submit/index.php:32
1288
- msgid "Title of your review"
1289
- msgstr "Title of your review"
1290
 
1291
- #: views/submit/index.php:33
1292
- msgid "Summarize your review or highlight an interesting detail"
1293
- msgstr "Summarize your review or highlight an interesting detail"
1294
 
1295
- #: views/submit/index.php:45
1296
- msgid "Your review"
1297
- msgstr "Your review"
1298
 
1299
- #: views/submit/index.php:46
1300
- msgid "Tell people your review"
1301
- msgstr "Tell people your review"
1302
 
1303
- #: views/submit/index.php:59
1304
- msgid "Your name"
1305
- msgstr "Your name"
1306
 
1307
- #: views/submit/index.php:60
1308
- msgid "Tell us your name"
1309
- msgstr "Tell us your name"
1310
 
1311
- #: views/submit/index.php:72
1312
- msgid "Your email"
1313
- msgstr "Your email"
1314
 
1315
- #: views/submit/index.php:73
1316
- msgid "Tell us your email"
1317
- msgstr "Tell us your email"
1318
 
1319
- #: views/submit/index.php:85
1320
- msgid "This review is based on my own experience and is my genuine opinion."
1321
- msgstr "This review is based on my own experience and is my genuine opinion."
1322
 
1323
- #: views/submit/index.php:137
1324
- msgid "Submit your review"
1325
- msgstr "Submit your review"
1326
 
1327
- #: plugin/Html/Fields/Colorpicker.php:40
1328
- msgid "Hex Value"
1329
- msgstr "Hex Value"
1330
 
1331
- #: plugin/Html/Fields/Progress.php:37
1332
- msgid "Please wait..."
1333
- msgstr "Please wait..."
1334
 
1335
- #: plugin/Html/Fields/Progress.php:38
1336
- msgid "Inactive"
1337
- msgstr "Inactive"
1338
 
1339
- #: plugin/Html/Partials/Addon.php:40
1340
- msgid "More Info"
1341
- msgstr "More Info"
1342
 
1343
- #: plugin/Html/Partials/Reviews.php:35
1344
- msgid "No reviews were found."
1345
- msgstr "No reviews were found."
1346
 
1347
- #: plugin/Html/Partials/Reviews.php:82
1348
- msgid "Review of %s"
1349
- msgstr "Review of %s"
1350
 
1351
- #: plugin/Html/Partials/Reviews.php:164
1352
- msgid "Page"
1353
- msgstr "Page"
1354
 
1355
- #: plugin/Html/Partials/Reviews.php:168
1356
- msgid "Next &rarr;"
1357
- msgstr "Next &rarr;"
1358
 
1359
- #: plugin/Html/Partials/Reviews.php:169
1360
- msgid "&larr; Previous"
1361
- msgstr "&larr; Previous"
1362
 
1363
- #: plugin/Html/Partials/Reviews.php:195
1364
- msgid "Previous"
1365
- msgstr "Previous"
1366
 
1367
- #: plugin/Html/Partials/Reviews.php:201
1368
- msgid "Next"
1369
- msgstr "Next"
1370
 
1371
- #: plugin/Html/Partials/Reviews.php:240
1372
- msgid "Response from %s"
1373
- msgstr "Response from %s"
1374
 
1375
- #: plugin/Html/Partials/Reviews.php:309
1376
- msgid "Show more"
1377
- msgstr "Show more"
1378
 
1379
- #: plugin/Html/Partials/Reviews.php:310
1380
- msgid "Show less"
1381
- msgstr "Show less"
1382
 
1383
- #: plugin/Html/Partials/Reviews.php:340
1384
- msgid "Site Reviews navigation"
1385
- msgstr "Site Reviews navigation"
1386
 
1387
- #: plugin/Shortcodes/Buttons/Generator.php:55
1388
- msgid "Close"
1389
- msgstr "Close"
1390
 
1391
- #: plugin/Shortcodes/Buttons/Generator.php:56
1392
- msgid "Insert Shortcode"
1393
- msgstr "Insert Shortcode"
1394
 
1395
- #: plugin/Shortcodes/Buttons/Generator.php:61
1396
- msgid "Shortcode"
1397
- msgstr "Shortcode"
1398
 
1399
- #: plugin/Shortcodes/Buttons/Generator.php:208
1400
- msgid "- Select -"
1401
- msgstr "- Select -"
1402
 
1403
- #: plugin/Shortcodes/Buttons/Generator.php:327
1404
- msgid "Some of the shortcode options are required."
1405
- msgstr "Some of the shortcode options are required."
1406
 
1407
- #: plugin/Shortcodes/Buttons/SiteReviews.php:31, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:31
1408
- msgid "Display"
1409
- msgstr "Display"
 
 
 
 
 
 
1410
 
1411
- #: plugin/Shortcodes/Buttons/SiteReviews.php:33, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:33
1412
- msgid "Which reviews would you like to display?"
1413
- msgstr "Which reviews would you like to display?"
1414
 
1415
- #: plugin/Shortcodes/Buttons/SiteReviews.php:41, plugin/Shortcodes/Buttons/SiteReviewsForm.php:30, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:40
1416
- msgid "Category"
1417
- msgstr "Category"
1418
 
1419
- #: plugin/Shortcodes/Buttons/SiteReviews.php:43, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:42
1420
- msgid "Limit reviews to this category."
1421
- msgstr "Limit reviews to this category."
1422
 
1423
- #: plugin/Shortcodes/Buttons/SiteReviews.php:50, plugin/Shortcodes/Buttons/SiteReviewsForm.php:39, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:48
1424
- msgid "All settings are optional."
1425
- msgstr "All settings are optional."
 
 
 
 
1426
 
1427
- #: plugin/Shortcodes/Buttons/SiteReviews.php:56, plugin/Shortcodes/Buttons/SiteReviewsForm.php:44, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:54
1428
- msgid "Enter a custom shortcode heading."
1429
- msgstr "Enter a custom shortcode heading."
1430
 
1431
- #: plugin/Shortcodes/Buttons/SiteReviews.php:63
1432
- msgid "Count"
1433
- msgstr "Count"
1434
 
1435
- #: plugin/Shortcodes/Buttons/SiteReviews.php:64
1436
- msgid "How many reviews would you like to display (default: 10)?"
1437
- msgstr "How many reviews would you like to display (default: 10)?"
 
 
 
 
 
 
 
 
 
 
1438
 
1439
- #: plugin/Shortcodes/Buttons/SiteReviews.php:70
1440
- msgid "5 stars"
1441
- msgstr "5 stars"
 
 
 
 
 
 
 
 
1442
 
1443
- #: plugin/Shortcodes/Buttons/SiteReviews.php:71
1444
- msgid "4 stars"
1445
- msgstr "4 stars"
1446
 
1447
- #: plugin/Shortcodes/Buttons/SiteReviews.php:72
1448
- msgid "3 stars"
1449
- msgstr "3 stars"
1450
 
1451
- #: plugin/Shortcodes/Buttons/SiteReviews.php:73
1452
- msgid "2 stars"
1453
- msgstr "2 stars"
1454
 
1455
- #: plugin/Shortcodes/Buttons/SiteReviews.php:74
1456
- msgid "1 star"
1457
- msgstr "1 star"
1458
 
1459
- #: plugin/Shortcodes/Buttons/SiteReviews.php:76
1460
- msgid "What is the minimum rating to display (default: 1 star)?"
1461
- msgstr "What is the minimum rating to display (default: 1 star)?"
1462
 
1463
- #: plugin/Shortcodes/Buttons/SiteReviews.php:80
1464
- msgid "Pagination"
1465
- msgstr "Pagination"
1466
 
1467
- #: plugin/Shortcodes/Buttons/SiteReviews.php:82
1468
- msgid "Enable"
1469
- msgstr "Enable"
1470
 
1471
- #: plugin/Shortcodes/Buttons/SiteReviews.php:83
1472
- msgid "Enable (using ajax)"
1473
- msgstr "Enable (using ajax)"
1474
 
1475
- #: plugin/Shortcodes/Buttons/SiteReviews.php:84
1476
- msgid "Disable"
1477
- msgstr "Disable"
1478
 
1479
- #: plugin/Shortcodes/Buttons/SiteReviews.php:86
1480
- msgid ""
1481
- "When using pagination this shortcode can only be used once on a page. "
1482
- "(default: disable)"
1483
- msgstr ""
1484
- "When using pagination this shortcode can only be used once on a page. "
1485
- "(default: disable)"
1486
 
1487
- #: plugin/Shortcodes/Buttons/SiteReviews.php:93, plugin/Shortcodes/Buttons/SiteReviewsForm.php:58, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:78
1488
- msgid "Post ID"
1489
- msgstr "Post ID"
1490
 
1491
- #: plugin/Shortcodes/Buttons/SiteReviews.php:94
1492
- msgid ""
1493
- "Limit reviews to those assigned to this post ID (separate multiple IDs with "
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
- #: plugin/Shortcodes/Buttons/SiteReviews.php:98, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:83
1500
- msgid "Schema"
1501
- msgstr "Schema"
1502
 
1503
- #: plugin/Shortcodes/Buttons/SiteReviews.php:100, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:85
1504
- msgid "Enable rich snippets"
1505
- msgstr "Enable rich snippets"
1506
 
1507
- #: plugin/Shortcodes/Buttons/SiteReviews.php:101, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:86
1508
- msgid "Disable rich snippets"
1509
- msgstr "Disable rich snippets"
1510
 
1511
- #: plugin/Shortcodes/Buttons/SiteReviews.php:103, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:88
1512
- msgid "Rich snippets are disabled by default."
1513
- msgstr "Rich snippets are disabled by default."
1514
 
1515
- #: plugin/Shortcodes/Buttons/SiteReviews.php:107, plugin/Shortcodes/Buttons/SiteReviewsForm.php:63, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:92
1516
- msgid "Classes"
1517
- msgstr "Classes"
1518
 
1519
- #: plugin/Shortcodes/Buttons/SiteReviews.php:108, plugin/Shortcodes/Buttons/SiteReviewsForm.php:64, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:93
1520
- msgid "Add custom CSS classes to the shortcode."
1521
- msgstr "Add custom CSS classes to the shortcode."
1522
 
1523
- #: plugin/Shortcodes/Buttons/SiteReviews.php:111, plugin/Shortcodes/Buttons/SiteReviewsForm.php:67, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:96
1524
- msgid "Hide"
1525
- msgstr "Hide"
1526
 
1527
- #: plugin/Shortcodes/Buttons/SiteReviews.php:134
1528
- msgid "Excerpt"
1529
- msgstr "Excerpt"
1530
 
1531
- #: plugin/Shortcodes/Buttons/SiteReviews.php:144
1532
- msgid "Response"
1533
- msgstr "Response"
1534
 
1535
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:32
1536
- msgid "Automatically assign a category to reviews submitted with this shortcode."
1537
- msgstr "Automatically assign a category to reviews submitted with this shortcode."
1538
 
1539
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:49
1540
- msgid "Enter a custom shortcode description."
1541
- msgstr "Enter a custom shortcode description."
1542
 
1543
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:59
 
 
 
 
 
 
 
 
 
 
 
 
1544
  msgid ""
1545
- "Assign submitted reviews to a custom page/post ID. You can also enter "
1546
- "\"post_id\" to assign reviews to the ID of the current page."
1547
  msgstr ""
1548
- "Assign submitted reviews to a custom page/post ID. You can also enter "
1549
- "\"post_id\" to assign reviews to the ID of the current page."
1550
 
1551
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:76
1552
- msgid "Hide the email field?"
1553
- msgstr "Hide the email field?"
1554
 
1555
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:81
1556
- msgid "Hide the name field?"
1557
- msgstr "Hide the name field?"
1558
 
1559
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:85
1560
- msgid "Terms"
1561
- msgstr "Terms"
1562
 
1563
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:86
1564
- msgid "Hide the terms field?"
1565
- msgstr "Hide the terms field?"
1566
 
1567
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:91
1568
- msgid "Hide the title field?"
1569
- msgstr "Hide the title field?"
1570
 
1571
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:58
1572
- msgid "Labels"
1573
- msgstr "Labels"
1574
 
1575
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:59
1576
- msgid ""
1577
- "Enter custom labels for the 1-5 star rating levels (from high to low), and "
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
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:71
1586
- msgid "What is the minimum rating? (default: 1 star)"
1587
- msgstr "What is the minimum rating? (default: 1 star)"
1588
 
1589
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:79
1590
- msgid ""
1591
- "Limit reviews to those assigned to this post ID (separate multiple ID's "
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
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:104
1600
- msgid "Bars"
1601
- msgstr "Bars"
1602
 
1603
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:105
1604
- msgid "Hide the percentage bars?"
1605
- msgstr "Hide the percentage bars?"
1606
 
1607
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:110
1608
- msgid "Hide the rating?"
1609
- msgstr "Hide the rating?"
1610
 
1611
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:114
1612
- msgid "Stars"
1613
- msgstr "Stars"
1614
 
1615
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:115
1616
- msgid "Hide the stars?"
1617
- msgstr "Hide the stars?"
1618
 
1619
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:119
1620
- msgid "Summary"
1621
- msgstr "Summary"
1622
 
1623
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:120
1624
- msgid "Hide the summary text?"
1625
- msgstr "Hide the summary text?"
1626
 
1627
- #: views/menu/addons/addons.php:3
1628
- msgid "The following Add-Ons extend the functionality of Site Reviews."
1629
- msgstr "The following Add-Ons extend the functionality of Site Reviews."
 
 
1630
 
1631
- #: views/menu/addons/addons.php:12
1632
- msgid ""
1633
- "Sync your Tripadvisor business reviews with an optional minimum rating and "
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
- #: views/menu/addons/addons.php:19
1640
- msgid ""
1641
- "Sync your Yelp business reviews with an optional minimum rating and display "
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
- #: views/menu/help/system.php:9
1648
- msgid "Download System Info"
1649
- msgstr "Download System Info"
1650
 
1651
- #: views/menu/help/system.php:14
1652
- msgid "Logging"
1653
- msgstr "Logging"
1654
 
1655
- #: views/menu/help/system.php:15
1656
- msgid ""
1657
- "You can enable logging for debugging purposes. Log files can grow quickly, "
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
- #: views/menu/help/system.php:26
1664
- msgid "Clear Log"
1665
- msgstr "Clear Log"
1666
 
1667
- #: views/menu/help/system.php:32
1668
- msgid "Download Log"
1669
- msgstr "Download Log"
1670
 
1671
- #: views/menu/help/system.php:44
1672
- msgid "Disable Logging"
1673
- msgstr "Disable Logging"
1674
 
1675
- #: views/menu/help/system.php:48
1676
- msgid "Enable Logging"
1677
- msgstr "Enable Logging"
1678
 
1679
- #: views/menu/settings/settings/strings.php:4
1680
- msgid "Search for translatable text"
1681
- msgstr "Search for translatable text"
1682
 
1683
- #: views/menu/settings/settings/strings.php:6
1684
- msgid "Search for translatable text..."
1685
- msgstr "Search for translatable text..."
1686
-
1687
- #: plugin/Settings.php:549
1688
- msgctxt "plugin name"
1689
- msgid "Use 3rd-party plugin: Invisible reCaptcha"
1690
- msgstr "Use 3rd-party plugin: Invisible reCaptcha"
1691
-
1692
- #: plugin/Strings.php:87
1693
- msgctxt ":min, and :max are placeholders and should not be translated."
1694
- msgid "This field must be between :min and :max."
1695
- msgstr "This field must be between :min and :max."
1696
-
1697
- #: plugin/Strings.php:88
1698
- msgctxt ":min, and :max are placeholders and should not be translated."
1699
- msgid "This field must be between :min and :max characters."
1700
- msgstr "This field must be between :min and :max characters."
1701
-
1702
- #: plugin/Strings.php:90
1703
- msgctxt ":max is a placeholder and should not be translated."
1704
- msgid "This field may not be greater than :max."
1705
- msgstr "This field may not be greater than :max."
1706
-
1707
- #: plugin/Strings.php:91
1708
- msgctxt ":max is a placeholder and should not be translated."
1709
- msgid "This field may not be greater than :max characters."
1710
- msgstr "This field may not be greater than :max characters."
1711
-
1712
- #: plugin/Strings.php:92
1713
- msgctxt ":min is a placeholder and should not be translated."
1714
- msgid "This field must be at least :min."
1715
- msgstr "This field must be at least :min."
1716
-
1717
- #: plugin/Strings.php:93
1718
- msgctxt ":min is a placeholder and should not be translated."
1719
- msgid "This field must be at least :min characters."
1720
- msgstr "This field must be at least :min characters."
1721
-
1722
- #: plugin/Handlers/SubmitReview.php:115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1723
  msgctxt ""
1724
- "The text is different depending on whether or not the review has been "
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/SiteReviewsSummary.php:150
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 &rarr;"
897
+ msgstr "Next &rarr;"
898
 
899
+ #: plugin/Defaults/PaginationDefaults.php:20
900
+ msgid "&larr; Previous"
901
+ msgstr "&larr; 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) 2018 site-reviews
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/Database.php:346
47
- msgid "%s reviews"
48
  msgstr ""
49
 
50
- #: plugin/Database.php:377
51
- msgid "Anonymous"
52
  msgstr ""
53
 
54
- #: plugin/Date.php:44
55
- msgid "%s second ago"
56
- msgid_plural "%s seconds ago"
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
- #: plugin/Settings.php:161, plugin/Settings.php:258, plugin/Settings.php:516, plugin/Settings.php:620
97
- msgid "Save Settings"
98
  msgstr ""
99
 
100
- #: plugin/Settings.php:167, plugin/Settings.php:602
101
- msgid "Require approval"
102
  msgstr ""
103
 
104
- #: plugin/Settings.php:169
105
- msgid "Set the status of new review submissions to pending."
106
  msgstr ""
107
 
108
- #: plugin/Settings.php:175
109
- msgid "Require login"
110
  msgstr ""
111
 
112
- #: plugin/Settings.php:176
113
  msgid "Only allow review submissions from registered users."
114
  msgstr ""
115
 
116
- #: plugin/Settings.php:182
117
- msgid "Show registration link"
118
  msgstr ""
119
 
120
- #: plugin/Settings.php:186
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
- #: plugin/Settings.php:187
125
  msgid "Anyone can register"
126
  msgstr ""
127
 
128
- #: plugin/Settings.php:194
129
- msgid "Notifications"
 
 
 
 
130
  msgstr ""
131
 
132
- #: plugin/Settings.php:197
133
- msgid "Do not send review notifications"
134
  msgstr ""
135
 
136
- #: plugin/Settings.php:198
 
 
 
 
137
  msgid "Send to administrator"
138
  msgstr ""
139
 
140
- #: plugin/Settings.php:199
141
- msgid "Send to one or more email addresses"
142
  msgstr ""
143
 
144
- #: plugin/Settings.php:200
145
- msgid "Send to %s"
146
  msgstr ""
147
 
148
- #: plugin/Settings.php:207
149
- msgid "Send notification emails to"
150
  msgstr ""
151
 
152
- #: plugin/Settings.php:211
153
- msgid "Separate multiple emails with a comma"
154
  msgstr ""
155
 
156
- #: plugin/Settings.php:217
157
- msgid "Webhook URL"
158
  msgstr ""
159
 
160
- #: plugin/Settings.php:221
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
- #: plugin/Settings.php:222
165
  msgid "Incoming WebHook"
166
  msgstr ""
167
 
168
- #: plugin/Settings.php:229
169
- msgid "Notification template"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  msgstr ""
171
 
172
- #: plugin/Settings.php:264
173
  msgid "Date Format"
174
  msgstr ""
175
 
176
- #: plugin/Settings.php:266
177
  msgid "Use the default date format"
178
  msgstr ""
179
 
180
- #: plugin/Settings.php:267
181
  msgid "Use a relative date format"
182
  msgstr ""
183
 
184
- #: plugin/Settings.php:268
185
  msgid "Use a custom date format"
186
  msgstr ""
187
 
188
- #: plugin/Settings.php:270
189
- msgid "The default date format is the one set in your %s."
190
  msgstr ""
191
 
192
- #: plugin/Settings.php:271
193
- msgid "WordPress settings"
194
  msgstr ""
195
 
196
- #: plugin/Settings.php:278
197
- msgid "Custom Date Format"
198
  msgstr ""
199
 
200
- #: plugin/Settings.php:280
201
- msgid "Enter a custom date format (%s)."
202
  msgstr ""
203
 
204
- #: plugin/Settings.php:281
205
- msgid "documentation on date and time formatting"
206
  msgstr ""
207
 
208
- #: plugin/Settings.php:291
209
- msgid "Enable Assigned Links"
210
  msgstr ""
211
 
212
- #: plugin/Settings.php:292
213
- msgid "Display a link to the assigned post of a review."
214
  msgstr ""
215
 
216
- #: plugin/Settings.php:298
217
- msgid "Enable Avatars"
 
 
 
 
218
  msgstr ""
219
 
220
- #: plugin/Settings.php:299
221
- msgid "Display reviewer avatars. These are generated from the email address of the reviewer using %s."
222
  msgstr ""
223
 
224
- #: plugin/Settings.php:300
225
- msgid "Gravatar"
226
  msgstr ""
227
 
228
- #: plugin/Settings.php:307
229
  msgid "Enable Excerpts"
230
  msgstr ""
231
 
232
- #: plugin/Settings.php:308
233
- msgid "Display an excerpt instead of the full review."
234
  msgstr ""
235
 
236
- #: plugin/Settings.php:314
237
  msgid "Excerpt Length"
238
  msgstr ""
239
 
240
- #: plugin/Settings.php:316
241
- msgid "Set the excerpt word length."
 
 
 
 
242
  msgstr ""
243
 
244
- #: plugin/Settings.php:324
245
- msgid "Rich Snippets (schema.org)"
246
  msgstr ""
247
 
248
- #: plugin/Settings.php:325
249
- 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. 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."
250
  msgstr ""
251
 
252
- #: plugin/Settings.php:331
 
 
 
 
253
  msgid "Default Schema Type"
254
  msgstr ""
255
 
256
- #: plugin/Settings.php:334
257
  msgid "Local Business"
258
  msgstr ""
259
 
260
- #: plugin/Settings.php:335
261
  msgid "Product"
262
  msgstr ""
263
 
264
- #: plugin/Settings.php:336
265
  msgid "Custom"
266
  msgstr ""
267
 
268
- #: plugin/Settings.php:338
269
- msgid "Custom Field name: <code>schema_type</code>"
270
  msgstr ""
271
 
272
- #: plugin/Settings.php:344
273
  msgid "Custom Schema Type"
274
  msgstr ""
275
 
276
- #: plugin/Settings.php:348
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
- #: plugin/Settings.php:357
285
  msgid "Use the assigned or current page title"
286
  msgstr ""
287
 
288
- #: plugin/Settings.php:358
289
- msgid "Enter a custom name"
290
  msgstr ""
291
 
292
- #: plugin/Settings.php:359
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
- #: plugin/Settings.php:376
305
  msgid "Default Description"
306
  msgstr ""
307
 
308
- #: plugin/Settings.php:379
309
  msgid "Use the assigned or current page excerpt"
310
  msgstr ""
311
 
312
- #: plugin/Settings.php:380
313
  msgid "Enter a custom description"
314
  msgstr ""
315
 
316
- #: plugin/Settings.php:381
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
- #: plugin/Settings.php:398
329
  msgid "Default URL"
330
  msgstr ""
331
 
332
- #: plugin/Settings.php:401
333
  msgid "Use the assigned or current page URL"
334
  msgstr ""
335
 
336
- #: plugin/Settings.php:402
337
  msgid "Enter a custom URL"
338
  msgstr ""
339
 
340
- #: plugin/Settings.php:403
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
- #: plugin/Settings.php:420
353
  msgid "Default Image"
354
  msgstr ""
355
 
356
- #: plugin/Settings.php:423
357
  msgid "Use the featured image of the assigned or current page"
358
  msgstr ""
359
 
360
- #: plugin/Settings.php:424
361
  msgid "Enter a custom image URL"
362
  msgstr ""
363
 
364
- #: plugin/Settings.php:425
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
- #: plugin/Settings.php:442
377
  msgid "Address"
378
  msgstr ""
379
 
380
- #: plugin/Settings.php:447
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
- #: plugin/Settings.php:458
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
- #: plugin/Settings.php:469
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
- #: plugin/Settings.php:480
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
- #: plugin/Settings.php:491
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
- #: plugin/Settings.php:502
421
- msgid "Custom Field name: <code>schema_pricecurrency</code>"
422
  msgstr ""
423
 
424
- #: plugin/Settings.php:522
425
  msgid "Required Fields"
426
  msgstr ""
427
 
428
- #: plugin/Settings.php:525, plugin/Commands/RegisterPostType.php:22, plugin/Widgets/SiteReviews.php:37, plugin/Widgets/SiteReviewsForm.php:41, plugin/Shortcodes/Buttons/SiteReviews.php:55, plugin/Shortcodes/Buttons/SiteReviews.php:149, plugin/Shortcodes/Buttons/SiteReviewsForm.php:43, plugin/Shortcodes/Buttons/SiteReviewsForm.php:90, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:53
 
 
 
 
429
  msgid "Title"
430
  msgstr ""
431
 
432
- #: plugin/Settings.php:526, plugin/Controllers/MainController.php:245
433
  msgid "Review"
434
  msgstr ""
435
 
436
- #: plugin/Settings.php:527, plugin/Controllers/MainController.php:854, plugin/Shortcodes/Buttons/SiteReviewsForm.php:80
437
  msgid "Name"
438
  msgstr ""
439
 
440
- #: plugin/Settings.php:528, plugin/Controllers/MainController.php:855, plugin/Shortcodes/Buttons/SiteReviewsForm.php:75
441
  msgid "Email"
442
  msgstr ""
443
 
444
- #: plugin/Settings.php:535
445
- msgid "Enable Akismet Integration"
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
- #: plugin/Settings.php:538
453
- msgid "Akismet plugin"
454
  msgstr ""
455
 
456
- #: plugin/Settings.php:545
457
  msgid "Invisible reCAPTCHA"
458
  msgstr ""
459
 
460
- #: plugin/Settings.php:547
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
- #: plugin/Settings.php:568
486
  msgid "Site Secret"
487
  msgstr ""
488
 
489
- #: plugin/Settings.php:577
490
- msgid "Badge Position"
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
- #: plugin/Strings.php:25, plugin/Widgets/SiteReviews.php:71
518
- msgid "All Reviews"
519
  msgstr ""
520
 
521
- #: plugin/Strings.php:26
522
- msgid "Review Archives"
523
  msgstr ""
524
 
525
- #: plugin/Strings.php:27
526
- msgid "Edit Review"
527
  msgstr ""
528
 
529
- #: plugin/Strings.php:28
530
- msgid "Insert into review"
531
  msgstr ""
532
 
533
- #: plugin/Strings.php:29
534
- msgid "New Review"
535
  msgstr ""
536
 
537
- #: plugin/Strings.php:30
538
- msgid "No Reviews found"
539
  msgstr ""
540
 
541
- #: plugin/Strings.php:31
542
- msgid "No Reviews found in Trash"
543
  msgstr ""
544
 
545
- #: plugin/Strings.php:32
546
- msgid "Search Reviews"
547
  msgstr ""
548
 
549
- #: plugin/Strings.php:33
550
- msgid "Uploaded to this review"
551
  msgstr ""
552
 
553
- #: plugin/Strings.php:34, plugin/Handlers/SubmitReview.php:93
554
- msgid "View Review"
555
  msgstr ""
556
 
557
- #: plugin/Strings.php:47
558
- msgid "Review has been approved and published."
559
  msgstr ""
560
 
561
- #: plugin/Strings.php:48
562
- msgid "Review draft updated."
563
  msgstr ""
564
 
565
- #: plugin/Strings.php:49
566
- msgid "Preview review"
567
  msgstr ""
568
 
569
- #: plugin/Strings.php:50
570
- msgid "Review approved and published."
571
  msgstr ""
572
 
573
- #: plugin/Strings.php:51
574
- msgid "Review restored to revision from %s."
575
  msgstr ""
576
 
577
- #: plugin/Strings.php:52
578
- msgid "Review has been reverted to its original submission state."
579
  msgstr ""
580
 
581
- #: plugin/Strings.php:53
582
- msgid "Review saved."
583
  msgstr ""
584
 
585
- #: plugin/Strings.php:54
586
- msgid "Review scheduled for: %s."
587
  msgstr ""
588
 
589
- #: plugin/Strings.php:55
590
- msgid "Review submitted."
591
  msgstr ""
592
 
593
- #: plugin/Strings.php:56
594
- msgid "Review has been unapproved and is now pending."
595
  msgstr ""
596
 
597
- #: plugin/Strings.php:57
598
- msgid "Review updated."
599
  msgstr ""
600
 
601
- #: plugin/Strings.php:58
602
- msgid "View review"
603
  msgstr ""
604
 
605
- #: plugin/Strings.php:73
606
- msgid "Local"
607
  msgstr ""
608
 
609
- #: plugin/Strings.php:86
610
- msgid "This field must be accepted."
611
  msgstr ""
612
 
613
- #: plugin/Strings.php:87
614
- msgctxt ":min, and :max are placeholders and should not be translated."
615
- msgid "This field must be between :min and :max."
616
  msgstr ""
617
 
618
- #: plugin/Strings.php:88
619
- msgctxt ":min, and :max are placeholders and should not be translated."
620
- msgid "This field must be between :min and :max characters."
621
  msgstr ""
622
 
623
- #: plugin/Strings.php:89
624
- msgid "This must be a valid email address."
 
625
  msgstr ""
626
 
627
- #: plugin/Strings.php:90
628
- msgctxt ":max is a placeholder and should not be translated."
629
- msgid "This field may not be greater than :max."
630
  msgstr ""
631
 
632
- #: plugin/Strings.php:91
633
- msgctxt ":max is a placeholder and should not be translated."
634
- msgid "This field may not be greater than :max characters."
635
  msgstr ""
636
 
637
- #: plugin/Strings.php:92
638
- msgctxt ":min is a placeholder and should not be translated."
639
- msgid "This field must be at least :min."
640
  msgstr ""
641
 
642
- #: plugin/Strings.php:93
643
- msgctxt ":min is a placeholder and should not be translated."
644
- msgid "This field must be at least :min characters."
645
  msgstr ""
646
 
647
- #: plugin/Strings.php:94
648
- msgid "The format is invalid."
 
649
  msgstr ""
650
 
651
- #: plugin/Strings.php:95
652
- msgid "This field is required."
 
653
  msgstr ""
654
 
655
- #: plugin/Commands/RegisterPostType.php:23, plugin/Controllers/MainController.php:852, plugin/Shortcodes/Buttons/SiteReviews.php:129
656
- msgid "Date"
 
657
  msgstr ""
658
 
659
- #: plugin/Controllers/AjaxController.php:49
660
- msgid "Log is empty"
 
661
  msgstr ""
662
 
663
- #: plugin/Controllers/AjaxController.php:75
664
- msgid "Okay"
 
665
  msgstr ""
666
 
667
- #: plugin/Controllers/AjaxController.php:108, plugin/Controllers/AjaxController.php:127
668
- msgid "Nothing found."
669
  msgstr ""
670
 
671
- #: plugin/Controllers/MainController.php:99
672
- msgid "Log was cleared."
673
  msgstr ""
674
 
675
- #: plugin/Controllers/MainController.php:135, plugin/Controllers/MainController.php:382, plugin/Controllers/MainController.php:638
676
  msgid "Settings"
677
  msgstr ""
678
 
679
- #: plugin/Controllers/MainController.php:156
680
  msgid "%s Review"
681
  msgid_plural "%s Reviews"
682
  msgstr[0] ""
683
  msgstr[1] ""
684
 
685
- #: plugin/Controllers/MainController.php:208, plugin/Controllers/MainController.php:256, views/edit/bulk-edit-assigned-to.php:7
686
- msgid "Assigned To"
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/MainController.php:260, views/edit/pinned.php:17
726
- msgid "Pinned"
727
  msgstr ""
728
 
729
- #: plugin/Controllers/MainController.php:283
730
- msgid "Approve this review"
731
  msgstr ""
732
 
733
- #: plugin/Controllers/MainController.php:285
734
- msgid "Approve"
735
  msgstr ""
736
 
737
- #: plugin/Controllers/MainController.php:288
738
- msgid "Unapprove this review"
739
  msgstr ""
740
 
741
- #: plugin/Controllers/MainController.php:290
742
- msgid "Unapprove"
743
  msgstr ""
744
 
745
- #: plugin/Controllers/MainController.php:336, plugin/Controllers/MainController.php:428
746
- msgid "Recent Site Reviews"
747
  msgstr ""
748
 
749
- #: plugin/Controllers/MainController.php:337
750
- msgid "Site Reviews Summary"
751
  msgstr ""
752
 
753
- #: plugin/Controllers/MainController.php:338, plugin/Controllers/MainController.php:433
754
- msgid "Submit a Site Review"
755
  msgstr ""
756
 
757
- #: plugin/Controllers/MainController.php:383
758
- msgid "Get Help"
759
  msgstr ""
760
 
761
- #: plugin/Controllers/MainController.php:384, plugin/Controllers/MainController.php:450
762
- msgid "Add-Ons"
763
  msgstr ""
764
 
765
- #: plugin/Controllers/MainController.php:429
766
- msgid "Your site’s most recent Local Reviews."
767
  msgstr ""
768
 
769
- #: plugin/Controllers/MainController.php:434
770
- msgid "A \"submit a review\" form for your site."
771
  msgstr ""
772
 
773
- #: plugin/Controllers/MainController.php:488
774
- msgid "Support"
775
  msgstr ""
776
 
777
- #: plugin/Controllers/MainController.php:489
778
- msgid "Shortcodes"
779
  msgstr ""
780
 
781
- #: plugin/Controllers/MainController.php:490
782
- msgid "Hooks"
783
  msgstr ""
784
 
785
- #: plugin/Controllers/MainController.php:491
786
- msgid "Helper Functions"
787
  msgstr ""
788
 
789
- #: plugin/Controllers/MainController.php:496
790
- msgid "Documentation"
791
  msgstr ""
792
 
793
- #: plugin/Controllers/MainController.php:499
794
- msgid "System Info"
795
  msgstr ""
796
 
797
- #: plugin/Controllers/MainController.php:607
798
- msgid "This review is read-only."
799
  msgstr ""
800
 
801
- #: plugin/Controllers/MainController.php:630
802
- msgid "General"
803
  msgstr ""
804
 
805
- #: plugin/Controllers/MainController.php:632
806
- msgid "Submission Form"
807
  msgstr ""
808
 
809
- #: plugin/Controllers/MainController.php:633
810
- msgid "Translations"
811
  msgstr ""
812
 
813
- #: plugin/Controllers/MainController.php:641
814
- msgid "Licenses"
815
  msgstr ""
816
 
817
- #: plugin/Controllers/MainController.php:705
818
- msgid "Logging disabled."
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/MainController.php:822
828
  msgid "Nothing to Revert"
829
  msgstr ""
830
 
831
- #: plugin/Controllers/MainController.php:823
832
- msgid "Revert Changes"
833
- msgstr ""
834
-
835
- #: plugin/Controllers/MainController.php:835
836
  msgid "Unknown"
837
  msgstr ""
838
 
839
- #: plugin/Controllers/MainController.php:837
840
- msgid "%s review"
841
- msgstr ""
842
-
843
- #: plugin/Controllers/MainController.php:845
844
  msgid "Unregistered user"
845
  msgstr ""
846
 
847
- #: plugin/Controllers/MainController.php:847
848
  msgid "RE:"
849
  msgstr ""
850
 
851
- #: plugin/Controllers/MainController.php:853
852
- msgid "Reviewer"
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/ReviewController.php:135, plugin/Controllers/ReviewController.php:159
864
- msgid "Save as Unapproved"
865
  msgstr ""
866
 
867
- #: plugin/Controllers/ReviewController.php:136, plugin/Controllers/ReviewController.php:161
868
- msgid "Approved"
869
  msgstr ""
870
 
871
- #: plugin/Controllers/ReviewController.php:160
872
- msgid "Privately Approved"
873
  msgstr ""
874
 
875
- #: plugin/Controllers/ReviewController.php:162, plugin/Controllers/ReviewController.php:163
876
- msgid "Unapproved"
877
  msgstr ""
878
 
879
- #: plugin/Controllers/ReviewController.php:233
880
  msgid "%s review updated."
881
  msgid_plural "%s reviews updated."
882
  msgstr[0] ""
883
  msgstr[1] ""
884
 
885
- #: plugin/Controllers/ReviewController.php:234
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/ReviewController.php:235
892
  msgid "%s review permanently deleted."
893
  msgid_plural "%s reviews permanently deleted."
894
  msgstr[0] ""
895
  msgstr[1] ""
896
 
897
- #: plugin/Controllers/ReviewController.php:236
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/ReviewController.php:237
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/ReviewController.php:291
910
- msgid "Please fix the submission errors."
911
  msgstr ""
912
 
913
- #: plugin/Controllers/ReviewController.php:300, plugin/Controllers/ReviewController.php:307
914
- msgid "The review submission failed. Please notify the site administrator."
915
  msgstr ""
916
 
917
- #: plugin/Controllers/ReviewController.php:319
918
- msgid "The reCAPTCHA verification failed. Please notify the site administrator."
919
  msgstr ""
920
 
921
- #: plugin/Controllers/ReviewController.php:334
922
- msgid "Your review cannot be submitted at this time."
923
  msgstr ""
924
 
925
- #: plugin/Controllers/ReviewController.php:343
926
- msgid "Your review cannot be submitted at this time. Please try again later."
 
927
  msgstr ""
928
 
929
- #: plugin/Controllers/ReviewController.php:731, plugin/Html/Partials/Reviews.php:281
930
- msgid "No Title"
931
  msgstr ""
932
 
933
- #: plugin/Handlers/ChangeStatus.php:31, views/edit/pinned.php:21
934
- msgid "Edit"
935
  msgstr ""
936
 
937
- #: plugin/Handlers/RegisterPostType.php:310, plugin/Widgets/SiteReviews.php:56, plugin/Widgets/SiteReviews.php:57, plugin/Widgets/SiteReviews.php:58, plugin/Widgets/SiteReviews.php:59, plugin/Widgets/SiteReviews.php:60, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:65, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:66, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:67, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:68, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:69
938
- msgid "%s star"
939
- msgid_plural "%s stars"
940
- msgstr[0] ""
941
- msgstr[1] ""
942
 
943
- #: plugin/Handlers/RegisterPostType.php:314
944
- msgid "All ratings"
945
  msgstr ""
946
 
947
- #: plugin/Handlers/RegisterPostType.php:316
948
- msgid "Filter by rating"
949
  msgstr ""
950
 
951
- #: plugin/Handlers/RegisterPostType.php:336
952
- msgid "All types"
953
  msgstr ""
954
 
955
- #: plugin/Handlers/RegisterPostType.php:342
956
- msgid "Filter by type"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
957
  msgstr ""
958
 
959
- #: plugin/Handlers/RegisterTaxonomy.php:82
 
 
 
 
960
  msgid "Filter by category"
961
  msgstr ""
962
 
963
- #: plugin/Handlers/SubmitReview.php:39
964
- msgid "Your review has been submitted!"
965
  msgstr ""
966
 
967
- #: plugin/Handlers/SubmitReview.php:115
968
- msgctxt "The text is different depending on whether or not the review has been assigned to a post."
969
- msgid "New %s-star review"
970
- msgid_plural "New %s-star review of: %s"
971
- msgstr[0] ""
972
- msgstr[1] ""
 
 
 
 
 
 
 
 
 
 
 
 
 
973
 
974
- #: plugin/Handlers/SubmitReview.php:148
975
- msgid "Email notification was not sent: missing email, subject, or message."
976
  msgstr ""
977
 
978
- #: plugin/Handlers/SubmitReview.php:151
979
- msgid "Email notification was not sent: wp_mail() failed."
980
  msgstr ""
981
 
982
- #: plugin/Handlers/TogglePinned.php:43
983
- msgid "The review is pinned."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
984
  msgstr ""
985
 
986
- #: plugin/Handlers/TogglePinned.php:44
987
- msgid "The review is unpinned."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
988
  msgstr ""
989
 
990
- #: plugin/Html/Form.php:137
991
- msgid "Submit"
992
  msgstr ""
993
 
994
- #: plugin/Html/Form.php:280
995
- msgid "Save Changes"
996
  msgstr ""
997
 
998
- #: plugin/Shortcodes/SiteReviewsSummary.php:150
999
- msgctxt "Do not translate {rating} and {max}, they are template tags."
1000
- msgid "{rating} out of {max} stars (based on %d review)"
1001
- msgid_plural "{rating} out of {max} stars (based on %d reviews)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1002
  msgstr[0] ""
1003
  msgstr[1] ""
1004
 
1005
- #: plugin/Shortcodes/SiteReviewsSummary.php:238, views/submit/index.php:20
 
 
 
 
 
 
 
 
 
 
 
1006
  msgid "Excellent"
1007
  msgstr ""
1008
 
1009
- #: plugin/Shortcodes/SiteReviewsSummary.php:239, views/submit/index.php:21
1010
  msgid "Very good"
1011
  msgstr ""
1012
 
1013
- #: plugin/Shortcodes/SiteReviewsSummary.php:240, views/submit/index.php:22
1014
  msgid "Average"
1015
  msgstr ""
1016
 
1017
- #: plugin/Shortcodes/SiteReviewsSummary.php:241, views/submit/index.php:23
1018
  msgid "Poor"
1019
  msgstr ""
1020
 
1021
- #: plugin/Shortcodes/SiteReviewsSummary.php:242, views/submit/index.php:24
1022
  msgid "Terrible"
1023
  msgstr ""
1024
 
1025
- #: plugin/Traits/SiteReviewsForm.php:104
1026
- msgid "You must be %s to submit a review."
1027
  msgstr ""
1028
 
1029
- #: plugin/Traits/SiteReviewsForm.php:105
1030
- msgid "logged in"
1031
  msgstr ""
1032
 
1033
- #: plugin/Traits/SiteReviewsForm.php:108
1034
- msgid "You may also %s for an account."
1035
  msgstr ""
1036
 
1037
- #: plugin/Traits/SiteReviewsForm.php:109
1038
- msgid "register"
1039
  msgstr ""
1040
 
1041
- #: plugin/Widgets/SiteReviews.php:44
1042
- msgid "How many reviews would you like to display? "
1043
  msgstr ""
1044
 
1045
- #: plugin/Widgets/SiteReviews.php:53
1046
- msgid "What is the minimum rating to display? "
1047
  msgstr ""
1048
 
1049
- #: plugin/Widgets/SiteReviews.php:68
1050
- msgid "Which reviews would you like to display? "
1051
  msgstr ""
1052
 
1053
- #: plugin/Widgets/SiteReviews.php:79
1054
- msgid "Limit reviews to this category"
1055
  msgstr ""
1056
 
1057
- #: plugin/Widgets/SiteReviews.php:82
1058
- msgid "All Categories"
1059
  msgstr ""
1060
 
1061
- #: plugin/Widgets/SiteReviews.php:89
1062
- msgid "Limit reviews to those assigned to this page/post ID"
1063
  msgstr ""
1064
 
1065
- #: plugin/Widgets/SiteReviews.php:92
1066
- msgid "Separate multiple ID's with a comma"
1067
  msgstr ""
1068
 
1069
- #: plugin/Widgets/SiteReviews.php:93
1070
- msgid "You may also enter %s to limit assigned reviews to the current page."
1071
  msgstr ""
1072
 
1073
- #: plugin/Widgets/SiteReviews.php:99, plugin/Widgets/SiteReviewsForm.php:74
1074
- msgid "Enter any custom CSS classes here"
1075
  msgstr ""
1076
 
1077
- #: plugin/Widgets/SiteReviews.php:108, plugin/Shortcodes/Buttons/SiteReviews.php:120
1078
- msgid "Hide the review author?"
1079
  msgstr ""
1080
 
1081
- #: plugin/Widgets/SiteReviews.php:109, plugin/Shortcodes/Buttons/SiteReviews.php:125
1082
- msgid "Hide the reviewer avatar if shown?"
1083
  msgstr ""
1084
 
1085
- #: plugin/Widgets/SiteReviews.php:110, plugin/Shortcodes/Buttons/SiteReviews.php:130
1086
- msgid "Hide the review date?"
1087
  msgstr ""
1088
 
1089
- #: plugin/Widgets/SiteReviews.php:111, plugin/Shortcodes/Buttons/SiteReviews.php:135
1090
- msgid "Hide the review excerpt?"
1091
  msgstr ""
1092
 
1093
- #: plugin/Widgets/SiteReviews.php:112, plugin/Shortcodes/Buttons/SiteReviews.php:140
1094
- msgid "Hide the review rating?"
1095
  msgstr ""
1096
 
1097
- #: plugin/Widgets/SiteReviews.php:113, plugin/Shortcodes/Buttons/SiteReviews.php:145
1098
- msgid "Hide the review response?"
1099
- msgstr ""
 
 
1100
 
1101
- #: plugin/Widgets/SiteReviews.php:114, plugin/Shortcodes/Buttons/SiteReviews.php:150
1102
- msgid "Hide the review title?"
1103
  msgstr ""
1104
 
1105
- #: plugin/Widgets/SiteReviewsForm.php:35
1106
- msgid "Your email address will not be published. Required fields are marked %s*%s"
1107
  msgstr ""
1108
 
1109
- #: plugin/Widgets/SiteReviewsForm.php:49, plugin/Shortcodes/Buttons/SiteReviewsForm.php:48
1110
- msgid "Description"
1111
  msgstr ""
1112
 
1113
- #: plugin/Widgets/SiteReviewsForm.php:56
1114
- msgid "Automatically assign a category"
1115
  msgstr ""
1116
 
1117
- #: plugin/Widgets/SiteReviewsForm.php:58
1118
- msgid "Do not assign a category"
1119
  msgstr ""
1120
 
1121
- #: plugin/Widgets/SiteReviewsForm.php:65
1122
- msgid "Assign reviews to a custom page/post ID"
1123
  msgstr ""
1124
 
1125
- #: plugin/Widgets/SiteReviewsForm.php:68
1126
- msgid "You may also enter %s to assign to the current post."
1127
  msgstr ""
1128
 
1129
- #: plugin/Widgets/SiteReviewsForm.php:83
1130
- msgid "Hide the email field"
1131
  msgstr ""
1132
 
1133
- #: plugin/Widgets/SiteReviewsForm.php:84
1134
- msgid "Hide the name field"
1135
  msgstr ""
1136
 
1137
- #: plugin/Widgets/SiteReviewsForm.php:85
1138
- msgid "Hide the terms field"
1139
  msgstr ""
1140
 
1141
- #: plugin/Widgets/SiteReviewsForm.php:86
1142
- msgid "Hide the title field"
1143
  msgstr ""
1144
 
1145
- #: views/edit/assigned-post.php:5
1146
- msgid "Remove assignment"
1147
  msgstr ""
1148
 
1149
- #: views/edit/metabox-assigned-to.php:6
1150
- msgid "Type to search..."
1151
  msgstr ""
1152
 
1153
- #: views/edit/metabox-assigned-to.php:8
1154
- msgid "Search here for a page or post that you would like to assign this review to. You may search by title or ID."
1155
  msgstr ""
1156
 
1157
- #: views/edit/metabox-categories.php:7
1158
- msgid "Most Used"
1159
  msgstr ""
1160
 
1161
- #: views/edit/pinned.php:13, plugin/Html/Fields/Yesno.php:23
1162
- msgid "No"
1163
  msgstr ""
1164
 
1165
- #: views/edit/pinned.php:14, plugin/Html/Fields/Yesno.php:24
1166
- msgid "Yes"
1167
  msgstr ""
1168
 
1169
- #: views/edit/pinned.php:22
1170
- msgid "Edit pinned status"
1171
  msgstr ""
1172
 
1173
- #: views/edit/pinned.php:30
1174
- msgid "Pin"
1175
  msgstr ""
1176
 
1177
- #: views/edit/pinned.php:31
1178
- msgid "Unpin"
1179
  msgstr ""
1180
 
1181
- #: views/edit/pinned.php:34
1182
- msgid "OK"
1183
  msgstr ""
1184
 
1185
- #: views/edit/pinned.php:35
1186
- msgid "Cancel"
1187
  msgstr ""
1188
 
1189
- #: views/edit/review.php:4
1190
- msgid "no title"
1191
  msgstr ""
1192
 
1193
- #: views/menu/status.php:6
1194
- msgctxt "configured timezone"
1195
- msgid "All dates and times shown here use the WordPress %s."
1196
  msgstr ""
1197
 
1198
- #: views/menu/status.php:7
1199
- msgid "configured timezone"
1200
  msgstr ""
1201
 
1202
- #: views/menu/status.php:15
1203
- msgid "Site"
1204
  msgstr ""
1205
 
1206
- #: views/menu/status.php:17, views/menu/status.php:34
1207
- msgid "Last fetch"
1208
  msgstr ""
1209
 
1210
- #: views/menu/status.php:18, views/menu/status.php:37
1211
- msgid "Next scheduled fetch"
1212
  msgstr ""
1213
 
1214
- #: views/menu/status.php:35
1215
- msgid "No fetch has been completed"
1216
  msgstr ""
1217
 
1218
- #: views/menu/status.php:38
1219
- msgid "Nothing currently scheduled"
1220
  msgstr ""
1221
 
1222
- #: views/menu/status.php:58
1223
- msgid "Fetch reviews from"
1224
  msgstr ""
1225
 
1226
- #: views/menu/status.php:65
1227
- msgid "Fetch status"
1228
  msgstr ""
1229
 
1230
- #: views/menu/status.php:66
1231
- msgid "Fetching reviews..."
 
1232
  msgstr ""
1233
 
1234
- #: views/menu/status.php:78
1235
- msgid "Fetch Reviews"
1236
  msgstr ""
1237
 
1238
- #: views/strings/plural.php:6, views/strings/single.php:5
1239
- msgid "Delete translation string"
1240
  msgstr ""
1241
 
1242
- #: views/strings/plural.php:6, views/strings/single.php:5
1243
- msgid "Delete"
1244
  msgstr ""
1245
 
1246
- #: views/strings/plural.php:9, views/strings/single.php:8
1247
- msgid "Show custom translation"
1248
  msgstr ""
1249
 
1250
- #: views/strings/plural.php:16
1251
- msgid "singular"
1252
  msgstr ""
1253
 
1254
- #: views/strings/plural.php:17
1255
- msgid "plural"
1256
  msgstr ""
1257
 
1258
- #: views/strings/translations.php:4
1259
- msgid "Strings"
1260
  msgstr ""
1261
 
1262
- #: views/strings/translations.php:5
1263
- msgid "Custom Strings"
1264
  msgstr ""
1265
 
1266
- #: views/submit/index.php:13
1267
- msgid "Your overall rating"
1268
  msgstr ""
1269
 
1270
- #: views/submit/index.php:19
1271
- msgid "Select a Rating"
1272
  msgstr ""
1273
 
1274
- #: views/submit/index.php:32
1275
- msgid "Title of your review"
1276
  msgstr ""
1277
 
1278
- #: views/submit/index.php:33
1279
- msgid "Summarize your review or highlight an interesting detail"
1280
  msgstr ""
1281
 
1282
- #: views/submit/index.php:45
1283
- msgid "Your review"
1284
  msgstr ""
1285
 
1286
- #: views/submit/index.php:46
1287
- msgid "Tell people your review"
1288
  msgstr ""
1289
 
1290
- #: views/submit/index.php:59
1291
- msgid "Your name"
1292
  msgstr ""
1293
 
1294
- #: views/submit/index.php:60
1295
- msgid "Tell us your name"
1296
  msgstr ""
1297
 
1298
- #: views/submit/index.php:72
1299
- msgid "Your email"
1300
  msgstr ""
1301
 
1302
- #: views/submit/index.php:73
1303
- msgid "Tell us your email"
1304
  msgstr ""
1305
 
1306
- #: views/submit/index.php:85
1307
- msgid "This review is based on my own experience and is my genuine opinion."
1308
  msgstr ""
1309
 
1310
- #: views/submit/index.php:137
1311
- msgid "Submit your review"
1312
  msgstr ""
1313
 
1314
- #: plugin/Html/Fields/Colorpicker.php:40
1315
- msgid "Hex Value"
1316
  msgstr ""
1317
 
1318
- #: plugin/Html/Fields/Progress.php:37
1319
- msgid "Please wait..."
1320
  msgstr ""
1321
 
1322
- #: plugin/Html/Fields/Progress.php:38
1323
- msgid "Inactive"
1324
  msgstr ""
1325
 
1326
- #: plugin/Html/Partials/Addon.php:40
1327
- msgid "More Info"
1328
  msgstr ""
1329
 
1330
- #: plugin/Html/Partials/Reviews.php:35
1331
- msgid "No reviews were found."
1332
  msgstr ""
1333
 
1334
- #: plugin/Html/Partials/Reviews.php:82
1335
- msgid "Review of %s"
1336
  msgstr ""
1337
 
1338
- #: plugin/Html/Partials/Reviews.php:164
1339
- msgid "Page"
1340
  msgstr ""
1341
 
1342
- #: plugin/Html/Partials/Reviews.php:168
1343
- msgid "Next &rarr;"
1344
  msgstr ""
1345
 
1346
- #: plugin/Html/Partials/Reviews.php:169
1347
- msgid "&larr; Previous"
1348
  msgstr ""
1349
 
1350
- #: plugin/Html/Partials/Reviews.php:195
1351
- msgid "Previous"
1352
  msgstr ""
1353
 
1354
- #: plugin/Html/Partials/Reviews.php:201
1355
- msgid "Next"
1356
  msgstr ""
1357
 
1358
- #: plugin/Html/Partials/Reviews.php:240
1359
- msgid "Response from %s"
1360
  msgstr ""
1361
 
1362
- #: plugin/Html/Partials/Reviews.php:309
1363
- msgid "Show more"
1364
  msgstr ""
1365
 
1366
- #: plugin/Html/Partials/Reviews.php:310
1367
- msgid "Show less"
1368
  msgstr ""
1369
 
1370
- #: plugin/Html/Partials/Reviews.php:340
1371
- msgid "Site Reviews navigation"
1372
  msgstr ""
1373
 
1374
- #: plugin/Shortcodes/Buttons/Generator.php:55
1375
- msgid "Close"
1376
  msgstr ""
1377
 
1378
- #: plugin/Shortcodes/Buttons/Generator.php:56
1379
- msgid "Insert Shortcode"
1380
  msgstr ""
1381
 
1382
- #: plugin/Shortcodes/Buttons/Generator.php:61
1383
- msgid "Shortcode"
1384
  msgstr ""
1385
 
1386
- #: plugin/Shortcodes/Buttons/Generator.php:208
1387
- msgid "- Select -"
1388
  msgstr ""
1389
 
1390
- #: plugin/Shortcodes/Buttons/Generator.php:327
1391
- msgid "Some of the shortcode options are required."
1392
  msgstr ""
1393
 
1394
- #: plugin/Shortcodes/Buttons/Generator.php:334
1395
- msgctxt "the option label"
1396
- msgid "The \"%s\" option is required."
1397
  msgstr ""
1398
 
1399
- #: plugin/Shortcodes/Buttons/SiteReviews.php:31, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:31
1400
- msgid "Display"
1401
  msgstr ""
1402
 
1403
- #: plugin/Shortcodes/Buttons/SiteReviews.php:33, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:33
1404
- msgid "Which reviews would you like to display?"
1405
  msgstr ""
1406
 
1407
- #: plugin/Shortcodes/Buttons/SiteReviews.php:41, plugin/Shortcodes/Buttons/SiteReviewsForm.php:30, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:40
1408
- msgid "Category"
1409
  msgstr ""
1410
 
1411
- #: plugin/Shortcodes/Buttons/SiteReviews.php:43, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:42
1412
- msgid "Limit reviews to this category."
1413
  msgstr ""
1414
 
1415
- #: plugin/Shortcodes/Buttons/SiteReviews.php:50, plugin/Shortcodes/Buttons/SiteReviewsForm.php:39, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:48
1416
- msgid "All settings are optional."
1417
  msgstr ""
1418
 
1419
- #: plugin/Shortcodes/Buttons/SiteReviews.php:56, plugin/Shortcodes/Buttons/SiteReviewsForm.php:44, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:54
1420
- msgid "Enter a custom shortcode heading."
1421
  msgstr ""
1422
 
1423
- #: plugin/Shortcodes/Buttons/SiteReviews.php:63
1424
- msgid "Count"
1425
  msgstr ""
1426
 
1427
- #: plugin/Shortcodes/Buttons/SiteReviews.php:64
1428
- msgid "How many reviews would you like to display (default: 10)?"
1429
  msgstr ""
1430
 
1431
- #: plugin/Shortcodes/Buttons/SiteReviews.php:70
1432
- msgid "5 stars"
1433
  msgstr ""
1434
 
1435
- #: plugin/Shortcodes/Buttons/SiteReviews.php:71
1436
- msgid "4 stars"
1437
  msgstr ""
1438
 
1439
- #: plugin/Shortcodes/Buttons/SiteReviews.php:72
1440
- msgid "3 stars"
1441
  msgstr ""
1442
 
1443
- #: plugin/Shortcodes/Buttons/SiteReviews.php:73
1444
- msgid "2 stars"
1445
  msgstr ""
1446
 
1447
- #: plugin/Shortcodes/Buttons/SiteReviews.php:74
1448
- msgid "1 star"
1449
  msgstr ""
1450
 
1451
- #: plugin/Shortcodes/Buttons/SiteReviews.php:76
1452
- msgid "What is the minimum rating to display (default: 1 star)?"
1453
  msgstr ""
1454
 
1455
- #: plugin/Shortcodes/Buttons/SiteReviews.php:80
1456
- msgid "Pagination"
1457
  msgstr ""
1458
 
1459
- #: plugin/Shortcodes/Buttons/SiteReviews.php:82
1460
- msgid "Enable"
1461
  msgstr ""
1462
 
1463
- #: plugin/Shortcodes/Buttons/SiteReviews.php:83
1464
- msgid "Enable (using ajax)"
1465
  msgstr ""
1466
 
1467
- #: plugin/Shortcodes/Buttons/SiteReviews.php:84
1468
- msgid "Disable"
1469
  msgstr ""
1470
 
1471
- #: plugin/Shortcodes/Buttons/SiteReviews.php:86
1472
- msgid "When using pagination this shortcode can only be used once on a page. (default: disable)"
1473
  msgstr ""
1474
 
1475
- #: plugin/Shortcodes/Buttons/SiteReviews.php:93, plugin/Shortcodes/Buttons/SiteReviewsForm.php:58, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:78
1476
- msgid "Post ID"
1477
  msgstr ""
1478
 
1479
- #: plugin/Shortcodes/Buttons/SiteReviews.php:94
1480
- 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."
1481
  msgstr ""
1482
 
1483
- #: plugin/Shortcodes/Buttons/SiteReviews.php:98, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:83
1484
- msgid "Schema"
1485
  msgstr ""
1486
 
1487
- #: plugin/Shortcodes/Buttons/SiteReviews.php:100, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:85
1488
- msgid "Enable rich snippets"
1489
  msgstr ""
1490
 
1491
- #: plugin/Shortcodes/Buttons/SiteReviews.php:101, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:86
1492
- msgid "Disable rich snippets"
1493
  msgstr ""
1494
 
1495
- #: plugin/Shortcodes/Buttons/SiteReviews.php:103, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:88
1496
- msgid "Rich snippets are disabled by default."
1497
  msgstr ""
1498
 
1499
- #: plugin/Shortcodes/Buttons/SiteReviews.php:107, plugin/Shortcodes/Buttons/SiteReviewsForm.php:63, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:92
1500
- msgid "Classes"
1501
  msgstr ""
1502
 
1503
- #: plugin/Shortcodes/Buttons/SiteReviews.php:108, plugin/Shortcodes/Buttons/SiteReviewsForm.php:64, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:93
1504
- msgid "Add custom CSS classes to the shortcode."
1505
  msgstr ""
1506
 
1507
- #: plugin/Shortcodes/Buttons/SiteReviews.php:111, plugin/Shortcodes/Buttons/SiteReviewsForm.php:67, plugin/Shortcodes/Buttons/SiteReviewsSummary.php:96
1508
- msgid "Hide"
1509
  msgstr ""
1510
 
1511
- #: plugin/Shortcodes/Buttons/SiteReviews.php:134
1512
- msgid "Excerpt"
1513
  msgstr ""
1514
 
1515
- #: plugin/Shortcodes/Buttons/SiteReviews.php:144
1516
- msgid "Response"
1517
  msgstr ""
1518
 
1519
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:32
1520
- msgid "Automatically assign a category to reviews submitted with this shortcode."
1521
  msgstr ""
1522
 
1523
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:49
1524
- msgid "Enter a custom shortcode description."
1525
  msgstr ""
1526
 
1527
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:59
1528
- 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."
1529
  msgstr ""
1530
 
1531
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:76
1532
- msgid "Hide the email field?"
1533
  msgstr ""
1534
 
1535
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:81
1536
- msgid "Hide the name field?"
1537
  msgstr ""
1538
 
1539
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:85
1540
- msgid "Terms"
1541
  msgstr ""
1542
 
1543
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:86
1544
- msgid "Hide the terms field?"
1545
  msgstr ""
1546
 
1547
- #: plugin/Shortcodes/Buttons/SiteReviewsForm.php:91
1548
- msgid "Hide the title field?"
1549
  msgstr ""
1550
 
1551
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:58
1552
- msgid "Labels"
1553
  msgstr ""
1554
 
1555
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:59
1556
- msgid "Enter custom labels for the 1-5 star rating levels (from high to low), and separate each with a comma. The defaults labels are: \"Excellent, Very good, Average, Poor, Terrible\"."
1557
  msgstr ""
1558
 
1559
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:71
1560
- msgid "What is the minimum rating? (default: 1 star)"
1561
  msgstr ""
1562
 
1563
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:79
1564
- msgid "Limit reviews to those assigned to this post ID (separate multiple ID's with a comma). You can also enter 'post_id' to use the ID of the current page."
1565
  msgstr ""
1566
 
1567
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:104
1568
- msgid "Bars"
1569
  msgstr ""
1570
 
1571
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:105
1572
- msgid "Hide the percentage bars?"
1573
  msgstr ""
1574
 
1575
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:110
1576
- msgid "Hide the rating?"
1577
  msgstr ""
1578
 
1579
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:114
1580
- msgid "Stars"
1581
  msgstr ""
1582
 
1583
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:115
1584
- msgid "Hide the stars?"
1585
  msgstr ""
1586
 
1587
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:119
1588
- msgid "Summary"
1589
  msgstr ""
1590
 
1591
- #: plugin/Shortcodes/Buttons/SiteReviewsSummary.php:120
1592
- msgid "Hide the summary text?"
1593
  msgstr ""
1594
 
1595
- #: views/menu/addons/addons.php:3
1596
- msgid "The following Add-Ons extend the functionality of Site Reviews."
1597
  msgstr ""
1598
 
1599
- #: views/menu/addons/addons.php:12
1600
- msgid "Sync your Tripadvisor business reviews with an optional minimum rating and display them on your site."
1601
- msgstr ""
 
 
1602
 
1603
- #: views/menu/addons/addons.php:19
1604
- msgid "Sync your Yelp business reviews with an optional minimum rating and display them on your site."
1605
  msgstr ""
1606
 
1607
- #: views/menu/help/system.php:9
1608
- msgid "Download System Info"
1609
  msgstr ""
1610
 
1611
- #: views/menu/help/system.php:14
1612
- msgid "Logging"
1613
  msgstr ""
1614
 
1615
- #: views/menu/help/system.php:15
1616
- msgid "You can enable logging for debugging purposes. Log files can grow quickly, so don't leave this on."
1617
  msgstr ""
1618
 
1619
- #: views/menu/help/system.php:26
1620
- msgid "Clear Log"
1621
  msgstr ""
1622
 
1623
- #: views/menu/help/system.php:32
1624
- msgid "Download Log"
1625
  msgstr ""
1626
 
1627
- #: views/menu/help/system.php:44
1628
- msgid "Disable Logging"
1629
  msgstr ""
1630
 
1631
- #: views/menu/help/system.php:48
1632
- msgid "Enable Logging"
1633
  msgstr ""
1634
 
1635
- #: views/menu/settings/settings/strings.php:4
1636
- msgid "Search for translatable text"
1637
  msgstr ""
1638
 
1639
- #: views/menu/settings/settings/strings.php:6
1640
- msgid "Search for translatable text..."
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 &rarr;"
887
+ msgstr ""
888
+
889
+ #: plugin/Defaults/PaginationDefaults.php:20
890
+ msgid "&larr; 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 = $input['post_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\App;
 
 
 
14
 
15
  class RegisterPostType
16
  {
17
  public $args;
 
 
 
 
18
 
19
  public function __construct( $input )
20
  {
21
- $columns = [
22
- 'title' => __( 'Title', 'site-reviews' ),
23
- 'date' => __( 'Date', 'site-reviews' ),
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 array
68
  */
69
- protected function normalizeColumns( array $columns )
70
  {
71
- if( array_key_exists( 'category', $columns )) {
72
-
73
- $keys = array_keys( $columns );
 
 
 
 
 
 
 
74
 
75
- $keys[ array_search( 'category', $keys ) ] = sprintf( 'taxonomy-%s', App::TAXONOMY );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
- $columns = array_combine( $keys, $columns );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 = (object) $input;
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
- $pinned = isset( $input['pinned'] )
 
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
- protected static $PROTECTED_PROPERTIES = [
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::$PROTECTED_PROPERTIES )) {
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::$PROTECTED_PROPERTIES )) {
87
  $this->storage[$property] = $value;
88
  }
89
  else if( !isset( $this->$property )) {
@@ -95,15 +80,7 @@ abstract class Container
95
  }
96
 
97
  /**
98
- * This is the Application entry point
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
- * Resolve the given type from the container and allow unbound aliases that omit the
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
- * Register a Provider.
142
- *
143
- * @return void
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( $abstract, $concrete )
158
  {
159
- $this->bind( $abstract, $this->make( $concrete ));
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__ . "\\$abstract";
172
  }
173
  return $abstract;
174
  }
175
 
176
  /**
177
- * Throw an exception that the concrete is not instantiable.
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
- return $this->notInstantiable( $concrete );
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 BaseController
20
  {
21
  /**
22
- * Change the assigned Post ID of a review
23
  */
24
- public function ajaxChangeAssignedTo( $request )
25
  {
26
- wp_send_json( $this->html->renderPartial( 'link', [
27
- 'post_id' => $request['ID'],
28
- ]));
29
  }
30
 
31
  /**
32
- * Change a review status
33
- *
34
- * @since 2.0.0
35
  */
36
- public function ajaxChangeReviewStatus( $request )
37
  {
38
- $response = $this->execute( new ChangeStatus( $request ));
39
- wp_send_json( $response );
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
- * Dismisses the outdated notice
56
  */
57
- public function ajaxDismissOutdatedNotice()
58
  {
59
- $this->db->setOption( 'upgrade_notice_dismissed', true );
60
- wp_send_json_success();
 
 
61
  }
62
 
63
  /**
64
- * Load the shortcode dialog fields
65
- *
66
- * @param array $request
67
  */
68
- public function ajaxMceShortcode( $request )
69
  {
70
  $shortcode = $request['shortcode'];
71
  $response = false;
72
- if( array_key_exists( $shortcode, glsr_app()->mceShortcodes )) {
73
- $data = glsr_app()->mceShortcodes[ $shortcode ];
74
  if( !empty( $data['errors'] )) {
75
- $data['btn_okay'] = [ esc_html__( 'Okay', 'site-reviews' ) ];
76
  }
77
  $response = [
78
- 'body' => $data['fields'],
79
- 'close' => $data['btn_close'],
80
- 'ok' => $data['btn_okay'],
81
  'shortcode' => $shortcode,
82
- 'title' => $data['title'],
83
  ];
84
  }
85
- wp_send_json( $response );
86
  }
87
 
88
  /**
89
- * Submit a review
90
  */
91
- public function ajaxPostReview( $request )
92
  {
93
- $response = $this->app->make( 'Controllers\ReviewController' )->postSubmitReview( $request );
94
- $session = $this->app->make( 'Session' );
95
- wp_send_json([
96
- 'errors' => $session->get( "{$request['form_id']}-errors", false, true ),
97
- 'message' => $response,
98
- 'recaptcha' => $session->get( "{$request['form_id']}-recaptcha", false, true ),
99
  ]);
100
  }
101
 
102
  /**
103
- * Search available language strings
104
  */
105
- public function ajaxSearchPosts( $request )
106
  {
 
107
  wp_send_json_success([
108
- 'empty' => sprintf( '<div>%s</div>', __( 'Nothing found.', 'site-reviews' )),
109
- 'items' => $this->db->searchPosts( $request['search'] ),
110
  ]);
111
  }
112
 
113
  /**
114
- * Search available language strings
115
  */
116
- public function ajaxSearchTranslations( $request )
117
  {
118
  if( empty( $request['exclude'] )) {
119
  $request['exclude'] = [];
120
  }
121
- $results = $this->app->make( 'Translator' )
122
  ->search( $request['search'] )
123
  ->exclude()
124
  ->exclude( $request['exclude'] )
125
  ->renderResults();
126
  wp_send_json_success([
127
- 'empty' => sprintf( '<div>%s</div>', __( 'Nothing found.', 'site-reviews' )),
128
  'items' => $results,
129
  ]);
130
  }
131
 
132
  /**
133
- * Toggle the pinned status of a review
134
  */
135
- public function ajaxTogglePinned( $request )
136
  {
137
- $response = $this->execute( new TogglePinned( $request ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
- wp_send_json([
140
- 'notices' => $this->notices->show( false ),
141
- 'pinned' => (bool) $response,
 
 
 
 
 
 
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
+ ? '&mdash;'
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 = '&mdash;';
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\App;
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\BaseController;
22
- use GeminiLabs\SiteReviews\Strings;
23
- use WP_Admin_Bar;
24
- use WP_Post;
25
 
26
- class MainController extends BaseController
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( !$this->app->hasPermission() )return;
243
-
244
  $command = new RegisterPostType([
245
- 'single' => __( 'Review', 'site-reviews' ),
246
- 'plural' => __( 'Reviews', 'site-reviews' ),
247
- 'menu_name' => __( 'Site Reviews', 'site-reviews' ),
248
- 'menu_icon' => 'dashicons-star-half',
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' => __( 'Author', 'site-reviews' ),
258
- 'type' => __( 'Type', 'site-reviews' ),
259
- 'stars' => __( 'Rating', 'site-reviews' ),
260
- 'sticky' => __( 'Pinned', 'site-reviews' ),
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' => true,
410
- 'meta_box_cb' => 'glsr_categories_meta_box',
411
- 'public' => false,
 
412
  'show_admin_column' => true,
413
- 'show_ui' => true,
 
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
- 'title' => __( 'Recent Site Reviews', 'site-reviews' ),
429
- 'description' => __( 'Your site’s most recent Local Reviews.', 'site-reviews' ),
430
- 'class' => 'glsr-widget glsr-widget-recent-reviews',
431
  ],
432
  'site-reviews-form' => [
433
- 'title' => __( 'Submit a Site Review', 'site-reviews' ),
434
  'description' => __( 'A "submit a review" form for your site.', 'site-reviews' ),
435
- 'class' => 'glsr-widget glsr-widget-reviews-form',
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
- 'system' => __( 'System Info', 'site-reviews' ),
500
- ],[
501
- 'system_info' => $this->app->make( 'SystemInfo' ),
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
- : '&mdash;';
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\App;
14
- use GeminiLabs\SiteReviews\Commands\SubmitReview;
15
- use GeminiLabs\SiteReviews\Controllers\BaseController;
16
- use GeminiLabs\SiteReviews\Strings;
 
 
17
  use WP_Post;
18
- use WP_Screen;
19
 
20
- class ReviewController extends BaseController
21
  {
22
  /**
 
 
 
 
 
 
23
  * @return void
 
24
  */
25
- public function approve()
26
  {
27
- check_admin_referer( 'approve-review_' . ( $post_id = $this->getPostId() ));
28
-
29
- wp_update_post([
30
- 'ID' => $post_id,
31
- 'post_status' => 'publish',
32
- ]);
33
-
34
- wp_safe_redirect( wp_get_referer() );
35
- exit;
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
- * Modify the WP_Editor html to allow autosizing without breaking the `editor-expand` script
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 current_screen
115
  */
116
- public function modifyFeatures( WP_Screen $screen )
117
  {
118
- if( $this->canEditReview()
119
- || $screen->post_type != App::POST_TYPE
120
- )return;
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
- $scheduled_date = date_i18n( 'M j, Y @ H:i', strtotime( $post->post_date ));
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 save_post_{static::POST_TYPE}
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 saveEditedReview( $post_id )
439
  {
440
- $this->saveAssignedToMetabox( $post_id );
441
- $this->saveResponseMetabox( $post_id );
442
  }
443
 
444
  /**
445
- * @param int $post_id
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 setPermissions()
466
  {
467
- foreach( wp_roles()->roles as $role => $value ) {
468
- wp_roles()->remove_cap( $role, sprintf( 'create_%s', App::POST_TYPE ));
469
- }
470
  }
471
 
472
  /**
 
 
 
 
473
  * @return void
 
474
  */
475
- public function unapprove()
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
- return glsr_current_screen()->post_type == App::POST_TYPE
521
- && glsr_current_screen()->id == App::POST_TYPE
522
- && glsr_current_screen()->base == 'post';
523
- }
524
-
525
- /**
526
- * @param int $post_id
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 $post_id
572
- * @param int $message_index
573
  * @return void
574
  */
575
- protected function redirect( $post_id, $message_index )
576
  {
577
- $referer = wp_get_referer();
578
-
579
- $hasReferer = !$referer
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
- protected function updateAssignedToPost( WP_Post $review )
596
  {
597
- if( !( $post = $this->getAssignedToPost( $review->ID )))return;
598
- $reviewIds = get_post_meta( $post->ID, '_glsr_review_id' );
599
- if( !is_array( $reviewIds ))return;
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
- protected function updateReviewIdOfPost( WP_Post $post, WP_Post $review, array $reviewIds )
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
- $minContentLength = apply_filters( 'site-reviews/local/review/content/minLength', '0' );
690
-
691
- $defaultRules = apply_filters( 'site-reviews/validation/rules', [
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\App;
14
- use GeminiLabs\SiteReviews\Database\Options;
15
- use GeminiLabs\SiteReviews\Database\OptionsContract;
16
- use GeminiLabs\SiteReviews\Commands\SubmitReview;
 
 
 
17
  use WP_Query;
18
 
19
- class Database implements OptionsContract
20
  {
21
- use Options;
22
-
23
  /**
24
- * @var App
25
- */
26
- protected $app;
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 createReview( array $meta, $command )
40
  {
41
- // make sure we set post_meta fallback defaults
42
- $meta = wp_parse_args( $meta, [
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
- // add post_meta
83
- foreach( $meta as $field => $value ) {
84
- update_post_meta( $post_id, $field, $value );
 
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|array
145
  */
146
  public function getReviewCount( $metaKey = '', $metaValue = '' )
147
  {
148
- $metaKey = $this->normalizeMetaKey( $metaKey );
149
  if( !$metaKey ) {
150
- return (array) wp_count_posts( App::POST_TYPE );
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] ) ? $counts[$metaValue] : 0;
 
 
175
  }
176
 
177
  /**
178
- * Get the review post ID from the review_id meta value
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 getReviewIds( $reviewType )
206
  {
207
- global $wpdb;
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
- * Get an object of meta values for a review
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( $keys, $status = 'publish' )
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
- $keys = $query->buildSqlOr( $keys, "pm.meta_key = '%s'" );
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
- * Get an array of taxonomy terms
353
- *
354
- * @param string $taxonomy
355
  * @return array
356
  */
357
- public function getTerms( $taxonomy = '', array $args = [] )
358
  {
359
- !empty( $taxonomy ) ?: $taxonomy = App::TAXONOMY;
360
- $terms = get_terms( $taxonomy, wp_parse_args( $args, [
361
- 'fields' => 'id=>name',
362
- 'hide_empty' => false,
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 $metaKey;
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 normalizeTerms( $terms, $taxonomy = '' )
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
- $post = get_post( $postId );
442
- if( !isset( $post->post_type ) || $post->post_type != App::POST_TYPE ) {
443
- return 0;
444
- }
445
- delete_post_meta( $post->ID, '_edit_last' );
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
- $results = '';
473
- $query = $this->app->make( 'Query' );
474
- add_filter( 'posts_search', [$query, 'filterSearchByTitle'], 500, 2 );
475
  $search = new WP_Query( $args );
476
- remove_filter( 'posts_search', [$query, 'filterSearchByTitle'], 500 );
477
- if( $search->have_posts() ) {
478
- while( $search->have_posts() ) {
479
- $search->the_post();
480
- ob_start();
481
- $this->app->make( 'Controllers\MainController' )->render( 'edit/search-result', [
482
- 'ID' => get_the_ID(),
483
- 'permalink' => esc_url( (string) get_permalink() ),
484
- 'title' => esc_attr( get_the_title() ),
485
- ]);
486
- $results .= ob_get_clean();
487
- }
488
- wp_reset_postdata();
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 &rarr;', 'site-reviews' ),
20
+ 'prev_text' => __( '&larr; 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( '&lt;&gt; ', '', $message );
171
- $message = str_replace( ']]>', ']]&gt;', $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' => $command->id,
24
  'post_status' => $command->status,
25
  ]);
 
 
 
 
 
 
 
 
 
 
26
 
 
 
 
 
 
 
27
  $title = _draft_or_post_title( $postId );
 
 
 
 
 
 
28
 
29
- $link = sprintf( '<a class="row-title" href="%s" title="%s">%s</a>',
30
- get_edit_post_link( $postId ),
31
- esc_attr( sprintf( '%s &#8220;%s&#8221;', __( 'Edit', 'site-reviews' ), $title )),
32
- $title
33
- );
34
-
35
  ob_start();
36
- _post_states( get_post( $postId ));
37
- $state = ob_get_clean();
 
38
 
39
- return [
40
- 'class' => sprintf( 'status-%s', $command->status ),
41
- 'link' => $link . $state,
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' => '&#8220;'.esc_attr( $title ).'&#8221; ('.__( '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
- extract( $command->args );
47
-
48
- $post_type = App::POST_TYPE;
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 : '&mdash;';
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 ReflectionException;
16
 
17
  class RegisterShortcodes
18
  {
@@ -21,20 +12,13 @@ class RegisterShortcodes
21
  */
22
  public function handle( Command $command )
23
  {
24
- foreach( $command->shortcodes as $key ) {
25
- try {
26
-
27
- $shortcodeClass = glsr_resolve( 'Helper' )->buildClassName( $key, 'GeminiLabs\SiteReviews\Shortcodes' );
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\App;
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( App::TAXONOMY, App::POST_TYPE, $command->args );
34
- register_taxonomy_for_object_type( App::TAXONOMY, App::POST_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 Exception;
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
- $widgetClass = glsr_resolve( 'Helper' )->buildClassName( $key, 'GeminiLabs\SiteReviews\Widgets' );
28
-
29
- try {
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\Notices;
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
- ? __( 'The review is pinned.', 'site-reviews' )
44
- : __( 'The review is unpinned.', 'site-reviews' );
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\App;
14
- use GeminiLabs\SiteReviews\Database;
15
- use Vectorface\Whip\Whip;
16
 
17
  class Helper
18
  {
19
  /**
20
- * @var App
 
 
21
  */
22
- protected $app;
 
 
 
 
 
 
 
23
 
24
  /**
25
- * @var Database
 
 
26
  */
27
- protected $db;
28
-
29
- public function __construct( App $app, Database $db )
30
  {
31
- $this->app = $app;
32
- $this->db = $db;
33
  }
34
 
35
  /**
36
  * @param string $name
37
- * @param string $path
38
  * @return string
39
  */
40
- public function buildClassName( $name, $path = '' )
41
  {
42
- $className = array_map( 'ucfirst', array_map( 'strtolower', (array) preg_split( '/[-_]/', $name )));
43
- $className = implode( '', $className );
44
- return !empty( $path )
45
- ? str_replace( '\\\\', '\\', sprintf( '%s\%s', $path, $className ))
46
- : $className;
47
  }
48
 
49
  /**
50
- * @param string $name
51
- * @param string $prefix
52
  * @return string
53
  */
54
- public function buildMethodName( $name, $prefix = 'get' )
55
  {
56
- return $prefix . $this->buildClassName( $name );
 
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 = $prefix.( empty( $prefix ) ? '' : '.' ).$key;
91
- if( $this->isSimpleArray( $value )) {
92
- $value = '['.implode( ', ', $value ).']';
93
- }
94
- if( is_array( $value )) {
95
- $result = array_merge( $result, $this->flattenArray( $value, $newKey ));
96
  }
97
- else {
98
- $result[$newKey] = $value;
 
99
  }
 
100
  }
101
  return $result;
102
  }
103
 
104
  /**
105
- * @param string $name
106
- * @return mixed
107
  */
108
- public function get( $name )
109
  {
110
- $method = $this->buildMethodName( $name );
111
- if( !method_exists( $this, $method ))return;
112
- return call_user_func_array([ $this, $method ], array_slice( func_get_args(), 1 ));
 
 
 
 
 
 
 
113
  }
114
 
115
  /**
116
- * @return null|string
 
 
 
117
  */
118
- public function getIpAddress()
119
  {
120
- $cloudflareHeaders = [];
121
- $cloudflareIPv4 = wp_remote_get( 'https://www.cloudflare.com/ips-v4' );
122
- $cloudflareIPv6 = wp_remote_get( 'https://www.cloudflare.com/ips-v6' );
123
- if( !is_wp_error( $cloudflareIPv4 )) {
124
- $cloudflareHeaders[Whip::IPV4] = array_filter( explode( PHP_EOL, wp_remote_retrieve_body( $cloudflareIPv4 )));
 
125
  }
126
- if( !is_wp_error( $cloudflareIPv6 )) {
127
- $cloudflareHeaders[Whip::IPV6] = array_filter( explode( PHP_EOL, wp_remote_retrieve_body( $cloudflareIPv6 )));
 
 
 
 
 
 
 
 
 
 
 
128
  }
129
- $ipAddress = (new Whip( Whip::CLOUDFLARE_HEADERS | Whip::REMOTE_ADDR, [
130
- Whip::CLOUDFLARE_HEADERS => $cloudflareHeaders,
131
- ]))->getValidIpAddress();
132
- return $ipAddress ? $ipAddress : null;
 
 
133
  }
134
 
135
  /**
136
- * @param string $needle
137
- * @param string $haystack
138
  * @return bool
139
  */
140
- public function startsWith( $needle, $haystack )
141
  {
142
- return substr( $haystack, 0, strlen( $needle )) === $needle;
 
 
 
 
 
 
 
 
 
 
143
  }
144
 
145
  /**
146
- * @param string $optionPath
147
- * @param mixed $fallback
148
- * @return mixed
149
  */
150
- protected function getOption( $optionPath, $fallback )
151
  {
152
- return !empty( $optionPath )
153
- ? $this->db->getOption( $optionPath, $fallback, 'settings' )
154
- : '';
 
 
 
 
 
 
 
 
 
 
 
155
  }
156
 
157
  /**
158
  * @return array
159
  */
160
- protected function getOptions()
161
  {
162
- return $this->db->getOptions( 'settings' );
 
 
 
 
 
 
 
163
  }
164
 
165
  /**
166
- * @param int $postId
167
- * @return null|object
 
168
  */
169
- protected function getReview( $postId )
170
  {
171
- return $this->db->getReview( get_post( $postId ));
 
 
172
  }
173
 
174
  /**
 
 
 
175
  * @return array
176
  */
177
- protected function getReviews( array $args = [] )
178
  {
179
- return $this->db->getReviews( $args )->reviews;
 
 
 
 
 
 
 
 
 
 
180
  }
181
 
182
  /**
183
- * @param mixed $array
184
- * @return bool
185
  */
186
- protected function isSimpleArray( $array )
187
  {
188
- if( !is_array( $array ) || array_filter( $array, 'is_array' )) {
189
- return false;
 
 
 
 
190
  }
191
- $current = 0;
192
- foreach( array_keys( $array ) as $key ) {
193
- if( $key !== $current ) {
194
- return false;
195
- }
196
- $current++;
197
- }
198
- return true;
 
 
 
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