Volver a la wiki

Módulo de aviso del permiso Local Network Access

Resumen

Módulo JavaScript (static/js/modules/agent_lna_notice.js) que contextualiza el prompt del navegador sobre Local Network Access (LNA) antes de que aparezca. Detecta vía Permissions API si el estado es prompt y, si es así, renderiza un aviso propio explicando la conexión con el Local Agent.

Archivo: static/js/modules/agent_lna_notice.js
Tamaño: ~86 LOC
Dependencias: Permissions API (navigator.permissions.query)
Integración: templates/base.html (línea ~974, <script defer>)

Arquitectura Interna

Flujo de Ejecución

1. Módulo IIFE (Immediately Invoked Function Expression)
   ↓
2. Verificar ruta (pageOnAgentPage)
   → Si no está en AGENT_PATHS → return early
   ↓
3. Verificar sessionStorage['lna_notice_dismissed']
   → Si existe → return early (ya mostrado esta sesión)
   ↓
4. maybeShowNotice() async
   ├─ Verificar navigator.permissions existe
   ├─ Query permissions.query({name: 'local-network-access'})
   ├─ Si estado ≠ 'prompt' → return early
   └─ Llamar showNotice()
   ↓
5. showNotice()
   ├─ Crear <div class="lna-notice">
   ├─ Rellenar HTML (título + párrafo + botón)
   ├─ Adjuntar al <body>
   └─ Registrar evento click en botón
   ↓
6. dismiss() (al pulsar "Entendido")
   ├─ Marcar sessionStorage['lna_notice_dismissed'] = '1'
   ├─ Animar fade-out (0.4s)
   └─ Eliminar nodo del DOM

Constantes y Variables Clave

VariableTipoValorPropósito
AGENT_PATHSArray['/', '/editor', '/terminal', '/monitoring', '/wireless', '/maps', '/blueprints']Rutas que contactan con el Agent (espejadas de dashboard_widgets.js + core/middleware/csp.py)
SESSION_KEYString'lna_notice_dismissed'Clave de sessionStorage para marcar como mostrado
elHTMLElementDinámicoReferencia al div .lna-notice

Métodos Públicos

maybeShowNotice() (async)

showNotice()

dismiss()

Estilos CSS

Definidos en static/css/components.css (líneas ~903–949):

ClasePropósito
.lna-noticeContenedor: fijo (bottom 20px, right 20px), z-index 99998, max-width 380px, tarjeta con borde izquierdo acentuado, animación slide-in 0.3s
.lna-notice-titleTítulo: fuente heading, 1rem, margen inferior 6px
.lna-notice-body pPárrafo: font-size 0.875rem, line-height 1.45, color secundaria
.lna-notice .btnBotón: alineado a flex-end
@media (max-width: 480px)Responsive: left/right 12px, ancho 100%

Animaciones reutilizadas:

Ciclo de Vida

  1. Carga de página: Script se ejecuta con defer.
  2. DOMContentLoaded o después: Invoca maybeShowNotice().
  3. Detección: Consulta Permissions API.
    • Si navegador no soporta → nada.
    • Si estado = 'granted'/'denied' → nada (ya decidió).
    • Si estado = 'prompt' → muestra aviso.
  4. Usuario cierra aviso: Marca sessionStorage, anima fade-out, borra DOM.
  5. Resto de sesión: sessionStorage persiste, maybeShowNotice() no muestra de nuevo (early return).
  6. Cierra navegador: sessionStorage se olvida, próxima sesión repite desde paso 2.

Integración con Otros Módulos

MóduloRelación
dashboard_widgets.jsDefine _AGENT_PATHS (aquí replicada en AGENT_PATHS). Futura sincronización: considerar importar la constante
core/middleware/csp.pyDefine _AGENT_PREFIXES, _AGENT_EXACT para sondeo del Agent. El aviso respeta las mismas rutas
static/css/components.cssEstilos .lna-notice*
templates/base.htmlCarga el script con <script defer>

Limitaciones y Notas

  1. Sin sincronización dinámica de rutas: AGENT_PATHS está hardcodeada. Si se añaden nuevas rutas al Agent, hay que actualizar manualmente aquí y en dashboard_widgets.js.

    • TODO: Considerar endpoint /api/agent/paths o inyectar en template.
  2. sessionStorage vs localStorage: Se usa sessionStorage porque el permiso concedido persiste en el navegador; una sesión nueva vería el prompt de nuevo si no existiera. El aviso propio (sessionStorage) es para no molestar múltiples veces en la misma sesión.

  3. Navegadores sin LNA: El módulo detecta ausencia de Permissions API y sale. No hay polyfill.

  4. Timing de animaciones: Las timelines están hardcodeadas (0.3s slide-in, 0.4s fade-out). Deben coincidir con CSS.

Fuentes y Referencias

Véase también

Subir