diff --git a/server/templates/history.html b/server/templates/history.html index 86e512b..7670363 100644 --- a/server/templates/history.html +++ b/server/templates/history.html @@ -16,6 +16,9 @@
Recorded trips
+
@@ -39,6 +42,8 @@ true ) }} + +
diff --git a/static/js/history.js b/static/js/history.js index 5b41ac7..55bd741 100644 --- a/static/js/history.js +++ b/static/js/history.js @@ -199,6 +199,23 @@ var tl = document.getElementById("trip-list"); var del = tl && tl.dataset.deletable === "1"; var dUrl = (tl && tl.dataset.deleteUrl) || "/api/trip/"; + var showId = tl && tl.dataset.showId === "1"; + var bUrl = tl && tl.dataset.batchDeleteUrl; + var btD = document.getElementById("delete-selected-btn"); + + function cIds() { return Array.from(body.querySelectorAll("input.trip-checkbox:checked")).map(function (c) { return parseInt(c.value); }); } + function upBt() { if (!btD) return; var n = cIds().length; btD.hidden = !n; btD.textContent = "Delete selected (" + n + ")"; } + async function delSel() { + var ids = cIds(); if (!ids.length || !bUrl) return; + if (!(await window.confirmDelete("Delete " + ids.length + " trip(s)? Raw GPS data is kept."))) return; + try { + var r = await fetch(bUrl, {method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ids: ids})}); + if (!r.ok) throw new Error("Delete failed"); + ids.forEach(function (id) { var row = body.querySelector('tr[data-trip-id="' + id + '"]'); if (row) row.remove(); }); + upBt(); + } catch (e) { showErr(e.message); } + } + if (btD) btD.addEventListener("click", delSel); function render(tt) { body.replaceChildren(); @@ -208,9 +225,13 @@ row.dataset.duration = t.duration_seconds; row.dataset.maxSpeed = t.max_speed_kmh; row.dataset.tripId = t.id; row.style.cursor = "pointer"; var db = del ? '' : ""; - row.innerHTML = "#" + t.id + "" + fT(t.start_datetime) + "" + fK(t.distance_km) + "" + fD(t.duration_seconds) + "" + fS(t.max_speed_kmh) + "" + (t.odo_start_km != null ? t.odo_start_km.toFixed(0) + " \u2192 " + t.odo_end_km.toFixed(0) + " km" : "\u2014") + "" + db + ""; + var cb = bUrl ? '' : ""; + var idCell = showId ? "#" + t.id + "" : ""; + row.innerHTML = cb + idCell + "" + fT(t.start_datetime) + "" + fK(t.distance_km) + "" + fD(t.duration_seconds) + "" + fS(t.max_speed_kmh) + "" + (t.odo_start_km != null ? t.odo_start_km.toFixed(0) + " \u2192 " + t.odo_end_km.toFixed(0) + " km" : "\u2014") + "" + db + ""; body.appendChild(row); }); + body.querySelectorAll("input.trip-checkbox").forEach(function (c) { c.addEventListener("change", upBt); }); + upBt(); } body.addEventListener("click", function (e) { if (del) { diff --git a/templates/history.html b/templates/history.html index 078585b..0567957 100644 --- a/templates/history.html +++ b/templates/history.html @@ -27,7 +27,6 @@ {{ data_table( "trip-list", [ - {"key": "id", "label": "ID", "sortable": false}, {"key": "started", "label": "Started", "sortable": true}, {"key": "distance", "label": "km", "sortable": true}, {"key": "duration", "label": "Time", "sortable": true},