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.
Header
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 theoperations.joinpermission. - GENERATE REPORT — opens the mission report dialog.
Requires
ai.reportsand a configured OpenAI API key (Settings → AI Copilot). - EDIT — routes to
/operations/{id}/edit. Requiresoperations.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(ornowif ongoing). - Tasks —
x/yfromlistMissionTasks(missionId); shown only when tasks exist. - Checklists —
x/yfromlistMissionChecklists(missionId). - Objectives —
x/yfrom the mission document’sobjectives[]. - 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
commanderUidviagetUser(). Shows avatar (colour-tinted), name, callsign badge, and asset type. Renders even when only the UID is known. - HQ / OPORD NOTES — the plain-text
headquartersNotefrom 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.