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:
@@ -142,6 +142,14 @@
|
|||||||
<!-- ВКЛАДКА: Плеер и перекодирование (этот браузер) -->
|
<!-- ВКЛАДКА: Плеер и перекодирование (этот браузер) -->
|
||||||
<div class="tab-panel" data-panel="player" data-min-role="operator" hidden>
|
<div class="tab-panel" data-panel="player" data-min-role="operator" hidden>
|
||||||
<div class="wrap">
|
<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">
|
<div class="card">
|
||||||
<h2>Плеер и перекодирование <span class="muted" style="font-weight:400;font-size:12px">— настройки этого браузера</span></h2>
|
<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">
|
<div class="muted" style="margin-top:-4px;margin-bottom:16px;font-size:12px">
|
||||||
|
|||||||
+16
-4
@@ -32,6 +32,7 @@ const PREFS_DEFAULT = {
|
|||||||
prof1: { ...PROFILE_DEFAULT, mode: "player" }, // 1 поток (основной)
|
prof1: { ...PROFILE_DEFAULT, mode: "player" }, // 1 поток (основной)
|
||||||
prof2: { ...PROFILE_DEFAULT, mode: "player" }, // 2 поток (суб)
|
prof2: { ...PROFILE_DEFAULT, mode: "player" }, // 2 поток (суб)
|
||||||
profA: { ...PROFILE_DEFAULT, mode: "transcode" }, // архив
|
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>` +
|
f.innerHTML = `<span class="brand">CoRE<span>.Vizion+</span></span>` +
|
||||||
`<span class="spacer"></span>` +
|
`<span class="spacer"></span>` +
|
||||||
`<span class="stats" id="sys-stats"></span>` +
|
`<span class="stats" id="sys-stats"></span>` +
|
||||||
`<span class="clock" id="clock"></span>` +
|
`<span class="clock" id="clock"></span>`;
|
||||||
`<span id="footer-version"></span>`;
|
|
||||||
document.body.appendChild(f);
|
document.body.appendChild(f);
|
||||||
}
|
}
|
||||||
function ensureHeader() {
|
function ensureHeader() {
|
||||||
@@ -168,8 +168,6 @@ async function refreshStats() {
|
|||||||
` Диск <b>${s.disk.used_gb}/${s.disk.total_gb} GB</b>`;
|
` Диск <b>${s.disk.used_gb}/${s.disk.total_gb} GB</b>`;
|
||||||
const v = document.getElementById("app-version");
|
const v = document.getElementById("app-version");
|
||||||
if (v && s.version) v.textContent = "v" + s.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 — молчим */ }
|
} catch (e) { /* нет связи / 401 — молчим */ }
|
||||||
}
|
}
|
||||||
// ограничение подменю раскладок (режим 16+) — на любой странице с .subnav
|
// ограничение подменю раскладок (режим 16+) — на любой странице с .subnav
|
||||||
@@ -510,6 +508,7 @@ const Live = {
|
|||||||
async init() {
|
async init() {
|
||||||
const data = await api("/api/cameras");
|
const data = await api("/api/cameras");
|
||||||
this.cameras = data.cameras;
|
this.cameras = data.cameras;
|
||||||
|
this.playing = clientPrefs().liveAutostart === true; // по умолч. ждём Play; вкл — показываем сразу
|
||||||
// режим каждого потока (свой плеер / транскод) — настройка этого браузера
|
// режим каждого потока (свой плеер / транскод) — настройка этого браузера
|
||||||
this.mode1 = profileMode("1"); // 1 поток (основной)
|
this.mode1 = profileMode("1"); // 1 поток (основной)
|
||||||
this.mode2 = profileMode("2"); // 2 поток (суб)
|
this.mode2 = profileMode("2"); // 2 поток (суб)
|
||||||
@@ -1783,6 +1782,19 @@ const Settings = {
|
|||||||
// 3 независимых профиля (1 поток / 2 поток / архив), у каждого свой режим:
|
// 3 независимых профиля (1 поток / 2 поток / архив), у каждого свой режим:
|
||||||
// «Использовать свой плеер» (клиентский WASM-декод) или «Перекодировать» (сервер)
|
// «Использовать свой плеер» (клиентский WASM-декод) или «Перекодировать» (сервер)
|
||||||
const saved = document.getElementById("prefs-saved");
|
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) => {
|
["1", "2", "a"].forEach((which) => {
|
||||||
const block = document.querySelector(`.tr-block[data-tr="${which}"]`);
|
const block = document.querySelector(`.tr-block[data-tr="${which}"]`);
|
||||||
if (!block) return;
|
if (!block) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user