463 lines
22 KiB
PHP
463 lines
22 KiB
PHP
<?php
|
|
/**
|
|
* ==========================
|
|
* 🔐 IGNY8 FILE RULE HEADER
|
|
* ==========================
|
|
* @file : global-layout.php
|
|
* @location : /core/global-layout.php
|
|
* @type : Layout
|
|
* @scope : Global
|
|
* @allowed : HTML layout, CSS/JS includes, navigation rendering
|
|
* @reusability : Globally Reusable
|
|
* @notes : Master layout template for all admin pages
|
|
*/
|
|
|
|
|
|
// Prevent direct access
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
// Load helper functions
|
|
require_once plugin_dir_path(__FILE__) . 'admin/global-helpers.php';
|
|
|
|
// Evidence functions removed - no longer needed
|
|
|
|
// Component functions are loaded globally in igny8.php
|
|
|
|
// KPI configuration is loaded globally in igny8.php
|
|
|
|
// Load KPI data for header metrics based on current module/submodule
|
|
$kpi_data = [];
|
|
if (isset($GLOBALS['igny8_kpi_config']) && !empty($GLOBALS['igny8_kpi_config'])) {
|
|
$kpi_config = $GLOBALS['igny8_kpi_config'];
|
|
|
|
// Determine the table_id based on current module and submodule
|
|
$current_module = $GLOBALS['current_module'] ?? '';
|
|
$current_submodule = $GLOBALS['current_submodule'] ?? '';
|
|
$current_page = $_GET['page'] ?? '';
|
|
|
|
// Special handling for home pages
|
|
if ($current_page === 'igny8-planner' && empty($current_submodule)) {
|
|
$table_id = 'planner_home';
|
|
} elseif ($current_page === 'igny8-writer' && empty($current_submodule)) {
|
|
$table_id = 'writer_home';
|
|
} elseif (!empty($current_module) && !empty($current_submodule)) {
|
|
$table_id = $current_module . '_' . $current_submodule;
|
|
} else {
|
|
$table_id = '';
|
|
}
|
|
|
|
// Load KPI data if configuration exists for this table
|
|
if (!empty($table_id) && isset($kpi_config[$table_id])) {
|
|
$kpi_data = igny8_get_kpi_data_safe($table_id, $kpi_config[$table_id]);
|
|
}
|
|
}
|
|
?>
|
|
<div class="igny8-page-wrapper">
|
|
|
|
<!-- SIDEBAR SECTION -->
|
|
<aside class="igny8-sidebar">
|
|
<!-- LOGO / BRAND -->
|
|
<div class="igny8-sidebar-logo">
|
|
<h2>IGNY8 AI SEO</h2>
|
|
</div>
|
|
|
|
<!-- VERSION BADGE -->
|
|
<div class="igny8-version-badge">
|
|
<span class="igny8-badge igny8-btn-danger">v<?php echo get_plugin_data(plugin_dir_path(__FILE__) . '../igny8.php')['Version']; ?></span>
|
|
</div>
|
|
|
|
<!-- BREADCRUMB NAVIGATION -->
|
|
<div class="igny8-breadcrumb">
|
|
<?php echo igny8_render_breadcrumb(); ?>
|
|
</div>
|
|
|
|
<!-- DEBUG STATUS CIRCLES (submodule pages only) -->
|
|
<?php
|
|
$is_debug_enabled = defined('WP_DEBUG') && WP_DEBUG;
|
|
$is_monitoring_enabled = get_option('igny8_debug_enabled', false);
|
|
$is_submodule_page = !empty($_GET['sm']) || !empty($GLOBALS['current_submodule']);
|
|
|
|
if ($is_debug_enabled && $is_monitoring_enabled && $is_submodule_page):
|
|
// Simple debug circles - will be updated by JavaScript based on actual debug card states
|
|
$debug_circles = [
|
|
'database' => ['title' => 'Database', 'status' => 'secondary'],
|
|
'table' => ['title' => 'Table', 'status' => 'secondary'],
|
|
'filters' => ['title' => 'Filters', 'status' => 'secondary'],
|
|
'forms' => ['title' => 'Forms', 'status' => 'secondary'],
|
|
'automation' => ['title' => 'Automation', 'status' => 'secondary'],
|
|
'ai_logs' => ['title' => 'AI Logs', 'status' => 'secondary']
|
|
];
|
|
?>
|
|
<div class="igny8-sidebar-status-bar" style="padding: 12px 16px; border-bottom: 1px solid var(--border);">
|
|
<div class="igny8-status-row">
|
|
<div class="igny8-flex" style="justify-content: center; gap: 8px;">
|
|
<?php foreach ($debug_circles as $circle_key => $circle_data): ?>
|
|
<div class="bg-circle-sm bg-<?php echo esc_attr($circle_data['status']); ?> igny8-debug-circle" data-component="<?php echo esc_attr($circle_key); ?>" title="<?php echo esc_attr($circle_data['title']); ?>"></div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<!-- MAIN NAVIGATION -->
|
|
<nav class="igny8-sidebar-nav">
|
|
<?php
|
|
$current_page = $_GET['page'] ?? '';
|
|
$home_active = ($current_page === 'igny8-home') ? 'active' : '';
|
|
$settings_active = (strpos($current_page, 'igny8-settings') !== false) ? 'active' : '';
|
|
$help_active = (strpos($current_page, 'igny8-help') !== false) ? 'active' : '';
|
|
|
|
// Always show home, settings, and help
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-home'); ?>" class="igny8-sidebar-link <?php echo $home_active; ?>">
|
|
<span class="dashicons dashicons-dashboard"></span>
|
|
<span class="label">Igny8 Home</span>
|
|
</a>
|
|
|
|
<?php
|
|
// Show modules only if they are enabled
|
|
if (function_exists('igny8_is_module_enabled')) {
|
|
// Main modules
|
|
if (igny8_is_module_enabled('planner')) {
|
|
$planner_active = (strpos($current_page, 'igny8-planner') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-planner'); ?>" class="igny8-sidebar-link <?php echo $planner_active; ?>">
|
|
<span class="dashicons dashicons-tag"></span>
|
|
<span class="label">Planner</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
if (igny8_is_module_enabled('writer')) {
|
|
$writer_active = (strpos($current_page, 'igny8-writer') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-writer'); ?>" class="igny8-sidebar-link <?php echo $writer_active; ?>">
|
|
<span class="dashicons dashicons-edit"></span>
|
|
<span class="label">Writer</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
if (igny8_is_module_enabled('linker')) {
|
|
$linker_active = (strpos($current_page, 'igny8-linker') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-linker'); ?>" class="igny8-sidebar-link <?php echo $linker_active; ?>">
|
|
<span class="dashicons dashicons-admin-links"></span>
|
|
<span class="label">Linker</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
if (igny8_is_module_enabled('personalize')) {
|
|
$personalize_active = (strpos($current_page, 'igny8-personalize') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-personalize'); ?>" class="igny8-sidebar-link <?php echo $personalize_active; ?>">
|
|
<span class="dashicons dashicons-admin-customizer"></span>
|
|
<span class="label">Personalize</span>
|
|
</a>
|
|
<div class="igny8-sidebar-divider"></div> <?php
|
|
}
|
|
|
|
?>
|
|
|
|
<?php
|
|
// Thinker before schedules
|
|
if (igny8_is_module_enabled('thinker')) {
|
|
$thinker_active = (strpos($current_page, 'igny8-thinker') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-thinker'); ?>" class="igny8-sidebar-link <?php echo $thinker_active; ?>">
|
|
<span class="dashicons dashicons-lightbulb"></span>
|
|
<span class="label">Thinker</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
// Admin modules
|
|
if (igny8_is_module_enabled('schedules')) {
|
|
$schedules_active = (strpos($current_page, 'igny8-schedules') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-schedules'); ?>" class="igny8-sidebar-link <?php echo $schedules_active; ?>">
|
|
<span class="dashicons dashicons-calendar-alt"></span>
|
|
<span class="label">Schedules</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
|
|
// Analytics before Settings
|
|
if (igny8_is_module_enabled('analytics')) {
|
|
$analytics_active = (strpos($current_page, 'igny8-analytics') !== false) ? 'active' : '';
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-analytics'); ?>" class="igny8-sidebar-link <?php echo $analytics_active; ?>">
|
|
<span class="dashicons dashicons-chart-line"></span>
|
|
<span class="label">Analytics</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
|
|
} else {
|
|
// Fallback: show all modules if module manager is not available
|
|
?>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-planner'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-planner') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-tag"></span>
|
|
<span class="label">Planner</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-writer'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-writer') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-edit"></span>
|
|
<span class="label">Writer</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-optimizer'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-optimizer') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-performance"></span>
|
|
<span class="label">Optimizer</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-linker'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-linker') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-admin-links"></span>
|
|
<span class="label">Linker</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-personalize'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-personalize') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-admin-customizer"></span>
|
|
<span class="label">Personalize</span>
|
|
</a>
|
|
|
|
<div class="igny8-sidebar-divider"></div>
|
|
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-thinker'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-thinker') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-lightbulb"></span>
|
|
<span class="label">Thinker</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-schedules'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-schedules') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-calendar-alt"></span>
|
|
<span class="label">Schedules</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-analytics'); ?>" class="igny8-sidebar-link <?php echo (strpos($current_page, 'igny8-analytics') !== false) ? 'active' : ''; ?>">
|
|
<span class="dashicons dashicons-chart-line"></span>
|
|
<span class="label">Analytics</span>
|
|
</a>
|
|
<?php
|
|
}
|
|
?>
|
|
|
|
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-settings'); ?>" class="igny8-sidebar-link <?php echo $settings_active; ?>">
|
|
<span class="dashicons dashicons-admin-generic"></span>
|
|
<span class="label">Settings</span>
|
|
</a>
|
|
<a href="<?php echo admin_url('admin.php?page=igny8-help'); ?>" class="igny8-sidebar-link <?php echo $help_active; ?>">
|
|
<span class="dashicons dashicons-sos"></span>
|
|
<span class="label">Help</span>
|
|
</a>
|
|
</nav>
|
|
|
|
<div class="igny8-sidebar-divider"></div>
|
|
|
|
|
|
<!-- JavaScript to update sidebar debug circles based on debug card states -->
|
|
<?php if ($is_debug_enabled && $is_monitoring_enabled && $is_submodule_page): ?>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Function to update sidebar debug circles based on debug card states
|
|
function updateSidebarDebugCircles() {
|
|
const circles = document.querySelectorAll('.igny8-debug-circle');
|
|
|
|
circles.forEach(circle => {
|
|
const component = circle.getAttribute('data-component');
|
|
let matchingCard = null;
|
|
|
|
if (component === 'ai_logs') {
|
|
// Special handling for AI logs - it's in the automation section
|
|
const debugCards = document.querySelectorAll('.igny8-debug-item');
|
|
debugCards.forEach(card => {
|
|
const cardText = card.textContent.toLowerCase();
|
|
if (cardText.includes('ai logs') || cardText.includes('ai_logs')) {
|
|
matchingCard = card;
|
|
}
|
|
});
|
|
} else {
|
|
// Regular handling for other components
|
|
const debugCards = document.querySelectorAll('.igny8-debug-item');
|
|
debugCards.forEach(card => {
|
|
const cardText = card.textContent.toLowerCase();
|
|
const componentName = component.toLowerCase();
|
|
|
|
if (cardText.includes(componentName)) {
|
|
matchingCard = card;
|
|
}
|
|
});
|
|
}
|
|
|
|
if (matchingCard) {
|
|
// Get the status from the background color
|
|
const bgColor = matchingCard.style.backgroundColor;
|
|
let status = 'secondary'; // default
|
|
|
|
if (bgColor.includes('212, 237, 218') || bgColor.includes('rgb(212, 237, 218)')) { // success green
|
|
status = 'success';
|
|
} else if (bgColor.includes('255, 243, 205') || bgColor.includes('rgb(255, 243, 205)')) { // warning yellow
|
|
status = 'warning';
|
|
} else if (bgColor.includes('248, 215, 218') || bgColor.includes('rgb(248, 215, 218)')) { // error red
|
|
status = 'danger';
|
|
}
|
|
|
|
// Update circle classes
|
|
circle.className = `bg-circle-sm bg-${status} igny8-debug-circle`;
|
|
}
|
|
});
|
|
}
|
|
|
|
// Update circles when page loads
|
|
setTimeout(updateSidebarDebugCircles, 1000); // Wait for debug cards to load
|
|
|
|
// Update circles periodically to catch dynamic changes
|
|
setInterval(updateSidebarDebugCircles, 3000);
|
|
});
|
|
</script>
|
|
<?php endif; ?>
|
|
|
|
<!-- FOOTER SHORTCUTS -->
|
|
<div class="igny8-sidebar-footer-container">
|
|
<div class="igny8-sidebar-footer">
|
|
<a href="<?php echo admin_url('options-general.php'); ?>" class="igny8-sidebar-link">
|
|
<span class="dashicons dashicons-admin-generic"></span>
|
|
<span class="label">Settings</span>
|
|
</a>
|
|
<a href="<?php echo wp_logout_url(); ?>" class="igny8-sidebar-link">
|
|
<span class="dashicons dashicons-migrate"></span>
|
|
<span class="label">Logout</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- MAIN CONTAINER -->
|
|
<div class="igny8-main-area">
|
|
|
|
<!-- HEADER SECTION -->
|
|
<header class="igny8-header">
|
|
<!-- LEFT: Dynamic Submenu Navigation -->
|
|
<div class="igny8-header-left">
|
|
<div class="igny8-submenu">
|
|
<div class="igny8-submenu-buttons">
|
|
<?php echo igny8_render_submenu(); ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CENTER: Page Title & Description -->
|
|
<div class="igny8-header-center">
|
|
<div class="igny8-page-title">
|
|
<h1><?php
|
|
// Hardcoded page titles
|
|
$page_titles = [
|
|
'igny8-home' => 'Dashboard',
|
|
'igny8-planner' => 'Planner',
|
|
'igny8-writer' => 'Writer',
|
|
'igny8-thinker' => 'Thinker',
|
|
'igny8-analytics' => 'Analytics',
|
|
'igny8-settings' => 'Settings',
|
|
'igny8-schedules' => 'Schedules',
|
|
'igny8-help' => 'Help'
|
|
];
|
|
echo $page_titles[$current_page] ?? 'IGNY8 AI SEO';
|
|
?></h1>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- RIGHT: Metrics Bar + Icons -->
|
|
<div class="igny8-header-right">
|
|
<!-- Metrics - Compact Format -->
|
|
<div class="igny8-metrics-compact">
|
|
<?php
|
|
// Use the same KPI logic as before but inline
|
|
if (empty($kpi_data)) {
|
|
$max_fallback = ($current_module === 'planner') ? 4 : 6;
|
|
$all_fallback_metrics = [
|
|
|
|
['value' => 0, 'label' => 'Active', 'color' => 'green'],
|
|
['value' => 0, 'label' => 'Pending', 'color' => 'amber'],
|
|
['value' => 0, 'label' => 'Completed', 'color' => 'purple'],
|
|
['value' => 0, 'label' => 'Recent', 'color' => 'blue']
|
|
|
|
];
|
|
$fallback_metrics = array_slice($all_fallback_metrics, 0, $max_fallback);
|
|
|
|
foreach ($fallback_metrics as $metric):
|
|
?>
|
|
<div class="metric <?php echo $metric['color']; ?>">
|
|
<span class="val"><?php echo number_format($metric['value']); ?></span>
|
|
<span class="lbl"><?php echo $metric['label']; ?></span>
|
|
</div>
|
|
<?php
|
|
endforeach;
|
|
} else {
|
|
// Get metrics - 4 for planner pages, 6 for others
|
|
$max_metrics = ($current_module === 'planner') ? 4 : 6;
|
|
$metrics = array_slice($kpi_data, 0, $max_metrics, true);
|
|
$color_map = ['', 'green', 'amber', 'purple', 'blue', 'teal'];
|
|
$color_index = 0;
|
|
|
|
foreach ($metrics as $metric_key => $metric_value):
|
|
$kpi_config = $GLOBALS['igny8_kpi_config'] ?? [];
|
|
$color = '';
|
|
if (isset($kpi_config[$table_id][$metric_key]['color'])) {
|
|
$color = $kpi_config[$table_id][$metric_key]['color'];
|
|
} else {
|
|
$color = $color_map[$color_index] ?? '';
|
|
}
|
|
|
|
$label = $metric_key;
|
|
if (isset($kpi_config[$table_id][$metric_key]['label'])) {
|
|
$label = $kpi_config[$table_id][$metric_key]['label'];
|
|
}
|
|
?>
|
|
<div class="metric <?php echo $color; ?>">
|
|
<span class="val"><?php echo number_format($metric_value); ?></span>
|
|
<span class="lbl"><?php echo $label; ?></span>
|
|
</div>
|
|
<?php
|
|
$color_index++;
|
|
endforeach;
|
|
}
|
|
?>
|
|
</div>
|
|
|
|
<!-- Header User Icon -->
|
|
<div class="igny8-header-icons">
|
|
<span class="dashicons dashicons-admin-users" title="User"></span>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- MAIN CONTENT AREA -->
|
|
<main class="igny8-content">
|
|
<?php echo $igny8_page_content ?? '<p>No content provided.</p>'; ?>
|
|
|
|
<!-- MODULE DEBUG SECTION (conditional based on toggle and submodule pages) -->
|
|
<?php
|
|
// Only show module debug if:
|
|
// 1. WP_DEBUG is enabled
|
|
// 2. Debug monitoring toggle is enabled
|
|
// 3. We're on a submodule page (not home page)
|
|
$is_debug_enabled = defined('WP_DEBUG') && WP_DEBUG;
|
|
$is_monitoring_enabled = get_option('igny8_debug_enabled', false);
|
|
$is_submodule_page = !empty($_GET['sm']) || !empty($GLOBALS['current_submodule']);
|
|
|
|
if ($is_debug_enabled && $is_monitoring_enabled && $is_submodule_page) {
|
|
require_once plugin_dir_path(__FILE__) . '../debug/module-debug.php';
|
|
$debug_content = igny8_get_module_debug_content();
|
|
if (!empty($debug_content)) {
|
|
echo $debug_content;
|
|
}
|
|
}
|
|
?>
|
|
</main>
|
|
|
|
<!-- FOOTER SECTION -->
|
|
<footer class="igny8-footer">
|
|
<div class="igny8-footer-content">
|
|
<span>© <?php echo date('Y'); ?> Igny8 Plugin</span>
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
</div>
|