The single Locations/Units/Active row was confusing: "Active" collided with
the green Active status badge and actually meant sound recording sessions, so
vibration-only projects showed a meaningless "Active 0", and combined projects
lumped both modules together with no split.
Cards now show one stat line per module, each carrying its own identity +
status badge (so the separate chip row is dropped as redundant):
Vibration N locations · M units
Sound N NRLs · M units · K recording
- /list endpoint computes module_stats: locations (active, by type) and units
counted via a join on the assigned location's type — so a module's unit
count always reconciles with its location count (verified: sound+vibration
units == total active assignments for every project).
- "recording" (active sessions) shows only under Sound, where it's meaningful.
- Projects with no modules fall back to a simple Locations/Units row.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015m9FuJvk65kJmmP3c9c6r1
Addresses a batch of projects-page UX issues:
1. Vibration Events sub-tab: add a Location filter + clickable column
sorting (Timestamp/Location/Serial/Tran/Vert/Long/PVS/Mic). Events are
cached client-side so location-filter and sort are instant (no SFM refetch).
3. Drop the misleading single-module "Sound Monitoring" subtitle on the
Overview card (combined projects have multiple modules); show the
project number · client identity instead.
4. Header cleanup: move the sound-only actions (Generate Combined Report,
Night Report, Report Settings) and the Manual/Remote chip out of the
global project header and into the Sound tab's module toolbar. The header
now carries project-level concerns only (status, modules, merge). The
Night Report / Report Settings modals stay defined in the header partial
(global), so the relocated buttons still call them.
2. Per-module status UI: each module tab gets a status dropdown
(active/on_hold/completed) wired to the new endpoint; the header module
chips show a "✓ Done" / "On hold" badge.
5. Project cards redesigned: module mix accent strip, Sound/Vibration chips
with per-module status, project number · client identity, and per-module
"Sound"/"Vibration" quick-open buttons that deep-link into that module's
tab (#sound / #vibration).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015m9FuJvk65kJmmP3c9c6r1