-
-
-
- ${meta.label}
-
-
- Client: ${escapeHtml(shortId)}
-
+
+
+
+
+
+
+
+ ${escapeHtml(meta.label || "Event")}
+ Client
+ ${escapeHtml(shortId)}
+
+
-
${formatTimestamp(log.timestamp)}
+
+ ${escapeHtml(log.ip || "-")}
+ ${escapeHtml(log.username || "-")}
+
+ ${detailText ? `
${detailText}
` : ""}
-
- IP: ${escapeHtml(log.ip || "-")}
- User: ${escapeHtml(log.username || "-")}
-
- ${detailText ? `Details: ${detailText}
` : ""}
-
+
`;
})
.join("");
@@ -140,6 +149,18 @@ function renderLogs(logs) {
async function loadLogs() {
try {
+ if (refreshBtn) refreshBtn.disabled = true;
+ if (logsCount) logsCount.textContent = "Loading events…";
+ if (getSelectedActions().length === 0) {
+ total = 0;
+ page = 1;
+ renderLogs([]);
+ pageInfo.textContent = "Page 1 of 1";
+ prevPageBtn.disabled = true;
+ nextPageBtn.disabled = true;
+ lastUpdate.textContent = new Date().toLocaleTimeString();
+ return;
+ }
const params = buildQuery();
const res = await fetch(`/api/audit-logs?${params.toString()}`);
if (!res.ok) {
@@ -160,9 +181,12 @@ async function loadLogs() {
console.error("Failed to load logs", err);
if (logsContainer) {
logsContainer.innerHTML = `
-
Failed to load logs. Please try again.
+
Failed to load logs. Please try again.
`;
}
+ if (logsCount) logsCount.textContent = "Unable to load events";
+ } finally {
+ if (refreshBtn) refreshBtn.disabled = false;
}
}
@@ -181,6 +205,15 @@ clientFilter?.addEventListener("input", debounceLoad);
startDateInput?.addEventListener("change", resetAndLoad);
endDateInput?.addEventListener("change", resetAndLoad);
refreshBtn?.addEventListener("click", resetAndLoad);
+clearFiltersBtn?.addEventListener("click", () => {
+ if (clientFilter) clientFilter.value = "";
+ if (startDateInput) startDateInput.value = "";
+ if (endDateInput) endDateInput.value = "";
+ document.querySelectorAll(".action-checkbox").forEach((checkbox) => {
+ checkbox.checked = true;
+ });
+ resetAndLoad();
+});
Array.from(document.querySelectorAll(".action-checkbox")).forEach((cb) => {
cb.addEventListener("change", resetAndLoad);
diff --git a/Overlord-Server/public/assets/processes.js b/Overlord-Server/public/assets/processes.js
index 9a573ec..f593cb2 100644
--- a/Overlord-Server/public/assets/processes.js
+++ b/Overlord-Server/public/assets/processes.js
@@ -28,7 +28,7 @@ const searchInput = document.getElementById("search-input");
const clientIdHeader = document.getElementById("client-id-header");
if (clientIdHeader) {
- clientIdHeader.textContent = `${clientId} - Process Manager`;
+ clientIdHeader.innerHTML = `
${escapeHtml(clientId)}`;
}
function connect() {
@@ -76,10 +76,13 @@ function updateStatus(state, text) {
};
statusEl.innerHTML = `${icons[state] || icons.disconnected} ${text}`;
- statusEl.className =
- state === "connected"
- ? "inline-flex items-center gap-2 px-3 py-2 rounded-full bg-green-900/40 text-green-100 border border-green-700/60"
- : "inline-flex items-center gap-2 px-3 py-2 rounded-full bg-slate-800 text-slate-300";
+ const stateClasses = {
+ connected: "bg-emerald-500/10 text-emerald-300 border-emerald-500/30",
+ error: "bg-red-500/10 text-red-300 border-red-500/30",
+ disconnected: "bg-slate-800 text-slate-300 border-slate-700",
+ connecting: "bg-sky-500/10 text-sky-300 border-sky-500/30",
+ };
+ statusEl.className = `inline-flex self-start sm:self-auto items-center gap-2 px-3 py-1.5 rounded-full border text-xs font-medium ${stateClasses[state] || stateClasses.disconnected}`;
}
function enableControls(enabled) {
@@ -280,7 +283,7 @@ function renderProcesses() {
function rowClassName(proc) {
let cls =
- "process-row grid grid-cols-12 gap-3 px-4 py-3 border border-transparent cursor-pointer transition-colors";
+ "process-row grid grid-cols-12 gap-3 px-4 py-3 border-l-2 border-transparent cursor-pointer transition-colors";
if (selectedPid === proc.pid) cls += " selected";
if (proc.self) cls += " self-process";
return cls;
@@ -356,14 +359,14 @@ function rowInnerHtml(proc, depth) {
: "";
return `
-
${proc.pid}
-
+
${proc.pid}
+
${indent}${treeIcon}${procIcon}
${escapeHtml(proc.name)}${selfBadge}
-
${displayCpu.toFixed(1)}%
-
${memoryStr}
-
${escapeHtml(proc.username || "-")}
+
${displayCpu.toFixed(1)}%
+
${memoryStr}
+
${escapeHtml(proc.username || "-")}
`;
}
diff --git a/Overlord-Server/public/logs.html b/Overlord-Server/public/logs.html
index e8a5eee..f3aff03 100644
--- a/Overlord-Server/public/logs.html
+++ b/Overlord-Server/public/logs.html
@@ -9,7 +9,7 @@
-
+
@@ -20,109 +20,112 @@
-
-
-
-
-
Client Connection Logs
-
- Track first connects, reconnects, uninstalls, and disconnects.
-
+
+
+
+
Client Connection Logs
+
Review connection lifecycle activity across enrolled clients.
+
+
+
+ Updated Never
+
+
+
+
+
+
+
-
- Updated:
Never
+
+
Filter activity
+
Narrow results by client, time range, or event type.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-