Plugin Directory

Changeset 3464354


Ignore:
Timestamp:
02/18/2026 01:18:01 PM (5 weeks ago)
Author:
eitanatbrightleaf
Message:

Update to version 1.3.8 from GitHub

Location:
mass-email-notifications-for-gravity-forms
Files:
22 added
6 deleted
42 edited
1 copied

Legend:

Unmodified
Added
Removed
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/class-mass-email-notifications-for-gravity-forms.php

    r3444395 r3464354  
    22
    33use Gravity_Forms\Gravity_Forms\Settings\Settings;
    4 use MENFGF\GravityOps\Core\Admin\ReviewPrompter;
    5 use MENFGF\GravityOps\Core\Admin\SuiteMenu;
    6 use MENFGF\GravityOps\Core\Admin\SurveyPrompter;
     4use MENFGF\GravityOps\Core\SuiteCore\SuiteCore;
    75use MENFGF\GravityOps\Core\Traits\SingletonTrait;
    86use MENFGF\GravityOps\Core\Utils\AssetHelper;
    9 use MENFGF\GravityOps\Core\Admin\AdminShell;
    10 use function MENFGF\GravityOps\Core\Admin\gravityops_shell;
    117if ( !defined( 'ABSPATH' ) ) {
    128    exit;
     
    207203        parent::init_admin();
    208204        // Register the new GravityOps AdminShell page under the parent menu.
    209         gravityops_shell()->register_plugin_page( $this->_slug, [
     205        SuiteCore::instance()->shell()->register_plugin_page( $this->_slug, [
    210206            'title'      => $this->_title,
    211207            'menu_title' => $this->_short_title,
     
    249245        add_action( 'admin_post_menfgf_unsuppress', [$this, 'handle_unsuppress'] );
    250246        $param = 'https://wordpress.org/support/plugin/mass-email-notifications-for-gravity-forms/reviews/#new-post';
    251         $review_prompter = new ReviewPrompter($this->prefix, $this->_title, $param);
     247        $review_prompter = SuiteCore::instance()->review_prompter( $this->prefix, $this->_title, $param );
    252248        $review_prompter->init();
    253249        $review_prompter->maybe_show_review_request( $this->get_number_emails_sent(), 500 );
    254         $survey_prompter = new SurveyPrompter(
     250        $survey_prompter = SuiteCore::instance()->survey_prompter(
    255251            $this->prefix,
    256252            $this->_title,
     
    316312            ];
    317313        }
    318         $workflow_steps = [];
    319         if ( class_exists( AdminShell::class ) ) {
    320             $workflow_steps = AdminShell::get_workflow_steps_by_type( 'menfgf_create_batch' );
    321         }
    322         AdminShell::render_feeds_list(
     314        $workflow_steps = SuiteCore::instance()->shell()->get_workflow_steps_by_type( 'menfgf_create_batch' );
     315        SuiteCore::instance()->shell()->render_feeds_list(
    323316            $feeds_and_forms,
    324317            $this->_slug,
     
    404397     */
    405398    public function handle_toggle_feed() {
    406         AdminShell::process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
     399        SuiteCore::instance()->shell()->process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    407400    }
    408401
     
    413406     */
    414407    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' );
     408        SuiteCore::instance()->shell()->process_feed_toggle( 'menfgf_toggle_workflow_step', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    416409    }
    417410
     
    437430            exit;
    438431        }
    439         if ( !current_user_can( SuiteMenu::get_parent_capability() ) ) {
     432        if ( !current_user_can( SuiteCore::instance()->suite_menu()->get_parent_capability() ) ) {
    440433            wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=suppressions' ) );
    441434            exit;
     
    450443     */
    451444    public function gops_render_help() {
    452         AdminShell::render_help_tab( [
     445        SuiteCore::instance()->shell()->render_help_tab( [
    453446            'Learn More'             => 'https://brightleafdigital.io/mass-email-notifications-for-gravity-forms/',
    454447            'Docs'                   => 'https://brightleafdigital.io/mass-email-notifications-for-gravity-forms/#docs',
     
    475468     */
    476469    private function get_freemius_tabs() {
    477         $tabs = AdminShell::freemius_tabs( $this->_slug );
     470        $tabs = SuiteCore::instance()->shell()->freemius_tabs( $this->_slug );
    478471        if ( !menfgf_fs()->is_registered() ) {
    479472            unset($tabs['account']);
     
    565558     */
    566559    public function get_menu_icon() {
    567         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
     560        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
    568561    }
    569562
     
    577570     */
    578571    public function get_app_menu_icon() {
    579         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: SuiteMenu::get_icon() );
     572        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: SuiteCore::instance()->suite_menu()->get_icon() );
    580573    }
    581574
     
    588581     */
    589582    public function uninstall() {
     583        parent::uninstall();
    590584        delete_option( self::PREFIX . 'email_count' );
    591585        delete_option( self::PREFIX . 'rating_asked' );
     
    593587        delete_option( self::PREFIX . 'table_version' );
    594588        delete_option( self::PREFIX . 'suppressions_table_version' );
     589        delete_option( self::PREFIX . 'review_prompter_usage_count' );
     590        delete_option( self::PREFIX . 'survey_status' );
    595591        // Clear transients used for throttling and locking.
    596592        delete_transient( self::PREFIX . 'next_send_ready' );
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/mass-email-notifications-for-gf.php

    r3444395 r3464354  
    66 * Author URI: https://brightleafdigital.io/
    77 * Description: Allows you to send notifications to everyone who filled out any of your forms.
    8  * Version: 1.3.7
     8 * Version: 1.3.8
    99 * Author: BrightLeaf Digital
    1010 * License: GPL-2.0+
     
    1313 * @package MassEmailNotificationsForGravityForms
    1414 */
    15 use function MENFGF\GravityOps\Core\Admin\gravityops_shell;
     15use MENFGF\GravityOps\Core\SuiteCore\SuiteCore;
    1616if ( !defined( 'ABSPATH' ) ) {
    1717    exit;
    1818    // Exit if accessed directly.
    1919}
     20define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.8' );
     21define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    2022require_once __DIR__ . '/vendor/autoload.php';
    2123if ( file_exists( __DIR__ . '/vendor/MENFGF/autoload.php' ) ) {
    2224    require_once __DIR__ . '/vendor/MENFGF/autoload.php';
    2325}
    24 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded.
     26// Register this plugin with SuiteCore early so the latest provider can be selected.
    2527add_action( 'plugins_loaded', function () {
    26     gravityops_shell();
     28    $assets_base_url = '';
     29    if ( file_exists( __DIR__ . '/vendor/MENFGF/gravityops/core/assets/' ) ) {
     30        $assets_base_url = plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ );
     31    } else {
     32        $assets_base_url = plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
     33    }
     34    SuiteCore::register( [
     35        'assets_base_url' => $assets_base_url,
     36    ] );
    2737}, 1 );
    2838if ( function_exists( 'menfgf_fs' ) ) {
     
    7484    }
    7585    menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' );
    76     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.7' );
    77     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    7886    add_action( 'admin_notices', function () {
    7987        if ( !class_exists( 'GFForms' ) ) {
     
    101109        }
    102110    }, 5 );
    103     // Ensure GravityOps shared assets resolve when library is vendor-installed in this plugin.
    104     add_filter( 'gravityops_assets_base_url', function ( $url ) {
    105         if ( $url ) {
    106             return $url;
    107         }
    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__ );
    112     } );
    113111    add_action(
    114112        'gravityflow_loaded',
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/readme.txt

    r3444395 r3464354  
    22Tested up to: 6.9
    33Tags: GravityForms, notifications, email, task management, automation
    4 Stable tag: 1.3.7
     4Stable tag: 1.3.8
    55Requires PHP: 8.0
    66License: GPLv2 or later
     
    4444== Changelog ==
    4545
     46= 1.3.8 | Feb 18, 2026 =
     47- Fixed uninstall process to properly clear everything
     48- Updated core GravityOps library to improve the update plugin process among other small fixes
     49- Add support to run workflows on double opt-in
     50
    4651= 1.3.7 | Jan 21, 2026 =
    4752* 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/)
     
    5863= 1.3.4 | Dec 15, 2025 =
    5964* Fixed a bug with the Feed tab in the new admin menu.
    60 
    61 = 1.3.3 | Dec 15, 2025 =
    62 * We've upgraded the plugin's core components for smoother compatibility and a more reliable experience overall.
    63 * Improved the way feeds are displayed in the admin area, making it easier to see related forms and manage your email lists with clearer, more consistent layouts.
    64 * Streamlined the admin interface with new tabs and centralized tools, so navigating settings, suppressions, and feeds feels more intuitive and efficient.
    65 * Enhanced email sending reliability with smarter scheduling and automatic checks to ensure your campaigns run without interruptions, even if something goes off track.
    66 * Made unsubscribe handling simpler and more secure, with better options for managing preferences and viewing suppression lists.
    67 * Added better support for viewing email content previews in the admin panel and strengthened CSV file handling for more accurate imports.
    68 * Tweaked permissions and review prompts to make the plugin even more user-friendly, plus a few behind-the-scenes updates for better performance.
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/autoload.php

    r3444395 r3464354  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit576698bb6db496a6b33a55636c894704::getLoader();
     22return ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae::getLoader();
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/composer/autoload_classmap.php

    r3444395 r3464354  
    88return array(
    99    'MENFGF\\Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    10     'MENFGF\\GravityOps\\Core\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/Admin/AdminShell.php',
    11     'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/Admin/ReviewPrompter.php',
    12     'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader' => $vendorDir . '/gravityops/core/src/Admin/SettingsHeader.php',
    13     'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php',
    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',
    16     'MENFGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php',
     10    'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => $vendorDir . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     11    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     12    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     13    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     14    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     15    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     16    'MENFGF\\GravityOps\\Core\\SuiteCore\\Config' => $vendorDir . '/gravityops/core/src/SuiteCore/Config.php',
     17    'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     18    'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    1719    'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php',
    1820    'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php',
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/composer/autoload_real.php

    r3444395 r3464354  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit576698bb6db496a6b33a55636c894704
     5class ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::getInitializer($loader));
     32        call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
    3535        $loader->register(true);
    3636
    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 
    4937        return $loader;
    5038    }
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/composer/autoload_static.php

    r3444395 r3464354  
    55namespace MENFGF\Composer\Autoload;
    66
    7 class ComposerStaticInit576698bb6db496a6b33a55636c894704
     7class ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae
    88{
    9     public static $files = array (
    10         '6450a9b713c361c66ed3f0575f164e85' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php',
    11     );
    12 
    139    public static $prefixLengthsPsr4 = array (
    1410        'M' =>
     
    3228    public static $classMap = array (
    3329        'MENFGF\\Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
    34         'MENFGF\\GravityOps\\Core\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/Admin/AdminShell.php',
    35         'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/ReviewPrompter.php',
    36         'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SettingsHeader.php',
    37         'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php',
    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',
    40         'MENFGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php',
     30        'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     31        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     32        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     33        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     34        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     35        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     36        'MENFGF\\GravityOps\\Core\\SuiteCore\\Config' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Config.php',
     37        'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     38        'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    4139        'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php',
    4240        'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php',
     
    6361    {
    6462        return \Closure::bind(function () use ($loader) {
    65             $loader->prefixLengthsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixLengthsPsr4;
    66             $loader->prefixDirsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixDirsPsr4;
    67             $loader->classMap = ComposerStaticInit576698bb6db496a6b33a55636c894704::$classMap;
     63            $loader->prefixLengthsPsr4 = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$prefixLengthsPsr4;
     64            $loader->prefixDirsPsr4 = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$prefixDirsPsr4;
     65            $loader->classMap = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$classMap;
    6866
    6967        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/composer/installed.json

    r3444395 r3464354  
    33        "1": {
    44            "name": "gravityops/core",
    5             "version": "1.1.0",
    6             "version_normalized": "1.1.0.0",
     5            "version": "2.0.1",
     6            "version_normalized": "2.0.1.0",
    77            "source": {
    88                "type": "git",
    9                 "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    10                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
     9                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
     10                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
    1111            },
    1212            "dist": {
    1313                "type": "zip",
    14                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    15                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     14                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     15                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    1616                "shasum": ""
    1717            },
     
    2020                "trustedlogin/client": "^v1.9"
    2121            },
    22             "time": "2026-01-21T19:42:14+00:00",
     22            "time": "2026-02-18T09:47:24+00:00",
    2323            "type": "library",
    2424            "installation-source": "source",
     
    2626                "psr-4": {
    2727                    "MENFGF\\GravityOps\\Core\\": "src/"
    28                 },
    29                 "files": [
    30                     "src/Admin/functions.php"
    31                 ]
     28                }
    3229            },
    3330            "license": [
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/composer/installed.php

    r3444395 r3464354  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     7    'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    1717    'gravityops/core' =>
    1818    array (
    19       'pretty_version' => '1.1.0',
    20       'version' => '1.1.0.0',
    21       'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     19      'pretty_version' => '2.0.1',
     20      'version' => '2.0.1.0',
     21      'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    2222      'type' => 'library',
    2323      'install_path' => __DIR__ . '/../gravityops/core',
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/gravityops/core/assets/css/admin.css

    r3444395 r3464354  
    3131.gops-tab{padding:6px 14px;border-radius:999px;background:transparent;border:0;text-decoration:none;color:var(--gops-color-muted);font-weight: 500;}
    3232.gops-tab.is-active{background: var(--gops-color-primary);color:#fff}
     33.gops-tab__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 6px;border-radius:999px;background:#5F6EEA;color:#fff;font-size:11px;font-weight:700;line-height:1;margin-left:6px;border:0}
     34
     35/* Toolbar */
     36.gops-actions{display:flex;justify-content:flex-end;margin:6px 0 14px}
    3337
    3438/* Content / cards */
     
    7680.gops-link{color:#5F6EEA;text-decoration:none} /* Accent Product Blue */
    7781.gops-link:hover{text-decoration:underline; color: #4A57C6;}
     82button.gops-link{background:none;border:0;padding:0;font:inherit;line-height:1.3;cursor:pointer}
     83
     84/* Loading state */
     85.gops-action-button.is-loading{opacity:.7;pointer-events:none}
     86.gops-spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;margin-left:6px;vertical-align:-2px;animation:gops-spin .7s linear infinite}
     87@keyframes gops-spin{to{transform:rotate(360deg)}}
     88
     89/* Modal */
     90.gops-modal{position:fixed;inset:0;display:none;align-items:center;justify-content:center;z-index:100000}
     91.gops-modal.is-open{display:flex}
     92.gops-modal__backdrop{position:absolute;inset:0;background:rgba(26,20,41,.6)}
     93.gops-modal__dialog{position:relative;z-index:1;background:#fff;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.25);width:min(720px,92vw);max-height:80vh;display:flex;flex-direction:column;padding:12px 16px}
     94.gops-modal__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
     95.gops-modal__title{margin:0;font-size:18px;color:var(--gops-color-text)}
     96.gops-modal__close{background:none;border:0;font-size:26px;line-height:1;cursor:pointer;color:var(--gops-color-muted);transition:color .15s ease}
     97.gops-modal__close:hover{color:var(--gops-color-primary)}
     98.gops-modal__body{overflow:auto;padding:0 4px}
     99.gops-modal__content{margin:0;color:var(--gops-color-text);font-size:13px;line-height:1.4}
     100.gops-modal__content h3,
     101.gops-modal__content h4 {
     102    margin: 1em 0 0.3em;
     103    font-size: 15px;
     104    color: var(--gops-color-primary);
     105    font-weight: 600;
     106}
     107.gops-modal__content h3:first-child,
     108.gops-modal__content h4:first-child {
     109    margin-top: 0;
     110}
     111.gops-modal__content ul {
     112    margin: 0 0 0.8em 0;
     113    padding: 0 0 0 1.4em;
     114    list-style-type: disc !important;
     115}
     116.gops-modal__content li {
     117    margin-bottom: 0.3em;
     118    display: list-item !important;
     119}
     120.gops-modal__content p {
     121    margin: 0 0 0.6em;
     122}
     123.gops-modal__footer{margin-top:8px;display:flex;justify-content:flex-end;border-top:1px solid var(--gops-color-border);padding-top:10px}
    78124
    79125/* Brand primary button styling within our admin */
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/gravityops/core/assets/js/admin.js

    r3444395 r3464354  
    55    function qsa(s, c) {
    66        return Array.prototype.slice.call((c || document).querySelectorAll(s));
     7    }
     8    function getAdminConfig() {
     9        const root = qs('.gops-admin');
     10        const fallback = {};
     11        if (root) {
     12            fallback.nonce = root.getAttribute('data-gops-nonce') || '';
     13            fallback.ajaxUrl = root.getAttribute('data-gops-ajax') || '';
     14        }
     15        return Object.assign({}, fallback, window.gopsAdmin || {});
     16    }
     17
     18    function showNotice(type, message) {
     19        const wrap = qs('.gops-admin') || document;
     20        const header = qs('.gops-header', wrap) || qs('.gops-header');
     21        const box = ensureNoticesContainer(
     22            wrap,
     23            header || wrap.firstElementChild
     24        );
     25        if (!box) {
     26            return;
     27        }
     28        const notice = document.createElement('div');
     29        notice.className = 'notice notice-' + type + ' is-dismissible';
     30        const p = document.createElement('p');
     31        p.textContent = message;
     32        notice.appendChild(p);
     33        const btn = document.createElement('button');
     34        btn.type = 'button';
     35        btn.className = 'notice-dismiss';
     36        btn.innerHTML =
     37            '<span class="screen-reader-text">Dismiss this notice.</span>';
     38        btn.addEventListener('click', function () {
     39            notice.remove();
     40        });
     41        notice.appendChild(btn);
     42        box.appendChild(notice);
     43    }
     44
     45    function setButtonLoading(btn, isLoading) {
     46        if (!btn) {
     47            return;
     48        }
     49        if (isLoading) {
     50            if (!btn.dataset.gopsOriginalText) {
     51                btn.dataset.gopsOriginalText = btn.textContent.trim();
     52            }
     53            btn.classList.add('is-loading');
     54            btn.disabled = true;
     55            if (!qs('.gops-spinner', btn)) {
     56                const spinner = document.createElement('span');
     57                spinner.className = 'gops-spinner';
     58                btn.appendChild(spinner);
     59            }
     60        } else {
     61            btn.classList.remove('is-loading');
     62            btn.disabled = false;
     63            const spinner = qs('.gops-spinner', btn);
     64            if (spinner) {
     65                spinner.remove();
     66            }
     67        }
     68    }
     69
     70    function ajaxRequest(action, data) {
     71        const cfg = getAdminConfig();
     72        const url = cfg.ajaxUrl || window.ajaxurl || '';
     73        const payload = Object.assign(
     74            {
     75                action,
     76                nonce: cfg.nonce || '',
     77            },
     78            data || {}
     79        );
     80        return jQuery.post(url, payload);
     81    }
     82
     83    function replaceTileHtml(slug, html) {
     84        if (!slug || !html) {
     85            return;
     86        }
     87        const tile = qs('.gops-tile[data-gops-tile="' + slug + '"]');
     88        if (tile) {
     89            tile.outerHTML = html;
     90        }
     91    }
     92
     93    function updateUpdatesCount(count, updatableCount) {
     94        const tabs = qs('.gops-tabs');
     95        if (tabs) {
     96            let updatesTab = qs('[data-gops-tab="updates"]', tabs);
     97            if (count > 0) {
     98                if (!updatesTab) {
     99                    const cfg = getAdminConfig();
     100                    const href = cfg.updatesUrl || '';
     101                    if (href) {
     102                        updatesTab = document.createElement('a');
     103                        updatesTab.className = 'gops-tab';
     104                        updatesTab.setAttribute('data-gops-tab', 'updates');
     105                        updatesTab.href = href;
     106                        updatesTab.textContent = 'Updates';
     107                        if (
     108                            new URLSearchParams(window.location.search).get(
     109                                'gops_filter'
     110                            ) === 'updates'
     111                        ) {
     112                            updatesTab.classList.add('is-active');
     113                        }
     114                        const badge = document.createElement('span');
     115                        badge.className = 'gops-tab__badge';
     116                        badge.setAttribute('data-gops-updates-count', count);
     117                        badge.textContent = String(count);
     118                        updatesTab.appendChild(badge);
     119                        const allTab = qs('[data-gops-tab="all"]', tabs);
     120                        if (allTab && allTab.nextSibling) {
     121                            tabs.insertBefore(updatesTab, allTab.nextSibling);
     122                        } else {
     123                            tabs.appendChild(updatesTab);
     124                        }
     125                    }
     126                } else {
     127                    let badge = qs('.gops-tab__badge', updatesTab);
     128                    if (!badge) {
     129                        badge = document.createElement('span');
     130                        badge.className = 'gops-tab__badge';
     131                        updatesTab.appendChild(badge);
     132                    }
     133                    badge.setAttribute('data-gops-updates-count', count);
     134                    badge.textContent = String(count);
     135                }
     136            } else if (updatesTab) {
     137                updatesTab.remove();
     138            }
     139        }
     140
     141        const actionsWrap = qs('.gops-actions');
     142        if (actionsWrap) {
     143            const updateAllBtn = qs('.gops-update-all', actionsWrap);
     144            const effectiveUpdatableCount =
     145                typeof updatableCount !== 'undefined' ? updatableCount : count;
     146            if (effectiveUpdatableCount > 0) {
     147                actionsWrap.style.display = '';
     148                if (updateAllBtn) {
     149                    updateAllBtn.textContent =
     150                        'Update All (' + effectiveUpdatableCount + ')';
     151                }
     152            } else {
     153                actionsWrap.style.display = 'none';
     154            }
     155        }
     156
     157        // Update WordPress sidebar menu badge
     158        const menuBadge = document.querySelector(
     159            '#toplevel_page_gravity_ops .update-plugins'
     160        );
     161        if (menuBadge) {
     162            if (count > 0) {
     163                menuBadge.className = 'update-plugins count-' + count;
     164                const inner = menuBadge.querySelector('.plugin-count');
     165                if (inner) {
     166                    inner.textContent = String(count);
     167                }
     168            } else {
     169                menuBadge.remove();
     170            }
     171        }
     172    }
     173
     174    function openChangelogModal(data) {
     175        const modal = qs('#gops-changelog-modal');
     176        if (!modal) {
     177            return;
     178        }
     179        const title = qs('.gops-modal__title', modal);
     180        const content = qs('.gops-modal__content', modal);
     181        const link = qs('.gops-modal__full-link', modal);
     182        if (title) {
     183            title.textContent = data.title || 'Changelog';
     184        }
     185        if (content) {
     186            content.innerHTML = data.changelog || 'Changelog not available.';
     187        }
     188        if (link) {
     189            if (data.full_url) {
     190                link.href = data.full_url;
     191                link.style.display = '';
     192            } else {
     193                link.style.display = 'none';
     194            }
     195        }
     196        modal.style.display = '';
     197        modal.classList.add('is-open');
     198        modal.setAttribute('aria-hidden', 'false');
     199    }
     200
     201    function closeChangelogModal() {
     202        const modal = qs('#gops-changelog-modal');
     203        if (!modal) {
     204            return;
     205        }
     206        modal.classList.remove('is-open');
     207        modal.style.display = 'none';
     208        modal.setAttribute('aria-hidden', 'true');
    7209    }
    8210
     
    156358        if (link && link.href) {
    157359            window.location.href = link.href;
     360        }
     361    });
     362
     363    // Action buttons (update/activate/deactivate/changelog)
     364    document.addEventListener('click', function (e) {
     365        const btn = e.target.closest('button[data-gops-action]');
     366        if (!btn) {
     367            return;
     368        }
     369
     370        const action = btn.getAttribute('data-gops-action') || '';
     371        if (!action) {
     372            return;
     373        }
     374
     375        e.preventDefault();
     376        e.stopPropagation();
     377
     378        const slug = btn.getAttribute('data-gops-slug') || '';
     379        const pluginFile = btn.getAttribute('data-gops-plugin-file') || '';
     380
     381        if (action === 'changelog') {
     382            if (!slug) {
     383                showNotice('error', 'Missing plugin data.');
     384                return;
     385            }
     386            setButtonLoading(btn, true);
     387            ajaxRequest('gops_get_changelog', {
     388                slug,
     389                plugin: pluginFile,
     390            })
     391                .done(function (resp) {
     392                    if (resp && resp.success) {
     393                        openChangelogModal(resp.data || {});
     394                    } else {
     395                        const msg =
     396                            (resp && resp.data && resp.data.message) ||
     397                            'Unable to load changelog.';
     398                        showNotice('error', msg);
     399                    }
     400                })
     401                .fail(function () {
     402                    showNotice('error', 'Unable to load changelog.');
     403                })
     404                .always(function () {
     405                    setButtonLoading(btn, false);
     406                });
     407            return;
     408        }
     409
     410        if (btn.classList.contains('is-loading')) {
     411            return;
     412        }
     413
     414        let request = null;
     415        if (action === 'update') {
     416            request = ajaxRequest('gops_update_plugin', {
     417                slug,
     418                plugin: pluginFile,
     419            });
     420        } else if (action === 'update-all') {
     421            request = ajaxRequest('gops_update_all', {});
     422        } else if (action === 'activate' || action === 'deactivate') {
     423            request = ajaxRequest('gops_toggle_plugin', {
     424                slug,
     425                plugin: pluginFile,
     426                toggle: action,
     427            });
     428        }
     429
     430        if (!request) {
     431            return;
     432        }
     433
     434        setButtonLoading(btn, true);
     435
     436        request
     437            .done(function (resp) {
     438                if (resp && resp.success) {
     439                    const data = resp.data || {};
     440                    if (data.tile_html && data.slug) {
     441                        replaceTileHtml(data.slug, data.tile_html);
     442                    }
     443                    if (data.tiles) {
     444                        Object.keys(data.tiles).forEach(function (tileSlug) {
     445                            replaceTileHtml(tileSlug, data.tiles[tileSlug]);
     446                        });
     447                    }
     448                    if (typeof data.updates_count === 'number') {
     449                        updateUpdatesCount(
     450                            data.updates_count,
     451                            data.updatable_count
     452                        );
     453                    }
     454                    if (data.message) {
     455                        showNotice(
     456                            data.errors && data.errors.length
     457                                ? 'warning'
     458                                : 'success',
     459                            data.message
     460                        );
     461                    }
     462
     463                    // Refresh all updates after a successful action to maintain consistency.
     464                    if (
     465                        action === 'update' ||
     466                        action === 'update-all' ||
     467                        action === 'activate' ||
     468                        action === 'deactivate'
     469                    ) {
     470                        triggerBackgroundRefresh();
     471                    }
     472                    if (data.errors && data.errors.length) {
     473                        data.errors.forEach(function (err) {
     474                            showNotice('error', err);
     475                        });
     476                    }
     477                } else {
     478                    const msg =
     479                        (resp && resp.data && resp.data.message) ||
     480                        'Action failed.';
     481                    showNotice('error', msg);
     482                }
     483            })
     484            .fail(function (resp) {
     485                let msg = 'Action failed.';
     486                if (resp && resp.responseJSON && resp.responseJSON.data) {
     487                    msg = resp.responseJSON.data.message || msg;
     488                } else if (resp && resp.responseText) {
     489                    msg =
     490                        resp.responseText.trim() === '-1'
     491                            ? 'Security check failed. Refresh and try again.'
     492                            : resp.responseText;
     493                }
     494                showNotice('error', msg);
     495            })
     496            .always(function () {
     497                setButtonLoading(btn, false);
     498            });
     499    });
     500
     501    // Modal close actions
     502    document.addEventListener('click', function (e) {
     503        if (e.target.closest('[data-gops-modal-close]')) {
     504            e.preventDefault();
     505            closeChangelogModal();
     506        }
     507    });
     508    document.addEventListener('keydown', function (e) {
     509        if (e.key === 'Escape') {
     510            closeChangelogModal();
    158511        }
    159512    });
     
    306659            moveNotices();
    307660            applyFreePluginExternalTabTargets();
     661            triggerBackgroundRefresh();
    308662        });
    309663    } else {
     
    311665        moveNotices();
    312666        applyFreePluginExternalTabTargets();
     667        triggerBackgroundRefresh();
     668    }
     669
     670    function triggerBackgroundRefresh() {
     671        const root = qs('.gops-admin');
     672        if (root && root.dataset.gopsRefresh === '1') {
     673            const loader = qs('.gops-header-loader', root);
     674            if (loader) {
     675                loader.style.display = 'block';
     676            }
     677            const tiles = qsa('.gops-tile');
     678            const items = tiles.map(function (tile) {
     679                const slug = tile.dataset.gopsTile;
     680                const versionEl = qs('.gops-tile__version', tile);
     681                const version = versionEl
     682                    ? versionEl.textContent.replace('v', '').trim()
     683                    : '0';
     684                return { slug, version };
     685            });
     686
     687            ajaxRequest('gops_check_suite_updates', {
     688                items: JSON.stringify(items),
     689            })
     690                .done(function (resp) {
     691                    if (resp && resp.success && resp.data) {
     692                        const data = resp.data;
     693                        if (data.tiles) {
     694                            Object.keys(data.tiles).forEach(function (slug) {
     695                                replaceTileHtml(slug, data.tiles[slug]);
     696                            });
     697                        }
     698                        if (typeof data.updates_count === 'number') {
     699                            updateUpdatesCount(
     700                                data.updates_count,
     701                                data.updatable_count
     702                            );
     703                        }
     704                    }
     705                })
     706                .always(function () {
     707                    if (loader) {
     708                        loader.style.display = 'none';
     709                    }
     710                });
     711        }
    313712    }
    314713    function applyFreePluginExternalTabTargets() {
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/gravityops/core/composer.json

    r3444395 r3464354  
    1111    "psr-4": {
    1212      "GravityOps\\Core\\": "src/"
    13     },
    14     "files": [
    15       "src/Admin/functions.php"
    16     ]
     13    }
    1714  }
    1815}
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/trustedlogin/client/src/Config.php

    r3444395 r3464354  
    179179            ),
    180180            true
    181         ) && ! defined( 'TL_DOING_TESTS' ) ) {
     181        ) && ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    182182            throw new Exception( 'Developer: make sure to change the namespace for the TrustedLogin class. See https://trustedlogin.com/configuration/ for more information.', 501 );
    183183        }
     
    190190
    191191        if ( isset( $this->settings['vendor']['website'] ) ) {
    192             if ( 'https://www.example.com' === $this->settings['vendor']['website'] && ! defined( 'TL_DOING_TESTS' ) ) {
     192            if ( 'https://www.example.com' === $this->settings['vendor']['website'] && ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    193193                $errors[] = new WP_Error( 'missing_configuration', 'You need to configure the "website" URL to point to the URL where the Vendor plugin is installed.' );
    194194            }
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/trustedlogin/client/src/Utils.php

    r3444395 r3464354  
    196196        $ip = sanitize_text_field( $ip );
    197197
    198         if ( ! defined( 'TL_DOING_TESTS' ) ) {
     198        if ( ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    199199            $ip = filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE );
    200200        }
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/MENFGF/trustedlogin/client/tests/bootstrap.php

    r3444395 r3464354  
    1111require_once dirname( __DIR__ ) . '/vendor/autoload.php';
    1212
    13 if ( ! defined( 'TL_DOING_TESTS' ) ) {
    14     define( 'TL_DOING_TESTS', true );
     13if ( ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
     14    define( 'MENFGF_TL_DOING_TESTS', true );
    1515}
    1616
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/autoload.php

    r3444395 r3464354  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5::getLoader();
     22return ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c::getLoader();
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/composer/autoload_aliases.php

    r3444395 r3464354  
    55namespace {
    66
    7 }
    8 namespace GravityOps\Core\Admin {
    9     if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){
    10         function gravityops_shell(...$args) {
    11             return \MENFGF\GravityOps\Core\Admin\gravityops_shell(...func_get_args());
    12         }
    13     }
    147}
    158namespace TrustedLogin {
     
    4235         */
    4336        private array $autoloadAliases = array (
    44   'GravityOps\\Core\\Admin\\AdminShell' =>
     37  'GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' =>
    4538  array (
    4639    'type' => 'class',
    4740    'classname' => 'AdminShell',
    4841    'isabstract' => false,
    49     'namespace' => 'GravityOps\\Core\\Admin',
    50     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\AdminShell',
    51     'implements' =>
    52     array (
    53     ),
    54   ),
    55   'GravityOps\\Core\\Admin\\ReviewPrompter' =>
     42    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     43    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell',
     44    'implements' =>
     45    array (
     46    ),
     47  ),
     48  'GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' =>
    5649  array (
    5750    'type' => 'class',
    5851    'classname' => 'ReviewPrompter',
    5952    'isabstract' => false,
    60     'namespace' => 'GravityOps\\Core\\Admin',
    61     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter',
    62     'implements' =>
    63     array (
    64     ),
    65   ),
    66   'GravityOps\\Core\\Admin\\SettingsHeader' =>
    67   array (
    68     'type' => 'class',
    69     'classname' => 'SettingsHeader',
    70     'isabstract' => false,
    71     'namespace' => 'GravityOps\\Core\\Admin',
    72     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader',
    73     'implements' =>
    74     array (
    75     ),
    76   ),
    77   'GravityOps\\Core\\Admin\\SuiteMenu' =>
     53    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     54    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter',
     55    'implements' =>
     56    array (
     57    ),
     58  ),
     59  'GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' =>
    7860  array (
    7961    'type' => 'class',
    8062    'classname' => 'SuiteMenu',
    8163    'isabstract' => false,
    82     'namespace' => 'GravityOps\\Core\\Admin',
    83     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu',
    84     'implements' =>
    85     array (
    86     ),
    87   ),
    88   'GravityOps\\Core\\Admin\\SurveyPrompter' =>
     64    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     65    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu',
     66    'implements' =>
     67    array (
     68    ),
     69  ),
     70  'GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' =>
    8971  array (
    9072    'type' => 'class',
    9173    'classname' => 'SurveyPrompter',
    9274    'isabstract' => false,
    93     'namespace' => 'GravityOps\\Core\\Admin',
    94     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter',
    95     'implements' =>
    96     array (
    97     ),
    98   ),
    99   'GravityOps\\Core\\Admin\\TrustedLogin' =>
     75    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     76    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter',
     77    'implements' =>
     78    array (
     79    ),
     80  ),
     81  'GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' =>
    10082  array (
    10183    'type' => 'class',
    10284    'classname' => 'TrustedLogin',
    10385    'isabstract' => false,
    104     'namespace' => 'GravityOps\\Core\\Admin',
    105     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin',
    106     'implements' =>
    107     array (
    108     ),
    109   ),
    110   'GravityOps\\Core\\SuiteRegistry' =>
    111   array (
    112     'type' => 'class',
    113     'classname' => 'SuiteRegistry',
    114     'isabstract' => false,
    115     'namespace' => 'GravityOps\\Core',
    116     'extends' => 'MENFGF\\GravityOps\\Core\\SuiteRegistry',
     86    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     87    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin',
     88    'implements' =>
     89    array (
     90    ),
     91  ),
     92  'GravityOps\\Core\\SuiteCore\\AdminAssetHelper' =>
     93  array (
     94    'type' => 'class',
     95    'classname' => 'AdminAssetHelper',
     96    'isabstract' => false,
     97    'namespace' => 'GravityOps\\Core\\SuiteCore',
     98    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper',
     99    'implements' =>
     100    array (
     101    ),
     102  ),
     103  'GravityOps\\Core\\SuiteCore\\Config' =>
     104  array (
     105    'type' => 'class',
     106    'classname' => 'Config',
     107    'isabstract' => false,
     108    'namespace' => 'GravityOps\\Core\\SuiteCore',
     109    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Config',
     110    'implements' =>
     111    array (
     112    ),
     113  ),
     114  'GravityOps\\Core\\SuiteCore\\SuiteCatalog' =>
     115  array (
     116    'type' => 'class',
     117    'classname' => 'SuiteCatalog',
     118    'isabstract' => false,
     119    'namespace' => 'GravityOps\\Core\\SuiteCore',
     120    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog',
     121    'implements' =>
     122    array (
     123    ),
     124  ),
     125  'GravityOps\\Core\\SuiteCore\\SuiteCore' =>
     126  array (
     127    'type' => 'class',
     128    'classname' => 'SuiteCore',
     129    'isabstract' => false,
     130    'namespace' => 'GravityOps\\Core\\SuiteCore',
     131    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore',
    117132    'implements' =>
    118133    array (
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/composer/autoload_real.php

    r3444395 r3464354  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5
     5class ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::$files;
    3737        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3838            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/composer/autoload_static.php

    r3444395 r3464354  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5
     7class ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c
    88{
    99    public static $files = array (
     
    1818    {
    1919        return \Closure::bind(function () use ($loader) {
    20             $loader->classMap = ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$classMap;
     20            $loader->classMap = ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::$classMap;
    2121
    2222        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/composer/installed.json

    r3444395 r3464354  
    5959        {
    6060            "name": "gravityops/core",
    61             "version": "1.1.0",
    62             "version_normalized": "1.1.0.0",
     61            "version": "2.0.1",
     62            "version_normalized": "2.0.1.0",
    6363            "source": {
    6464                "type": "git",
    65                 "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    66                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
     65                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
     66                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
    6767            },
    6868            "dist": {
    6969                "type": "zip",
    70                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    71                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     70                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     71                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    7272                "shasum": ""
    7373            },
     
    7676                "trustedlogin/client": "^v1.9"
    7777            },
    78             "time": "2026-01-21T19:42:14+00:00",
     78            "time": "2026-02-18T09:47:24+00:00",
    7979            "type": "library",
    8080            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/tags/1.3.8/vendor/composer/installed.php

    r3444395 r3464354  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     6        'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    2121        ),
    2222        'gravityops/core' => array(
    23             'pretty_version' => '1.1.0',
    24             'version' => '1.1.0.0',
    25             'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     23            'pretty_version' => '2.0.1',
     24            'version' => '2.0.1.0',
     25            'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    2626            'type' => 'library',
    2727            'install_path' => __DIR__ . '/../gravityops/core',
     
    3232            'pretty_version' => 'dev-main',
    3333            'version' => 'dev-main',
    34             'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     34            'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    3535            'type' => 'library',
    3636            'install_path' => __DIR__ . '/../../',
  • mass-email-notifications-for-gravity-forms/trunk/class-mass-email-notifications-for-gravity-forms.php

    r3444395 r3464354  
    22
    33use Gravity_Forms\Gravity_Forms\Settings\Settings;
    4 use MENFGF\GravityOps\Core\Admin\ReviewPrompter;
    5 use MENFGF\GravityOps\Core\Admin\SuiteMenu;
    6 use MENFGF\GravityOps\Core\Admin\SurveyPrompter;
     4use MENFGF\GravityOps\Core\SuiteCore\SuiteCore;
    75use MENFGF\GravityOps\Core\Traits\SingletonTrait;
    86use MENFGF\GravityOps\Core\Utils\AssetHelper;
    9 use MENFGF\GravityOps\Core\Admin\AdminShell;
    10 use function MENFGF\GravityOps\Core\Admin\gravityops_shell;
    117if ( !defined( 'ABSPATH' ) ) {
    128    exit;
     
    207203        parent::init_admin();
    208204        // Register the new GravityOps AdminShell page under the parent menu.
    209         gravityops_shell()->register_plugin_page( $this->_slug, [
     205        SuiteCore::instance()->shell()->register_plugin_page( $this->_slug, [
    210206            'title'      => $this->_title,
    211207            'menu_title' => $this->_short_title,
     
    249245        add_action( 'admin_post_menfgf_unsuppress', [$this, 'handle_unsuppress'] );
    250246        $param = 'https://wordpress.org/support/plugin/mass-email-notifications-for-gravity-forms/reviews/#new-post';
    251         $review_prompter = new ReviewPrompter($this->prefix, $this->_title, $param);
     247        $review_prompter = SuiteCore::instance()->review_prompter( $this->prefix, $this->_title, $param );
    252248        $review_prompter->init();
    253249        $review_prompter->maybe_show_review_request( $this->get_number_emails_sent(), 500 );
    254         $survey_prompter = new SurveyPrompter(
     250        $survey_prompter = SuiteCore::instance()->survey_prompter(
    255251            $this->prefix,
    256252            $this->_title,
     
    316312            ];
    317313        }
    318         $workflow_steps = [];
    319         if ( class_exists( AdminShell::class ) ) {
    320             $workflow_steps = AdminShell::get_workflow_steps_by_type( 'menfgf_create_batch' );
    321         }
    322         AdminShell::render_feeds_list(
     314        $workflow_steps = SuiteCore::instance()->shell()->get_workflow_steps_by_type( 'menfgf_create_batch' );
     315        SuiteCore::instance()->shell()->render_feeds_list(
    323316            $feeds_and_forms,
    324317            $this->_slug,
     
    404397     */
    405398    public function handle_toggle_feed() {
    406         AdminShell::process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
     399        SuiteCore::instance()->shell()->process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    407400    }
    408401
     
    413406     */
    414407    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' );
     408        SuiteCore::instance()->shell()->process_feed_toggle( 'menfgf_toggle_workflow_step', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    416409    }
    417410
     
    437430            exit;
    438431        }
    439         if ( !current_user_can( SuiteMenu::get_parent_capability() ) ) {
     432        if ( !current_user_can( SuiteCore::instance()->suite_menu()->get_parent_capability() ) ) {
    440433            wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=suppressions' ) );
    441434            exit;
     
    450443     */
    451444    public function gops_render_help() {
    452         AdminShell::render_help_tab( [
     445        SuiteCore::instance()->shell()->render_help_tab( [
    453446            'Learn More'             => 'https://brightleafdigital.io/mass-email-notifications-for-gravity-forms/',
    454447            'Docs'                   => 'https://brightleafdigital.io/mass-email-notifications-for-gravity-forms/#docs',
     
    475468     */
    476469    private function get_freemius_tabs() {
    477         $tabs = AdminShell::freemius_tabs( $this->_slug );
     470        $tabs = SuiteCore::instance()->shell()->freemius_tabs( $this->_slug );
    478471        if ( !menfgf_fs()->is_registered() ) {
    479472            unset($tabs['account']);
     
    565558     */
    566559    public function get_menu_icon() {
    567         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
     560        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
    568561    }
    569562
     
    577570     */
    578571    public function get_app_menu_icon() {
    579         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: SuiteMenu::get_icon() );
     572        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: SuiteCore::instance()->suite_menu()->get_icon() );
    580573    }
    581574
     
    588581     */
    589582    public function uninstall() {
     583        parent::uninstall();
    590584        delete_option( self::PREFIX . 'email_count' );
    591585        delete_option( self::PREFIX . 'rating_asked' );
     
    593587        delete_option( self::PREFIX . 'table_version' );
    594588        delete_option( self::PREFIX . 'suppressions_table_version' );
     589        delete_option( self::PREFIX . 'review_prompter_usage_count' );
     590        delete_option( self::PREFIX . 'survey_status' );
    595591        // Clear transients used for throttling and locking.
    596592        delete_transient( self::PREFIX . 'next_send_ready' );
  • mass-email-notifications-for-gravity-forms/trunk/mass-email-notifications-for-gf.php

    r3444395 r3464354  
    66 * Author URI: https://brightleafdigital.io/
    77 * Description: Allows you to send notifications to everyone who filled out any of your forms.
    8  * Version: 1.3.7
     8 * Version: 1.3.8
    99 * Author: BrightLeaf Digital
    1010 * License: GPL-2.0+
     
    1313 * @package MassEmailNotificationsForGravityForms
    1414 */
    15 use function MENFGF\GravityOps\Core\Admin\gravityops_shell;
     15use MENFGF\GravityOps\Core\SuiteCore\SuiteCore;
    1616if ( !defined( 'ABSPATH' ) ) {
    1717    exit;
    1818    // Exit if accessed directly.
    1919}
     20define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.8' );
     21define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    2022require_once __DIR__ . '/vendor/autoload.php';
    2123if ( file_exists( __DIR__ . '/vendor/MENFGF/autoload.php' ) ) {
    2224    require_once __DIR__ . '/vendor/MENFGF/autoload.php';
    2325}
    24 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded.
     26// Register this plugin with SuiteCore early so the latest provider can be selected.
    2527add_action( 'plugins_loaded', function () {
    26     gravityops_shell();
     28    $assets_base_url = '';
     29    if ( file_exists( __DIR__ . '/vendor/MENFGF/gravityops/core/assets/' ) ) {
     30        $assets_base_url = plugins_url( 'vendor/MENFGF/gravityops/core/assets/', __FILE__ );
     31    } else {
     32        $assets_base_url = plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
     33    }
     34    SuiteCore::register( [
     35        'assets_base_url' => $assets_base_url,
     36    ] );
    2737}, 1 );
    2838if ( function_exists( 'menfgf_fs' ) ) {
     
    7484    }
    7585    menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' );
    76     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.7' );
    77     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    7886    add_action( 'admin_notices', function () {
    7987        if ( !class_exists( 'GFForms' ) ) {
     
    101109        }
    102110    }, 5 );
    103     // Ensure GravityOps shared assets resolve when library is vendor-installed in this plugin.
    104     add_filter( 'gravityops_assets_base_url', function ( $url ) {
    105         if ( $url ) {
    106             return $url;
    107         }
    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__ );
    112     } );
    113111    add_action(
    114112        'gravityflow_loaded',
  • mass-email-notifications-for-gravity-forms/trunk/readme.txt

    r3444395 r3464354  
    22Tested up to: 6.9
    33Tags: GravityForms, notifications, email, task management, automation
    4 Stable tag: 1.3.7
     4Stable tag: 1.3.8
    55Requires PHP: 8.0
    66License: GPLv2 or later
     
    4444== Changelog ==
    4545
     46= 1.3.8 | Feb 18, 2026 =
     47- Fixed uninstall process to properly clear everything
     48- Updated core GravityOps library to improve the update plugin process among other small fixes
     49- Add support to run workflows on double opt-in
     50
    4651= 1.3.7 | Jan 21, 2026 =
    4752* 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/)
     
    5863= 1.3.4 | Dec 15, 2025 =
    5964* Fixed a bug with the Feed tab in the new admin menu.
    60 
    61 = 1.3.3 | Dec 15, 2025 =
    62 * We've upgraded the plugin's core components for smoother compatibility and a more reliable experience overall.
    63 * Improved the way feeds are displayed in the admin area, making it easier to see related forms and manage your email lists with clearer, more consistent layouts.
    64 * Streamlined the admin interface with new tabs and centralized tools, so navigating settings, suppressions, and feeds feels more intuitive and efficient.
    65 * Enhanced email sending reliability with smarter scheduling and automatic checks to ensure your campaigns run without interruptions, even if something goes off track.
    66 * Made unsubscribe handling simpler and more secure, with better options for managing preferences and viewing suppression lists.
    67 * Added better support for viewing email content previews in the admin panel and strengthened CSV file handling for more accurate imports.
    68 * Tweaked permissions and review prompts to make the plugin even more user-friendly, plus a few behind-the-scenes updates for better performance.
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/autoload.php

    r3444395 r3464354  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit576698bb6db496a6b33a55636c894704::getLoader();
     22return ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae::getLoader();
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_classmap.php

    r3444395 r3464354  
    88return array(
    99    'MENFGF\\Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    10     'MENFGF\\GravityOps\\Core\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/Admin/AdminShell.php',
    11     'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/Admin/ReviewPrompter.php',
    12     'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader' => $vendorDir . '/gravityops/core/src/Admin/SettingsHeader.php',
    13     'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php',
    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',
    16     'MENFGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php',
     10    'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => $vendorDir . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     11    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     12    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     13    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     14    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     15    'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     16    'MENFGF\\GravityOps\\Core\\SuiteCore\\Config' => $vendorDir . '/gravityops/core/src/SuiteCore/Config.php',
     17    'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     18    'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    1719    'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php',
    1820    'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php',
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_real.php

    r3444395 r3464354  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit576698bb6db496a6b33a55636c894704
     5class ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit576698bb6db496a6b33a55636c894704', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit704fe92fa45ad4083a7bc7b91cb59fae', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit576698bb6db496a6b33a55636c894704::getInitializer($loader));
     32        call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
    3535        $loader->register(true);
    3636
    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 
    4937        return $loader;
    5038    }
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_static.php

    r3444395 r3464354  
    55namespace MENFGF\Composer\Autoload;
    66
    7 class ComposerStaticInit576698bb6db496a6b33a55636c894704
     7class ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae
    88{
    9     public static $files = array (
    10         '6450a9b713c361c66ed3f0575f164e85' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php',
    11     );
    12 
    139    public static $prefixLengthsPsr4 = array (
    1410        'M' =>
     
    3228    public static $classMap = array (
    3329        'MENFGF\\Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
    34         'MENFGF\\GravityOps\\Core\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/Admin/AdminShell.php',
    35         'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/ReviewPrompter.php',
    36         'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SettingsHeader.php',
    37         'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php',
    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',
    40         'MENFGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php',
     30        'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     31        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     32        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     33        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     34        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     35        'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     36        'MENFGF\\GravityOps\\Core\\SuiteCore\\Config' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Config.php',
     37        'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     38        'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    4139        'MENFGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php',
    4240        'MENFGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php',
     
    6361    {
    6462        return \Closure::bind(function () use ($loader) {
    65             $loader->prefixLengthsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixLengthsPsr4;
    66             $loader->prefixDirsPsr4 = ComposerStaticInit576698bb6db496a6b33a55636c894704::$prefixDirsPsr4;
    67             $loader->classMap = ComposerStaticInit576698bb6db496a6b33a55636c894704::$classMap;
     63            $loader->prefixLengthsPsr4 = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$prefixLengthsPsr4;
     64            $loader->prefixDirsPsr4 = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$prefixDirsPsr4;
     65            $loader->classMap = ComposerStaticInit704fe92fa45ad4083a7bc7b91cb59fae::$classMap;
    6866
    6967        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.json

    r3444395 r3464354  
    33        "1": {
    44            "name": "gravityops/core",
    5             "version": "1.1.0",
    6             "version_normalized": "1.1.0.0",
     5            "version": "2.0.1",
     6            "version_normalized": "2.0.1.0",
    77            "source": {
    88                "type": "git",
    9                 "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    10                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
     9                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
     10                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
    1111            },
    1212            "dist": {
    1313                "type": "zip",
    14                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    15                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     14                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     15                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    1616                "shasum": ""
    1717            },
     
    2020                "trustedlogin/client": "^v1.9"
    2121            },
    22             "time": "2026-01-21T19:42:14+00:00",
     22            "time": "2026-02-18T09:47:24+00:00",
    2323            "type": "library",
    2424            "installation-source": "source",
     
    2626                "psr-4": {
    2727                    "MENFGF\\GravityOps\\Core\\": "src/"
    28                 },
    29                 "files": [
    30                     "src/Admin/functions.php"
    31                 ]
     28                }
    3229            },
    3330            "license": [
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.php

    r3444395 r3464354  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     7    'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    1717    'gravityops/core' =>
    1818    array (
    19       'pretty_version' => '1.1.0',
    20       'version' => '1.1.0.0',
    21       'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     19      'pretty_version' => '2.0.1',
     20      'version' => '2.0.1.0',
     21      'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    2222      'type' => 'library',
    2323      'install_path' => __DIR__ . '/../gravityops/core',
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/assets/css/admin.css

    r3444395 r3464354  
    3131.gops-tab{padding:6px 14px;border-radius:999px;background:transparent;border:0;text-decoration:none;color:var(--gops-color-muted);font-weight: 500;}
    3232.gops-tab.is-active{background: var(--gops-color-primary);color:#fff}
     33.gops-tab__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 6px;border-radius:999px;background:#5F6EEA;color:#fff;font-size:11px;font-weight:700;line-height:1;margin-left:6px;border:0}
     34
     35/* Toolbar */
     36.gops-actions{display:flex;justify-content:flex-end;margin:6px 0 14px}
    3337
    3438/* Content / cards */
     
    7680.gops-link{color:#5F6EEA;text-decoration:none} /* Accent Product Blue */
    7781.gops-link:hover{text-decoration:underline; color: #4A57C6;}
     82button.gops-link{background:none;border:0;padding:0;font:inherit;line-height:1.3;cursor:pointer}
     83
     84/* Loading state */
     85.gops-action-button.is-loading{opacity:.7;pointer-events:none}
     86.gops-spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;margin-left:6px;vertical-align:-2px;animation:gops-spin .7s linear infinite}
     87@keyframes gops-spin{to{transform:rotate(360deg)}}
     88
     89/* Modal */
     90.gops-modal{position:fixed;inset:0;display:none;align-items:center;justify-content:center;z-index:100000}
     91.gops-modal.is-open{display:flex}
     92.gops-modal__backdrop{position:absolute;inset:0;background:rgba(26,20,41,.6)}
     93.gops-modal__dialog{position:relative;z-index:1;background:#fff;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.25);width:min(720px,92vw);max-height:80vh;display:flex;flex-direction:column;padding:12px 16px}
     94.gops-modal__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
     95.gops-modal__title{margin:0;font-size:18px;color:var(--gops-color-text)}
     96.gops-modal__close{background:none;border:0;font-size:26px;line-height:1;cursor:pointer;color:var(--gops-color-muted);transition:color .15s ease}
     97.gops-modal__close:hover{color:var(--gops-color-primary)}
     98.gops-modal__body{overflow:auto;padding:0 4px}
     99.gops-modal__content{margin:0;color:var(--gops-color-text);font-size:13px;line-height:1.4}
     100.gops-modal__content h3,
     101.gops-modal__content h4 {
     102    margin: 1em 0 0.3em;
     103    font-size: 15px;
     104    color: var(--gops-color-primary);
     105    font-weight: 600;
     106}
     107.gops-modal__content h3:first-child,
     108.gops-modal__content h4:first-child {
     109    margin-top: 0;
     110}
     111.gops-modal__content ul {
     112    margin: 0 0 0.8em 0;
     113    padding: 0 0 0 1.4em;
     114    list-style-type: disc !important;
     115}
     116.gops-modal__content li {
     117    margin-bottom: 0.3em;
     118    display: list-item !important;
     119}
     120.gops-modal__content p {
     121    margin: 0 0 0.6em;
     122}
     123.gops-modal__footer{margin-top:8px;display:flex;justify-content:flex-end;border-top:1px solid var(--gops-color-border);padding-top:10px}
    78124
    79125/* Brand primary button styling within our admin */
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/assets/js/admin.js

    r3444395 r3464354  
    55    function qsa(s, c) {
    66        return Array.prototype.slice.call((c || document).querySelectorAll(s));
     7    }
     8    function getAdminConfig() {
     9        const root = qs('.gops-admin');
     10        const fallback = {};
     11        if (root) {
     12            fallback.nonce = root.getAttribute('data-gops-nonce') || '';
     13            fallback.ajaxUrl = root.getAttribute('data-gops-ajax') || '';
     14        }
     15        return Object.assign({}, fallback, window.gopsAdmin || {});
     16    }
     17
     18    function showNotice(type, message) {
     19        const wrap = qs('.gops-admin') || document;
     20        const header = qs('.gops-header', wrap) || qs('.gops-header');
     21        const box = ensureNoticesContainer(
     22            wrap,
     23            header || wrap.firstElementChild
     24        );
     25        if (!box) {
     26            return;
     27        }
     28        const notice = document.createElement('div');
     29        notice.className = 'notice notice-' + type + ' is-dismissible';
     30        const p = document.createElement('p');
     31        p.textContent = message;
     32        notice.appendChild(p);
     33        const btn = document.createElement('button');
     34        btn.type = 'button';
     35        btn.className = 'notice-dismiss';
     36        btn.innerHTML =
     37            '<span class="screen-reader-text">Dismiss this notice.</span>';
     38        btn.addEventListener('click', function () {
     39            notice.remove();
     40        });
     41        notice.appendChild(btn);
     42        box.appendChild(notice);
     43    }
     44
     45    function setButtonLoading(btn, isLoading) {
     46        if (!btn) {
     47            return;
     48        }
     49        if (isLoading) {
     50            if (!btn.dataset.gopsOriginalText) {
     51                btn.dataset.gopsOriginalText = btn.textContent.trim();
     52            }
     53            btn.classList.add('is-loading');
     54            btn.disabled = true;
     55            if (!qs('.gops-spinner', btn)) {
     56                const spinner = document.createElement('span');
     57                spinner.className = 'gops-spinner';
     58                btn.appendChild(spinner);
     59            }
     60        } else {
     61            btn.classList.remove('is-loading');
     62            btn.disabled = false;
     63            const spinner = qs('.gops-spinner', btn);
     64            if (spinner) {
     65                spinner.remove();
     66            }
     67        }
     68    }
     69
     70    function ajaxRequest(action, data) {
     71        const cfg = getAdminConfig();
     72        const url = cfg.ajaxUrl || window.ajaxurl || '';
     73        const payload = Object.assign(
     74            {
     75                action,
     76                nonce: cfg.nonce || '',
     77            },
     78            data || {}
     79        );
     80        return jQuery.post(url, payload);
     81    }
     82
     83    function replaceTileHtml(slug, html) {
     84        if (!slug || !html) {
     85            return;
     86        }
     87        const tile = qs('.gops-tile[data-gops-tile="' + slug + '"]');
     88        if (tile) {
     89            tile.outerHTML = html;
     90        }
     91    }
     92
     93    function updateUpdatesCount(count, updatableCount) {
     94        const tabs = qs('.gops-tabs');
     95        if (tabs) {
     96            let updatesTab = qs('[data-gops-tab="updates"]', tabs);
     97            if (count > 0) {
     98                if (!updatesTab) {
     99                    const cfg = getAdminConfig();
     100                    const href = cfg.updatesUrl || '';
     101                    if (href) {
     102                        updatesTab = document.createElement('a');
     103                        updatesTab.className = 'gops-tab';
     104                        updatesTab.setAttribute('data-gops-tab', 'updates');
     105                        updatesTab.href = href;
     106                        updatesTab.textContent = 'Updates';
     107                        if (
     108                            new URLSearchParams(window.location.search).get(
     109                                'gops_filter'
     110                            ) === 'updates'
     111                        ) {
     112                            updatesTab.classList.add('is-active');
     113                        }
     114                        const badge = document.createElement('span');
     115                        badge.className = 'gops-tab__badge';
     116                        badge.setAttribute('data-gops-updates-count', count);
     117                        badge.textContent = String(count);
     118                        updatesTab.appendChild(badge);
     119                        const allTab = qs('[data-gops-tab="all"]', tabs);
     120                        if (allTab && allTab.nextSibling) {
     121                            tabs.insertBefore(updatesTab, allTab.nextSibling);
     122                        } else {
     123                            tabs.appendChild(updatesTab);
     124                        }
     125                    }
     126                } else {
     127                    let badge = qs('.gops-tab__badge', updatesTab);
     128                    if (!badge) {
     129                        badge = document.createElement('span');
     130                        badge.className = 'gops-tab__badge';
     131                        updatesTab.appendChild(badge);
     132                    }
     133                    badge.setAttribute('data-gops-updates-count', count);
     134                    badge.textContent = String(count);
     135                }
     136            } else if (updatesTab) {
     137                updatesTab.remove();
     138            }
     139        }
     140
     141        const actionsWrap = qs('.gops-actions');
     142        if (actionsWrap) {
     143            const updateAllBtn = qs('.gops-update-all', actionsWrap);
     144            const effectiveUpdatableCount =
     145                typeof updatableCount !== 'undefined' ? updatableCount : count;
     146            if (effectiveUpdatableCount > 0) {
     147                actionsWrap.style.display = '';
     148                if (updateAllBtn) {
     149                    updateAllBtn.textContent =
     150                        'Update All (' + effectiveUpdatableCount + ')';
     151                }
     152            } else {
     153                actionsWrap.style.display = 'none';
     154            }
     155        }
     156
     157        // Update WordPress sidebar menu badge
     158        const menuBadge = document.querySelector(
     159            '#toplevel_page_gravity_ops .update-plugins'
     160        );
     161        if (menuBadge) {
     162            if (count > 0) {
     163                menuBadge.className = 'update-plugins count-' + count;
     164                const inner = menuBadge.querySelector('.plugin-count');
     165                if (inner) {
     166                    inner.textContent = String(count);
     167                }
     168            } else {
     169                menuBadge.remove();
     170            }
     171        }
     172    }
     173
     174    function openChangelogModal(data) {
     175        const modal = qs('#gops-changelog-modal');
     176        if (!modal) {
     177            return;
     178        }
     179        const title = qs('.gops-modal__title', modal);
     180        const content = qs('.gops-modal__content', modal);
     181        const link = qs('.gops-modal__full-link', modal);
     182        if (title) {
     183            title.textContent = data.title || 'Changelog';
     184        }
     185        if (content) {
     186            content.innerHTML = data.changelog || 'Changelog not available.';
     187        }
     188        if (link) {
     189            if (data.full_url) {
     190                link.href = data.full_url;
     191                link.style.display = '';
     192            } else {
     193                link.style.display = 'none';
     194            }
     195        }
     196        modal.style.display = '';
     197        modal.classList.add('is-open');
     198        modal.setAttribute('aria-hidden', 'false');
     199    }
     200
     201    function closeChangelogModal() {
     202        const modal = qs('#gops-changelog-modal');
     203        if (!modal) {
     204            return;
     205        }
     206        modal.classList.remove('is-open');
     207        modal.style.display = 'none';
     208        modal.setAttribute('aria-hidden', 'true');
    7209    }
    8210
     
    156358        if (link && link.href) {
    157359            window.location.href = link.href;
     360        }
     361    });
     362
     363    // Action buttons (update/activate/deactivate/changelog)
     364    document.addEventListener('click', function (e) {
     365        const btn = e.target.closest('button[data-gops-action]');
     366        if (!btn) {
     367            return;
     368        }
     369
     370        const action = btn.getAttribute('data-gops-action') || '';
     371        if (!action) {
     372            return;
     373        }
     374
     375        e.preventDefault();
     376        e.stopPropagation();
     377
     378        const slug = btn.getAttribute('data-gops-slug') || '';
     379        const pluginFile = btn.getAttribute('data-gops-plugin-file') || '';
     380
     381        if (action === 'changelog') {
     382            if (!slug) {
     383                showNotice('error', 'Missing plugin data.');
     384                return;
     385            }
     386            setButtonLoading(btn, true);
     387            ajaxRequest('gops_get_changelog', {
     388                slug,
     389                plugin: pluginFile,
     390            })
     391                .done(function (resp) {
     392                    if (resp && resp.success) {
     393                        openChangelogModal(resp.data || {});
     394                    } else {
     395                        const msg =
     396                            (resp && resp.data && resp.data.message) ||
     397                            'Unable to load changelog.';
     398                        showNotice('error', msg);
     399                    }
     400                })
     401                .fail(function () {
     402                    showNotice('error', 'Unable to load changelog.');
     403                })
     404                .always(function () {
     405                    setButtonLoading(btn, false);
     406                });
     407            return;
     408        }
     409
     410        if (btn.classList.contains('is-loading')) {
     411            return;
     412        }
     413
     414        let request = null;
     415        if (action === 'update') {
     416            request = ajaxRequest('gops_update_plugin', {
     417                slug,
     418                plugin: pluginFile,
     419            });
     420        } else if (action === 'update-all') {
     421            request = ajaxRequest('gops_update_all', {});
     422        } else if (action === 'activate' || action === 'deactivate') {
     423            request = ajaxRequest('gops_toggle_plugin', {
     424                slug,
     425                plugin: pluginFile,
     426                toggle: action,
     427            });
     428        }
     429
     430        if (!request) {
     431            return;
     432        }
     433
     434        setButtonLoading(btn, true);
     435
     436        request
     437            .done(function (resp) {
     438                if (resp && resp.success) {
     439                    const data = resp.data || {};
     440                    if (data.tile_html && data.slug) {
     441                        replaceTileHtml(data.slug, data.tile_html);
     442                    }
     443                    if (data.tiles) {
     444                        Object.keys(data.tiles).forEach(function (tileSlug) {
     445                            replaceTileHtml(tileSlug, data.tiles[tileSlug]);
     446                        });
     447                    }
     448                    if (typeof data.updates_count === 'number') {
     449                        updateUpdatesCount(
     450                            data.updates_count,
     451                            data.updatable_count
     452                        );
     453                    }
     454                    if (data.message) {
     455                        showNotice(
     456                            data.errors && data.errors.length
     457                                ? 'warning'
     458                                : 'success',
     459                            data.message
     460                        );
     461                    }
     462
     463                    // Refresh all updates after a successful action to maintain consistency.
     464                    if (
     465                        action === 'update' ||
     466                        action === 'update-all' ||
     467                        action === 'activate' ||
     468                        action === 'deactivate'
     469                    ) {
     470                        triggerBackgroundRefresh();
     471                    }
     472                    if (data.errors && data.errors.length) {
     473                        data.errors.forEach(function (err) {
     474                            showNotice('error', err);
     475                        });
     476                    }
     477                } else {
     478                    const msg =
     479                        (resp && resp.data && resp.data.message) ||
     480                        'Action failed.';
     481                    showNotice('error', msg);
     482                }
     483            })
     484            .fail(function (resp) {
     485                let msg = 'Action failed.';
     486                if (resp && resp.responseJSON && resp.responseJSON.data) {
     487                    msg = resp.responseJSON.data.message || msg;
     488                } else if (resp && resp.responseText) {
     489                    msg =
     490                        resp.responseText.trim() === '-1'
     491                            ? 'Security check failed. Refresh and try again.'
     492                            : resp.responseText;
     493                }
     494                showNotice('error', msg);
     495            })
     496            .always(function () {
     497                setButtonLoading(btn, false);
     498            });
     499    });
     500
     501    // Modal close actions
     502    document.addEventListener('click', function (e) {
     503        if (e.target.closest('[data-gops-modal-close]')) {
     504            e.preventDefault();
     505            closeChangelogModal();
     506        }
     507    });
     508    document.addEventListener('keydown', function (e) {
     509        if (e.key === 'Escape') {
     510            closeChangelogModal();
    158511        }
    159512    });
     
    306659            moveNotices();
    307660            applyFreePluginExternalTabTargets();
     661            triggerBackgroundRefresh();
    308662        });
    309663    } else {
     
    311665        moveNotices();
    312666        applyFreePluginExternalTabTargets();
     667        triggerBackgroundRefresh();
     668    }
     669
     670    function triggerBackgroundRefresh() {
     671        const root = qs('.gops-admin');
     672        if (root && root.dataset.gopsRefresh === '1') {
     673            const loader = qs('.gops-header-loader', root);
     674            if (loader) {
     675                loader.style.display = 'block';
     676            }
     677            const tiles = qsa('.gops-tile');
     678            const items = tiles.map(function (tile) {
     679                const slug = tile.dataset.gopsTile;
     680                const versionEl = qs('.gops-tile__version', tile);
     681                const version = versionEl
     682                    ? versionEl.textContent.replace('v', '').trim()
     683                    : '0';
     684                return { slug, version };
     685            });
     686
     687            ajaxRequest('gops_check_suite_updates', {
     688                items: JSON.stringify(items),
     689            })
     690                .done(function (resp) {
     691                    if (resp && resp.success && resp.data) {
     692                        const data = resp.data;
     693                        if (data.tiles) {
     694                            Object.keys(data.tiles).forEach(function (slug) {
     695                                replaceTileHtml(slug, data.tiles[slug]);
     696                            });
     697                        }
     698                        if (typeof data.updates_count === 'number') {
     699                            updateUpdatesCount(
     700                                data.updates_count,
     701                                data.updatable_count
     702                            );
     703                        }
     704                    }
     705                })
     706                .always(function () {
     707                    if (loader) {
     708                        loader.style.display = 'none';
     709                    }
     710                });
     711        }
    313712    }
    314713    function applyFreePluginExternalTabTargets() {
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/composer.json

    r3444395 r3464354  
    1111    "psr-4": {
    1212      "GravityOps\\Core\\": "src/"
    13     },
    14     "files": [
    15       "src/Admin/functions.php"
    16     ]
     13    }
    1714  }
    1815}
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/trustedlogin/client/src/Config.php

    r3444395 r3464354  
    179179            ),
    180180            true
    181         ) && ! defined( 'TL_DOING_TESTS' ) ) {
     181        ) && ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    182182            throw new Exception( 'Developer: make sure to change the namespace for the TrustedLogin class. See https://trustedlogin.com/configuration/ for more information.', 501 );
    183183        }
     
    190190
    191191        if ( isset( $this->settings['vendor']['website'] ) ) {
    192             if ( 'https://www.example.com' === $this->settings['vendor']['website'] && ! defined( 'TL_DOING_TESTS' ) ) {
     192            if ( 'https://www.example.com' === $this->settings['vendor']['website'] && ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    193193                $errors[] = new WP_Error( 'missing_configuration', 'You need to configure the "website" URL to point to the URL where the Vendor plugin is installed.' );
    194194            }
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/trustedlogin/client/src/Utils.php

    r3444395 r3464354  
    196196        $ip = sanitize_text_field( $ip );
    197197
    198         if ( ! defined( 'TL_DOING_TESTS' ) ) {
     198        if ( ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
    199199            $ip = filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE );
    200200        }
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/trustedlogin/client/tests/bootstrap.php

    r3444395 r3464354  
    1111require_once dirname( __DIR__ ) . '/vendor/autoload.php';
    1212
    13 if ( ! defined( 'TL_DOING_TESTS' ) ) {
    14     define( 'TL_DOING_TESTS', true );
     13if ( ! defined( 'MENFGF_TL_DOING_TESTS' ) ) {
     14    define( 'MENFGF_TL_DOING_TESTS', true );
    1515}
    1616
  • mass-email-notifications-for-gravity-forms/trunk/vendor/autoload.php

    r3444395 r3464354  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5::getLoader();
     22return ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c::getLoader();
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_aliases.php

    r3444395 r3464354  
    55namespace {
    66
    7 }
    8 namespace GravityOps\Core\Admin {
    9     if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){
    10         function gravityops_shell(...$args) {
    11             return \MENFGF\GravityOps\Core\Admin\gravityops_shell(...func_get_args());
    12         }
    13     }
    147}
    158namespace TrustedLogin {
     
    4235         */
    4336        private array $autoloadAliases = array (
    44   'GravityOps\\Core\\Admin\\AdminShell' =>
     37  'GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' =>
    4538  array (
    4639    'type' => 'class',
    4740    'classname' => 'AdminShell',
    4841    'isabstract' => false,
    49     'namespace' => 'GravityOps\\Core\\Admin',
    50     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\AdminShell',
    51     'implements' =>
    52     array (
    53     ),
    54   ),
    55   'GravityOps\\Core\\Admin\\ReviewPrompter' =>
     42    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     43    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell',
     44    'implements' =>
     45    array (
     46    ),
     47  ),
     48  'GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' =>
    5649  array (
    5750    'type' => 'class',
    5851    'classname' => 'ReviewPrompter',
    5952    'isabstract' => false,
    60     'namespace' => 'GravityOps\\Core\\Admin',
    61     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\ReviewPrompter',
    62     'implements' =>
    63     array (
    64     ),
    65   ),
    66   'GravityOps\\Core\\Admin\\SettingsHeader' =>
    67   array (
    68     'type' => 'class',
    69     'classname' => 'SettingsHeader',
    70     'isabstract' => false,
    71     'namespace' => 'GravityOps\\Core\\Admin',
    72     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SettingsHeader',
    73     'implements' =>
    74     array (
    75     ),
    76   ),
    77   'GravityOps\\Core\\Admin\\SuiteMenu' =>
     53    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     54    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter',
     55    'implements' =>
     56    array (
     57    ),
     58  ),
     59  'GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' =>
    7860  array (
    7961    'type' => 'class',
    8062    'classname' => 'SuiteMenu',
    8163    'isabstract' => false,
    82     'namespace' => 'GravityOps\\Core\\Admin',
    83     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SuiteMenu',
    84     'implements' =>
    85     array (
    86     ),
    87   ),
    88   'GravityOps\\Core\\Admin\\SurveyPrompter' =>
     64    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     65    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu',
     66    'implements' =>
     67    array (
     68    ),
     69  ),
     70  'GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' =>
    8971  array (
    9072    'type' => 'class',
    9173    'classname' => 'SurveyPrompter',
    9274    'isabstract' => false,
    93     'namespace' => 'GravityOps\\Core\\Admin',
    94     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\SurveyPrompter',
    95     'implements' =>
    96     array (
    97     ),
    98   ),
    99   'GravityOps\\Core\\Admin\\TrustedLogin' =>
     75    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     76    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter',
     77    'implements' =>
     78    array (
     79    ),
     80  ),
     81  'GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' =>
    10082  array (
    10183    'type' => 'class',
    10284    'classname' => 'TrustedLogin',
    10385    'isabstract' => false,
    104     'namespace' => 'GravityOps\\Core\\Admin',
    105     'extends' => 'MENFGF\\GravityOps\\Core\\Admin\\TrustedLogin',
    106     'implements' =>
    107     array (
    108     ),
    109   ),
    110   'GravityOps\\Core\\SuiteRegistry' =>
    111   array (
    112     'type' => 'class',
    113     'classname' => 'SuiteRegistry',
    114     'isabstract' => false,
    115     'namespace' => 'GravityOps\\Core',
    116     'extends' => 'MENFGF\\GravityOps\\Core\\SuiteRegistry',
     86    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     87    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin',
     88    'implements' =>
     89    array (
     90    ),
     91  ),
     92  'GravityOps\\Core\\SuiteCore\\AdminAssetHelper' =>
     93  array (
     94    'type' => 'class',
     95    'classname' => 'AdminAssetHelper',
     96    'isabstract' => false,
     97    'namespace' => 'GravityOps\\Core\\SuiteCore',
     98    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper',
     99    'implements' =>
     100    array (
     101    ),
     102  ),
     103  'GravityOps\\Core\\SuiteCore\\Config' =>
     104  array (
     105    'type' => 'class',
     106    'classname' => 'Config',
     107    'isabstract' => false,
     108    'namespace' => 'GravityOps\\Core\\SuiteCore',
     109    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\Config',
     110    'implements' =>
     111    array (
     112    ),
     113  ),
     114  'GravityOps\\Core\\SuiteCore\\SuiteCatalog' =>
     115  array (
     116    'type' => 'class',
     117    'classname' => 'SuiteCatalog',
     118    'isabstract' => false,
     119    'namespace' => 'GravityOps\\Core\\SuiteCore',
     120    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog',
     121    'implements' =>
     122    array (
     123    ),
     124  ),
     125  'GravityOps\\Core\\SuiteCore\\SuiteCore' =>
     126  array (
     127    'type' => 'class',
     128    'classname' => 'SuiteCore',
     129    'isabstract' => false,
     130    'namespace' => 'GravityOps\\Core\\SuiteCore',
     131    'extends' => 'MENFGF\\GravityOps\\Core\\SuiteCore\\SuiteCore',
    117132    'implements' =>
    118133    array (
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_real.php

    r3444395 r3464354  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5
     5class ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit0e8b87e452507fa901dfbb37bbc8b6c5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit626128d55c6cc7cb1833b26b491c1d8c', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::$files;
    3737        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3838            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_static.php

    r3444395 r3464354  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5
     7class ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c
    88{
    99    public static $files = array (
     
    1818    {
    1919        return \Closure::bind(function () use ($loader) {
    20             $loader->classMap = ComposerStaticInit0e8b87e452507fa901dfbb37bbc8b6c5::$classMap;
     20            $loader->classMap = ComposerStaticInit626128d55c6cc7cb1833b26b491c1d8c::$classMap;
    2121
    2222        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.json

    r3444395 r3464354  
    5959        {
    6060            "name": "gravityops/core",
    61             "version": "1.1.0",
    62             "version_normalized": "1.1.0.0",
     61            "version": "2.0.1",
     62            "version_normalized": "2.0.1.0",
    6363            "source": {
    6464                "type": "git",
    65                 "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    66                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
     65                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
     66                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
    6767            },
    6868            "dist": {
    6969                "type": "zip",
    70                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    71                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     70                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     71                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    7272                "shasum": ""
    7373            },
     
    7676                "trustedlogin/client": "^v1.9"
    7777            },
    78             "time": "2026-01-21T19:42:14+00:00",
     78            "time": "2026-02-18T09:47:24+00:00",
    7979            "type": "library",
    8080            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.php

    r3444395 r3464354  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     6        'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    2121        ),
    2222        'gravityops/core' => array(
    23             'pretty_version' => '1.1.0',
    24             'version' => '1.1.0.0',
    25             'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     23            'pretty_version' => '2.0.1',
     24            'version' => '2.0.1.0',
     25            'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    2626            'type' => 'library',
    2727            'install_path' => __DIR__ . '/../gravityops/core',
     
    3232            'pretty_version' => 'dev-main',
    3333            'version' => 'dev-main',
    34             'reference' => '844dcc46ed2d370fadaccebd03c6dae5521ea1ba',
     34            'reference' => '41c23576439dc96ef24477141cc57019f41fce29',
    3535            'type' => 'library',
    3636            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.