diff --git a/webapp/app.js b/webapp/app.js index 76ecd37..b3ae722 100644 --- a/webapp/app.js +++ b/webapp/app.js @@ -785,10 +785,11 @@ async function loadHistory(append = false) { card.innerHTML = `
- ${dateStr} + #${w.user_number} · ${dateStr}
${Math.round(volume)} kg vol +
${groupsHtml} @@ -799,6 +800,11 @@ async function loadHistory(append = false) { editSavedWorkout(w); }); + card.querySelector(".btn-history-delete").addEventListener("click", (e) => { + e.stopPropagation(); + confirmDeleteWorkout(w); + }); + container.appendChild(card); }); @@ -813,6 +819,28 @@ document.getElementById("btn-load-more").addEventListener("click", () => { loadHistory(true); }); +function confirmDeleteWorkout(w) { + const label = "Workout #" + (w.user_number ?? w.id); + const prompt = "Delete " + label + "? This can't be undone."; + const onConfirm = async (ok) => { + if (!ok) return; + try { + await api("DELETE", "/workouts/" + w.id); + showToast(label + " deleted"); + tg.HapticFeedback.notificationOccurred("success"); + loadHistory(); + } catch (e) { + showToast(e.message || "Delete failed"); + tg.HapticFeedback.notificationOccurred("error"); + } + }; + if (tg && typeof tg.showConfirm === "function") { + tg.showConfirm(prompt, onConfirm); + } else { + onConfirm(window.confirm(prompt)); + } +} + // ── Stats View ────────────────────────────────────────────────── async function loadStats() { diff --git a/webapp/style.css b/webapp/style.css index 6804dbd..4bc7228 100644 --- a/webapp/style.css +++ b/webapp/style.css @@ -392,6 +392,11 @@ details[open] .raw-toggle::before { font-size: 14px !important; } +.btn-history-delete { + font-size: 14px !important; + color: var(--tg-theme-destructive-text-color, #d33) !important; +} + .history-group { margin-bottom: 8px; }