Compare commits
6 Commits
v0.1.0-dev
...
v0.1.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28acb94a6f | ||
|
|
2c60ba981b | ||
|
|
92e4ce88df | ||
|
|
c1eb7d0765 | ||
|
|
c66f7d78a0 | ||
|
|
c20ea57da6 |
@@ -5,7 +5,7 @@ import { placeholderStatus, renderStats } from "./status.js";
|
||||
import { initServiceControls, renderServices } from "./services.js";
|
||||
import { initSettings } from "./settings.js";
|
||||
import { initUpdateSettings, isUpdatesDirty } from "./update-settings.js";
|
||||
import { initReleaseUI } from "./releases.js?v=20251213f";
|
||||
import { initReleaseUI } from "./releases.js?v=20251213g";
|
||||
|
||||
const servicesGrid = document.getElementById("servicesGrid");
|
||||
const heroStats = document.getElementById("heroStats");
|
||||
|
||||
@@ -45,15 +45,19 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
let releaseLogLines = [];
|
||||
let releaseLastFetched = 0;
|
||||
let lastReleaseLogKey = "";
|
||||
let lastReleaseToastKey = null;
|
||||
let lastLogMessage = null;
|
||||
let changelogCache = { version: null, text: "" };
|
||||
let lastChangelogUrl = null;
|
||||
let releaseChannel = "dev";
|
||||
|
||||
function logRelease(msg) {
|
||||
if (!msg) return;
|
||||
const plain = msg.trim();
|
||||
if (plain === lastLogMessage) return;
|
||||
lastLogMessage = plain;
|
||||
const ts = new Date().toLocaleTimeString();
|
||||
const line = `${ts} ${msg}`;
|
||||
if (releaseLogLines[0] === line) return;
|
||||
releaseLogLines.unshift(line);
|
||||
releaseLogLines = releaseLogLines.slice(0, 120);
|
||||
if (releaseLog) {
|
||||
@@ -84,12 +88,8 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
const msg = shorten(message, 80) || "";
|
||||
releaseFlagTop.title = msg || "Pi-Kit release status";
|
||||
if (releaseStatusMsg) {
|
||||
releaseStatusMsg.textContent =
|
||||
status === "update_available"
|
||||
? msg || "Update available"
|
||||
: status === "up_to_date"
|
||||
? msg || "Up to date"
|
||||
: msg || status;
|
||||
releaseStatusMsg.textContent = status === "update_available" ? msg || "Update available" : "";
|
||||
releaseStatusMsg.classList.remove("error");
|
||||
}
|
||||
if (releaseLogStatus) {
|
||||
releaseLogStatus.textContent =
|
||||
@@ -177,10 +177,9 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
} 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");
|
||||
}
|
||||
// surface via toast/log only; avoid inline red flashes
|
||||
showToast("Failed to load release status", "error");
|
||||
logRelease("Error: failed to load release status");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,11 +199,20 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
releaseBusyActive = false;
|
||||
hideBusy();
|
||||
if (releaseProgress) releaseProgress.textContent = "";
|
||||
if (state.status === "up_to_date") {
|
||||
// Only toast once per apply/rollback cycle
|
||||
if (state.status === "up_to_date" && releaseBusyActive === false) {
|
||||
const key = `ok-${state.current_version || ""}-${state.latest_version || ""}`;
|
||||
if (lastReleaseToastKey !== key) {
|
||||
lastReleaseToastKey = key;
|
||||
showToast(state.message || "Update complete", "success");
|
||||
}
|
||||
logRelease("Update complete");
|
||||
} else if (state.status === "error") {
|
||||
const key = `err-${state.message || ""}`;
|
||||
if (lastReleaseToastKey !== key) {
|
||||
lastReleaseToastKey = key;
|
||||
showToast(state.message || "Update failed", "error");
|
||||
}
|
||||
logRelease(`Error: ${state.message || "Update failed"}`);
|
||||
}
|
||||
}
|
||||
@@ -218,8 +226,11 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
loadReleaseStatus(true);
|
||||
});
|
||||
releaseClose?.addEventListener("click", () => releaseModal?.classList.add("hidden"));
|
||||
// Do not allow dismiss by clicking backdrop (consistency with other modals)
|
||||
releaseModal?.addEventListener("click", (e) => {
|
||||
if (e.target === releaseModal) releaseModal.classList.add("hidden");
|
||||
if (e.target === releaseModal) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
});
|
||||
|
||||
releaseCheckBtn?.addEventListener("click", async () => {
|
||||
@@ -242,6 +253,7 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
|
||||
releaseApplyBtn?.addEventListener("click", async () => {
|
||||
try {
|
||||
lastReleaseToastKey = null;
|
||||
const state = window.__lastReleaseState || {};
|
||||
const { current_version, latest_version } = state;
|
||||
const sameVersion =
|
||||
@@ -274,6 +286,7 @@ export function initReleaseUI({ showToast, showBusy, hideBusy, confirmAction })
|
||||
|
||||
releaseRollbackBtn?.addEventListener("click", async () => {
|
||||
try {
|
||||
lastReleaseToastKey = null;
|
||||
releaseBusyActive = true;
|
||||
showBusy("Rolling back…", "Restoring previous backup.");
|
||||
logRelease("Starting rollback…");
|
||||
|
||||
@@ -425,15 +425,6 @@ body {
|
||||
#releaseProgress {
|
||||
display: none;
|
||||
}
|
||||
.status-msg {
|
||||
display: none;
|
||||
}
|
||||
.status-msg.error {
|
||||
display: block;
|
||||
}
|
||||
#releaseStatusMsg {
|
||||
display: block;
|
||||
}
|
||||
.updates-status {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -115,14 +115,15 @@ export function initUpdateSettings({
|
||||
|
||||
function showMessage(text, isError = false) {
|
||||
if (!msgEl) return;
|
||||
msgEl.textContent = text || "";
|
||||
msgEl.classList.toggle("error", isError);
|
||||
|
||||
if (text) {
|
||||
if (toast && msgEl.id !== "updatesMsg") toast(text, isError ? "error" : "success");
|
||||
setTimeout(() => (msgEl.textContent = ""), 2500);
|
||||
// Only surface inline text for errors; successes go to toast only.
|
||||
if (isError) {
|
||||
msgEl.textContent = text || "Something went wrong";
|
||||
msgEl.classList.add("error");
|
||||
} else {
|
||||
msgEl.textContent = "";
|
||||
msgEl.classList.remove("error");
|
||||
}
|
||||
|
||||
if (toast) toast(text || (isError ? "Error" : ""), isError ? "error" : "success");
|
||||
}
|
||||
|
||||
function currentConfigFromForm() {
|
||||
|
||||
@@ -726,7 +726,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="module" src="assets/main.js?v=20251213f"></script>
|
||||
<script type="module" src="assets/main.js?v=20251213g"></script>
|
||||
<div id="toastContainer" class="toast-container"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user