Add delete with confirmation for trips and dashcam

- Confirmation modal in server base.html (window.confirmDelete promise helper)
- Trip delete: trash button in Replay column (server-only via data-deletable on
  trip-list div), DELETE /api/v1/portal/trip/<id>, removes computed trip only
  (raw tracking_points kept)
- Dashcam delete: trash button next to download, DELETE /api/v1/portal/dashcam/<id>,
  removes from DB + disk (best-effort file removal)
- history.js: delete button gated on data-deletable='1' attribute; click handler
  intercepts before replay logic
- db.py: delete_trip(), delete_dashcam_file() helpers

Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Mathieu Moran
2026-08-10 04:40:22 -04:00
co-authored by Copilot
parent a13d74e18e
commit 7aa9ffda16
7 changed files with 151 additions and 6 deletions
+30
View File
@@ -559,6 +559,36 @@ def recompute_trips():
return jsonify(status="ok", trips_computed=n)
@app.delete("/api/v1/portal/trip/<int:trip_id>")
@require_login
def portal_delete_trip(trip_id):
device_id = _portal_device_id()
if device_id is None:
return jsonify(error="device not configured"), 404
deleted = db.delete_trip(device_id, trip_id)
if not deleted:
return jsonify(error="trip not found"), 404
return jsonify(status="ok")
@app.delete("/api/v1/portal/dashcam/<int:file_id>")
@require_login
def portal_delete_dashcam(file_id):
device_id = _portal_device_id()
if device_id is None:
return jsonify(error="device not configured"), 404
storage_path = db.delete_dashcam_file(device_id, file_id)
if storage_path is None:
return jsonify(error="file not found"), 404
# Remove from disk (best-effort — don't fail if file is already gone)
try:
if os.path.isfile(storage_path):
os.remove(storage_path)
except OSError:
pass
return jsonify(status="ok")
@app.get("/api/trips")
@require_login
def portal_trips_compat():