diff --git a/frontend/css/styles.css b/frontend/css/styles.css index e573c76..a4e21d9 100644 --- a/frontend/css/styles.css +++ b/frontend/css/styles.css @@ -751,7 +751,12 @@ select { .full-width { width: 100%; } /* HR-only workout (зарядка) recording screen: big heart rate, timer, kcal, no map. */ -.workout-screen { padding: 24px 16px; display: flex; flex-direction: column; align-items: center; gap: 8px; } +.workout-screen { display: flex; flex-direction: column; height: 100%; } +.wk-main { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; padding: 16px; } +.wk-panel { flex-shrink: 0; display: flex; flex-direction: column; padding: 10px 16px; padding-bottom: calc(10px + var(--safe-area-bottom, 0px)); } +/* Workout detail (in a modal): fill the scrollable body so the delete button sits at the bottom. */ +.wkd-wrap { display: flex; flex-direction: column; min-height: 100%; } +.wkd-del { margin-top: auto; flex: none; align-self: stretch; } .wk-hr-big { font-size: 92px; font-weight: 700; line-height: 1; color: var(--primary); } .wk-hr-lbl { color: var(--muted); margin-top: -4px; } .wk-stats { display: flex; gap: 18px; margin: 14px 0; flex-wrap: wrap; justify-content: center; } diff --git a/frontend/js/main.js b/frontend/js/main.js index 4cee2f4..f998d98 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -2934,6 +2934,7 @@ async function renderGpsScreen(container) { `; @@ -2991,11 +2992,13 @@ async function renderGpsScreen(container) { let selBar = container.querySelector("#gps-sel-bar"); let selCount = container.querySelector("#gps-sel-count"); let selMergeBtn = container.querySelector("#gps-sel-merge"); + let selDeleteBtn = container.querySelector("#gps-sel-delete"); let refreshSel = () => { container.querySelectorAll(".gps-session-item").forEach(it => it.classList.toggle("selected", selected.has(it.dataset.sid))); if (selBar) selBar.hidden = !selMode; if (selCount) selCount.textContent = "Выбрано " + selected.size; - if (selMergeBtn) selMergeBtn.disabled = selected.size < 2; + if (selMergeBtn) selMergeBtn.disabled = selected.size < 2; // merge needs 2+ + if (selDeleteBtn) selDeleteBtn.disabled = selected.size < 1; // delete works from 1 }; let exitSel = () => { selMode = false; selected.clear(); refreshSel(); }; let toggleSel = (sid) => { @@ -3060,6 +3063,27 @@ async function renderGpsScreen(container) { selMergeBtn.disabled = false; selMergeBtn.textContent = "Объединить"; } }; + if (selDeleteBtn) selDeleteBtn.onclick = async () => { + if (selected.size < 1) return; + let ids = [...selected]; + let n = ids.length; + let word = (n % 10 === 1 && n % 100 !== 11) ? "трек" + : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) ? "трека" : "треков"; + if (!(await appConfirm(`Удалить ${n} ${word}? Это необратимо.`, "Удалить"))) return; + try { + selDeleteBtn.disabled = true; selDeleteBtn.textContent = "Удаляю..."; + let done = 0; + for (let id of ids) { + try { await DB.deleteGpsSession(id); done++; } catch (e) { console.error("[bulk delete]", id, e); } + } + showToast(`Удалено: ${done}`); + exitSel(); + renderScreen("gps"); + } catch (e) { + showToast("Ошибка удаления: " + (e.message || e)); + selDeleteBtn.disabled = false; selDeleteBtn.textContent = "Удалить"; + } + }; // Pagination: "Показать ещё" loads the next page from the DB and appends it. let sessOffset = sessions.length; @@ -4777,6 +4801,7 @@ function renderWorkoutDetail(session) { let max = hrs.length ? Math.max(...hrs) : null; let kcal = Math.round(session.total_kcal || 0); let html = ` +
${session.activity_type === "vr" ? "Руки/VR" : "Зарядка"} · ${session.date} ${session.start_time ?? ""}
${GPS.formatDuration(durSec)}Время
@@ -4790,7 +4815,8 @@ function renderWorkoutDetail(session) {
Пульс
- `; + +
`; showModal(html, () => {}, (overlay) => { let ctx = overlay.querySelector("#wk-hr-chart"); if (ctx && samples.length) { @@ -4817,17 +4843,21 @@ function renderWorkoutDetail(session) { function renderWorkoutInline(container) { container.innerHTML = `
-
--
-
уд/мин
-
-
0:00Время
-
0ккал
-
--средний
-
--макс
+
+
--
+
уд/мин
+
Подключите пульсометр
+
+
+
+
0:00Время
+
0ккал
+
--средний
+
--макс
+
+ +
-
Подключите пульсометр
- -
`; let hrEl = container.querySelector("#wk-hr"), timeEl = container.querySelector("#wk-time");