Changeset 3444395
- Timestamp:
- 01/21/2026 08:36:05 PM (4 weeks ago)
- Location:
- mass-email-notifications-for-gravity-forms
- Files:
-
- 190 added
- 10 deleted
- 46 edited
- 1 copied
-
tags/1.3.7 (copied) (copied from mass-email-notifications-for-gravity-forms/trunk)
-
tags/1.3.7/class-mass-email-notifications-for-gravity-forms.php (modified) (6 diffs)
-
tags/1.3.7/includes/images (deleted)
-
tags/1.3.7/mass-email-notifications-for-gf.php (modified) (5 diffs)
-
tags/1.3.7/readme.txt (modified) (3 diffs)
-
tags/1.3.7/vendor/MENFGF/autoload.php (modified) (1 diff)
-
tags/1.3.7/vendor/MENFGF/composer/autoload_classmap.php (modified) (1 diff)
-
tags/1.3.7/vendor/MENFGF/composer/autoload_files.php (added)
-
tags/1.3.7/vendor/MENFGF/composer/autoload_psr4.php (modified) (1 diff)
-
tags/1.3.7/vendor/MENFGF/composer/autoload_real.php (modified) (2 diffs)
-
tags/1.3.7/vendor/MENFGF/composer/autoload_static.php (modified) (4 diffs)
-
tags/1.3.7/vendor/MENFGF/composer/installed.json (modified) (3 diffs)
-
tags/1.3.7/vendor/MENFGF/composer/installed.php (modified) (3 diffs)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/admin.css (deleted)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/admin.js (deleted)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/css (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/css/admin.css (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/css/freemius.css (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/css/menu.css (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/css/trustedlogin.css (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/freemius.css (deleted)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/f4g-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/gv4gm-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/iawgf-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/icon.png (deleted)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/kv4gv-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/menfgf-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/ops-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/rfsfgf-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/images/search-icon.svg (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/js (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/assets/js/admin.js (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/composer.json (modified) (1 diff)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php (modified) (23 diffs)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/ReviewPrompter.php (modified) (2 diffs)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php (modified) (13 diffs)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/SurveyPrompter.php (modified) (1 diff)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/TrustedLogin.php (added)
-
tags/1.3.7/vendor/MENFGF/gravityops/core/src/SuiteRegistry.php (modified) (7 diffs)
-
tags/1.3.7/vendor/MENFGF/trustedlogin (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.distignore (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.editorconfig (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.nvmrc (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.phpcs.xml.dist (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.phpunit-watcher.yml (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.travis.yml (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/.wp-env.json (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/CHANGELOG.md (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/Gruntfile.js (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/LICENSE (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/README.md (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/bin (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/bin/build-sass (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/bin/install-wp-tests.sh (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/bin/phpstan-bootstrap.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/build (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/build/build-sass.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/client.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/composer.json (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/composer.lock (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/index.html (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/languages (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/languages/trustedlogin-client.pot (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/mkdocs.yml (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/package-lock.json (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/package.json (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/phpstan.neon.dist (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/phpunit.xml.dist (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/pull_request_template.md (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Admin.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Ajax.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Client.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Config.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Cron.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Encryption.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Endpoint.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Envelope.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Form.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Logger.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Logging.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Remote.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/SecurityChecks.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/SiteAccess.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/SupportRole.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/SupportUser.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/Utils.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/index.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/_auth.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/_buttons.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/_global.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/_namespace.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/_variables.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/index.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/src/trustedlogin.scss (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.css (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.css.map (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.js (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.svg (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/src/index.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/bootstrap.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-ajax.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-client.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-config.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-encryption.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-logging.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-remote.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-siteaccess.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-users.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/tests/test-utils.php (added)
-
tags/1.3.7/vendor/MENFGF/trustedlogin/client/yarn.lock (added)
-
tags/1.3.7/vendor/autoload.php (modified) (1 diff)
-
tags/1.3.7/vendor/bin (added)
-
tags/1.3.7/vendor/bin/build-sass (added)
-
tags/1.3.7/vendor/composer/autoload_aliases.php (modified) (9 diffs)
-
tags/1.3.7/vendor/composer/autoload_files.php (modified) (1 diff)
-
tags/1.3.7/vendor/composer/autoload_real.php (modified) (2 diffs)
-
tags/1.3.7/vendor/composer/autoload_static.php (modified) (2 diffs)
-
tags/1.3.7/vendor/composer/installed.json (modified) (2 diffs)
-
tags/1.3.7/vendor/composer/installed.php (modified) (4 diffs)
-
trunk/class-mass-email-notifications-for-gravity-forms.php (modified) (6 diffs)
-
trunk/includes/images (deleted)
-
trunk/mass-email-notifications-for-gf.php (modified) (5 diffs)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/vendor/MENFGF/autoload.php (modified) (1 diff)
-
trunk/vendor/MENFGF/composer/autoload_classmap.php (modified) (1 diff)
-
trunk/vendor/MENFGF/composer/autoload_files.php (added)
-
trunk/vendor/MENFGF/composer/autoload_psr4.php (modified) (1 diff)
-
trunk/vendor/MENFGF/composer/autoload_real.php (modified) (2 diffs)
-
trunk/vendor/MENFGF/composer/autoload_static.php (modified) (4 diffs)
-
trunk/vendor/MENFGF/composer/installed.json (modified) (3 diffs)
-
trunk/vendor/MENFGF/composer/installed.php (modified) (3 diffs)
-
trunk/vendor/MENFGF/gravityops/core/assets/admin.css (deleted)
-
trunk/vendor/MENFGF/gravityops/core/assets/admin.js (deleted)
-
trunk/vendor/MENFGF/gravityops/core/assets/css (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/css/admin.css (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/css/freemius.css (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/css/menu.css (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/css/trustedlogin.css (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/freemius.css (deleted)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/f4g-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/gv4gm-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/iawgf-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/icon.png (deleted)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/kv4gv-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/menfgf-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/ops-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/rfsfgf-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/images/search-icon.svg (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/js (added)
-
trunk/vendor/MENFGF/gravityops/core/assets/js/admin.js (added)
-
trunk/vendor/MENFGF/gravityops/core/composer.json (modified) (1 diff)
-
trunk/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php (modified) (23 diffs)
-
trunk/vendor/MENFGF/gravityops/core/src/Admin/ReviewPrompter.php (modified) (2 diffs)
-
trunk/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php (modified) (13 diffs)
-
trunk/vendor/MENFGF/gravityops/core/src/Admin/SurveyPrompter.php (modified) (1 diff)
-
trunk/vendor/MENFGF/gravityops/core/src/Admin/TrustedLogin.php (added)
-
trunk/vendor/MENFGF/gravityops/core/src/SuiteRegistry.php (modified) (7 diffs)
-
trunk/vendor/MENFGF/trustedlogin (added)
-
trunk/vendor/MENFGF/trustedlogin/client (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.distignore (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.editorconfig (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.nvmrc (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.phpcs.xml.dist (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.phpunit-watcher.yml (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.travis.yml (added)
-
trunk/vendor/MENFGF/trustedlogin/client/.wp-env.json (added)
-
trunk/vendor/MENFGF/trustedlogin/client/CHANGELOG.md (added)
-
trunk/vendor/MENFGF/trustedlogin/client/Gruntfile.js (added)
-
trunk/vendor/MENFGF/trustedlogin/client/LICENSE (added)
-
trunk/vendor/MENFGF/trustedlogin/client/README.md (added)
-
trunk/vendor/MENFGF/trustedlogin/client/bin (added)
-
trunk/vendor/MENFGF/trustedlogin/client/bin/build-sass (added)
-
trunk/vendor/MENFGF/trustedlogin/client/bin/install-wp-tests.sh (added)
-
trunk/vendor/MENFGF/trustedlogin/client/bin/phpstan-bootstrap.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/build (added)
-
trunk/vendor/MENFGF/trustedlogin/client/build/build-sass.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/client.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/composer.json (added)
-
trunk/vendor/MENFGF/trustedlogin/client/composer.lock (added)
-
trunk/vendor/MENFGF/trustedlogin/client/index.html (added)
-
trunk/vendor/MENFGF/trustedlogin/client/languages (added)
-
trunk/vendor/MENFGF/trustedlogin/client/languages/trustedlogin-client.pot (added)
-
trunk/vendor/MENFGF/trustedlogin/client/mkdocs.yml (added)
-
trunk/vendor/MENFGF/trustedlogin/client/package-lock.json (added)
-
trunk/vendor/MENFGF/trustedlogin/client/package.json (added)
-
trunk/vendor/MENFGF/trustedlogin/client/phpstan.neon.dist (added)
-
trunk/vendor/MENFGF/trustedlogin/client/phpunit.xml.dist (added)
-
trunk/vendor/MENFGF/trustedlogin/client/pull_request_template.md (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Admin.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Ajax.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Client.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Config.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Cron.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Encryption.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Endpoint.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Envelope.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Form.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Logger.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Logging.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Remote.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/SecurityChecks.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/SiteAccess.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/SupportRole.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/SupportUser.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/Utils.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/index.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/_auth.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/_buttons.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/_global.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/_namespace.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/_variables.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/index.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/src/trustedlogin.scss (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.css (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.css.map (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.js (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/assets/trustedlogin.svg (added)
-
trunk/vendor/MENFGF/trustedlogin/client/src/index.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/bootstrap.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-ajax.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-client.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-config.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-encryption.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-logging.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-remote.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-siteaccess.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-users.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/tests/test-utils.php (added)
-
trunk/vendor/MENFGF/trustedlogin/client/yarn.lock (added)
-
trunk/vendor/autoload.php (modified) (1 diff)
-
trunk/vendor/bin (added)
-
trunk/vendor/bin/build-sass (added)
-
trunk/vendor/composer/autoload_aliases.php (modified) (9 diffs)
-
trunk/vendor/composer/autoload_files.php (modified) (1 diff)
-
trunk/vendor/composer/autoload_real.php (modified) (2 diffs)
-
trunk/vendor/composer/autoload_static.php (modified) (2 diffs)
-
trunk/vendor/composer/installed.json (modified) (2 diffs)
-
trunk/vendor/composer/installed.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
mass-email-notifications-for-gravity-forms/tags/1.3.7/class-mass-email-notifications-for-gravity-forms.php
r3422687 r3444395 241 241 ], 242 242 // Freemius pages use the SDK menu slug (underscored) even if our AdminShell page uses a hyphenated slug. 243 AdminShell::freemius_tabs( $this->_slug)243 $this->get_freemius_tabs() 244 244 ), 245 245 ] ); 246 246 // Admin actions to toggle feed activation and unsuppress emails from the GravityOps tabs. 247 247 add_action( 'admin_post_menfgf_toggle_feed', [$this, 'handle_toggle_feed'] ); 248 add_action( 'admin_post_menfgf_toggle_workflow_step', [$this, 'handle_toggle_workflow_step'] ); 248 249 add_action( 'admin_post_menfgf_unsuppress', [$this, 'handle_unsuppress'] ); 249 250 $param = 'https://wordpress.org/support/plugin/mass-email-notifications-for-gravity-forms/reviews/#new-post'; … … 315 316 ]; 316 317 } 318 $workflow_steps = []; 319 if ( class_exists( AdminShell::class ) ) { 320 $workflow_steps = AdminShell::get_workflow_steps_by_type( 'menfgf_create_batch' ); 321 } 317 322 AdminShell::render_feeds_list( 318 323 $feeds_and_forms, 319 324 $this->_slug, 320 325 $this->_short_title, 321 'menfgf_toggle_feed' 326 'menfgf_toggle_feed', 327 $workflow_steps 322 328 ); 323 329 } … … 402 408 403 409 /** 410 * Handle: Toggle workflow step activation from the Feeds tab (AdminShell) 411 * 412 * @return void 413 */ 414 public function handle_toggle_workflow_step() { 415 AdminShell::process_feed_toggle( 'menfgf_toggle_workflow_step', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ); 416 } 417 418 /** 404 419 * Handle: Unsuppress an email from the Suppressions tab 405 420 * … … 452 467 $plan = menfgf_fs()->get_plan(); 453 468 return ( is_object( $plan ) ? $plan->name : (( menfgf_fs()->is_free_plan() ? 'free' : 'unknown' )) ); 469 } 470 471 /** 472 * Filter the AdminShell tabs to hide the Account tab if the user is not registered. 473 * 474 * @return array 475 */ 476 private function get_freemius_tabs() { 477 $tabs = AdminShell::freemius_tabs( $this->_slug ); 478 if ( !menfgf_fs()->is_registered() ) { 479 unset($tabs['account']); 480 } 481 return $tabs; 454 482 } 455 483 … … 537 565 */ 538 566 public function get_menu_icon() { 539 return $this->get_base_url() . '/includes/images/icon.svg';567 return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' ); 540 568 } 541 569 … … 549 577 */ 550 578 public function get_app_menu_icon() { 551 return SuiteMenu::get_icon();579 return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: SuiteMenu::get_icon() ); 552 580 } 553 581 -
mass-email-notifications-for-gravity-forms/tags/1.3.7/mass-email-notifications-for-gf.php
r3422687 r3444395 6 6 * Author URI: https://brightleafdigital.io/ 7 7 * Description: Allows you to send notifications to everyone who filled out any of your forms. 8 * Version: 1.3. 68 * Version: 1.3.7 9 9 * Author: BrightLeaf Digital 10 10 * License: GPL-2.0+ … … 13 13 * @package MassEmailNotificationsForGravityForms 14 14 */ 15 use MENFGF\GravityOps\Core\Admin\AdminShell;15 use function MENFGF\GravityOps\Core\Admin\gravityops_shell; 16 16 if ( !defined( 'ABSPATH' ) ) { 17 17 exit; … … 19 19 } 20 20 require_once __DIR__ . '/vendor/autoload.php'; 21 if ( file_exists( __DIR__ . '/vendor/MENFGF/autoload.php' ) ) { 22 require_once __DIR__ . '/vendor/MENFGF/autoload.php'; 23 } 21 24 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded. 22 25 add_action( 'plugins_loaded', function () { 23 AdminShell::instance();26 gravityops_shell(); 24 27 }, 1 ); 25 28 if ( function_exists( 'menfgf_fs' ) ) { … … 71 74 } 72 75 menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' ); 73 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3. 6' );76 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.7' ); 74 77 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) ); 75 78 add_action( 'admin_notices', function () { … … 100 103 // Ensure GravityOps shared assets resolve when library is vendor-installed in this plugin. 101 104 add_filter( 'gravityops_assets_base_url', function ( $url ) { 102 if ( !empty( $url ) && is_string( $url )) {105 if ( $url ) { 103 106 return $url; 104 107 } 105 return plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ ); 108 if ( file_exists( __DIR__ . '/vendor/MENFGF/gravityops/core/assets/' ) ) { 109 return plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ ); 110 } 111 return plugins_url( 'vendor/gravityops/core/assets/', __FILE__ ); 106 112 } ); 107 113 add_action( -
mass-email-notifications-for-gravity-forms/tags/1.3.7/readme.txt
r3422687 r3444395 2 2 Tested up to: 6.9 3 3 Tags: GravityForms, notifications, email, task management, automation 4 Stable tag: 1.3. 64 Stable tag: 1.3.7 5 5 Requires PHP: 8.0 6 6 License: GPLv2 or later … … 44 44 == Changelog == 45 45 46 = 1.3.7 | Jan 21, 2026 = 47 * Bumped version of core GravityOps library to fix some bugs regarding the plugin admin menus and integrate [TrustedLogin](https://www.trustedlogin.com/about/easy-and-safe/) 48 46 49 = 1.3.6 | Dec 18, 2025 = 47 50 * Fixed a bug in the new plugin menu where installed plugins would show as uninstalled … … 64 67 * Added better support for viewing email content previews in the admin panel and strengthened CSV file handling for more accurate imports. 65 68 * Tweaked permissions and review prompts to make the plugin even more user-friendly, plus a few behind-the-scenes updates for better performance. 66 67 = 1.3.2 =68 * Added shortocde support for premium and agency plans.69 * Added a GravityFlow workflow step for premium and agency plans. -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/autoload.php
r3422687 r3444395 20 20 require_once __DIR__ . '/composer/autoload_real.php'; 21 21 22 return ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa::getLoader();22 return ComposerAutoloaderInit576698bb6db496a6b33a55636c894704::getLoader(); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/autoload_classmap.php
r3420036 r3444395 13 13 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php', 14 14 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/Admin/SurveyPrompter.php', 15 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/Admin/TrustedLogin.php', 15 16 'MENFGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php', 16 17 'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php', 17 18 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php', 19 'MENFGF\\TrustedLogin\\Admin' => $vendorDir . '/trustedlogin/client/src/Admin.php', 20 'MENFGF\\TrustedLogin\\Ajax' => $vendorDir . '/trustedlogin/client/src/Ajax.php', 21 'MENFGF\\TrustedLogin\\Client' => $vendorDir . '/trustedlogin/client/src/Client.php', 22 'MENFGF\\TrustedLogin\\Config' => $vendorDir . '/trustedlogin/client/src/Config.php', 23 'MENFGF\\TrustedLogin\\Cron' => $vendorDir . '/trustedlogin/client/src/Cron.php', 24 'MENFGF\\TrustedLogin\\Encryption' => $vendorDir . '/trustedlogin/client/src/Encryption.php', 25 'MENFGF\\TrustedLogin\\Endpoint' => $vendorDir . '/trustedlogin/client/src/Endpoint.php', 26 'MENFGF\\TrustedLogin\\Envelope' => $vendorDir . '/trustedlogin/client/src/Envelope.php', 27 'MENFGF\\TrustedLogin\\Form' => $vendorDir . '/trustedlogin/client/src/Form.php', 28 'MENFGF\\TrustedLogin\\Logger' => $vendorDir . '/trustedlogin/client/src/Logger.php', 29 'MENFGF\\TrustedLogin\\Logging' => $vendorDir . '/trustedlogin/client/src/Logging.php', 30 'MENFGF\\TrustedLogin\\Remote' => $vendorDir . '/trustedlogin/client/src/Remote.php', 31 'MENFGF\\TrustedLogin\\SecurityChecks' => $vendorDir . '/trustedlogin/client/src/SecurityChecks.php', 32 'MENFGF\\TrustedLogin\\SiteAccess' => $vendorDir . '/trustedlogin/client/src/SiteAccess.php', 33 'MENFGF\\TrustedLogin\\SupportRole' => $vendorDir . '/trustedlogin/client/src/SupportRole.php', 34 'MENFGF\\TrustedLogin\\SupportUser' => $vendorDir . '/trustedlogin/client/src/SupportUser.php', 35 'MENFGF\\TrustedLogin\\Utils' => $vendorDir . '/trustedlogin/client/src/Utils.php', 18 36 ); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/autoload_psr4.php
r3420036 r3444395 7 7 8 8 return array( 9 'MENFGF\\TrustedLogin\\' => array($vendorDir . '/trustedlogin/client/src'), 9 10 'MENFGF\\GravityOps\\Core\\' => array($vendorDir . '/gravityops/core/src'), 10 11 ); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/autoload_real.php
r3422687 r3444395 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa5 class ComposerAutoloaderInit576698bb6db496a6b33a55636c894704 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__)); 29 spl_autoload_unregister(array('ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader')); 30 30 31 31 require __DIR__ . '/autoload_static.php'; 32 call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::getInitializer($loader));32 call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::getInitializer($loader)); 33 33 34 34 $loader->setClassMapAuthoritative(true); 35 35 $loader->register(true); 36 36 37 $filesToLoad = \MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::$files; 38 $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { 39 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { 40 $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; 41 42 require $file; 43 } 44 }, null, null); 45 foreach ($filesToLoad as $fileIdentifier => $file) { 46 $requireFile($fileIdentifier, $file); 47 } 48 37 49 return $loader; 38 50 } -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/autoload_static.php
r3422687 r3444395 5 5 namespace MENFGF\Composer\Autoload; 6 6 7 class ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa7 class ComposerStaticInit576698bb6db496a6b33a55636c894704 8 8 { 9 public static $files = array ( 10 '6450a9b713c361c66ed3f0575f164e85' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php', 11 ); 12 9 13 public static $prefixLengthsPsr4 = array ( 10 14 'M' => 11 15 array ( 16 'MENFGF\\TrustedLogin\\' => 20, 12 17 'MENFGF\\GravityOps\\Core\\' => 23, 13 18 ), … … 15 20 16 21 public static $prefixDirsPsr4 = array ( 22 'MENFGF\\TrustedLogin\\' => 23 array ( 24 0 => __DIR__ . '/..' . '/trustedlogin/client/src', 25 ), 17 26 'MENFGF\\GravityOps\\Core\\' => 18 27 array ( … … 28 37 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php', 29 38 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SurveyPrompter.php', 39 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/Admin/TrustedLogin.php', 30 40 'MENFGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php', 31 41 'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php', 32 42 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php', 43 'MENFGF\\TrustedLogin\\Admin' => __DIR__ . '/..' . '/trustedlogin/client/src/Admin.php', 44 'MENFGF\\TrustedLogin\\Ajax' => __DIR__ . '/..' . '/trustedlogin/client/src/Ajax.php', 45 'MENFGF\\TrustedLogin\\Client' => __DIR__ . '/..' . '/trustedlogin/client/src/Client.php', 46 'MENFGF\\TrustedLogin\\Config' => __DIR__ . '/..' . '/trustedlogin/client/src/Config.php', 47 'MENFGF\\TrustedLogin\\Cron' => __DIR__ . '/..' . '/trustedlogin/client/src/Cron.php', 48 'MENFGF\\TrustedLogin\\Encryption' => __DIR__ . '/..' . '/trustedlogin/client/src/Encryption.php', 49 'MENFGF\\TrustedLogin\\Endpoint' => __DIR__ . '/..' . '/trustedlogin/client/src/Endpoint.php', 50 'MENFGF\\TrustedLogin\\Envelope' => __DIR__ . '/..' . '/trustedlogin/client/src/Envelope.php', 51 'MENFGF\\TrustedLogin\\Form' => __DIR__ . '/..' . '/trustedlogin/client/src/Form.php', 52 'MENFGF\\TrustedLogin\\Logger' => __DIR__ . '/..' . '/trustedlogin/client/src/Logger.php', 53 'MENFGF\\TrustedLogin\\Logging' => __DIR__ . '/..' . '/trustedlogin/client/src/Logging.php', 54 'MENFGF\\TrustedLogin\\Remote' => __DIR__ . '/..' . '/trustedlogin/client/src/Remote.php', 55 'MENFGF\\TrustedLogin\\SecurityChecks' => __DIR__ . '/..' . '/trustedlogin/client/src/SecurityChecks.php', 56 'MENFGF\\TrustedLogin\\SiteAccess' => __DIR__ . '/..' . '/trustedlogin/client/src/SiteAccess.php', 57 'MENFGF\\TrustedLogin\\SupportRole' => __DIR__ . '/..' . '/trustedlogin/client/src/SupportRole.php', 58 'MENFGF\\TrustedLogin\\SupportUser' => __DIR__ . '/..' . '/trustedlogin/client/src/SupportUser.php', 59 'MENFGF\\TrustedLogin\\Utils' => __DIR__ . '/..' . '/trustedlogin/client/src/Utils.php', 33 60 ); 34 61 … … 36 63 { 37 64 return \Closure::bind(function () use ($loader) { 38 $loader->prefixLengthsPsr4 = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$prefixLengthsPsr4;39 $loader->prefixDirsPsr4 = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$prefixDirsPsr4;40 $loader->classMap = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$classMap;65 $loader->prefixLengthsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixLengthsPsr4; 66 $loader->prefixDirsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixDirsPsr4; 67 $loader->classMap = ComposerStaticInit576698bb6db496a6b33a55636c894704::$classMap; 41 68 42 69 }, null, ClassLoader::class); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/installed.json
r3422687 r3444395 3 3 "1": { 4 4 "name": "gravityops/core", 5 "version": "1. 0.21",6 "version_normalized": "1. 0.21.0",5 "version": "1.1.0", 6 "version_normalized": "1.1.0.0", 7 7 "source": { 8 8 "type": "git", 9 9 "url": "[email protected]:Eitan-brightleaf/gravityops.git", 10 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522"10 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e" 11 11 }, 12 12 "dist": { 13 13 "type": "zip", 14 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/ 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",15 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",14 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e", 15 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e", 16 16 "shasum": "" 17 17 }, 18 18 "require": { 19 "php": ">=7.4" 19 "php": ">=7.4", 20 "trustedlogin/client": "^v1.9" 20 21 }, 21 "time": "202 5-12-18T07:45:02+00:00",22 "time": "2026-01-21T19:42:14+00:00", 22 23 "type": "library", 23 24 "installation-source": "source", … … 25 26 "psr-4": { 26 27 "MENFGF\\GravityOps\\Core\\": "src/" 27 } 28 }, 29 "files": [ 30 "src/Admin/functions.php" 31 ] 28 32 }, 29 33 "license": [ … … 32 36 "description": "Shared core library for GravityOps plugins", 33 37 "install-path": "../gravityops/core" 38 }, 39 "2": { 40 "name": "trustedlogin/client", 41 "version": "v1.9.0", 42 "version_normalized": "1.9.0.0", 43 "source": { 44 "type": "git", 45 "url": "https://github.com/trustedlogin/client.git", 46 "reference": "b913058ae57b512a7766f449ab8d55952500fe72" 47 }, 48 "dist": { 49 "type": "zip", 50 "url": "https://api.github.com/repos/trustedlogin/client/zipball/b913058ae57b512a7766f449ab8d55952500fe72", 51 "reference": "b913058ae57b512a7766f449ab8d55952500fe72", 52 "shasum": "" 53 }, 54 "require-dev": { 55 "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 56 "ext-curl": "*", 57 "ext-json": "*", 58 "php": ">=5.3.0", 59 "phpcompatibility/phpcompatibility-wp": "^2.1", 60 "phpstan/extension-installer": "^1.3", 61 "phpstan/phpstan": "^1.10", 62 "szepeviktor/phpstan-wordpress": "^1.3", 63 "wp-coding-standards/wpcs": "^3.0", 64 "yoast/phpunit-polyfills": "^1.0.0" 65 }, 66 "time": "2024-08-26T01:13:42+00:00", 67 "bin": [ 68 "bin/build-sass" 69 ], 70 "type": "library", 71 "installation-source": "dist", 72 "autoload": { 73 "psr-4": { 74 "MENFGF\\TrustedLogin\\": "src/" 75 } 76 }, 77 "notification-url": "https://packagist.org/downloads/", 78 "license": [ 79 "GPL-2.0-or-later" 80 ], 81 "authors": [ 82 { 83 "name": "TrustedLogin", 84 "email": "[email protected]", 85 "homepage": "https://www.trustedlogin.com" 86 } 87 ], 88 "description": "Easily and securely log in to your customers sites when providing support.", 89 "homepage": "https://www.trustedlogin.com", 90 "keywords": [ 91 "login", 92 "security", 93 "support" 94 ], 95 "support": { 96 "issues": "https://github.com/trustedlogin/client/issues", 97 "source": "https://github.com/trustedlogin/client/tree/v1.9.0" 98 }, 99 "install-path": "../trustedlogin/client" 34 100 } 35 101 }, -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/composer/installed.php
r3422687 r3444395 2 2 'root' => 3 3 array ( 4 'name' => ' __root__',4 'name' => 'gravityops/mass-email', 5 5 'pretty_version' => 'dev-main', 6 6 'version' => 'dev-main', 7 'reference' => ' 4b921b3009464563093dfd512b32f402b1533e6b',7 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 8 8 'type' => 'library', 9 9 'install_path' => __DIR__ . '/../', … … 17 17 'gravityops/core' => 18 18 array ( 19 'pretty_version' => '1. 0.21',20 'version' => '1. 0.21.0',21 'reference' => ' 5d859a7cca5cf8c1e469c80a88e755fb1be7c522',19 'pretty_version' => '1.1.0', 20 'version' => '1.1.0.0', 21 'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e', 22 22 'type' => 'library', 23 23 'install_path' => __DIR__ . '/../gravityops/core', … … 27 27 'dev_requirement' => false, 28 28 ), 29 'trustedlogin/client' => 30 array ( 31 'pretty_version' => 'v1.9.0', 32 'version' => '1.9.0.0', 33 'reference' => 'b913058ae57b512a7766f449ab8d55952500fe72', 34 'type' => 'library', 35 'install_path' => __DIR__ . '/../trustedlogin/client', 36 'aliases' => 37 array ( 38 ), 39 'dev_requirement' => false, 40 ), 29 41 ), 30 42 ); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/composer.json
r3420036 r3444395 5 5 "license": "GPL-2.0-or-later", 6 6 "require": { 7 "php": ">=7.4" 7 "php": ">=7.4", 8 "trustedlogin/client": "^v1.9" 8 9 }, 9 10 "autoload": { 10 11 "psr-4": { 11 12 "GravityOps\\Core\\": "src/" 12 } 13 }, 14 "files": [ 15 "src/Admin/functions.php" 16 ] 13 17 } 14 18 } -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php
r3422687 r3444395 2 2 3 3 namespace MENFGF\GravityOps\Core\Admin; 4 5 use GFAPI; 6 use MENFGF\GravityOps\Core\SuiteRegistry; 4 7 5 8 if ( ! defined( 'ABSPATH' ) ) { … … 19 22 * The highest version across loaded copies should be selected as provider. 20 23 */ 21 public const CORE_VERSION = '1. 0.21';24 public const CORE_VERSION = '1.1.0'; 22 25 23 26 /** … … 102 105 // Each copy registers this, but only the selected provider will actually boot. 103 106 // If instantiated after plugins_loaded has already fired, boot immediately. 104 if ( function_exists( 'did_action' ) && did_action( 'plugins_loaded' ) ) { 107 global $wp_filter; 108 $has_run_already = did_action( 'plugins_loaded' ) && ! doing_action( 'plugins_loaded' ); 109 $is_past_priority = false; 110 111 if ( doing_action( 'plugins_loaded' ) && isset( $wp_filter['plugins_loaded'] ) ) { 112 $is_past_priority = $wp_filter['plugins_loaded']->current_priority() > 20; 113 } 114 115 if ( $has_run_already || $is_past_priority ) { 105 116 $this->maybe_boot(); 106 117 } else { … … 155 166 // differs from the SDK menu slug (e.g., hyphenated vs underscored). 156 167 $fs_slug = $plugin_slug; 157 // Built-in mapping for known cases.158 if ( 'mass-email-from-gf-notification' === $plugin_slug ) {159 $fs_slug = 'mass_email_notifications_for_gf';160 }161 168 // External override if needed. 162 169 $fs_slug = apply_filters( 'gravityops_freemius_base_slug', $fs_slug, $plugin_slug ); … … 194 201 * @param string $plugin_short_title Short plugin title used for the header, e.g., "Asana Integration". 195 202 * @param string $toggle_action The admin_post action to handle toggle, used for form action and nonce prefix. 203 * @param array $workflow_steps Optional array of workflow steps to display in the feed list. 196 204 * 197 205 * @return void 198 206 */ 199 public static function render_feeds_list( $feeds_and_forms, $gf_subview_slug, $plugin_short_title, $toggle_action ) {207 public static function render_feeds_list( $feeds_and_forms, $gf_subview_slug, $plugin_short_title, $toggle_action, $workflow_steps = [] ) { 200 208 echo '<div class="gops-card">'; 201 209 echo '<h2 class="gops-title" style="margin:0 0 10px;">' . esc_html( $plugin_short_title ) . ' Feeds</h2>'; … … 203 211 if ( empty( $feeds_and_forms ) ) { 204 212 echo '<p>No feeds found. Create one from a form’s settings.</p>'; 205 echo '</div>'; 206 return; 207 } 208 209 echo '<ul style="margin:0; padding-left:18px;">'; 210 foreach ( $feeds_and_forms as $feed_and_form ) { 211 $feed = $feed_and_form['feed']; 212 $form = $feed_and_form['form']; 213 $form_id = $form['id']; 214 $form_name = $form['title']; 215 $feed_id = $feed['id']; 216 $is_active = (bool) $feed['is_active']; 217 $name = $feed['meta']['feedName']; 218 219 $edit_form = admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ); 220 $edit_feed = add_query_arg( 213 } else { 214 echo '<ul style="margin:0; padding-left:18px;">'; 215 foreach ( $feeds_and_forms as $feed_and_form ) { 216 $feed = $feed_and_form['feed']; 217 $form = $feed_and_form['form']; 218 $form_id = $form['id']; 219 $form_name = $form['title']; 220 $feed_id = $feed['id']; 221 $is_active = (bool) $feed['is_active']; 222 $name = $feed['meta']['feedName']; 223 224 $edit_form = admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ); 225 $edit_feed = add_query_arg( 221 226 [ 222 'page' => 'gf_edit_forms',223 'view' => 'settings',224 'subview' => $gf_subview_slug,225 'fid' => $feed_id,226 'id' => $form_id,227 'page' => 'gf_edit_forms', 228 'view' => 'settings', 229 'subview' => $gf_subview_slug, 230 'fid' => $feed_id, 231 'id' => $form_id, 227 232 ], 228 233 admin_url( 'admin.php' ) 229 ); 230 231 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 232 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_feed ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 233 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 234 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_form ) . '">' . esc_html( $form_name ) . '</a>'; 235 // Toggle button 236 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 237 echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />'; 238 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />'; 239 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />'; 240 $label = $is_active ? 'Deactivate' : 'Activate'; 241 $cls = $is_active ? 'button' : 'button button-primary'; 242 echo '<button class="' . esc_attr( $cls ) . '" type="submit">' . esc_html( $label ) . '</button>'; 243 echo '</form>'; 244 echo '</li>'; 245 } 246 echo '</ul>'; 234 ); 235 236 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 237 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_feed ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 238 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 239 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_form ) . '">' . esc_html( $form_name ) . '</a>'; 240 // Toggle button 241 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 242 echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />'; 243 echo '<input type="hidden" name="return_url" value="' . esc_attr( 'admin.php?page=' . $gf_subview_slug . '&tab=feeds' ) . '" />'; 244 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />'; 245 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />'; 246 $label = $is_active ? 'Deactivate' : 'Activate'; 247 $cls = $is_active ? 'button' : 'button button-primary'; 248 echo '<button class="' . esc_attr( $cls ) . '" type="submit">' . esc_html( $label ) . '</button>'; 249 echo '</form>'; 250 echo '</li>'; 251 } 252 echo '</ul>'; 253 } 247 254 echo '</div>'; 255 256 if ( ! empty( $workflow_steps ) ) { 257 echo '<div class="gops-card" style="margin-top:20px;">'; 258 echo '<h2 class="gops-title" style="margin:0 0 10px;">Workflow Steps</h2>'; 259 echo '<ul style="margin:0; padding-left:18px;">'; 260 $workflow_toggle_action = str_replace( '_toggle_feed', '_toggle_workflow_step', $toggle_action ); 261 if ( $workflow_toggle_action === $toggle_action ) { 262 $workflow_toggle_action = 'gravityops_toggle_workflow_step'; 263 } 264 265 foreach ( $workflow_steps as $item ) { 266 $step = $item['step']; 267 $form = $item['form']; 268 $form_id = $form['id']; 269 $form_name = $form['title']; 270 $step_id = $step['id']; 271 $is_active = (bool) ( $step['is_active'] ?? true ); 272 $name = $step['step_label'] ?? ( 'Step #' . $step_id ); 273 274 $edit_step = add_query_arg( 275 [ 276 'page' => 'gf_edit_forms', 277 'view' => 'settings', 278 'subview' => 'gravityflow', 279 'fid' => $step_id, 280 'id' => $form_id, 281 ], 282 admin_url( 'admin.php' ) 283 ); 284 285 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 286 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_step ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 287 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 288 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ) ) . '">' . esc_html( $form_name ) . '</a>'; 289 // Toggle button for workflow step 290 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 291 echo '<input type="hidden" name="action" value="' . esc_attr( $workflow_toggle_action ) . '" />'; 292 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $step_id ) . '" />'; 293 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $workflow_toggle_action . '_' . $step_id ) ) . '" />'; 294 295 echo '<input type="hidden" name="return_url" value="' . esc_attr( 'admin.php?page=' . $gf_subview_slug . '&tab=feeds' ) . '" />'; 296 $step_label = $is_active ? 'Deactivate' : 'Activate'; 297 $step_cls = $is_active ? 'button' : 'button button-primary'; 298 echo '<button class="' . esc_attr( $step_cls ) . '" type="submit">' . esc_html( $step_label ) . '</button>'; 299 echo '</form>'; 300 301 echo '</li>'; 302 } 303 echo '</ul>'; 304 echo '</div>'; 305 } 248 306 } 249 307 … … 263 321 } 264 322 265 $fid = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput 323 $fid = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput 324 $post_return_url = isset( $_POST['return_url'] ) ? sanitize_text_field( wp_unslash( $_POST['return_url'] ) ) : ''; 325 if ( ! empty( $post_return_url ) ) { 326 $return_url = $post_return_url; 327 } 328 266 329 $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_wpnonce'] ) ) : ''; 267 330 if ( ! $fid || ! wp_verify_nonce( $nonce, $action_prefix . '_' . $fid ) ) { … … 290 353 291 354 /** 355 * Helper to fetch workflow steps for specific types across all forms. 356 * 357 * @param string|array $step_types The step type(s) to filter by (e.g. 'iawgf_update_task' or ['type1', 'type2']). 358 * @return array Array of items, each having 'step' (array) and 'form' (array). 359 */ 360 public static function get_workflow_steps_by_type( $step_types ) { 361 if ( ! function_exists( 'gravity_flow' ) || ! class_exists( 'GFAPI' ) ) { 362 return []; 363 } 364 365 $step_types = (array) $step_types; 366 367 global $wpdb; 368 $table_name = $wpdb->prefix . 'gf_addon_feed'; 369 370 // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared 371 // Check if table exists 372 $has_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name; 373 if ( ! $has_table ) { 374 return []; 375 } 376 377 // Workflow steps in Gravity Flow are stored as feeds for the 'gravityflow' addon. 378 $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name WHERE addon_slug = %s", 'gravityflow' ), ARRAY_A ); 379 // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared 380 381 if ( empty( $results ) ) { 382 return []; 383 } 384 385 $steps = []; 386 foreach ( $results as $row ) { 387 $meta = json_decode( (string) $row['meta'], true ); 388 if ( ! is_array( $meta ) ) { 389 continue; 390 } 391 392 $current_type = $meta['step_type'] ?? ''; 393 if ( in_array( $current_type, $step_types, true ) ) { 394 $form_id = isset( $row['form_id'] ) ? (int) $row['form_id'] : 0; 395 if ( ! $form_id ) { 396 continue; 397 } 398 $form = GFAPI::get_form( $form_id ); 399 if ( $form ) { 400 $steps[] = [ 401 'step' => [ 402 'id' => $row['id'], 403 'form_id' => $row['form_id'], 404 'is_active' => $row['is_active'], 405 'step_label' => $meta['step_name'] ?? ( 'Step #' . $row['id'] ), 406 ], 407 'form' => $form, 408 ]; 409 } 410 } 411 } 412 413 return $steps; 414 } 415 416 /** 292 417 * Render a standard Help tab card. 293 418 * … … 306 431 } 307 432 echo '</ul>'; 433 echo '<div style="margin-top: 20px;">'; 434 echo '<a class="button button-primary" href="' . esc_url( admin_url( 'admin.php?page=gravity_ops_support' ) ) . '">Grant Support Access</a>'; 308 435 echo '</div>'; 436 echo '</div>'; 437 } 438 439 /** 440 * Show coupons on the GravityOps dashboard for plugins that aren't installed as premium. 441 * 442 * @param string $content Existing content. 443 * @param array $item Plugin registry item. 444 * @return string 445 */ 446 public function maybe_render_dashboard_coupon( $content, $item ) { 447 // Folders and Search are free-only, no coupons. 448 if ( ! empty( $item['is_free'] ) ) { 449 return $content; 450 } 451 452 // If premium version is installed, don't show coupon. 453 if ( ! empty( $item['is_installed_prem'] ) ) { 454 return $content; 455 } 456 457 $coupons = [ 458 'integrate-asana-with-gravity-forms' => 'GRAVITYASANA10GIFT', 459 'mass_email_notifications_for_gf' => 'MASSEMAIL10GIFT', 460 'Recurring_Form_Submissions_For_Gravity_Form' => 'RECURSUB10GIFT', 461 'gravity_ops_global_variables' => 'GLOBVAR10GIFT', 462 'kanban-view-for-gravity-view' => 'KANBANVIEW10GIFT', 463 ]; 464 465 $slug = $item['slug'] ?? ''; 466 $coupon = $coupons[ $slug ] ?? ''; 467 468 if ( $coupon ) { 469 $content .= '<div class="gops-tile-coupon" style="margin-top:10px; font-size: 0.7em; color: #2271b1; font-weight: 500;">'; 470 $content .= '<p><small>Special Gift: Get 10% Off Premium!</small></p>'; 471 $content .= '<p><small>Use coupon code <code><small>' . esc_html( $coupon ) . '</small></code> at checkout.</small></p>'; 472 $content .= '</div>'; 473 } 474 475 return $content; 309 476 } 310 477 … … 329 496 } 330 497 $defaults = [ 498 'slug' => $slug, 331 499 'title' => $slug, 332 500 'menu_title' => $slug, … … 335 503 'links' => [], 336 504 'tabs' => [], // array id => [ 'label' => '', 'type' => 'render|link', 'callback' => callable, 'url' => '' ] 505 'render' => null, // callable to render the whole page content (used if no tabs) 337 506 ]; 338 507 $this->pages[ $slug ] = array_merge( $defaults, $args ); … … 362 531 } 363 532 533 $parent = 'gravity_ops'; 534 if ( 'gravity_ops_support' === $slug ) { 535 $parent = null; 536 } 537 364 538 add_submenu_page( 365 'gravity_ops',539 $parent, 366 540 $args['title'] ?? $slug, 367 541 $args['menu_title'] ?? ( $args['title'] ?? $slug ), … … 384 558 385 559 $pages_lower_case = array_change_key_case( $this->pages ); 386 $is_shell_page = isset( $pages_lower_case[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) ); 560 $is_shell_page = isset( $pages_lower_case[ $page ] ) || 'toplevel_page_gravity_ops' === $hook; 561 $is_shell_page = apply_filters( 'gravityops_is_shell_page', $is_shell_page, $page, $hook ); 387 562 388 563 // Optionally style Freemius pages in-place. … … 394 569 } 395 570 396 if ( ! $is_shell_page && ! $is_freemius ) { 571 $is_gf_page = ( 0 === strpos( $page, 'gf_' ) ) || ( false !== strpos( (string) $hook, 'forms_page_gf' ) ); 572 573 // Always load on our pages, Freemius pages, and GF pages. 574 // Also load globally by default to ensure the sidebar menu icon is consistently styled. 575 $load_globally = (bool) apply_filters( 'gravityops_load_admin_assets_globally', true ); 576 577 if ( ! $is_shell_page && ! $is_freemius && ! $is_gf_page && ! $load_globally ) { 397 578 return; 398 579 } 399 580 400 581 $assets = self::resolve_assets_urls(); 401 if ( ! empty( $assets['css'] ) ) { 402 wp_enqueue_style( 'gravityops-admin', $assets['css'], [], '1.0.0' ); 403 } 582 583 // Load minimal menu/icon CSS globally or on GF pages. 584 if ( ! empty( $assets['menu_css'] ) ) { 585 wp_enqueue_style( 'gravityops-menu', $assets['menu_css'], [], self::CORE_VERSION ); 586 } 587 588 // Load the full admin UI CSS only on our shell or Freemius pages. 589 if ( ! empty( $assets['css'] ) && ( $is_shell_page || $is_freemius ) ) { 590 wp_enqueue_style( 'gravityops-admin', $assets['css'], [ 'gravityops-menu' ], self::CORE_VERSION ); 591 } 592 404 593 // On Freemius pages also load a small override stylesheet to hide native tabs safely. 405 594 if ( $is_freemius ) { 406 595 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 407 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], '1.0.0');596 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], self::CORE_VERSION ); 408 597 } 409 598 if ( ! empty( $assets['js'] ) ) { 410 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], '1.0.0', true ); 599 // We only need the JS on our shell pages or Freemius pages where we inject tabs. 600 if ( ! $is_shell_page && ! $is_freemius ) { 601 return; 602 } 603 604 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], self::CORE_VERSION, true ); 605 606 // Identify the plugin and pass its config to JS 607 $config = null; 608 $current_slug = ''; 609 610 if ( $is_freemius ) { 611 foreach ( $this->pages as $slug => $args ) { 612 $fs_slug = $slug; 613 $fs_slug = apply_filters( 'gravityops_freemius_base_slug', $fs_slug, $slug ); 614 615 $normalized_page = str_replace( '_', '-', $page ); 616 $bases = [ 617 str_replace( '_', '-', strtolower( $fs_slug ) ), 618 str_replace( '_', '-', strtolower( $slug ) ), 619 ]; 620 621 $suffixes = [ '-account', '-pricing', '-affiliation' ]; 622 $valid_targets = array_merge( 623 ...array_map( fn( $b ) => array_map( fn( $s ) => $b . $s, $suffixes ), $bases ) 624 ); 625 626 if ( in_array( $normalized_page, $valid_targets, true ) ) { 627 $current_slug = $slug; 628 break; 629 } 630 } 631 } elseif ( $is_shell_page && isset( $this->pages[ $page ] ) ) { 632 $current_slug = $page; 633 } 634 635 if ( $current_slug && isset( $this->pages[ $current_slug ] ) ) { 636 $args = $this->pages[ $current_slug ]; 637 $tabs = []; 638 $base_url = admin_url( 'admin.php?page=' . $current_slug ); 639 640 foreach ( ( $args['tabs'] ?? [] ) as $id => $tab ) { 641 $tabs[] = [ 642 'id' => $id, 643 'label' => $tab['label'] ?? $id, 644 'url' => ( ( $tab['type'] ?? 'render' ) === 'link' ) ? ( $tab['url'] ?? '#' ) : add_query_arg( 'tab', $id, $base_url ), 645 ]; 646 } 647 648 $config = apply_filters( 649 'gravityops_admin_config', 650 [ 651 'slug' => $current_slug, 652 'title' => $args['title'] ?? '', 653 'tabs' => $tabs, 654 ], 655 $current_slug 656 ); 657 } 658 659 if ( $config ) { 660 wp_localize_script( 'gravityops-admin', 'gops_admin_config', $config ); 661 } 411 662 } 412 663 } … … 424 675 add_action( 'admin_menu', [ $this, 'register_menus' ], 99 ); 425 676 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); 677 add_filter( 'gravityops_tile_after_description', [ $this, 'maybe_render_dashboard_coupon' ], 10, 2 ); 678 679 // Initialize TrustedLogin on all page loads (for auth redirects and background tasks). 680 if ( class_exists( __NAMESPACE__ . '\MENFGF\TrustedLogin' ) ) { 681 TrustedLogin::get_instance(); 682 } 683 684 // Register the shared Support page. 685 $this->register_support_page(); 686 426 687 self::$did_boot = true; 688 } 689 690 /** 691 * Register the shared Support page under the GravityOps menu. 692 * 693 * @return void 694 */ 695 private function register_support_page() { 696 $this->register_plugin_page( 697 'gravity_ops_support', 698 [ 699 'title' => 'Grant Support Access', 700 'menu_title' => 'Support Access', 701 'capability' => class_exists( __NAMESPACE__ . '\SuiteMenu' ) ? SuiteMenu::get_parent_capability() : 'manage_options', 702 'hide_header' => true, 703 'render' => [ TrustedLogin::get_instance(), 'render_support_screen' ], 704 ] 705 ); 427 706 } 428 707 … … 470 749 } 471 750 472 $base_url = menu_page_url( $slug, false ); 751 $base_url = menu_page_url( $slug, false ); 752 $hide_header = ! empty( $args['hide_header'] ); 753 473 754 // Always render full wrapper + header here; notices will be relocated via JS beneath the header. 474 echo '<div class="wrap gops-admin">'; 475 $this->render_header_only( $args ); 755 echo '<div class="wrap gops-admin' . ( $hide_header ? ' gops-hide-header' : '' ) . '">'; 756 if ( ! $hide_header ) { 757 $this->render_header_only( $args ); 758 } 476 759 // Dedicated notices container prevents margin-collapsing into the header 477 760 echo '<div class="gops-notices" aria-live="polite"></div>'; … … 495 778 496 779 echo '<section class="gops-content">'; 497 if ( isset( $tabs[ $active ] ) ) {780 if ( ! empty( $tabs ) && isset( $tabs[ $active ] ) ) { 498 781 $tab = $tabs[ $active ]; 499 782 $type = $tab['type'] ?? 'render'; … … 501 784 call_user_func( $tab['callback'] ); 502 785 } 786 } elseif ( isset( $args['render'] ) && is_callable( $args['render'] ) ) { 787 call_user_func( $args['render'] ); 503 788 } 504 789 echo '</section>'; … … 514 799 * @return void 515 800 */ 516 private function render_header_only( $args ) { 801 public function render_header_only( $args ) { 802 $icon_url = ''; 803 if ( ! empty( $args['slug'] ) && class_exists( __NAMESPACE__ . '\SuiteMenu' ) ) { 804 $registry = SuiteRegistry::all(); 805 $item = null; 806 foreach ( $registry as $r ) { 807 if ( ( $r['slug'] ?? '' ) === $args['slug'] ) { 808 $item = $r; 809 break; 810 } 811 } 812 if ( $item ) { 813 $icon_url = SuiteMenu::resolve_plugin_icon_url( $item ); 814 } 815 } 517 816 ?> 518 <header class="gops-header"> 519 <div class="gops-header__left"> 520 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 521 <div class="gops-headings"> 522 <h1 class="gops-title"><?php echo esc_html( $args['title'] ?? '' ); ?></h1> 523 <?php if ( ! empty( $args['subtitle'] ) ) : ?> 524 <p class="gops-subtitle"><?php echo esc_html( $args['subtitle'] ); ?></p> 525 <?php endif; ?> 817 <div class="gops-header-wrapper"> 818 <?php if ( $icon_url ) : ?> 819 <img class="gops-header-icon" src="<?php echo esc_url( $icon_url ); ?>" alt="" width="80" height="80" /> 820 <?php endif; ?> 821 <header class="gops-header"> 822 <div class="gops-header__left"> 823 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 824 <div class="gops-headings"> 825 <h1 class="gops-title"><?php echo esc_html( $args['title'] ?? '' ); ?></h1> 826 <?php if ( ! empty( $args['subtitle'] ) ) : ?> 827 <p class="gops-subtitle"><?php echo esc_html( $args['subtitle'] ); ?></p> 828 <?php endif; ?> 829 </div> 526 830 </div> 527 </div>528 <?php if ( ! empty( $args['links'] ) && is_array( $args['links'] ) ) : ?>529 <div class="gops-header__right">530 <?php foreach ( $args['links'] as $label => $url ) : ?>531 < a class="gops-link" target="_blank" href="<?php echo esc_url( $url ); ?>"><?php echo esc_html( $label ); ?></a>532 < ?php endforeach; ?>533 < /div>534 < ?php endif; ?>535 </ header>831 <?php if ( ! empty( $args['links'] ) && is_array( $args['links'] ) ) : ?> 832 <div class="gops-header__right"> 833 <?php foreach ( $args['links'] as $label => $url ) : ?> 834 <a class="gops-link" target="_blank" href="<?php echo esc_url( $url ); ?>"><?php echo esc_html( $label ); ?></a> 835 <?php endforeach; ?> 836 </div> 837 <?php endif; ?> 838 </header> 839 </div> 536 840 <?php 537 841 } … … 548 852 * - Fallback to site_url('gravityops/assets/') if present 549 853 * 550 * @return array{css:string, js:string}854 * @return array{css:string,menu_css:string,js:string,base_url:string} 551 855 */ 552 856 public static function resolve_assets_urls() { 553 857 $base_url = apply_filters( 'gravityops_assets_base_url', '' ); 554 858 $css = ''; 859 $menu_css = ''; 555 860 $js = ''; 556 861 557 862 if ( is_string( $base_url ) && '' !== $base_url ) { 558 863 $base_url = trailingslashit( $base_url ); 559 $css = $base_url . 'admin.css'; 560 $js = $base_url . 'admin.js'; 864 $css = $base_url . 'css/admin.css'; 865 $menu_css = $base_url . 'css/menu.css'; 866 $js = $base_url . 'js/admin.js'; 561 867 return [ 562 'css' => $css, 563 'js' => $js, 868 'css' => $css, 869 'menu_css' => $menu_css, 870 'js' => $js, 871 'base_url' => $base_url, 564 872 ]; 565 873 } … … 567 875 // Try resolving relative to this class file (../../assets) 568 876 $assets_path = wp_normalize_path( dirname( __DIR__, 2 ) . '/assets' ); 569 $css_path = $assets_path . '/admin.css'; 570 $js_path = $assets_path . '/admin.js'; 571 572 if ( file_exists( $css_path ) || file_exists( $js_path ) ) { 877 $css_path = $assets_path . '/css/admin.css'; 878 $menu_path = $assets_path . '/css/menu.css'; 879 $js_path = $assets_path . '/js/admin.js'; 880 881 if ( file_exists( $css_path ) || file_exists( $js_path ) || file_exists( $menu_path ) ) { 573 882 $content_dir = wp_normalize_path( WP_CONTENT_DIR ); 574 883 if ( 0 === strpos( $assets_path, $content_dir ) ) { … … 583 892 } 584 893 if ( $base_url ) { 585 $css = file_exists( $css_path ) ? $base_url . 'admin.css' : ''; 586 $js = file_exists( $js_path ) ? $base_url . 'admin.js' : ''; 894 $css = file_exists( $css_path ) ? $base_url . 'css/admin.css' : ''; 895 $menu_css = file_exists( $menu_path ) ? $base_url . 'css/menu.css' : ''; 896 $js = file_exists( $js_path ) ? $base_url . 'js/admin.js' : ''; 587 897 return [ 588 'css' => $css, 589 'js' => $js, 898 'css' => $css, 899 'menu_css' => $menu_css, 900 'js' => $js, 901 'base_url' => $base_url, 590 902 ]; 591 903 } … … 594 906 // Fallback to root-level gravityops/assets 595 907 $root_assets = 'gravityops/assets/'; 596 if ( file_exists( ABSPATH . $root_assets . 'admin.css' ) ) { 597 $css = site_url( $root_assets . 'admin.css' ); 598 } 599 if ( file_exists( ABSPATH . $root_assets . 'admin.js' ) ) { 600 $js = site_url( $root_assets . 'admin.js' ); 908 $base_url = trailingslashit( site_url( $root_assets ) ); 909 if ( file_exists( ABSPATH . $root_assets . 'css/admin.css' ) ) { 910 $css = $base_url . 'css/admin.css'; 911 } 912 if ( file_exists( ABSPATH . $root_assets . 'css/menu.css' ) ) { 913 $menu_css = $base_url . 'css/menu.css'; 914 } 915 if ( file_exists( ABSPATH . $root_assets . 'js/admin.js' ) ) { 916 $js = $base_url . 'js/admin.js'; 601 917 } 602 918 return [ 603 'css' => $css, 604 'js' => $js, 919 'css' => $css, 920 'menu_css' => $menu_css, 921 'js' => $js, 922 'base_url' => $base_url, 605 923 ]; 606 924 } -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/ReviewPrompter.php
r3420036 r3444395 77 77 78 78 if ( $current_count > $threshold ) { 79 add_action( 'admin_notices', [ $this, 'render_notice' ]);79 $this->render_notice(); 80 80 } 81 81 } … … 120 120 } 121 121 122 $nonce = wp_create_nonce( $this->prefix . 'rating_asked' ); 123 ?> 124 <div class="notice notice-success is-dismissible"> 125 <h3>Thank you for using <?php echo esc_html( $this->plugin_title ); ?>! I noticed you've used it a lot!</h3> 126 <h4> 127 If you like the plugin and find it helpful, can you do us a big favor and <a 128 href="<?php echo esc_url( $url ); ?>" 129 target="_blank" rel="noreferrer">rate it</a> with ⭐⭐⭐⭐⭐? 130 It helps us spread the word and boost our motivation. 131 </h4> 132 <form method="post" action=""> 133 <input type="hidden" name="<?php echo esc_attr( $this->prefix . 'rating_nonce' ); ?>" value="<?php echo esc_attr( $nonce ); ?>"> 134 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="remind">Remind me later</button> 135 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="done">Done!</button> 136 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="done">Not Interested</button> 137 </form> 138 </div> 139 <?php 122 $nonce_field = $this->prefix . 'rating_nonce'; 123 $action_field = $this->prefix . 'rating_action'; 124 $nonce_action = $this->prefix . 'rating_asked'; 125 $plugin_title = $this->plugin_title; 126 127 $nonce = wp_create_nonce( $nonce_action ); 128 129 $current_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended 130 $is_gops_page = ( 'gravity_ops' === $current_page || AdminShell::has_page( $current_page ) ); 131 $notice_classes = 'notice notice-success is-dismissible'; 132 if ( $is_gops_page ) { 133 $notice_classes .= ' inline'; 134 } 135 add_action( 136 'admin_notices', 137 function () use ( $nonce, $action_field, $nonce_field, $plugin_title, $url, $notice_classes ) { 138 ?> 139 <div class="<?= esc_attr( $notice_classes ); ?>"> 140 <h3>Thank you for using <?php echo esc_html( $plugin_title ); ?>! I noticed you've used it a lot!</h3> 141 <h4> 142 If you like the plugin and find it helpful, can you do us a big favor and <a 143 href="<?php echo esc_url( $url ); ?>" 144 target="_blank" rel="noreferrer">rate it</a> with ⭐⭐⭐⭐⭐? 145 It helps us spread the word and boost our motivation. 146 </h4> 147 <form method="post" action=""> 148 <input type="hidden" name="<?php echo esc_attr( $nonce_field ); ?>" value="<?php echo esc_attr( $nonce ); ?>"> 149 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="remind">Remind me later</button> 150 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="done">Done!</button> 151 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="done">Not Interested</button> 152 </form> 153 </div> 154 <?php 155 } 156 ); 140 157 } 141 158 -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php
r3422687 r3444395 216 216 } 217 217 $registry[ $key ]['is_installed'] = $is_installed; 218 $registry[ $key ]['is_installed_prem'] = ! empty( $item['is_free'] ) ? false : $is_installed; 219 $registry[ $key ]['is_installed_free'] = ! empty( $item['is_free'] ) ? $is_installed : false; 218 220 $registry[ $key ]['is_active'] = $is_active; 219 221 $registry[ $key ]['version'] = $version; … … 270 272 // Updates: consider whichever is installed; prefer premium if both 271 273 if ( $upd_prem || $upd_free ) { 272 $has_update = $upd_prem || $upd_free; 273 $new_version = $upd_prem ? $new_prem : $new_free; 274 ++$updates_count; 274 $has_update = $upd_prem || ( $upd_free && ! $is_installed_prem ); 275 $new_version = $upd_prem ? $new_prem : ( $is_installed_prem ? '' : $new_free ); 276 if ( $has_update ) { 277 ++$updates_count; 278 } 275 279 } 276 280 … … 284 288 285 289 $registry[ $key ]['is_installed'] = $is_installed; 290 $registry[ $key ]['is_installed_prem'] = $is_installed_prem; 291 $registry[ $key ]['is_installed_free'] = $is_installed_free; 286 292 $registry[ $key ]['is_active'] = $is_active; 287 293 $registry[ $key ]['version'] = $version; … … 328 334 ?> 329 335 <div class="wrap gops-admin"> 330 <header class="gops-header"> 331 <div class="gops-header__left"> 332 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 333 <div class="gops-headings"> 334 <h1 class="gops-title">Run Your Business on WordPress</h1> 335 <p class="gops-subtitle">All your GravityOps tools in one place.</p> 336 <div class="gops-header-wrapper"> 337 <img class="gops-header-icon" src="<?php echo esc_url( self::get_icon() ); ?>" alt="" width="80" height="80" /> 338 <header class="gops-header"> 339 <div class="gops-header__left"> 340 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 341 <div class="gops-headings"> 342 <h1 class="gops-title">Run Your Business on WordPress</h1> 343 <p class="gops-subtitle">All your GravityOps tools in one place.</p> 344 </div> 336 345 </div> 337 </div>338 <div class="gops-header__right">339 < a class="button button-primary" target="_blank" rel="noopener" href="https://brightleafdigital.io/plugintomember">Join Community</a>340 </ div>341 </ header>346 <div class="gops-header__right"> 347 <a class="button button-primary" target="_blank" rel="noopener" href="https://brightleafdigital.io/plugintomember">Join Community</a> 348 </div> 349 </header> 350 </div> 342 351 <div class="gops-notices" aria-live="polite"></div> 343 352 … … 404 413 if ( $icon_url ) : 405 414 ?> 406 <img class="gops-tile__iconimg" width=" 22" height="22" src="<?php echo esc_url( $icon_url ); ?>" alt=""/>415 <img class="gops-tile__iconimg" width="48" height="48" src="<?php echo esc_url( $icon_url ); ?>" alt=""/> 407 416 <?php else : ?> 408 417 <div class="gops-tile__icon" aria-hidden="true"><?php echo isset( $item['icon_html'] ) ? wp_kses_post( $item['icon_html'] ) : '🔧'; ?></div> … … 411 420 </div> 412 421 <p class="gops-tile__desc"><?php echo esc_html( $item['description'] ); ?></p> 422 <?php echo wp_kses_post( apply_filters( 'gravityops_tile_after_description', '', $item ) ); ?> 413 423 <div class="gops-tile__meta"> 414 <span class="gops-badge<?php echo $is_active ? ' gops-badge--ok' : ' gops-badge--warn'; ?>">415 <?php echo $is_active ? 'Active' : ( $is_installed ? 'Inactive' : 'Not Installed' ); ?>416 </span>417 424 <?php if ( ! empty( $item['uses_free'] ) ) : ?> 418 425 <span class="gops-badge">Free</span> 419 <?php endif; ?>420 <?php if ( $version ) : ?>421 <span class="gops-tile__version">v<?php echo esc_html( $version ); ?></span>422 426 <?php endif; ?> 423 427 <?php if ( $has_update ) : ?> … … 427 431 428 432 <div class="gops-tile__actions"> 429 <?php if ( $is_installed ) : ?> 430 <?php if ( current_user_can( 'activate_plugins' ) ) : ?> 431 <form class="gops-action" method="post" action="<?php echo esc_url( $base_url ); ?>"> 432 <?php wp_nonce_field( 'gops_toggle_' . ( $item['plugin_file_action'] ?? $item['plugin_file'] ), 'gops_nonce' ); ?> 433 <input type="hidden" name="gops-action" value="<?php echo $is_active ? 'deactivate' : 'activate'; ?>" /> 434 <input type="hidden" name="plugin" value="<?php echo esc_attr( $is_active ? ( $item['plugin_file_active'] ?: ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ) : ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ); ?>" /> 435 <button class="button<?php echo $is_active ? '' : ' button-primary'; ?>" type="submit"><?php echo $is_active ? 'Deactivate' : 'Activate'; ?></button> 436 </form> 433 <div class="gops-tile__action-group"> 434 <?php if ( $version ) : ?> 435 <span class="gops-tile__version">v<?php echo esc_html( $version ); ?></span> 437 436 <?php endif; ?> 438 <?php else : ?> 439 <a class="button button-primary" target="_blank" href="<?php echo esc_url( ( $item['marketing_url'] ?? '' ) . '#pricing' ); ?>">Buy</a> 440 <?php endif; ?> 441 442 <a class="gops-link" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Learn More →</a> 437 <span class="gops-badge<?php echo $is_active ? ' gops-badge--ok' : ' gops-badge--warn'; ?>"> 438 <?php echo $is_active ? 'Active' : ( $is_installed ? 'Inactive' : 'Not Installed' ); ?> 439 </span> 440 441 <?php if ( $is_installed ) : ?> 442 <?php 443 if ( $has_update && current_user_can( 'update_plugins' ) ) : 444 // Use the file that actually has the update (prefer premium if both, though Issue 3 might have simplified this). 445 $update_file = ( isset( $upd_prem ) && $upd_prem ) ? $premium_file : ( ( isset( $upd_free ) && $upd_free ) ? $free_file : $item['plugin_file_action'] ); 446 $update_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . rawurlencode( $update_file ) ), 'upgrade-plugin_' . $update_file ); 447 ?> 448 <a class="button button-primary" href="<?php echo esc_url( $update_url ); ?>">Update Now</a> 449 <?php endif; ?> 450 451 <?php if ( current_user_can( 'activate_plugins' ) ) : ?> 452 <form class="gops-action" method="post" action="<?php echo esc_url( $base_url ); ?>"> 453 <?php wp_nonce_field( 'gops_toggle_' . ( $item['plugin_file_action'] ?? $item['plugin_file'] ), 'gops_nonce' ); ?> 454 <input type="hidden" name="gops-action" value="<?php echo $is_active ? 'deactivate' : 'activate'; ?>" /> 455 <input type="hidden" name="plugin" value="<?php echo esc_attr( $is_active ? ( $item['plugin_file_active'] ?: ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ) : ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ); ?>" /> 456 <button class="button<?php echo $is_active ? '' : ' button-primary'; ?>" type="submit"><?php echo $is_active ? 'Deactivate' : 'Activate'; ?></button> 457 </form> 458 <?php endif; ?> 459 <?php else : ?> 460 <?php if ( ! empty( $item['is_free'] ) ) : ?> 461 <a class="button button-primary" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Download Now</a> 462 <?php else : ?> 463 <a class="button button-primary" target="_blank" href="<?php echo esc_url( ( $item['marketing_url'] ?? '' ) . '#pricing' ); ?>">Buy</a> 464 <?php endif; ?> 465 <?php endif; ?> 466 </div> 467 468 <a class="gops-link gops-tile__learn-more" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Learn More →</a> 443 469 </div> 444 470 </div> … … 452 478 453 479 /** 480 * Helper to get a plugin's icon URL by its slug. 481 * 482 * @param string $slug Plugin slug as defined in SuiteRegistry. 483 * @return string Icon URL or empty string. 484 */ 485 public static function get_plugin_icon_url( $slug ) { 486 $registry = SuiteRegistry::all(); 487 foreach ( $registry as $item ) { 488 if ( ( $item['slug'] ?? '' ) === $slug ) { 489 return self::resolve_plugin_icon_url( $item ); 490 } 491 } 492 return ''; 493 } 494 495 /** 454 496 * Resolve a plugin icon URL from common asset locations, with filter override. 455 497 * … … 457 499 * @return string Icon URL or empty string if none found. 458 500 */ 459 p rivatestatic function resolve_plugin_icon_url( $item ) {501 public static function resolve_plugin_icon_url( $item ) { 460 502 $url = apply_filters( 'gravityops_plugin_icon_url', '', $item ); 461 503 if ( ! empty( $url ) ) { … … 463 505 } 464 506 465 if ( empty( $item['plugin_file'] ) ) { 466 return ''; 467 } 468 469 $plugin_main = WP_PLUGIN_DIR . '/' . $item['plugin_file']; 470 if ( ! file_exists( $plugin_main ) ) { 471 return ''; 472 } 473 474 // Base plugin URL for building asset URLs. 475 $base_url = plugins_url( '', $plugin_main ); 476 $base_dir = dirname( $plugin_main ); 477 478 $candidates = [ 479 'assets/icon.svg', 480 'assets/icon.png', 481 'assets/images/icon.svg', 482 'assets/images/icon.png', 483 'includes/images/icon.svg', 484 'includes/images/icon.png', 485 'assets/img/icon.svg', 486 'assets/img/icon.png', 487 ]; 488 foreach ( $candidates as $rel ) { 489 $path = $base_dir . '/' . $rel; 490 if ( file_exists( $path ) ) { 491 return $base_url . '/' . $rel; 492 } 493 } 494 495 // Wildcard: first match like assets/img/*-icon.svg|png 496 $wild_dirs = [ 'assets/img' ]; 497 foreach ( $wild_dirs as $wd ) { 498 $dir = $base_dir . '/' . $wd; 499 if ( is_dir( $dir ) ) { 500 $matches = array_merge( glob( $dir . '/*-icon.svg' ) ?: [], glob( $dir . '/*-icon.png' ) ?: [] ); 501 if ( ! empty( $matches ) ) { 502 // Return the first match 503 $first = $matches[0]; 504 return $base_url . '/' . $wd . '/' . basename( $first ); 507 if ( ! empty( $item['icon_filename'] ) ) { 508 $assets = class_exists( __NAMESPACE__ . '\AdminShell' ) ? AdminShell::resolve_assets_urls() : []; 509 $base = ! empty( $assets['base_url'] ) ? $assets['base_url'] : ( ! empty( $assets['css'] ) ? trailingslashit( dirname( $assets['css'], 2 ) ) : '' ); 510 if ( $base ) { 511 return $base . 'images/' . $item['icon_filename']; 512 } 513 } 514 515 $files_to_check = []; 516 if ( ! empty( $item['plugin_files'] ) ) { 517 if ( isset( $item['plugin_files']['premium'] ) ) { 518 $files_to_check[] = $item['plugin_files']['premium']; 519 } 520 if ( isset( $item['plugin_files']['free'] ) ) { 521 $files_to_check[] = $item['plugin_files']['free']; 522 } 523 } 524 if ( ! empty( $item['plugin_file'] ) ) { 525 $files_to_check[] = (string) $item['plugin_file']; 526 } 527 528 $files_to_check = array_unique( $files_to_check ); 529 530 foreach ( $files_to_check as $plugin_rel_file ) { 531 $plugin_main = WP_PLUGIN_DIR . '/' . $plugin_rel_file; 532 if ( ! file_exists( $plugin_main ) ) { 533 continue; 534 } 535 536 // Base plugin URL for building asset URLs. 537 $base_url = plugins_url( '', $plugin_main ); 538 $base_dir = dirname( $plugin_main ); 539 540 $candidates = [ 541 'assets/icon.svg', 542 'assets/icon.png', 543 'assets/images/icon.svg', 544 'assets/images/icon.png', 545 'includes/images/icon.svg', 546 'includes/images/icon.png', 547 'assets/img/icon.svg', 548 'assets/img/icon.png', 549 ]; 550 foreach ( $candidates as $rel ) { 551 $path = $base_dir . '/' . $rel; 552 if ( file_exists( $path ) ) { 553 return $base_url . '/' . $rel; 505 554 } 506 555 } 507 } 556 557 // Wildcard: first match like assets/img/*-icon.svg|png 558 $wild_dirs = [ 'assets/img', 'assets/images' ]; 559 foreach ( $wild_dirs as $wd ) { 560 $dir = $base_dir . '/' . $wd; 561 if ( is_dir( $dir ) ) { 562 $matches = array_merge( glob( $dir . '/*-icon.svg' ) ?: [], glob( $dir . '/*-icon.png' ) ?: [] ); 563 if ( ! empty( $matches ) ) { 564 // Return the first match 565 $first = $matches[0]; 566 return $base_url . '/' . $wd . '/' . basename( $first ); 567 } 568 } 569 } 570 } 571 508 572 return ''; 509 573 } … … 525 589 $is_gravityops_screen = ( false !== strpos( (string) $hook, 'gravity_ops' ) ) || ( 'gravity_ops' === $page ); 526 590 $is_freemius = (bool) preg_match( '/\-(account|pricing|affiliation)$/', $page ); 527 if ( ! $is_gravityops_screen && ! $is_freemius ) { 591 $is_gf_page = ( 0 === strpos( $page, 'gf_' ) ) || ( false !== strpos( (string) $hook, 'forms_page_gf' ) ); 592 593 // Always load on our pages, Freemius pages, and GF pages. 594 // Also load globally by default to ensure the sidebar menu icon is consistently styled. 595 $load_globally = (bool) apply_filters( 'gravityops_load_admin_assets_globally', true ); 596 597 if ( ! $is_gravityops_screen && ! $is_freemius && ! $is_gf_page && ! $load_globally ) { 528 598 return; 529 599 } … … 531 601 // Reuse AdminShell asset resolution to support both root and vendor installs. 532 602 if ( class_exists( __NAMESPACE__ . '\\AdminShell' ) ) { 533 $assets = AdminShell::resolve_assets_urls(); 534 if ( ! empty( $assets['css'] ) ) { 535 wp_enqueue_style( 'gravityops-admin', $assets['css'], [], '1.0.0' ); 536 } 537 if ( ! empty( $assets['js'] ) ) { 538 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], '1.0.0', true ); 539 } 540 // If this is a Freemius page, also enqueue the freemius.css override to hide native tabs. 541 if ( $is_freemius ) { 542 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 543 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], '1.0.0' ); 603 $assets = AdminShell::resolve_assets_urls(); 604 $version = defined( AdminShell::class . '::CORE_VERSION' ) ? AdminShell::CORE_VERSION : '1.0.0'; 605 606 // Load minimal menu/icon CSS globally or on GF pages. 607 if ( ! empty( $assets['menu_css'] ) ) { 608 wp_enqueue_style( 'gravityops-menu', $assets['menu_css'], [], $version ); 609 } 610 611 // Load the full admin UI CSS only on our screens or Freemius screens. 612 if ( ! empty( $assets['css'] ) && ( $is_gravityops_screen || $is_freemius ) ) { 613 wp_enqueue_style( 'gravityops-admin', $assets['css'], [ 'gravityops-menu' ], $version ); 614 } 615 616 // We only need the JS on our screens or Freemius screens. 617 if ( $is_gravityops_screen || $is_freemius ) { 618 if ( ! empty( $assets['js'] ) ) { 619 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], $version, true ); 620 } 621 // If this is a Freemius page, also enqueue the freemius.css override to hide native tabs. 622 if ( $is_freemius ) { 623 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 624 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], $version ); 625 } 544 626 } 545 627 } … … 637 719 public static function get_icon() { 638 720 $assets = class_exists( __NAMESPACE__ . '\AdminShell' ) ? AdminShell::resolve_assets_urls() : [ 639 'css' => '', 640 'js' => '', 721 'css' => '', 722 'js' => '', 723 'base_url' => '', 641 724 ]; 642 $base = ! empty( $assets[' css'] ) ? trailingslashit( dirname( $assets['css'] ) ) : '';643 $candidate = 'images/ icon.png';725 $base = ! empty( $assets['base_url'] ) ? $assets['base_url'] : ( ! empty( $assets['css'] ) ? trailingslashit( dirname( dirname( $assets['css'] ) ) ) : '' ); 726 $candidate = 'images/ops-icon.svg'; 644 727 $url = $base ? $base . $candidate : ''; 645 728 return apply_filters( 'gravityops_menu_icon_url', $url ); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/src/Admin/SurveyPrompter.php
r3420036 r3444395 125 125 $nonce_action = "{$this->prefix}do_survey"; 126 126 127 $current_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended 128 $is_gops_page = ( 'gravity_ops' === $current_page || AdminShell::has_page( $current_page ) ); 129 $notice_classes = 'notice notice-info is-dismissible'; 130 if ( $is_gops_page ) { 131 $notice_classes .= ' inline'; 132 } 127 133 add_action( 128 134 'admin_notices', 129 function () use ( $star_class, $rating_input_id, $rating_field, $like_field, $dislike_field, $recommend_field, $find_field, $nonce_field_name, $submit_field, $nonce_action ) {135 function () use ( $star_class, $rating_input_id, $rating_field, $like_field, $dislike_field, $recommend_field, $find_field, $nonce_field_name, $submit_field, $nonce_action, $notice_classes ) { 130 136 ?> 131 <div class=" notice notice-info is-dismissible">137 <div class="<?= esc_attr( $notice_classes ); ?>"> 132 138 <h3>We value your feedback!</h3> 133 139 <h4>Thank you for using <?= esc_html( $this->plugin_title ); ?>!</h4> -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/MENFGF/gravityops/core/src/SuiteRegistry.php
r3422687 r3444395 38 38 'is_free' => true, 39 39 'icon_html' => '🗂️', 40 'icon_filename' => 'f4g-icon.svg', 40 41 ], 41 42 [ … … 49 50 'is_free' => true, 50 51 'icon_html' => '🔎', 52 'icon_filename' => 'search-icon.svg', 51 53 ], 52 54 [ … … 65 67 'is_free' => false, 66 68 'icon_html' => '🅰️', 69 'icon_filename' => 'iawgf-icon.svg', 67 70 ], 68 71 [ … … 81 84 'is_free' => false, 82 85 'icon_html' => '✉️', 86 'icon_filename' => 'menfgf-icon.svg', 83 87 ], 84 88 [ … … 92 96 'is_free' => false, 93 97 'icon_html' => '🗂️', 98 'icon_filename' => 'kv4gv-icon.svg', 94 99 ], 95 100 [ … … 103 108 'is_free' => false, 104 109 'icon_html' => '🔁', 110 'icon_filename' => 'rfsfgf-icon.svg', 105 111 ], 106 112 [ … … 115 121 'is_free' => false, 116 122 'icon_html' => '∑', 123 'icon_filename' => 'gv4gm-icon.svg', 117 124 ], 118 125 ]; -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/autoload.php
r3422687 r3444395 20 20 require_once __DIR__ . '/composer/autoload_real.php'; 21 21 22 return ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e::getLoader();22 return ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5::getLoader(); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/autoload_aliases.php
r3422687 r3444395 2 2 3 3 // Functions and constants 4 5 namespace { 6 7 } 4 8 namespace GravityOps\Core\Admin { 5 9 if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){ … … 9 13 } 10 14 } 15 namespace TrustedLogin { 16 if(!function_exists('\\TrustedLogin\\function_exists')){ 17 function function_exists(...$args) { 18 return \MENFGF\TrustedLogin\function_exists(...func_get_args()); 19 } 20 } 21 } 11 22 12 23 13 24 namespace MENFGF { 14 25 26 use BrianHenryIE\Strauss\Types\AutoloadAliasInterface; 27 28 /** 29 * @see AutoloadAliasInterface 30 * 31 * @phpstan-type ClassAliasArray array{'type':'class',isabstract:bool,classname:string,namespace?:string,extends:string,implements:array<string>} 32 * @phpstan-type InterfaceAliasArray array{'type':'interface',interfacename:string,namespace?:string,extends:array<string>} 33 * @phpstan-type TraitAliasArray array{'type':'trait',traitname:string,namespace?:string,use:array<string>} 34 * @phpstan-type AutoloadAliasArray array<string,ClassAliasArray|InterfaceAliasArray|TraitAliasArray> 35 */ 15 36 class AliasAutoloader 16 37 { 17 38 private string $includeFilePath; 18 39 40 /** 41 * @var AutoloadAliasArray 42 */ 19 43 private array $autoloadAliases = array ( 20 44 'GravityOps\\Core\\Admin\\AdminShell' => … … 73 97 ), 74 98 ), 99 'GravityOps\\Core\\Admin\\TrustedLogin' => 100 array ( 101 'type' => 'class', 102 'classname' => 'TrustedLogin', 103 'isabstract' => false, 104 'namespace' => 'GravityOps\\Core\\Admin', 105 'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin', 106 'implements' => 107 array ( 108 ), 109 ), 75 110 'GravityOps\\Core\\SuiteRegistry' => 76 111 array ( … … 91 126 'namespace' => 'GravityOps\\Core\\Utils', 92 127 'extends' => 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper', 128 'implements' => 129 array ( 130 ), 131 ), 132 'TrustedLogin\\Admin' => 133 array ( 134 'type' => 'class', 135 'classname' => 'Admin', 136 'isabstract' => false, 137 'namespace' => 'TrustedLogin', 138 'extends' => 'MENFGF\\TrustedLogin\\Admin', 139 'implements' => 140 array ( 141 ), 142 ), 143 'TrustedLogin\\Ajax' => 144 array ( 145 'type' => 'class', 146 'classname' => 'Ajax', 147 'isabstract' => false, 148 'namespace' => 'TrustedLogin', 149 'extends' => 'MENFGF\\TrustedLogin\\Ajax', 150 'implements' => 151 array ( 152 ), 153 ), 154 'TrustedLogin\\Client' => 155 array ( 156 'type' => 'class', 157 'classname' => 'Client', 158 'isabstract' => false, 159 'namespace' => 'TrustedLogin', 160 'extends' => 'MENFGF\\TrustedLogin\\Client', 161 'implements' => 162 array ( 163 ), 164 ), 165 'TrustedLogin\\Config' => 166 array ( 167 'type' => 'class', 168 'classname' => 'Config', 169 'isabstract' => false, 170 'namespace' => 'TrustedLogin', 171 'extends' => 'MENFGF\\TrustedLogin\\Config', 172 'implements' => 173 array ( 174 ), 175 ), 176 'TrustedLogin\\Cron' => 177 array ( 178 'type' => 'class', 179 'classname' => 'Cron', 180 'isabstract' => false, 181 'namespace' => 'TrustedLogin', 182 'extends' => 'MENFGF\\TrustedLogin\\Cron', 183 'implements' => 184 array ( 185 ), 186 ), 187 'TrustedLogin\\Encryption' => 188 array ( 189 'type' => 'class', 190 'classname' => 'Encryption', 191 'isabstract' => false, 192 'namespace' => 'TrustedLogin', 193 'extends' => 'MENFGF\\TrustedLogin\\Encryption', 194 'implements' => 195 array ( 196 ), 197 ), 198 'TrustedLogin\\Endpoint' => 199 array ( 200 'type' => 'class', 201 'classname' => 'Endpoint', 202 'isabstract' => false, 203 'namespace' => 'TrustedLogin', 204 'extends' => 'MENFGF\\TrustedLogin\\Endpoint', 205 'implements' => 206 array ( 207 ), 208 ), 209 'TrustedLogin\\Envelope' => 210 array ( 211 'type' => 'class', 212 'classname' => 'Envelope', 213 'isabstract' => false, 214 'namespace' => 'TrustedLogin', 215 'extends' => 'MENFGF\\TrustedLogin\\Envelope', 216 'implements' => 217 array ( 218 ), 219 ), 220 'TrustedLogin\\Form' => 221 array ( 222 'type' => 'class', 223 'classname' => 'Form', 224 'isabstract' => false, 225 'namespace' => 'TrustedLogin', 226 'extends' => 'MENFGF\\TrustedLogin\\Form', 227 'implements' => 228 array ( 229 ), 230 ), 231 'TrustedLogin\\Logger' => 232 array ( 233 'type' => 'class', 234 'classname' => 'Logger', 235 'isabstract' => false, 236 'namespace' => 'TrustedLogin', 237 'extends' => 'MENFGF\\TrustedLogin\\Logger', 238 'implements' => 239 array ( 240 ), 241 ), 242 'TrustedLogin\\Logging' => 243 array ( 244 'type' => 'class', 245 'classname' => 'Logging', 246 'isabstract' => false, 247 'namespace' => 'TrustedLogin', 248 'extends' => 'MENFGF\\TrustedLogin\\Logging', 249 'implements' => 250 array ( 251 ), 252 ), 253 'TrustedLogin\\Remote' => 254 array ( 255 'type' => 'class', 256 'classname' => 'Remote', 257 'isabstract' => false, 258 'namespace' => 'TrustedLogin', 259 'extends' => 'MENFGF\\TrustedLogin\\Remote', 260 'implements' => 261 array ( 262 ), 263 ), 264 'TrustedLogin\\SecurityChecks' => 265 array ( 266 'type' => 'class', 267 'classname' => 'SecurityChecks', 268 'isabstract' => false, 269 'namespace' => 'TrustedLogin', 270 'extends' => 'MENFGF\\TrustedLogin\\SecurityChecks', 271 'implements' => 272 array ( 273 ), 274 ), 275 'TrustedLogin\\SiteAccess' => 276 array ( 277 'type' => 'class', 278 'classname' => 'SiteAccess', 279 'isabstract' => false, 280 'namespace' => 'TrustedLogin', 281 'extends' => 'MENFGF\\TrustedLogin\\SiteAccess', 282 'implements' => 283 array ( 284 ), 285 ), 286 'TrustedLogin\\SupportRole' => 287 array ( 288 'type' => 'class', 289 'classname' => 'SupportRole', 290 'isabstract' => false, 291 'namespace' => 'TrustedLogin', 292 'extends' => 'MENFGF\\TrustedLogin\\SupportRole', 293 'implements' => 294 array ( 295 ), 296 ), 297 'TrustedLogin\\SupportUser' => 298 array ( 299 'type' => 'class', 300 'classname' => 'SupportUser', 301 'isabstract' => false, 302 'namespace' => 'TrustedLogin', 303 'extends' => 'MENFGF\\TrustedLogin\\SupportUser', 304 'implements' => 305 array ( 306 ), 307 ), 308 'TrustedLogin\\Utils' => 309 array ( 310 'type' => 'class', 311 'classname' => 'Utils', 312 'isabstract' => false, 313 'namespace' => 'TrustedLogin', 314 'extends' => 'MENFGF\\TrustedLogin\\Utils', 315 'implements' => 316 array ( 317 ), 318 ), 319 'TrustedLogin\\TrustedLoginClientTest' => 320 array ( 321 'type' => 'class', 322 'classname' => 'TrustedLoginClientTest', 323 'isabstract' => false, 324 'namespace' => 'TrustedLogin', 325 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginClientTest', 326 'implements' => 327 array ( 328 ), 329 ), 330 'TrustedLogin\\TrustedLoginEncryptionTest' => 331 array ( 332 'type' => 'class', 333 'classname' => 'TrustedLoginEncryptionTest', 334 'isabstract' => false, 335 'namespace' => 'TrustedLogin', 336 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginEncryptionTest', 337 'implements' => 338 array ( 339 ), 340 ), 341 'TrustedLogin\\TrustedLoginLoggingTest' => 342 array ( 343 'type' => 'class', 344 'classname' => 'TrustedLoginLoggingTest', 345 'isabstract' => false, 346 'namespace' => 'TrustedLogin', 347 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginLoggingTest', 348 'implements' => 349 array ( 350 ), 351 ), 352 'TrustedLogin\\TrustedLoginRemoteTest' => 353 array ( 354 'type' => 'class', 355 'classname' => 'TrustedLoginRemoteTest', 356 'isabstract' => false, 357 'namespace' => 'TrustedLogin', 358 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginRemoteTest', 359 'implements' => 360 array ( 361 ), 362 ), 363 'TrustedLogin\\TrustedLoginSiteAccessTest' => 364 array ( 365 'type' => 'class', 366 'classname' => 'TrustedLoginSiteAccessTest', 367 'isabstract' => false, 368 'namespace' => 'TrustedLogin', 369 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginSiteAccessTest', 93 370 'implements' => 94 371 array ( … … 112 389 } 113 390 114 public function autoload($class) 391 /** 392 * @param string $class 393 */ 394 public function autoload($class): void 115 395 { 116 396 if (!isset($this->autoloadAliases[$class])) { … … 145 425 } 146 426 147 private function load(string $includeFile) 427 private function load(string $includeFile): void 148 428 { 149 429 file_put_contents($this->includeFilePath, $includeFile); … … 152 432 } 153 433 434 /** 435 * @param ClassAliasArray $class 436 */ 154 437 private function classTemplate(array $class): string 155 438 { … … 174 457 } 175 458 459 /** 460 * @param InterfaceAliasArray $interface 461 */ 176 462 private function interfaceTemplate(array $interface): string 177 463 { … … 188 474 EOD; 189 475 } 476 477 /** 478 * @param TraitAliasArray $trait 479 */ 190 480 private function traitTemplate(array $trait): string 191 481 { -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/autoload_files.php
r3422687 r3444395 8 8 return array( 9 9 '8d50dc88e56bace65e1e72f6017983ed' => $vendorDir . '/freemius/wordpress-sdk/start.php', 10 '9387666eac3fc37c9ef87deb087980c6' => $vendorDir . '/MENFGF/autoload.php',11 '79fa1c9a31d9f4c8c1a536bd9e014492' => $vendorDir . '/MENFGF/gravityops/core/src/Admin/functions.php',12 10 ); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/autoload_real.php
r3422687 r3444395 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e5 class ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); 29 spl_autoload_unregister(array('ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader')); 30 30 31 31 require __DIR__ . '/autoload_static.php'; 32 call_user_func(\Composer\Autoload\ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::getInitializer($loader));32 call_user_func(\Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::getInitializer($loader)); 33 33 34 34 $loader->register(true); 35 35 36 $filesToLoad = \Composer\Autoload\ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::$files;36 $filesToLoad = \Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$files; 37 37 $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { 38 38 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/autoload_static.php
r3422687 r3444395 5 5 namespace Composer\Autoload; 6 6 7 class ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e7 class ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5 8 8 { 9 9 public static $files = array ( 10 10 '8d50dc88e56bace65e1e72f6017983ed' => __DIR__ . '/..' . '/freemius/wordpress-sdk/start.php', 11 '9387666eac3fc37c9ef87deb087980c6' => __DIR__ . '/..' . '/MENFGF/autoload.php',12 '79fa1c9a31d9f4c8c1a536bd9e014492' => __DIR__ . '/..' . '/MENFGF/gravityops/core/src/Admin/functions.php',13 11 ); 14 12 … … 20 18 { 21 19 return \Closure::bind(function () use ($loader) { 22 $loader->classMap = ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::$classMap;20 $loader->classMap = ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$classMap; 23 21 24 22 }, null, ClassLoader::class); -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/installed.json
r3422687 r3444395 59 59 { 60 60 "name": "gravityops/core", 61 "version": "1. 0.21",62 "version_normalized": "1. 0.21.0",61 "version": "1.1.0", 62 "version_normalized": "1.1.0.0", 63 63 "source": { 64 64 "type": "git", 65 65 "url": "[email protected]:Eitan-brightleaf/gravityops.git", 66 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522"66 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e" 67 67 }, 68 68 "dist": { 69 69 "type": "zip", 70 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/ 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",71 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",70 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e", 71 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e", 72 72 "shasum": "" 73 73 }, 74 74 "require": { 75 "php": ">=7.4" 75 "php": ">=7.4", 76 "trustedlogin/client": "^v1.9" 76 77 }, 77 "time": "202 5-12-18T07:45:02+00:00",78 "time": "2026-01-21T19:42:14+00:00", 78 79 "type": "library", 79 80 "installation-source": "source", … … 84 85 "description": "Shared core library for GravityOps plugins", 85 86 "install-path": "../gravityops/core" 87 }, 88 { 89 "name": "trustedlogin/client", 90 "version": "v1.9.0", 91 "version_normalized": "1.9.0.0", 92 "source": { 93 "type": "git", 94 "url": "https://github.com/trustedlogin/client.git", 95 "reference": "b913058ae57b512a7766f449ab8d55952500fe72" 96 }, 97 "dist": { 98 "type": "zip", 99 "url": "https://api.github.com/repos/trustedlogin/client/zipball/b913058ae57b512a7766f449ab8d55952500fe72", 100 "reference": "b913058ae57b512a7766f449ab8d55952500fe72", 101 "shasum": "" 102 }, 103 "require-dev": { 104 "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 105 "ext-curl": "*", 106 "ext-json": "*", 107 "php": ">=5.3.0", 108 "phpcompatibility/phpcompatibility-wp": "^2.1", 109 "phpstan/extension-installer": "^1.3", 110 "phpstan/phpstan": "^1.10", 111 "szepeviktor/phpstan-wordpress": "^1.3", 112 "wp-coding-standards/wpcs": "^3.0", 113 "yoast/phpunit-polyfills": "^1.0.0" 114 }, 115 "time": "2024-08-26T01:13:42+00:00", 116 "bin": [ 117 "bin/build-sass" 118 ], 119 "type": "library", 120 "installation-source": "dist", 121 "autoload": [], 122 "notification-url": "https://packagist.org/downloads/", 123 "license": [ 124 "GPL-2.0-or-later" 125 ], 126 "authors": [ 127 { 128 "name": "TrustedLogin", 129 "email": "[email protected]", 130 "homepage": "https://www.trustedlogin.com" 131 } 132 ], 133 "description": "Easily and securely log in to your customers sites when providing support.", 134 "homepage": "https://www.trustedlogin.com", 135 "keywords": [ 136 "login", 137 "security", 138 "support" 139 ], 140 "support": { 141 "issues": "https://github.com/trustedlogin/client/issues", 142 "source": "https://github.com/trustedlogin/client/tree/v1.9.0" 143 }, 144 "install-path": "../trustedlogin/client" 86 145 } 87 146 ], -
mass-email-notifications-for-gravity-forms/tags/1.3.7/vendor/composer/installed.php
r3422687 r3444395 1 1 <?php return array( 2 2 'root' => array( 3 'name' => ' __root__',3 'name' => 'gravityops/mass-email', 4 4 'pretty_version' => 'dev-main', 5 5 'version' => 'dev-main', 6 'reference' => ' 4b921b3009464563093dfd512b32f402b1533e6b',6 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 7 7 'type' => 'library', 8 8 'install_path' => __DIR__ . '/../../', … … 11 11 ), 12 12 'versions' => array( 13 '__root__' => array(14 'pretty_version' => 'dev-main',15 'version' => 'dev-main',16 'reference' => '4b921b3009464563093dfd512b32f402b1533e6b',17 'type' => 'library',18 'install_path' => __DIR__ . '/../../',19 'aliases' => array(),20 'dev_requirement' => false,21 ),22 13 'freemius/wordpress-sdk' => array( 23 14 'pretty_version' => '2.13.0', … … 30 21 ), 31 22 'gravityops/core' => array( 32 'pretty_version' => '1. 0.21',33 'version' => '1. 0.21.0',34 'reference' => ' 5d859a7cca5cf8c1e469c80a88e755fb1be7c522',23 'pretty_version' => '1.1.0', 24 'version' => '1.1.0.0', 25 'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e', 35 26 'type' => 'library', 36 27 'install_path' => __DIR__ . '/../gravityops/core', … … 38 29 'dev_requirement' => false, 39 30 ), 31 'gravityops/mass-email' => array( 32 'pretty_version' => 'dev-main', 33 'version' => 'dev-main', 34 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 35 'type' => 'library', 36 'install_path' => __DIR__ . '/../../', 37 'aliases' => array(), 38 'dev_requirement' => false, 39 ), 40 'trustedlogin/client' => array( 41 'pretty_version' => 'v1.9.0', 42 'version' => '1.9.0.0', 43 'reference' => 'b913058ae57b512a7766f449ab8d55952500fe72', 44 'type' => 'library', 45 'install_path' => __DIR__ . '/../trustedlogin/client', 46 'aliases' => array(), 47 'dev_requirement' => false, 48 ), 40 49 ), 41 50 ); -
mass-email-notifications-for-gravity-forms/trunk/class-mass-email-notifications-for-gravity-forms.php
r3422687 r3444395 241 241 ], 242 242 // Freemius pages use the SDK menu slug (underscored) even if our AdminShell page uses a hyphenated slug. 243 AdminShell::freemius_tabs( $this->_slug)243 $this->get_freemius_tabs() 244 244 ), 245 245 ] ); 246 246 // Admin actions to toggle feed activation and unsuppress emails from the GravityOps tabs. 247 247 add_action( 'admin_post_menfgf_toggle_feed', [$this, 'handle_toggle_feed'] ); 248 add_action( 'admin_post_menfgf_toggle_workflow_step', [$this, 'handle_toggle_workflow_step'] ); 248 249 add_action( 'admin_post_menfgf_unsuppress', [$this, 'handle_unsuppress'] ); 249 250 $param = 'https://wordpress.org/support/plugin/mass-email-notifications-for-gravity-forms/reviews/#new-post'; … … 315 316 ]; 316 317 } 318 $workflow_steps = []; 319 if ( class_exists( AdminShell::class ) ) { 320 $workflow_steps = AdminShell::get_workflow_steps_by_type( 'menfgf_create_batch' ); 321 } 317 322 AdminShell::render_feeds_list( 318 323 $feeds_and_forms, 319 324 $this->_slug, 320 325 $this->_short_title, 321 'menfgf_toggle_feed' 326 'menfgf_toggle_feed', 327 $workflow_steps 322 328 ); 323 329 } … … 402 408 403 409 /** 410 * Handle: Toggle workflow step activation from the Feeds tab (AdminShell) 411 * 412 * @return void 413 */ 414 public function handle_toggle_workflow_step() { 415 AdminShell::process_feed_toggle( 'menfgf_toggle_workflow_step', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ); 416 } 417 418 /** 404 419 * Handle: Unsuppress an email from the Suppressions tab 405 420 * … … 452 467 $plan = menfgf_fs()->get_plan(); 453 468 return ( is_object( $plan ) ? $plan->name : (( menfgf_fs()->is_free_plan() ? 'free' : 'unknown' )) ); 469 } 470 471 /** 472 * Filter the AdminShell tabs to hide the Account tab if the user is not registered. 473 * 474 * @return array 475 */ 476 private function get_freemius_tabs() { 477 $tabs = AdminShell::freemius_tabs( $this->_slug ); 478 if ( !menfgf_fs()->is_registered() ) { 479 unset($tabs['account']); 480 } 481 return $tabs; 454 482 } 455 483 … … 537 565 */ 538 566 public function get_menu_icon() { 539 return $this->get_base_url() . '/includes/images/icon.svg';567 return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' ); 540 568 } 541 569 … … 549 577 */ 550 578 public function get_app_menu_icon() { 551 return SuiteMenu::get_icon();579 return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: SuiteMenu::get_icon() ); 552 580 } 553 581 -
mass-email-notifications-for-gravity-forms/trunk/mass-email-notifications-for-gf.php
r3422687 r3444395 6 6 * Author URI: https://brightleafdigital.io/ 7 7 * Description: Allows you to send notifications to everyone who filled out any of your forms. 8 * Version: 1.3. 68 * Version: 1.3.7 9 9 * Author: BrightLeaf Digital 10 10 * License: GPL-2.0+ … … 13 13 * @package MassEmailNotificationsForGravityForms 14 14 */ 15 use MENFGF\GravityOps\Core\Admin\AdminShell;15 use function MENFGF\GravityOps\Core\Admin\gravityops_shell; 16 16 if ( !defined( 'ABSPATH' ) ) { 17 17 exit; … … 19 19 } 20 20 require_once __DIR__ . '/vendor/autoload.php'; 21 if ( file_exists( __DIR__ . '/vendor/MENFGF/autoload.php' ) ) { 22 require_once __DIR__ . '/vendor/MENFGF/autoload.php'; 23 } 21 24 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded. 22 25 add_action( 'plugins_loaded', function () { 23 AdminShell::instance();26 gravityops_shell(); 24 27 }, 1 ); 25 28 if ( function_exists( 'menfgf_fs' ) ) { … … 71 74 } 72 75 menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' ); 73 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3. 6' );76 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.7' ); 74 77 define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) ); 75 78 add_action( 'admin_notices', function () { … … 100 103 // Ensure GravityOps shared assets resolve when library is vendor-installed in this plugin. 101 104 add_filter( 'gravityops_assets_base_url', function ( $url ) { 102 if ( !empty( $url ) && is_string( $url )) {105 if ( $url ) { 103 106 return $url; 104 107 } 105 return plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ ); 108 if ( file_exists( __DIR__ . '/vendor/MENFGF/gravityops/core/assets/' ) ) { 109 return plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ ); 110 } 111 return plugins_url( 'vendor/gravityops/core/assets/', __FILE__ ); 106 112 } ); 107 113 add_action( -
mass-email-notifications-for-gravity-forms/trunk/readme.txt
r3422687 r3444395 2 2 Tested up to: 6.9 3 3 Tags: GravityForms, notifications, email, task management, automation 4 Stable tag: 1.3. 64 Stable tag: 1.3.7 5 5 Requires PHP: 8.0 6 6 License: GPLv2 or later … … 44 44 == Changelog == 45 45 46 = 1.3.7 | Jan 21, 2026 = 47 * Bumped version of core GravityOps library to fix some bugs regarding the plugin admin menus and integrate [TrustedLogin](https://www.trustedlogin.com/about/easy-and-safe/) 48 46 49 = 1.3.6 | Dec 18, 2025 = 47 50 * Fixed a bug in the new plugin menu where installed plugins would show as uninstalled … … 64 67 * Added better support for viewing email content previews in the admin panel and strengthened CSV file handling for more accurate imports. 65 68 * Tweaked permissions and review prompts to make the plugin even more user-friendly, plus a few behind-the-scenes updates for better performance. 66 67 = 1.3.2 =68 * Added shortocde support for premium and agency plans.69 * Added a GravityFlow workflow step for premium and agency plans. -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/autoload.php
r3422687 r3444395 20 20 require_once __DIR__ . '/composer/autoload_real.php'; 21 21 22 return ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa::getLoader();22 return ComposerAutoloaderInit576698bb6db496a6b33a55636c894704::getLoader(); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_classmap.php
r3420036 r3444395 13 13 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php', 14 14 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/Admin/SurveyPrompter.php', 15 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/Admin/TrustedLogin.php', 15 16 'MENFGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php', 16 17 'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php', 17 18 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php', 19 'MENFGF\\TrustedLogin\\Admin' => $vendorDir . '/trustedlogin/client/src/Admin.php', 20 'MENFGF\\TrustedLogin\\Ajax' => $vendorDir . '/trustedlogin/client/src/Ajax.php', 21 'MENFGF\\TrustedLogin\\Client' => $vendorDir . '/trustedlogin/client/src/Client.php', 22 'MENFGF\\TrustedLogin\\Config' => $vendorDir . '/trustedlogin/client/src/Config.php', 23 'MENFGF\\TrustedLogin\\Cron' => $vendorDir . '/trustedlogin/client/src/Cron.php', 24 'MENFGF\\TrustedLogin\\Encryption' => $vendorDir . '/trustedlogin/client/src/Encryption.php', 25 'MENFGF\\TrustedLogin\\Endpoint' => $vendorDir . '/trustedlogin/client/src/Endpoint.php', 26 'MENFGF\\TrustedLogin\\Envelope' => $vendorDir . '/trustedlogin/client/src/Envelope.php', 27 'MENFGF\\TrustedLogin\\Form' => $vendorDir . '/trustedlogin/client/src/Form.php', 28 'MENFGF\\TrustedLogin\\Logger' => $vendorDir . '/trustedlogin/client/src/Logger.php', 29 'MENFGF\\TrustedLogin\\Logging' => $vendorDir . '/trustedlogin/client/src/Logging.php', 30 'MENFGF\\TrustedLogin\\Remote' => $vendorDir . '/trustedlogin/client/src/Remote.php', 31 'MENFGF\\TrustedLogin\\SecurityChecks' => $vendorDir . '/trustedlogin/client/src/SecurityChecks.php', 32 'MENFGF\\TrustedLogin\\SiteAccess' => $vendorDir . '/trustedlogin/client/src/SiteAccess.php', 33 'MENFGF\\TrustedLogin\\SupportRole' => $vendorDir . '/trustedlogin/client/src/SupportRole.php', 34 'MENFGF\\TrustedLogin\\SupportUser' => $vendorDir . '/trustedlogin/client/src/SupportUser.php', 35 'MENFGF\\TrustedLogin\\Utils' => $vendorDir . '/trustedlogin/client/src/Utils.php', 18 36 ); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_psr4.php
r3420036 r3444395 7 7 8 8 return array( 9 'MENFGF\\TrustedLogin\\' => array($vendorDir . '/trustedlogin/client/src'), 9 10 'MENFGF\\GravityOps\\Core\\' => array($vendorDir . '/gravityops/core/src'), 10 11 ); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_real.php
r3422687 r3444395 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa5 class ComposerAutoloaderInit576698bb6db496a6b33a55636c894704 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__)); 29 spl_autoload_unregister(array('ComposerAutoloaderInit f3a8ee65c4639a42d5f2af71ff334aaa', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader')); 30 30 31 31 require __DIR__ . '/autoload_static.php'; 32 call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::getInitializer($loader));32 call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::getInitializer($loader)); 33 33 34 34 $loader->setClassMapAuthoritative(true); 35 35 $loader->register(true); 36 36 37 $filesToLoad = \MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::$files; 38 $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { 39 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { 40 $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; 41 42 require $file; 43 } 44 }, null, null); 45 foreach ($filesToLoad as $fileIdentifier => $file) { 46 $requireFile($fileIdentifier, $file); 47 } 48 37 49 return $loader; 38 50 } -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_static.php
r3422687 r3444395 5 5 namespace MENFGF\Composer\Autoload; 6 6 7 class ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa7 class ComposerStaticInit576698bb6db496a6b33a55636c894704 8 8 { 9 public static $files = array ( 10 '6450a9b713c361c66ed3f0575f164e85' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php', 11 ); 12 9 13 public static $prefixLengthsPsr4 = array ( 10 14 'M' => 11 15 array ( 16 'MENFGF\\TrustedLogin\\' => 20, 12 17 'MENFGF\\GravityOps\\Core\\' => 23, 13 18 ), … … 15 20 16 21 public static $prefixDirsPsr4 = array ( 22 'MENFGF\\TrustedLogin\\' => 23 array ( 24 0 => __DIR__ . '/..' . '/trustedlogin/client/src', 25 ), 17 26 'MENFGF\\GravityOps\\Core\\' => 18 27 array ( … … 28 37 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php', 29 38 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SurveyPrompter.php', 39 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/Admin/TrustedLogin.php', 30 40 'MENFGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php', 31 41 'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php', 32 42 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php', 43 'MENFGF\\TrustedLogin\\Admin' => __DIR__ . '/..' . '/trustedlogin/client/src/Admin.php', 44 'MENFGF\\TrustedLogin\\Ajax' => __DIR__ . '/..' . '/trustedlogin/client/src/Ajax.php', 45 'MENFGF\\TrustedLogin\\Client' => __DIR__ . '/..' . '/trustedlogin/client/src/Client.php', 46 'MENFGF\\TrustedLogin\\Config' => __DIR__ . '/..' . '/trustedlogin/client/src/Config.php', 47 'MENFGF\\TrustedLogin\\Cron' => __DIR__ . '/..' . '/trustedlogin/client/src/Cron.php', 48 'MENFGF\\TrustedLogin\\Encryption' => __DIR__ . '/..' . '/trustedlogin/client/src/Encryption.php', 49 'MENFGF\\TrustedLogin\\Endpoint' => __DIR__ . '/..' . '/trustedlogin/client/src/Endpoint.php', 50 'MENFGF\\TrustedLogin\\Envelope' => __DIR__ . '/..' . '/trustedlogin/client/src/Envelope.php', 51 'MENFGF\\TrustedLogin\\Form' => __DIR__ . '/..' . '/trustedlogin/client/src/Form.php', 52 'MENFGF\\TrustedLogin\\Logger' => __DIR__ . '/..' . '/trustedlogin/client/src/Logger.php', 53 'MENFGF\\TrustedLogin\\Logging' => __DIR__ . '/..' . '/trustedlogin/client/src/Logging.php', 54 'MENFGF\\TrustedLogin\\Remote' => __DIR__ . '/..' . '/trustedlogin/client/src/Remote.php', 55 'MENFGF\\TrustedLogin\\SecurityChecks' => __DIR__ . '/..' . '/trustedlogin/client/src/SecurityChecks.php', 56 'MENFGF\\TrustedLogin\\SiteAccess' => __DIR__ . '/..' . '/trustedlogin/client/src/SiteAccess.php', 57 'MENFGF\\TrustedLogin\\SupportRole' => __DIR__ . '/..' . '/trustedlogin/client/src/SupportRole.php', 58 'MENFGF\\TrustedLogin\\SupportUser' => __DIR__ . '/..' . '/trustedlogin/client/src/SupportUser.php', 59 'MENFGF\\TrustedLogin\\Utils' => __DIR__ . '/..' . '/trustedlogin/client/src/Utils.php', 33 60 ); 34 61 … … 36 63 { 37 64 return \Closure::bind(function () use ($loader) { 38 $loader->prefixLengthsPsr4 = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$prefixLengthsPsr4;39 $loader->prefixDirsPsr4 = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$prefixDirsPsr4;40 $loader->classMap = ComposerStaticInit f3a8ee65c4639a42d5f2af71ff334aaa::$classMap;65 $loader->prefixLengthsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixLengthsPsr4; 66 $loader->prefixDirsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixDirsPsr4; 67 $loader->classMap = ComposerStaticInit576698bb6db496a6b33a55636c894704::$classMap; 41 68 42 69 }, null, ClassLoader::class); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.json
r3422687 r3444395 3 3 "1": { 4 4 "name": "gravityops/core", 5 "version": "1. 0.21",6 "version_normalized": "1. 0.21.0",5 "version": "1.1.0", 6 "version_normalized": "1.1.0.0", 7 7 "source": { 8 8 "type": "git", 9 9 "url": "[email protected]:Eitan-brightleaf/gravityops.git", 10 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522"10 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e" 11 11 }, 12 12 "dist": { 13 13 "type": "zip", 14 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/ 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",15 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",14 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e", 15 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e", 16 16 "shasum": "" 17 17 }, 18 18 "require": { 19 "php": ">=7.4" 19 "php": ">=7.4", 20 "trustedlogin/client": "^v1.9" 20 21 }, 21 "time": "202 5-12-18T07:45:02+00:00",22 "time": "2026-01-21T19:42:14+00:00", 22 23 "type": "library", 23 24 "installation-source": "source", … … 25 26 "psr-4": { 26 27 "MENFGF\\GravityOps\\Core\\": "src/" 27 } 28 }, 29 "files": [ 30 "src/Admin/functions.php" 31 ] 28 32 }, 29 33 "license": [ … … 32 36 "description": "Shared core library for GravityOps plugins", 33 37 "install-path": "../gravityops/core" 38 }, 39 "2": { 40 "name": "trustedlogin/client", 41 "version": "v1.9.0", 42 "version_normalized": "1.9.0.0", 43 "source": { 44 "type": "git", 45 "url": "https://github.com/trustedlogin/client.git", 46 "reference": "b913058ae57b512a7766f449ab8d55952500fe72" 47 }, 48 "dist": { 49 "type": "zip", 50 "url": "https://api.github.com/repos/trustedlogin/client/zipball/b913058ae57b512a7766f449ab8d55952500fe72", 51 "reference": "b913058ae57b512a7766f449ab8d55952500fe72", 52 "shasum": "" 53 }, 54 "require-dev": { 55 "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 56 "ext-curl": "*", 57 "ext-json": "*", 58 "php": ">=5.3.0", 59 "phpcompatibility/phpcompatibility-wp": "^2.1", 60 "phpstan/extension-installer": "^1.3", 61 "phpstan/phpstan": "^1.10", 62 "szepeviktor/phpstan-wordpress": "^1.3", 63 "wp-coding-standards/wpcs": "^3.0", 64 "yoast/phpunit-polyfills": "^1.0.0" 65 }, 66 "time": "2024-08-26T01:13:42+00:00", 67 "bin": [ 68 "bin/build-sass" 69 ], 70 "type": "library", 71 "installation-source": "dist", 72 "autoload": { 73 "psr-4": { 74 "MENFGF\\TrustedLogin\\": "src/" 75 } 76 }, 77 "notification-url": "https://packagist.org/downloads/", 78 "license": [ 79 "GPL-2.0-or-later" 80 ], 81 "authors": [ 82 { 83 "name": "TrustedLogin", 84 "email": "[email protected]", 85 "homepage": "https://www.trustedlogin.com" 86 } 87 ], 88 "description": "Easily and securely log in to your customers sites when providing support.", 89 "homepage": "https://www.trustedlogin.com", 90 "keywords": [ 91 "login", 92 "security", 93 "support" 94 ], 95 "support": { 96 "issues": "https://github.com/trustedlogin/client/issues", 97 "source": "https://github.com/trustedlogin/client/tree/v1.9.0" 98 }, 99 "install-path": "../trustedlogin/client" 34 100 } 35 101 }, -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.php
r3422687 r3444395 2 2 'root' => 3 3 array ( 4 'name' => ' __root__',4 'name' => 'gravityops/mass-email', 5 5 'pretty_version' => 'dev-main', 6 6 'version' => 'dev-main', 7 'reference' => ' 4b921b3009464563093dfd512b32f402b1533e6b',7 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 8 8 'type' => 'library', 9 9 'install_path' => __DIR__ . '/../', … … 17 17 'gravityops/core' => 18 18 array ( 19 'pretty_version' => '1. 0.21',20 'version' => '1. 0.21.0',21 'reference' => ' 5d859a7cca5cf8c1e469c80a88e755fb1be7c522',19 'pretty_version' => '1.1.0', 20 'version' => '1.1.0.0', 21 'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e', 22 22 'type' => 'library', 23 23 'install_path' => __DIR__ . '/../gravityops/core', … … 27 27 'dev_requirement' => false, 28 28 ), 29 'trustedlogin/client' => 30 array ( 31 'pretty_version' => 'v1.9.0', 32 'version' => '1.9.0.0', 33 'reference' => 'b913058ae57b512a7766f449ab8d55952500fe72', 34 'type' => 'library', 35 'install_path' => __DIR__ . '/../trustedlogin/client', 36 'aliases' => 37 array ( 38 ), 39 'dev_requirement' => false, 40 ), 29 41 ), 30 42 ); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/composer.json
r3420036 r3444395 5 5 "license": "GPL-2.0-or-later", 6 6 "require": { 7 "php": ">=7.4" 7 "php": ">=7.4", 8 "trustedlogin/client": "^v1.9" 8 9 }, 9 10 "autoload": { 10 11 "psr-4": { 11 12 "GravityOps\\Core\\": "src/" 12 } 13 }, 14 "files": [ 15 "src/Admin/functions.php" 16 ] 13 17 } 14 18 } -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php
r3422687 r3444395 2 2 3 3 namespace MENFGF\GravityOps\Core\Admin; 4 5 use GFAPI; 6 use MENFGF\GravityOps\Core\SuiteRegistry; 4 7 5 8 if ( ! defined( 'ABSPATH' ) ) { … … 19 22 * The highest version across loaded copies should be selected as provider. 20 23 */ 21 public const CORE_VERSION = '1. 0.21';24 public const CORE_VERSION = '1.1.0'; 22 25 23 26 /** … … 102 105 // Each copy registers this, but only the selected provider will actually boot. 103 106 // If instantiated after plugins_loaded has already fired, boot immediately. 104 if ( function_exists( 'did_action' ) && did_action( 'plugins_loaded' ) ) { 107 global $wp_filter; 108 $has_run_already = did_action( 'plugins_loaded' ) && ! doing_action( 'plugins_loaded' ); 109 $is_past_priority = false; 110 111 if ( doing_action( 'plugins_loaded' ) && isset( $wp_filter['plugins_loaded'] ) ) { 112 $is_past_priority = $wp_filter['plugins_loaded']->current_priority() > 20; 113 } 114 115 if ( $has_run_already || $is_past_priority ) { 105 116 $this->maybe_boot(); 106 117 } else { … … 155 166 // differs from the SDK menu slug (e.g., hyphenated vs underscored). 156 167 $fs_slug = $plugin_slug; 157 // Built-in mapping for known cases.158 if ( 'mass-email-from-gf-notification' === $plugin_slug ) {159 $fs_slug = 'mass_email_notifications_for_gf';160 }161 168 // External override if needed. 162 169 $fs_slug = apply_filters( 'gravityops_freemius_base_slug', $fs_slug, $plugin_slug ); … … 194 201 * @param string $plugin_short_title Short plugin title used for the header, e.g., "Asana Integration". 195 202 * @param string $toggle_action The admin_post action to handle toggle, used for form action and nonce prefix. 203 * @param array $workflow_steps Optional array of workflow steps to display in the feed list. 196 204 * 197 205 * @return void 198 206 */ 199 public static function render_feeds_list( $feeds_and_forms, $gf_subview_slug, $plugin_short_title, $toggle_action ) {207 public static function render_feeds_list( $feeds_and_forms, $gf_subview_slug, $plugin_short_title, $toggle_action, $workflow_steps = [] ) { 200 208 echo '<div class="gops-card">'; 201 209 echo '<h2 class="gops-title" style="margin:0 0 10px;">' . esc_html( $plugin_short_title ) . ' Feeds</h2>'; … … 203 211 if ( empty( $feeds_and_forms ) ) { 204 212 echo '<p>No feeds found. Create one from a form’s settings.</p>'; 205 echo '</div>'; 206 return; 207 } 208 209 echo '<ul style="margin:0; padding-left:18px;">'; 210 foreach ( $feeds_and_forms as $feed_and_form ) { 211 $feed = $feed_and_form['feed']; 212 $form = $feed_and_form['form']; 213 $form_id = $form['id']; 214 $form_name = $form['title']; 215 $feed_id = $feed['id']; 216 $is_active = (bool) $feed['is_active']; 217 $name = $feed['meta']['feedName']; 218 219 $edit_form = admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ); 220 $edit_feed = add_query_arg( 213 } else { 214 echo '<ul style="margin:0; padding-left:18px;">'; 215 foreach ( $feeds_and_forms as $feed_and_form ) { 216 $feed = $feed_and_form['feed']; 217 $form = $feed_and_form['form']; 218 $form_id = $form['id']; 219 $form_name = $form['title']; 220 $feed_id = $feed['id']; 221 $is_active = (bool) $feed['is_active']; 222 $name = $feed['meta']['feedName']; 223 224 $edit_form = admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ); 225 $edit_feed = add_query_arg( 221 226 [ 222 'page' => 'gf_edit_forms',223 'view' => 'settings',224 'subview' => $gf_subview_slug,225 'fid' => $feed_id,226 'id' => $form_id,227 'page' => 'gf_edit_forms', 228 'view' => 'settings', 229 'subview' => $gf_subview_slug, 230 'fid' => $feed_id, 231 'id' => $form_id, 227 232 ], 228 233 admin_url( 'admin.php' ) 229 ); 230 231 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 232 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_feed ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 233 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 234 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_form ) . '">' . esc_html( $form_name ) . '</a>'; 235 // Toggle button 236 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 237 echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />'; 238 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />'; 239 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />'; 240 $label = $is_active ? 'Deactivate' : 'Activate'; 241 $cls = $is_active ? 'button' : 'button button-primary'; 242 echo '<button class="' . esc_attr( $cls ) . '" type="submit">' . esc_html( $label ) . '</button>'; 243 echo '</form>'; 244 echo '</li>'; 245 } 246 echo '</ul>'; 234 ); 235 236 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 237 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_feed ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 238 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 239 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_form ) . '">' . esc_html( $form_name ) . '</a>'; 240 // Toggle button 241 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 242 echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />'; 243 echo '<input type="hidden" name="return_url" value="' . esc_attr( 'admin.php?page=' . $gf_subview_slug . '&tab=feeds' ) . '" />'; 244 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />'; 245 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />'; 246 $label = $is_active ? 'Deactivate' : 'Activate'; 247 $cls = $is_active ? 'button' : 'button button-primary'; 248 echo '<button class="' . esc_attr( $cls ) . '" type="submit">' . esc_html( $label ) . '</button>'; 249 echo '</form>'; 250 echo '</li>'; 251 } 252 echo '</ul>'; 253 } 247 254 echo '</div>'; 255 256 if ( ! empty( $workflow_steps ) ) { 257 echo '<div class="gops-card" style="margin-top:20px;">'; 258 echo '<h2 class="gops-title" style="margin:0 0 10px;">Workflow Steps</h2>'; 259 echo '<ul style="margin:0; padding-left:18px;">'; 260 $workflow_toggle_action = str_replace( '_toggle_feed', '_toggle_workflow_step', $toggle_action ); 261 if ( $workflow_toggle_action === $toggle_action ) { 262 $workflow_toggle_action = 'gravityops_toggle_workflow_step'; 263 } 264 265 foreach ( $workflow_steps as $item ) { 266 $step = $item['step']; 267 $form = $item['form']; 268 $form_id = $form['id']; 269 $form_name = $form['title']; 270 $step_id = $step['id']; 271 $is_active = (bool) ( $step['is_active'] ?? true ); 272 $name = $step['step_label'] ?? ( 'Step #' . $step_id ); 273 274 $edit_step = add_query_arg( 275 [ 276 'page' => 'gf_edit_forms', 277 'view' => 'settings', 278 'subview' => 'gravityflow', 279 'fid' => $step_id, 280 'id' => $form_id, 281 ], 282 admin_url( 'admin.php' ) 283 ); 284 285 echo '<li style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">'; 286 echo '<a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( $edit_step ) . '"><strong>' . esc_html( (string) $name ) . '</strong></a>'; 287 echo ' — ' . ( $is_active ? '<span class="gops-badge gops-badge--ok">Active</span>' : '<span class="gops-badge gops-badge--warn">Inactive</span>' ); 288 echo ' <a class="gops-link" target="_blank" rel="noopener" href="' . esc_url( admin_url( 'admin.php?page=gf_edit_forms&id=' . $form_id ) ) . '">' . esc_html( $form_name ) . '</a>'; 289 // Toggle button for workflow step 290 echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">'; 291 echo '<input type="hidden" name="action" value="' . esc_attr( $workflow_toggle_action ) . '" />'; 292 echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $step_id ) . '" />'; 293 echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $workflow_toggle_action . '_' . $step_id ) ) . '" />'; 294 295 echo '<input type="hidden" name="return_url" value="' . esc_attr( 'admin.php?page=' . $gf_subview_slug . '&tab=feeds' ) . '" />'; 296 $step_label = $is_active ? 'Deactivate' : 'Activate'; 297 $step_cls = $is_active ? 'button' : 'button button-primary'; 298 echo '<button class="' . esc_attr( $step_cls ) . '" type="submit">' . esc_html( $step_label ) . '</button>'; 299 echo '</form>'; 300 301 echo '</li>'; 302 } 303 echo '</ul>'; 304 echo '</div>'; 305 } 248 306 } 249 307 … … 263 321 } 264 322 265 $fid = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput 323 $fid = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput 324 $post_return_url = isset( $_POST['return_url'] ) ? sanitize_text_field( wp_unslash( $_POST['return_url'] ) ) : ''; 325 if ( ! empty( $post_return_url ) ) { 326 $return_url = $post_return_url; 327 } 328 266 329 $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_wpnonce'] ) ) : ''; 267 330 if ( ! $fid || ! wp_verify_nonce( $nonce, $action_prefix . '_' . $fid ) ) { … … 290 353 291 354 /** 355 * Helper to fetch workflow steps for specific types across all forms. 356 * 357 * @param string|array $step_types The step type(s) to filter by (e.g. 'iawgf_update_task' or ['type1', 'type2']). 358 * @return array Array of items, each having 'step' (array) and 'form' (array). 359 */ 360 public static function get_workflow_steps_by_type( $step_types ) { 361 if ( ! function_exists( 'gravity_flow' ) || ! class_exists( 'GFAPI' ) ) { 362 return []; 363 } 364 365 $step_types = (array) $step_types; 366 367 global $wpdb; 368 $table_name = $wpdb->prefix . 'gf_addon_feed'; 369 370 // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared 371 // Check if table exists 372 $has_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name; 373 if ( ! $has_table ) { 374 return []; 375 } 376 377 // Workflow steps in Gravity Flow are stored as feeds for the 'gravityflow' addon. 378 $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name WHERE addon_slug = %s", 'gravityflow' ), ARRAY_A ); 379 // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared 380 381 if ( empty( $results ) ) { 382 return []; 383 } 384 385 $steps = []; 386 foreach ( $results as $row ) { 387 $meta = json_decode( (string) $row['meta'], true ); 388 if ( ! is_array( $meta ) ) { 389 continue; 390 } 391 392 $current_type = $meta['step_type'] ?? ''; 393 if ( in_array( $current_type, $step_types, true ) ) { 394 $form_id = isset( $row['form_id'] ) ? (int) $row['form_id'] : 0; 395 if ( ! $form_id ) { 396 continue; 397 } 398 $form = GFAPI::get_form( $form_id ); 399 if ( $form ) { 400 $steps[] = [ 401 'step' => [ 402 'id' => $row['id'], 403 'form_id' => $row['form_id'], 404 'is_active' => $row['is_active'], 405 'step_label' => $meta['step_name'] ?? ( 'Step #' . $row['id'] ), 406 ], 407 'form' => $form, 408 ]; 409 } 410 } 411 } 412 413 return $steps; 414 } 415 416 /** 292 417 * Render a standard Help tab card. 293 418 * … … 306 431 } 307 432 echo '</ul>'; 433 echo '<div style="margin-top: 20px;">'; 434 echo '<a class="button button-primary" href="' . esc_url( admin_url( 'admin.php?page=gravity_ops_support' ) ) . '">Grant Support Access</a>'; 308 435 echo '</div>'; 436 echo '</div>'; 437 } 438 439 /** 440 * Show coupons on the GravityOps dashboard for plugins that aren't installed as premium. 441 * 442 * @param string $content Existing content. 443 * @param array $item Plugin registry item. 444 * @return string 445 */ 446 public function maybe_render_dashboard_coupon( $content, $item ) { 447 // Folders and Search are free-only, no coupons. 448 if ( ! empty( $item['is_free'] ) ) { 449 return $content; 450 } 451 452 // If premium version is installed, don't show coupon. 453 if ( ! empty( $item['is_installed_prem'] ) ) { 454 return $content; 455 } 456 457 $coupons = [ 458 'integrate-asana-with-gravity-forms' => 'GRAVITYASANA10GIFT', 459 'mass_email_notifications_for_gf' => 'MASSEMAIL10GIFT', 460 'Recurring_Form_Submissions_For_Gravity_Form' => 'RECURSUB10GIFT', 461 'gravity_ops_global_variables' => 'GLOBVAR10GIFT', 462 'kanban-view-for-gravity-view' => 'KANBANVIEW10GIFT', 463 ]; 464 465 $slug = $item['slug'] ?? ''; 466 $coupon = $coupons[ $slug ] ?? ''; 467 468 if ( $coupon ) { 469 $content .= '<div class="gops-tile-coupon" style="margin-top:10px; font-size: 0.7em; color: #2271b1; font-weight: 500;">'; 470 $content .= '<p><small>Special Gift: Get 10% Off Premium!</small></p>'; 471 $content .= '<p><small>Use coupon code <code><small>' . esc_html( $coupon ) . '</small></code> at checkout.</small></p>'; 472 $content .= '</div>'; 473 } 474 475 return $content; 309 476 } 310 477 … … 329 496 } 330 497 $defaults = [ 498 'slug' => $slug, 331 499 'title' => $slug, 332 500 'menu_title' => $slug, … … 335 503 'links' => [], 336 504 'tabs' => [], // array id => [ 'label' => '', 'type' => 'render|link', 'callback' => callable, 'url' => '' ] 505 'render' => null, // callable to render the whole page content (used if no tabs) 337 506 ]; 338 507 $this->pages[ $slug ] = array_merge( $defaults, $args ); … … 362 531 } 363 532 533 $parent = 'gravity_ops'; 534 if ( 'gravity_ops_support' === $slug ) { 535 $parent = null; 536 } 537 364 538 add_submenu_page( 365 'gravity_ops',539 $parent, 366 540 $args['title'] ?? $slug, 367 541 $args['menu_title'] ?? ( $args['title'] ?? $slug ), … … 384 558 385 559 $pages_lower_case = array_change_key_case( $this->pages ); 386 $is_shell_page = isset( $pages_lower_case[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) ); 560 $is_shell_page = isset( $pages_lower_case[ $page ] ) || 'toplevel_page_gravity_ops' === $hook; 561 $is_shell_page = apply_filters( 'gravityops_is_shell_page', $is_shell_page, $page, $hook ); 387 562 388 563 // Optionally style Freemius pages in-place. … … 394 569 } 395 570 396 if ( ! $is_shell_page && ! $is_freemius ) { 571 $is_gf_page = ( 0 === strpos( $page, 'gf_' ) ) || ( false !== strpos( (string) $hook, 'forms_page_gf' ) ); 572 573 // Always load on our pages, Freemius pages, and GF pages. 574 // Also load globally by default to ensure the sidebar menu icon is consistently styled. 575 $load_globally = (bool) apply_filters( 'gravityops_load_admin_assets_globally', true ); 576 577 if ( ! $is_shell_page && ! $is_freemius && ! $is_gf_page && ! $load_globally ) { 397 578 return; 398 579 } 399 580 400 581 $assets = self::resolve_assets_urls(); 401 if ( ! empty( $assets['css'] ) ) { 402 wp_enqueue_style( 'gravityops-admin', $assets['css'], [], '1.0.0' ); 403 } 582 583 // Load minimal menu/icon CSS globally or on GF pages. 584 if ( ! empty( $assets['menu_css'] ) ) { 585 wp_enqueue_style( 'gravityops-menu', $assets['menu_css'], [], self::CORE_VERSION ); 586 } 587 588 // Load the full admin UI CSS only on our shell or Freemius pages. 589 if ( ! empty( $assets['css'] ) && ( $is_shell_page || $is_freemius ) ) { 590 wp_enqueue_style( 'gravityops-admin', $assets['css'], [ 'gravityops-menu' ], self::CORE_VERSION ); 591 } 592 404 593 // On Freemius pages also load a small override stylesheet to hide native tabs safely. 405 594 if ( $is_freemius ) { 406 595 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 407 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], '1.0.0');596 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], self::CORE_VERSION ); 408 597 } 409 598 if ( ! empty( $assets['js'] ) ) { 410 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], '1.0.0', true ); 599 // We only need the JS on our shell pages or Freemius pages where we inject tabs. 600 if ( ! $is_shell_page && ! $is_freemius ) { 601 return; 602 } 603 604 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], self::CORE_VERSION, true ); 605 606 // Identify the plugin and pass its config to JS 607 $config = null; 608 $current_slug = ''; 609 610 if ( $is_freemius ) { 611 foreach ( $this->pages as $slug => $args ) { 612 $fs_slug = $slug; 613 $fs_slug = apply_filters( 'gravityops_freemius_base_slug', $fs_slug, $slug ); 614 615 $normalized_page = str_replace( '_', '-', $page ); 616 $bases = [ 617 str_replace( '_', '-', strtolower( $fs_slug ) ), 618 str_replace( '_', '-', strtolower( $slug ) ), 619 ]; 620 621 $suffixes = [ '-account', '-pricing', '-affiliation' ]; 622 $valid_targets = array_merge( 623 ...array_map( fn( $b ) => array_map( fn( $s ) => $b . $s, $suffixes ), $bases ) 624 ); 625 626 if ( in_array( $normalized_page, $valid_targets, true ) ) { 627 $current_slug = $slug; 628 break; 629 } 630 } 631 } elseif ( $is_shell_page && isset( $this->pages[ $page ] ) ) { 632 $current_slug = $page; 633 } 634 635 if ( $current_slug && isset( $this->pages[ $current_slug ] ) ) { 636 $args = $this->pages[ $current_slug ]; 637 $tabs = []; 638 $base_url = admin_url( 'admin.php?page=' . $current_slug ); 639 640 foreach ( ( $args['tabs'] ?? [] ) as $id => $tab ) { 641 $tabs[] = [ 642 'id' => $id, 643 'label' => $tab['label'] ?? $id, 644 'url' => ( ( $tab['type'] ?? 'render' ) === 'link' ) ? ( $tab['url'] ?? '#' ) : add_query_arg( 'tab', $id, $base_url ), 645 ]; 646 } 647 648 $config = apply_filters( 649 'gravityops_admin_config', 650 [ 651 'slug' => $current_slug, 652 'title' => $args['title'] ?? '', 653 'tabs' => $tabs, 654 ], 655 $current_slug 656 ); 657 } 658 659 if ( $config ) { 660 wp_localize_script( 'gravityops-admin', 'gops_admin_config', $config ); 661 } 411 662 } 412 663 } … … 424 675 add_action( 'admin_menu', [ $this, 'register_menus' ], 99 ); 425 676 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); 677 add_filter( 'gravityops_tile_after_description', [ $this, 'maybe_render_dashboard_coupon' ], 10, 2 ); 678 679 // Initialize TrustedLogin on all page loads (for auth redirects and background tasks). 680 if ( class_exists( __NAMESPACE__ . '\MENFGF\TrustedLogin' ) ) { 681 TrustedLogin::get_instance(); 682 } 683 684 // Register the shared Support page. 685 $this->register_support_page(); 686 426 687 self::$did_boot = true; 688 } 689 690 /** 691 * Register the shared Support page under the GravityOps menu. 692 * 693 * @return void 694 */ 695 private function register_support_page() { 696 $this->register_plugin_page( 697 'gravity_ops_support', 698 [ 699 'title' => 'Grant Support Access', 700 'menu_title' => 'Support Access', 701 'capability' => class_exists( __NAMESPACE__ . '\SuiteMenu' ) ? SuiteMenu::get_parent_capability() : 'manage_options', 702 'hide_header' => true, 703 'render' => [ TrustedLogin::get_instance(), 'render_support_screen' ], 704 ] 705 ); 427 706 } 428 707 … … 470 749 } 471 750 472 $base_url = menu_page_url( $slug, false ); 751 $base_url = menu_page_url( $slug, false ); 752 $hide_header = ! empty( $args['hide_header'] ); 753 473 754 // Always render full wrapper + header here; notices will be relocated via JS beneath the header. 474 echo '<div class="wrap gops-admin">'; 475 $this->render_header_only( $args ); 755 echo '<div class="wrap gops-admin' . ( $hide_header ? ' gops-hide-header' : '' ) . '">'; 756 if ( ! $hide_header ) { 757 $this->render_header_only( $args ); 758 } 476 759 // Dedicated notices container prevents margin-collapsing into the header 477 760 echo '<div class="gops-notices" aria-live="polite"></div>'; … … 495 778 496 779 echo '<section class="gops-content">'; 497 if ( isset( $tabs[ $active ] ) ) {780 if ( ! empty( $tabs ) && isset( $tabs[ $active ] ) ) { 498 781 $tab = $tabs[ $active ]; 499 782 $type = $tab['type'] ?? 'render'; … … 501 784 call_user_func( $tab['callback'] ); 502 785 } 786 } elseif ( isset( $args['render'] ) && is_callable( $args['render'] ) ) { 787 call_user_func( $args['render'] ); 503 788 } 504 789 echo '</section>'; … … 514 799 * @return void 515 800 */ 516 private function render_header_only( $args ) { 801 public function render_header_only( $args ) { 802 $icon_url = ''; 803 if ( ! empty( $args['slug'] ) && class_exists( __NAMESPACE__ . '\SuiteMenu' ) ) { 804 $registry = SuiteRegistry::all(); 805 $item = null; 806 foreach ( $registry as $r ) { 807 if ( ( $r['slug'] ?? '' ) === $args['slug'] ) { 808 $item = $r; 809 break; 810 } 811 } 812 if ( $item ) { 813 $icon_url = SuiteMenu::resolve_plugin_icon_url( $item ); 814 } 815 } 517 816 ?> 518 <header class="gops-header"> 519 <div class="gops-header__left"> 520 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 521 <div class="gops-headings"> 522 <h1 class="gops-title"><?php echo esc_html( $args['title'] ?? '' ); ?></h1> 523 <?php if ( ! empty( $args['subtitle'] ) ) : ?> 524 <p class="gops-subtitle"><?php echo esc_html( $args['subtitle'] ); ?></p> 525 <?php endif; ?> 817 <div class="gops-header-wrapper"> 818 <?php if ( $icon_url ) : ?> 819 <img class="gops-header-icon" src="<?php echo esc_url( $icon_url ); ?>" alt="" width="80" height="80" /> 820 <?php endif; ?> 821 <header class="gops-header"> 822 <div class="gops-header__left"> 823 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 824 <div class="gops-headings"> 825 <h1 class="gops-title"><?php echo esc_html( $args['title'] ?? '' ); ?></h1> 826 <?php if ( ! empty( $args['subtitle'] ) ) : ?> 827 <p class="gops-subtitle"><?php echo esc_html( $args['subtitle'] ); ?></p> 828 <?php endif; ?> 829 </div> 526 830 </div> 527 </div>528 <?php if ( ! empty( $args['links'] ) && is_array( $args['links'] ) ) : ?>529 <div class="gops-header__right">530 <?php foreach ( $args['links'] as $label => $url ) : ?>531 < a class="gops-link" target="_blank" href="<?php echo esc_url( $url ); ?>"><?php echo esc_html( $label ); ?></a>532 < ?php endforeach; ?>533 < /div>534 < ?php endif; ?>535 </ header>831 <?php if ( ! empty( $args['links'] ) && is_array( $args['links'] ) ) : ?> 832 <div class="gops-header__right"> 833 <?php foreach ( $args['links'] as $label => $url ) : ?> 834 <a class="gops-link" target="_blank" href="<?php echo esc_url( $url ); ?>"><?php echo esc_html( $label ); ?></a> 835 <?php endforeach; ?> 836 </div> 837 <?php endif; ?> 838 </header> 839 </div> 536 840 <?php 537 841 } … … 548 852 * - Fallback to site_url('gravityops/assets/') if present 549 853 * 550 * @return array{css:string, js:string}854 * @return array{css:string,menu_css:string,js:string,base_url:string} 551 855 */ 552 856 public static function resolve_assets_urls() { 553 857 $base_url = apply_filters( 'gravityops_assets_base_url', '' ); 554 858 $css = ''; 859 $menu_css = ''; 555 860 $js = ''; 556 861 557 862 if ( is_string( $base_url ) && '' !== $base_url ) { 558 863 $base_url = trailingslashit( $base_url ); 559 $css = $base_url . 'admin.css'; 560 $js = $base_url . 'admin.js'; 864 $css = $base_url . 'css/admin.css'; 865 $menu_css = $base_url . 'css/menu.css'; 866 $js = $base_url . 'js/admin.js'; 561 867 return [ 562 'css' => $css, 563 'js' => $js, 868 'css' => $css, 869 'menu_css' => $menu_css, 870 'js' => $js, 871 'base_url' => $base_url, 564 872 ]; 565 873 } … … 567 875 // Try resolving relative to this class file (../../assets) 568 876 $assets_path = wp_normalize_path( dirname( __DIR__, 2 ) . '/assets' ); 569 $css_path = $assets_path . '/admin.css'; 570 $js_path = $assets_path . '/admin.js'; 571 572 if ( file_exists( $css_path ) || file_exists( $js_path ) ) { 877 $css_path = $assets_path . '/css/admin.css'; 878 $menu_path = $assets_path . '/css/menu.css'; 879 $js_path = $assets_path . '/js/admin.js'; 880 881 if ( file_exists( $css_path ) || file_exists( $js_path ) || file_exists( $menu_path ) ) { 573 882 $content_dir = wp_normalize_path( WP_CONTENT_DIR ); 574 883 if ( 0 === strpos( $assets_path, $content_dir ) ) { … … 583 892 } 584 893 if ( $base_url ) { 585 $css = file_exists( $css_path ) ? $base_url . 'admin.css' : ''; 586 $js = file_exists( $js_path ) ? $base_url . 'admin.js' : ''; 894 $css = file_exists( $css_path ) ? $base_url . 'css/admin.css' : ''; 895 $menu_css = file_exists( $menu_path ) ? $base_url . 'css/menu.css' : ''; 896 $js = file_exists( $js_path ) ? $base_url . 'js/admin.js' : ''; 587 897 return [ 588 'css' => $css, 589 'js' => $js, 898 'css' => $css, 899 'menu_css' => $menu_css, 900 'js' => $js, 901 'base_url' => $base_url, 590 902 ]; 591 903 } … … 594 906 // Fallback to root-level gravityops/assets 595 907 $root_assets = 'gravityops/assets/'; 596 if ( file_exists( ABSPATH . $root_assets . 'admin.css' ) ) { 597 $css = site_url( $root_assets . 'admin.css' ); 598 } 599 if ( file_exists( ABSPATH . $root_assets . 'admin.js' ) ) { 600 $js = site_url( $root_assets . 'admin.js' ); 908 $base_url = trailingslashit( site_url( $root_assets ) ); 909 if ( file_exists( ABSPATH . $root_assets . 'css/admin.css' ) ) { 910 $css = $base_url . 'css/admin.css'; 911 } 912 if ( file_exists( ABSPATH . $root_assets . 'css/menu.css' ) ) { 913 $menu_css = $base_url . 'css/menu.css'; 914 } 915 if ( file_exists( ABSPATH . $root_assets . 'js/admin.js' ) ) { 916 $js = $base_url . 'js/admin.js'; 601 917 } 602 918 return [ 603 'css' => $css, 604 'js' => $js, 919 'css' => $css, 920 'menu_css' => $menu_css, 921 'js' => $js, 922 'base_url' => $base_url, 605 923 ]; 606 924 } -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/ReviewPrompter.php
r3420036 r3444395 77 77 78 78 if ( $current_count > $threshold ) { 79 add_action( 'admin_notices', [ $this, 'render_notice' ]);79 $this->render_notice(); 80 80 } 81 81 } … … 120 120 } 121 121 122 $nonce = wp_create_nonce( $this->prefix . 'rating_asked' ); 123 ?> 124 <div class="notice notice-success is-dismissible"> 125 <h3>Thank you for using <?php echo esc_html( $this->plugin_title ); ?>! I noticed you've used it a lot!</h3> 126 <h4> 127 If you like the plugin and find it helpful, can you do us a big favor and <a 128 href="<?php echo esc_url( $url ); ?>" 129 target="_blank" rel="noreferrer">rate it</a> with ⭐⭐⭐⭐⭐? 130 It helps us spread the word and boost our motivation. 131 </h4> 132 <form method="post" action=""> 133 <input type="hidden" name="<?php echo esc_attr( $this->prefix . 'rating_nonce' ); ?>" value="<?php echo esc_attr( $nonce ); ?>"> 134 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="remind">Remind me later</button> 135 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="done">Done!</button> 136 <button class="button" type="submit" name="<?php echo esc_attr( $this->prefix . 'rating_action' ); ?>" value="done">Not Interested</button> 137 </form> 138 </div> 139 <?php 122 $nonce_field = $this->prefix . 'rating_nonce'; 123 $action_field = $this->prefix . 'rating_action'; 124 $nonce_action = $this->prefix . 'rating_asked'; 125 $plugin_title = $this->plugin_title; 126 127 $nonce = wp_create_nonce( $nonce_action ); 128 129 $current_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended 130 $is_gops_page = ( 'gravity_ops' === $current_page || AdminShell::has_page( $current_page ) ); 131 $notice_classes = 'notice notice-success is-dismissible'; 132 if ( $is_gops_page ) { 133 $notice_classes .= ' inline'; 134 } 135 add_action( 136 'admin_notices', 137 function () use ( $nonce, $action_field, $nonce_field, $plugin_title, $url, $notice_classes ) { 138 ?> 139 <div class="<?= esc_attr( $notice_classes ); ?>"> 140 <h3>Thank you for using <?php echo esc_html( $plugin_title ); ?>! I noticed you've used it a lot!</h3> 141 <h4> 142 If you like the plugin and find it helpful, can you do us a big favor and <a 143 href="<?php echo esc_url( $url ); ?>" 144 target="_blank" rel="noreferrer">rate it</a> with ⭐⭐⭐⭐⭐? 145 It helps us spread the word and boost our motivation. 146 </h4> 147 <form method="post" action=""> 148 <input type="hidden" name="<?php echo esc_attr( $nonce_field ); ?>" value="<?php echo esc_attr( $nonce ); ?>"> 149 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="remind">Remind me later</button> 150 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="done">Done!</button> 151 <button class="button" type="submit" name="<?php echo esc_attr( $action_field ); ?>" value="done">Not Interested</button> 152 </form> 153 </div> 154 <?php 155 } 156 ); 140 157 } 141 158 -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php
r3422687 r3444395 216 216 } 217 217 $registry[ $key ]['is_installed'] = $is_installed; 218 $registry[ $key ]['is_installed_prem'] = ! empty( $item['is_free'] ) ? false : $is_installed; 219 $registry[ $key ]['is_installed_free'] = ! empty( $item['is_free'] ) ? $is_installed : false; 218 220 $registry[ $key ]['is_active'] = $is_active; 219 221 $registry[ $key ]['version'] = $version; … … 270 272 // Updates: consider whichever is installed; prefer premium if both 271 273 if ( $upd_prem || $upd_free ) { 272 $has_update = $upd_prem || $upd_free; 273 $new_version = $upd_prem ? $new_prem : $new_free; 274 ++$updates_count; 274 $has_update = $upd_prem || ( $upd_free && ! $is_installed_prem ); 275 $new_version = $upd_prem ? $new_prem : ( $is_installed_prem ? '' : $new_free ); 276 if ( $has_update ) { 277 ++$updates_count; 278 } 275 279 } 276 280 … … 284 288 285 289 $registry[ $key ]['is_installed'] = $is_installed; 290 $registry[ $key ]['is_installed_prem'] = $is_installed_prem; 291 $registry[ $key ]['is_installed_free'] = $is_installed_free; 286 292 $registry[ $key ]['is_active'] = $is_active; 287 293 $registry[ $key ]['version'] = $version; … … 328 334 ?> 329 335 <div class="wrap gops-admin"> 330 <header class="gops-header"> 331 <div class="gops-header__left"> 332 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 333 <div class="gops-headings"> 334 <h1 class="gops-title">Run Your Business on WordPress</h1> 335 <p class="gops-subtitle">All your GravityOps tools in one place.</p> 336 <div class="gops-header-wrapper"> 337 <img class="gops-header-icon" src="<?php echo esc_url( self::get_icon() ); ?>" alt="" width="80" height="80" /> 338 <header class="gops-header"> 339 <div class="gops-header__left"> 340 <a class="gops-logo-chip" href="<?php echo esc_url( admin_url( 'admin.php?page=gravity_ops' ) ); ?>">GravityOps</a> 341 <div class="gops-headings"> 342 <h1 class="gops-title">Run Your Business on WordPress</h1> 343 <p class="gops-subtitle">All your GravityOps tools in one place.</p> 344 </div> 336 345 </div> 337 </div>338 <div class="gops-header__right">339 < a class="button button-primary" target="_blank" rel="noopener" href="https://brightleafdigital.io/plugintomember">Join Community</a>340 </ div>341 </ header>346 <div class="gops-header__right"> 347 <a class="button button-primary" target="_blank" rel="noopener" href="https://brightleafdigital.io/plugintomember">Join Community</a> 348 </div> 349 </header> 350 </div> 342 351 <div class="gops-notices" aria-live="polite"></div> 343 352 … … 404 413 if ( $icon_url ) : 405 414 ?> 406 <img class="gops-tile__iconimg" width=" 22" height="22" src="<?php echo esc_url( $icon_url ); ?>" alt=""/>415 <img class="gops-tile__iconimg" width="48" height="48" src="<?php echo esc_url( $icon_url ); ?>" alt=""/> 407 416 <?php else : ?> 408 417 <div class="gops-tile__icon" aria-hidden="true"><?php echo isset( $item['icon_html'] ) ? wp_kses_post( $item['icon_html'] ) : '🔧'; ?></div> … … 411 420 </div> 412 421 <p class="gops-tile__desc"><?php echo esc_html( $item['description'] ); ?></p> 422 <?php echo wp_kses_post( apply_filters( 'gravityops_tile_after_description', '', $item ) ); ?> 413 423 <div class="gops-tile__meta"> 414 <span class="gops-badge<?php echo $is_active ? ' gops-badge--ok' : ' gops-badge--warn'; ?>">415 <?php echo $is_active ? 'Active' : ( $is_installed ? 'Inactive' : 'Not Installed' ); ?>416 </span>417 424 <?php if ( ! empty( $item['uses_free'] ) ) : ?> 418 425 <span class="gops-badge">Free</span> 419 <?php endif; ?>420 <?php if ( $version ) : ?>421 <span class="gops-tile__version">v<?php echo esc_html( $version ); ?></span>422 426 <?php endif; ?> 423 427 <?php if ( $has_update ) : ?> … … 427 431 428 432 <div class="gops-tile__actions"> 429 <?php if ( $is_installed ) : ?> 430 <?php if ( current_user_can( 'activate_plugins' ) ) : ?> 431 <form class="gops-action" method="post" action="<?php echo esc_url( $base_url ); ?>"> 432 <?php wp_nonce_field( 'gops_toggle_' . ( $item['plugin_file_action'] ?? $item['plugin_file'] ), 'gops_nonce' ); ?> 433 <input type="hidden" name="gops-action" value="<?php echo $is_active ? 'deactivate' : 'activate'; ?>" /> 434 <input type="hidden" name="plugin" value="<?php echo esc_attr( $is_active ? ( $item['plugin_file_active'] ?: ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ) : ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ); ?>" /> 435 <button class="button<?php echo $is_active ? '' : ' button-primary'; ?>" type="submit"><?php echo $is_active ? 'Deactivate' : 'Activate'; ?></button> 436 </form> 433 <div class="gops-tile__action-group"> 434 <?php if ( $version ) : ?> 435 <span class="gops-tile__version">v<?php echo esc_html( $version ); ?></span> 437 436 <?php endif; ?> 438 <?php else : ?> 439 <a class="button button-primary" target="_blank" href="<?php echo esc_url( ( $item['marketing_url'] ?? '' ) . '#pricing' ); ?>">Buy</a> 440 <?php endif; ?> 441 442 <a class="gops-link" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Learn More →</a> 437 <span class="gops-badge<?php echo $is_active ? ' gops-badge--ok' : ' gops-badge--warn'; ?>"> 438 <?php echo $is_active ? 'Active' : ( $is_installed ? 'Inactive' : 'Not Installed' ); ?> 439 </span> 440 441 <?php if ( $is_installed ) : ?> 442 <?php 443 if ( $has_update && current_user_can( 'update_plugins' ) ) : 444 // Use the file that actually has the update (prefer premium if both, though Issue 3 might have simplified this). 445 $update_file = ( isset( $upd_prem ) && $upd_prem ) ? $premium_file : ( ( isset( $upd_free ) && $upd_free ) ? $free_file : $item['plugin_file_action'] ); 446 $update_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . rawurlencode( $update_file ) ), 'upgrade-plugin_' . $update_file ); 447 ?> 448 <a class="button button-primary" href="<?php echo esc_url( $update_url ); ?>">Update Now</a> 449 <?php endif; ?> 450 451 <?php if ( current_user_can( 'activate_plugins' ) ) : ?> 452 <form class="gops-action" method="post" action="<?php echo esc_url( $base_url ); ?>"> 453 <?php wp_nonce_field( 'gops_toggle_' . ( $item['plugin_file_action'] ?? $item['plugin_file'] ), 'gops_nonce' ); ?> 454 <input type="hidden" name="gops-action" value="<?php echo $is_active ? 'deactivate' : 'activate'; ?>" /> 455 <input type="hidden" name="plugin" value="<?php echo esc_attr( $is_active ? ( $item['plugin_file_active'] ?: ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ) : ( $item['plugin_file_action'] ?? $item['plugin_file'] ) ); ?>" /> 456 <button class="button<?php echo $is_active ? '' : ' button-primary'; ?>" type="submit"><?php echo $is_active ? 'Deactivate' : 'Activate'; ?></button> 457 </form> 458 <?php endif; ?> 459 <?php else : ?> 460 <?php if ( ! empty( $item['is_free'] ) ) : ?> 461 <a class="button button-primary" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Download Now</a> 462 <?php else : ?> 463 <a class="button button-primary" target="_blank" href="<?php echo esc_url( ( $item['marketing_url'] ?? '' ) . '#pricing' ); ?>">Buy</a> 464 <?php endif; ?> 465 <?php endif; ?> 466 </div> 467 468 <a class="gops-link gops-tile__learn-more" target="_blank" href="<?php echo esc_url( $item['marketing_url'] ); ?>">Learn More →</a> 443 469 </div> 444 470 </div> … … 452 478 453 479 /** 480 * Helper to get a plugin's icon URL by its slug. 481 * 482 * @param string $slug Plugin slug as defined in SuiteRegistry. 483 * @return string Icon URL or empty string. 484 */ 485 public static function get_plugin_icon_url( $slug ) { 486 $registry = SuiteRegistry::all(); 487 foreach ( $registry as $item ) { 488 if ( ( $item['slug'] ?? '' ) === $slug ) { 489 return self::resolve_plugin_icon_url( $item ); 490 } 491 } 492 return ''; 493 } 494 495 /** 454 496 * Resolve a plugin icon URL from common asset locations, with filter override. 455 497 * … … 457 499 * @return string Icon URL or empty string if none found. 458 500 */ 459 p rivatestatic function resolve_plugin_icon_url( $item ) {501 public static function resolve_plugin_icon_url( $item ) { 460 502 $url = apply_filters( 'gravityops_plugin_icon_url', '', $item ); 461 503 if ( ! empty( $url ) ) { … … 463 505 } 464 506 465 if ( empty( $item['plugin_file'] ) ) { 466 return ''; 467 } 468 469 $plugin_main = WP_PLUGIN_DIR . '/' . $item['plugin_file']; 470 if ( ! file_exists( $plugin_main ) ) { 471 return ''; 472 } 473 474 // Base plugin URL for building asset URLs. 475 $base_url = plugins_url( '', $plugin_main ); 476 $base_dir = dirname( $plugin_main ); 477 478 $candidates = [ 479 'assets/icon.svg', 480 'assets/icon.png', 481 'assets/images/icon.svg', 482 'assets/images/icon.png', 483 'includes/images/icon.svg', 484 'includes/images/icon.png', 485 'assets/img/icon.svg', 486 'assets/img/icon.png', 487 ]; 488 foreach ( $candidates as $rel ) { 489 $path = $base_dir . '/' . $rel; 490 if ( file_exists( $path ) ) { 491 return $base_url . '/' . $rel; 492 } 493 } 494 495 // Wildcard: first match like assets/img/*-icon.svg|png 496 $wild_dirs = [ 'assets/img' ]; 497 foreach ( $wild_dirs as $wd ) { 498 $dir = $base_dir . '/' . $wd; 499 if ( is_dir( $dir ) ) { 500 $matches = array_merge( glob( $dir . '/*-icon.svg' ) ?: [], glob( $dir . '/*-icon.png' ) ?: [] ); 501 if ( ! empty( $matches ) ) { 502 // Return the first match 503 $first = $matches[0]; 504 return $base_url . '/' . $wd . '/' . basename( $first ); 507 if ( ! empty( $item['icon_filename'] ) ) { 508 $assets = class_exists( __NAMESPACE__ . '\AdminShell' ) ? AdminShell::resolve_assets_urls() : []; 509 $base = ! empty( $assets['base_url'] ) ? $assets['base_url'] : ( ! empty( $assets['css'] ) ? trailingslashit( dirname( $assets['css'], 2 ) ) : '' ); 510 if ( $base ) { 511 return $base . 'images/' . $item['icon_filename']; 512 } 513 } 514 515 $files_to_check = []; 516 if ( ! empty( $item['plugin_files'] ) ) { 517 if ( isset( $item['plugin_files']['premium'] ) ) { 518 $files_to_check[] = $item['plugin_files']['premium']; 519 } 520 if ( isset( $item['plugin_files']['free'] ) ) { 521 $files_to_check[] = $item['plugin_files']['free']; 522 } 523 } 524 if ( ! empty( $item['plugin_file'] ) ) { 525 $files_to_check[] = (string) $item['plugin_file']; 526 } 527 528 $files_to_check = array_unique( $files_to_check ); 529 530 foreach ( $files_to_check as $plugin_rel_file ) { 531 $plugin_main = WP_PLUGIN_DIR . '/' . $plugin_rel_file; 532 if ( ! file_exists( $plugin_main ) ) { 533 continue; 534 } 535 536 // Base plugin URL for building asset URLs. 537 $base_url = plugins_url( '', $plugin_main ); 538 $base_dir = dirname( $plugin_main ); 539 540 $candidates = [ 541 'assets/icon.svg', 542 'assets/icon.png', 543 'assets/images/icon.svg', 544 'assets/images/icon.png', 545 'includes/images/icon.svg', 546 'includes/images/icon.png', 547 'assets/img/icon.svg', 548 'assets/img/icon.png', 549 ]; 550 foreach ( $candidates as $rel ) { 551 $path = $base_dir . '/' . $rel; 552 if ( file_exists( $path ) ) { 553 return $base_url . '/' . $rel; 505 554 } 506 555 } 507 } 556 557 // Wildcard: first match like assets/img/*-icon.svg|png 558 $wild_dirs = [ 'assets/img', 'assets/images' ]; 559 foreach ( $wild_dirs as $wd ) { 560 $dir = $base_dir . '/' . $wd; 561 if ( is_dir( $dir ) ) { 562 $matches = array_merge( glob( $dir . '/*-icon.svg' ) ?: [], glob( $dir . '/*-icon.png' ) ?: [] ); 563 if ( ! empty( $matches ) ) { 564 // Return the first match 565 $first = $matches[0]; 566 return $base_url . '/' . $wd . '/' . basename( $first ); 567 } 568 } 569 } 570 } 571 508 572 return ''; 509 573 } … … 525 589 $is_gravityops_screen = ( false !== strpos( (string) $hook, 'gravity_ops' ) ) || ( 'gravity_ops' === $page ); 526 590 $is_freemius = (bool) preg_match( '/\-(account|pricing|affiliation)$/', $page ); 527 if ( ! $is_gravityops_screen && ! $is_freemius ) { 591 $is_gf_page = ( 0 === strpos( $page, 'gf_' ) ) || ( false !== strpos( (string) $hook, 'forms_page_gf' ) ); 592 593 // Always load on our pages, Freemius pages, and GF pages. 594 // Also load globally by default to ensure the sidebar menu icon is consistently styled. 595 $load_globally = (bool) apply_filters( 'gravityops_load_admin_assets_globally', true ); 596 597 if ( ! $is_gravityops_screen && ! $is_freemius && ! $is_gf_page && ! $load_globally ) { 528 598 return; 529 599 } … … 531 601 // Reuse AdminShell asset resolution to support both root and vendor installs. 532 602 if ( class_exists( __NAMESPACE__ . '\\AdminShell' ) ) { 533 $assets = AdminShell::resolve_assets_urls(); 534 if ( ! empty( $assets['css'] ) ) { 535 wp_enqueue_style( 'gravityops-admin', $assets['css'], [], '1.0.0' ); 536 } 537 if ( ! empty( $assets['js'] ) ) { 538 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], '1.0.0', true ); 539 } 540 // If this is a Freemius page, also enqueue the freemius.css override to hide native tabs. 541 if ( $is_freemius ) { 542 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 543 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], '1.0.0' ); 603 $assets = AdminShell::resolve_assets_urls(); 604 $version = defined( AdminShell::class . '::CORE_VERSION' ) ? AdminShell::CORE_VERSION : '1.0.0'; 605 606 // Load minimal menu/icon CSS globally or on GF pages. 607 if ( ! empty( $assets['menu_css'] ) ) { 608 wp_enqueue_style( 'gravityops-menu', $assets['menu_css'], [], $version ); 609 } 610 611 // Load the full admin UI CSS only on our screens or Freemius screens. 612 if ( ! empty( $assets['css'] ) && ( $is_gravityops_screen || $is_freemius ) ) { 613 wp_enqueue_style( 'gravityops-admin', $assets['css'], [ 'gravityops-menu' ], $version ); 614 } 615 616 // We only need the JS on our screens or Freemius screens. 617 if ( $is_gravityops_screen || $is_freemius ) { 618 if ( ! empty( $assets['js'] ) ) { 619 wp_enqueue_script( 'gravityops-admin', $assets['js'], [ 'jquery' ], $version, true ); 620 } 621 // If this is a Freemius page, also enqueue the freemius.css override to hide native tabs. 622 if ( $is_freemius ) { 623 $fs_css = trailingslashit( dirname( $assets['css'] ) ) . 'freemius.css'; 624 wp_enqueue_style( 'gravityops-freemius', $fs_css, [ 'gravityops-admin' ], $version ); 625 } 544 626 } 545 627 } … … 637 719 public static function get_icon() { 638 720 $assets = class_exists( __NAMESPACE__ . '\AdminShell' ) ? AdminShell::resolve_assets_urls() : [ 639 'css' => '', 640 'js' => '', 721 'css' => '', 722 'js' => '', 723 'base_url' => '', 641 724 ]; 642 $base = ! empty( $assets[' css'] ) ? trailingslashit( dirname( $assets['css'] ) ) : '';643 $candidate = 'images/ icon.png';725 $base = ! empty( $assets['base_url'] ) ? $assets['base_url'] : ( ! empty( $assets['css'] ) ? trailingslashit( dirname( dirname( $assets['css'] ) ) ) : '' ); 726 $candidate = 'images/ops-icon.svg'; 644 727 $url = $base ? $base . $candidate : ''; 645 728 return apply_filters( 'gravityops_menu_icon_url', $url ); -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/SurveyPrompter.php
r3420036 r3444395 125 125 $nonce_action = "{$this->prefix}do_survey"; 126 126 127 $current_page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended 128 $is_gops_page = ( 'gravity_ops' === $current_page || AdminShell::has_page( $current_page ) ); 129 $notice_classes = 'notice notice-info is-dismissible'; 130 if ( $is_gops_page ) { 131 $notice_classes .= ' inline'; 132 } 127 133 add_action( 128 134 'admin_notices', 129 function () use ( $star_class, $rating_input_id, $rating_field, $like_field, $dislike_field, $recommend_field, $find_field, $nonce_field_name, $submit_field, $nonce_action ) {135 function () use ( $star_class, $rating_input_id, $rating_field, $like_field, $dislike_field, $recommend_field, $find_field, $nonce_field_name, $submit_field, $nonce_action, $notice_classes ) { 130 136 ?> 131 <div class=" notice notice-info is-dismissible">137 <div class="<?= esc_attr( $notice_classes ); ?>"> 132 138 <h3>We value your feedback!</h3> 133 139 <h4>Thank you for using <?= esc_html( $this->plugin_title ); ?>!</h4> -
mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/SuiteRegistry.php
r3422687 r3444395 38 38 'is_free' => true, 39 39 'icon_html' => '🗂️', 40 'icon_filename' => 'f4g-icon.svg', 40 41 ], 41 42 [ … … 49 50 'is_free' => true, 50 51 'icon_html' => '🔎', 52 'icon_filename' => 'search-icon.svg', 51 53 ], 52 54 [ … … 65 67 'is_free' => false, 66 68 'icon_html' => '🅰️', 69 'icon_filename' => 'iawgf-icon.svg', 67 70 ], 68 71 [ … … 81 84 'is_free' => false, 82 85 'icon_html' => '✉️', 86 'icon_filename' => 'menfgf-icon.svg', 83 87 ], 84 88 [ … … 92 96 'is_free' => false, 93 97 'icon_html' => '🗂️', 98 'icon_filename' => 'kv4gv-icon.svg', 94 99 ], 95 100 [ … … 103 108 'is_free' => false, 104 109 'icon_html' => '🔁', 110 'icon_filename' => 'rfsfgf-icon.svg', 105 111 ], 106 112 [ … … 115 121 'is_free' => false, 116 122 'icon_html' => '∑', 123 'icon_filename' => 'gv4gm-icon.svg', 117 124 ], 118 125 ]; -
mass-email-notifications-for-gravity-forms/trunk/vendor/autoload.php
r3422687 r3444395 20 20 require_once __DIR__ . '/composer/autoload_real.php'; 21 21 22 return ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e::getLoader();22 return ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5::getLoader(); -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_aliases.php
r3422687 r3444395 2 2 3 3 // Functions and constants 4 5 namespace { 6 7 } 4 8 namespace GravityOps\Core\Admin { 5 9 if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){ … … 9 13 } 10 14 } 15 namespace TrustedLogin { 16 if(!function_exists('\\TrustedLogin\\function_exists')){ 17 function function_exists(...$args) { 18 return \MENFGF\TrustedLogin\function_exists(...func_get_args()); 19 } 20 } 21 } 11 22 12 23 13 24 namespace MENFGF { 14 25 26 use BrianHenryIE\Strauss\Types\AutoloadAliasInterface; 27 28 /** 29 * @see AutoloadAliasInterface 30 * 31 * @phpstan-type ClassAliasArray array{'type':'class',isabstract:bool,classname:string,namespace?:string,extends:string,implements:array<string>} 32 * @phpstan-type InterfaceAliasArray array{'type':'interface',interfacename:string,namespace?:string,extends:array<string>} 33 * @phpstan-type TraitAliasArray array{'type':'trait',traitname:string,namespace?:string,use:array<string>} 34 * @phpstan-type AutoloadAliasArray array<string,ClassAliasArray|InterfaceAliasArray|TraitAliasArray> 35 */ 15 36 class AliasAutoloader 16 37 { 17 38 private string $includeFilePath; 18 39 40 /** 41 * @var AutoloadAliasArray 42 */ 19 43 private array $autoloadAliases = array ( 20 44 'GravityOps\\Core\\Admin\\AdminShell' => … … 73 97 ), 74 98 ), 99 'GravityOps\\Core\\Admin\\TrustedLogin' => 100 array ( 101 'type' => 'class', 102 'classname' => 'TrustedLogin', 103 'isabstract' => false, 104 'namespace' => 'GravityOps\\Core\\Admin', 105 'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin', 106 'implements' => 107 array ( 108 ), 109 ), 75 110 'GravityOps\\Core\\SuiteRegistry' => 76 111 array ( … … 91 126 'namespace' => 'GravityOps\\Core\\Utils', 92 127 'extends' => 'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper', 128 'implements' => 129 array ( 130 ), 131 ), 132 'TrustedLogin\\Admin' => 133 array ( 134 'type' => 'class', 135 'classname' => 'Admin', 136 'isabstract' => false, 137 'namespace' => 'TrustedLogin', 138 'extends' => 'MENFGF\\TrustedLogin\\Admin', 139 'implements' => 140 array ( 141 ), 142 ), 143 'TrustedLogin\\Ajax' => 144 array ( 145 'type' => 'class', 146 'classname' => 'Ajax', 147 'isabstract' => false, 148 'namespace' => 'TrustedLogin', 149 'extends' => 'MENFGF\\TrustedLogin\\Ajax', 150 'implements' => 151 array ( 152 ), 153 ), 154 'TrustedLogin\\Client' => 155 array ( 156 'type' => 'class', 157 'classname' => 'Client', 158 'isabstract' => false, 159 'namespace' => 'TrustedLogin', 160 'extends' => 'MENFGF\\TrustedLogin\\Client', 161 'implements' => 162 array ( 163 ), 164 ), 165 'TrustedLogin\\Config' => 166 array ( 167 'type' => 'class', 168 'classname' => 'Config', 169 'isabstract' => false, 170 'namespace' => 'TrustedLogin', 171 'extends' => 'MENFGF\\TrustedLogin\\Config', 172 'implements' => 173 array ( 174 ), 175 ), 176 'TrustedLogin\\Cron' => 177 array ( 178 'type' => 'class', 179 'classname' => 'Cron', 180 'isabstract' => false, 181 'namespace' => 'TrustedLogin', 182 'extends' => 'MENFGF\\TrustedLogin\\Cron', 183 'implements' => 184 array ( 185 ), 186 ), 187 'TrustedLogin\\Encryption' => 188 array ( 189 'type' => 'class', 190 'classname' => 'Encryption', 191 'isabstract' => false, 192 'namespace' => 'TrustedLogin', 193 'extends' => 'MENFGF\\TrustedLogin\\Encryption', 194 'implements' => 195 array ( 196 ), 197 ), 198 'TrustedLogin\\Endpoint' => 199 array ( 200 'type' => 'class', 201 'classname' => 'Endpoint', 202 'isabstract' => false, 203 'namespace' => 'TrustedLogin', 204 'extends' => 'MENFGF\\TrustedLogin\\Endpoint', 205 'implements' => 206 array ( 207 ), 208 ), 209 'TrustedLogin\\Envelope' => 210 array ( 211 'type' => 'class', 212 'classname' => 'Envelope', 213 'isabstract' => false, 214 'namespace' => 'TrustedLogin', 215 'extends' => 'MENFGF\\TrustedLogin\\Envelope', 216 'implements' => 217 array ( 218 ), 219 ), 220 'TrustedLogin\\Form' => 221 array ( 222 'type' => 'class', 223 'classname' => 'Form', 224 'isabstract' => false, 225 'namespace' => 'TrustedLogin', 226 'extends' => 'MENFGF\\TrustedLogin\\Form', 227 'implements' => 228 array ( 229 ), 230 ), 231 'TrustedLogin\\Logger' => 232 array ( 233 'type' => 'class', 234 'classname' => 'Logger', 235 'isabstract' => false, 236 'namespace' => 'TrustedLogin', 237 'extends' => 'MENFGF\\TrustedLogin\\Logger', 238 'implements' => 239 array ( 240 ), 241 ), 242 'TrustedLogin\\Logging' => 243 array ( 244 'type' => 'class', 245 'classname' => 'Logging', 246 'isabstract' => false, 247 'namespace' => 'TrustedLogin', 248 'extends' => 'MENFGF\\TrustedLogin\\Logging', 249 'implements' => 250 array ( 251 ), 252 ), 253 'TrustedLogin\\Remote' => 254 array ( 255 'type' => 'class', 256 'classname' => 'Remote', 257 'isabstract' => false, 258 'namespace' => 'TrustedLogin', 259 'extends' => 'MENFGF\\TrustedLogin\\Remote', 260 'implements' => 261 array ( 262 ), 263 ), 264 'TrustedLogin\\SecurityChecks' => 265 array ( 266 'type' => 'class', 267 'classname' => 'SecurityChecks', 268 'isabstract' => false, 269 'namespace' => 'TrustedLogin', 270 'extends' => 'MENFGF\\TrustedLogin\\SecurityChecks', 271 'implements' => 272 array ( 273 ), 274 ), 275 'TrustedLogin\\SiteAccess' => 276 array ( 277 'type' => 'class', 278 'classname' => 'SiteAccess', 279 'isabstract' => false, 280 'namespace' => 'TrustedLogin', 281 'extends' => 'MENFGF\\TrustedLogin\\SiteAccess', 282 'implements' => 283 array ( 284 ), 285 ), 286 'TrustedLogin\\SupportRole' => 287 array ( 288 'type' => 'class', 289 'classname' => 'SupportRole', 290 'isabstract' => false, 291 'namespace' => 'TrustedLogin', 292 'extends' => 'MENFGF\\TrustedLogin\\SupportRole', 293 'implements' => 294 array ( 295 ), 296 ), 297 'TrustedLogin\\SupportUser' => 298 array ( 299 'type' => 'class', 300 'classname' => 'SupportUser', 301 'isabstract' => false, 302 'namespace' => 'TrustedLogin', 303 'extends' => 'MENFGF\\TrustedLogin\\SupportUser', 304 'implements' => 305 array ( 306 ), 307 ), 308 'TrustedLogin\\Utils' => 309 array ( 310 'type' => 'class', 311 'classname' => 'Utils', 312 'isabstract' => false, 313 'namespace' => 'TrustedLogin', 314 'extends' => 'MENFGF\\TrustedLogin\\Utils', 315 'implements' => 316 array ( 317 ), 318 ), 319 'TrustedLogin\\TrustedLoginClientTest' => 320 array ( 321 'type' => 'class', 322 'classname' => 'TrustedLoginClientTest', 323 'isabstract' => false, 324 'namespace' => 'TrustedLogin', 325 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginClientTest', 326 'implements' => 327 array ( 328 ), 329 ), 330 'TrustedLogin\\TrustedLoginEncryptionTest' => 331 array ( 332 'type' => 'class', 333 'classname' => 'TrustedLoginEncryptionTest', 334 'isabstract' => false, 335 'namespace' => 'TrustedLogin', 336 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginEncryptionTest', 337 'implements' => 338 array ( 339 ), 340 ), 341 'TrustedLogin\\TrustedLoginLoggingTest' => 342 array ( 343 'type' => 'class', 344 'classname' => 'TrustedLoginLoggingTest', 345 'isabstract' => false, 346 'namespace' => 'TrustedLogin', 347 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginLoggingTest', 348 'implements' => 349 array ( 350 ), 351 ), 352 'TrustedLogin\\TrustedLoginRemoteTest' => 353 array ( 354 'type' => 'class', 355 'classname' => 'TrustedLoginRemoteTest', 356 'isabstract' => false, 357 'namespace' => 'TrustedLogin', 358 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginRemoteTest', 359 'implements' => 360 array ( 361 ), 362 ), 363 'TrustedLogin\\TrustedLoginSiteAccessTest' => 364 array ( 365 'type' => 'class', 366 'classname' => 'TrustedLoginSiteAccessTest', 367 'isabstract' => false, 368 'namespace' => 'TrustedLogin', 369 'extends' => 'MENFGF\\TrustedLogin\\TrustedLoginSiteAccessTest', 93 370 'implements' => 94 371 array ( … … 112 389 } 113 390 114 public function autoload($class) 391 /** 392 * @param string $class 393 */ 394 public function autoload($class): void 115 395 { 116 396 if (!isset($this->autoloadAliases[$class])) { … … 145 425 } 146 426 147 private function load(string $includeFile) 427 private function load(string $includeFile): void 148 428 { 149 429 file_put_contents($this->includeFilePath, $includeFile); … … 152 432 } 153 433 434 /** 435 * @param ClassAliasArray $class 436 */ 154 437 private function classTemplate(array $class): string 155 438 { … … 174 457 } 175 458 459 /** 460 * @param InterfaceAliasArray $interface 461 */ 176 462 private function interfaceTemplate(array $interface): string 177 463 { … … 188 474 EOD; 189 475 } 476 477 /** 478 * @param TraitAliasArray $trait 479 */ 190 480 private function traitTemplate(array $trait): string 191 481 { -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_files.php
r3422687 r3444395 8 8 return array( 9 9 '8d50dc88e56bace65e1e72f6017983ed' => $vendorDir . '/freemius/wordpress-sdk/start.php', 10 '9387666eac3fc37c9ef87deb087980c6' => $vendorDir . '/MENFGF/autoload.php',11 '79fa1c9a31d9f4c8c1a536bd9e014492' => $vendorDir . '/MENFGF/gravityops/core/src/Admin/functions.php',12 10 ); -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_real.php
r3422687 r3444395 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e5 class ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); 29 spl_autoload_unregister(array('ComposerAutoloaderInit 7bc26ac187e3e5b59cfcfcf02aeed97e', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader')); 30 30 31 31 require __DIR__ . '/autoload_static.php'; 32 call_user_func(\Composer\Autoload\ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::getInitializer($loader));32 call_user_func(\Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::getInitializer($loader)); 33 33 34 34 $loader->register(true); 35 35 36 $filesToLoad = \Composer\Autoload\ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::$files;36 $filesToLoad = \Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$files; 37 37 $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { 38 38 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_static.php
r3422687 r3444395 5 5 namespace Composer\Autoload; 6 6 7 class ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e7 class ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5 8 8 { 9 9 public static $files = array ( 10 10 '8d50dc88e56bace65e1e72f6017983ed' => __DIR__ . '/..' . '/freemius/wordpress-sdk/start.php', 11 '9387666eac3fc37c9ef87deb087980c6' => __DIR__ . '/..' . '/MENFGF/autoload.php',12 '79fa1c9a31d9f4c8c1a536bd9e014492' => __DIR__ . '/..' . '/MENFGF/gravityops/core/src/Admin/functions.php',13 11 ); 14 12 … … 20 18 { 21 19 return \Closure::bind(function () use ($loader) { 22 $loader->classMap = ComposerStaticInit 7bc26ac187e3e5b59cfcfcf02aeed97e::$classMap;20 $loader->classMap = ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$classMap; 23 21 24 22 }, null, ClassLoader::class); -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.json
r3422687 r3444395 59 59 { 60 60 "name": "gravityops/core", 61 "version": "1. 0.21",62 "version_normalized": "1. 0.21.0",61 "version": "1.1.0", 62 "version_normalized": "1.1.0.0", 63 63 "source": { 64 64 "type": "git", 65 65 "url": "[email protected]:Eitan-brightleaf/gravityops.git", 66 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522"66 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e" 67 67 }, 68 68 "dist": { 69 69 "type": "zip", 70 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/ 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",71 "reference": " 5d859a7cca5cf8c1e469c80a88e755fb1be7c522",70 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e", 71 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e", 72 72 "shasum": "" 73 73 }, 74 74 "require": { 75 "php": ">=7.4" 75 "php": ">=7.4", 76 "trustedlogin/client": "^v1.9" 76 77 }, 77 "time": "202 5-12-18T07:45:02+00:00",78 "time": "2026-01-21T19:42:14+00:00", 78 79 "type": "library", 79 80 "installation-source": "source", … … 84 85 "description": "Shared core library for GravityOps plugins", 85 86 "install-path": "../gravityops/core" 87 }, 88 { 89 "name": "trustedlogin/client", 90 "version": "v1.9.0", 91 "version_normalized": "1.9.0.0", 92 "source": { 93 "type": "git", 94 "url": "https://github.com/trustedlogin/client.git", 95 "reference": "b913058ae57b512a7766f449ab8d55952500fe72" 96 }, 97 "dist": { 98 "type": "zip", 99 "url": "https://api.github.com/repos/trustedlogin/client/zipball/b913058ae57b512a7766f449ab8d55952500fe72", 100 "reference": "b913058ae57b512a7766f449ab8d55952500fe72", 101 "shasum": "" 102 }, 103 "require-dev": { 104 "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 105 "ext-curl": "*", 106 "ext-json": "*", 107 "php": ">=5.3.0", 108 "phpcompatibility/phpcompatibility-wp": "^2.1", 109 "phpstan/extension-installer": "^1.3", 110 "phpstan/phpstan": "^1.10", 111 "szepeviktor/phpstan-wordpress": "^1.3", 112 "wp-coding-standards/wpcs": "^3.0", 113 "yoast/phpunit-polyfills": "^1.0.0" 114 }, 115 "time": "2024-08-26T01:13:42+00:00", 116 "bin": [ 117 "bin/build-sass" 118 ], 119 "type": "library", 120 "installation-source": "dist", 121 "autoload": [], 122 "notification-url": "https://packagist.org/downloads/", 123 "license": [ 124 "GPL-2.0-or-later" 125 ], 126 "authors": [ 127 { 128 "name": "TrustedLogin", 129 "email": "[email protected]", 130 "homepage": "https://www.trustedlogin.com" 131 } 132 ], 133 "description": "Easily and securely log in to your customers sites when providing support.", 134 "homepage": "https://www.trustedlogin.com", 135 "keywords": [ 136 "login", 137 "security", 138 "support" 139 ], 140 "support": { 141 "issues": "https://github.com/trustedlogin/client/issues", 142 "source": "https://github.com/trustedlogin/client/tree/v1.9.0" 143 }, 144 "install-path": "../trustedlogin/client" 86 145 } 87 146 ], -
mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.php
r3422687 r3444395 1 1 <?php return array( 2 2 'root' => array( 3 'name' => ' __root__',3 'name' => 'gravityops/mass-email', 4 4 'pretty_version' => 'dev-main', 5 5 'version' => 'dev-main', 6 'reference' => ' 4b921b3009464563093dfd512b32f402b1533e6b',6 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 7 7 'type' => 'library', 8 8 'install_path' => __DIR__ . '/../../', … … 11 11 ), 12 12 'versions' => array( 13 '__root__' => array(14 'pretty_version' => 'dev-main',15 'version' => 'dev-main',16 'reference' => '4b921b3009464563093dfd512b32f402b1533e6b',17 'type' => 'library',18 'install_path' => __DIR__ . '/../../',19 'aliases' => array(),20 'dev_requirement' => false,21 ),22 13 'freemius/wordpress-sdk' => array( 23 14 'pretty_version' => '2.13.0', … … 30 21 ), 31 22 'gravityops/core' => array( 32 'pretty_version' => '1. 0.21',33 'version' => '1. 0.21.0',34 'reference' => ' 5d859a7cca5cf8c1e469c80a88e755fb1be7c522',23 'pretty_version' => '1.1.0', 24 'version' => '1.1.0.0', 25 'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e', 35 26 'type' => 'library', 36 27 'install_path' => __DIR__ . '/../gravityops/core', … … 38 29 'dev_requirement' => false, 39 30 ), 31 'gravityops/mass-email' => array( 32 'pretty_version' => 'dev-main', 33 'version' => 'dev-main', 34 'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba', 35 'type' => 'library', 36 'install_path' => __DIR__ . '/../../', 37 'aliases' => array(), 38 'dev_requirement' => false, 39 ), 40 'trustedlogin/client' => array( 41 'pretty_version' => 'v1.9.0', 42 'version' => '1.9.0.0', 43 'reference' => 'b913058ae57b512a7766f449ab8d55952500fe72', 44 'type' => 'library', 45 'install_path' => __DIR__ . '/../trustedlogin/client', 46 'aliases' => array(), 47 'dev_requirement' => false, 48 ), 40 49 ), 41 50 );
Note: See TracChangeset
for help on using the changeset viewer.