- Sesiones stale ocultas por defecto
- Badge de 'Stale' clickeable para mostrar/ocultar
- Indicador visual (ojo abierto/cerrado) del estado del filtro
- Mensaje informativo cuando hay stale ocultas
- Reemplaza dropdown manual por componente DropdownMenu con radix-vue
- Agrega avoid-collisions y collision-padding para posicionamiento automático
- El menú ahora se ajusta automáticamente cuando no hay espacio horizontal
- Actualiza DropdownMenuItem para soportar prop 'as' y 'href' para enlaces
- Botón de info (ℹ) en la barra superior
- Documentación completa sobre:
- Sesiones (estados, ciclo de vida, limitaciones)
- Eventos FreeRADIUS (authorize, post-auth, accounting)
- Usuarios normales y sus características
- Invitados (temporales, auto-deshabilitación)
- Dispositivos (MAC, relación con usuarios)
- Flujo completo de conexión WiFi
- Nueva tabla `sesiones` para historial persistente de conexiones
- Job de detección de stale cada 2 min (10 min idle = desconectado)
- Inicialización resiliente desde BD al arrancar el servidor
- Nuevos endpoints: /api/sessions, /api/sessions/history, /api/sessions.csv
- Nueva vista "Sesiones" en el dashboard con estadísticas
- Historial integrado en UserCard y DispositivoCard
- Estadísticas de bytes in/out y duración por sesión
- Retención configurable de historial (90 días por defecto)
- Solo actualizar users/devices si los datos realmente cambiaron
- Aumentar debounce de SSE de 1s a 3s para reducir frecuencia de updates
- Evitar re-renders innecesarios comparando JSON antes de actualizar
- Agregar preview de usuarios que utilizan el dispositivo
- Usuarios conectados en badge rosa, desconectados en gris
- Mostrar contador total de usuarios
- Mover reglas de grid de 52px a media query desktop-only
- Evitar que reglas de desktop sobrescriban comportamiento móvil
- Soluciona contenedores cortados en vista móvil
- Ocultar botones de colapsar en vista desktop
- En móvil, contenedores colapsados ocupan solo el alto del header
- Mantener comportamiento desktop (52px width cuando colapsado)
- Mejorar UX en dispositivos móviles evitando contenedores inutilizables
- Agregar manifest.json a rutas públicas de Traefik (anteriormente solo estaba manifest.webmanifest)
- Cambiar estrategia de cache del Service Worker de cache-first a estrategia inteligente:
* Archivos de build (/assets/): Network-first con cache fallback
* HTML: Network-first siempre para obtener última versión
* Recursos estáticos (iconos, manifest): Cache-first (no cambian)
- Incrementar versión de cache de v2 a v3 para forzar limpieza
- Evitar redirecciones a Authentik para archivos manifest
Esto soluciona:
- Error CORS en manifest.json (ya no redirige a Authentik)
- Problemas de cache que requerían limpiar datos del navegador
- Archivos desactualizados servidos desde cache
- Quitar transform translateY de UserCard hover (card-inner y botones)
- Quitar transform translateY de .icon-btn hover en styles.css
- Quitar transform translateY de .card hover en styles.css
- Quitar transform translateY de GroupCheckButton hover
- Reemplazar efectos de movimiento por cambios sutiles de opacidad
- Actualizar transiciones para remover propiedades transform innecesarias
- Cambiar a diseño limpio tipo ficha con información organizada en filas label-value
- Reducir avatar a inicial pequeña (36x36px) con fondo sutil
- Implementar sistema de sombras suaves de múltiples capas para profundidad
- Simplificar paleta de colores con acentos sutiles
- Mejorar tipografía con mejor jerarquía (18px título, 13px info)
- Cambiar botones a diseño minimalista con borde sutil
- Agregar transiciones suaves con cubic-bezier para movimiento natural
- Implementar hover con elevación de 4px y sombras progresivas
- Organizar información en formato tabla limpia (vlan, estado, conexión, etiquetas)
- Reducir efectos visuales excesivos por diseño más elegante y profesional
- Agregar avatar circular con inicial del usuario y estados visuales (normal, conectado, deshabilitado)
- Implementar iconos SVG en todos los botones de acción (editar, desconectar, habilitar/deshabilitar, eliminar, expandir)
- Mejorar jerarquía de información con chips de colores específicos (VLAN azul, activo verde, deshabilitado rojo, conectado rosa)
- Agregar animación pulse en avatar cuando el usuario está conectado
- Implementar efectos hover con elevación y sombras rosas
- Organizar etiquetas y dispositivos en secciones separadas con bordes
- Resolver conflictos de merge en styles.css (mantener estilos de scrollbar y gradientes de topbar/panel)
- Agregar responsive design para móviles
- Mejorar transiciones y efectos glassmorphism en toda la card
PROBLEMA:
- Frontend hacía fetch a APIs protegidas por Authentik
- Cuando sesión expiraba, Authentik redirigía causando error de CORS
- TypeError: Failed to fetch
SOLUCIÓN:
1. Backend inyecta window.__AUTHENTIK_USER__ en HTML inicial (app.js)
- Servidor lee headers de Authentik y los pasa al frontend
- Evita fetch innecesario en carga inicial
2. Frontend usa window.__AUTHENTIK_USER__ como fuente principal (useAuthentik.js)
- Solo hace fetch cuando se fuerza refresh
- Detecta errores de CORS como señal de sesión expirada
- Muestra mensaje claro al usuario
3. App.vue detecta errores de autenticación en APIs
- Cuando fetch falla con CORS, recarga página automáticamente
- Authentik manejará la re-autenticación
SEGURIDAD:
- Todos los endpoints /api/* siguen protegidos por Authentik
- No se exponen APIs sin autenticación
- Headers de Authentik solo presentes con sesión válida
- Backend: Nuevos endpoints /api/auth/status y /api/auth/check-group
- Frontend: Composable useAuthentik para gestión de autenticación
- Frontend: Componentes UserDropdown, UserAvatar, SessionStatusButton, GroupCheckButton
- Frontend: Integración en topbar con dropdown de usuario
- Config: URLs de Authentik y configuración de avatares
- Lectura de headers x-authentik-* inyectados por Traefik
- Verificación de grupos RBAC (frontend y backend)
- Validación de sesión contra Authentik
Cambios:
- Crear componente Toast.vue con soporte para posiciones (top/bottom, left/center/right)
- Crear composable useToast.js para manejar notificaciones
- Integrar sistema de toast en App.vue
- Implementar detección de PWA:
* Detecta si el usuario está en modo standalone (PWA instalada)
* Si puede instalar, muestra toast con botón de instalación
* Si ya está instalada pero no se usa, sugiere abrir en app
- Toast persistente hasta que el usuario interactúe
- Soporte para tema claro/oscuro
- Animaciones suaves y diseño moderno
- Responsive para móviles
El sistema permite mostrar toasts de tipo: success, error, warning, info, pwa
con opciones de posición, duración, acciones personalizadas y modo persistente.
Cambios en App.vue:
- Agregar botón Inicio con emoji 🏠 en el topbar
- Botón apunta a https://inicio.nucleoriofrio.com
- Posicionado al inicio de la sección de acciones
- Usa clase .icon-btn para consistencia visual
El botón usa scope extensions para navegar dentro de la PWA.