Soften updater stub messaging (no error)

This commit is contained in:
Aaron
2025-12-10 19:15:30 -05:00
parent c85df728b7
commit 47bd69a092
7 changed files with 445 additions and 4 deletions

View File

@@ -1,6 +1,14 @@
// Entry point for the dashboard: wires UI events, pulls status, and initializes
// feature modules (services, settings, stats).
import { getStatus, triggerReset } from "./api.js";
import {
getStatus,
triggerReset,
getReleaseStatus,
checkRelease,
applyRelease,
rollbackRelease,
setReleaseAutoCheck,
} from "./api.js";
import { placeholderStatus, renderStats } from "./status.js";
import { initServiceControls, renderServices } from "./services.js";
import { initSettings } from "./settings.js";
@@ -22,6 +30,7 @@ const updatesStatus = document.getElementById("updatesStatus");
const updatesFlagTop = document.getElementById("updatesFlagTop");
const updatesNoteTop = document.getElementById("updatesNoteTop");
const tempFlagTop = document.getElementById("tempFlagTop");
const releaseFlagTop = document.getElementById("releaseFlagTop");
const refreshIntervalInput = document.getElementById("refreshIntervalInput");
const refreshIntervalSave = document.getElementById("refreshIntervalSave");
const refreshIntervalMsg = document.getElementById("refreshIntervalMsg");
@@ -74,6 +83,18 @@ const menuClose = document.getElementById("menuClose");
const advBtn = document.getElementById("advBtn");
const advModal = document.getElementById("advModal");
const advClose = document.getElementById("advClose");
const releaseBtn = document.getElementById("releaseBtn");
const releaseModal = document.getElementById("releaseModal");
const releaseClose = document.getElementById("releaseClose");
const releaseCurrent = document.getElementById("releaseCurrent");
const releaseLatest = document.getElementById("releaseLatest");
const releaseStatusMsg = document.getElementById("releaseStatusMsg");
const releaseProgress = document.getElementById("releaseProgress");
const releaseCheckBtn = document.getElementById("releaseCheckBtn");
const releaseApplyBtn = document.getElementById("releaseApplyBtn");
const releaseRollbackBtn = document.getElementById("releaseRollbackBtn");
const releaseAutoCheck = document.getElementById("releaseAutoCheck");
const helpBtn = document.getElementById("helpBtn");
const helpModal = document.getElementById("helpModal");
const helpClose = document.getElementById("helpClose");
@@ -228,6 +249,7 @@ function applyTooltips() {
updatesFlagTop: "Auto updates status; configure in Settings → Automatic updates.",
refreshFlagTop: "Auto-refresh interval; change in Settings → Refresh interval.",
tempFlagTop: "CPU temperature status; see details in the hero stats below.",
releaseFlagTop: "Pi-Kit release status; open Settings → Updates to install.",
themeToggle: "Toggle light or dark theme",
helpBtn: "Open quick help",
advBtn: "Open settings",
@@ -327,6 +349,8 @@ async function loadStatus() {
setTimeout(loadStatus, 3000);
}
}
// Pull Pi-Kit release status after core status
loadReleaseStatus();
} catch (e) {
console.error(e);
renderStats(heroStats, placeholderStatus);
@@ -361,6 +385,67 @@ function updatesFlagEl(enabled) {
else if (enabled === false) updatesFlagTop.classList.add("chip-off");
}
async function loadReleaseStatus() {
if (!releaseFlagTop) return;
setReleaseChip({ status: "checking" });
try {
const data = await getReleaseStatus();
const {
current_version = "n/a",
latest_version = "n/a",
status = "unknown",
message = "",
auto_check = false,
progress = null,
} = data || {};
setReleaseChip(data);
if (releaseCurrent) releaseCurrent.textContent = current_version;
if (releaseLatest) releaseLatest.textContent = latest_version;
if (releaseStatusMsg) {
releaseStatusMsg.textContent =
status === "update_available"
? message || "Update available"
: status === "up_to_date"
? "Up to date"
: message || status;
releaseStatusMsg.classList.toggle("error", status === "error");
}
if (releaseAutoCheck) releaseAutoCheck.checked = !!auto_check;
if (releaseProgress) {
releaseProgress.textContent = progress ? progress : "";
}
} catch (e) {
console.error("Failed to load release status", e);
setReleaseChip({ status: "error", message: "Failed to load" });
if (releaseStatusMsg) {
releaseStatusMsg.textContent = "Failed to load release status";
releaseStatusMsg.classList.add("error");
}
}
}
function setReleaseChip(state) {
if (!releaseFlagTop) return;
releaseFlagTop.textContent = "Pi-Kit: n/a";
releaseFlagTop.className = "status-chip quiet";
if (!state) return;
const { status, latest_version, current_version, message } = state;
const label =
status === "update_available"
? `Update → ${latest_version || "new"}`
: status === "up_to_date"
? `Pi-Kit: ${current_version || "latest"}`
: status === "checking"
? "Checking…"
: status === "error"
? "Update error"
: `Pi-Kit: ${current_version || "n/a"}`;
releaseFlagTop.textContent = label;
if (status === "update_available") releaseFlagTop.classList.add("chip-warm");
if (status === "error") releaseFlagTop.classList.add("chip-off");
releaseFlagTop.title = message || "Pi-Kit release status";
}
function wireModals() {
advBtn.onclick = () => advModal.classList.remove("hidden");
advClose.onclick = () => advModal.classList.add("hidden");
@@ -374,6 +459,65 @@ function wireModals() {
addServiceModal?.addEventListener("click", (e) => {
if (e.target === addServiceModal) addServiceModal.classList.add("hidden");
});
releaseBtn?.addEventListener("click", () => {
releaseModal?.classList.remove("hidden");
loadReleaseStatus();
});
releaseClose?.addEventListener("click", () => releaseModal?.classList.add("hidden"));
releaseModal?.addEventListener("click", (e) => {
if (e.target === releaseModal) releaseModal.classList.add("hidden");
});
}
function wireReleaseControls() {
releaseCheckBtn?.addEventListener("click", async () => {
try {
if (releaseProgress) releaseProgress.textContent = "Checking for updates…";
await checkRelease();
await loadReleaseStatus();
showToast("Checked for updates", "success");
} catch (e) {
showToast(e.error || "Check failed", "error");
} finally {
if (releaseProgress) releaseProgress.textContent = "";
}
});
releaseApplyBtn?.addEventListener("click", async () => {
try {
if (releaseProgress) releaseProgress.textContent = "Downloading and installing…";
await applyRelease();
await loadReleaseStatus();
showToast("Update started", "success");
} catch (e) {
showToast(e.error || "Update failed", "error");
} finally {
if (releaseProgress) releaseProgress.textContent = "";
}
});
releaseRollbackBtn?.addEventListener("click", async () => {
try {
if (releaseProgress) releaseProgress.textContent = "Rolling back…";
await rollbackRelease();
await loadReleaseStatus();
showToast("Rollback complete", "success");
} catch (e) {
showToast(e.error || "Rollback failed", "error");
} finally {
if (releaseProgress) releaseProgress.textContent = "";
}
});
releaseAutoCheck?.addEventListener("change", async () => {
try {
await setReleaseAutoCheck(releaseAutoCheck.checked);
showToast("Auto-check preference saved", "success");
} catch (e) {
showToast(e.error || "Failed to save preference", "error");
releaseAutoCheck.checked = !releaseAutoCheck.checked;
}
});
}
function showBusy(title = "Working…", text = "This may take a few seconds.") {
@@ -449,6 +593,7 @@ if (typeof window !== "undefined") {
function main() {
applyTooltips();
wireModals();
wireReleaseControls();
wireResetAndUpdates();
wireAccordions();
loadToastSettings();