refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
/* Logs page JavaScript */
|
|
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
// Logs State - guard against duplicate declarations on HTMX reload
|
|
|
|
|
if (typeof window.logsModuleInitialized === "undefined") {
|
|
|
|
|
window.logsModuleInitialized = true;
|
|
|
|
|
var isStreaming = true;
|
|
|
|
|
var autoScroll = true;
|
|
|
|
|
var logCounts = { debug: 0, info: 0, warn: 0, error: 0, fatal: 0 };
|
|
|
|
|
var searchDebounceTimer = null;
|
|
|
|
|
var currentFilters = {
|
|
|
|
|
level: "all",
|
|
|
|
|
service: "all",
|
|
|
|
|
search: "",
|
|
|
|
|
};
|
|
|
|
|
var logsWs = null;
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
|
|
|
|
function initLogsWebSocket() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
|
|
|
|
logsWs = new WebSocket(`${protocol}//${window.location.host}/ws/logs`);
|
|
|
|
|
|
|
|
|
|
logsWs.onopen = function () {
|
|
|
|
|
updateLogsConnectionStatus("connected", "Connected");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
logsWs.onclose = function () {
|
|
|
|
|
updateLogsConnectionStatus("disconnected", "Disconnected");
|
|
|
|
|
// Reconnect after 3 seconds
|
|
|
|
|
setTimeout(initLogsWebSocket, 3000);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
logsWs.onerror = function () {
|
|
|
|
|
updateLogsConnectionStatus("disconnected", "Error");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
logsWs.onmessage = function (event) {
|
|
|
|
|
if (!isStreaming) return;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const logData = JSON.parse(event.data);
|
|
|
|
|
appendLog(logData);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error("Failed to parse log message:", e);
|
|
|
|
|
}
|
|
|
|
|
};
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateLogsConnectionStatus(status, text) {
|
2025-12-15 23:16:09 -03:00
|
|
|
const statusEl = document.getElementById("connection-status");
|
|
|
|
|
if (statusEl) {
|
|
|
|
|
statusEl.className = `connection-status ${status}`;
|
|
|
|
|
statusEl.querySelector(".status-text").textContent = text;
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appendLog(log) {
|
2025-12-15 23:16:09 -03:00
|
|
|
const stream = document.getElementById("log-stream");
|
|
|
|
|
if (!stream) return;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
const placeholder = stream.querySelector(".log-placeholder");
|
|
|
|
|
if (placeholder) {
|
|
|
|
|
placeholder.remove();
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
const entry = document.createElement("div");
|
|
|
|
|
entry.className = "log-entry";
|
|
|
|
|
entry.dataset.level = log.level || "info";
|
|
|
|
|
entry.dataset.service = log.service || "unknown";
|
|
|
|
|
entry.dataset.id = log.id || Date.now();
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
entry.innerHTML = `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<span class="log-timestamp">${formatLogTimestamp(log.timestamp)}</span>
|
2025-12-15 23:16:09 -03:00
|
|
|
<span class="log-level">${(log.level || "INFO").toUpperCase()}</span>
|
|
|
|
|
<span class="log-service">${log.service || "unknown"}</span>
|
|
|
|
|
<span class="log-message">${escapeLogHtml(log.message || "")}</span>
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<button class="log-expand" onclick="expandLog(this)" title="View details">
|
|
|
|
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
|
|
<polyline points="9 18 15 12 9 6"></polyline>
|
|
|
|
|
</svg>
|
|
|
|
|
</button>
|
|
|
|
|
`;
|
|
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
// Store full log data for detail view
|
|
|
|
|
entry._logData = log;
|
|
|
|
|
|
|
|
|
|
// Apply current filters
|
|
|
|
|
if (!matchesLogFilters(entry)) {
|
|
|
|
|
entry.classList.add("hidden");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream.appendChild(entry);
|
|
|
|
|
|
|
|
|
|
// Update counts
|
|
|
|
|
const level = log.level || "info";
|
|
|
|
|
if (logCounts[level] !== undefined) {
|
|
|
|
|
logCounts[level]++;
|
|
|
|
|
const countEl = document.getElementById(`${level}-count`);
|
|
|
|
|
if (countEl) countEl.textContent = logCounts[level];
|
|
|
|
|
}
|
|
|
|
|
const totalEl = document.getElementById("total-count");
|
|
|
|
|
if (totalEl) {
|
|
|
|
|
totalEl.textContent = Object.values(logCounts).reduce((a, b) => a + b, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Auto-scroll to bottom
|
|
|
|
|
if (autoScroll) {
|
|
|
|
|
stream.scrollTop = stream.scrollHeight;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Limit log entries to prevent memory issues
|
|
|
|
|
const maxEntries = 1000;
|
|
|
|
|
while (stream.children.length > maxEntries) {
|
|
|
|
|
const removed = stream.firstChild;
|
|
|
|
|
if (removed._logData) {
|
|
|
|
|
const removedLevel = removed._logData.level || "info";
|
|
|
|
|
if (logCounts[removedLevel] > 0) {
|
|
|
|
|
logCounts[removedLevel]--;
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
2025-12-15 23:16:09 -03:00
|
|
|
stream.removeChild(removed);
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function formatLogTimestamp(timestamp) {
|
2025-12-15 23:16:09 -03:00
|
|
|
if (!timestamp) return "--";
|
|
|
|
|
const date = new Date(timestamp);
|
|
|
|
|
return date.toISOString().replace("T", " ").slice(0, 23);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function escapeLogHtml(text) {
|
2025-12-15 23:16:09 -03:00
|
|
|
const div = document.createElement("div");
|
|
|
|
|
div.textContent = text;
|
|
|
|
|
return div.innerHTML;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function matchesLogFilters(entry) {
|
2025-12-15 23:16:09 -03:00
|
|
|
// Level filter
|
|
|
|
|
if (
|
|
|
|
|
currentFilters.level !== "all" &&
|
|
|
|
|
entry.dataset.level !== currentFilters.level
|
|
|
|
|
) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Service filter
|
|
|
|
|
if (
|
|
|
|
|
currentFilters.service !== "all" &&
|
|
|
|
|
entry.dataset.service !== currentFilters.service
|
|
|
|
|
) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Search filter
|
|
|
|
|
if (currentFilters.search) {
|
|
|
|
|
const text = entry.textContent.toLowerCase();
|
|
|
|
|
if (!text.includes(currentFilters.search.toLowerCase())) {
|
|
|
|
|
return false;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
2025-12-15 23:16:09 -03:00
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
return true;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function applyLogFilters() {
|
2025-12-15 23:16:09 -03:00
|
|
|
currentFilters.level =
|
|
|
|
|
document.getElementById("log-level-filter")?.value || "all";
|
|
|
|
|
currentFilters.service =
|
|
|
|
|
document.getElementById("service-filter")?.value || "all";
|
|
|
|
|
|
|
|
|
|
const entries = document.querySelectorAll(".log-entry");
|
|
|
|
|
entries.forEach((entry) => {
|
|
|
|
|
if (matchesLogFilters(entry)) {
|
|
|
|
|
entry.classList.remove("hidden");
|
|
|
|
|
} else {
|
|
|
|
|
entry.classList.add("hidden");
|
|
|
|
|
}
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function debounceLogSearch(value) {
|
2025-12-15 23:16:09 -03:00
|
|
|
clearTimeout(searchDebounceTimer);
|
|
|
|
|
searchDebounceTimer = setTimeout(() => {
|
|
|
|
|
currentFilters.search = value;
|
|
|
|
|
applyLogFilters();
|
|
|
|
|
}, 300);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function toggleStream() {
|
2025-12-15 23:16:09 -03:00
|
|
|
isStreaming = !isStreaming;
|
|
|
|
|
const btn = document.getElementById("stream-toggle");
|
|
|
|
|
if (!btn) return;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
if (isStreaming) {
|
|
|
|
|
btn.classList.remove("paused");
|
|
|
|
|
btn.innerHTML = `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
|
|
<rect x="6" y="4" width="4" height="16"></rect>
|
|
|
|
|
<rect x="14" y="4" width="4" height="16"></rect>
|
|
|
|
|
</svg>
|
|
|
|
|
<span>Pause</span>
|
|
|
|
|
`;
|
2025-12-15 23:16:09 -03:00
|
|
|
} else {
|
|
|
|
|
btn.classList.add("paused");
|
|
|
|
|
btn.innerHTML = `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
|
|
<polygon points="5 3 19 12 5 21 5 3"></polygon>
|
|
|
|
|
</svg>
|
|
|
|
|
<span>Resume</span>
|
|
|
|
|
`;
|
2025-12-15 23:16:09 -03:00
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearLogs() {
|
2025-12-15 23:16:09 -03:00
|
|
|
if (confirm("Are you sure you want to clear all logs?")) {
|
|
|
|
|
const stream = document.getElementById("log-stream");
|
|
|
|
|
if (!stream) return;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
stream.innerHTML = `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<div class="log-placeholder">
|
|
|
|
|
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
|
|
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
|
|
|
|
|
<polyline points="14 2 14 8 20 8"></polyline>
|
|
|
|
|
<line x1="16" y1="13" x2="8" y2="13"></line>
|
|
|
|
|
<line x1="16" y1="17" x2="8" y2="17"></line>
|
|
|
|
|
<polyline points="10 9 9 9 8 9"></polyline>
|
|
|
|
|
</svg>
|
|
|
|
|
<p>Logs cleared</p>
|
|
|
|
|
<span class="placeholder-hint">New logs will appear here</span>
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
// Reset counts
|
|
|
|
|
logCounts = { debug: 0, info: 0, warn: 0, error: 0, fatal: 0 };
|
|
|
|
|
Object.keys(logCounts).forEach((level) => {
|
|
|
|
|
const el = document.getElementById(`${level}-count`);
|
|
|
|
|
if (el) el.textContent = "0";
|
|
|
|
|
});
|
|
|
|
|
const totalEl = document.getElementById("total-count");
|
|
|
|
|
if (totalEl) totalEl.textContent = "0";
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function downloadLogs() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const entries = document.querySelectorAll(".log-entry");
|
|
|
|
|
let logs = [];
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
entries.forEach((entry) => {
|
|
|
|
|
if (entry._logData) {
|
|
|
|
|
logs.push(entry._logData);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const blob = new Blob([JSON.stringify(logs, null, 2)], {
|
|
|
|
|
type: "application/json",
|
|
|
|
|
});
|
|
|
|
|
const url = URL.createObjectURL(blob);
|
|
|
|
|
const a = document.createElement("a");
|
|
|
|
|
a.href = url;
|
|
|
|
|
a.download = `logs-${new Date().toISOString().slice(0, 19).replace(/[T:]/g, "-")}.json`;
|
|
|
|
|
document.body.appendChild(a);
|
|
|
|
|
a.click();
|
|
|
|
|
document.body.removeChild(a);
|
|
|
|
|
URL.revokeObjectURL(url);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function scrollToTop() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const stream = document.getElementById("log-stream");
|
|
|
|
|
if (stream) {
|
|
|
|
|
stream.scrollTop = 0;
|
|
|
|
|
autoScroll = false;
|
|
|
|
|
updateLogScrollButtons();
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function scrollToBottom() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const stream = document.getElementById("log-stream");
|
|
|
|
|
if (stream) {
|
|
|
|
|
stream.scrollTop = stream.scrollHeight;
|
|
|
|
|
autoScroll = true;
|
|
|
|
|
updateLogScrollButtons();
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateLogScrollButtons() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const topBtn = document.getElementById("scroll-top-btn");
|
|
|
|
|
const bottomBtn = document.getElementById("scroll-bottom-btn");
|
|
|
|
|
if (topBtn) topBtn.classList.toggle("active", !autoScroll);
|
|
|
|
|
if (bottomBtn) bottomBtn.classList.toggle("active", autoScroll);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function expandLog(btn) {
|
2025-12-15 23:16:09 -03:00
|
|
|
const entry = btn.closest(".log-entry");
|
|
|
|
|
const logData = entry._logData || {
|
|
|
|
|
timestamp: entry.querySelector(".log-timestamp").textContent,
|
|
|
|
|
level: entry.dataset.level,
|
|
|
|
|
service: entry.dataset.service,
|
|
|
|
|
message: entry.querySelector(".log-message").textContent,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const panel = document.getElementById("log-detail-panel");
|
|
|
|
|
const content = document.getElementById("log-detail-content");
|
|
|
|
|
if (!panel || !content) return;
|
|
|
|
|
|
|
|
|
|
content.innerHTML = `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Timestamp</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
<div class="detail-value">${logData.timestamp || "--"}</div>
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
</div>
|
|
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Level</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
<div class="detail-value">${(logData.level || "info").toUpperCase()}</div>
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
</div>
|
|
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Service</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
<div class="detail-value">${logData.service || "unknown"}</div>
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
</div>
|
|
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Message</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
<div class="detail-value">${escapeLogHtml(logData.message || "")}</div>
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
${
|
|
|
|
|
logData.stack
|
|
|
|
|
? `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Stack Trace</div>
|
|
|
|
|
<div class="detail-value">${escapeLogHtml(logData.stack)}</div>
|
|
|
|
|
</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
`
|
|
|
|
|
: ""
|
|
|
|
|
}
|
|
|
|
|
${
|
|
|
|
|
logData.context
|
|
|
|
|
? `
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
<div class="detail-section">
|
|
|
|
|
<div class="detail-label">Context</div>
|
|
|
|
|
<div class="detail-value">${escapeLogHtml(JSON.stringify(logData.context, null, 2))}</div>
|
|
|
|
|
</div>
|
2025-12-15 23:16:09 -03:00
|
|
|
`
|
|
|
|
|
: ""
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
`;
|
|
|
|
|
|
2025-12-15 23:16:09 -03:00
|
|
|
panel.classList.add("open");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function closeLogDetail() {
|
2025-12-15 23:16:09 -03:00
|
|
|
const panel = document.getElementById("log-detail-panel");
|
|
|
|
|
if (panel) panel.classList.remove("open");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Initialize on page load
|
2025-12-15 23:16:09 -03:00
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
|
// Initialize WebSocket connection if on logs page
|
|
|
|
|
if (document.getElementById("log-stream")) {
|
|
|
|
|
initLogsWebSocket();
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
});
|