From 72e4c1b1d7d2d6819326ca5847b1d0320e7cf208 Mon Sep 17 00:00:00 2001 From: Mathieu Moran Date: Mon, 10 Aug 2026 04:45:05 -0400 Subject: [PATCH] Fix trip delete button: layout and click handler - text-nowrap on action cell so Replay+trash stay on same line - Delete button inline with Replay (no whitespace between) - Explicit deletable guard in click handler Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- static/js/history.js | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) 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)