diff --git a/static/js/history.js b/static/js/history.js index 7e719ea..38b1877 100644 --- a/static/js/history.js +++ b/static/js/history.js @@ -203,34 +203,36 @@ ${formatDuration(trip.duration_seconds)} ${formatSpeed(trip.max_speed_kmh)} ${trip.odo_start_km != null ? trip.odo_start_km.toFixed(0) + ' → ' + trip.odo_end_km.toFixed(0) + ' km' : '—'} - + - ${deleteBtn} + ${deleteBtn} `; body.appendChild(row); }); } body.addEventListener("click", function (event) { - // Delete button - const deleteBtn = event.target.closest("[data-delete-trip-id]"); - if (deleteBtn) { - event.stopPropagation(); - const tripId = deleteBtn.dataset.deleteTripId; - const date = deleteBtn.closest("tr").querySelector("td").textContent; - window.confirmDelete(`Delete trip from ${date}? The raw GPS data is kept — only the computed trip record is removed.`) - .then(function(confirmed) { - if (!confirmed) return; - return fetch(`/api/v1/portal/trip/${tripId}`, { method: "DELETE" }) - .then(function(res) { - if (!res.ok) throw new Error("Delete failed"); - deleteBtn.closest("tr").remove(); - }) - .catch(function(e) { showError(e.message); }); - }); - return; + // Delete button — must check before replay to prevent row click triggering replay + if (deletable) { + const deleteBtn = event.target.closest("[data-delete-trip-id]"); + if (deleteBtn) { + event.stopPropagation(); + event.preventDefault(); + const tripId = deleteBtn.dataset.deleteTripId; + const date = deleteBtn.closest("tr").querySelector("td").textContent.trim(); + window.confirmDelete(`Delete trip from ${date}?\n\nThe raw GPS data is kept — only this computed trip record is removed.`) + .then(function(confirmed) { + if (!confirmed) return; + return fetch(`/api/v1/portal/trip/${tripId}`, { method: "DELETE" }) + .then(function(res) { + if (!res.ok) throw new Error("Delete failed"); + deleteBtn.closest("tr").remove(); + }) + .catch(function(e) { showError(e.message); }); + }); + return; + } } // Replay button click (desktop) or row click (mobile)