|
|
@@ -1388,6 +1388,14 @@ a{color:var(--cyan);text-decoration:none}
|
|
|
|
.stat-card .val{font-size:1.6rem;color:var(--cyan)}
|
|
|
|
.stat-card .val{font-size:1.6rem;color:var(--cyan)}
|
|
|
|
.stat-card .sub{color:var(--text-dim);font-size:0.65rem;margin-top:4px}
|
|
|
|
.stat-card .sub{color:var(--text-dim);font-size:0.65rem;margin-top:4px}
|
|
|
|
.stat-card .ok{color:var(--green)}.stat-card .warn{color:var(--yellow)}.stat-card .danger{color:var(--red)}
|
|
|
|
.stat-card .ok{color:var(--green)}.stat-card .warn{color:var(--yellow)}.stat-card .danger{color:var(--red)}
|
|
|
|
|
|
|
|
/* Sites tab: domain names are much longer than typical stat labels (e.g.
|
|
|
|
|
|
|
|
parkerslingshotrentals.com) — wider columns + no letter-spacing so they read cleanly. */
|
|
|
|
|
|
|
|
.site-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin-bottom:24px}
|
|
|
|
|
|
|
|
.site-card{background:var(--surface);border:1px solid var(--border);padding:16px}
|
|
|
|
|
|
|
|
.site-card .lbl{color:var(--text-dim);font-size:0.68rem;letter-spacing:0.5px;margin-bottom:8px;white-space:normal;word-break:break-word;line-height:1.4}
|
|
|
|
|
|
|
|
.site-card .val{font-size:1.2rem;color:var(--cyan)}
|
|
|
|
|
|
|
|
.site-card .sub{color:var(--text-dim);font-size:0.65rem;margin-top:4px}
|
|
|
|
|
|
|
|
.site-card .ok{color:var(--green)}.site-card .danger{color:var(--red)}
|
|
|
|
|
|
|
|
|
|
|
|
/* ── TABLE ── */
|
|
|
|
/* ── TABLE ── */
|
|
|
|
.tbl-wrap{background:var(--surface);border:1px solid var(--border);overflow-x:auto}
|
|
|
|
.tbl-wrap{background:var(--surface);border:1px solid var(--border);overflow-x:auto}
|
|
|
@@ -3520,18 +3528,18 @@ async function loadSites() {
|
|
|
|
if (!sites.length) { document.getElementById('sites-content').innerHTML='<div class="empty">NO SITE DATA</div>'; return; }
|
|
|
|
if (!sites.length) { document.getElementById('sites-content').innerHTML='<div class="empty">NO SITE DATA</div>'; return; }
|
|
|
|
const labels = {
|
|
|
|
const labels = {
|
|
|
|
'jarvis':'jarvis.orbishosting.com','tomsjavajive':'tomsjavajive.com',
|
|
|
|
'jarvis':'jarvis.orbishosting.com','tomsjavajive':'tomsjavajive.com',
|
|
|
|
'epictravelexp':'epictravelexpeditions.com','parkersling':'parkerslingshot',
|
|
|
|
'epictravelexp':'epictravelexpeditions.com','parkerslingshotrentals':'parkerslingshotrentals.com',
|
|
|
|
'orbishosting':'orbishosting.com','orbisportal':'orbis.orbishosting.com','tomtomgames':'tomtomgames.com'
|
|
|
|
'orbishosting':'orbishosting.com','orbisportal':'orbis.orbishosting.com','tomtomgames':'tomtomgames.com'
|
|
|
|
};
|
|
|
|
};
|
|
|
|
let cards = sites.map(s => {
|
|
|
|
let cards = sites.map(s => {
|
|
|
|
const up = s.fact_value==='up';
|
|
|
|
const up = s.fact_value==='up';
|
|
|
|
return `<div class="stat-card" style="border-left:3px solid ${up?'var(--green)':'var(--red)'}">
|
|
|
|
return `<div class="site-card" style="border-left:3px solid ${up?'var(--green)':'var(--red)'}">
|
|
|
|
<div class="lbl">${esc(labels[s.fact_key]||s.fact_key)}</div>
|
|
|
|
<div class="lbl">${esc(labels[s.fact_key]||s.fact_key)}</div>
|
|
|
|
<div class="val ${up?'ok':'danger'}" style="font-size:1.2rem">${up?'ONLINE':'OFFLINE'}</div>
|
|
|
|
<div class="val ${up?'ok':'danger'}">${up?'ONLINE':'OFFLINE'}</div>
|
|
|
|
<div class="sub">checked ${ago(s.updated_at)}</div>
|
|
|
|
<div class="sub">checked ${ago(s.updated_at)}</div>
|
|
|
|
</div>`;
|
|
|
|
</div>`;
|
|
|
|
}).join('');
|
|
|
|
}).join('');
|
|
|
|
document.getElementById('sites-content').innerHTML = `<div class="stat-grid">${cards}</div>`;
|
|
|
|
document.getElementById('sites-content').innerHTML = `<div class="site-grid">${cards}</div>`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ── USERS ─────────────────────────────────────────────────────────────────────
|
|
|
|
// ── USERS ─────────────────────────────────────────────────────────────────────
|
|
|
|