51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
export function renderBackrest(state) {
|
|
const d = state.backrest || {};
|
|
const online = d.source_status === "online";
|
|
|
|
const pill = document.getElementById("backrest-pill");
|
|
if (pill) {
|
|
pill.textContent = online ? "ONLINE" : "OFFLINE";
|
|
pill.className = "status-pill " + (online ? "pill-online" : "pill-offline");
|
|
}
|
|
|
|
const set = (id, val) => { const el = document.getElementById(id); if (el) el.textContent = val; };
|
|
|
|
if (online) {
|
|
set("backrest-repos", d.repo_count ?? 0);
|
|
set("backrest-last", fmtAge(d.last_backup_age_hours));
|
|
set("backrest-errors", d.error_count ?? 0);
|
|
} else {
|
|
set("backrest-repos", "—");
|
|
set("backrest-last", "—");
|
|
set("backrest-errors", "—");
|
|
}
|
|
|
|
// Color last backup age warn if > 26h
|
|
const lastEl = document.getElementById("backrest-last");
|
|
if (lastEl && online) {
|
|
const age = d.last_backup_age_hours;
|
|
lastEl.style.color = age !== null && age > 26 ? "var(--clr-warn)" : "";
|
|
}
|
|
|
|
// Color errors warn if any
|
|
const errEl = document.getElementById("backrest-errors");
|
|
if (errEl && online) {
|
|
errEl.style.color = (d.error_count ?? 0) > 0 ? "var(--clr-warn)" : "";
|
|
}
|
|
|
|
// Status dot
|
|
const dot = document.getElementById("backrest-status-dot");
|
|
if (dot) {
|
|
const s = d.last_backup_status || "unknown";
|
|
dot.className = "status-dot dot-" + (s === "ok" ? "ok" : s === "error" ? "err" : "unk");
|
|
dot.title = s;
|
|
}
|
|
}
|
|
|
|
function fmtAge(hours) {
|
|
if (hours === null || hours === undefined) return "—";
|
|
if (hours < 1) return `${Math.round(hours * 60)}m ago`;
|
|
if (hours < 24) return `${Math.round(hours)}h ago`;
|
|
return `${Math.round(hours / 24)}d ago`;
|
|
}
|