/** * Tractatus Admin Navbar Component * Hamburger menu with organized admin page groups */ (function() { 'use strict'; class AdminNavbar { constructor() { this.mobileMenuOpen = false; this.adminUser = JSON.parse(localStorage.getItem('admin_user') || '{}'); this.adminName = this.adminUser.name || this.adminUser.email || 'Admin'; this.init(); } init() { const container = document.getElementById('admin-navbar'); if (!container) return; const pageTitle = container.dataset.pageTitle || 'Admin'; const pageIcon = container.dataset.pageIcon || 'default'; this.render(container, pageTitle, pageIcon); this.attachEventListeners(); } getIcon(iconType) { const icons = { default: '', calendar: '', dashboard: '', blog: '', analytics: '', server: '' }; return icons[iconType] || icons.default; } render(container, pageTitle, pageIcon) { const iconSvg = this.getIcon(pageIcon); container.innerHTML = ` `; } attachEventListeners() { const menuBtn = document.getElementById('admin-menu-btn'); const menu = document.getElementById('admin-menu'); const menuPanel = document.getElementById('admin-menu-panel'); const closeBtn = document.getElementById('admin-menu-close-btn'); const backdrop = document.getElementById('admin-menu-backdrop'); const logoutBtn = document.getElementById('admin-logout-btn'); if (menuBtn && menu && menuPanel) { menuBtn.addEventListener('click', () => this.openMenu(menu, menuPanel)); closeBtn.addEventListener('click', () => this.closeMenu(menu, menuPanel)); backdrop.addEventListener('click', () => this.closeMenu(menu, menuPanel)); } if (logoutBtn) { logoutBtn.addEventListener('click', () => { localStorage.removeItem('admin_token'); localStorage.removeItem('admin_user'); window.location.href = '/admin/login.html'; }); } } openMenu(menu, panel) { menu.classList.remove('hidden'); // Force reflow panel.offsetHeight; panel.classList.remove('translate-x-full'); this.mobileMenuOpen = true; } closeMenu(menu, panel) { panel.classList.add('translate-x-full'); setTimeout(() => { menu.classList.add('hidden'); }, 300); this.mobileMenuOpen = false; } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => new AdminNavbar()); } else { new AdminNavbar(); } })();