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 @@
@@ -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},