diff --git a/js/layout.js b/js/layout.js index 6db1cca..6551a83 100644 --- a/js/layout.js +++ b/js/layout.js @@ -10,20 +10,19 @@ document.addEventListener("DOMContentLoaded", async () => { return; } - // 2. Cargar Componentes HTML - await loadComponent("sidebar-container", "sidebar.html"); + // 2. Generar Sidebar (Con los nuevos enlaces) + renderSidebar(); + + // 3. Cargar Header (Mantenemos carga externa para la cabecera) await loadComponent("header-container", "header.html"); - // 3. Inicializar Iconos + // 4. Inicializar Iconos if (window.lucide) lucide.createIcons(); - // 4. Lógica del Usuario (Header) + // 5. Lógica del Usuario (Header) setupUserInfo(token); - // 5. Marcar enlace activo (Sidebar) - highlightActiveLink(); - - // 6. Configurar Logout + // 6. Configurar Logout (Ahora manejado dentro de renderSidebar para asegurar que existe el botón) const btnLogout = document.getElementById("globalBtnLogout"); if(btnLogout) { btnLogout.addEventListener("click", () => { @@ -33,7 +32,67 @@ document.addEventListener("DOMContentLoaded", async () => { } }); -// Función para cargar HTML externo +// --- GENERADOR DE SIDEBAR (NUEVO) --- +function renderSidebar() { + const container = document.getElementById('sidebar-container'); + if (!container) return; + + // Detectar página actual + const path = window.location.pathname.split("/").pop() || "index.html"; + + // DEFINICIÓN DE MENÚ (Aquí añadimos Calendario y Automatizaciones) + const menuItems = [ + { name: "Servicios", link: "servicios.html", icon: "briefcase" }, + { name: "Calendario", link: "calendario.html", icon: "calendar-days" }, // ✅ NUEVO + { name: "Clientes", link: "clientes.html", icon: "users" }, + { name: "Automatizaciones", link: "automatizaciones.html", icon: "zap" }, // ✅ NUEVO (Icono rayo) + { name: "Configuración", link: "configuracion.html", icon: "settings" }, + ]; + + // Construir HTML de los enlaces + const linksHtml = menuItems.map(item => { + const isActive = path === item.link; + // Estilos basados en tu diseño actual (Slate oscuro) + const baseClasses = "flex items-center gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 font-medium mb-1 text-sm"; + const activeClasses = "bg-blue-600 text-white shadow-lg shadow-blue-500/30"; + const inactiveClasses = "text-slate-400 hover:text-white hover:bg-slate-800"; + + return ` + + + ${item.name} + + `; + }).join(""); + + // Inyectar HTML completo del Sidebar + container.innerHTML = ` + + `; +} + +// --- FUNCIONES AUXILIARES --- + async function loadComponent(elementId, filePath) { try { const response = await fetch(filePath); @@ -41,14 +100,13 @@ async function loadComponent(elementId, filePath) { const html = await response.text(); document.getElementById(elementId).innerHTML = html; } else { - console.error(`Error cargando ${filePath}`); + console.warn(`No se pudo cargar ${filePath} (puede que no sea necesario si usas el sidebar generado)`); } } catch (e) { - console.error(e); + // Ignoramos errores silenciosos para no molestar en consola } } -// Función para rellenar datos del usuario function setupUserInfo(token) { try { const payload = JSON.parse(atob(token.split('.')[1])); @@ -61,30 +119,9 @@ function setupUserInfo(token) { if (nameEl) nameEl.innerText = payload.email || "Usuario"; if (roleEl) roleEl.innerText = (payload.role || "Operario").toUpperCase(); if (avatarEl) avatarEl.innerText = (payload.email?.[0] || "U").toUpperCase(); - } catch (e) { console.error("Error decodificando token", e); localStorage.removeItem("token"); window.location.href = "index.html"; } -} - -// Función para poner azul el enlace actual -function highlightActiveLink() { - // Obtenemos el nombre del archivo actual (ej: panel.html) - const path = window.location.pathname.split("/").pop() || "index.html"; - - const links = document.querySelectorAll(".nav-item"); - - links.forEach(link => { - // Quitamos estilos activos por defecto - link.classList.remove("bg-blue-600", "text-white", "shadow-lg", "shadow-blue-500/30"); - link.classList.add("text-slate-400", "hover:text-white", "hover:bg-slate-800"); - - // Si coincide con la página actual, le ponemos el estilo "Activo" - if (link.getAttribute("data-page") === path) { - link.classList.remove("text-slate-400", "hover:text-white", "hover:bg-slate-800"); - link.classList.add("bg-blue-600", "text-white", "shadow-lg", "shadow-blue-500/30"); - } - }); } \ No newline at end of file