├── .distignore ├── .editorconfig ├── .github └── workflows │ ├── phpcs.yml │ ├── push-asset-readme-update.yml │ └── push-to-deploy.yml ├── .gitignore ├── .wordpress-org ├── banner-1544x500.png ├── banner-772x250.png ├── icon-128x128.png ├── icon-256x256.png ├── screenshot-1.png ├── screenshot-2.png ├── screenshot-3.png └── screenshot-4.png ├── Gruntfile.js ├── README.md ├── admin ├── bsf-analytics │ ├── assets │ │ └── css │ │ │ ├── minified │ │ │ ├── style-rtl.min.css │ │ │ └── style.min.css │ │ │ └── unminified │ │ │ ├── style-rtl.css │ │ │ └── style.css │ ├── class-bsf-analytics-loader.php │ ├── class-bsf-analytics-stats.php │ ├── class-bsf-analytics.php │ ├── classes │ │ └── class-bsf-analytics-helper.php │ ├── composer.json │ ├── modules │ │ └── deactivation-survey │ │ │ ├── assets │ │ │ ├── css │ │ │ │ ├── feedback-rtl.css │ │ │ │ ├── feedback-rtl.min.css │ │ │ │ ├── feedback.css │ │ │ │ └── feedback.min.css │ │ │ └── js │ │ │ │ ├── feedback.js │ │ │ │ └── feedback.min.js │ │ │ └── classes │ │ │ └── class-deactivation-survey-feedback.php │ └── version.json ├── css │ ├── admin.css │ └── style.css ├── images │ ├── code-in-page.php.png │ ├── code-in-single.php.png │ ├── icon.png │ ├── icon_32.png │ └── sidebar.jpg ├── index.php └── js │ ├── jquery.easytabs.min.js │ └── jquery.hashchange.min.js ├── bin └── block-commits-with-merge-conflict.sh ├── cghooks.lock ├── composer.json ├── composer.lock ├── css ├── delete.gif ├── jquery.rating.css ├── rating.css ├── star.gif ├── star.png └── style.css ├── functions.php ├── images ├── 1star.gif ├── 1star.png ├── 2star.gif ├── 3star.gif ├── 4star.gif ├── 5star.gif ├── acf.png ├── adam-circle.jpg ├── bill.jpg ├── click.png ├── custom.png ├── gray-32.png ├── gray.png ├── ico-delete.png ├── icon.png ├── icons.png ├── kylevan.png ├── latest.png ├── quick.png ├── search.png ├── seo.png ├── star.png └── website.png ├── index.php ├── init.php ├── js ├── cmb.js ├── cp-script.min.js ├── jquery.js ├── jquery.rating.min.js ├── jquery.timePicker.min.js ├── media.js ├── retina.js └── toggle.js ├── languages ├── all-in-one-schemaorg-rich-snippets-nl_NL.mo ├── all-in-one-schemaorg-rich-snippets-nl_NL.po └── all-in-one-schemaorg-rich-snippets.pot ├── lib ├── class-aiosrs-nps-survey.php ├── notices │ ├── class-astra-notices.php │ ├── composer.json │ ├── notices.css │ └── notices.js └── nps-survey │ ├── changelog.txt │ ├── classes │ └── nps-survey-script.php │ ├── composer.json │ ├── dist │ ├── main.asset.php │ ├── main.js │ ├── style-main-rtl.css │ └── style-main.css │ ├── nps-survey-plugin-loader.php │ ├── nps-survey.php │ └── version.json ├── meta-boxes.php ├── package-lock.json ├── package.json ├── phpcs-report.xml ├── phpcs.xml.dist ├── phpstan-baseline.neon ├── phpstan.neon ├── readme.txt ├── settings.php ├── stubs-generator.php └── tests └── php └── stubs └── aiosrs-stubs.php /.distignore: -------------------------------------------------------------------------------- 1 | # A set of files you probably don't want in your WordPress.org distribution 2 | .distignore 3 | .editorconfig 4 | .git 5 | .gitignore 6 | .gitlab-ci.yml 7 | .travis.yml 8 | .DS_Store 9 | Thumbs.db 10 | behat.yml 11 | bin 12 | circle.yml 13 | composer.json 14 | composer.lock 15 | Gruntfile.js 16 | package.json 17 | package-lock.json 18 | phpunit.xml 19 | phpunit.xml.dist 20 | phpstan-baseline.neon 21 | phpstan.neon 22 | stubs-generator.php 23 | multisite.xml 24 | multisite.xml.dist 25 | phpcs.xml 26 | phpcs.xml.dist 27 | README.md 28 | wp-cli.local.yml 29 | yarn.lock 30 | tests 31 | vendor 32 | node_modules 33 | *.sql 34 | *.tar.gz 35 | *.zip 36 | package-lock.json 37 | .github 38 | .wordpress-org -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | indent_style = tab 15 | indent_size = 4 16 | 17 | [{.jshintrc,*.json,*.yml}] 18 | indent_style = space 19 | indent_size = 2 20 | 21 | [{*.txt,wp-config-sample.php}] 22 | end_of_line = crlf 23 | -------------------------------------------------------------------------------- /.github/workflows/phpcs.yml: -------------------------------------------------------------------------------- 1 | name: PHPCS check 2 | 3 | # Run the deployment only when code is committed to the branch. 4 | on: pull_request 5 | 6 | # Cancels all previous workflow runs for pull requests that have not completed. 7 | concurrency: 8 | # The concurrency group contains the workflow name and the branch name for pull requests 9 | # or the commit hash for any other events. 10 | group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} 11 | cancel-in-progress: true 12 | 13 | jobs: 14 | phpcs: 15 | name: PHPCS 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v2 20 | 21 | - name: Setup PHP 22 | uses: shivammathur/setup-php@v2 23 | with: 24 | php-version: 7.4 25 | coverage: none 26 | tools: composer, cs2pr 27 | 28 | - name: Install composer dependencies 29 | run: composer config github-oauth.github.com ${{ secrets.PRIVATE_ACCESS_TOKEN }} && composer install --prefer-dist --no-suggest --no-progress 30 | 31 | - name: Run phpcs 32 | id: phpcs 33 | if: always() 34 | run: ./vendor/bin/phpcs --report-full --report-checkstyle=./phpcs-report.xml 35 | -------------------------------------------------------------------------------- /.github/workflows/push-asset-readme-update.yml: -------------------------------------------------------------------------------- 1 | name: Plugin asset/readme update 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | master: 8 | name: Push to master 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: WordPress.org plugin asset/readme update 13 | uses: 10up/action-wordpress-plugin-asset-update@stable 14 | env: 15 | SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} 16 | SVN_USERNAME: ${{ secrets.SVN_USERNAME }} 17 | -------------------------------------------------------------------------------- /.github/workflows/push-to-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to WordPress.org 2 | on: 3 | push: 4 | tags: 5 | - "*" 6 | jobs: 7 | tag: 8 | name: New tag 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: WordPress Plugin Deploy 13 | uses: 10up/action-wordpress-plugin-deploy@master 14 | env: 15 | SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} 16 | SVN_USERNAME: ${{ secrets.SVN_USERNAME }} 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore PHPStorm extra directories 2 | .idea/ 3 | 4 | # OS specific files 5 | .DS_Store 6 | 7 | # Leave node_modules from git 8 | node_modules/ 9 | 10 | # sass cache 11 | .sass-cache 12 | 13 | # ignore PHPCS report files 14 | phpcs-summary.log 15 | phpcs-full.log 16 | 17 | # Org Package 18 | *.zip 19 | 20 | # Ignore Composer's directories 21 | vendor/ 22 | 23 | # ignore PHPStorm extra directories 24 | .vscodecghooks.lock 25 | 26 | -------------------------------------------------------------------------------- /.wordpress-org/banner-1544x500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/banner-1544x500.png -------------------------------------------------------------------------------- /.wordpress-org/banner-772x250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/banner-772x250.png -------------------------------------------------------------------------------- /.wordpress-org/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/icon-128x128.png -------------------------------------------------------------------------------- /.wordpress-org/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/icon-256x256.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/screenshot-1.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/screenshot-2.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/screenshot-3.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/.wordpress-org/screenshot-4.png -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | "use strict"; 3 | 4 | // Project configuration 5 | grunt.initConfig({ 6 | pkg: grunt.file.readJSON("package.json"), 7 | 8 | addtextdomain: { 9 | options: { 10 | textdomain: "rich-snippets", 11 | }, 12 | update_all_domains: { 13 | options: { 14 | updateDomains: true, 15 | }, 16 | src: [ 17 | "*.php", 18 | "**/*.php", 19 | "!.git/**/*", 20 | "!bin/**/*", 21 | "!node_modules/**/*", 22 | "!tests/**/*", 23 | ], 24 | }, 25 | }, 26 | 27 | wp_readme_to_markdown: { 28 | your_target: { 29 | files: { 30 | "README.md": "readme.txt", 31 | }, 32 | }, 33 | }, 34 | 35 | makepot: { 36 | target: { 37 | options: { 38 | domainPath: "/languages", 39 | exclude: [".git/*", "bin/*", "node_modules/*", "tests/*"], 40 | mainFile: "index.php", 41 | potFilename: "all-in-one-schemaorg-rich-snippets.pot", 42 | potHeaders: { 43 | poedit: true, 44 | "x-poedit-keywordslist": true, 45 | }, 46 | type: "wp-plugin", 47 | updateTimestamp: true, 48 | }, 49 | }, 50 | }, 51 | 52 | compress: { 53 | main: { 54 | options: { 55 | archive: "all-in-one-schemaorg-rich-snippets.zip", 56 | }, 57 | files: [ 58 | { 59 | src: [ 60 | "**/*", 61 | "!node_modules/**", 62 | "!tests/**", 63 | "!.git/**", 64 | "!bin/**", 65 | '!phpstan-baseline.neon', 66 | '!phpstan.neon', 67 | '!stubs-generator.php', 68 | ], 69 | dest: "/", 70 | }, 71 | ], 72 | }, 73 | }, 74 | }); 75 | 76 | grunt.loadNpmTasks("grunt-wp-i18n"); 77 | grunt.loadNpmTasks("grunt-wp-readme-to-markdown"); 78 | grunt.loadNpmTasks("grunt-contrib-compress"); 79 | 80 | grunt.registerTask("i18n", ["addtextdomain", "makepot"]); 81 | grunt.registerTask("readme", ["wp_readme_to_markdown"]); 82 | grunt.registerTask("zip", ["compress"]); // Add this line to register the zip task 83 | 84 | grunt.util.linefeed = "\n"; 85 | }; 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Schema - All In One Schema Rich Snippets # 2 | **Contributors:** [brainstormforce](https://profiles.wordpress.org/brainstormforce) 3 | **Donate link:** https://www.paypal.me/BrainstormForce 4 | **Tags:** schema markup, rich snippets, wordpress seo, structured data, google search 5 | **Requires at least:** 3.7 6 | **Tested up to:** 6.8 7 | **Stable tag:** 1.7.2 8 | **Requires PHP:** 7.4 9 | **License:** GPLv2 or later 10 | **License URI:** http://www.gnu.org/licenses/gpl-2.0.html 11 | 12 | Improve SEO, elevate rankings and Boost CTR. Supports different types of content and works well with Google, Bing, Yahoo, and Facebook. 13 | 14 | ## Description ## 15 | Get eye-catching results in search engines with the most popular schema markup plugin. Easy implementation of schema types like Review, Events, Recipes, Article, Products, Services etc 16 | 17 | [Try Live Demo of All In One Schema Rich Snippets](https://zipwp.org/plugins/all-in-one-schemaorg-rich-snippets/) 18 | 19 | ### What is a Rich Snippet? ### 20 | It is basically a short summary of your page in the search results of Google, Yahoo, Bing and sometimes in the News feed of Facebook in nice format with star ratings, author photo, image, etc. 21 | 22 | [See Examples of Rich Snippets Here.](https://wpschema.com/free-rich-snippets-schema-plugin-for-wordpress/?utm_source=wp-org-readme&utm_medium=rich-snippet-example "Rich Snippets Examples") 23 | 24 | ### How does a Rich Snippet help you? ### 25 | * It provides only the essential and accurate information for search engines to display in search result snippets. 26 | * Rich snippets are highly interactive, featuring photos, star ratings, prices, authors, and more, helping you stand out from the competition. 27 | * Helps you rank higher in search results 28 | * Helps Facebook display proper information when users share your links on Facebook 29 | * **[Check the difference it makes](https://wpschema.com/free-rich-snippets-schema-plugin-for-wordpress/ "See the difference")** in Click Through Rate (CTR) 30 | 31 | ### Supported Content Types: ### 32 | This plugin supports the following types of Schemas: 33 | 34 | * Review 35 | * Event 36 | * People 37 | * Product 38 | * Recipe 39 | * Software Application 40 | * Video 41 | * Articles 42 | 43 | ### Future release would include: ### 44 | * Breadcrumbs 45 | * Local Business 46 | * Books 47 | 48 | ### Want to contribute to the plugin? ### 49 | You may now contribute to the plugin on Github: [All in one Schema.org Rich Snippets on Github](https://github.com/brainstormforce/All-In-One-Schema.org-Rich-Snippets "Contribute on Github") 50 | 51 | ## Installation ## 52 | ### Through Dashboard ### 53 | 1. Go to Plugins 54 | 1. Add New 55 | 1. Search for "All in One Schema.org Rich Snippets" Or Upload the plugins zip file 56 | 57 | ### Through FTP ### 58 | 1. Upload the plugin into `wp-content/plugins` directory 59 | 1. Activate the plugin through the 'Plugins' menu in WordPress 60 | 1. That's It. 61 | 62 | Now go ahead and create a new post. Select the post type from the dropdown in the meta box, fill in the details, and publish it. 63 | 64 | Google will start showing rich snippets in the search results, as soon as your post is crawled. 65 | 66 | You can test the rich snippet on Google Webmasters Rich Snippets Testing Tool 67 | 68 | ## Frequently Asked Questions ## 69 | ### What is a Rich Snippet? ### 70 | The All in One Schema Rich Snippets plugin helps you add structured data markup to your WordPress website, enabling search engines to display rich snippets like star ratings, reviews, recipes, events, and more in search results. 71 | ### How does this plugin improve SEO? ### 72 | By adding schema markup, the plugin enhances search engine understanding of your content, increasing the chances of rich snippets appearing in search results, which can improve click-through rates (CTR) and SEO performance. 73 | ### Which Content Types are Supported? ### 74 | This plugin currently supports almost all of the content types that are released by Schema.org at one place. 75 | ### Do I need coding knowledge to use this plugin?### 76 | No, the plugin provides an easy-to-use interface where you can add schema markup without any coding. 77 | 78 | ## Screenshots ## 79 | 1. Meta box in post-new under the editor screen. 80 | 2. Select content type from dropdown 81 | 3. Fill the details as much as you can 82 | 4. Test the post or page URL in Google Rich Snippets Testing 83 | 84 | ## Changelog ## 85 | 86 | ### 1.7.2 ### 87 | - Fixed: Resolved the issue for function _load_textdomain_just_in_time was called incorrectly in WP 6.8. 88 | 89 | ### 1.7.1 ### 90 | - Improved security and updated the slug for better compatibility. 91 | - This update includes important security fixes, improved accessibility compliance, and ensures a consistent text domain throughout the plugin. 92 | 93 | ### 1.7.0 ### 94 | - New: Added NPS Survey to gather your valuable feedback for All In One Schema Rich Snippets. 95 | - Improvement: Enhanced the codebase to strengthen security measures. 96 | 97 | ### 1.6.13 ### 98 | * Improvement: Compatibility with WordPress 6.7. 99 | * Improvement: Updated the video uploadDate field to use the d-m-y format. 100 | 101 | ### 1.6.12 ### 102 | * Improvement: Added Product Image field in Review Schema. 103 | * Improvement: Updated plugin metadata tags to improve search optimization. 104 | 105 | ### 1.6.11 ### 106 | * Fixed: Improved code quality syntax and security checks for better coding standards and practices. 107 | * Fixed: Recipe - Author type fix. 108 | * Fixed: Video Upload Date issue. 109 | 110 | ### 1.6.10 ### 111 | * Fixed: Corrected the uploadDate format as per ISO 8601 standards with timezone. 112 | * Fixed: Resolved url redirect issue for Test Rich Snippets button. 113 | 114 | ### 1.6.9 ### 115 | * Improvement: Improved plugin codebase for better security. 116 | 117 | ### 1.6.8 ### 118 | * Fixed: Ratings not visible on single product pages with Divi theme. 119 | 120 | ### 1.6.7 ### 121 | * Fixed: Customizer not loading when All In One Schema Rich Snippets plugin is active. 122 | 123 | ### 1.6.6 ### 124 | * Props to Patchstack for reporting security issues. Those are fixed in this release. Plus we've hardened security in other areas of the plugin. 125 | 126 | ### 1.6.5 ### 127 | * Fixed: Code updated according to coding standard. 128 | 129 | ### 1.6.4 ### 130 | * Improvement - Hardened the security of the plugin. 131 | * Fixed: Reset functionality was not working in the backend settings. 132 | * Fixed: Console warning jquery-fn-load-is-deprecated. 133 | 134 | ### 1.6.3 ### 135 | * Improvement: Compatibility with WordPress 5.5. 136 | * Improvement: Updated the Hashchange jquery. 137 | * Fixed: Tabs UI breaks in the backend. 138 | 139 | ### 1.6.2 ### 140 | * New: Users can now share non-personal usage data to help us test and develop better products. (https://store.brainstormforce.com/usage-tracking/?utm_source=wp_dashboard&utm_medium=general_settings&utm_campaign=usage_tracking) 141 | 142 | ### 1.6.1 ### 143 | * Improvement: Compatibility with the latest WordPress PHP_CodeSniffer rules. 144 | * Improvement: Updated the Schema URL to the https instead of HTTP. 145 | * Fixed: Tabs conflict with the Astra theme. 146 | * Fixed: Image field is required error showing in the Recipe schema. 147 | * Fixed: Remove the support for Rating in the service schema as per the new Google update. 148 | 149 | ### 1.6.0 ### 150 | * New: Added ItemReviewed types in Review schema. 151 | * Fixed: error "Thing is not a known valid target type for the item reviewed the property" in the review schema. 152 | 153 | ### 1.5.6 ### 154 | * Improvement: Updated plugin name - `All In One Schema Rich Snippets` to `Schema - All In One Schema Rich Snippets`. 155 | * Improvement: Updated product availability strings according to the Google requirement. 156 | * Improvement: Added alt tag to the publisher image for SEMrush plugin compatibility. 157 | 158 | ### 1.5.5 ### 159 | * Fixed: Schema markup displayed before the post content or hidden when page content is built using a page builder plugin. 160 | 161 | ### 1.5.4 ### 162 | * Improvement: Dashboard UI Updated. 163 | * Fixed: Removed publisher logo width-height meta tags. 164 | * Fixed: Removed default border CSS for images in frontend. 165 | 166 | ### 1.5.3 ### 167 | * Improvement: Updated schema exiting action and enqueue files function. 168 | 169 | ### 1.5.2 ### 170 | * Fixed: Frontend Summary box structure validation issue. 171 | * Fixed: Editor object undefined issue lead js issue in the page. 172 | 173 | ### 1.5.1 ### 174 | * Fixed: Plugin outputting extra output causing Ajax calls to break after last update. 175 | 176 | ### 1.5.0 ### 177 | * Improvement: Improved overall the security of the plugin by using sanitization and escaping the attributes wherever possible, checking nounce and user capabilities before any actions are performed. 178 | * Fixed: XSS Vulnerability in the settings page, Thanks for the report Neven Biruski (DefenseCode). 179 | * Fixed: Missing closing div tag in the generated schema markup breaking style for some themes. 180 | * Fixed: Load the external scripts without protocol to prevent it from breaking on https sites. 181 | 182 | ### 1.4.4 ### 183 | * Fixed: PHP fatal error to older version of PHP 184 | 185 | ### 1.4.3 ### 186 | * Fixed: WooCommerce Support Added 187 | 188 | ### 1.4.2 ### 189 | * Improvement: Added company/organization and address in people schema. 190 | * Improvement: Added nutrition & ingredients in recipe schema. 191 | * Improvement: Added software image & operating system in software application schema. 192 | * Improvement: Added video description in software application schema. 193 | * Improvement: Added author, publisher organization and publisher logo in article schema. 194 | * Improvement: Added provider location, provider location image, and telephone in service schema. 195 | * Improvement: Changes admin bar test rich snippet redirect link to the structured data testing tool. 196 | * Fixed: removed all error in schema according to structured data testing tool. 197 | 198 | ### 1.4.1 ### 199 | * Fixed: Compatibility Fix WordPress 4.7. 200 | 201 | ### 1.4.0 ### 202 | * Added new service schema 203 | * Minor CSS fixes 204 | 205 | ### 1.3.0 ### 206 | * Improvement: Updated markup data to meet Google Structured data guidelines 207 | * Fixed: WordPress 4.4 compatibility 208 | * Fixed: Admin UI on small screens 209 | 210 | ### 1.2.0 ### 211 | * Improvement: WordPress 4.0 compatibility 212 | * Fixed: Colorpicker breaking other plugins colorpicker settings. 213 | 214 | ### 1.1.9 ### 215 | * Fixed: Image uploading in meta issue resolved. 216 | * Fixed: Compatibility with WordPress 3.9 217 | 218 | ### 1.1.8 ### 219 | * Fixed: CSS and JS now loads on the page / post where rich snippets are configured. 220 | 221 | ### 1.1.7 ### 222 | * Improvement: Added "Test Rich Snippets" menu in admin bar for testing rich snippets in Google Webmasters Tools 223 | * Fixed: retina.js issue resolved 224 | * Removed unnecessary code 225 | 226 | ### 1.1.6 ### 227 | * Improvement: Compatibility with WordPres 3.8 228 | * Fixed: Admin CSS breaking tabs in WP 3.8 229 | * Added: reference post url field in "contact developers" form on settings page 230 | 231 | ### 1.1.5 ### 232 | * Improvement: Replaced rating 'count' with 'votes' on products - as directed by Google 233 | * Fixed: Article snippet not displaying accurate when snippet title is blank 234 | * Fixed: Recipe string 'Published on' can be changed. 235 | 236 | ### 1.1.4 ### 237 | * Fixed: Illegal string offset `user_rating` Warning 238 | 239 | ### 1.1.3 ### 240 | * Improvement : Network Activation 241 | 242 | ### 1.1.2 ### 243 | * Fixed: Edit media functionality. 244 | 245 | ### 1.1.1 ### 246 | * Added: Article type 247 | * Added: Compatibility with WooThemes Plugins and themes 248 | * Added: New Media Manager for uploading images in metabox 249 | 250 | ### 1.1.0 ### 251 | * Added: Admin options 252 | * Fixed: Ratings on recipe, products and software application 253 | * Improvement: Admin options for customizing everything 254 | * Improvement: New snippet box design with responsive layout 255 | 256 | ### 1.0.4 ### 257 | * Fixed: Rating on Comments 258 | * Fixed: On deleting any deactivated plugin 259 | * Fixed: Error message comming on commenting 260 | * Fixed: On post save draft 261 | 262 | ### 1.0.3 ### 263 | * Clean up the code 264 | * Fixed: Plugin activation error 265 | * Fixed: Error on editing theme and plugin files. 266 | * Removed : Breadcrumbs 267 | 268 | ### 1.0.2 ### 269 | * Added: RDFa Breadcrumbs Plugin is now a part of All in One Schema.org Rich Snippets ! 270 | * Added: Star rating and review for recipe 271 | * Fixed: Recipe type 272 | * Fixed: Post update error 273 | 274 | ### 1.0.1 ### 275 | * Fixed: Minor Bugs 276 | 277 | ### 1.0 ### 278 | * Initial Release. -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/minified/style-rtl.min.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"]{padding:1px 12px;border-right-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 0 12px 20px}[ID*="-optin-notice"] .button-primary{margin-left:5px} -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/minified/style.min.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"]{padding:1px 12px;border-left-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 20px 12px 0}[ID*="-optin-notice"] .button-primary{margin-right:5px} -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/unminified/style-rtl.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"] { 2 | padding: 1px 12px; 3 | border-right-color: #007cba; 4 | } 5 | 6 | [ID*="-optin-notice"] .notice-container { 7 | padding-top: 10px; 8 | padding-bottom: 12px; 9 | } 10 | 11 | [ID*="-optin-notice"] .notice-content { 12 | margin: 0; 13 | } 14 | 15 | [ID*="-optin-notice"] .notice-heading { 16 | padding: 0 0 12px 20px; 17 | } 18 | 19 | [ID*="-optin-notice"] .button-primary { 20 | margin-left: 5px; 21 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/unminified/style.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"] { 2 | padding: 1px 12px; 3 | border-left-color: #007cba; 4 | } 5 | 6 | [ID*="-optin-notice"] .notice-container { 7 | padding-top: 10px; 8 | padding-bottom: 12px; 9 | } 10 | 11 | [ID*="-optin-notice"] .notice-content { 12 | margin: 0; 13 | } 14 | 15 | [ID*="-optin-notice"] .notice-heading { 16 | padding: 0 20px 12px 0; 17 | } 18 | 19 | [ID*="-optin-notice"] .button-primary { 20 | margin-right: 5px; 21 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/class-bsf-analytics-loader.php: -------------------------------------------------------------------------------- 1 | entities, $data ); 79 | } 80 | 81 | /** 82 | * Load Analytics library. 83 | * 84 | * @return void 85 | */ 86 | public function load_analytics() { 87 | $unique_entities = array(); 88 | 89 | if ( ! empty( $this->entities ) ) { 90 | foreach ( $this->entities as $entity ) { 91 | foreach ( $entity as $key => $data ) { 92 | 93 | if ( isset( $data['path'] ) ) { 94 | if ( file_exists( $data['path'] . '/version.json' ) ) { 95 | $file_contents = file_get_contents( $data['path'] . '/version.json' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents 96 | $analytics_version = json_decode( $file_contents, 1 ); 97 | $analytics_version = $analytics_version['bsf-analytics-ver']; 98 | 99 | if ( version_compare( $analytics_version, $this->analytics_version, '>' ) ) { 100 | $this->analytics_version = $analytics_version; 101 | $this->analytics_path = $data['path']; 102 | } 103 | } 104 | } 105 | 106 | if ( ! isset( $unique_entities[ $key ] ) ) { 107 | $unique_entities[ $key ] = $data; 108 | } 109 | } 110 | } 111 | 112 | if ( file_exists( $this->analytics_path ) && ! class_exists( 'BSF_Analytics' ) ) { 113 | require_once $this->analytics_path . '/class-bsf-analytics.php'; 114 | new BSF_Analytics( $unique_entities, $this->analytics_path, $this->analytics_version ); 115 | } 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /admin/bsf-analytics/class-bsf-analytics-stats.php: -------------------------------------------------------------------------------- 1 | get_default_stats() ); 58 | } 59 | 60 | /** 61 | * Retrieve stats for site. 62 | * 63 | * @return array stats data. 64 | * @since 1.0.0 65 | */ 66 | private function get_default_stats() { 67 | return array( 68 | 'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false, 69 | 'domain_name' => get_site_url(), 70 | 'php_os' => PHP_OS, 71 | 'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_kses( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ), [] ) : '', 72 | 'mysql_version' => $this->get_mysql_version(), 73 | 'php_version' => $this->get_php_version(), 74 | 'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound 75 | 'php_post_max_size' => ini_get( 'post_max_size' ), 76 | 'php_max_execution_time' => ini_get( 'max_execution_time' ), 77 | 'php_memory_limit' => ini_get( 'memory_limit' ), 78 | 'zip_installed' => extension_loaded( 'zip' ), 79 | 'imagick_availabile' => extension_loaded( 'imagick' ), 80 | 'xmlreader_exists' => class_exists( 'XMLReader' ), 81 | 'gd_available' => extension_loaded( 'gd' ), 82 | 'curl_version' => $this->get_curl_version(), 83 | 'curl_ssl_version' => $this->get_curl_ssl_version(), 84 | 'is_writable' => $this->is_content_writable(), 85 | 86 | 'wp_version' => get_bloginfo( 'version' ), 87 | 'user_count' => $this->get_user_count(), 88 | 'posts_count' => wp_count_posts()->publish, 89 | 'page_count' => wp_count_posts( 'page' )->publish, 90 | 'site_language' => get_locale(), 91 | 'timezone' => wp_timezone_string(), 92 | 'is_ssl' => is_ssl(), 93 | 'is_multisite' => is_multisite(), 94 | 'network_url' => network_site_url(), 95 | 'external_object_cache' => (bool) wp_using_ext_object_cache(), 96 | 'wp_debug' => WP_DEBUG, 97 | 'wp_debug_display' => WP_DEBUG_DISPLAY, 98 | 'script_debug' => SCRIPT_DEBUG, 99 | 100 | 'active_plugins' => $this->get_active_plugins(), 101 | 102 | 'active_theme' => get_template(), 103 | 'active_stylesheet' => get_stylesheet(), 104 | ); 105 | } 106 | 107 | /** 108 | * Get installed PHP version. 109 | * 110 | * @return float PHP version. 111 | * @since 1.0.0 112 | */ 113 | private function get_php_version() { 114 | if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore 115 | return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION; 116 | } 117 | 118 | return phpversion(); 119 | } 120 | 121 | /** 122 | * User count on site. 123 | * 124 | * @return int User count. 125 | * @since 1.0.0 126 | */ 127 | private function get_user_count() { 128 | if ( is_multisite() ) { 129 | $user_count = get_user_count(); 130 | } else { 131 | $count = count_users(); 132 | $user_count = $count['total_users']; 133 | } 134 | 135 | return $user_count; 136 | } 137 | 138 | /** 139 | * Get active plugin's data. 140 | * 141 | * @return array active plugin's list. 142 | * @since 1.0.0 143 | */ 144 | private function get_active_plugins() { 145 | if ( ! $this->plugins ) { 146 | // Ensure get_plugin_data function is loaded. 147 | if ( ! function_exists( 'get_plugin_data' ) ) { 148 | require_once ABSPATH . 'wp-admin/includes/plugin.php'; 149 | } 150 | 151 | $plugins = wp_get_active_and_valid_plugins(); 152 | $plugins = array_map( 'get_plugin_data', $plugins ); 153 | $this->plugins = array_map( array( $this, 'format_plugin' ), $plugins ); 154 | } 155 | 156 | return $this->plugins; 157 | } 158 | 159 | /** 160 | * Format plugin data. 161 | * 162 | * @param string $plugin plugin. 163 | * @return array formatted plugin data. 164 | * @since 1.0.0 165 | */ 166 | public function format_plugin( $plugin ) { 167 | return array( 168 | 'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ), 169 | 'url' => $plugin['PluginURI'], 170 | 'version' => $plugin['Version'], 171 | 'slug' => $plugin['TextDomain'], 172 | 'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ), 173 | 'author_url' => $plugin['AuthorURI'], 174 | ); 175 | } 176 | 177 | /** 178 | * Curl SSL version. 179 | * 180 | * @return float SSL version. 181 | * @since 1.0.0 182 | */ 183 | private function get_curl_ssl_version() { 184 | $curl = array(); 185 | if ( function_exists( 'curl_version' ) ) { 186 | $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version 187 | } 188 | 189 | return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false; 190 | } 191 | 192 | /** 193 | * Get cURL version. 194 | * 195 | * @return float cURL version. 196 | * @since 1.0.0 197 | */ 198 | private function get_curl_version() { 199 | if ( function_exists( 'curl_version' ) ) { 200 | $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version 201 | } 202 | 203 | return isset( $curl['version'] ) ? $curl['version'] : false; 204 | } 205 | 206 | /** 207 | * Get MySQL version. 208 | * 209 | * @return float MySQL version. 210 | * @since 1.0.0 211 | */ 212 | private function get_mysql_version() { 213 | global $wpdb; 214 | return $wpdb->db_version(); 215 | } 216 | 217 | /** 218 | * Check if content directory is writable. 219 | * 220 | * @return bool 221 | * @since 1.0.0 222 | */ 223 | private function is_content_writable() { 224 | $upload_dir = wp_upload_dir(); 225 | return wp_is_writable( $upload_dir['basedir'] ); 226 | } 227 | } 228 | } 229 | 230 | /** 231 | * Polyfill for sites using WP version less than 5.3 232 | */ 233 | if ( ! function_exists( 'wp_timezone_string' ) ) { 234 | /** 235 | * Get timezone string. 236 | * 237 | * @return string timezone string. 238 | * @since 1.0.0 239 | */ 240 | function wp_timezone_string() { 241 | $timezone_string = get_option( 'timezone_string' ); 242 | 243 | if ( $timezone_string ) { 244 | return $timezone_string; 245 | } 246 | 247 | $offset = (float) get_option( 'gmt_offset' ); 248 | $hours = (int) $offset; 249 | $minutes = ( $offset - $hours ); 250 | 251 | $sign = ( $offset < 0 ) ? '-' : '+'; 252 | $abs_hour = abs( $hours ); 253 | $abs_mins = abs( $minutes * 60 ); 254 | $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins ); 255 | 256 | return $tz_offset; 257 | } 258 | } 259 | -------------------------------------------------------------------------------- /admin/bsf-analytics/classes/class-bsf-analytics-helper.php: -------------------------------------------------------------------------------- 1 | false, 28 | 'error_message' => __( 'Oops! Something went wrong. Please refresh the page and try again.' ), 29 | 'error_code' => 0, 30 | ); 31 | 32 | if ( is_wp_error( $response ) ) { 33 | $result['error'] = true; 34 | $result['error_message'] = $response->get_error_message(); 35 | $result['error_code'] = $response->get_error_code(); 36 | } elseif ( ! empty( wp_remote_retrieve_response_code( $response ) ) && ! in_array( wp_remote_retrieve_response_code( $response ), array( 200, 201, 204 ), true ) ) { 37 | $result['error'] = true; 38 | $result['error_message'] = wp_remote_retrieve_response_message( $response ); 39 | $result['error_code'] = wp_remote_retrieve_response_code( $response ); 40 | } 41 | 42 | return $result; 43 | } 44 | 45 | /** 46 | * Get API headers 47 | * 48 | * @since 1.1.6 49 | * @return array 50 | */ 51 | public static function get_api_headers() { 52 | return array( 53 | 'Content-Type' => 'application/json', 54 | 'Accept' => 'application/json', 55 | ); 56 | } 57 | 58 | /** 59 | * Get API URL for sending analytics. 60 | * 61 | * @return string API URL. 62 | * @since 1.0.0 63 | */ 64 | public static function get_api_url() { 65 | return defined( 'BSF_ANALYTICS_API_BASE_URL' ) ? BSF_ANALYTICS_API_BASE_URL : 'https://analytics.brainstormforce.com/'; 66 | } 67 | 68 | /** 69 | * Check if the current screen is allowed for the survey. 70 | * 71 | * This function checks if the current screen is one of the allowed screens for displaying the survey. 72 | * It uses the `get_current_screen` function to get the current screen information and compares it with the list of allowed screens. 73 | * 74 | * @since 1.1.6 75 | * @return bool True if the current screen is allowed, false otherwise. 76 | */ 77 | public static function is_allowed_screen() { 78 | 79 | // This filter allows to dynamically modify the list of allowed screens for the survey. 80 | $allowed_screens = apply_filters( 'uds_survey_allowed_screens', array( 'plugins' ) ); 81 | 82 | $current_screen = get_current_screen(); 83 | 84 | // Check if $current_screen is a valid object before accessing its properties. 85 | if ( ! is_object( $current_screen ) ) { 86 | return false; // Return false if current screen is not valid. 87 | } 88 | 89 | $screen_id = $current_screen->id; 90 | 91 | if ( ! empty( $screen_id ) && in_array( $screen_id, $allowed_screens, true ) ) { 92 | return true; 93 | } 94 | 95 | return false; 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brainstormforce/bsf-analytics", 3 | "description": "Library to gather non sensitive analytics data to enhance bsf products.", 4 | "type": "wordpress-plugin", 5 | "require-dev": { 6 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 7 | "wp-coding-standards/wpcs": "2.2.1", 8 | "phpcompatibility/phpcompatibility-wp": "2.1.0", 9 | "brainmaestro/composer-git-hooks": "^2.6" 10 | }, 11 | "scripts": { 12 | "format": "phpcbf --standard=phpcs.xml.dist --report-summary --report-source", 13 | "lint": "phpcs --standard=phpcs.xml.dist --report-summary --report-source", 14 | "post-install-cmd": "vendor/bin/cghooks add --ignore-lock", 15 | "post-update-cmd": "vendor/bin/cghooks update" 16 | }, 17 | "extra": { 18 | "hooks": { 19 | "pre-commit": [ 20 | "echo committing as $(git config user.name)", 21 | "sh bin/block-commits-with-merge-conflict.sh" 22 | ] 23 | } 24 | }, 25 | "config": { 26 | "allow-plugins": { 27 | "dealerdirect/phpcodesniffer-composer-installer": true 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/css/feedback-rtl.css: -------------------------------------------------------------------------------- 1 | /* Base CSS to normalize the default. */ 2 | .uds-feedback-form--wrapper h2, 3 | .uds-feedback-form--wrapper p, 4 | .uds-feedback-form--wrapper input[type="radio"] { 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | .uds-feedback-form--wrapper .show { 10 | display: block; 11 | } 12 | .uds-feedback-form--wrapper .hide { 13 | display: none; 14 | } 15 | 16 | .uds-feedback-form--wrapper { 17 | align-items: center; 18 | background-color: rgba( 0, 0, 0, 0.75 ); 19 | bottom: 0; 20 | display: none; 21 | justify-content: center; 22 | right: 0; 23 | position: fixed; 24 | left: 0; 25 | top: 0; 26 | user-select: none; 27 | z-index: -9999; 28 | } 29 | 30 | .uds-feedback-form--wrapper.show_popup { 31 | display: flex !important; 32 | z-index: 99999; 33 | } 34 | 35 | .uds-feedback-form--wrapper .uds-feedback-form--container { 36 | background-color: #fff; 37 | border-radius: 8px; 38 | box-shadow: -4px 4px 24px rgba( 0, 0, 0, 0.25 ); 39 | max-width: 90%; 40 | width: 540px; 41 | } 42 | 43 | .uds-feedback-form--container .uds-form-header--wrapper { 44 | align-items: center; 45 | display: flex; 46 | justify-content: space-between; 47 | padding: 16px 20px 0; 48 | } 49 | 50 | .uds-feedback-form--container .uds-form-title--icon-wrapper { 51 | display: flex; 52 | align-items: center; 53 | gap: 12px; 54 | } 55 | 56 | .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon, 57 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close { 58 | width: 20px; 59 | height: 20px; 60 | } 61 | 62 | .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title { 63 | color: #1f2937; 64 | font-size: 16px; 65 | font-weight: 600; 66 | line-height: 24px; 67 | text-align: right; 68 | } 69 | 70 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close { 71 | color: #9ca3af; 72 | cursor: pointer; 73 | } 74 | 75 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover { 76 | color: #4b5563; 77 | } 78 | 79 | .uds-feedback-form--container .uds-form-body--content { 80 | padding: 20px 20px 0 20px; 81 | display: flex; 82 | flex-direction: column; 83 | gap: 20px; 84 | } 85 | 86 | .uds-feedback-form--container .uds-form-body--content .uds-form-description { 87 | color: #1f2937; 88 | font-size: 16px; 89 | font-weight: 500; 90 | line-height: 24px; 91 | text-align: right; 92 | } 93 | 94 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason { 95 | display: flex; 96 | align-items: center; 97 | gap: 12px; 98 | margin-bottom: 12px; 99 | } 100 | 101 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback { 102 | color: #6b7280; 103 | font-size: 14px; 104 | font-weight: 400; 105 | line-height: 20px; 106 | text-align: right; 107 | width: 100%; 108 | padding: 9px 13px; 109 | border-radius: 6px; 110 | border-width: 1px; 111 | border-style: solid; 112 | border-color: #e5e7eb; 113 | box-shadow: 0 1px 2px 0 #0000000d; 114 | background: #fff; 115 | } 116 | 117 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover, 118 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus, 119 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active { 120 | border-color: #d1d5db; 121 | } 122 | 123 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta { 124 | color: #4b5563; 125 | margin-top: 10px; 126 | font-size: 13px; 127 | font-weight: 400; 128 | line-height: 20px; 129 | text-align: right; 130 | } 131 | 132 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a { 133 | text-decoration: none; 134 | color: #006ba1; 135 | } 136 | 137 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder { 138 | font-size: 14px; 139 | font-weight: 400; 140 | line-height: 20px; 141 | text-align: right; 142 | color: #6b7280; 143 | opacity: 1; 144 | } 145 | 146 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions { 147 | display: flex; 148 | align-items: center; 149 | justify-content: space-between; 150 | padding: 16px 20px; 151 | background-color: #f6f7f7; 152 | border-top: 1px solid #e1e1e1; 153 | margin: 40px -20px 0; 154 | border-bottom-right-radius: 8px; 155 | border-bottom-left-radius: 8px; 156 | } 157 | 158 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button { 159 | padding: 7px 13px; 160 | border-radius: 3px; 161 | border-width: 1px; 162 | font-size: 14px; 163 | font-weight: 400; 164 | line-height: 20px; 165 | text-align: right; 166 | border-style: solid; 167 | display: flex; 168 | gap: 8px; 169 | align-items: center; 170 | } 171 | 172 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus { 173 | outline: none; 174 | box-shadow: none; 175 | } 176 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing { 177 | pointer-events: none; 178 | opacity: 0.8; 179 | } 180 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before { 181 | content: "\f463"; 182 | animation: spin 2s linear infinite; 183 | font-family: dashicons, sans-serif; 184 | font-weight: 400; 185 | font-size: 18px; 186 | cursor: pointer; 187 | } 188 | 189 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label { 190 | font-size: 14px; 191 | font-weight: 400; 192 | line-height: 20px; 193 | text-align: right; 194 | } 195 | 196 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"] { 197 | display: flex; 198 | justify-content: center; 199 | height: 18px; 200 | width: 18px; 201 | cursor: pointer; 202 | margin: 0; 203 | border: 1px solid #d1d5db; 204 | border-radius: 50%; 205 | line-height: 0; 206 | box-shadow: inset 0 1px 2px rgb( 0 0 0 / 10% ); 207 | transition: 0.05s border-color ease-in-out; 208 | -webkit-appearance: none; 209 | padding: 0; 210 | } 211 | 212 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked { 213 | vertical-align: middle; 214 | background-color: #006ba1; 215 | } 216 | 217 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked::before { 218 | background-color: #fff !important; 219 | border-radius: 50px; 220 | content: "\2022"; 221 | font-size: 24px; 222 | height: 6px; 223 | line-height: 13px; 224 | margin: 5px; 225 | text-indent: -9999px; 226 | width: 6px; 227 | } 228 | 229 | @keyframes spin { 230 | 0% { 231 | transform: rotate( 0deg ); 232 | } 233 | 100% { 234 | transform: rotate( -360deg ); 235 | } 236 | } 237 | ,.uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}} -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/css/feedback-rtl.min.css: -------------------------------------------------------------------------------- 1 | .uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}},.uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;right:0;position:fixed;left:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:-4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:right;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:right;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-right-radius:8px;border-bottom-left-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:right;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:right}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}} -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/css/feedback.css: -------------------------------------------------------------------------------- 1 | /* Base CSS to normalize the default. */ 2 | .uds-feedback-form--wrapper h2, 3 | .uds-feedback-form--wrapper p, 4 | .uds-feedback-form--wrapper input[type="radio"] { 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | .uds-feedback-form--wrapper .show { 10 | display: block; 11 | } 12 | .uds-feedback-form--wrapper .hide { 13 | display: none; 14 | } 15 | 16 | .uds-feedback-form--wrapper { 17 | align-items: center; 18 | background-color: rgba( 0, 0, 0, 0.75 ); 19 | bottom: 0; 20 | display: none; 21 | justify-content: center; 22 | left: 0; 23 | position: fixed; 24 | right: 0; 25 | top: 0; 26 | user-select: none; 27 | z-index: -9999; 28 | } 29 | 30 | .uds-feedback-form--wrapper.show_popup { 31 | display: flex !important; 32 | z-index: 99999; 33 | } 34 | 35 | .uds-feedback-form--wrapper .uds-feedback-form--container { 36 | background-color: #fff; 37 | border-radius: 8px; 38 | box-shadow: 4px 4px 24px rgba( 0, 0, 0, 0.25 ); 39 | max-width: 90%; 40 | width: 540px; 41 | } 42 | 43 | .uds-feedback-form--container .uds-form-header--wrapper { 44 | align-items: center; 45 | display: flex; 46 | justify-content: space-between; 47 | padding: 16px 20px 0; 48 | } 49 | 50 | .uds-feedback-form--container .uds-form-title--icon-wrapper { 51 | display: flex; 52 | align-items: center; 53 | gap: 12px; 54 | } 55 | 56 | .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon, 57 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close { 58 | width: 20px; 59 | height: 20px; 60 | } 61 | 62 | .uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title { 63 | color: #1f2937; 64 | font-size: 16px; 65 | font-weight: 600; 66 | line-height: 24px; 67 | text-align: left; 68 | } 69 | 70 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close { 71 | color: #9ca3af; 72 | cursor: pointer; 73 | } 74 | 75 | .uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover { 76 | color: #4b5563; 77 | } 78 | 79 | .uds-feedback-form--container .uds-form-body--content { 80 | padding: 20px 20px 0 20px; 81 | display: flex; 82 | flex-direction: column; 83 | gap: 20px; 84 | } 85 | 86 | .uds-feedback-form--container .uds-form-body--content .uds-form-description { 87 | color: #1f2937; 88 | font-size: 16px; 89 | font-weight: 500; 90 | line-height: 24px; 91 | text-align: left; 92 | } 93 | 94 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason { 95 | display: flex; 96 | align-items: center; 97 | gap: 12px; 98 | margin-bottom: 12px; 99 | } 100 | 101 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback { 102 | color: #6b7280; 103 | font-size: 14px; 104 | font-weight: 400; 105 | line-height: 20px; 106 | text-align: left; 107 | width: 100%; 108 | padding: 9px 13px; 109 | border-radius: 6px; 110 | border-width: 1px; 111 | border-style: solid; 112 | border-color: #e5e7eb; 113 | box-shadow: 0 1px 2px 0 #0000000d; 114 | background: #fff; 115 | } 116 | 117 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover, 118 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus, 119 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active { 120 | border-color: #d1d5db; 121 | } 122 | 123 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta { 124 | color: #4b5563; 125 | margin-top: 10px; 126 | font-size: 13px; 127 | font-weight: 400; 128 | line-height: 20px; 129 | text-align: left; 130 | } 131 | 132 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a { 133 | text-decoration: none; 134 | color: #006ba1; 135 | } 136 | 137 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder { 138 | font-size: 14px; 139 | font-weight: 400; 140 | line-height: 20px; 141 | text-align: left; 142 | color: #6b7280; 143 | opacity: 1; 144 | } 145 | 146 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions { 147 | display: flex; 148 | align-items: center; 149 | justify-content: space-between; 150 | padding: 16px 20px; 151 | background-color: #f6f7f7; 152 | border-top: 1px solid #e1e1e1; 153 | margin: 40px -20px 0; 154 | border-bottom-left-radius: 8px; 155 | border-bottom-right-radius: 8px; 156 | } 157 | 158 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button { 159 | padding: 7px 13px; 160 | border-radius: 3px; 161 | border-width: 1px; 162 | font-size: 14px; 163 | font-weight: 400; 164 | line-height: 20px; 165 | text-align: left; 166 | border-style: solid; 167 | display: flex; 168 | gap: 8px; 169 | align-items: center; 170 | } 171 | 172 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus { 173 | outline: none; 174 | box-shadow: none; 175 | } 176 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing { 177 | pointer-events: none; 178 | opacity: 0.8; 179 | } 180 | .uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before { 181 | content: "\f463"; 182 | animation: spin 2s linear infinite; 183 | font-family: dashicons, sans-serif; 184 | font-weight: 400; 185 | font-size: 18px; 186 | cursor: pointer; 187 | } 188 | 189 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label { 190 | font-size: 14px; 191 | font-weight: 400; 192 | line-height: 20px; 193 | text-align: left; 194 | } 195 | 196 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"] { 197 | display: flex; 198 | justify-content: center; 199 | height: 18px; 200 | width: 18px; 201 | cursor: pointer; 202 | margin: 0; 203 | border: 1px solid #d1d5db; 204 | border-radius: 50%; 205 | line-height: 0; 206 | box-shadow: inset 0 1px 2px rgb( 0 0 0 / 10% ); 207 | transition: 0.05s border-color ease-in-out; 208 | -webkit-appearance: none; 209 | padding: 0; 210 | } 211 | 212 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked { 213 | vertical-align: middle; 214 | background-color: #006ba1; 215 | } 216 | 217 | .uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type="radio"]:checked::before { 218 | background-color: #fff !important; 219 | border-radius: 50px; 220 | content: "\2022"; 221 | font-size: 24px; 222 | height: 6px; 223 | line-height: 13px; 224 | margin: 5px; 225 | text-indent: -9999px; 226 | width: 6px; 227 | } 228 | 229 | @keyframes spin { 230 | 0% { 231 | transform: rotate( 0deg ); 232 | } 233 | 100% { 234 | transform: rotate( 360deg ); 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/css/feedback.min.css: -------------------------------------------------------------------------------- 1 | .uds-feedback-form--wrapper h2,.uds-feedback-form--wrapper input[type=radio],.uds-feedback-form--wrapper p{margin:0;padding:0}.uds-feedback-form--wrapper .show{display:block}.uds-feedback-form--wrapper .hide{display:none}.uds-feedback-form--wrapper{align-items:center;background-color:rgba(0,0,0,.75);bottom:0;display:none;justify-content:center;left:0;position:fixed;right:0;top:0;user-select:none;z-index:-9999}.uds-feedback-form--wrapper.show_popup{display:flex!important;z-index:99999}.uds-feedback-form--wrapper .uds-feedback-form--container{background-color:#fff;border-radius:8px;box-shadow:4px 4px 24px rgba(0,0,0,.25);max-width:90%;width:540px}.uds-feedback-form--container .uds-form-header--wrapper{align-items:center;display:flex;justify-content:space-between;padding:16px 20px 0}.uds-feedback-form--container .uds-form-title--icon-wrapper{display:flex;align-items:center;gap:12px}.uds-feedback-form--container .uds-form-header--wrapper .uds-close,.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-icon{width:20px;height:20px}.uds-feedback-form--container .uds-form-title--icon-wrapper .uds-title{color:#1f2937;font-size:16px;font-weight:600;line-height:24px;text-align:left}.uds-feedback-form--container .uds-form-header--wrapper .uds-close{color:#9ca3af;cursor:pointer}.uds-feedback-form--container .uds-form-header--wrapper .uds-close:hover{color:#4b5563}.uds-feedback-form--container .uds-form-body--content{padding:20px 20px 0 20px;display:flex;flex-direction:column;gap:20px}.uds-feedback-form--container .uds-form-body--content .uds-form-description{color:#1f2937;font-size:16px;font-weight:500;line-height:24px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .reason{display:flex;align-items:center;gap:12px;margin-bottom:12px}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback{color:#6b7280;font-size:14px;font-weight:400;line-height:20px;text-align:left;width:100%;padding:9px 13px;border-radius:6px;border-width:1px;border-style:solid;border-color:#e5e7eb;box-shadow:0 1px 2px 0 #0000000d;background:#fff}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:active,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:focus,.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback:hover{border-color:#d1d5db}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta{color:#4b5563;margin-top:10px;font-size:13px;font-weight:400;line-height:20px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-option-feedback-cta a{text-decoration:none;color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-options-feedback::placeholder{font-size:14px;font-weight:400;line-height:20px;text-align:left;color:#6b7280;opacity:1}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:#f6f7f7;border-top:1px solid #e1e1e1;margin:40px -20px 0;border-bottom-left-radius:8px;border-bottom-right-radius:8px}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button{padding:7px 13px;border-radius:3px;border-width:1px;font-size:14px;font-weight:400;line-height:20px;text-align:left;border-style:solid;display:flex;gap:8px;align-items:center}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button:focus{outline:0;box-shadow:none}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing{pointer-events:none;opacity:.8}.uds-feedback-form--container .uds-form-body--content .uds-feedback-form-sumbit--actions .button.processing::before{content:"\f463";animation:spin 2s linear infinite;font-family:dashicons,sans-serif;font-weight:400;font-size:18px;cursor:pointer}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form .uds-reason-label{font-size:14px;font-weight:400;line-height:20px;text-align:left}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]{display:flex;justify-content:center;height:18px;width:18px;cursor:pointer;margin:0;border:1px solid #d1d5db;border-radius:50%;line-height:0;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%);transition:50ms border-color ease-in-out;-webkit-appearance:none;padding:0}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked{vertical-align:middle;background-color:#006ba1}.uds-feedback-form--container .uds-form-body--content #uds-feedback-form input[type=radio]:checked::before{background-color:#fff!important;border-radius:50px;content:"\2022";font-size:24px;height:6px;line-height:13px;margin:5px;text-indent:-9999px;width:6px}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/js/feedback.js: -------------------------------------------------------------------------------- 1 | ( function ( $ ) { 2 | const UserDeactivationPopup = { 3 | slug: '', 4 | skipButton: '', 5 | formWrapper: '', 6 | radioButton: '', 7 | closeButton: '', 8 | buttonAction: '', 9 | feedbackForm: '', 10 | feedbackInput: '', 11 | deactivateUrl: '', 12 | buttonTrigger: '', 13 | deactivateButton: '', 14 | submitDeactivate: '', 15 | 16 | /** 17 | * Caches elements for later use. 18 | */ 19 | _cacheElements() { 20 | this.slug = udsVars?._plugin_slug || ''; 21 | this.skipButton = $( '.uds-feedback-skip' ); 22 | this.submitDeactivate = $( '.uds-feedback-submit' ); 23 | this.deactivateButton = $( '#the-list' ).find( 24 | `.row-actions span.deactivate a` 25 | ); 26 | this.feedbackForm = $( '.uds-feedback-form' ); // Feedback Form. 27 | this.feedbackInput = $( '.uds-options-feedback' ); // Feedback Textarea. 28 | this.formWrapper = $( '.uds-feedback-form--wrapper' ); 29 | this.closeButton = $( '.uds-feedback-form--wrapper .uds-close' ); 30 | this.radioButton = $( '.uds-reason-input' ); 31 | }, 32 | 33 | /** 34 | * Shows the feedback popup by adding the 'show' class to the form wrapper. 35 | * 36 | * @param {string} slug - The slug of the plugin. 37 | */ 38 | _showPopup( slug ) { 39 | $( `#deactivation-survey-${ slug }` ).addClass( 'show_popup' ); 40 | }, 41 | 42 | /** 43 | * Hides the feedback popup by removing the 'show' class from the form wrapper. 44 | */ 45 | _hidePopup() { 46 | this.formWrapper.removeClass( 'show_popup' ); 47 | }, 48 | 49 | /** 50 | * Redirects to the deactivate URL if it exists, otherwise reloads the current page. 51 | */ 52 | _redirectOrReload() { 53 | if ( this.deactivateUrl ) { 54 | window.location.href = this.deactivateUrl; 55 | } else { 56 | location.reload(); 57 | } 58 | }, 59 | 60 | /** 61 | * Toggles the visibility of the feedback form and CTA based on the event target's attributes. 62 | * 63 | * @param {Event} event - The event that triggered this function. 64 | */ 65 | _hideShowFeedbackAndCTA( event ) { 66 | const acceptFeedback = 67 | $( event.target ).attr( 'data-accept_feedback' ) === 'true'; 68 | const showCta = 69 | $( event.target ).attr( 'data-show_cta' ) === 'true'; 70 | 71 | $( event.target ) 72 | .closest( this.formWrapper ) 73 | .find( '.uds-options-feedback' ) 74 | .removeClass( 'hide' ) 75 | .addClass( acceptFeedback ? 'show' : 'hide' ); 76 | $( event.target ) 77 | .closest( this.formWrapper ) 78 | .find( '.uds-option-feedback-cta' ) 79 | .removeClass( 'hide' ) 80 | .addClass( showCta ? 'show' : 'hide' ); 81 | }, 82 | 83 | /** 84 | * Changes the placeholder text of the feedback input based on the event target's attribute. 85 | * 86 | * @param {Event} event - The event that triggered this function. 87 | */ 88 | _changePlaceholderText( event ) { 89 | const radioButtonPlaceholder = 90 | event.target.getAttribute( 'data-placeholder' ); 91 | 92 | $( event.target ) 93 | .closest( this.formWrapper ) 94 | .find( this.feedbackInput ) 95 | .attr( 'placeholder', radioButtonPlaceholder || '' ); 96 | 97 | this._hideShowFeedbackAndCTA( event ); 98 | }, 99 | 100 | /** 101 | * Submits the feedback form and handles the response. 102 | * 103 | * @param {Event} event - The event that triggered this function. 104 | * @param {Object} self - A reference to the current object. 105 | */ 106 | _submitFeedback( event, self ) { 107 | event.preventDefault(); 108 | 109 | const currentForm = $( event.target ); 110 | const closestForm = currentForm.closest( this.feedbackForm ); // Cache the closest form 111 | 112 | // Gather form data. 113 | const formData = { 114 | action: 'uds_plugin_deactivate_feedback', 115 | security: udsVars?._ajax_nonce || '', 116 | reason: 117 | closestForm 118 | .find( this.radioButton.filter( ':checked' ) ) 119 | .val() || '', // Get the selected radio button value from the current form. 120 | source: closestForm.find( 'input[name="source"]' ).val() || '', 121 | referer: 122 | closestForm.find( 'input[name="referer"]' ).val() || '', 123 | version: 124 | closestForm.find( 'input[name="version"]' ).val() || '', 125 | feedback: closestForm.find( this.feedbackInput ).val() || '', // Get the feedback input value from the current form. 126 | }; 127 | 128 | currentForm 129 | .find( '.uds-feedback-' + this.buttonAction ) 130 | .text( 'Deactivating.' ) 131 | .addClass( 'processing' ); 132 | 133 | // Prepare AJAX call. 134 | $.ajax( { 135 | url: udsVars?.ajaxurl, // URL to send the request to. 136 | type: 'POST', // HTTP method. 137 | data: formData, // Data to be sent. 138 | success( response ) { 139 | if ( response.success ) { 140 | self._redirectOrReload(); 141 | } 142 | self._hidePopup(); 143 | }, 144 | /* eslint-disable */ 145 | error( xhr, status, error ) { 146 | /* eslint-disable */ 147 | self._redirectOrReload(); 148 | }, 149 | } ); 150 | }, 151 | 152 | _handleClick( e ) { 153 | // Close feedback form or show/hide popup if clicked outside and add a click on a Activate button of Theme. 154 | if ( 155 | e.target.classList.contains( 'show_popup' ) && 156 | e.target.closest( '.uds-feedback-form--wrapper' ) 157 | ) { 158 | this._hidePopup(); 159 | } else if ( e.target.classList.contains( 'activate' ) ) { 160 | this.deactivateUrl = e.target.href; 161 | 162 | // Don't show for Child Themes. 163 | if ( 164 | -1 !== 165 | this.deactivateUrl.indexOf( 166 | `stylesheet=${ udsVars?._current_theme }-child` 167 | ) 168 | ) { 169 | return; 170 | } 171 | 172 | e.preventDefault(); 173 | this._showPopup( udsVars?._current_theme ); 174 | } 175 | }, 176 | 177 | /** 178 | * Initializes the feedback popup by caching elements and binding events. 179 | */ 180 | _init() { 181 | this._cacheElements(); 182 | this._bind(); 183 | }, 184 | 185 | /** 186 | * Binds event listeners to various elements to handle user interactions. 187 | */ 188 | _bind() { 189 | const self = this; // Store reference to the current object. 190 | 191 | // Open the popup when clicked on the deactivate button. 192 | this.deactivateButton.on( 'click', function ( event ) { 193 | let closestTr = $( event.target ).closest( 'tr' ); 194 | let slug = closestTr.data( 'slug' ); 195 | 196 | if ( self.slug.includes( slug ) ) { 197 | event.preventDefault(); 198 | // Set the deactivation URL. 199 | self.deactivateUrl = $( event.target ).attr( 'href' ); 200 | self._showPopup( slug ); 201 | } 202 | } ); 203 | 204 | // Close the popup on a click of Close button. 205 | this.closeButton.on( 'click', function ( event ) { 206 | event.preventDefault(); 207 | self._hidePopup(); // Use self to refer to the UserDeactivationPopup instance. 208 | } ); 209 | 210 | // Click event on radio button to change the placeholder of textarea. 211 | this.radioButton.on( 'click', function ( event ) { 212 | self._changePlaceholderText( event ); 213 | } ); 214 | 215 | // Combined submit and skip button actions. 216 | this.submitDeactivate 217 | .add( this.skipButton ) 218 | .on( 'click', function ( event ) { 219 | event.preventDefault(); // Prevent default button action. 220 | self.buttonAction = $( event.target ).attr( 'data-action' ); 221 | $( event.target ).closest( self.feedbackForm ).submit(); 222 | } ); 223 | 224 | this.feedbackForm.on( 'submit', function ( event ) { 225 | self._submitFeedback( event, self ); 226 | } ); 227 | 228 | document.addEventListener( 'click', function ( e ) { 229 | self._handleClick( e ); 230 | } ); 231 | }, 232 | }; 233 | 234 | $( function () { 235 | UserDeactivationPopup._init(); 236 | } ); 237 | } )( jQuery ); 238 | -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/assets/js/feedback.min.js: -------------------------------------------------------------------------------- 1 | (i=>{let t={slug:"",skipButton:"",formWrapper:"",radioButton:"",closeButton:"",buttonAction:"",feedbackForm:"",feedbackInput:"",deactivateUrl:"",buttonTrigger:"",deactivateButton:"",submitDeactivate:"",_cacheElements(){this.slug=udsVars?._plugin_slug||"",this.skipButton=i(".uds-feedback-skip"),this.submitDeactivate=i(".uds-feedback-submit"),this.deactivateButton=i("#the-list").find(".row-actions span.deactivate a"),this.feedbackForm=i(".uds-feedback-form"),this.feedbackInput=i(".uds-options-feedback"),this.formWrapper=i(".uds-feedback-form--wrapper"),this.closeButton=i(".uds-feedback-form--wrapper .uds-close"),this.radioButton=i(".uds-reason-input")},_showPopup(t){i("#deactivation-survey-"+t).addClass("show_popup")},_hidePopup(){this.formWrapper.removeClass("show_popup")},_redirectOrReload(){this.deactivateUrl?window.location.href=this.deactivateUrl:location.reload()},_hideShowFeedbackAndCTA(t){var e="true"===i(t.target).attr("data-accept_feedback"),a="true"===i(t.target).attr("data-show_cta");i(t.target).closest(this.formWrapper).find(".uds-options-feedback").removeClass("hide").addClass(e?"show":"hide"),i(t.target).closest(this.formWrapper).find(".uds-option-feedback-cta").removeClass("hide").addClass(a?"show":"hide")},_changePlaceholderText(t){var e=t.target.getAttribute("data-placeholder");i(t.target).closest(this.formWrapper).find(this.feedbackInput).attr("placeholder",e||""),this._hideShowFeedbackAndCTA(t)},_submitFeedback(t,s){t.preventDefault();var t=i(t.target),e=t.closest(this.feedbackForm),e={action:"uds_plugin_deactivate_feedback",security:udsVars?._ajax_nonce||"",reason:e.find(this.radioButton.filter(":checked")).val()||"",source:e.find('input[name="source"]').val()||"",referer:e.find('input[name="referer"]').val()||"",version:e.find('input[name="version"]').val()||"",feedback:e.find(this.feedbackInput).val()||""};t.find(".uds-feedback-"+this.buttonAction).text("Deactivating.").addClass("processing"),i.ajax({url:udsVars?.ajaxurl,type:"POST",data:e,success(t){t.success&&s._redirectOrReload(),s._hidePopup()},error(t,e,a){s._redirectOrReload()}})},_handleClick(t){t.target.classList.contains("show_popup")&&t.target.closest(".uds-feedback-form--wrapper")?this._hidePopup():t.target.classList.contains("activate")&&(this.deactivateUrl=t.target.href,-1===this.deactivateUrl.indexOf(`stylesheet=${udsVars?._current_theme}-child`))&&(t.preventDefault(),this._showPopup(udsVars?._current_theme))},_init(){this._cacheElements(),this._bind()},_bind(){let a=this;this.deactivateButton.on("click",function(t){var e=i(t.target).closest("tr").data("slug");a.slug.includes(e)&&(t.preventDefault(),a.deactivateUrl=i(t.target).attr("href"),a._showPopup(e))}),this.closeButton.on("click",function(t){t.preventDefault(),a._hidePopup()}),this.radioButton.on("click",function(t){a._changePlaceholderText(t)}),this.submitDeactivate.add(this.skipButton).on("click",function(t){t.preventDefault(),a.buttonAction=i(t.target).attr("data-action"),i(t.target).closest(a.feedbackForm).submit()}),this.feedbackForm.on("submit",function(t){a._submitFeedback(t,a)}),document.addEventListener("click",function(t){a._handleClick(t)})}};i(function(){t._init()})})(jQuery); -------------------------------------------------------------------------------- /admin/bsf-analytics/modules/deactivation-survey/classes/class-deactivation-survey-feedback.php: -------------------------------------------------------------------------------- 1 | 'User Deactivation Survey', 77 | 'popup_logo' => '', 78 | 'plugin_slug' => 'user-deactivation-survey', 79 | 'plugin_version' => '', 80 | 'popup_title' => __( 'Quick Feedback' ), 81 | 'support_url' => 'https://brainstormforce.com/contact/', 82 | 'popup_reasons' => self::get_default_reasons(), 83 | 'popup_description' => __( 'If you have a moment, please share why you are deactivating the plugin.' ), 84 | 'show_on_screens' => array( 'plugins' ), 85 | ); 86 | 87 | // Parse the arguments with defaults. 88 | $args = wp_parse_args( $args, $defaults ); 89 | $id = ''; 90 | 91 | // Set a default ID if none is provided. 92 | if ( empty( $args['id'] ) ) { 93 | $id = 'uds-feedback-form--wrapper'; 94 | } 95 | 96 | $id = sanitize_text_field( $args['id'] ); 97 | 98 | // Return if not on the allowed screen. 99 | if ( ! BSF_Analytics_Helper::is_allowed_screen() ) { 100 | return; 101 | } 102 | 103 | ?> 104 | 165 | esc_url( admin_url( 'admin-ajax.php' ) ), 197 | '_ajax_nonce' => wp_create_nonce( 'uds_plugin_deactivate_feedback' ), 198 | '_current_theme' => function_exists( 'wp_get_theme' ) ? wp_get_theme()->get_template() : '', 199 | '_plugin_slug' => array(), 200 | ) 201 | ); 202 | 203 | // Add localize JS. 204 | wp_localize_script( 205 | 'uds-feedback-script', 206 | 'udsVars', 207 | $data 208 | ); 209 | 210 | wp_enqueue_style( 'uds-feedback-style', $dir_path . 'assets/css/feedback' . $file_ext . '.css', array(), BSF_ANALYTICS_VERSION ); 211 | wp_style_add_data( 'uds-feedback-style', 'rtl', 'replace' ); 212 | } 213 | 214 | /** 215 | * Sends plugin deactivation feedback to the server. 216 | * 217 | * This function checks the user's permission and verifies the nonce for the request. 218 | * If the checks pass, it sends the feedback data to the server for processing. 219 | * 220 | * @return void 221 | */ 222 | public function send_plugin_deactivate_feedback() { 223 | 224 | $response_data = array( 'message' => __( 'Sorry, you are not allowed to do this operation.' ) ); 225 | 226 | /** 227 | * Check permission 228 | */ 229 | if ( ! current_user_can( 'manage_options' ) ) { 230 | wp_send_json_error( $response_data ); 231 | } 232 | 233 | /** 234 | * Nonce verification 235 | */ 236 | if ( ! check_ajax_referer( 'uds_plugin_deactivate_feedback', 'security', false ) ) { 237 | $response_data = array( 'message' => __( 'Nonce validation failed' ) ); 238 | wp_send_json_error( $response_data ); 239 | } 240 | 241 | $feedback_data = array( 242 | 'reason' => isset( $_POST['reason'] ) ? sanitize_text_field( wp_unslash( $_POST['reason'] ) ) : '', 243 | 'feedback' => isset( $_POST['feedback'] ) ? sanitize_text_field( wp_unslash( $_POST['feedback'] ) ) : '', 244 | 'domain_name' => isset( $_POST['referer'] ) ? sanitize_text_field( wp_unslash( $_POST['referer'] ) ) : '', 245 | 'version' => isset( $_POST['version'] ) ? sanitize_text_field( wp_unslash( $_POST['version'] ) ) : '', 246 | 'plugin' => isset( $_POST['source'] ) ? sanitize_text_field( wp_unslash( $_POST['source'] ) ) : '', 247 | ); 248 | 249 | $api_args = array( 250 | 'body' => wp_json_encode( $feedback_data ), 251 | 'headers' => BSF_Analytics_Helper::get_api_headers(), 252 | 'timeout' => 90, //phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout 253 | ); 254 | 255 | $target_url = BSF_Analytics_Helper::get_api_url() . self::$feedback_api_endpoint; 256 | 257 | $response = wp_safe_remote_post( $target_url, $api_args ); 258 | 259 | $has_errors = BSF_Analytics_Helper::is_api_error( $response ); 260 | 261 | if ( $has_errors['error'] ) { 262 | wp_send_json_error( 263 | array( 264 | 'success' => false, 265 | 'message' => $has_errors['error_message'], 266 | ) 267 | ); 268 | } 269 | 270 | wp_send_json_success(); 271 | } 272 | 273 | /** 274 | * Get the array of default reasons. 275 | * 276 | * @return array Default reasons. 277 | */ 278 | public static function get_default_reasons() { 279 | 280 | return apply_filters( 281 | 'uds_default_deactivation_reasons', 282 | array( 283 | 'temporary_deactivation' => array( 284 | 'label' => esc_html__( 'This is a temporary deactivation for testing.' ), 285 | 'placeholder' => esc_html__( 'How can we assist you?' ), 286 | 'show_cta' => 'false', 287 | 'accept_feedback' => 'false', 288 | ), 289 | 'plugin_not_working' => array( 290 | 'label' => esc_html__( 'The plugin isn\'t working properly.' ), 291 | 'placeholder' => esc_html__( 'Please tell us more about what went wrong?' ), 292 | 'show_cta' => 'true', 293 | 'accept_feedback' => 'true', 294 | ), 295 | 'found_better_plugin' => array( 296 | 'label' => esc_html__( 'I found a better alternative plugin.' ), 297 | 'placeholder' => esc_html__( 'Could you please specify which plugin?' ), 298 | 'show_cta' => 'false', 299 | 'accept_feedback' => 'true', 300 | ), 301 | 'missing_a_feature' => array( 302 | 'label' => esc_html__( 'It\'s missing a specific feature.' ), 303 | 'placeholder' => esc_html__( 'Please tell us more about the feature.' ), 304 | 'show_cta' => 'false', 305 | 'accept_feedback' => 'true', 306 | ), 307 | 'other' => array( 308 | 'label' => esc_html__( 'Other' ), 309 | 'placeholder' => esc_html__( 'Please tell us more details.' ), 310 | 'show_cta' => 'false', 311 | 'accept_feedback' => 'true', 312 | ), 313 | ) 314 | ); 315 | } 316 | } 317 | 318 | Deactivation_Survey_Feedback::get_instance(); 319 | } 320 | -------------------------------------------------------------------------------- /admin/bsf-analytics/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "bsf-analytics-ver": "1.1.10" 3 | } 4 | -------------------------------------------------------------------------------- /admin/css/admin.css: -------------------------------------------------------------------------------- 1 | html{ display:block !important;} 2 | .tab-container { width: 95%; } 3 | .get_in_touch { margin: 10px; font-size: 14px;cursor: pointer;} 4 | #bsf-postbox-container-2 {width: 65%;} 5 | #bsf-postbox-container-1 { width:35%; margin-top: 55px;} 6 | .bsf-hndle { font-size: 22px;line-height:40px;font-weight: 600;} 7 | .panel-container.bsf-panel #poststuff {width: 100%;min-width: 100%;float: left;} 8 | .bsf-tab-wraper li {margin: 0;} 9 | .bsf-tab-wraper .nav-tab.active { 10 | border-bottom: 1px solid #f1f1f1; 11 | background: #f1f1f1; 12 | color: #000; 13 | margin-bottom: -1px; 14 | } 15 | .panel-container.bsf-panel .postbox-container { 16 | width: 100% !important; 17 | } 18 | 19 | .bsf-contact table.bsf_metabox select{ 20 | width: 100% !important; 21 | 22 | } 23 | .panel-container.bsf-panel p { 24 | font-size: 16px; 25 | font-weight: 400; 26 | } 27 | .panel-container.bsf-panel b { 28 | font-size: 16px; 29 | } 30 | div#tab-1 p, 31 | div#tab-4 p, 32 | div#tab-3 p { 33 | font-size: 14px; 34 | } 35 | .schema-notice { 36 | border: 1px dashed #23282d45; 37 | padding: 2px 15px; 38 | margin: 0 5px; 39 | } 40 | #bsf-postbox-container-2 .ui-sortable { 41 | padding: 5px; 42 | } 43 | .bsf-even-odd { 44 | background: #f8f8f8; 45 | } 46 | .bsf-schema { 47 | display: flex; 48 | display: -webkit-box; 49 | display: -webkit-flex; 50 | display: -ms-flexbox; 51 | -webkit-box-orient: horizontal; 52 | -webkit-box-direction: normal; 53 | -webkit-flex-direction: row; 54 | -ms-flex-direction: row; 55 | flex-direction: row; 56 | -webkit-flex-wrap: wrap; 57 | -ms-flex-wrap: wrap; 58 | flex-wrap: wrap; 59 | -webkit-box-pack: start; 60 | -webkit-justify-content: flex-start; 61 | -ms-flex-pack: start; 62 | justify-content: flex-start; 63 | -webkit-box-align: stretch; 64 | -webkit-align-items: stretch; 65 | -ms-flex-align: stretch; 66 | align-items: stretch; 67 | } 68 | .bsf-schema li:hover::after { 69 | width: 100%; 70 | } 71 | .bsf-schema li:after { 72 | content: ""; 73 | background-color: rgba(247,21,104,0.9); 74 | top: 0; 75 | height: 2px; 76 | left: 0; 77 | position: absolute; 78 | transition: all 0.4s ease-in-out 0s; 79 | width: 0; 80 | } 81 | .bsf-schema-features { 82 | width: calc(100% / 2 - 40px); 83 | margin: 10px 40px; 84 | margin-left: 0; 85 | } 86 | .bsf-schema-button-wrap { 87 | width: calc(100% / 2 - 100px); 88 | margin: 10px 50px; 89 | } 90 | .bsf-testimonial-wrap { 91 | width: 100%; 92 | } 93 | .bsf-schema-features-wrap { 94 | margin-bottom: 15px; 95 | } 96 | .schema-types { 97 | display: -webkit-box; 98 | display: -ms-flexbox; 99 | display: flex; 100 | padding-top: 20px; 101 | } 102 | .schema-type-col-2 { 103 | width: 25%; 104 | } 105 | .schema-types li { 106 | list-style-type: disc; 107 | margin-left: 20px; 108 | font-size: 16px; 109 | } 110 | .bsf-schema-features-1 p { 111 | color: #555; 112 | font-size: 16px !important; 113 | } 114 | ol.bsf-li-counter { 115 | counter-reset: my-badass-counter; 116 | } 117 | .bsf-li-counter li { 118 | position: relative; 119 | font-size: 15px; 120 | font-weight: 600; 121 | margin-bottom: 40px; 122 | margin-left: 15px; 123 | list-style: none; 124 | } 125 | .bsf-schema-features-1 h3 { 126 | font-size: 15px; 127 | font-weight: 600; 128 | margin-bottom: 0; 129 | 130 | } 131 | .bsf-li-counter p { 132 | margin-top: 10px; 133 | } 134 | .bsf-li-counter li:before { 135 | position: absolute; 136 | z-index: 100; 137 | font-size: 13px; 138 | text-align: center; 139 | left: -40px; 140 | top: -2px; 141 | border-radius: 100px; 142 | background-color: #f62a75; 143 | color: white; 144 | font-weight: bold; 145 | width: 25px; 146 | height: 25px; 147 | line-height: 25px; 148 | content: counter(my-badass-counter); 149 | counter-increment: my-badass-counter; 150 | } 151 | .bsf-schema-features-icon, 152 | .bsf-schema-features-cont, 153 | .bsf-schema-testimonial-icon { 154 | display: table-cell; 155 | vertical-align: top; 156 | padding: 0 10px; 157 | } 158 | .bsf-schema-testimonial-icon { 159 | padding: 15px 35px; 160 | } 161 | .bsf-schema-testimonial-icon img { 162 | width: 100px; 163 | border-radius: 50%; 164 | } 165 | .bsf-schema-features-icon img { 166 | margin-top: 15px; 167 | width: 38px; 168 | } 169 | .bsf-btn-wraper { 170 | width: 100%; 171 | margin: auto; 172 | text-align: center; 173 | } 174 | .btn-btn-grey { 175 | background-color: #eee; 176 | border-color: #ccc; 177 | color: #666; 178 | } 179 | .btn-btn-grey:hover, 180 | .btn-btn-grey:active { 181 | background-color: #d7d7d7; 182 | border-color: #ccc; 183 | color: #444; 184 | box-shadow: none; 185 | outline: none; 186 | } 187 | .btn-btn-purple { 188 | background-color:rgba(247,21,104,0.9); 189 | border-color: rgba(247,21,104,0.9); 190 | color: #fff; 191 | } 192 | .btn-btn-purple:hover, 193 | .btn-btn-purple:active, 194 | .btn-btn-purple:focus { 195 | color: #fff; 196 | background: #f70c62; 197 | border-color:#f70c62; 198 | } 199 | .bsf-btn-lg { 200 | font-size: 16px; 201 | font-weight: 600; 202 | padding: 22px 50px; 203 | width: 270px; 204 | -webkit-transition: all 200ms linear; 205 | -moz-transition: all 200ms linear; 206 | -ms-transition: all 200ms linear; 207 | -o-transition: all 200ms linear; 208 | transition: all 200ms linear; 209 | } 210 | .bsf-btn { 211 | border: 0; 212 | border-radius: 3px; 213 | cursor: pointer; 214 | display: inline-block; 215 | margin: 0; 216 | text-decoration: none; 217 | text-align: center; 218 | vertical-align: middle; 219 | white-space: nowrap; 220 | box-shadow: none; 221 | } 222 | a.bsf-btn:focus { 223 | outline: none; 224 | box-shadow: none; 225 | } 226 | #postbox-container-17 { 227 | background: #fff; 228 | } 229 | #postbox-container-17 .ui-sortable { 230 | padding: 50px; 231 | } 232 | .bsf-xs-separator { 233 | width: 100%; 234 | height: 15px; 235 | } 236 | .bsf-ls-separator { 237 | display: block; 238 | width: 100%; 239 | height: 60px; 240 | } 241 | .bsf-table-data { 242 | position: absolute; 243 | top: 10px; 244 | right: 10px; 245 | } 246 | .bsf-tooltip { 247 | position: relative; 248 | display: inline-block; 249 | } 250 | 251 | .bsf-tooltip .bsf-tooltiptext { 252 | visibility: hidden; 253 | position: absolute; 254 | top: -21px; 255 | right: 35px; 256 | width: 322px; 257 | background-color:#f7f7f7; 258 | color: #000; 259 | text-align: center; 260 | border-radius: 3px; 261 | padding: 13px; 262 | position: absolute; 263 | z-index: 1; 264 | } 265 | span.bsf-tooltiptext:after { 266 | width: 0; 267 | height: 0; 268 | border-style: solid; 269 | border-width: 13px 0 13px 17px; 270 | border-color: transparent transparent transparent #f7f7f7; 271 | content: ""; 272 | position: absolute; 273 | right: -15px; 274 | top: 20px; 275 | } 276 | .bsf-tooltip:hover .bsf-tooltiptext { 277 | visibility: visible; 278 | } 279 | .bsf-guide-icon { 280 | margin: 0; 281 | position: absolute; 282 | right: 5rem; 283 | top: -25px; 284 | width: 60px; 285 | } 286 | .beginner-guide a:hover { 287 | color: #0073aa; 288 | } 289 | .bsf-guide-title a:focus { 290 | outline: none; 291 | box-shadow: none; 292 | } 293 | .beginner-guide a { 294 | color: #23282d; 295 | text-decoration: none; 296 | line-height: 1.5; 297 | } 298 | .beginner-guide a:focus { 299 | outline: none; 300 | box-shadow: none; 301 | } 302 | .bsf-panel .meta-box-sortables .postbox .handlediv{ 303 | float:right; 304 | border-bottom: 1px solid #ccd0d4; 305 | } 306 | .bsf-panel .meta-box-sortables .postbox .hndle{ 307 | border-bottom: 1px solid #ccd0d4; 308 | } 309 | .bsf-woocommerce-setting .handlediv, .bsf-contact .handlediv{ 310 | float:right; 311 | } 312 | .postbox.bsf-woocommerce-setting.closed, .postbox.bsf-contact.closed{ 313 | border-bottom: 1px solid #ccd0d4; 314 | } 315 | @media(max-width:768px){ 316 | #bsf-postbox-container-2 { 317 | width: 100%; 318 | margin-bottom: 20px; 319 | } 320 | #bsf-postbox-container-1, 321 | .bsf-schema, 322 | .tab-container, 323 | .bsf-schema li, 324 | .bsf-schema-features { 325 | display: block; 326 | box-sizing: border-box; 327 | width: 100%; 328 | } 329 | #postbox-container-17 .ui-sortable { 330 | padding: 20px; 331 | } 332 | .bsf-hndle { 333 | font-size: 18px; 334 | line-height: 27px; 335 | font-weight: 600; 336 | } 337 | .bsf-schema-features-icon, 338 | .bsf-schema-features-cont, 339 | .bsf-schema-testimonial-icon { 340 | display: block; 341 | text-align: center; 342 | } 343 | .bsf-schema-button-wrap { 344 | width: 100%; 345 | margin: 15px auto; 346 | } 347 | .bsf-guide-icon { 348 | display: none; 349 | } 350 | div .bsf-btn-lg { 351 | box-sizing: border-box; 352 | width: 100%; 353 | } 354 | .schema-types { 355 | display: block; 356 | } 357 | } 358 | @media(max-width:1600px ) { 359 | .bsf-btn-lg { 360 | width: auto; 361 | } 362 | table.bsf_metabox input.bsf_text_medium { 363 | width: 100%; 364 | } 365 | } 366 | @media(min-width: 767px) and (max-width:1400px ) { 367 | .bsf-guide-icon { 368 | display: none; 369 | } 370 | } 371 | div#tab-5 { 372 | margin-top: -300px; 373 | padding-bottom: 300px; 374 | } 375 | div#tab-5 div#postbox-container-17 { 376 | border: 2px solid #e5e5e5; 377 | } -------------------------------------------------------------------------------- /admin/images/code-in-page.php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/admin/images/code-in-page.php.png -------------------------------------------------------------------------------- /admin/images/code-in-single.php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/admin/images/code-in-single.php.png -------------------------------------------------------------------------------- /admin/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/admin/images/icon.png -------------------------------------------------------------------------------- /admin/images/icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/admin/images/icon_32.png -------------------------------------------------------------------------------- /admin/images/sidebar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/all-in-one-schemaorg-rich-snippets/fb15f71f7bd094d68fc85bede969dc18e1ad46e3/admin/images/sidebar.jpg -------------------------------------------------------------------------------- /admin/js/jquery.easytabs.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery EasyTabs plugin 3.1.1 3 | * 4 | * Copyright (c) 2010-2011 Steve Schwartz (JangoSteve) 5 | * 6 | * Dual licensed under the MIT and GPL licenses: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | * http://www.gnu.org/licenses/gpl.html 9 | * 10 | * Date: Tue Jan 26 16:30:00 2012 -0500 11 | */ 12 | (function(a){a.easytabs=function(j,e){var f=this,q=a(j),i={animate:true,panelActiveClass:"active",tabActiveClass:"active",defaultTab:"li:first-child",animationSpeed:"normal",tabs:"> ul > li",updateHash:true,cycle:false,collapsible:false,collapsedClass:"collapsed",collapsedByDefault:true,uiTabs:false,transitionIn:"fadeIn",transitionOut:"fadeOut",transitionInEasing:"swing",transitionOutEasing:"swing",transitionCollapse:"slideUp",transitionUncollapse:"slideDown",transitionCollapseEasing:"swing",transitionUncollapseEasing:"swing",containerClass:"",tabsClass:"",tabClass:"",panelClass:"",cache:true,panelContext:q},h,l,v,m,d,t={fast:200,normal:400,slow:600},r;f.init=function(){f.settings=r=a.extend({},i,e);if(r.uiTabs){r.tabActiveClass="ui-tabs-selected";r.containerClass="ui-tabs ui-widget ui-widget-content ui-corner-all";r.tabsClass="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all";r.tabClass="ui-state-default ui-corner-top";r.panelClass="ui-tabs-panel ui-widget-content ui-corner-bottom"}if(r.collapsible&&e.defaultTab!==undefined&&e.collpasedByDefault===undefined){r.collapsedByDefault=false}if(typeof(r.animationSpeed)==="string"){r.animationSpeed=t[r.animationSpeed]}a("a.anchor").remove().prependTo("body");q.data("easytabs",{});f.setTransitions();f.getTabs();b();g();w();n();c();q.attr("data-easytabs",true)};f.setTransitions=function(){v=(r.animate)?{show:r.transitionIn,hide:r.transitionOut,speed:r.animationSpeed,collapse:r.transitionCollapse,uncollapse:r.transitionUncollapse,halfSpeed:r.animationSpeed/2}:{show:"show",hide:"hide",speed:0,collapse:"hide",uncollapse:"show",halfSpeed:0}};f.getTabs=function(){var x;f.tabs=q.find(r.tabs),f.panels=a(),f.tabs.each(function(){var A=a(this),z=A.children("a"),y=A.children("a").data("target");A.data("easytabs",{});if(y!==undefined&&y!==null){A.data("easytabs").ajax=z.attr("href")}else{y=z.attr("href")}y=y.match(/#([^\?]+)/)[0].substr(1);x=r.panelContext.find("#"+y);if(x.length){x.data("easytabs",{position:x.css("position"),visibility:x.css("visibility")});x.not(r.panelActiveClass).hide();f.panels=f.panels.add(x);A.data("easytabs").panel=x}else{f.tabs=f.tabs.not(A)}})};f.selectTab=function(x,C){var y=window.location,B=y.hash.match(/^[^\?]*/)[0],z=x.parent().data("easytabs").panel,A=x.parent().data("easytabs").ajax;if(r.collapsible&&!d&&(x.hasClass(r.tabActiveClass)||x.hasClass(r.collapsedClass))){f.toggleTabCollapse(x,z,A,C)}else{if(!x.hasClass(r.tabActiveClass)||!z.hasClass(r.panelActiveClass)){o(x,z,A,C)}else{if(!r.cache){o(x,z,A,C)}}}};f.toggleTabCollapse=function(x,y,z,A){f.panels.stop(true,true);if(u(q,"easytabs:before",[x,y,r])){f.tabs.filter("."+r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass);if(x.hasClass(r.collapsedClass)){if(z&&(!r.cache||!x.parent().data("easytabs").cached)){q.trigger("easytabs:ajax:beforeSend",[x,y]);y.load(z,function(C,B,D){x.parent().data("easytabs").cached=true;q.trigger("easytabs:ajax:complete",[x,y,C,B,D])})}x.parent().removeClass(r.collapsedClass).addClass(r.tabActiveClass).children().removeClass(r.collapsedClass).addClass(r.tabActiveClass);y.addClass(r.panelActiveClass)[v.uncollapse](v.speed,r.transitionUncollapseEasing,function(){q.trigger("easytabs:midTransition",[x,y,r]);if(typeof A=="function"){A()}})}else{x.addClass(r.collapsedClass).parent().addClass(r.collapsedClass);y.removeClass(r.panelActiveClass)[v.collapse](v.speed,r.transitionCollapseEasing,function(){q.trigger("easytabs:midTransition",[x,y,r]);if(typeof A=="function"){A()}})}}};f.matchTab=function(x){return f.tabs.find("[href='"+x+"'],[data-target='"+x+"']").first()};f.matchInPanel=function(x){return(x?f.panels.filter(":has("+x+")").first():[])};f.selectTabFromHashChange=function(){var y=window.location.hash.match(/^[^\?]*/)[0],x=f.matchTab(y),z;if(r.updateHash){if(x.length){d=true;f.selectTab(x)}else{z=f.matchInPanel(y);if(z.length){y="#"+z.attr("id");x=f.matchTab(y);d=true;f.selectTab(x)}else{if(!h.hasClass(r.tabActiveClass)&&!r.cycle){if(y===""||f.matchTab(m).length||q.closest(y).length){d=true;f.selectTab(l)}}}}}};f.cycleTabs=function(x){if(r.cycle){x=x%f.tabs.length;$tab=a(f.tabs[x]).children("a").first();d=true;f.selectTab($tab,function(){setTimeout(function(){f.cycleTabs(x+1)},r.cycle)})}};f.publicMethods={select:function(x){var y;if((y=f.tabs.filter(x)).length===0){if((y=f.tabs.find("a[href='"+x+"']")).length===0){if((y=f.tabs.find("a"+x)).length===0){if((y=f.tabs.find("[data-target='"+x+"']")).length===0){if((y=f.tabs.find("a[href$='"+x+"']")).length===0){a.error("Tab '"+x+"' does not exist in tab set")}}}}}else{y=y.children("a").first()}f.selectTab(y)}};var u=function(A,x,z){var y=a.Event(x);A.trigger(y,z);return y.result!==false};var b=function(){q.addClass(r.containerClass);f.tabs.parent().addClass(r.tabsClass);f.tabs.addClass(r.tabClass);f.panels.addClass(r.panelClass)};var g=function(){var y=window.location.hash.match(/^[^\?]*/)[0],x=f.matchTab(y).parent(),z;if(x.length===1){h=x;r.cycle=false}else{z=f.matchInPanel(y);if(z.length){y="#"+z.attr("id");h=f.matchTab(y).parent()}else{h=f.tabs.parent().find(r.defaultTab);if(h.length===0){a.error("The specified default tab ('"+r.defaultTab+"') could not be found in the tab set.")}}}l=h.children("a").first();p(x)};var p=function(z){var y,x;if(r.collapsible&&z.length===0&&r.collapsedByDefault){h.addClass(r.collapsedClass).children().addClass(r.collapsedClass)}else{y=a(h.data("easytabs").panel);x=h.data("easytabs").ajax;if(x&&(!r.cache||!h.data("easytabs").cached)){q.trigger("easytabs:ajax:beforeSend",[l,y]);y.load(x,function(B,A,C){h.data("easytabs").cached=true;q.trigger("easytabs:ajax:complete",[l,y,B,A,C])})}h.data("easytabs").panel.show().addClass(r.panelActiveClass);h.addClass(r.tabActiveClass).children().addClass(r.tabActiveClass)}};var w=function(){f.tabs.children("a").bind("click.easytabs",function(x){r.cycle=false;d=false;f.selectTab(a(this));x.preventDefault()})};var o=function(z,D,E,H){f.panels.stop(true,true);if(u(q,"easytabs:before",[z,D,r])){var A=f.panels.filter(":visible"),y=D.parent(),F,x,C,G,B=window.location.hash.match(/^[^\?]*/)[0];if(r.animate){F=s(D);x=A.length?k(A):0;C=F-x}m=B;G=function(){q.trigger("easytabs:midTransition",[z,D,r]);if(r.animate&&r.transitionIn=="fadeIn"){if(C<0){y.animate({height:y.height()+C},v.halfSpeed).css({"min-height":""})}}if(r.updateHash&&!d){window.location.hash="#"+D.attr("id")}else{d=false}D[v.show](v.speed,r.transitionInEasing,function(){y.css({height:"","min-height":""});q.trigger("easytabs:after",[z,D,r]);if(typeof H=="function"){H()}})};if(E&&(!r.cache||!z.parent().data("easytabs").cached)){q.trigger("easytabs:ajax:beforeSend",[z,D]);D.load(E,function(J,I,K){z.parent().data("easytabs").cached=true;q.trigger("easytabs:ajax:complete",[z,D,J,I,K])})}if(r.animate&&r.transitionOut=="fadeOut"){if(C>0){y.animate({height:(y.height()+C)},v.halfSpeed)}else{y.css({"min-height":y.height()})}}f.tabs.filter("."+r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass);f.tabs.filter("."+r.collapsedClass).removeClass(r.collapsedClass).children().removeClass(r.collapsedClass);z.parent().addClass(r.tabActiveClass).children().addClass(r.tabActiveClass);f.panels.filter("."+r.panelActiveClass).removeClass(r.panelActiveClass);D.addClass(r.panelActiveClass);if(A.length){A[v.hide](v.speed,r.transitionOutEasing,G)}else{D[v.uncollapse](v.speed,r.transitionUncollapseEasing,G)}}};var s=function(y){if(y.data("easytabs")&&y.data("easytabs").lastHeight){return y.data("easytabs").lastHeight}var z=y.css("display"),x=y.wrap(a("
",{position:"absolute",visibility:"hidden",overflow:"hidden"})).css({position:"relative",visibility:"hidden",display:"block"}).outerHeight();y.unwrap();y.css({position:y.data("easytabs").position,visibility:y.data("easytabs").visibility,display:z});y.data("easytabs").lastHeight=x;return x};var k=function(y){var x=y.outerHeight();if(y.data("easytabs")){y.data("easytabs").lastHeight=x}else{y.data("easytabs",{lastHeight:x})}return x};var n=function(){if(typeof a(window).hashchange==="function"){a(window).hashchange(function(){f.selectTabFromHashChange()})}else{if(a.address&&typeof a.address.change==="function"){a.address.change(function(){f.selectTabFromHashChange()})}}};var c=function(){var x;if(r.cycle){x=f.tabs.index(h);setTimeout(function(){f.cycleTabs(x+1)},r.cycle)}};f.init()};a.fn.easytabs=function(c){var b=arguments;return this.each(function(){var e=a(this),d=e.data("easytabs");if(undefined===d){d=new a.easytabs(this,c);e.data("easytabs",d)}if(d.publicMethods[c]){return d.publicMethods[c](Array.prototype.slice.call(b,1))}})}})(jQuery); 13 | -------------------------------------------------------------------------------- /admin/js/jquery.hashchange.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery hashchange event, v1.4, 2013-11-29 3 | * https://github.com/georgekosmidis/jquery-hashchange 4 | */ 5 | (function(e,t,n){"$:nomunge";function f(e){e=e||location.href;return"#"+e.replace(/^[^#]*#?(.*)$/,"$1")}var r="hashchange",i=document,s,o=e.event.special,u=i.documentMode,a="on"+r in t&&(u===n||u>7);e.fn[r]=function(e){return e?this.bind(r,e):this.trigger(r)};e.fn[r].delay=50;o[r]=e.extend(o[r],{setup:function(){if(a){return false}e(s.start)},teardown:function(){if(a){return false}e(s.stop)}});s=function(){function p(){var n=f(),i=h(u);if(n!==u){c(u=n,i);e(t).trigger(r)}else if(i!==u){location.href=location.href.replace(/#.*/,"")+i}o=setTimeout(p,e.fn[r].delay)}var s={},o,u=f(),l=function(e){return e},c=l,h=l;s.start=function(){o||p()};s.stop=function(){o&&clearTimeout(o);o=n};var d=function(){var e,t=3,n=document.createElement("div"),r=n.getElementsByTagName("i");while(n.innerHTML="",r[0]);return t>4?t:e}();d&&!a&&function(){var t,n;s.start=function(){if(!t){n=e.fn[r].src;n=n&&n+f();t=e('