Saltearse al contenido

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 permiso operations.join.
  • GENERATE REPORT — abre el diálogo de informe de misión. Requiere ai.reports y una clave de API de OpenAI configurada (Configuración → AI Copilot).
  • EDIT — enruta a /operations/{id}/edit. Requiere operations.edit.

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 (o now si está en curso).
  • Tareasx/y desde listMissionTasks(missionId); se muestra solo cuando existen tareas.
  • Checklistsx/y desde listMissionChecklists(missionId).
  • Objetivosx/y desde el objectives[] 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 commanderUid vía getUser(). 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 headquartersNote en 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.type en 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 OUTPUTStrabajos 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.

Relacionados