Plugin Directory

Changeset 3420209


Ignore:
Timestamp:
12/15/2025 02:00:15 PM (3 months ago)
Author:
eitanatbrightleaf
Message:

Update to version 1.3.4 from GitHub

Location:
mass-email-notifications-for-gravity-forms
Files:
2 deleted
30 edited
1 copied

Legend:

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

    r3420036 r3420209  
    314314            ];
    315315        }
    316         AdminShell::render_feeds_list( $feeds_and_forms, $this->_slug );
     316        AdminShell::render_feeds_list(
     317            $feeds_and_forms,
     318            $this->_slug,
     319            $this->_short_title,
     320            'menfgf_toggle_feed'
     321        );
    317322    }
    318323
     
    397402     */
    398403    public function handle_toggle_feed() {
    399         if ( empty( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) || 'POST' !== (wp_unslash( $_SERVER['REQUEST_METHOD'] ) ?? '') ) {
    400             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    401             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    402             exit;
    403         }
    404         $fid = ( isset( $_POST['fid'] ) ? (int) wp_unslash( $_POST['fid'] ) : 0 );
    405         // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
    406         if ( !$fid || !isset( $_POST['_wpnonce'] ) || !wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ), 'menfgf_toggle_feed_' . $fid ) ) {
    407             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    408             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    409             exit;
    410         }
    411         // Cap: mirror Asana implementation, require manage options on plugin pages that inherit parent cap.
    412         if ( !current_user_can( SuiteMenu::get_parent_capability() ) ) {
    413             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    414             exit;
    415         }
    416         global $wpdb;
    417         $table = $wpdb->prefix . 'gf_addon_feed';
    418         // Fetch current state and flip it.
    419         // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
    420         $row = $wpdb->get_row( $wpdb->prepare( "SELECT is_active FROM {$table} WHERE id = %d", $fid ) );
    421         if ( $row ) {
    422             $new = ( (int) $row->is_active ? 0 : 1 );
    423             $wpdb->query( $wpdb->prepare( "UPDATE {$table} SET is_active = %d WHERE id = %d", $new, $fid ) );
    424         }
    425         // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
    426         wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    427         exit;
     404        AdminShell::process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    428405    }
    429406
     
    11081085                'query' => 'subview=' . $this->_slug . '&page=gf_edit_forms&id=_notempty_&view=settings',
    11091086            ]]
    1110         ), $this->asset_helper->build_script(
    1111             self::PREFIX . 'plugin_page',
    1112             'includes/js/plugin_page.js',
    1113             ['jquery'],
    1114             [
    1115                 [
    1116                     'query' => 'page=' . $this->_slug,
    1117                 ],
    1118                 [
    1119                     'query' => 'page=' . $this->_slug . '-contact',
    1120                 ],
    1121                 [
    1122                     'query' => 'page=' . $this->_slug . '-account',
    1123                 ],
    1124                 [
    1125                     'query' => 'page=' . $this->_slug . '-affiliation',
    1126                 ]
    1127             ]
    11281087        )];
    11291088        return array_merge( parent::scripts(), $scripts );
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/mass-email-notifications-for-gf.php

    r3420036 r3420209  
    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.3
     8 * Version: 1.3.4
    99 * Author: BrightLeaf Digital
    1010 * License: GPL-2.0+
     
    6666    }
    6767    menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' );
    68     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.3' );
     68    define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.4' );
    6969    define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    7070    add_action( 'admin_notices', function () {
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/readme.txt

    r3420036 r3420209  
    22Tested up to: 6.9
    33Tags: GravityForms, notifications, email, task management, automation
    4 Stable tag: 1.3.3
     4Stable tag: 1.3.4
    55Requires PHP: 8.0
    66License: GPLv2 or later
     
    4444== Changelog ==
    4545
     46= 1.3.4 | Dec 15, 2025 =
     47* Fixed a bug with the Feed tab in the new admin menu.
     48
    4649= 1.3.3 | Dec 15, 2025 =
    4750* We've upgraded the plugin's core components for smoother compatibility and a more reliable experience overall.
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/autoload.php

    r3420036 r3420209  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9::getLoader();
     22return ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5::getLoader();
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/composer/autoload_real.php

    r3420036 r3420209  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9
     5class ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::getInitializer($loader));
     32        call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/composer/autoload_static.php

    r3420036 r3420209  
    55namespace MENFGF\Composer\Autoload;
    66
    7 class ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9
     7class ComposerStaticInit04628f6c17a7085581c99909dd6d14c5
    88{
    99    public static $prefixLengthsPsr4 = array (
     
    3636    {
    3737        return \Closure::bind(function () use ($loader) {
    38             $loader->prefixLengthsPsr4 = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$prefixLengthsPsr4;
    39             $loader->prefixDirsPsr4 = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$prefixDirsPsr4;
    40             $loader->classMap = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$classMap;
     38            $loader->prefixLengthsPsr4 = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$prefixLengthsPsr4;
     39            $loader->prefixDirsPsr4 = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$prefixDirsPsr4;
     40            $loader->classMap = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$classMap;
    4141
    4242        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/composer/installed.json

    r3420036 r3420209  
    33        "1": {
    44            "name": "gravityops/core",
    5             "version": "1.0.5",
    6             "version_normalized": "1.0.5.0",
     5            "version": "1.0.9",
     6            "version_normalized": "1.0.9.0",
    77            "source": {
    88                "type": "git",
    99                "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    10                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b"
     10                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f"
    1111            },
    1212            "dist": {
    1313                "type": "zip",
    14                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/2f8688fbd4eddd60722a1922ba7fd3107977c44b",
    15                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b",
     14                "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
     15                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
    1616                "shasum": ""
    1717            },
     
    1919                "php": ">=7.4"
    2020            },
    21             "time": "2025-12-15T10:45:03+00:00",
     21            "time": "2025-12-15T13:51:53+00:00",
    2222            "type": "library",
    2323            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/composer/installed.php

    r3420036 r3420209  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     7    'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    1717    'gravityops/core' =>
    1818    array (
    19       'pretty_version' => '1.0.5',
    20       'version' => '1.0.5.0',
    21       'reference' => '2f8688fbd4eddd60722a1922ba7fd3107977c44b',
     19      'pretty_version' => '1.0.9',
     20      'version' => '1.0.9.0',
     21      'reference' => '6f458bbfffcfa7fb9feff0858b42cb2b6626904f',
    2222      'type' => 'library',
    2323      'install_path' => __DIR__ . '/../gravityops/core',
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php

    r3420036 r3420209  
    157157     * - A right-aligned Activate/Deactivate button that posts to admin-post.php with provided action.
    158158     *
    159      * @param array  $feeds_and_forms  Array as returned by GF Add-On Framework's get_feeds().
     159     * @param array  $feeds_and_forms  Array of [ 'feed' => array, 'form' => array ] rows.
    160160     * @param string $gf_subview_slug  The subview slug used by the add-on in GF settings (usually $this->_slug).
     161     * @param string $plugin_short_title Short plugin title used for the header, e.g., "Asana Integration".
     162     * @param string $toggle_action     The admin_post action to handle toggle, used for form action and nonce prefix.
    161163     *
    162164     * @return void
    163165     */
    164     public static function render_feeds_list( array $feeds_and_forms, string $gf_subview_slug ): void {
     166    public static function render_feeds_list( array $feeds_and_forms, string $gf_subview_slug, string $plugin_short_title, string $toggle_action ): void {
    165167        echo '<div class="gops-card">';
    166         echo '<h2 class="gops-title" style="margin:0 0 10px;">Asana Feeds</h2>';
     168        echo '<h2 class="gops-title" style="margin:0 0 10px;">' . esc_html( $plugin_short_title ) . ' Feeds</h2>';
    167169
    168170        if ( empty( $feeds_and_forms ) ) {
     
    200202            // Toggle button
    201203            echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">';
    202             echo '<input type="hidden" name="action" value="iawgf_toggle_feed" />';
     204            echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />';
    203205            echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />';
    204             echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( 'iawgf_toggle_feed_' . $feed_id ) ) . '" />';
     206            echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />';
    205207            $label = $is_active ? 'Deactivate' : 'Activate';
    206208            $cls   = $is_active ? 'button' : 'button button-primary';
     
    211213        echo '</ul>';
    212214        echo '</div>';
     215    }
     216
     217    /**
     218     * Processes the toggling of a feed's active state in the database.
     219     *
     220     * This method verifies the request type, nonce, and user capability before updating the
     221     * feed's active state in the database. If any validation fails, the user is redirected
     222     * back to the given URL.
     223     *
     224     * @param string $url The URL to redirect to in case of validation failure or after successfully toggling the feed.
     225     *
     226     * @return void
     227     */
     228    public static function process_feed_toggle( string $action_prefix, string $return_url ) {
     229        if ( empty( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) || 'POST' !== ( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ?? '' ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
     230            wp_safe_redirect( admin_url( $return_url ) );
     231            exit;
     232        }
     233
     234        $fid   = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
     235        $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_wpnonce'] ) ) : '';
     236        if ( ! $fid || ! wp_verify_nonce( $nonce, $action_prefix . '_' . $fid ) ) {
     237            wp_safe_redirect( admin_url( $return_url ) );
     238            exit;
     239        }
     240
     241        if ( ! current_user_can( SuiteMenu::get_parent_capability() ) ) {
     242            wp_safe_redirect( admin_url( $return_url ) );
     243            exit;
     244        }
     245
     246        global $wpdb;
     247        $table = $wpdb->prefix . 'gf_addon_feed';
     248        // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     249        $row = $wpdb->get_row( $wpdb->prepare( "SELECT is_active FROM $table WHERE id = %d", $fid ) );
     250        if ( $row ) {
     251            $new = ( (int) $row->is_active ) ? 0 : 1;
     252            $wpdb->query( $wpdb->prepare( "UPDATE $table SET is_active = %d WHERE id = %d", $new, $fid ) );
     253        }
     254        // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     255
     256        wp_safe_redirect( admin_url( $return_url ) );
     257        exit;
    213258    }
    214259
     
    302347        $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
    303348
    304         $is_shell_page = isset( $this->pages[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) );
     349        $pages_lower_case = array_change_key_case( $this->pages );
     350        $is_shell_page    = isset( $pages_lower_case[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) );
    305351
    306352        // Optionally style Freemius pages in-place.
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php

    r3420036 r3420209  
    170170        $installed_plugins = get_plugins();
    171171        $updates           = get_site_transient( 'update_plugins' );
    172         $update_response   = ( is_object( $updates ) && isset( $updates->response ) && is_object( $updates->response ) ) ? $updates->response : [];
     172        $update_response   = ( is_object( $updates ) && isset( $updates->response ) && is_array( $updates->response ) ) ? $updates->response : [];
    173173        $updates_count     = 0;
    174174
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/autoload.php

    r3420036 r3420209  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5::getLoader();
     22return ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e::getLoader();
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/composer/autoload_real.php

    r3420036 r3420209  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5
     5class ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInitb077f8ac83a1f968269291160b6313d5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInitb077f8ac83a1f968269291160b6313d5::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::$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.4/vendor/composer/autoload_static.php

    r3420036 r3420209  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInitb077f8ac83a1f968269291160b6313d5
     7class ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e
    88{
    99    public static $files = array (
     
    1919    {
    2020        return \Closure::bind(function () use ($loader) {
    21             $loader->classMap = ComposerStaticInitb077f8ac83a1f968269291160b6313d5::$classMap;
     21            $loader->classMap = ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::$classMap;
    2222
    2323        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/composer/installed.json

    r3420036 r3420209  
    5959        {
    6060            "name": "gravityops/core",
    61             "version": "1.0.5",
    62             "version_normalized": "1.0.5.0",
     61            "version": "1.0.9",
     62            "version_normalized": "1.0.9.0",
    6363            "source": {
    6464                "type": "git",
    6565                "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    66                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b"
     66                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f"
    6767            },
    6868            "dist": {
    6969                "type": "zip",
    70                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/2f8688fbd4eddd60722a1922ba7fd3107977c44b",
    71                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b",
     70                "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
     71                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
    7272                "shasum": ""
    7373            },
     
    7575                "php": ">=7.4"
    7676            },
    77             "time": "2025-12-15T10:45:03+00:00",
     77            "time": "2025-12-15T13:51:53+00:00",
    7878            "type": "library",
    7979            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/tags/1.3.4/vendor/composer/installed.php

    r3420036 r3420209  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     6        'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    1414            'pretty_version' => 'dev-main',
    1515            'version' => 'dev-main',
    16             'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     16            'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../../',
     
    3030        ),
    3131        'gravityops/core' => array(
    32             'pretty_version' => '1.0.5',
    33             'version' => '1.0.5.0',
    34             'reference' => '2f8688fbd4eddd60722a1922ba7fd3107977c44b',
     32            'pretty_version' => '1.0.9',
     33            'version' => '1.0.9.0',
     34            'reference' => '6f458bbfffcfa7fb9feff0858b42cb2b6626904f',
    3535            'type' => 'library',
    3636            'install_path' => __DIR__ . '/../gravityops/core',
  • mass-email-notifications-for-gravity-forms/trunk/class-mass-email-notifications-for-gravity-forms.php

    r3420036 r3420209  
    314314            ];
    315315        }
    316         AdminShell::render_feeds_list( $feeds_and_forms, $this->_slug );
     316        AdminShell::render_feeds_list(
     317            $feeds_and_forms,
     318            $this->_slug,
     319            $this->_short_title,
     320            'menfgf_toggle_feed'
     321        );
    317322    }
    318323
     
    397402     */
    398403    public function handle_toggle_feed() {
    399         if ( empty( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) || 'POST' !== (wp_unslash( $_SERVER['REQUEST_METHOD'] ) ?? '') ) {
    400             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    401             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    402             exit;
    403         }
    404         $fid = ( isset( $_POST['fid'] ) ? (int) wp_unslash( $_POST['fid'] ) : 0 );
    405         // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
    406         if ( !$fid || !isset( $_POST['_wpnonce'] ) || !wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ), 'menfgf_toggle_feed_' . $fid ) ) {
    407             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    408             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    409             exit;
    410         }
    411         // Cap: mirror Asana implementation, require manage options on plugin pages that inherit parent cap.
    412         if ( !current_user_can( SuiteMenu::get_parent_capability() ) ) {
    413             wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    414             exit;
    415         }
    416         global $wpdb;
    417         $table = $wpdb->prefix . 'gf_addon_feed';
    418         // Fetch current state and flip it.
    419         // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
    420         $row = $wpdb->get_row( $wpdb->prepare( "SELECT is_active FROM {$table} WHERE id = %d", $fid ) );
    421         if ( $row ) {
    422             $new = ( (int) $row->is_active ? 0 : 1 );
    423             $wpdb->query( $wpdb->prepare( "UPDATE {$table} SET is_active = %d WHERE id = %d", $new, $fid ) );
    424         }
    425         // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
    426         wp_safe_redirect( admin_url( 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' ) );
    427         exit;
     404        AdminShell::process_feed_toggle( 'menfgf_toggle_feed', 'admin.php?page=mass_email_notifications_for_gf&tab=feeds' );
    428405    }
    429406
     
    11081085                'query' => 'subview=' . $this->_slug . '&page=gf_edit_forms&id=_notempty_&view=settings',
    11091086            ]]
    1110         ), $this->asset_helper->build_script(
    1111             self::PREFIX . 'plugin_page',
    1112             'includes/js/plugin_page.js',
    1113             ['jquery'],
    1114             [
    1115                 [
    1116                     'query' => 'page=' . $this->_slug,
    1117                 ],
    1118                 [
    1119                     'query' => 'page=' . $this->_slug . '-contact',
    1120                 ],
    1121                 [
    1122                     'query' => 'page=' . $this->_slug . '-account',
    1123                 ],
    1124                 [
    1125                     'query' => 'page=' . $this->_slug . '-affiliation',
    1126                 ]
    1127             ]
    11281087        )];
    11291088        return array_merge( parent::scripts(), $scripts );
  • mass-email-notifications-for-gravity-forms/trunk/mass-email-notifications-for-gf.php

    r3420036 r3420209  
    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.3
     8 * Version: 1.3.4
    99 * Author: BrightLeaf Digital
    1010 * License: GPL-2.0+
     
    6666    }
    6767    menfgf_fs()->add_filter( 'enable_cpt_advanced_menu_logic', '__return_true' );
    68     define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.3' );
     68    define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_VERSION', '1.3.4' );
    6969    define( 'MASS_EMAIL_NOTIFICATIONS_FOR_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    7070    add_action( 'admin_notices', function () {
  • mass-email-notifications-for-gravity-forms/trunk/readme.txt

    r3420036 r3420209  
    22Tested up to: 6.9
    33Tags: GravityForms, notifications, email, task management, automation
    4 Stable tag: 1.3.3
     4Stable tag: 1.3.4
    55Requires PHP: 8.0
    66License: GPLv2 or later
     
    4444== Changelog ==
    4545
     46= 1.3.4 | Dec 15, 2025 =
     47* Fixed a bug with the Feed tab in the new admin menu.
     48
    4649= 1.3.3 | Dec 15, 2025 =
    4750* We've upgraded the plugin's core components for smoother compatibility and a more reliable experience overall.
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/autoload.php

    r3420036 r3420209  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9::getLoader();
     22return ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5::getLoader();
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_real.php

    r3420036 r3420209  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9
     5class ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \MENFGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit77e8445d93eb4eb8385aa2ef32ace8b9', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit04628f6c17a7085581c99909dd6d14c5', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::getInitializer($loader));
     32        call_user_func(\MENFGF\Composer\Autoload\ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/autoload_static.php

    r3420036 r3420209  
    55namespace MENFGF\Composer\Autoload;
    66
    7 class ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9
     7class ComposerStaticInit04628f6c17a7085581c99909dd6d14c5
    88{
    99    public static $prefixLengthsPsr4 = array (
     
    3636    {
    3737        return \Closure::bind(function () use ($loader) {
    38             $loader->prefixLengthsPsr4 = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$prefixLengthsPsr4;
    39             $loader->prefixDirsPsr4 = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$prefixDirsPsr4;
    40             $loader->classMap = ComposerStaticInit77e8445d93eb4eb8385aa2ef32ace8b9::$classMap;
     38            $loader->prefixLengthsPsr4 = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$prefixLengthsPsr4;
     39            $loader->prefixDirsPsr4 = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$prefixDirsPsr4;
     40            $loader->classMap = ComposerStaticInit04628f6c17a7085581c99909dd6d14c5::$classMap;
    4141
    4242        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.json

    r3420036 r3420209  
    33        "1": {
    44            "name": "gravityops/core",
    5             "version": "1.0.5",
    6             "version_normalized": "1.0.5.0",
     5            "version": "1.0.9",
     6            "version_normalized": "1.0.9.0",
    77            "source": {
    88                "type": "git",
    99                "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    10                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b"
     10                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f"
    1111            },
    1212            "dist": {
    1313                "type": "zip",
    14                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/2f8688fbd4eddd60722a1922ba7fd3107977c44b",
    15                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b",
     14                "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
     15                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
    1616                "shasum": ""
    1717            },
     
    1919                "php": ">=7.4"
    2020            },
    21             "time": "2025-12-15T10:45:03+00:00",
     21            "time": "2025-12-15T13:51:53+00:00",
    2222            "type": "library",
    2323            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/composer/installed.php

    r3420036 r3420209  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     7    'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    1717    'gravityops/core' =>
    1818    array (
    19       'pretty_version' => '1.0.5',
    20       'version' => '1.0.5.0',
    21       'reference' => '2f8688fbd4eddd60722a1922ba7fd3107977c44b',
     19      'pretty_version' => '1.0.9',
     20      'version' => '1.0.9.0',
     21      'reference' => '6f458bbfffcfa7fb9feff0858b42cb2b6626904f',
    2222      'type' => 'library',
    2323      'install_path' => __DIR__ . '/../gravityops/core',
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/AdminShell.php

    r3420036 r3420209  
    157157     * - A right-aligned Activate/Deactivate button that posts to admin-post.php with provided action.
    158158     *
    159      * @param array  $feeds_and_forms  Array as returned by GF Add-On Framework's get_feeds().
     159     * @param array  $feeds_and_forms  Array of [ 'feed' => array, 'form' => array ] rows.
    160160     * @param string $gf_subview_slug  The subview slug used by the add-on in GF settings (usually $this->_slug).
     161     * @param string $plugin_short_title Short plugin title used for the header, e.g., "Asana Integration".
     162     * @param string $toggle_action     The admin_post action to handle toggle, used for form action and nonce prefix.
    161163     *
    162164     * @return void
    163165     */
    164     public static function render_feeds_list( array $feeds_and_forms, string $gf_subview_slug ): void {
     166    public static function render_feeds_list( array $feeds_and_forms, string $gf_subview_slug, string $plugin_short_title, string $toggle_action ): void {
    165167        echo '<div class="gops-card">';
    166         echo '<h2 class="gops-title" style="margin:0 0 10px;">Asana Feeds</h2>';
     168        echo '<h2 class="gops-title" style="margin:0 0 10px;">' . esc_html( $plugin_short_title ) . ' Feeds</h2>';
    167169
    168170        if ( empty( $feeds_and_forms ) ) {
     
    200202            // Toggle button
    201203            echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" style="display:inline-block; margin-left:8px;">';
    202             echo '<input type="hidden" name="action" value="iawgf_toggle_feed" />';
     204            echo '<input type="hidden" name="action" value="' . esc_attr( $toggle_action ) . '" />';
    203205            echo '<input type="hidden" name="feed_id" value="' . esc_attr( (string) $feed_id ) . '" />';
    204             echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( 'iawgf_toggle_feed_' . $feed_id ) ) . '" />';
     206            echo '<input type="hidden" name="_wpnonce" value="' . esc_attr( wp_create_nonce( $toggle_action . '_' . $feed_id ) ) . '" />';
    205207            $label = $is_active ? 'Deactivate' : 'Activate';
    206208            $cls   = $is_active ? 'button' : 'button button-primary';
     
    211213        echo '</ul>';
    212214        echo '</div>';
     215    }
     216
     217    /**
     218     * Processes the toggling of a feed's active state in the database.
     219     *
     220     * This method verifies the request type, nonce, and user capability before updating the
     221     * feed's active state in the database. If any validation fails, the user is redirected
     222     * back to the given URL.
     223     *
     224     * @param string $url The URL to redirect to in case of validation failure or after successfully toggling the feed.
     225     *
     226     * @return void
     227     */
     228    public static function process_feed_toggle( string $action_prefix, string $return_url ) {
     229        if ( empty( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) || 'POST' !== ( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ?? '' ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
     230            wp_safe_redirect( admin_url( $return_url ) );
     231            exit;
     232        }
     233
     234        $fid   = isset( $_POST['feed_id'] ) ? (int) $_POST['feed_id'] : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
     235        $nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_wpnonce'] ) ) : '';
     236        if ( ! $fid || ! wp_verify_nonce( $nonce, $action_prefix . '_' . $fid ) ) {
     237            wp_safe_redirect( admin_url( $return_url ) );
     238            exit;
     239        }
     240
     241        if ( ! current_user_can( SuiteMenu::get_parent_capability() ) ) {
     242            wp_safe_redirect( admin_url( $return_url ) );
     243            exit;
     244        }
     245
     246        global $wpdb;
     247        $table = $wpdb->prefix . 'gf_addon_feed';
     248        // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     249        $row = $wpdb->get_row( $wpdb->prepare( "SELECT is_active FROM $table WHERE id = %d", $fid ) );
     250        if ( $row ) {
     251            $new = ( (int) $row->is_active ) ? 0 : 1;
     252            $wpdb->query( $wpdb->prepare( "UPDATE $table SET is_active = %d WHERE id = %d", $new, $fid ) );
     253        }
     254        // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     255
     256        wp_safe_redirect( admin_url( $return_url ) );
     257        exit;
    213258    }
    214259
     
    302347        $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
    303348
    304         $is_shell_page = isset( $this->pages[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) );
     349        $pages_lower_case = array_change_key_case( $this->pages );
     350        $is_shell_page    = isset( $pages_lower_case[ $page ] ) || ( false !== strpos( (string) $hook, 'gravity_ops' ) );
    305351
    306352        // Optionally style Freemius pages in-place.
  • mass-email-notifications-for-gravity-forms/trunk/vendor/MENFGF/gravityops/core/src/Admin/SuiteMenu.php

    r3420036 r3420209  
    170170        $installed_plugins = get_plugins();
    171171        $updates           = get_site_transient( 'update_plugins' );
    172         $update_response   = ( is_object( $updates ) && isset( $updates->response ) && is_object( $updates->response ) ) ? $updates->response : [];
     172        $update_response   = ( is_object( $updates ) && isset( $updates->response ) && is_array( $updates->response ) ) ? $updates->response : [];
    173173        $updates_count     = 0;
    174174
  • mass-email-notifications-for-gravity-forms/trunk/vendor/autoload.php

    r3420036 r3420209  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5::getLoader();
     22return ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e::getLoader();
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/autoload_real.php

    r3420036 r3420209  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5
     5class ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInitb077f8ac83a1f968269291160b6313d5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitadc698ea51a475f0e4c7df8e8f4b148e', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInitb077f8ac83a1f968269291160b6313d5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInitb077f8ac83a1f968269291160b6313d5::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::$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

    r3420036 r3420209  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInitb077f8ac83a1f968269291160b6313d5
     7class ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e
    88{
    99    public static $files = array (
     
    1919    {
    2020        return \Closure::bind(function () use ($loader) {
    21             $loader->classMap = ComposerStaticInitb077f8ac83a1f968269291160b6313d5::$classMap;
     21            $loader->classMap = ComposerStaticInitadc698ea51a475f0e4c7df8e8f4b148e::$classMap;
    2222
    2323        }, null, ClassLoader::class);
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.json

    r3420036 r3420209  
    5959        {
    6060            "name": "gravityops/core",
    61             "version": "1.0.5",
    62             "version_normalized": "1.0.5.0",
     61            "version": "1.0.9",
     62            "version_normalized": "1.0.9.0",
    6363            "source": {
    6464                "type": "git",
    6565                "url": "git@github.com:Eitan-brightleaf/gravityops.git",
    66                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b"
     66                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f"
    6767            },
    6868            "dist": {
    6969                "type": "zip",
    70                 "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/2f8688fbd4eddd60722a1922ba7fd3107977c44b",
    71                 "reference": "2f8688fbd4eddd60722a1922ba7fd3107977c44b",
     70                "url": "https://api.github.com/repos/Eitan-brightleaf/gravityops/zipball/6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
     71                "reference": "6f458bbfffcfa7fb9feff0858b42cb2b6626904f",
    7272                "shasum": ""
    7373            },
     
    7575                "php": ">=7.4"
    7676            },
    77             "time": "2025-12-15T10:45:03+00:00",
     77            "time": "2025-12-15T13:51:53+00:00",
    7878            "type": "library",
    7979            "installation-source": "source",
  • mass-email-notifications-for-gravity-forms/trunk/vendor/composer/installed.php

    r3420036 r3420209  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     6        'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    1414            'pretty_version' => 'dev-main',
    1515            'version' => 'dev-main',
    16             'reference' => '212770f4424d603b2fcfd4553228f209825fe09e',
     16            'reference' => 'ad2a45b5f593f676073e26d5483350c779b747b4',
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../../',
     
    3030        ),
    3131        'gravityops/core' => array(
    32             'pretty_version' => '1.0.5',
    33             'version' => '1.0.5.0',
    34             'reference' => '2f8688fbd4eddd60722a1922ba7fd3107977c44b',
     32            'pretty_version' => '1.0.9',
     33            'version' => '1.0.9.0',
     34            'reference' => '6f458bbfffcfa7fb9feff0858b42cb2b6626904f',
    3535            'type' => 'library',
    3636            'install_path' => __DIR__ . '/../gravityops/core',
Note: See TracChangeset for help on using the changeset viewer.