v1.5.2 - admin: live server clock + UTC warning, /api/time ref
This commit is contained in:
+15
-1
@@ -55,6 +55,9 @@
|
||||
.empty h2{font-size:1.1rem;font-weight:400;margin-bottom:.4rem;color:#777}
|
||||
.ws-pill{font-size:.72rem;padding:3px 9px;border-radius:20px}
|
||||
.ws-pill.on{background:rgba(34,197,94,.12);color:#86efac}.ws-pill.off{background:rgba(239,68,68,.12);color:#fca5a5}
|
||||
.srv-clock{font-size:.78rem;font-family:monospace;padding:3px 10px;border-radius:20px;background:rgba(255,255,255,.06);color:#cbd5e1;border:1px solid rgba(255,255,255,.1);white-space:nowrap}
|
||||
.srv-clock .tz{color:#888;font-size:.68rem;margin-left:5px}
|
||||
.srv-clock.warn{background:rgba(234,179,8,.12);border-color:rgba(234,179,8,.4);color:#fde68a}
|
||||
.divider{border:none;border-top:1px solid rgba(255,255,255,.05);margin:.4rem 0}
|
||||
.offline-msg{font-size:.78rem;color:#666;text-align:center;padding:.6rem}
|
||||
.sec-head{font-size:1.15rem;font-weight:300;margin:2rem 0 .75rem;padding-top:1.25rem;border-top:1px solid rgba(255,255,255,.08);display:flex;align-items:center;justify-content:space-between;cursor:pointer}
|
||||
@@ -100,6 +103,7 @@
|
||||
<img src="/img/icon.png" alt="Frambe" onerror="this.style.display='none'">
|
||||
<div><h1>Frambe Admin</h1><span class="version" id="ver">Connecting...</span></div>
|
||||
<div class="header-right">
|
||||
<span class="srv-clock" id="srv-clock" title="Server local time — sleep schedule uses this clock">--:--</span>
|
||||
<span class="ws-pill off" id="ws-pill">Disconnected</span>
|
||||
<button class="btn logout" id="logout-btn" style="display:none" onclick="doLogout()">Logout</button>
|
||||
</div>
|
||||
@@ -129,7 +133,7 @@
|
||||
<h3>Sleep Schedule</h3>
|
||||
<div class="srow"><span class="clbl">Enabled</span><label class="tgl"><input type="checkbox" id="gs-sleep-on"><span class="tgl-s"></span></label></div>
|
||||
<div class="srow sleep-fields"><span class="clbl">Sleep at</span><input type="time" id="gs-sleep-at" value="23:00"><span class="clbl">Wake at</span><input type="time" id="gs-wake-at" value="06:00"></div>
|
||||
<div class="hint">Frames sleep (black screen) during this window. Crosses midnight automatically. Uses the server's local time.</div>
|
||||
<div class="hint">Frames sleep (black screen) during this window. Crosses midnight automatically. Uses the server's local time (shown top-right).</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="save-bar">
|
||||
@@ -150,6 +154,7 @@
|
||||
<div class="api-card"><h3><span class="mtd post">POST</span><span class="ep">/api/clients/:id/command</span></h3><p>Send a command to a frame. Actions: <code>start</code> <code>stop</code> <code>next</code> <code>prev</code> <code>sleep</code> <code>wake</code> <code>refresh</code> <code>setSource</code> <code>setConfig</code></p><pre id="c-cmd">curl -s -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -d '{"action":"next"}' http://YOUR_HOST:3030/api/clients/CLIENT_ID/command<span class="cpb" onclick="cc('c-cmd')">Copy</span></pre></div>
|
||||
<div class="api-card"><h3><span class="mtd del">DELETE</span><span class="ep">/api/clients/:id</span></h3><p>Remove a frame from the registry.</p><pre id="c-del">curl -s -X DELETE -H "Authorization: Bearer YOUR_TOKEN" http://YOUR_HOST:3030/api/clients/CLIENT_ID<span class="cpb" onclick="cc('c-del')">Copy</span></pre></div>
|
||||
<div class="api-card"><h3><span class="mtd get">GET</span><span class="ep">/api/settings</span> · <span class="mtd put">PUT</span><span class="ep">/api/settings</span></h3><p>Read or update global settings (default source, interval, display toggles, sleep schedule). PUT requires the API token.</p><pre id="c-set">curl -s -X PUT -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -d '{"sleep":{"enabled":true,"sleepAt":"23:00","wakeAt":"06:00"}}' http://YOUR_HOST:3030/api/settings<span class="cpb" onclick="cc('c-set')">Copy</span></pre></div>
|
||||
<div class="api-card"><h3><span class="mtd get">GET</span><span class="ep">/api/time</span></h3><p>Server local time and timezone (the clock the sleep schedule uses).</p><pre id="c-time">curl -s http://YOUR_HOST:3030/api/time<span class="cpb" onclick="cc('c-time')">Copy</span></pre></div>
|
||||
</div>
|
||||
|
||||
<div class="modal-overlay" id="ha-modal">
|
||||
@@ -184,6 +189,15 @@ function connect(){
|
||||
}
|
||||
async function loadMeta(){try{var c=await(await fetch('/api/config')).json();document.getElementById('ver').textContent='v'+(c.version||'?');albums=await(await fetch('/api/albums')).json();people=await(await fetch('/api/people')).json();populateGsSource();if(settings)applySettingsToForm(settings);}catch(e){}}
|
||||
|
||||
// === SERVER CLOCK ===
|
||||
// Sleep schedule is evaluated in the server's local timezone, so show it here.
|
||||
// Anchor to one /api/time fetch, then tick locally; re-sync periodically.
|
||||
var srvOffsetMs=null,srvTz='';
|
||||
async function syncServerTime(){try{var t=await(await fetch('/api/time')).json();srvOffsetMs=t.epoch-Date.now();srvTz=t.tz||('UTC'+(t.offsetMinutes>=0?'+':'')+(t.offsetMinutes/60));}catch(e){}}
|
||||
function p2(n){return n<10?'0'+n:''+n;}
|
||||
function tickServerClock(){if(srvOffsetMs===null)return;var d=new Date(Date.now()+srvOffsetMs);var el=document.getElementById('srv-clock');if(!el)return;var warn=(srvTz==='UTC'||srvTz==='Etc/UTC');el.innerHTML=p2(d.getUTCHours())+':'+p2(d.getUTCMinutes())+':'+p2(d.getUTCSeconds())+'<span class="tz">'+esc(srvTz)+(warn?' ⚠':'')+'</span>';el.className='srv-clock'+(warn?' warn':'');el.title=warn?'Server is on UTC — sleep times will be offset from your local time. Set TZ in docker-compose.':'Server local time — sleep schedule uses this clock';}
|
||||
syncServerTime().then(tickServerClock);setInterval(tickServerClock,1000);setInterval(syncServerTime,300000);
|
||||
|
||||
// === GLOBAL SETTINGS FORM ===
|
||||
function populateGsSource(){
|
||||
var sel=document.getElementById('gs-source'),cur=sel.value;
|
||||
|
||||
Reference in New Issue
Block a user