diff --git a/.buildignore b/.buildignore index e3e90448..c199bf70 100644 --- a/.buildignore +++ b/.buildignore @@ -32,3 +32,4 @@ tsconfig.json .wp-env.json .phpunit.result.cache temp-changelog-from-readme.txt +.vscode/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..74b0ac78 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "phpcs.standard": "./phpcs.xml", + "phpcs.executablePath": "vendor/bin/phpcs", + "phpcbf.executablePath": "vendor/bin/phpcbf", + "phpcs.enable": true, + "phpcbf.enable": true, + "phpcs.showSources": true +} \ No newline at end of file diff --git a/composer.json b/composer.json index dc89ea2f..da76fc57 100644 --- a/composer.json +++ b/composer.json @@ -3,23 +3,23 @@ "require-dev": { "squizlabs/php_codesniffer": "^3.6", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", - "wp-coding-standards/wpcs": "^2.3", - "phpunit/phpunit": "9.5.14", - "elementor/elementor-editor-testing": "0.0.3", - "yoast/phpunit-polyfills": "^1.0.1" - }, - "require": { - "elementor/wp-notifications-package": "1.2.*" - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - }, + "wp-coding-standards/wpcs": "^2.3", + "phpunit/phpunit": "9.5.14", + "elementor/elementor-editor-testing": "0.0.3", + "yoast/phpunit-polyfills": "^1.0.1" + }, + "require": { + "elementor/wp-notifications-package": "1.2.*" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, "scripts": { - "lint": "phpcs --extensions=php -p", - "lint:fix": "vendor/bin/phpcbf --ignore=node_modules,vendor,build .", - "test": "phpunit --testsuite hello-elementor", - "test:install": "bash ./bin/install-wp-tests-local.sh" + "lint": "phpcs --extensions=php --standard=./phpcs.xml --ignore=node_modules,vendor,assets,tmp -p .", + "lint:fix": "vendor/bin/phpcbf --extensions=php --standard=./phpcs.xml --ignore=node_modules,vendor,assets,tmp .", + "test": "phpunit --testsuite hello-elementor", + "test:install": "bash ./bin/install-wp-tests-local.sh" } -} +} \ No newline at end of file diff --git a/modules/admin-home/assets/js/hello-elementor-conversion-banner.js b/modules/admin-home/assets/js/hello-elementor-conversion-banner.js index ccd203de..5f13d414 100644 --- a/modules/admin-home/assets/js/hello-elementor-conversion-banner.js +++ b/modules/admin-home/assets/js/hello-elementor-conversion-banner.js @@ -20,21 +20,21 @@ document.addEventListener( 'DOMContentLoaded', () => { const container = document.getElementById( 'ehe-admin-cb' ); if ( container ) { - let headerEnd = document.querySelector( '.wp-header-end' ); - - if ( ! headerEnd ) { - headerEnd = document.querySelector( '.wrap h1, .wrap h2' ); - } + const { beforeWrap = false } = window.ehe_cb; + const { selector, before = false } = window.ehe_cb.data; + const headerEnd = document.querySelector( selector ); if ( headerEnd ) { - if ( window.ehe_cb.beforeWrap ) { + if ( beforeWrap ) { const wrapElement = document.querySelector( '.wrap' ); if ( wrapElement ) { wrapElement.insertAdjacentElement( 'beforebegin', container ); } - } else { - headerEnd.insertAdjacentElement( 'afterend', container ); - } + } else if ( before ) { + headerEnd.insertAdjacentElement( 'beforebegin', container ); + } else { + headerEnd.insertAdjacentElement( 'afterend', container ); + } } const root = createRoot( container ); diff --git a/modules/admin-home/components/conversion-banner.php b/modules/admin-home/components/conversion-banner.php index d2a444ca..72e09a86 100644 --- a/modules/admin-home/components/conversion-banner.php +++ b/modules/admin-home/components/conversion-banner.php @@ -11,6 +11,13 @@ class Conversion_Banner { + const DEFAULT_SELECTOR = '.wrap h1, .wrap h2'; + const SCRIPT_HANDLE = 'hello-conversion-banner'; + const NONCE_ACTION = 'ehe_cb_nonce'; + const OBJECT_NAME = 'ehe_cb'; + const USER_META_KEY = '_hello_elementor_install_notice'; + const AJAX_ACTION = 'ehe_dismiss_theme_notice'; + private function render_conversion_banner() { ?>
@@ -18,23 +25,144 @@ private function render_conversion_banner() { [ 'selector' => '#wpbody #wpbody-content .wrap h1' ], + 'update-core' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-post' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-category' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-post_tag' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'upload' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'media' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-page' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'elementor_page_elementor-settings' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-elementor_library' => [ + 'selector' => self::DEFAULT_SELECTOR, + 'before' => true, + ], + 'elementor_page_elementor-tools' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'elementor_page_elementor-role-manager' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'elementor_page_elementor-element-manager' => [ + 'selector' => '.wrap h1, .wrap h3.wp-heading-inline', + ], + 'elementor_page_elementor-system-info' => [ + 'selector' => '#wpbody #wpbody-content #elementor-system-info .elementor-system-info-header', + 'before' => true, + ], + 'elementor_library_page_e-floating-buttons' => [ + 'selector' => '#wpbody-content .e-landing-pages-empty, .wrap h2', + 'before' => true, + ], + 'edit-e-floating-buttons' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'edit-elementor_library_category' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'themes' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'nav-menus' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'theme-editor' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugins' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugin-install' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugin-editor' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'users' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'user' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'profile' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'tools' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'import' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'export' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'site-health' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'export-personal-data' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'erase-personal-data' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-general' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-writing' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-reading' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-discussion' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-media' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-permalink' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-privacy' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'privacy-policy-guide' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + ]; + } + + private function is_allowed_admin_page(): array { + $current_screen = get_current_screen(); + + if ( ! $current_screen ) { + return []; } - if ( Utils::has_pro() && Utils::is_elementor_active() ) { - return false; + $allowed_pages = $this->get_allowed_admin_pages(); + $current_page = $current_screen->id; + + return $allowed_pages[ $current_page ] ?? []; + } + + private function is_conversion_banner_active(): array { + if ( get_user_meta( get_current_user_id(), self::USER_META_KEY, true ) ) { + return []; } - $current_screen = get_current_screen(); + if ( Utils::has_pro() && Utils::is_elementor_active() ) { + return []; + } - return false === strpos( $current_screen->id ?? '', EHP_THEME_SLUG ); + return $this->is_allowed_admin_page(); } - private function enqueue_scripts() { + private function enqueue_scripts( array $conversion_banner_active ) { $script = new Script( - 'hello-conversion-banner', + self::SCRIPT_HANDLE, [ 'wp-util' ] ); @@ -43,29 +171,31 @@ private function enqueue_scripts() { $is_installing_plugin_with_uploader = 'upload-plugin' === filter_input( INPUT_GET, 'action', FILTER_UNSAFE_RAW ); wp_localize_script( - 'hello-conversion-banner', - 'ehe_cb', + self::SCRIPT_HANDLE, + self::OBJECT_NAME, [ - 'nonce' => wp_create_nonce( 'ehe_cb_nonce' ), + 'nonce' => wp_create_nonce( self::NONCE_ACTION ), 'beforeWrap' => $is_installing_plugin_with_uploader, + 'data' => $conversion_banner_active, ] ); } public function dismiss_theme_notice() { - check_ajax_referer( 'ehe_cb_nonce', 'nonce' ); + check_ajax_referer( self::NONCE_ACTION, 'nonce' ); - update_user_meta( get_current_user_id(), '_hello_elementor_install_notice', true ); + update_user_meta( get_current_user_id(), self::USER_META_KEY, true ); wp_send_json_success( [ 'message' => __( 'Notice dismissed.', 'hello-elementor' ) ] ); } public function __construct() { - add_action( 'wp_ajax_ehe_dismiss_theme_notice', [ $this, 'dismiss_theme_notice' ] ); + add_action( 'wp_ajax_' . self::AJAX_ACTION, [ $this, 'dismiss_theme_notice' ] ); add_action( 'current_screen', function () { - if ( ! $this->is_conversion_banner_active() ) { + $conversion_banner_active = $this->is_conversion_banner_active(); + if ( ! $conversion_banner_active ) { return; } @@ -73,8 +203,8 @@ public function __construct() { $this->render_conversion_banner(); }, 11 ); - add_action( 'admin_enqueue_scripts', function () { - $this->enqueue_scripts(); + add_action( 'admin_enqueue_scripts', function () use ( $conversion_banner_active ) { + $this->enqueue_scripts( $conversion_banner_active ); } ); } ); } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index f81de1b7..bbf96dbf 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -65,8 +65,8 @@ do_action('plugins_loaded'); -function initialize_elementor_plugin($plugin_class) -{ +function initialize_elementor_plugin($plugin_class){ + if (!class_exists($plugin_class)) { return null; } @@ -76,7 +76,5 @@ function initialize_elementor_plugin($plugin_class) $plugin_instance = initialize_elementor_plugin('Elementor\Plugin'); -$plugin_instance->initialize_container(); - do_action('init'); do_action('wp_loaded');