Añadir js/layout.js

This commit is contained in:
2026-02-07 23:26:08 +00:00
parent 2d75b53e98
commit 96e3c640f0

90
js/layout.js Normal file
View File

@@ -0,0 +1,90 @@
// CONFIGURACIÓN GLOBAL
const API_URL = "https://integrarepara-api.integrarepara.es";
document.addEventListener("DOMContentLoaded", async () => {
// 1. Verificar Token
const token = localStorage.getItem("token");
if (!token) {
window.location.href = "index.html";
return;
}
// 2. Cargar Componentes HTML
await loadComponent("sidebar-container", "sidebar.html");
await loadComponent("header-container", "header.html");
// 3. Inicializar Iconos
if (window.lucide) lucide.createIcons();
// 4. Lógica del Usuario (Header)
setupUserInfo(token);
// 5. Marcar enlace activo (Sidebar)
highlightActiveLink();
// 6. Configurar Logout
const btnLogout = document.getElementById("globalBtnLogout");
if(btnLogout) {
btnLogout.addEventListener("click", () => {
localStorage.removeItem("token");
window.location.href = "index.html";
});
}
});
// Función para cargar HTML externo
async function loadComponent(elementId, filePath) {
try {
const response = await fetch(filePath);
if (response.ok) {
const html = await response.text();
document.getElementById(elementId).innerHTML = html;
} else {
console.error(`Error cargando ${filePath}`);
}
} catch (e) {
console.error(e);
}
}
// Función para rellenar datos del usuario
function setupUserInfo(token) {
try {
const payload = JSON.parse(atob(token.split('.')[1]));
// Elementos del Header
const nameEl = document.getElementById("headerUserName");
const roleEl = document.getElementById("headerUserRole");
const avatarEl = document.getElementById("headerUserAvatar");
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");
}
});
}