CreaRack-SL

El panel de un grupo (Wireless/UPS/Signage) gana botonera: Deep Discover, Refresh, New Tab, Manage Members, Export CSV (v1.132.4)

Resumen

El panel de detalle de un dispositivo suelto (WirelessDetail.js) ya tenía su fila de botones; el panel de detalle de un GRUPO —la base común MonitoringGroupDetail.js, heredada por Wireless, UPS y Signage— no tenía ninguno. Este cambio (task #312) añade 5 botones a la cabecera del grupo, disponibles de golpe en los 3 dominios porque el componente es compartido.

Qué hace cada botón

  • Deep Discover: lanza un análisis a fondo de TODOS los miembros del grupo a la vez, de dos en dos (_runGroupDeepDiscover), con el progreso “N/M” escrito en el propio botón y un aviso al terminar con cuántos salieron bien y cuántos fallaron. Reutiliza el mismo despacho HTTP que el botón de un dispositivo suelto — ver Implementación.
  • Refresh: recarga el resumen, los miembros y las gráficas del grupo al momento, sin esperar a que toque el refresco automático (60/120 s).
  • New Tab: abre ese grupo en una pestaña nueva del navegador (openInNewTab con ?group_id=N), igual que ya podía hacerse con un equipo suelto (?ap_id=/?ups_id=/?device_id=).
  • Manage Members: abre el modal de grupos del dominio para añadir o quitar equipos.
  • Export CSV: descarga la tabla de miembros tal cual se ve en pantalla (cabeceras + celdas de texto), como <grupo>-members.csv.

Único declinado: el botón “Report” del panel de grupo queda fuera de este cambio, para otro PR.

Implementación

  • static/js/pages/monitoring/MonitoringGroupDetail.js — la botonera vive en _bindToolbar (cableado una vez al montar el tab); _runGroupDeepDiscover filtra los miembros del grupo por group_ids, corre 2 workers concurrentes contra la cola de dispositivos, y _exportMembersCsv vuelca la tabla ya renderizada a un Blob CSV (comillas dobles duplicadas por celda, RFC 4180).
  • static/js/pages/monitoring/MonitoringDetailPlumbing.js — dispatchDeepDiscover, pollDeepDiscoverStatus y deepDiscoverSucceeded salen del mixin createDeepDiscoveryMixin a funciones de MÓDULO, para que el deep discovery por grupo las reutilice sin duplicar la llamada HTTP; el mixin del detalle de un dispositivo suelto pasa a delegar en ellas (mismo contrato público, sin cambio de comportamiento).
  • static/js/pages/{wireless,ups,signage}.js, init() — nuevo parámetro ?group_id=N en la URL (igual que ap_id/ups_id/device_id): abre la pestaña del grupo en modo standalone (sidebar oculto). Es el receptor del botón “New Tab”.
  • static/js/utils/TabHelper.js (openInNewTab) — reutilizada tal cual, sin cambios.

Tests

frontend/src/__tests__/static/monitoring_group_toolbar.test.js (nuevo, 235 líneas): jsdom + ApiService/showAppToast falsos + reloj simulado (mismo patrón de poll de 3 s que la suite de backoff del deep discovery de un dispositivo). Cubre los 3 descriptores de dominio (WirelessGroupDetail, UpsGroupDetail, SignageGroupDetail) como singletons compartidos por el fichero, cada test con su propio groupId para no cruzar estado (_deepDiscoverGroupsInFlight, _chartGrids…) entre tests del mismo dominio.

Límite honesto

El botón “Report” queda pendiente (fuera de alcance). El cambio es visual/JS puro — no hay verificación automática end-to-end en el navegador real más allá del test de contrato; el click-test manual tras el deploy es quien cierra el ciclo.

Commits relacionados

  • f6f26285 (2026-09-14) — feat(monitoring): botonera en el panel de grupo, PR #534, v1.132.4, task #312.

Véase también

  • [[feature—monitoring—deuda-274-tanda-b]]
  • [[feature—wireless—deep-discovery-timestamp]]
  • [[feature—monitoring—device-config-modal]]
  • [[crearack-tech—architecture—wireless-monitor]]
  • [[crearack-tech—architecture—ups-monitor]]