/* ============================================================ Engeradios Engeradios Admin — JS Produção Melhorias não destrutivas de UX/responsividade ============================================================ */ (function () { "use strict"; const LOGO_URL = "https://engeradios.com.br/xlogoengeradios.png.pagespeed.ic.mxsDoIKqSA.webp"; const TOKEN_ADMIN = "engeradios_admin_token"; const TOKEN_LEGACY = "access_token"; const menuGroups = [ { title: "Operação", items: [ ["📊", "Dashboard", "/dashboard"], ["👥", "Funcionários", "/funcionarios"], ["🕒", "Registros de ponto", "/pontos"], ["📱", "Aparelhos", "/aparelhos"], ["📅", "Jornadas", "/jornadas"], ["📄", "Relatório mensal", "/relatorios"], ["✅", "Fechamentos", "/fechamentos"] ] }, { title: "RH Digital", items: [ ["🔔", "Notificações", "/notificacoes"], ["📝", "Justificativas", "/justificativas"], ["📎", "Documentos", "/documentos"], ["💳", "Contracheques", "/contracheques"], ["⚠️", "Advertências", "/advertencias"], ["⚙️", "Config. mobile", "/configuracoes-mobile"] ] }, { title: "Administração", items: [ ["🛡️", "Permissões", "/"], ["🔍", "Auditoria", "/auditoria"], ["❤️", "Saúde", "/saude"], ["📈", "Painel SaaS", "/dashboard-saas"] ] } ]; const pageMeta = { "/": ["Permissões e ACL", "Controle de acesso administrativo"], "/dashboard": ["Dashboard administrativo", "Visão geral da operação"], "/dashboard-saas": ["Painel executivo", "Indicadores e gráficos do RH digital"], "/funcionarios": ["Funcionários", "Consulta de colaboradores, status e vínculos"], "/employees": ["Funcionários", "Consulta de colaboradores, status e vínculos"], "/pontos": ["Registros de ponto", "Batidas, GPS, offline, selfie e aparelho"], "/time-entries": ["Registros de ponto", "Batidas, GPS, offline, selfie e aparelho"], "/aparelhos": ["Aparelhos", "Autorização e bloqueio de dispositivos"], "/devices": ["Aparelhos", "Autorização e bloqueio de dispositivos"], "/device-auth": ["Aparelhos", "Autorização e bloqueio de dispositivos"], "/jornadas": ["Jornadas", "Escalas, horários e alertas"], "/schedules": ["Jornadas", "Escalas, horários e alertas"], "/relatorios": ["Relatório mensal", "Conferência mensal de ponto"], "/reports": ["Relatório mensal", "Conferência mensal de ponto"], "/fechamentos": ["Fechamentos", "Espelhos mensais e assinaturas"], "/timesheet-closings": ["Fechamentos", "Espelhos mensais e assinaturas"], "/documentos": ["Documentos", "Envio, análise e revisão de documentos"], "/justificativas": ["Justificativas", "Análise de atestados, atrasos e faltas"], "/contracheques": ["Contracheques", "Envio e consulta de holerites"], "/advertencias": ["Advertências e comunicados", "Comunicações com ciência do funcionário"], "/notificacoes": ["Notificações", "Central de avisos e regras automáticas"], "/auditoria": ["Auditoria", "Rastreabilidade de ações administrativas"], "/saude": ["Saúde do sistema", "Status operacional da plataforma"] }; function normalizePath() { let path = window.location.pathname || "/"; if (path.length > 1) path = path.replace(/\/+$/, ""); return path || "/"; } function syncTokens() { try { const adminToken = localStorage.getItem(TOKEN_ADMIN); const legacyToken = localStorage.getItem(TOKEN_LEGACY); const token = adminToken || legacyToken; if (token) { if (!adminToken) localStorage.setItem(TOKEN_ADMIN, token); if (!legacyToken) localStorage.setItem(TOKEN_LEGACY, token); } const originalSetItem = localStorage.setItem.bind(localStorage); localStorage.setItem = function (key, value) { originalSetItem(key, value); if (key === TOKEN_ADMIN && value) originalSetItem(TOKEN_LEGACY, value); if (key === TOKEN_LEGACY && value) originalSetItem(TOKEN_ADMIN, value); }; } catch (_) { /* Não interrompe a página se storage estiver bloqueado */ } } function ensureSkipLink() { if (document.querySelector(".er-skip-link")) return; const link = document.createElement("a"); link.className = "er-skip-link"; link.href = "#conteudo-principal"; link.textContent = "Ir para o conteúdo"; document.body.prepend(link); } function ensureMainId() { const main = document.querySelector("main") || document.body; if (!main.id) main.id = "conteudo-principal"; } function buildSidebar() { if (document.querySelector(".er-sidebar")) return; const aside = document.createElement("aside"); aside.className = "er-sidebar card"; aside.setAttribute("aria-label", "Menu principal"); EngeradiosDOM.setHTML(aside, `