ui: drop version from footer; add live autostart toggle (default: wait for Play)

The footer no longer shows the app version (sidebar version stays). A new
per-browser preference liveAutostart controls live view startup: a toggle in
Settings → Плеер. Default off — live opens paused and waits for Play; on —
cameras start immediately on entering live view. Live.init seeds this.playing
from the pref.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-01 22:53:17 +05:00
parent 0216d2c1f1
commit 74236fdbb0
3 changed files with 25 additions and 5 deletions
+8
View File
@@ -142,6 +142,14 @@
<!-- ВКЛАДКА: Плеер и перекодирование (этот браузер) -->
<div class="tab-panel" data-panel="player" data-min-role="operator" hidden>
<div class="wrap">
<div class="card">
<h2>Live view <span class="muted" style="font-weight:400;font-size:12px">— настройки этого браузера</span></h2>
<label style="display:flex;align-items:center;gap:10px;cursor:pointer">
<input type="checkbox" id="pref-autostart">
<span>Показывать камеры сразу при входе в Live view
<span class="muted">— иначе просмотр стартует после нажатия Play (по умолчанию)</span></span>
</label>
</div>
<div class="card">
<h2>Плеер и перекодирование <span class="muted" style="font-weight:400;font-size:12px">— настройки этого браузера</span></h2>
<div class="muted" style="margin-top:-4px;margin-bottom:16px;font-size:12px">
+16 -4
View File
@@ -32,6 +32,7 @@ const PREFS_DEFAULT = {
prof1: { ...PROFILE_DEFAULT, mode: "player" }, // 1 поток (основной)
prof2: { ...PROFILE_DEFAULT, mode: "player" }, // 2 поток (суб)
profA: { ...PROFILE_DEFAULT, mode: "transcode" }, // архив
liveAutostart: false, // live view: сразу показывать (true) или ждать Play (по умолч.)
};
// ── текущий пользователь / роли ─────────────────────────────────
@@ -147,8 +148,7 @@ function ensureFooter() {
f.innerHTML = `<span class="brand">CoRE<span>.Vizion+</span></span>` +
`<span class="spacer"></span>` +
`<span class="stats" id="sys-stats"></span>` +
`<span class="clock" id="clock"></span>` +
`<span id="footer-version"></span>`;
`<span class="clock" id="clock"></span>`;
document.body.appendChild(f);
}
function ensureHeader() {
@@ -168,8 +168,6 @@ async function refreshStats() {
`&nbsp;&nbsp;Диск <b>${s.disk.used_gb}/${s.disk.total_gb} GB</b>`;
const v = document.getElementById("app-version");
if (v && s.version) v.textContent = "v" + s.version;
const fv = document.getElementById("footer-version");
if (fv && s.version) fv.textContent = "v" + s.version;
} catch (e) { /* нет связи / 401 — молчим */ }
}
// ограничение подменю раскладок (режим 16+) — на любой странице с .subnav
@@ -510,6 +508,7 @@ const Live = {
async init() {
const data = await api("/api/cameras");
this.cameras = data.cameras;
this.playing = clientPrefs().liveAutostart === true; // по умолч. ждём Play; вкл — показываем сразу
// режим каждого потока (свой плеер / транскод) — настройка этого браузера
this.mode1 = profileMode("1"); // 1 поток (основной)
this.mode2 = profileMode("2"); // 2 поток (суб)
@@ -1783,6 +1782,19 @@ const Settings = {
// 3 независимых профиля (1 поток / 2 поток / архив), у каждого свой режим:
// «Использовать свой плеер» (клиентский WASM-декод) или «Перекодировать» (сервер)
const saved = document.getElementById("prefs-saved");
// Live view: показывать сразу при входе или после нажатия Play (этот браузер)
const auto = document.getElementById("pref-autostart");
if (auto) {
auto.checked = clientPrefs().liveAutostart === true;
auto.onchange = () => {
setClientPref("liveAutostart", auto.checked);
if (saved) {
saved.textContent = "Сохранено в этом браузере ✓";
clearTimeout(this._t);
this._t = setTimeout(() => { saved.textContent = "Сохраняется в этом браузере"; }, 2000);
}
};
}
["1", "2", "a"].forEach((which) => {
const block = document.querySelector(`.tr-block[data-tr="${which}"]`);
if (!block) return;