// Function to view log details function viewLogDetails(logId) { fetch(`/api/logs/${logId}`) .then(response => { if (!response.ok) { throw new Error('Failed to fetch log details'); } return response.json(); }) .then(log => { const content = document.getElementById('logDetailsContent'); // Format the details in a readable way let details = log.details; let formattedDetails = 'No details available'; if (details) { if (typeof details === 'string') { formattedDetails = details.replace(/\n/g, '
'); } else if (typeof details === 'object') { formattedDetails = JSON.stringify(details, null, 2).replace(/\n/g, '
'); } else { formattedDetails = String(details); } } content.innerHTML = `
Timestamp: ${new Date(log.timestamp).toLocaleString()}
Level: ${log.level}
Category: ${log.category || '-'}
Action: ${log.action || '-'}
Description: ${log.description || '-'}
User: ${log.user || '-'}
IP Address: ${log.ip_address || '-'}
Details:
${formattedDetails}
`; // Show modal const modal = new bootstrap.Modal(document.getElementById('logDetailsModal')); modal.show(); }) .catch(error => { console.error('Error viewing log details:', error); showToast('Error loading log details', 'error'); }); } // Helper function to get log level badge class function getLogLevelBadgeClass(level) { const classes = { 'INFO': 'info', 'WARNING': 'warning', 'ERROR': 'danger', 'DEBUG': 'secondary' }; return classes[level] || 'secondary'; } // Function to fetch logs async function fetchLogs(page = 1) { try { const formData = new FormData(document.getElementById('logFiltersForm')); const params = new URLSearchParams(); // Add form data to params for (let [key, value] of formData.entries()) { if (value) params.append(key, value); } // Add page number params.append('page', page); const response = await fetch(`/api/logs?${params.toString()}`); if (!response.ok) throw new Error('Failed to fetch logs'); const data = await response.json(); const logsTableBody = document.getElementById('logsTableBody'); logsTableBody.innerHTML = ''; data.logs.forEach(log => { const row = document.createElement('tr'); row.innerHTML = ` ${new Date(log.timestamp).toLocaleString()} ${log.level} ${log.category || '-'} ${log.action || '-'} ${log.description || '-'} ${log.user || '-'} ${log.ip_address || '-'} `; logsTableBody.appendChild(row); }); // Update pagination updateLogsPagination(data.current_page, data.total_pages); } catch (error) { console.error('Error fetching logs:', error); showToast('Error loading logs', 'error'); } } // Function to update logs pagination function updateLogsPagination(currentPage, totalPages) { const pagination = document.getElementById('logsPagination'); if (!pagination) return; pagination.innerHTML = ''; // Previous button const prevLi = document.createElement('li'); prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`; prevLi.innerHTML = ` `; pagination.appendChild(prevLi); // Page numbers for (let i = 1; i <= totalPages; i++) { const li = document.createElement('li'); li.className = `page-item ${i === currentPage ? 'active' : ''}`; li.innerHTML = ` `; pagination.appendChild(li); } // Next button const nextLi = document.createElement('li'); nextLi.className = `page-item ${currentPage === totalPages ? 'disabled' : ''}`; nextLi.innerHTML = ` `; pagination.appendChild(nextLi); } // Initialize on page load document.addEventListener('DOMContentLoaded', function() { // Initial load fetchLogs(); // Form submit handler document.getElementById('logFiltersForm').addEventListener('submit', function(e) { e.preventDefault(); fetchLogs(1); }); // Form reset handler document.getElementById('logFiltersForm').addEventListener('reset', function(e) { e.preventDefault(); this.reset(); fetchLogs(1); }); });