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)