testing
This commit is contained in:
4
app.js
4
app.js
@@ -206,10 +206,6 @@ function setDailyMessage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setDailyMessage();
|
setDailyMessage();
|
||||||
/* =========================================
|
|
||||||
COUNTDOWN
|
|
||||||
========================================= */
|
|
||||||
|
|
||||||
/* =========================================
|
/* =========================================
|
||||||
COUNTDOWN (LIVE - UPDATES EVERY SECOND)
|
COUNTDOWN (LIVE - UPDATES EVERY SECOND)
|
||||||
========================================= */
|
========================================= */
|
||||||
|
|||||||
329
app.js~
329
app.js~
@@ -1,118 +1,253 @@
|
|||||||
const statusEl = document.getElementById("status");
|
|
||||||
const healthEl = document.getElementById("health");
|
const healthEl = document.getElementById("health");
|
||||||
|
const globalStatus = document.getElementById("globalStatus");
|
||||||
|
const lastUpdated = document.getElementById("lastUpdated");
|
||||||
|
|
||||||
|
const serverDot = document.getElementById("serverDot");
|
||||||
|
const webDot = document.getElementById("webDot");
|
||||||
|
const roamDot = document.getElementById("roamDot");
|
||||||
|
|
||||||
const buildBtn = document.getElementById("buildBtn");
|
const buildBtn = document.getElementById("buildBtn");
|
||||||
const buildResultEl = document.getElementById("buildResult");
|
const buildResultEl = document.getElementById("buildResult");
|
||||||
|
|
||||||
async function fetchStatus() {
|
|
||||||
try {
|
|
||||||
const res = await fetch("/api/status");
|
|
||||||
const text = await res.text();
|
|
||||||
statusEl.textContent = text;
|
|
||||||
statusEl.className = "badge ok";
|
|
||||||
} catch {
|
|
||||||
statusEl.textContent = "ERROR";
|
|
||||||
statusEl.className = "badge error";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchHealth() {
|
|
||||||
try {
|
|
||||||
const res = await fetch("/api/health");
|
|
||||||
const text = await res.text();
|
|
||||||
healthEl.textContent = text;
|
|
||||||
healthEl.className = "badge ok";
|
|
||||||
} catch {
|
|
||||||
healthEl.textContent = "ERROR";
|
|
||||||
healthEl.className = "badge error";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runBuild() {
|
|
||||||
buildBtn.disabled = true;
|
|
||||||
buildResultEl.textContent = "Running build...";
|
|
||||||
buildResultEl.className = "muted";
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await fetch("/api/build", {
|
|
||||||
method: "POST"
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
throw new Error("Build failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
const text = await res.text();
|
|
||||||
buildResultEl.textContent = text || "Build started successfully";
|
|
||||||
} catch (err) {
|
|
||||||
buildResultEl.textContent = "Build failed";
|
|
||||||
} finally {
|
|
||||||
buildBtn.disabled = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const logOutput = document.getElementById("logOutput");
|
const logOutput = document.getElementById("logOutput");
|
||||||
|
|
||||||
function streamLogs() {
|
|
||||||
const eventSource = new EventSource("/api/build/logs");
|
|
||||||
|
|
||||||
eventSource.onmessage = function(event) {
|
|
||||||
logOutput.textContent += event.data + "\n";
|
|
||||||
logOutput.scrollTop = logOutput.scrollHeight;
|
|
||||||
};
|
|
||||||
|
|
||||||
eventSource.onerror = function() {
|
|
||||||
eventSource.close();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
streamLogs();
|
|
||||||
// Initial load
|
|
||||||
fetchStatus();
|
|
||||||
fetchHealth();
|
|
||||||
|
|
||||||
// Button handler
|
|
||||||
buildBtn.addEventListener("click", runBuild);
|
|
||||||
|
|
||||||
const orgRoamBtn = document.getElementById("orgRoamBtn");
|
const orgRoamBtn = document.getElementById("orgRoamBtn");
|
||||||
const orgRoamResult = document.getElementById("orgRoamResult");
|
const orgRoamResult = document.getElementById("orgRoamResult");
|
||||||
const orgRoamLogs = document.getElementById("orgRoamLogs");
|
const orgRoamLogs = document.getElementById("orgRoamLogs");
|
||||||
|
|
||||||
let orgRoamEventSource = null;
|
let webEventSource = null;
|
||||||
|
let roamEventSource = null;
|
||||||
|
|
||||||
async function runOrgRoamBuild() {
|
/* =========================================
|
||||||
|
HEALTH
|
||||||
orgRoamBtn.disabled = true;
|
========================================= */
|
||||||
orgRoamLogs.textContent = ""; // 🔥 clear logs each run
|
|
||||||
orgRoamResult.textContent = "Running make...";
|
|
||||||
|
|
||||||
|
async function fetchHealth() {
|
||||||
try {
|
try {
|
||||||
const res = await fetch("/api/orgroam/build", { method: "POST" });
|
const res = await fetch("/api/health");
|
||||||
|
const text = await res.text();
|
||||||
|
|
||||||
if (!res.ok) {
|
healthEl.textContent = "Online";
|
||||||
throw new Error("Build failed");
|
healthEl.className = "badge ok";
|
||||||
}
|
|
||||||
|
|
||||||
orgRoamResult.textContent = "Build started";
|
serverDot.className = "dot green";
|
||||||
|
globalStatus.className = "global-ok";
|
||||||
|
globalStatus.textContent = "🟢 All Systems Running Normally";
|
||||||
|
|
||||||
if (orgRoamEventSource) {
|
lastUpdated.textContent =
|
||||||
orgRoamEventSource.close();
|
"Last checked: " + new Date().toLocaleTimeString();
|
||||||
}
|
|
||||||
|
|
||||||
orgRoamEventSource = new EventSource("/api/orgroam/logs");
|
} catch {
|
||||||
|
healthEl.textContent = "Offline";
|
||||||
|
healthEl.className = "badge error";
|
||||||
|
|
||||||
orgRoamEventSource.onmessage = function(event) {
|
serverDot.className = "dot red";
|
||||||
orgRoamLogs.textContent += event.data + "\n";
|
globalStatus.className = "global-error";
|
||||||
orgRoamLogs.scrollTop = orgRoamLogs.scrollHeight;
|
globalStatus.textContent = "⚠ Attention Required";
|
||||||
};
|
|
||||||
|
|
||||||
orgRoamEventSource.onerror = function() {
|
|
||||||
orgRoamEventSource.close();
|
|
||||||
};
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
orgRoamResult.textContent = "Build failed";
|
|
||||||
} finally {
|
|
||||||
orgRoamBtn.disabled = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto refresh every 10s
|
||||||
|
setInterval(fetchHealth, 10000);
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
LOG TOGGLE
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
document.querySelectorAll(".toggleLogs").forEach(btn => {
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
const target = document.getElementById(btn.dataset.target);
|
||||||
|
target.classList.toggle("hidden");
|
||||||
|
|
||||||
|
btn.textContent =
|
||||||
|
target.classList.contains("hidden")
|
||||||
|
? "Show technical details"
|
||||||
|
: "Hide technical details";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
STREAM HELPERS
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
function startLogStream(url, outputEl, setter) {
|
||||||
|
const source = new EventSource(url);
|
||||||
|
|
||||||
|
source.onmessage = (event) => {
|
||||||
|
outputEl.textContent += event.data + "\n";
|
||||||
|
outputEl.scrollTop = outputEl.scrollHeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
source.onerror = () => {
|
||||||
|
source.close();
|
||||||
|
};
|
||||||
|
|
||||||
|
setter(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeStream(source) {
|
||||||
|
if (source) source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
WEBSITE BUILD
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
async function runWebBuild() {
|
||||||
|
if (!confirm("This will update the website. Continue?")) return;
|
||||||
|
|
||||||
|
buildBtn.disabled = true;
|
||||||
|
buildResultEl.textContent = "🔄 Updating website...";
|
||||||
|
webDot.className = "dot yellow";
|
||||||
|
logOutput.textContent = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch("/api/build-web", { method: "POST" });
|
||||||
|
if (!res.ok) throw new Error();
|
||||||
|
|
||||||
|
closeStream(webEventSource);
|
||||||
|
|
||||||
|
startLogStream("/api/build-web/logs", logOutput, src => webEventSource = src);
|
||||||
|
|
||||||
|
pollWebStatus();
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
buildResultEl.textContent = "❌ Could not start update";
|
||||||
|
buildBtn.disabled = false;
|
||||||
|
webDot.className = "dot red";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function pollWebStatus() {
|
||||||
|
const interval = setInterval(async () => {
|
||||||
|
const res = await fetch("/api/build-web/status");
|
||||||
|
const status = await res.json();
|
||||||
|
|
||||||
|
if (!status.running) {
|
||||||
|
clearInterval(interval);
|
||||||
|
closeStream(webEventSource);
|
||||||
|
buildBtn.disabled = false;
|
||||||
|
|
||||||
|
if (status.lastExitCode === 0) {
|
||||||
|
buildResultEl.textContent = "✅ Website updated successfully";
|
||||||
|
webDot.className = "dot green";
|
||||||
|
} else {
|
||||||
|
buildResultEl.textContent =
|
||||||
|
"⚠ Update finished with issue (code " + status.lastExitCode + ")";
|
||||||
|
webDot.className = "dot red";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
ORG ROAM BUILD
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
async function runOrgRoamBuild() {
|
||||||
|
if (!confirm("Refresh the knowledge base?")) return;
|
||||||
|
|
||||||
|
orgRoamBtn.disabled = true;
|
||||||
|
orgRoamResult.textContent = "🔄 Refreshing notes...";
|
||||||
|
roamDot.className = "dot yellow";
|
||||||
|
orgRoamLogs.textContent = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch("/api/build-roam", { method: "POST" });
|
||||||
|
if (!res.ok) throw new Error();
|
||||||
|
|
||||||
|
closeStream(roamEventSource);
|
||||||
|
|
||||||
|
startLogStream("/api/build-roam/logs", orgRoamLogs, src => roamEventSource = src);
|
||||||
|
|
||||||
|
pollRoamStatus();
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
orgRoamResult.textContent = "❌ Could not start refresh";
|
||||||
|
orgRoamBtn.disabled = false;
|
||||||
|
roamDot.className = "dot red";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function pollRoamStatus() {
|
||||||
|
const interval = setInterval(async () => {
|
||||||
|
const res = await fetch("/api/build-roam/status");
|
||||||
|
const status = await res.json();
|
||||||
|
|
||||||
|
if (!status.running) {
|
||||||
|
clearInterval(interval);
|
||||||
|
closeStream(roamEventSource);
|
||||||
|
orgRoamBtn.disabled = false;
|
||||||
|
|
||||||
|
if (status.lastExitCode === 0) {
|
||||||
|
orgRoamResult.textContent = "✅ Notes refreshed successfully";
|
||||||
|
roamDot.className = "dot green";
|
||||||
|
} else {
|
||||||
|
orgRoamResult.textContent =
|
||||||
|
"⚠ Refresh finished with issue (code " + status.lastExitCode + ")";
|
||||||
|
roamDot.className = "dot red";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
DAILY MESSAGE
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
const messages = [
|
||||||
|
"You are my favourite person.",
|
||||||
|
];
|
||||||
|
|
||||||
|
function setDailyMessage() {
|
||||||
|
const today = new Date().toDateString();
|
||||||
|
const index = today.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0) % messages.length;
|
||||||
|
|
||||||
|
document.getElementById("dailyMessage").textContent = messages[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
setDailyMessage();
|
||||||
|
/* =========================================
|
||||||
|
COUNTDOWN
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
COUNTDOWN (LIVE - UPDATES EVERY SECOND)
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
function startCountdown() {
|
||||||
|
const targetDate = new Date("2026-08-03T00:00:00"); // change this
|
||||||
|
const label = "Nikah";
|
||||||
|
|
||||||
|
const countdownEl = document.getElementById("countdownText");
|
||||||
|
|
||||||
|
function updateCountdown() {
|
||||||
|
const now = new Date();
|
||||||
|
const diff = targetDate - now;
|
||||||
|
|
||||||
|
if (diff <= 0) {
|
||||||
|
countdownEl.textContent = `${label} is happening now! 🎉`;
|
||||||
|
clearInterval(interval);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
||||||
|
const hours = Math.floor((diff / (1000 * 60 * 60)) % 24);
|
||||||
|
const minutes = Math.floor((diff / (1000 * 60)) % 60);
|
||||||
|
const seconds = Math.floor((diff / 1000) % 60);
|
||||||
|
|
||||||
|
countdownEl.textContent =
|
||||||
|
`${label} in ${days}d ${hours}h ${minutes}m ${seconds}s`;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCountdown();
|
||||||
|
const interval = setInterval(updateCountdown, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
startCountdown();
|
||||||
|
/* =========================================
|
||||||
|
INIT
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
fetchHealth();
|
||||||
|
buildBtn.addEventListener("click", runWebBuild);
|
||||||
orgRoamBtn.addEventListener("click", runOrgRoamBuild);
|
orgRoamBtn.addEventListener("click", runOrgRoamBuild);
|
||||||
|
|||||||
Reference in New Issue
Block a user