Compare commits
4 Commits
v0.1.0-dev
...
v0.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98fbe1b96e | ||
|
|
8864df2b2c | ||
|
|
d49218409d | ||
|
|
35c83a918b |
@@ -107,8 +107,8 @@ export async function initDiagUI({ elements, toast }) {
|
|||||||
const entries = await syncState();
|
const entries = await syncState();
|
||||||
render(entries);
|
render(entries);
|
||||||
toast?.("Diagnostics refreshed (after retry)", "success");
|
toast?.("Diagnostics refreshed (after retry)", "success");
|
||||||
} catch {
|
} catch (err2) {
|
||||||
// swallow
|
toast?.(err2.error || "Diagnostics still failing", "error");
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setBusy(false);
|
setBusy(false);
|
||||||
@@ -126,6 +126,8 @@ export async function initDiagUI({ elements, toast }) {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
toast?.(e.error || "Failed to save diagnostics setting", "error");
|
toast?.(e.error || "Failed to save diagnostics setting", "error");
|
||||||
enableToggle.checked = !enableToggle.checked;
|
enableToggle.checked = !enableToggle.checked;
|
||||||
|
setBusy(false);
|
||||||
|
return;
|
||||||
} finally {
|
} finally {
|
||||||
setBusy(false);
|
setBusy(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { initServiceControls, renderServices } from "./services.js";
|
|||||||
import { initSettings } from "./settings.js";
|
import { initSettings } from "./settings.js";
|
||||||
import { initUpdateSettings, isUpdatesDirty } from "./update-settings.js";
|
import { initUpdateSettings, isUpdatesDirty } from "./update-settings.js";
|
||||||
import { initReleaseUI } from "./releases.js?v=20251213h";
|
import { initReleaseUI } from "./releases.js?v=20251213h";
|
||||||
import { initDiagUI, logUi } from "./diaglog.js?v=20251213i";
|
import { initDiagUI, logUi } from "./diaglog.js?v=20251213j";
|
||||||
|
|
||||||
const servicesGrid = document.getElementById("servicesGrid");
|
const servicesGrid = document.getElementById("servicesGrid");
|
||||||
const heroStats = document.getElementById("heroStats");
|
const heroStats = document.getElementById("heroStats");
|
||||||
@@ -133,6 +133,7 @@ let toastDurationMs = 5000;
|
|||||||
let toastSpeedMs = 300;
|
let toastSpeedMs = 300;
|
||||||
let fontChoice = "redhat";
|
let fontChoice = "redhat";
|
||||||
let releaseUI = null;
|
let releaseUI = null;
|
||||||
|
let lastStatusData = null;
|
||||||
|
|
||||||
function applyToastSettings() {
|
function applyToastSettings() {
|
||||||
if (!toastContainer) return;
|
if (!toastContainer) return;
|
||||||
@@ -318,6 +319,7 @@ function setUpdatesUI(enabled) {
|
|||||||
async function loadStatus() {
|
async function loadStatus() {
|
||||||
try {
|
try {
|
||||||
const data = await getStatus();
|
const data = await getStatus();
|
||||||
|
lastStatusData = data;
|
||||||
renderStats(heroStats, data);
|
renderStats(heroStats, data);
|
||||||
renderServices(servicesGrid, data.services, { openAddService });
|
renderServices(servicesGrid, data.services, { openAddService });
|
||||||
const updatesEnabled =
|
const updatesEnabled =
|
||||||
@@ -358,8 +360,12 @@ async function loadStatus() {
|
|||||||
releaseUI?.refreshStatus();
|
releaseUI?.refreshStatus();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
logUi(`Status refresh failed: ${e?.message || e}`, "error");
|
||||||
|
if (!lastStatusData) {
|
||||||
renderStats(heroStats, placeholderStatus);
|
renderStats(heroStats, placeholderStatus);
|
||||||
}
|
}
|
||||||
|
setTimeout(loadStatus, 2000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setTempFlag(tempC) {
|
function setTempFlag(tempC) {
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction, lo
|
|||||||
releaseLog.textContent = releaseLogLines.join("\n");
|
releaseLog.textContent = releaseLogLines.join("\n");
|
||||||
releaseLog.scrollTop = 0; // keep most recent in view
|
releaseLog.scrollTop = 0; // keep most recent in view
|
||||||
}
|
}
|
||||||
|
// Mirror into global diagnostics log (frontend side)
|
||||||
|
const lvl = msg.toLowerCase().startsWith("error") ? "error" : "info";
|
||||||
|
logUi(`Update: ${msg}`, lvl);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setReleaseChip(state) {
|
function setReleaseChip(state) {
|
||||||
@@ -175,11 +178,16 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction, lo
|
|||||||
pollReleaseStatus();
|
pollReleaseStatus();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
// During an update/rollback the API may restart; retry quietly.
|
||||||
|
if (releaseBusyActive) {
|
||||||
|
setTimeout(() => loadReleaseStatus(true), 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
console.error("Failed to load release status", e);
|
console.error("Failed to load release status", e);
|
||||||
setReleaseChip({ status: "error", message: "Failed to load" });
|
setReleaseChip({ status: "error", message: "Failed to load" });
|
||||||
// surface via toast/log only; avoid inline red flashes
|
// surface via toast/log only once
|
||||||
showToast("Failed to load release status", "error");
|
|
||||||
logRelease("Error: failed to load release status");
|
logRelease("Error: failed to load release status");
|
||||||
|
showToast("Failed to load release status", "error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -777,7 +777,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="module" src="assets/main.js?v=20251213i"></script>
|
<script type="module" src="assets/main.js?v=20251213j"></script>
|
||||||
<div id="toastContainer" class="toast-container"></div>
|
<div id="toastContainer" class="toast-container"></div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user