feat: bulk delete + merge activities in feed

- Select mode in ActivityFeed: toggle with Select button (logged-in only),
  cards become clickable with checkmark indicator, action bar fixed at bottom
- Bulk delete: calls existing DELETE /api/activity/{id} for each selected,
  removes from local feed state immediately
- Bulk merge: POST /api/merge sorts by started_at (earliest = primary),
  sums distance/duration/elevation, weighted-averages HR/power, concatenates
  geojson and timeseries; backs up originals to _merge_backup/ for recovery
- GET /api/merges returns per-user hidden list; feed filters secondaries
  client-side on load so static shards don't need a rebuild to hide them
- POST /api/unmerge/{id} restores primary from backup, unhides secondaries
- ActivityDetail: shows "Merged (N)" badge + Unmerge button for owners
- Fix: edit button now works from personal profile feed (handle was missing
  from year-shard activities; injected from filterHandle on sessionStorage write)
This commit is contained in:
Davide Scaini
2026-06-03 10:32:02 +02:00
parent 5287b98bc1
commit b781193d44
5 changed files with 462 additions and 14 deletions
+2
View File
@@ -130,6 +130,8 @@ export interface ActivityDetail extends Omit<ActivitySummary, 'detail_url' | 'tr
source_file?: string | null;
download_disabled?: boolean;
custom: Record<string, unknown>;
/** IDs of secondary activities merged into this one (set by /api/merge). */
merged_ids?: string[] | null;
}
export interface Lap {