Plugin Directory

Changeset 3464233


Ignore:
Timestamp:
02/18/2026 10:52:21 AM (6 weeks ago)
Author:
eitanatbrightleaf
Message:

Update to version 1.6.18 from GitHub

Location:
integrate-asana-with-gravity-forms
Files:
22 added
4 deleted
48 edited
1 copied

Legend:

Unmodified
Added
Removed
  • integrate-asana-with-gravity-forms/tags/1.6.18/class-integrate-asana-with-gravity-forms.php

    r3451305 r3464233  
    11<?php
    22
    3 use IAWGF\GravityOps\Core\Admin\SuiteMenu;
     3use IAWGF\GravityOps\Core\SuiteCore\SuiteCore;
    44use IAWGF\BrightleafDigital\AsanaClient;
    55use IAWGF\BrightleafDigital\Auth\Scopes;
     
    88use IAWGF\BrightleafDigital\Exceptions\TokenInvalidException;
    99use IAWGF\BrightleafDigital\Http\AsanaApiClient;
    10 use IAWGF\GravityOps\Core\Admin\ReviewPrompter;
    11 use IAWGF\GravityOps\Core\Admin\SurveyPrompter;
    1210use IAWGF\GravityOps\Core\Utils\AssetHelper;
    13 use IAWGF\GravityOps\Core\Admin\AdminShell;
    14 use function IAWGF\GravityOps\Core\Admin\gravityops_shell;
    1511if ( !defined( 'ABSPATH' ) ) {
    1612    exit;
     
    147143        add_filter( 'gform_custom_merge_tags', [$this, 'custom_merge_tag'] );
    148144        // Register the new GravityOps AdminShell page under the parent menu.
    149         gravityops_shell()->register_plugin_page( $this->_slug, [
     145        SuiteCore::instance()->shell()->register_plugin_page( $this->_slug, [
    150146            'title'      => $this->_title,
    151147            'menu_title' => 'Asana Integration',
     
    182178        }
    183179        $param = 'https://wordpress.org/support/plugin/integrate-asana-with-gravity-forms/reviews/#new-post';
    184         $review_prompter = new ReviewPrompter($this->prefix, $this->_title, $param);
     180        $review_prompter = SuiteCore::instance()->review_prompter( $this->prefix, $this->_title, $param );
    185181        $review_prompter->init();
    186182        $review_prompter->maybe_show_review_request( $this->get_number_tasks_created(), 50 );
    187         $survey_prompter = new SurveyPrompter(
     183        $survey_prompter = SuiteCore::instance()->survey_prompter(
    188184            $this->prefix,
    189185            $this->_title,
     
    376372     */
    377373    public function get_app_menu_icon() {
    378         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: 'dashicons-portfolio' );
     374        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: 'dashicons-portfolio' );
    379375    }
    380376
     
    385381     */
    386382    public function get_menu_icon() {
    387         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
     383        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
    388384    }
    389385
     
    589585        delete_option( $this->prefix . 'access_token' );
    590586        delete_option( "{$this->prefix}survey_status" );
     587        delete_option( "{$this->prefix}review_prompter_usage_count" );
    591588        wp_clear_scheduled_hook( 'asana_token_refresh' );
    592589    }
     
    12791276        // notes (string).
    12801277        $this->log_debug( __METHOD__ . '() - getting task description/notes and replacing merge tags.' );
    1281         $task_notes = '<body>' . GFCommon::replace_variables( rgar( $meta, 'task_notes' ), $form, $entry );
    1282         // strip invalid html from rich text
    1283         $task_notes = wp_kses( $task_notes, [
     1278        $raw_task_notes = GFCommon::replace_variables( rgar( $meta, 'task_notes' ), $form, $entry );
     1279        // Plain text version for backup task and non-rich text fields. Decode entities to ensure literal characters like < and & show up correctly.
     1280        // We avoid wp_strip_all_tags as it butchers PHP code snippets containing < or >.
     1281        $plain_task_notes = preg_replace( '/<(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre|p|br|div|span|h[1-6])\\b[^>]*>/i', '', $raw_task_notes );
     1282        $plain_task_notes = preg_replace( '/<\\/(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre|p|br|div|span|h[1-6])>/i', '', $plain_task_notes );
     1283        $plain_task_notes = html_entity_decode( $plain_task_notes, ENT_QUOTES, 'UTF-8' );
     1284        // Rich text version for Asana html_notes. Decode entities first to ensure numeric entities like &#091; (square brackets) are treated as literal characters.
     1285        $html_task_notes = '<body>' . html_entity_decode( $raw_task_notes, ENT_QUOTES, 'UTF-8' );
     1286        // strip invalid html from rich text.
     1287        $html_task_notes = wp_kses( $html_task_notes, [
    12841288            'body'       => [],
    12851289            'strong'     => [],
     
    12991303            'pre'        => [],
    13001304        ] );
    1301         $task_notes .= '</body>';
    1302         $task_notes = wp_specialchars_decode( $task_notes, ENT_QUOTES );
     1305        $html_task_notes .= '</body>';
     1306        // Asana's html_notes must be valid XML. Escape all text and non-whitelisted tags while preserving allowed Asana HTML tags.
     1307        $parts = preg_split(
     1308            '/(<[^>]*>)/',
     1309            $html_task_notes,
     1310            -1,
     1311            PREG_SPLIT_DELIM_CAPTURE
     1312        );
     1313        $allowed_tags_regex = '/^<\\/?(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre)\\b/i';
     1314        foreach ( $parts as &$part ) {
     1315            if ( '' === $part ) {
     1316                continue;
     1317            }
     1318            if ( '<' === $part[0] ) {
     1319                if ( !preg_match( $allowed_tags_regex, $part ) ) {
     1320                    // Use htmlspecialchars with double_encode=false to avoid double escaping existing entities.
     1321                    $part = htmlspecialchars(
     1322                        $part,
     1323                        ENT_QUOTES,
     1324                        'UTF-8',
     1325                        false
     1326                    );
     1327                }
     1328            } else {
     1329                $part = htmlspecialchars(
     1330                    $part,
     1331                    ENT_QUOTES,
     1332                    'UTF-8',
     1333                    false
     1334                );
     1335            }
     1336            // Asana specifically requests &apos; for single quotes in rich text.
     1337            $part = str_replace( '&#039;', '&apos;', $part );
     1338        }
     1339        $html_task_notes = implode( '', $parts );
    13031340        // array of gid strings -> convert to individual string with for-each later.
    13041341        $this->log_debug( __METHOD__ . '() - getting assignees.' );
     
    13211358                    'name'       => $processed_task_name,
    13221359                    'tags'       => $tags_gid,
    1323                     'html_notes' => $task_notes,
     1360                    'html_notes' => $html_task_notes,
    13241361                    'assignee'   => $current_assignee,
    13251362                    'projects'   => $projects,
     
    13861423                }
    13871424                $collaborators_array = implode( ',', $collaborators_array );
    1388                 $notes = "Automatic creation of the task failed for some or all of the assignees. The error given was \"{$error}\".\n\n" . "Please create the desired task with this information.\n" . "Task name = {$processed_task_name}\n" . "Task due date = {$processed_due_date}\n" . "Tags = {$tags_as_string}\n" . "Task description = {$task_notes}\n" . "Task assignees = {$assignees_array}\n" . "Projects = {$projects_array}\n" . "Collaborators = {$collaborators_array}\n";
     1425                $notes = "Automatic creation of the task failed for some or all of the assignees. The error given was \"{$error}\".\n\n" . "Please create the desired task with this information.\n" . "Task name = {$processed_task_name}\n" . "Task due date = {$processed_due_date}\n" . "Tags = {$tags_as_string}\n" . "Task description = {$plain_task_notes}\n" . "Task assignees = {$assignees_array}\n" . "Projects = {$projects_array}\n" . "Collaborators = {$collaborators_array}\n";
    13891426                $this->log_debug( __METHOD__ . '() - attempting to create backup task.' );
    13901427                $backup_task_result = $asana_client->tasks()->createTask( [
     
    16181655            ];
    16191656        }
    1620         $workflow_steps = [];
    1621         if ( class_exists( AdminShell::class ) ) {
    1622             $workflow_steps = AdminShell::get_workflow_steps_by_type( ['iawgf_create_task', 'iawgf_update_task'] );
    1623         }
     1657        $workflow_steps = SuiteCore::instance()->shell()->get_workflow_steps_by_type( ['iawgf_create_task', 'iawgf_update_task'] );
    16241658        // Use shared renderer: pass GF subview slug, short title for header, and our admin_post action for toggling.
    1625         AdminShell::render_feeds_list(
     1659        SuiteCore::instance()->shell()->render_feeds_list(
    16261660            $feeds_and_forms,
    16271661            $this->_slug,
     
    16391673    public function handle_toggle_feed() {
    16401674        // Delegate to the shared processor (capability + nonce checks + DB flip + redirect)
    1641         AdminShell::process_feed_toggle( 'iawgf_toggle_feed', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
     1675        SuiteCore::instance()->shell()->process_feed_toggle( 'iawgf_toggle_feed', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
    16421676    }
    16431677
     
    16481682     */
    16491683    public function handle_toggle_workflow_step() {
    1650         AdminShell::process_feed_toggle( 'iawgf_toggle_workflow_step', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
     1684        SuiteCore::instance()->shell()->process_feed_toggle( 'iawgf_toggle_workflow_step', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
    16511685    }
    16521686
     
    16581692     */
    16591693    public function gops_render_help() {
    1660         AdminShell::render_help_tab( [
     1694        SuiteCore::instance()->shell()->render_help_tab( [
    16611695            'Plugin page'            => 'https://brightleafdigital.io/asana-gravity-forms/',
    16621696            'Docs'                   => 'https://brightleafdigital.io/asana-gravity-forms/#docs',
     
    27292763     */
    27302764    private function get_freemius_tabs() {
    2731         $tabs = AdminShell::freemius_tabs( $this->_slug );
     2765        $tabs = SuiteCore::instance()->shell()->freemius_tabs( $this->_slug );
    27322766        if ( !iawgf_fs()->is_registered() ) {
    27332767            unset($tabs['account']);
  • integrate-asana-with-gravity-forms/tags/1.6.18/integrate-asana-with-gravity-forms.php

    r3451305 r3464233  
    55 * Plugin URI: https://brightleafdigital.io//asana-gravity-forms/
    66 * Description: Allows you to create Asana tasks directly from your forms.
    7  * Version: 1.6.17
     7 * Version: 1.6.18
    88 * Author: BrightLeaf Digital
    99 * Author URI: https://brightleafdigital.io/
     
    1414 * @package IntegrateAsanaGravityForms
    1515 */
    16 use function IAWGF\GravityOps\Core\Admin\gravityops_shell;
     16use IAWGF\GravityOps\Core\SuiteCore\SuiteCore;
    1717if ( !defined( 'ABSPATH' ) ) {
    1818    exit;
    1919    // Exit if accessed directly.
    2020}
     21define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_VERSION', '1.6.18' );
     22define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    2123require_once __DIR__ . '/vendor/autoload.php';
    2224if ( file_exists( __DIR__ . '/vendor/IAWGF/autoload.php' ) ) {
    2325    require_once __DIR__ . '/vendor/IAWGF/autoload.php';
    2426}
    25 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded.
     27// Register this plugin with SuiteCore early so the latest provider can be selected.
    2628add_action( 'plugins_loaded', function () {
    27     gravityops_shell();
     29    $assets_base_url = '';
     30    if ( file_exists( __DIR__ . '/vendor/IAWGF/gravityops/core/assets/' ) ) {
     31        $assets_base_url = plugins_url( 'vendor/IAWGF/gravityops/core/assets/', __FILE__ );
     32    } else {
     33        $assets_base_url = plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
     34    }
     35    SuiteCore::register( [
     36        'assets_base_url' => $assets_base_url,
     37    ] );
    2838}, 1 );
    29 // Ensure GravityOps admin assets resolve from this plugin's vendor path when the library is vendor-installed.
    30 add_filter( 'gravityops_assets_base_url', function ( $url ) {
    31     if ( $url ) {
    32         return $url;
    33     }
    34     if ( file_exists( __DIR__ . '/vendor/IAWGF/gravityops/core/assets/' ) ) {
    35         return plugins_url( 'vendor/IAWGF/gravityops/core/assets/', __FILE__ );
    36     }
    37     return plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
    38 } );
    3939if ( function_exists( 'iawgf_fs' ) ) {
    4040    iawgf_fs()->set_basename( false, __FILE__ );
     
    8282        do_action( 'iawgf_fs_loaded' );
    8383    }
    84     define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_VERSION', '1.6.17' );
    85     define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    8684    add_action( 'admin_notices', function () {
    8785        if ( !class_exists( 'GFForms' ) ) {
  • integrate-asana-with-gravity-forms/tags/1.6.18/readme.txt

    r3451305 r3464233  
    22Tested up to: 6.9
    33Tags: GravityForms, Asana, integration, task management, automation
    4 Stable tag: 1.6.17
     4Stable tag: 1.6.18
    55Requires PHP: 7.4
    66License: GPLv2 or later
     
    8080== Changelog ==
    8181
     82= 1.6.18 | Feb 18, 2026 =
     83- Fixed uninstall process to properly clear everything
     84- Updated core GravityOps library to improve the update plugin process among other small fixes
     85- Fixed an issue with the Create Task workflow step running also on form submission
     86- Enhanced processing of task description to account for some edge cases where it wouldn't show properly or would cause the task creation to fail
     87
    8288= 1.6.17 | Jan 31, 2026 =
    8389* Fixed an issue with the save settings button sometimes not showing on the 2nd pg of the integration wizard
     
    96102* Fixed a bug in the new admin menu
    97103
    98 = 1.6.13 =
    99 * New GravityOps admin page with clearer Overview/Connection/Feeds/Help sections.
    100 * Quickly turn feeds on/off right from the Feeds list.
    101 * Improved setup and authorization guidance, especially after site moves or restores.
    102 * General polish and reliability improvements.
    103 
    104104= For the full changelog please visit [our website] (https://brightleafdigital.io/docs/changelog/). =
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/autoload.php

    r3451305 r3464233  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb::getLoader();
     22return ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f::getLoader();
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/autoload_classmap.php

    r3444396 r3464233  
    2626    'IAWGF\\BrightleafDigital\\Http\\AsanaApiClient' => $vendorDir . '/brightleaf-digital/asana-client/src/Http/AsanaApiClient.php',
    2727    'IAWGF\\BrightleafDigital\\Utils\\CryptoUtils' => $vendorDir . '/brightleaf-digital/asana-client/src/Utils/CryptoUtils.php',
    28     'IAWGF\\GravityOps\\Core\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/Admin/AdminShell.php',
    29     'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/Admin/ReviewPrompter.php',
    30     'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader' => $vendorDir . '/gravityops/core/src/Admin/SettingsHeader.php',
    31     'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php',
    32     'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/Admin/SurveyPrompter.php',
    33     'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/Admin/TrustedLogin.php',
    34     'IAWGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php',
     28    'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => $vendorDir . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     29    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     30    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     31    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     32    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     33    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     34    'IAWGF\\GravityOps\\Core\\SuiteCore\\Config' => $vendorDir . '/gravityops/core/src/SuiteCore/Config.php',
     35    'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     36    'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    3537    'IAWGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php',
    3638    'IAWGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php',
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/autoload_files.php

    r3444396 r3464233  
    1010    '27af5cb5044b2ad00b632edd7d9fab23' => $vendorDir . '/symfony/deprecation-contracts/function.php',
    1111    '26801412a357618220713b6279bab007' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
    12     'ebe7f444078b8942da9be5cdfad48b69' => $vendorDir . '/gravityops/core/src/Admin/functions.php',
    1312);
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/autoload_real.php

    r3451305 r3464233  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb
     5class ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \IAWGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\IAWGF\Composer\Autoload\ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::getInitializer($loader));
     32        call_user_func(\IAWGF\Composer\Autoload\ComposerStaticInitef759e65b13922405ca10b3085d0b89f::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
    3535        $loader->register(true);
    3636
    37         $filesToLoad = \IAWGF\Composer\Autoload\ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$files;
     37        $filesToLoad = \IAWGF\Composer\Autoload\ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$files;
    3838        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3939            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/autoload_static.php

    r3451305 r3464233  
    55namespace IAWGF\Composer\Autoload;
    66
    7 class ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb
     7class ComposerStaticInitef759e65b13922405ca10b3085d0b89f
    88{
    99    public static $files = array (
     
    1111        '27af5cb5044b2ad00b632edd7d9fab23' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
    1212        '26801412a357618220713b6279bab007' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
    13         'ebe7f444078b8942da9be5cdfad48b69' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php',
    1413    );
    1514
     
    8988        'IAWGF\\BrightleafDigital\\Http\\AsanaApiClient' => __DIR__ . '/..' . '/brightleaf-digital/asana-client/src/Http/AsanaApiClient.php',
    9089        'IAWGF\\BrightleafDigital\\Utils\\CryptoUtils' => __DIR__ . '/..' . '/brightleaf-digital/asana-client/src/Utils/CryptoUtils.php',
    91         'IAWGF\\GravityOps\\Core\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/Admin/AdminShell.php',
    92         'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/ReviewPrompter.php',
    93         'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SettingsHeader.php',
    94         'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php',
    95         'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SurveyPrompter.php',
    96         'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/Admin/TrustedLogin.php',
    97         'IAWGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php',
     90        'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     91        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     92        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     93        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     94        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     95        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     96        'IAWGF\\GravityOps\\Core\\SuiteCore\\Config' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Config.php',
     97        'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     98        'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    9899        'IAWGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php',
    99100        'IAWGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php',
     
    250251    {
    251252        return \Closure::bind(function () use ($loader) {
    252             $loader->prefixLengthsPsr4 = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$prefixLengthsPsr4;
    253             $loader->prefixDirsPsr4 = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$prefixDirsPsr4;
    254             $loader->classMap = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$classMap;
     253            $loader->prefixLengthsPsr4 = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$prefixLengthsPsr4;
     254            $loader->prefixDirsPsr4 = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$prefixDirsPsr4;
     255            $loader->classMap = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$classMap;
    255256
    256257        }, null, ClassLoader::class);
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/installed.json

    r3451305 r3464233  
    5353        "2": {
    5454            "name": "gravityops/core",
    55             "version": "1.1.0",
    56             "version_normalized": "1.1.0.0",
     55            "version": "2.0.1",
     56            "version_normalized": "2.0.1.0",
    5757            "source": {
    5858                "type": "git",
    5959                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
    60                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
    61             },
    62             "dist": {
    63                 "type": "zip",
    64                 "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    65                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     60                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
     61            },
     62            "dist": {
     63                "type": "zip",
     64                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     65                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    6666                "shasum": ""
    6767            },
     
    7070                "trustedlogin/client": "^v1.9"
    7171            },
    72             "time": "2026-01-21T19:42:14+00:00",
     72            "time": "2026-02-18T09:47:24+00:00",
    7373            "type": "library",
    7474            "installation-source": "source",
     
    7676                "psr-4": {
    7777                    "IAWGF\\GravityOps\\Core\\": "src/"
    78                 },
    79                 "files": [
    80                     "src/Admin/functions.php"
    81                 ]
     78                }
    8279            },
    8380            "license": [
     
    707704        "11": {
    708705            "name": "symfony/deprecation-contracts",
    709             "version": "v3.6.0",
    710             "version_normalized": "3.6.0.0",
     706            "version": "v3.0.2",
     707            "version_normalized": "3.0.2.0",
    711708            "source": {
    712709                "type": "git",
    713710                "url": "https://github.com/symfony/deprecation-contracts.git",
    714                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
    715             },
    716             "dist": {
    717                 "type": "zip",
    718                 "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
    719                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
    720                 "shasum": ""
    721             },
    722             "require": {
    723                 "php": ">=8.1"
    724             },
    725             "time": "2024-09-25T14:21:43+00:00",
     711                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
     712            },
     713            "dist": {
     714                "type": "zip",
     715                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     716                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     717                "shasum": ""
     718            },
     719            "require": {
     720                "php": ">=8.0.2"
     721            },
     722            "time": "2022-01-02T09:55:41+00:00",
    726723            "type": "library",
    727724            "extra": {
     
    731728                },
    732729                "branch-alias": {
    733                     "dev-main": "3.6-dev"
     730                    "dev-main": "3.0-dev"
    734731                }
    735732            },
     
    757754            "homepage": "https://symfony.com",
    758755            "support": {
    759                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
     756                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
    760757            },
    761758            "funding": [
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/installed.php

    r3451305 r3464233  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     7    'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    2929    'gravityops/core' =>
    3030    array (
    31       'pretty_version' => '1.1.0',
    32       'version' => '1.1.0.0',
    33       'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     31      'pretty_version' => '2.0.1',
     32      'version' => '2.0.1.0',
     33      'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    3434      'type' => 'library',
    3535      'install_path' => __DIR__ . '/../gravityops/core',
     
    137137    'symfony/deprecation-contracts' =>
    138138    array (
    139       'pretty_version' => 'v3.6.0',
    140       'version' => '3.6.0.0',
    141       'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
     139      'pretty_version' => 'v3.0.2',
     140      'version' => '3.0.2.0',
     141      'reference' => '26954b3d62a6c5fd0ea8a2a00c0353a14978d05c',
    142142      'type' => 'library',
    143143      'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/composer/platform_check.php

    r3451305 r3464233  
    55$issues = array();
    66
    7 if (!(PHP_VERSION_ID >= 80100)) {
    8     $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.';
     7if (!(PHP_VERSION_ID >= 80002)) {
     8    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.2". You are running ' . PHP_VERSION . '.';
    99}
    1010
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/gravityops/core/assets/css/admin.css

    r3444396 r3464233  
    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 */
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/gravityops/core/assets/js/admin.js

    r3444396 r3464233  
    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() {
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/gravityops/core/composer.json

    r3444396 r3464233  
    1111    "psr-4": {
    1212      "GravityOps\\Core\\": "src/"
    13     },
    14     "files": [
    15       "src/Admin/functions.php"
    16     ]
     13    }
    1714  }
    1815}
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/symfony/deprecation-contracts/LICENSE

    r3451305 r3464233  
    1 Copyright (c) 2020-present Fabien Potencier
     1Copyright (c) 2020-2022 Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/symfony/deprecation-contracts/README.md

    r3451305 r3464233  
    2323`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.`
    2424
    25 While not recommended, the deprecation notices can be completely ignored by declaring an empty
     25While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty
    2626`function trigger_deprecation() {}` in your application.
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/IAWGF/symfony/deprecation-contracts/composer.json

    r3451305 r3464233  
    1616    ],
    1717    "require": {
    18         "php": ">=8.1"
     18        "php": ">=8.0.2"
    1919    },
    2020    "autoload": {
     
    2626    "extra": {
    2727        "branch-alias": {
    28             "dev-main": "3.6-dev"
     28            "dev-main": "3.0-dev"
    2929        },
    3030        "thanks": {
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/autoload.php

    r3451305 r3464233  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInitc04228858cdd17dea362251fa382d6d5::getLoader();
     22return ComposerAutoloaderInitb00a5d9582cdfedfa6ea11676daebf9d::getLoader();
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/autoload_aliases.php

    r3444396 r3464233  
    1515    }
    1616
    17 }
    18 namespace GravityOps\Core\Admin {
    19     if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){
    20         function gravityops_shell(...$args) {
    21             return \IAWGF\GravityOps\Core\Admin\gravityops_shell(...func_get_args());
    22         }
    23     }
    2417}
    2518namespace GuzzleHttp {
     
    313306    ),
    314307  ),
    315   'GravityOps\\Core\\Admin\\AdminShell' =>
     308  'GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' =>
    316309  array (
    317310    'type' => 'class',
    318311    'classname' => 'AdminShell',
    319312    'isabstract' => false,
    320     'namespace' => 'GravityOps\\Core\\Admin',
    321     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\AdminShell',
    322     'implements' =>
    323     array (
    324     ),
    325   ),
    326   'GravityOps\\Core\\Admin\\ReviewPrompter' =>
     313    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     314    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell',
     315    'implements' =>
     316    array (
     317    ),
     318  ),
     319  'GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' =>
    327320  array (
    328321    'type' => 'class',
    329322    'classname' => 'ReviewPrompter',
    330323    'isabstract' => false,
    331     'namespace' => 'GravityOps\\Core\\Admin',
    332     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter',
    333     'implements' =>
    334     array (
    335     ),
    336   ),
    337   'GravityOps\\Core\\Admin\\SettingsHeader' =>
    338   array (
    339     'type' => 'class',
    340     'classname' => 'SettingsHeader',
    341     'isabstract' => false,
    342     'namespace' => 'GravityOps\\Core\\Admin',
    343     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader',
    344     'implements' =>
    345     array (
    346     ),
    347   ),
    348   'GravityOps\\Core\\Admin\\SuiteMenu' =>
     324    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     325    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter',
     326    'implements' =>
     327    array (
     328    ),
     329  ),
     330  'GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' =>
    349331  array (
    350332    'type' => 'class',
    351333    'classname' => 'SuiteMenu',
    352334    'isabstract' => false,
    353     'namespace' => 'GravityOps\\Core\\Admin',
    354     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu',
    355     'implements' =>
    356     array (
    357     ),
    358   ),
    359   'GravityOps\\Core\\Admin\\SurveyPrompter' =>
     335    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     336    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu',
     337    'implements' =>
     338    array (
     339    ),
     340  ),
     341  'GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' =>
    360342  array (
    361343    'type' => 'class',
    362344    'classname' => 'SurveyPrompter',
    363345    'isabstract' => false,
    364     'namespace' => 'GravityOps\\Core\\Admin',
    365     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter',
    366     'implements' =>
    367     array (
    368     ),
    369   ),
    370   'GravityOps\\Core\\Admin\\TrustedLogin' =>
     346    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     347    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter',
     348    'implements' =>
     349    array (
     350    ),
     351  ),
     352  'GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' =>
    371353  array (
    372354    'type' => 'class',
    373355    'classname' => 'TrustedLogin',
    374356    'isabstract' => false,
    375     'namespace' => 'GravityOps\\Core\\Admin',
    376     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin',
    377     'implements' =>
    378     array (
    379     ),
    380   ),
    381   'GravityOps\\Core\\SuiteRegistry' =>
    382   array (
    383     'type' => 'class',
    384     'classname' => 'SuiteRegistry',
    385     'isabstract' => false,
    386     'namespace' => 'GravityOps\\Core',
    387     'extends' => 'IAWGF\\GravityOps\\Core\\SuiteRegistry',
     357    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     358    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin',
     359    'implements' =>
     360    array (
     361    ),
     362  ),
     363  'GravityOps\\Core\\SuiteCore\\AdminAssetHelper' =>
     364  array (
     365    'type' => 'class',
     366    'classname' => 'AdminAssetHelper',
     367    'isabstract' => false,
     368    'namespace' => 'GravityOps\\Core\\SuiteCore',
     369    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper',
     370    'implements' =>
     371    array (
     372    ),
     373  ),
     374  'GravityOps\\Core\\SuiteCore\\Config' =>
     375  array (
     376    'type' => 'class',
     377    'classname' => 'Config',
     378    'isabstract' => false,
     379    'namespace' => 'GravityOps\\Core\\SuiteCore',
     380    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Config',
     381    'implements' =>
     382    array (
     383    ),
     384  ),
     385  'GravityOps\\Core\\SuiteCore\\SuiteCatalog' =>
     386  array (
     387    'type' => 'class',
     388    'classname' => 'SuiteCatalog',
     389    'isabstract' => false,
     390    'namespace' => 'GravityOps\\Core\\SuiteCore',
     391    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog',
     392    'implements' =>
     393    array (
     394    ),
     395  ),
     396  'GravityOps\\Core\\SuiteCore\\SuiteCore' =>
     397  array (
     398    'type' => 'class',
     399    'classname' => 'SuiteCore',
     400    'isabstract' => false,
     401    'namespace' => 'GravityOps\\Core\\SuiteCore',
     402    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore',
    388403    'implements' =>
    389404    array (
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/autoload_real.php

    r3451305 r3464233  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInitc04228858cdd17dea362251fa382d6d5
     5class ComposerAutoloaderInitb00a5d9582cdfedfa6ea11676daebf9d
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInitc04228858cdd17dea362251fa382d6d5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitb00a5d9582cdfedfa6ea11676daebf9d', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInitc04228858cdd17dea362251fa382d6d5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitb00a5d9582cdfedfa6ea11676daebf9d', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInitc04228858cdd17dea362251fa382d6d5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInitc04228858cdd17dea362251fa382d6d5::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d::$files;
    3737        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3838            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/autoload_static.php

    r3451305 r3464233  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInitc04228858cdd17dea362251fa382d6d5
     7class ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d
    88{
    99    public static $files = array (
     
    1818    {
    1919        return \Closure::bind(function () use ($loader) {
    20             $loader->classMap = ComposerStaticInitc04228858cdd17dea362251fa382d6d5::$classMap;
     20            $loader->classMap = ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d::$classMap;
    2121
    2222        }, null, ClassLoader::class);
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/installed.json

    r3451305 r3464233  
    105105        {
    106106            "name": "gravityops/core",
    107             "version": "1.1.0",
    108             "version_normalized": "1.1.0.0",
     107            "version": "2.0.1",
     108            "version_normalized": "2.0.1.0",
    109109            "source": {
    110110                "type": "git",
    111111                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
    112                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
    113             },
    114             "dist": {
    115                 "type": "zip",
    116                 "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    117                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     112                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
     113            },
     114            "dist": {
     115                "type": "zip",
     116                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     117                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    118118                "shasum": ""
    119119            },
     
    122122                "trustedlogin/client": "^v1.9"
    123123            },
    124             "time": "2026-01-21T19:42:14+00:00",
     124            "time": "2026-02-18T09:47:24+00:00",
    125125            "type": "library",
    126126            "installation-source": "source",
     
    717717        {
    718718            "name": "symfony/deprecation-contracts",
    719             "version": "v3.6.0",
    720             "version_normalized": "3.6.0.0",
     719            "version": "v3.0.2",
     720            "version_normalized": "3.0.2.0",
    721721            "source": {
    722722                "type": "git",
    723723                "url": "https://github.com/symfony/deprecation-contracts.git",
    724                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
    725             },
    726             "dist": {
    727                 "type": "zip",
    728                 "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
    729                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
    730                 "shasum": ""
    731             },
    732             "require": {
    733                 "php": ">=8.1"
    734             },
    735             "time": "2024-09-25T14:21:43+00:00",
     724                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
     725            },
     726            "dist": {
     727                "type": "zip",
     728                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     729                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     730                "shasum": ""
     731            },
     732            "require": {
     733                "php": ">=8.0.2"
     734            },
     735            "time": "2022-01-02T09:55:41+00:00",
    736736            "type": "library",
    737737            "extra": {
     
    741741                },
    742742                "branch-alias": {
    743                     "dev-main": "3.6-dev"
     743                    "dev-main": "3.0-dev"
    744744                }
    745745            },
     
    763763            "homepage": "https://symfony.com",
    764764            "support": {
    765                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
     765                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
    766766            },
    767767            "funding": [
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/installed.php

    r3451305 r3464233  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     6        'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    2323            'pretty_version' => 'dev-main',
    2424            'version' => 'dev-main',
    25             'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     25            'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    2626            'type' => 'library',
    2727            'install_path' => __DIR__ . '/../../',
     
    3939        ),
    4040        'gravityops/core' => array(
    41             'pretty_version' => '1.1.0',
    42             'version' => '1.1.0.0',
    43             'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     41            'pretty_version' => '2.0.1',
     42            'version' => '2.0.1.0',
     43            'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    4444            'type' => 'library',
    4545            'install_path' => __DIR__ . '/../gravityops/core',
     
    138138        ),
    139139        'symfony/deprecation-contracts' => array(
    140             'pretty_version' => 'v3.6.0',
    141             'version' => '3.6.0.0',
    142             'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
     140            'pretty_version' => 'v3.0.2',
     141            'version' => '3.0.2.0',
     142            'reference' => '26954b3d62a6c5fd0ea8a2a00c0353a14978d05c',
    143143            'type' => 'library',
    144144            'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
  • integrate-asana-with-gravity-forms/tags/1.6.18/vendor/composer/platform_check.php

    r3451305 r3464233  
    2020        }
    2121    }
    22     trigger_error(
    23         'Composer detected issues in your platform: ' . implode(' ', $issues),
    24         E_USER_ERROR
     22    throw new \RuntimeException(
     23        'Composer detected issues in your platform: ' . implode(' ', $issues)
    2524    );
    2625}
  • integrate-asana-with-gravity-forms/trunk/class-integrate-asana-with-gravity-forms.php

    r3451305 r3464233  
    11<?php
    22
    3 use IAWGF\GravityOps\Core\Admin\SuiteMenu;
     3use IAWGF\GravityOps\Core\SuiteCore\SuiteCore;
    44use IAWGF\BrightleafDigital\AsanaClient;
    55use IAWGF\BrightleafDigital\Auth\Scopes;
     
    88use IAWGF\BrightleafDigital\Exceptions\TokenInvalidException;
    99use IAWGF\BrightleafDigital\Http\AsanaApiClient;
    10 use IAWGF\GravityOps\Core\Admin\ReviewPrompter;
    11 use IAWGF\GravityOps\Core\Admin\SurveyPrompter;
    1210use IAWGF\GravityOps\Core\Utils\AssetHelper;
    13 use IAWGF\GravityOps\Core\Admin\AdminShell;
    14 use function IAWGF\GravityOps\Core\Admin\gravityops_shell;
    1511if ( !defined( 'ABSPATH' ) ) {
    1612    exit;
     
    147143        add_filter( 'gform_custom_merge_tags', [$this, 'custom_merge_tag'] );
    148144        // Register the new GravityOps AdminShell page under the parent menu.
    149         gravityops_shell()->register_plugin_page( $this->_slug, [
     145        SuiteCore::instance()->shell()->register_plugin_page( $this->_slug, [
    150146            'title'      => $this->_title,
    151147            'menu_title' => 'Asana Integration',
     
    182178        }
    183179        $param = 'https://wordpress.org/support/plugin/integrate-asana-with-gravity-forms/reviews/#new-post';
    184         $review_prompter = new ReviewPrompter($this->prefix, $this->_title, $param);
     180        $review_prompter = SuiteCore::instance()->review_prompter( $this->prefix, $this->_title, $param );
    185181        $review_prompter->init();
    186182        $review_prompter->maybe_show_review_request( $this->get_number_tasks_created(), 50 );
    187         $survey_prompter = new SurveyPrompter(
     183        $survey_prompter = SuiteCore::instance()->survey_prompter(
    188184            $this->prefix,
    189185            $this->_title,
     
    376372     */
    377373    public function get_app_menu_icon() {
    378         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: 'dashicons-portfolio' );
     374        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: 'dashicons-portfolio' );
    379375    }
    380376
     
    385381     */
    386382    public function get_menu_icon() {
    387         return ( SuiteMenu::get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
     383        return ( SuiteCore::instance()->suite_menu()->get_plugin_icon_url( $this->_slug ) ?: $this->get_base_url() . '/includes/images/icon.svg' );
    388384    }
    389385
     
    589585        delete_option( $this->prefix . 'access_token' );
    590586        delete_option( "{$this->prefix}survey_status" );
     587        delete_option( "{$this->prefix}review_prompter_usage_count" );
    591588        wp_clear_scheduled_hook( 'asana_token_refresh' );
    592589    }
     
    12791276        // notes (string).
    12801277        $this->log_debug( __METHOD__ . '() - getting task description/notes and replacing merge tags.' );
    1281         $task_notes = '<body>' . GFCommon::replace_variables( rgar( $meta, 'task_notes' ), $form, $entry );
    1282         // strip invalid html from rich text
    1283         $task_notes = wp_kses( $task_notes, [
     1278        $raw_task_notes = GFCommon::replace_variables( rgar( $meta, 'task_notes' ), $form, $entry );
     1279        // Plain text version for backup task and non-rich text fields. Decode entities to ensure literal characters like < and & show up correctly.
     1280        // We avoid wp_strip_all_tags as it butchers PHP code snippets containing < or >.
     1281        $plain_task_notes = preg_replace( '/<(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre|p|br|div|span|h[1-6])\\b[^>]*>/i', '', $raw_task_notes );
     1282        $plain_task_notes = preg_replace( '/<\\/(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre|p|br|div|span|h[1-6])>/i', '', $plain_task_notes );
     1283        $plain_task_notes = html_entity_decode( $plain_task_notes, ENT_QUOTES, 'UTF-8' );
     1284        // Rich text version for Asana html_notes. Decode entities first to ensure numeric entities like &#091; (square brackets) are treated as literal characters.
     1285        $html_task_notes = '<body>' . html_entity_decode( $raw_task_notes, ENT_QUOTES, 'UTF-8' );
     1286        // strip invalid html from rich text.
     1287        $html_task_notes = wp_kses( $html_task_notes, [
    12841288            'body'       => [],
    12851289            'strong'     => [],
     
    12991303            'pre'        => [],
    13001304        ] );
    1301         $task_notes .= '</body>';
    1302         $task_notes = wp_specialchars_decode( $task_notes, ENT_QUOTES );
     1305        $html_task_notes .= '</body>';
     1306        // Asana's html_notes must be valid XML. Escape all text and non-whitelisted tags while preserving allowed Asana HTML tags.
     1307        $parts = preg_split(
     1308            '/(<[^>]*>)/',
     1309            $html_task_notes,
     1310            -1,
     1311            PREG_SPLIT_DELIM_CAPTURE
     1312        );
     1313        $allowed_tags_regex = '/^<\\/?(body|strong|em|u|s|code|ol|ul|li|a|blockquote|pre)\\b/i';
     1314        foreach ( $parts as &$part ) {
     1315            if ( '' === $part ) {
     1316                continue;
     1317            }
     1318            if ( '<' === $part[0] ) {
     1319                if ( !preg_match( $allowed_tags_regex, $part ) ) {
     1320                    // Use htmlspecialchars with double_encode=false to avoid double escaping existing entities.
     1321                    $part = htmlspecialchars(
     1322                        $part,
     1323                        ENT_QUOTES,
     1324                        'UTF-8',
     1325                        false
     1326                    );
     1327                }
     1328            } else {
     1329                $part = htmlspecialchars(
     1330                    $part,
     1331                    ENT_QUOTES,
     1332                    'UTF-8',
     1333                    false
     1334                );
     1335            }
     1336            // Asana specifically requests &apos; for single quotes in rich text.
     1337            $part = str_replace( '&#039;', '&apos;', $part );
     1338        }
     1339        $html_task_notes = implode( '', $parts );
    13031340        // array of gid strings -> convert to individual string with for-each later.
    13041341        $this->log_debug( __METHOD__ . '() - getting assignees.' );
     
    13211358                    'name'       => $processed_task_name,
    13221359                    'tags'       => $tags_gid,
    1323                     'html_notes' => $task_notes,
     1360                    'html_notes' => $html_task_notes,
    13241361                    'assignee'   => $current_assignee,
    13251362                    'projects'   => $projects,
     
    13861423                }
    13871424                $collaborators_array = implode( ',', $collaborators_array );
    1388                 $notes = "Automatic creation of the task failed for some or all of the assignees. The error given was \"{$error}\".\n\n" . "Please create the desired task with this information.\n" . "Task name = {$processed_task_name}\n" . "Task due date = {$processed_due_date}\n" . "Tags = {$tags_as_string}\n" . "Task description = {$task_notes}\n" . "Task assignees = {$assignees_array}\n" . "Projects = {$projects_array}\n" . "Collaborators = {$collaborators_array}\n";
     1425                $notes = "Automatic creation of the task failed for some or all of the assignees. The error given was \"{$error}\".\n\n" . "Please create the desired task with this information.\n" . "Task name = {$processed_task_name}\n" . "Task due date = {$processed_due_date}\n" . "Tags = {$tags_as_string}\n" . "Task description = {$plain_task_notes}\n" . "Task assignees = {$assignees_array}\n" . "Projects = {$projects_array}\n" . "Collaborators = {$collaborators_array}\n";
    13891426                $this->log_debug( __METHOD__ . '() - attempting to create backup task.' );
    13901427                $backup_task_result = $asana_client->tasks()->createTask( [
     
    16181655            ];
    16191656        }
    1620         $workflow_steps = [];
    1621         if ( class_exists( AdminShell::class ) ) {
    1622             $workflow_steps = AdminShell::get_workflow_steps_by_type( ['iawgf_create_task', 'iawgf_update_task'] );
    1623         }
     1657        $workflow_steps = SuiteCore::instance()->shell()->get_workflow_steps_by_type( ['iawgf_create_task', 'iawgf_update_task'] );
    16241658        // Use shared renderer: pass GF subview slug, short title for header, and our admin_post action for toggling.
    1625         AdminShell::render_feeds_list(
     1659        SuiteCore::instance()->shell()->render_feeds_list(
    16261660            $feeds_and_forms,
    16271661            $this->_slug,
     
    16391673    public function handle_toggle_feed() {
    16401674        // Delegate to the shared processor (capability + nonce checks + DB flip + redirect)
    1641         AdminShell::process_feed_toggle( 'iawgf_toggle_feed', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
     1675        SuiteCore::instance()->shell()->process_feed_toggle( 'iawgf_toggle_feed', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
    16421676    }
    16431677
     
    16481682     */
    16491683    public function handle_toggle_workflow_step() {
    1650         AdminShell::process_feed_toggle( 'iawgf_toggle_workflow_step', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
     1684        SuiteCore::instance()->shell()->process_feed_toggle( 'iawgf_toggle_workflow_step', 'admin.php?page=' . $this->_slug . '&tab=feeds' );
    16511685    }
    16521686
     
    16581692     */
    16591693    public function gops_render_help() {
    1660         AdminShell::render_help_tab( [
     1694        SuiteCore::instance()->shell()->render_help_tab( [
    16611695            'Plugin page'            => 'https://brightleafdigital.io/asana-gravity-forms/',
    16621696            'Docs'                   => 'https://brightleafdigital.io/asana-gravity-forms/#docs',
     
    27292763     */
    27302764    private function get_freemius_tabs() {
    2731         $tabs = AdminShell::freemius_tabs( $this->_slug );
     2765        $tabs = SuiteCore::instance()->shell()->freemius_tabs( $this->_slug );
    27322766        if ( !iawgf_fs()->is_registered() ) {
    27332767            unset($tabs['account']);
  • integrate-asana-with-gravity-forms/trunk/integrate-asana-with-gravity-forms.php

    r3451305 r3464233  
    55 * Plugin URI: https://brightleafdigital.io//asana-gravity-forms/
    66 * Description: Allows you to create Asana tasks directly from your forms.
    7  * Version: 1.6.17
     7 * Version: 1.6.18
    88 * Author: BrightLeaf Digital
    99 * Author URI: https://brightleafdigital.io/
     
    1414 * @package IntegrateAsanaGravityForms
    1515 */
    16 use function IAWGF\GravityOps\Core\Admin\gravityops_shell;
     16use IAWGF\GravityOps\Core\SuiteCore\SuiteCore;
    1717if ( !defined( 'ABSPATH' ) ) {
    1818    exit;
    1919    // Exit if accessed directly.
    2020}
     21define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_VERSION', '1.6.18' );
     22define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    2123require_once __DIR__ . '/vendor/autoload.php';
    2224if ( file_exists( __DIR__ . '/vendor/IAWGF/autoload.php' ) ) {
    2325    require_once __DIR__ . '/vendor/IAWGF/autoload.php';
    2426}
    25 // Instantiate this plugin's copy of the AdminShell early so provider negotiation can happen on plugins_loaded.
     27// Register this plugin with SuiteCore early so the latest provider can be selected.
    2628add_action( 'plugins_loaded', function () {
    27     gravityops_shell();
     29    $assets_base_url = '';
     30    if ( file_exists( __DIR__ . '/vendor/IAWGF/gravityops/core/assets/' ) ) {
     31        $assets_base_url = plugins_url( 'vendor/IAWGF/gravityops/core/assets/', __FILE__ );
     32    } else {
     33        $assets_base_url = plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
     34    }
     35    SuiteCore::register( [
     36        'assets_base_url' => $assets_base_url,
     37    ] );
    2838}, 1 );
    29 // Ensure GravityOps admin assets resolve from this plugin's vendor path when the library is vendor-installed.
    30 add_filter( 'gravityops_assets_base_url', function ( $url ) {
    31     if ( $url ) {
    32         return $url;
    33     }
    34     if ( file_exists( __DIR__ . '/vendor/IAWGF/gravityops/core/assets/' ) ) {
    35         return plugins_url( 'vendor/IAWGF/gravityops/core/assets/', __FILE__ );
    36     }
    37     return plugins_url( 'vendor/gravityops/core/assets/', __FILE__ );
    38 } );
    3939if ( function_exists( 'iawgf_fs' ) ) {
    4040    iawgf_fs()->set_basename( false, __FILE__ );
     
    8282        do_action( 'iawgf_fs_loaded' );
    8383    }
    84     define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_VERSION', '1.6.17' );
    85     define( 'INTEGRATE_ASANA_WITH_GRAVITY_FORMS_BASENAME', plugin_basename( __FILE__ ) );
    8684    add_action( 'admin_notices', function () {
    8785        if ( !class_exists( 'GFForms' ) ) {
  • integrate-asana-with-gravity-forms/trunk/readme.txt

    r3451305 r3464233  
    22Tested up to: 6.9
    33Tags: GravityForms, Asana, integration, task management, automation
    4 Stable tag: 1.6.17
     4Stable tag: 1.6.18
    55Requires PHP: 7.4
    66License: GPLv2 or later
     
    8080== Changelog ==
    8181
     82= 1.6.18 | Feb 18, 2026 =
     83- Fixed uninstall process to properly clear everything
     84- Updated core GravityOps library to improve the update plugin process among other small fixes
     85- Fixed an issue with the Create Task workflow step running also on form submission
     86- Enhanced processing of task description to account for some edge cases where it wouldn't show properly or would cause the task creation to fail
     87
    8288= 1.6.17 | Jan 31, 2026 =
    8389* Fixed an issue with the save settings button sometimes not showing on the 2nd pg of the integration wizard
     
    96102* Fixed a bug in the new admin menu
    97103
    98 = 1.6.13 =
    99 * New GravityOps admin page with clearer Overview/Connection/Feeds/Help sections.
    100 * Quickly turn feeds on/off right from the Feeds list.
    101 * Improved setup and authorization guidance, especially after site moves or restores.
    102 * General polish and reliability improvements.
    103 
    104104= For the full changelog please visit [our website] (https://brightleafdigital.io/docs/changelog/). =
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/autoload.php

    r3451305 r3464233  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb::getLoader();
     22return ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f::getLoader();
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/autoload_classmap.php

    r3444396 r3464233  
    2626    'IAWGF\\BrightleafDigital\\Http\\AsanaApiClient' => $vendorDir . '/brightleaf-digital/asana-client/src/Http/AsanaApiClient.php',
    2727    'IAWGF\\BrightleafDigital\\Utils\\CryptoUtils' => $vendorDir . '/brightleaf-digital/asana-client/src/Utils/CryptoUtils.php',
    28     'IAWGF\\GravityOps\\Core\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/Admin/AdminShell.php',
    29     'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/Admin/ReviewPrompter.php',
    30     'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader' => $vendorDir . '/gravityops/core/src/Admin/SettingsHeader.php',
    31     'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/Admin/SuiteMenu.php',
    32     'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/Admin/SurveyPrompter.php',
    33     'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/Admin/TrustedLogin.php',
    34     'IAWGF\\GravityOps\\Core\\SuiteRegistry' => $vendorDir . '/gravityops/core/src/SuiteRegistry.php',
     28    'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => $vendorDir . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     29    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     30    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     31    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     32    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     33    'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => $vendorDir . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     34    'IAWGF\\GravityOps\\Core\\SuiteCore\\Config' => $vendorDir . '/gravityops/core/src/SuiteCore/Config.php',
     35    'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     36    'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => $vendorDir . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    3537    'IAWGF\\GravityOps\\Core\\Traits\\SingletonTrait' => $vendorDir . '/gravityops/core/src/Traits/SingletonTrait.php',
    3638    'IAWGF\\GravityOps\\Core\\Utils\\AssetHelper' => $vendorDir . '/gravityops/core/src/Utils/AssetHelper.php',
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/autoload_files.php

    r3444396 r3464233  
    1010    '27af5cb5044b2ad00b632edd7d9fab23' => $vendorDir . '/symfony/deprecation-contracts/function.php',
    1111    '26801412a357618220713b6279bab007' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
    12     'ebe7f444078b8942da9be5cdfad48b69' => $vendorDir . '/gravityops/core/src/Admin/functions.php',
    1312);
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/autoload_real.php

    r3451305 r3464233  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb
     5class ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \IAWGF\Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit019f90907971e7ceb5d780b24aa8e1bb', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitef759e65b13922405ca10b3085d0b89f', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\IAWGF\Composer\Autoload\ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::getInitializer($loader));
     32        call_user_func(\IAWGF\Composer\Autoload\ComposerStaticInitef759e65b13922405ca10b3085d0b89f::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
    3535        $loader->register(true);
    3636
    37         $filesToLoad = \IAWGF\Composer\Autoload\ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$files;
     37        $filesToLoad = \IAWGF\Composer\Autoload\ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$files;
    3838        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3939            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/autoload_static.php

    r3451305 r3464233  
    55namespace IAWGF\Composer\Autoload;
    66
    7 class ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb
     7class ComposerStaticInitef759e65b13922405ca10b3085d0b89f
    88{
    99    public static $files = array (
     
    1111        '27af5cb5044b2ad00b632edd7d9fab23' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
    1212        '26801412a357618220713b6279bab007' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
    13         'ebe7f444078b8942da9be5cdfad48b69' => __DIR__ . '/..' . '/gravityops/core/src/Admin/functions.php',
    1413    );
    1514
     
    8988        'IAWGF\\BrightleafDigital\\Http\\AsanaApiClient' => __DIR__ . '/..' . '/brightleaf-digital/asana-client/src/Http/AsanaApiClient.php',
    9089        'IAWGF\\BrightleafDigital\\Utils\\CryptoUtils' => __DIR__ . '/..' . '/brightleaf-digital/asana-client/src/Utils/CryptoUtils.php',
    91         'IAWGF\\GravityOps\\Core\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/Admin/AdminShell.php',
    92         'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/ReviewPrompter.php',
    93         'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SettingsHeader.php',
    94         'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SuiteMenu.php',
    95         'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/Admin/SurveyPrompter.php',
    96         'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/Admin/TrustedLogin.php',
    97         'IAWGF\\GravityOps\\Core\\SuiteRegistry' => __DIR__ . '/..' . '/gravityops/core/src/SuiteRegistry.php',
     90        'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/AdminAssetHelper.php',
     91        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/AdminShell.php',
     92        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/ReviewPrompter.php',
     93        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SuiteMenu.php',
     94        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/SurveyPrompter.php',
     95        'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Admin/TrustedLogin.php',
     96        'IAWGF\\GravityOps\\Core\\SuiteCore\\Config' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/Config.php',
     97        'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCatalog.php',
     98        'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore' => __DIR__ . '/..' . '/gravityops/core/src/SuiteCore/SuiteCore.php',
    9899        'IAWGF\\GravityOps\\Core\\Traits\\SingletonTrait' => __DIR__ . '/..' . '/gravityops/core/src/Traits/SingletonTrait.php',
    99100        'IAWGF\\GravityOps\\Core\\Utils\\AssetHelper' => __DIR__ . '/..' . '/gravityops/core/src/Utils/AssetHelper.php',
     
    250251    {
    251252        return \Closure::bind(function () use ($loader) {
    252             $loader->prefixLengthsPsr4 = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$prefixLengthsPsr4;
    253             $loader->prefixDirsPsr4 = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$prefixDirsPsr4;
    254             $loader->classMap = ComposerStaticInit019f90907971e7ceb5d780b24aa8e1bb::$classMap;
     253            $loader->prefixLengthsPsr4 = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$prefixLengthsPsr4;
     254            $loader->prefixDirsPsr4 = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$prefixDirsPsr4;
     255            $loader->classMap = ComposerStaticInitef759e65b13922405ca10b3085d0b89f::$classMap;
    255256
    256257        }, null, ClassLoader::class);
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/installed.json

    r3451305 r3464233  
    5353        "2": {
    5454            "name": "gravityops/core",
    55             "version": "1.1.0",
    56             "version_normalized": "1.1.0.0",
     55            "version": "2.0.1",
     56            "version_normalized": "2.0.1.0",
    5757            "source": {
    5858                "type": "git",
    5959                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
    60                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
    61             },
    62             "dist": {
    63                 "type": "zip",
    64                 "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    65                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     60                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
     61            },
     62            "dist": {
     63                "type": "zip",
     64                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     65                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    6666                "shasum": ""
    6767            },
     
    7070                "trustedlogin/client": "^v1.9"
    7171            },
    72             "time": "2026-01-21T19:42:14+00:00",
     72            "time": "2026-02-18T09:47:24+00:00",
    7373            "type": "library",
    7474            "installation-source": "source",
     
    7676                "psr-4": {
    7777                    "IAWGF\\GravityOps\\Core\\": "src/"
    78                 },
    79                 "files": [
    80                     "src/Admin/functions.php"
    81                 ]
     78                }
    8279            },
    8380            "license": [
     
    707704        "11": {
    708705            "name": "symfony/deprecation-contracts",
    709             "version": "v3.6.0",
    710             "version_normalized": "3.6.0.0",
     706            "version": "v3.0.2",
     707            "version_normalized": "3.0.2.0",
    711708            "source": {
    712709                "type": "git",
    713710                "url": "https://github.com/symfony/deprecation-contracts.git",
    714                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
    715             },
    716             "dist": {
    717                 "type": "zip",
    718                 "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
    719                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
    720                 "shasum": ""
    721             },
    722             "require": {
    723                 "php": ">=8.1"
    724             },
    725             "time": "2024-09-25T14:21:43+00:00",
     711                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
     712            },
     713            "dist": {
     714                "type": "zip",
     715                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     716                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     717                "shasum": ""
     718            },
     719            "require": {
     720                "php": ">=8.0.2"
     721            },
     722            "time": "2022-01-02T09:55:41+00:00",
    726723            "type": "library",
    727724            "extra": {
     
    731728                },
    732729                "branch-alias": {
    733                     "dev-main": "3.6-dev"
     730                    "dev-main": "3.0-dev"
    734731                }
    735732            },
     
    757754            "homepage": "https://symfony.com",
    758755            "support": {
    759                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
     756                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
    760757            },
    761758            "funding": [
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/installed.php

    r3451305 r3464233  
    55    'pretty_version' => 'dev-main',
    66    'version' => 'dev-main',
    7     'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     7    'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    88    'type' => 'library',
    99    'install_path' => __DIR__ . '/../',
     
    2929    'gravityops/core' =>
    3030    array (
    31       'pretty_version' => '1.1.0',
    32       'version' => '1.1.0.0',
    33       'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     31      'pretty_version' => '2.0.1',
     32      'version' => '2.0.1.0',
     33      'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    3434      'type' => 'library',
    3535      'install_path' => __DIR__ . '/../gravityops/core',
     
    137137    'symfony/deprecation-contracts' =>
    138138    array (
    139       'pretty_version' => 'v3.6.0',
    140       'version' => '3.6.0.0',
    141       'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
     139      'pretty_version' => 'v3.0.2',
     140      'version' => '3.0.2.0',
     141      'reference' => '26954b3d62a6c5fd0ea8a2a00c0353a14978d05c',
    142142      'type' => 'library',
    143143      'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/composer/platform_check.php

    r3451305 r3464233  
    55$issues = array();
    66
    7 if (!(PHP_VERSION_ID >= 80100)) {
    8     $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.';
     7if (!(PHP_VERSION_ID >= 80002)) {
     8    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.2". You are running ' . PHP_VERSION . '.';
    99}
    1010
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/gravityops/core/assets/css/admin.css

    r3444396 r3464233  
    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 */
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/gravityops/core/assets/js/admin.js

    r3444396 r3464233  
    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() {
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/gravityops/core/composer.json

    r3444396 r3464233  
    1111    "psr-4": {
    1212      "GravityOps\\Core\\": "src/"
    13     },
    14     "files": [
    15       "src/Admin/functions.php"
    16     ]
     13    }
    1714  }
    1815}
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/symfony/deprecation-contracts/LICENSE

    r3451305 r3464233  
    1 Copyright (c) 2020-present Fabien Potencier
     1Copyright (c) 2020-2022 Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/symfony/deprecation-contracts/README.md

    r3451305 r3464233  
    2323`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.`
    2424
    25 While not recommended, the deprecation notices can be completely ignored by declaring an empty
     25While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty
    2626`function trigger_deprecation() {}` in your application.
  • integrate-asana-with-gravity-forms/trunk/vendor/IAWGF/symfony/deprecation-contracts/composer.json

    r3451305 r3464233  
    1616    ],
    1717    "require": {
    18         "php": ">=8.1"
     18        "php": ">=8.0.2"
    1919    },
    2020    "autoload": {
     
    2626    "extra": {
    2727        "branch-alias": {
    28             "dev-main": "3.6-dev"
     28            "dev-main": "3.0-dev"
    2929        },
    3030        "thanks": {
  • integrate-asana-with-gravity-forms/trunk/vendor/autoload.php

    r3451305 r3464233  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInitc04228858cdd17dea362251fa382d6d5::getLoader();
     22return ComposerAutoloaderInitb00a5d9582cdfedfa6ea11676daebf9d::getLoader();
  • integrate-asana-with-gravity-forms/trunk/vendor/composer/autoload_aliases.php

    r3444396 r3464233  
    1515    }
    1616
    17 }
    18 namespace GravityOps\Core\Admin {
    19     if(!function_exists('\\GravityOps\\Core\\Admin\\gravityops_shell')){
    20         function gravityops_shell(...$args) {
    21             return \IAWGF\GravityOps\Core\Admin\gravityops_shell(...func_get_args());
    22         }
    23     }
    2417}
    2518namespace GuzzleHttp {
     
    313306    ),
    314307  ),
    315   'GravityOps\\Core\\Admin\\AdminShell' =>
     308  'GravityOps\\Core\\SuiteCore\\Admin\\AdminShell' =>
    316309  array (
    317310    'type' => 'class',
    318311    'classname' => 'AdminShell',
    319312    'isabstract' => false,
    320     'namespace' => 'GravityOps\\Core\\Admin',
    321     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\AdminShell',
    322     'implements' =>
    323     array (
    324     ),
    325   ),
    326   'GravityOps\\Core\\Admin\\ReviewPrompter' =>
     313    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     314    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\AdminShell',
     315    'implements' =>
     316    array (
     317    ),
     318  ),
     319  'GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter' =>
    327320  array (
    328321    'type' => 'class',
    329322    'classname' => 'ReviewPrompter',
    330323    'isabstract' => false,
    331     'namespace' => 'GravityOps\\Core\\Admin',
    332     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\ReviewPrompter',
    333     'implements' =>
    334     array (
    335     ),
    336   ),
    337   'GravityOps\\Core\\Admin\\SettingsHeader' =>
    338   array (
    339     'type' => 'class',
    340     'classname' => 'SettingsHeader',
    341     'isabstract' => false,
    342     'namespace' => 'GravityOps\\Core\\Admin',
    343     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SettingsHeader',
    344     'implements' =>
    345     array (
    346     ),
    347   ),
    348   'GravityOps\\Core\\Admin\\SuiteMenu' =>
     324    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     325    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\ReviewPrompter',
     326    'implements' =>
     327    array (
     328    ),
     329  ),
     330  'GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu' =>
    349331  array (
    350332    'type' => 'class',
    351333    'classname' => 'SuiteMenu',
    352334    'isabstract' => false,
    353     'namespace' => 'GravityOps\\Core\\Admin',
    354     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SuiteMenu',
    355     'implements' =>
    356     array (
    357     ),
    358   ),
    359   'GravityOps\\Core\\Admin\\SurveyPrompter' =>
     335    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     336    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SuiteMenu',
     337    'implements' =>
     338    array (
     339    ),
     340  ),
     341  'GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter' =>
    360342  array (
    361343    'type' => 'class',
    362344    'classname' => 'SurveyPrompter',
    363345    'isabstract' => false,
    364     'namespace' => 'GravityOps\\Core\\Admin',
    365     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\SurveyPrompter',
    366     'implements' =>
    367     array (
    368     ),
    369   ),
    370   'GravityOps\\Core\\Admin\\TrustedLogin' =>
     346    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     347    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\SurveyPrompter',
     348    'implements' =>
     349    array (
     350    ),
     351  ),
     352  'GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin' =>
    371353  array (
    372354    'type' => 'class',
    373355    'classname' => 'TrustedLogin',
    374356    'isabstract' => false,
    375     'namespace' => 'GravityOps\\Core\\Admin',
    376     'extends' => 'IAWGF\\GravityOps\\Core\\Admin\\TrustedLogin',
    377     'implements' =>
    378     array (
    379     ),
    380   ),
    381   'GravityOps\\Core\\SuiteRegistry' =>
    382   array (
    383     'type' => 'class',
    384     'classname' => 'SuiteRegistry',
    385     'isabstract' => false,
    386     'namespace' => 'GravityOps\\Core',
    387     'extends' => 'IAWGF\\GravityOps\\Core\\SuiteRegistry',
     357    'namespace' => 'GravityOps\\Core\\SuiteCore\\Admin',
     358    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Admin\\TrustedLogin',
     359    'implements' =>
     360    array (
     361    ),
     362  ),
     363  'GravityOps\\Core\\SuiteCore\\AdminAssetHelper' =>
     364  array (
     365    'type' => 'class',
     366    'classname' => 'AdminAssetHelper',
     367    'isabstract' => false,
     368    'namespace' => 'GravityOps\\Core\\SuiteCore',
     369    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\AdminAssetHelper',
     370    'implements' =>
     371    array (
     372    ),
     373  ),
     374  'GravityOps\\Core\\SuiteCore\\Config' =>
     375  array (
     376    'type' => 'class',
     377    'classname' => 'Config',
     378    'isabstract' => false,
     379    'namespace' => 'GravityOps\\Core\\SuiteCore',
     380    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\Config',
     381    'implements' =>
     382    array (
     383    ),
     384  ),
     385  'GravityOps\\Core\\SuiteCore\\SuiteCatalog' =>
     386  array (
     387    'type' => 'class',
     388    'classname' => 'SuiteCatalog',
     389    'isabstract' => false,
     390    'namespace' => 'GravityOps\\Core\\SuiteCore',
     391    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCatalog',
     392    'implements' =>
     393    array (
     394    ),
     395  ),
     396  'GravityOps\\Core\\SuiteCore\\SuiteCore' =>
     397  array (
     398    'type' => 'class',
     399    'classname' => 'SuiteCore',
     400    'isabstract' => false,
     401    'namespace' => 'GravityOps\\Core\\SuiteCore',
     402    'extends' => 'IAWGF\\GravityOps\\Core\\SuiteCore\\SuiteCore',
    388403    'implements' =>
    389404    array (
  • integrate-asana-with-gravity-forms/trunk/vendor/composer/autoload_real.php

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

    r3451305 r3464233  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInitc04228858cdd17dea362251fa382d6d5
     7class ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d
    88{
    99    public static $files = array (
     
    1818    {
    1919        return \Closure::bind(function () use ($loader) {
    20             $loader->classMap = ComposerStaticInitc04228858cdd17dea362251fa382d6d5::$classMap;
     20            $loader->classMap = ComposerStaticInitb00a5d9582cdfedfa6ea11676daebf9d::$classMap;
    2121
    2222        }, null, ClassLoader::class);
  • integrate-asana-with-gravity-forms/trunk/vendor/composer/installed.json

    r3451305 r3464233  
    105105        {
    106106            "name": "gravityops/core",
    107             "version": "1.1.0",
    108             "version_normalized": "1.1.0.0",
     107            "version": "2.0.1",
     108            "version_normalized": "2.0.1.0",
    109109            "source": {
    110110                "type": "git",
    111111                "url": "git@github.com:BrightLeaf-Digital/gravityops.git",
    112                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e"
    113             },
    114             "dist": {
    115                 "type": "zip",
    116                 "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/cee27f55738670dc141b58af37d0feb74d4ce47e",
    117                 "reference": "cee27f55738670dc141b58af37d0feb74d4ce47e",
     112                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2"
     113            },
     114            "dist": {
     115                "type": "zip",
     116                "url": "https://api.github.com/repos/BrightLeaf-Digital/gravityops/zipball/2535a2a105334f0bac61b112d8707ba9bc6e18b2",
     117                "reference": "2535a2a105334f0bac61b112d8707ba9bc6e18b2",
    118118                "shasum": ""
    119119            },
     
    122122                "trustedlogin/client": "^v1.9"
    123123            },
    124             "time": "2026-01-21T19:42:14+00:00",
     124            "time": "2026-02-18T09:47:24+00:00",
    125125            "type": "library",
    126126            "installation-source": "source",
     
    717717        {
    718718            "name": "symfony/deprecation-contracts",
    719             "version": "v3.6.0",
    720             "version_normalized": "3.6.0.0",
     719            "version": "v3.0.2",
     720            "version_normalized": "3.0.2.0",
    721721            "source": {
    722722                "type": "git",
    723723                "url": "https://github.com/symfony/deprecation-contracts.git",
    724                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
    725             },
    726             "dist": {
    727                 "type": "zip",
    728                 "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
    729                 "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
    730                 "shasum": ""
    731             },
    732             "require": {
    733                 "php": ">=8.1"
    734             },
    735             "time": "2024-09-25T14:21:43+00:00",
     724                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
     725            },
     726            "dist": {
     727                "type": "zip",
     728                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     729                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
     730                "shasum": ""
     731            },
     732            "require": {
     733                "php": ">=8.0.2"
     734            },
     735            "time": "2022-01-02T09:55:41+00:00",
    736736            "type": "library",
    737737            "extra": {
     
    741741                },
    742742                "branch-alias": {
    743                     "dev-main": "3.6-dev"
     743                    "dev-main": "3.0-dev"
    744744                }
    745745            },
     
    763763            "homepage": "https://symfony.com",
    764764            "support": {
    765                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
     765                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
    766766            },
    767767            "funding": [
  • integrate-asana-with-gravity-forms/trunk/vendor/composer/installed.php

    r3451305 r3464233  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     6        'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    2323            'pretty_version' => 'dev-main',
    2424            'version' => 'dev-main',
    25             'reference' => 'd47e4e9f5c37121dd1b206ae16bd629dfbd7a709',
     25            'reference' => 'bf7d1a994d6e90d3b3f68d8469d1a1435f26023c',
    2626            'type' => 'library',
    2727            'install_path' => __DIR__ . '/../../',
     
    3939        ),
    4040        'gravityops/core' => array(
    41             'pretty_version' => '1.1.0',
    42             'version' => '1.1.0.0',
    43             'reference' => 'cee27f55738670dc141b58af37d0feb74d4ce47e',
     41            'pretty_version' => '2.0.1',
     42            'version' => '2.0.1.0',
     43            'reference' => '2535a2a105334f0bac61b112d8707ba9bc6e18b2',
    4444            'type' => 'library',
    4545            'install_path' => __DIR__ . '/../gravityops/core',
     
    138138        ),
    139139        'symfony/deprecation-contracts' => array(
    140             'pretty_version' => 'v3.6.0',
    141             'version' => '3.6.0.0',
    142             'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
     140            'pretty_version' => 'v3.0.2',
     141            'version' => '3.0.2.0',
     142            'reference' => '26954b3d62a6c5fd0ea8a2a00c0353a14978d05c',
    143143            'type' => 'library',
    144144            'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
  • integrate-asana-with-gravity-forms/trunk/vendor/composer/platform_check.php

    r3451305 r3464233  
    2020        }
    2121    }
    22     trigger_error(
    23         'Composer detected issues in your platform: ' . implode(' ', $issues),
    24         E_USER_ERROR
     22    throw new \RuntimeException(
     23        'Composer detected issues in your platform: ' . implode(' ', $issues)
    2524    );
    2625}
Note: See TracChangeset for help on using the changeset viewer.