Gemini, trying to make this "done".

This commit is contained in:
Kalzu Rekku
2025-06-11 22:27:46 +03:00
parent d93b0ee4ee
commit 1cbf9311e5
7 changed files with 300 additions and 135 deletions

View File

@ -1,16 +1,34 @@
document.addEventListener('DOMContentLoaded', () => {
const logTableContainer = document.getElementById('log-table-container');
const logCountSpan = document.getElementById('log-count');
const POLLING_INTERVAL_MS = 5000; // Poll every 5 seconds
const serviceUuid = logTableContainer.dataset.serviceUuid || '{{ service_uuid }}'; // Fallback for non-dynamic rendering
const levelRadios = document.querySelectorAll('input[name="log-level"]');
const sinceFilter = document.getElementById('since-filter');
const applyFiltersButton = document.getElementById('apply-filters');
const POLLING_INTERVAL_MS = 5000;
const serviceUuid = logTableContainer.dataset.serviceUuid; // Get service UUID from data attribute
let currentLevel = '';
let currentSince = '';
async function fetchLogs() {
console.log('Fetching logs with params:', { level: currentLevel, since: currentSince });
try {
const response = await fetch(`/${serviceUuid}/logs?limit=100`);
const params = new URLSearchParams({
format: 'json',
limit: '100'
});
if (currentLevel) params.append('level', currentLevel);
if (currentSince) params.append('since', currentSince);
// Use window.API_BASE_PATH for dynamic base URL
const url = `${window.API_BASE_PATH}/${serviceUuid}/logs?${params.toString()}`;
console.log('Fetch URL:', url);
const response = await fetch(url);
console.log('Response status:', response.status);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('Received logs:', data.logs.length);
renderLogTable(data.logs);
logCountSpan.textContent = data.log_count;
} catch (error) {
@ -20,18 +38,17 @@ document.addEventListener('DOMContentLoaded', () => {
}
function renderLogTable(logs) {
logTableContainer.innerHTML = ''; // Clear existing content
console.log('Rendering logs:', logs.length);
logTableContainer.innerHTML = '';
if (logs.length === 0) {
logTableContainer.innerHTML = '<p class="loading-message">No logs available.</p>';
return;
}
// Create table
const table = document.createElement('table');
table.classList.add('log-table');
// Create header
const thead = document.createElement('thead');
const headerRow = document.createElement('tr');
const headers = [
@ -52,7 +69,6 @@ document.addEventListener('DOMContentLoaded', () => {
thead.appendChild(headerRow);
table.appendChild(thead);
// Create body
const tbody = document.createElement('tbody');
logs.forEach(log => {
const row = document.createElement('tr');
@ -73,7 +89,6 @@ document.addEventListener('DOMContentLoaded', () => {
logTableContainer.appendChild(table);
// Add click handlers for JSON toggles
document.querySelectorAll('.json-toggle').forEach(toggle => {
toggle.addEventListener('click', () => {
const jsonContent = toggle.nextElementSibling;
@ -120,7 +135,17 @@ document.addEventListener('DOMContentLoaded', () => {
return div.innerHTML;
}
// Initial fetch and polling
applyFiltersButton.addEventListener('click', () => {
const selectedRadio = document.querySelector('input[name="log-level"]:checked');
currentLevel = selectedRadio ? selectedRadio.value : '';
const sinceValue = sinceFilter.value;
// Convert local datetime input to ISO string for backend, handling potential timezone issues
currentSince = sinceValue ? new Date(sinceValue).toISOString().replace(/\.\d{3}Z$/, 'Z') : ''; // Ensure 'Z' for UTC
console.log('Applying filters:', { level: currentLevel, since: currentSince });
fetchLogs();
});
console.log('Initializing logs page');
fetchLogs();
setInterval(fetchLogs, POLLING_INTERVAL_MS);
});
});