// 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);
});
});