feat: rename activities; keep original Garmin title as a tag
Build and push images / validate (push) Successful in 2s
Build and push images / build-backend (push) Successful in 6s
Build and push images / build-worker (push) Successful in 5s
Build and push images / build-frontend (push) Successful in 9s

Add Activity.original_name (migrated via init_db ALTER). The rename
endpoint stores the import title the first time a user renames and
clears it if renamed back. Activity detail page gets inline rename
(pencil) UI and shows the original title beneath the new name; the
activities list shows it as a small tag too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-18 21:35:09 +01:00
co-authored by Claude Opus 4.8
parent cc43d0f726
commit 227dadaca0
6 changed files with 85 additions and 5 deletions
+17 -2
View File
@@ -16,6 +16,7 @@ router = APIRouter()
class ActivitySummary(BaseModel):
id: int
name: str
original_name: Optional[str] = None
sport_type: str
start_time: datetime
distance_m: Optional[float]
@@ -368,9 +369,23 @@ async def rename_activity(
if not activity:
raise HTTPException(status_code=404, detail="Activity not found")
activity.name = body.get("name", activity.name)
new_name = (body.get("name") or "").strip()
if not new_name:
raise HTTPException(status_code=400, detail="Name cannot be empty")
# Preserve the original import title the first time the user renames, so the
# UI can still show it as a tag. Subsequent renames keep that same original.
if activity.original_name is None and new_name != activity.name:
activity.original_name = activity.name
activity.name = new_name
# If the user renames back to the original title, drop the tag.
if activity.original_name == activity.name:
activity.original_name = None
await db.commit()
return {"id": activity_id, "name": activity.name}
return {"id": activity_id, "name": activity.name, "original_name": activity.original_name}
@router.delete("/{activity_id}", status_code=204)