Detalle de operación
La página de detalle de operación es la superficie de planificación de una única operación. Vive en
/operations/{id} y renderiza app-operation-summary en modo completo (el mismo componente
también se renderiza en modo “tile” compacto dentro del dashboard). Llegas a ella escribiendo
la URL directamente, vía la ruta Editar del menú kebab de fila, o vía el enlace de breadcrumb desde
la consola en vivo.
Cabecera
Franja superior: un enlace de flecha atrás a /operations, un título OPERATIONS SUMMARY centrado,
y un cluster de acciones que aparece una vez que la misión carga:
- LAUNCH LIVE OPS (botón primario) — enruta a
/ops/{id}/live, la consola en vivo. Requiere el permisooperations.join. - GENERATE REPORT — abre el diálogo de informe de misión.
Requiere
ai.reportsy una clave de API de OpenAI configurada (Configuración → AI Copilot). - EDIT — enruta a
/operations/{id}/edit. Requiereoperations.edit.
Banner hero
Un banner de ancho completo con el color de clasificación de la misión, con:
- Una cinta de clasificación (
UNCLASSIFIED/RESTRICTED/CONFIDENTIAL/SECRET/TOP SECRET) fijada arriba a la derecha. - El icono del tipo de misión a la izquierda, derivado de
missionType. - Nombre, nombre en clave (monospace) y descripción de la misión.
- Un cluster de chips a la derecha: insignia de estado (coloreada por estado), insignia de prioridad
(
LOW | MEDIUM | HIGH | CRITICAL) e insignia de tipo.
Tarjetas de estadísticas
Una cuadrícula responsiva de tarjetas numéricas, cada una extraída de la subcolección de Firestore apropiada. Las tarjetas solo se renderizan cuando el recuento subyacente es significativo.
- Activos — desde
listMissionAssets(missionId). - Zonas — desde
listPolygons(missionId). - Flags — desde
listMissionFlags(missionId). - Transmisiones — desde
listMissionComms(missionId). - Duración — calculada desde
startOn/finishedOn(onowsi está en curso). - Tareas —
x/ydesdelistMissionTasks(missionId); se muestra solo cuando existen tareas. - Checklists —
x/ydesdelistMissionChecklists(missionId). - Objetivos —
x/ydesde elobjectives[]del documento de misión. - Sesiones de vuelo, Tiempo total de vuelo, Distancia total — agregados a través de
listMissionFlightLogs(missionId).
Las tarjetas para tareas / checklists / objetivos totalmente completados cambian a un acento verde “done”.
Cuerpo — dos columnas
Columna izquierda
- MISSION DETAILS — lista clave-valor: fecha de inicio, fecha de fin, creada, última actualización,
POI principal, etiquetas, estado de PTT semidúplex (
ENABLED/DISABLED). - COMMANDING OFFICER — resuelto desde
commanderUidvíagetUser(). Muestra avatar (con tinte de color), nombre, insignia de indicativo y tipo de asset. Se renderiza incluso cuando solo se conoce el UID. - HQ / OPORD NOTES — el
headquartersNoteen texto plano del documento de misión. - ASSETS — el roster devuelto por
listMissionAssets. Cada fila tiene un punto de color, nombre, insignia de indicativo y tipo de asset en mayúsculas.
Columna derecha
- OBJECTIVES — cada objetivo con un checkbox (relleno cuando
completed), texto y una etiqueta de prioridad (primary/secondary/tertiary). - TASKS — fila de desglose (completadas / activas / pendientes / otras) con una barra de progreso.
- ASSET TYPES — lista de chips agrupada por
asset.typeen minúsculas. - ZONE TYPES — lista de chips agrupada por tipo de polígono.
- FLAGS BY TYPE — lista de chips agrupada por tipo de flag.
- FLIGHT OPERATIONS — cuadrícula de métricas (tiempo total en el aire, distancia total, altitud máxima, velocidad máxima, alcance máximo, fotos, grabaciones de vídeo, detecciones de personas) seguida de un log por sesión. Cada fila de sesión muestra hora de inicio / fin, duración, distancia, altitud máxima, delta de batería y número de acciones.
- RULES OF ENGAGEMENT — lista numerada de
roe[]. - COMMUNICATIONS PLAN — una tarjeta por canal con frecuencia, cifrado, indicativo, notas.
- MAPPING OUTPUTS — trabajos de mapping activos y completados con botones de descarga por artefacto (ortomosaico, DSM, nube de puntos, malla 3D, archivo). Las descargas usan URLs presignadas de S3; los artefactos heredados recurren a una URL absoluta almacenada.
- MISSION MEDIA — miniaturas desde
mission.media[].
Los paneles solo se renderizan cuando su colección subyacente es no vacía, por lo que una operación recién creada muestra una página de detalle casi vacía hasta que se adjunta contenido.
Iniciar, detener y unirse
No hay un botón dedicado de Iniciar / Detener. Las transiciones de estado ocurren vía el
desplegable Status en el formulario de edición, o vía flujos de trabajo que reaccionan
a eventos. LAUNCH LIVE OPS solo cambia en qué vista estás — no promueve
la operación al estado active.
Compartir
No hay un menú de compartir / invitar-invitado en esta página hoy. El acceso de invitados se gestiona vía invitaciones a nivel de organización.
Generación de informes
GENERATE REPORT abre un modal que llama a generateReport(missionId) en el
servicio de mission-report. Muestra una cinta de progreso de tres fases (Load Data → AI
Analysis → Build Report), luego renderiza una vista previa en línea con un banner de evaluación,
fila de estadísticas, resumen ejecutivo, hallazgos clave y evaluación del comandante. El contenido completo
del informe se exporta vía el botón Export PDF. Ver
informe de misión.
Estados vacíos y de error
- Mientras los datos cargan, se muestra un spinner centrado.
- Si
missions/{id}no existe, la página renderiza un estado vacío OPERATION NOT FOUND.