Skip to content

Operation detail

The operation detail page is the planning surface for a single operation. It lives at /operations/{id} and renders app-operation-summary in full mode (the same component also renders in compact “tile” mode inside the dashboard). You reach it by typing the URL directly, via the row kebab menu’s Edit route, or via the breadcrumb link from the live console.

Top strip: a back-arrow link to /operations, a centred OPERATIONS SUMMARY title, and an action cluster that appears once the mission loads:

  • LAUNCH LIVE OPS (primary button) — routes to /ops/{id}/live, the live console. Requires the operations.join permission.
  • GENERATE REPORT — opens the mission report dialog. Requires ai.reports and a configured OpenAI API key (Settings → AI Copilot).
  • EDIT — routes to /operations/{id}/edit. Requires operations.edit.

Hero banner

A full-width banner themed by the mission’s classification colour, with:

  • A classification ribbon (UNCLASSIFIED / RESTRICTED / CONFIDENTIAL / SECRET / TOP SECRET) pinned to the top-right.
  • The mission type icon on the left, derived from missionType.
  • Mission name, codename (monospace), and description.
  • A chip cluster on the right: status badge (coloured by status), priority badge (LOW | MEDIUM | HIGH | CRITICAL), and type badge.

Stat cards

A responsive grid of numeric cards, each pulled from the appropriate Firestore subcollection. Cards only render when the underlying count is meaningful.

  • Assets — from listMissionAssets(missionId).
  • Zones — from listPolygons(missionId).
  • Flags — from listMissionFlags(missionId).
  • Transmissions — from listMissionComms(missionId).
  • Duration — computed from startOn / finishedOn (or now if ongoing).
  • Tasksx/y from listMissionTasks(missionId); shown only when tasks exist.
  • Checklistsx/y from listMissionChecklists(missionId).
  • Objectivesx/y from the mission document’s objectives[].
  • Flight sessions, Total flight time, Total distance — aggregated across listMissionFlightLogs(missionId).

Cards for fully-done tasks / checklists / objectives switch to a “done” green accent.

Body — two columns

Left column

  • MISSION DETAILS — key-value list: start date, end date, created, last updated, primary POI, tags, half-duplex PTT state (ENABLED / DISABLED).
  • COMMANDING OFFICER — resolved from commanderUid via getUser(). Shows avatar (colour-tinted), name, callsign badge, and asset type. Renders even when only the UID is known.
  • HQ / OPORD NOTES — the plain-text headquartersNote from the mission doc.
  • ASSETS — the roster returned by listMissionAssets. Each row has a colour dot, name, callsign badge, and asset type in uppercase.

Right column

  • OBJECTIVES — each objective with a checkbox (filled when completed), text, and a priority label (primary / secondary / tertiary).
  • TASKS — breakdown row (done / active / pending / other) with a progress bar.
  • ASSET TYPES — chip list grouped by lowercased asset.type.
  • ZONE TYPES — chip list grouped by polygon type.
  • FLAGS BY TYPE — chip list grouped by flag type.
  • FLIGHT OPERATIONS — metric grid (total air time, total distance, peak altitude, peak speed, max range, photos, video recs, person detections) followed by a per-session log. Each session row shows start / end time, duration, distance, peak altitude, battery delta, and action count.
  • RULES OF ENGAGEMENT — numbered list of roe[].
  • COMMUNICATIONS PLAN — one card per channel with freq, encryption, callsign, notes.
  • MAPPING OUTPUTS — active mapping jobs and completed ones with per-artifact download buttons (orthomosaic, DSM, point cloud, 3D mesh, archive). Downloads use presigned S3 URLs; legacy artifacts fall back to a stored absolute URL.
  • MISSION MEDIA — thumbnails from mission.media[].

Panels only render when their underlying collection is non-empty, so a brand-new operation shows a nearly empty detail page until content is attached.

Starting, stopping, and joining

There is no dedicated Start / Stop button. State transitions happen via the Status dropdown on the edit form, or via workflows that react to events. LAUNCH LIVE OPS only changes which view you’re in — it does not promote the op to active state.

Sharing

There is no share / guest-invite menu on this page today. Guest access is managed via organisation-level invites.

Report generation

GENERATE REPORT opens a modal that calls generateReport(missionId) on the mission-report service. It shows a three-phase progress ribbon (Load Data → AI Analysis → Build Report), then renders an inline preview with an assessment banner, stats row, executive summary, key findings, and commander’s assessment. Full report content is exported via the Export PDF button. See mission report.

Empty and error states

  • While data loads, a centred spinner is shown.
  • If missions/{id} doesn’t exist, the page renders an OPERATION NOT FOUND empty state.