Segments Phase 4: detail page, activity efforts, athlete tab, new APIs

New API endpoints:
- GET /api/segments/{id} — single segment metadata
- GET /api/activities/{id}/segment_efforts — efforts for an activity (auth)
- GET /api/users/{handle}/segment_summary — public best time + count per segment

New components:
- SegmentDetail.svelte — map + metadata + effort table (with PR/Δ) + rescan button
- SegmentsPage.svelte — URL router: shows detail when /segments/{id}/, list otherwise

Updated:
- segments/index.astro — now uses SegmentsPage router
- nginx-activity.conf — add /segments/ try_files rule for client-side routing
- ActivityDetail.svelte — segment efforts block below laps
- AthleteView.svelte — Segments tab with best time + effort count per segment
- format.ts — add formatElapsed() for compact m:ss display
This commit is contained in:
Davide Scaini
2026-05-13 08:09:24 +02:00
parent c7f0013e57
commit f2075e29d2
8 changed files with 516 additions and 12 deletions
+2 -4
View File
@@ -1,9 +1,7 @@
---
import Base from '../../layouts/Base.astro';
import SegmentsView from '../../components/SegmentsView.svelte';
import SegmentsPage from '../../components/SegmentsPage.svelte';
---
<Base title="Segments — BincioActivity">
<div class="flex flex-col" style="height: calc(100vh - 48px);">
<SegmentsView base={import.meta.env.BASE_URL} client:only="svelte" />
</div>
<SegmentsPage base={import.meta.env.BASE_URL} client:only="svelte" />
</Base>
@@ -36,7 +36,7 @@ const athleteUrl = `${mergedBase}athlete.json`;
</a>
</div>
</div>
<AthleteView {base} {indexUrl} {athleteUrl} client:only="svelte" />
<AthleteView {base} {indexUrl} {athleteUrl} {handle} client:only="svelte" />
</Base>
<script define:vars={{ handle }}>
function applyMeCheck(me) {