Skip to content

Operations list

Operations is the list page at /operations. It shows every mission document at the Firestore path missions/{id} that your account can read in the active organisation. Each row is one operation — planned, in progress, or finished.

What the table shows

The page has a fixed header with the total count and a New operation button (visible only if you have the operations.create permission), a scrolling rows area, and a right-hand side panel with quick stats.

ColumnSourceNotes
ThumbnailFirst photo in mission.media[]Falls back to an image placeholder.
Operationmission.name, with mission.codename underneath when setClick the row to open it.
StatusDerived from startOn / finishedOn timestampsplanned, active, or finished.
Createdmission.createdOnHidden on small viewports.
Startmission.startOn if > 0Shows when unscheduled. Hidden on medium viewports.
AssetsLength of mission.assetIds[]Operatives + teams + org members combined.
MediaLength of mission.media[]Photos and videos uploaded at plan time.
ActionsRow kebab menuSee below.

The side panel shows four quick-stats: Total, Active, Planned, Finished, computed client-side from the same list.

The status chip is computed from timestamps — an active row means startOn has passed but finishedOn has not. This is independent of the richer mission.status field (planning | ready | active | completed | aborted) set in the create/edit forms. The list view uses the timestamp-derived label so unfinished scheduled ops don’t display as “active” prematurely.

Opening a row

Clicking anywhere on the row navigates to /ops/{id}/live — the live operations console. To reach the planning detail page instead, use the kebab menu’s Edit link, or type /operations/{id} directly. Rows are keyboard-activatable via Enter.

Row actions

The kebab (three-dot) button opens a fixed-position dropdown. Items appear based on permissions:

  • Launch — same as clicking the row. Routes to /ops/{id}/live.
  • Edit — requires operations.edit. Opens the edit form.
  • Duplicate — requires operations.edit. Opens a small dialog pre-filled with {name} (Copy). On confirm, it calls POST /operations/{sourceId}/duplicate on the backend, which copies the mission document plus every subcollection (flags, polygons, comms, tasks, assetLocations, and so on), then navigates straight to the new op’s edit page.
  • Delete — requires operations.delete. Uses a native confirm() prompt, then calls deleteDoc(missions/{id}) directly in Firestore.

Creating a new operation

The New operation button in the page header and in the side panel’s action card both route to /operations/new — the create wizard. When an operation is created, the service fires an operation_created notification to every active member of the current organisation; delivery is best-effort and silently dropped on failure.

Empty and loading states

A fresh account sees a plus-icon empty state with a Create your first operation link. While Firestore loads, five skeleton rows animate in the grid.

Not yet implemented

The following items appear in the roadmap but are not in the current build:

  • Status chip filter toolbar, date-range picker, team multi-select, free-text search.
  • Bulk selection, archive, and CSV export.
  • Soft-delete / 30-day restore window — delete is a hard deleteDoc today.

If you see screenshots referencing those, treat them as aspirational.