diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index d7f7c3a..e6ede02 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -155,6 +155,7 @@ class EMCP_Tools_Admin { 'tools' => 'dashicons-admin-tools', 'history' => 'dashicons-undo', 'redirects' => 'dashicons-randomize', + 'migrate' => 'dashicons-migrate', 'modules' => 'dashicons-screenoptions', 'connection' => 'dashicons-admin-links', 'ai-chat' => 'dashicons-format-chat', @@ -181,6 +182,7 @@ class EMCP_Tools_Admin { self::PAGE_SLUG . '-ai-chat' => __( 'AI Chat', 'emcp-tools' ), self::PAGE_SLUG . '-context' => __( 'Context', 'emcp-tools' ), self::PAGE_SLUG . '-redirects' => __( 'Redirects', 'emcp-tools' ), + self::PAGE_SLUG . '-migrate' => __( 'Backup & Migrate', 'emcp-tools' ), self::PAGE_SLUG . '-memory' => __( 'Memory', 'emcp-tools' ), self::PAGE_SLUG . '-prompts' => __( 'Prompts', 'emcp-tools' ), self::PAGE_SLUG . '-templates' => __( 'Templates', 'emcp-tools' ), @@ -206,6 +208,10 @@ class EMCP_Tools_Admin { if ( ! $this->module_tab_visible( 'redirects' ) ) { unset( $this->submenus[ self::PAGE_SLUG . '-redirects' ] ); } + // Backup & Migrate tab is gated by the Migrate (Pro) module. + if ( ! $this->module_tab_visible( 'migrate' ) ) { + unset( $this->submenus[ self::PAGE_SLUG . '-migrate' ] ); + } // Module-backed tabs: drop each when its module is off/unavailable. foreach ( array( 'prompts', 'templates', 'brand-kits' ) as $emcp_mod_id ) { if ( ! $this->module_tab_visible( $emcp_mod_id ) ) { @@ -232,6 +238,8 @@ class EMCP_Tools_Admin { return 'history'; case self::PAGE_SLUG . '-redirects': return 'redirects'; + case self::PAGE_SLUG . '-migrate': + return 'migrate'; case self::PAGE_SLUG . '-modules': return 'modules'; case self::PAGE_SLUG . '-connection': @@ -3304,6 +3312,11 @@ class EMCP_Tools_Admin { include EMCP_TOOLS_DIR . 'includes/admin/views/page-history.php'; } elseif ( 'redirects' === $active_tab && $this->module_tab_visible( 'redirects' ) ) { include EMCP_TOOLS_DIR . 'includes/admin/views/page-redirects.php'; + } elseif ( 'migrate' === $active_tab && $this->module_tab_visible( 'migrate' ) ) { + $emcp_migrate_view = EMCP_Tools_Pro_Loader::path( 'includes/admin/views/page-migrate.php' ); + if ( '' !== $emcp_migrate_view ) { + include $emcp_migrate_view; + } } elseif ( 'widgets' === $active_tab ) { include EMCP_TOOLS_DIR . 'includes/admin/views/page-widgets.php'; } elseif ( 'marketplace' === $active_tab ) { diff --git a/includes/class-pro-loader.php b/includes/class-pro-loader.php index 4276019..f564377 100644 --- a/includes/class-pro-loader.php +++ b/includes/class-pro-loader.php @@ -251,5 +251,13 @@ final class EMCP_Tools_Pro_Loader { $registry->register( new EMCP_Tools_Memory_Module() ); } } + + $migrate_path = self::path( 'includes/modules/class-migrate-module.php' ); + if ( '' !== $migrate_path ) { + require_once $migrate_path; + if ( class_exists( 'EMCP_Tools_Migrate_Module' ) ) { + $registry->register( new EMCP_Tools_Migrate_Module() ); + } + } } } diff --git a/phpunit.xml b/phpunit.xml index b307954..70adfbf 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -140,6 +140,9 @@ pro/tests/unit/Cloud + + pro/tests/unit/migrate + diff --git a/pro b/pro index 07144e7..7c3ba37 160000 --- a/pro +++ b/pro @@ -1 +1 @@ -Subproject commit 07144e73ae87c421c1c35ad96d5a3ebfedf37f92 +Subproject commit 7c3ba37e720015c604cf83877cc4008c9879c8bc diff --git a/pro-manifest.txt b/pro-manifest.txt index 648f3d6..e32acb6 100644 --- a/pro-manifest.txt +++ b/pro-manifest.txt @@ -71,3 +71,11 @@ includes/abilities/class-generateblocks-integration.php includes/blocks-catalog/class-blocksy-blocks-catalog.php includes/abilities/class-blocksy-blocks-integration.php includes/abilities/class-blocksy-extensions-integration.php + +# Backup & Migrate module (Pro) — Phase 1 +includes/modules/class-migrate-module.php +includes/admin/views/page-migrate.php +includes/admin/views/migrate +includes/migrate +assets/js/migrate.js +assets/css/migrate.css