diff --git a/routes/__pycache__/room_files.cpython-313.pyc b/routes/__pycache__/room_files.cpython-313.pyc
index 1d28c1b..89e16b8 100644
Binary files a/routes/__pycache__/room_files.cpython-313.pyc and b/routes/__pycache__/room_files.cpython-313.pyc differ
diff --git a/static/js/events.js b/static/js/events.js
index 78cd9e9..46acca6 100644
--- a/static/js/events.js
+++ b/static/js/events.js
@@ -1,18 +1,21 @@
document.addEventListener('DOMContentLoaded', function() {
// Initialize variables
let currentPage = 1;
- const totalPages = parseInt(document.getElementById('totalPages').textContent);
+ let totalPages = parseInt(document.getElementById('totalPages').textContent) || 1;
+ let isFetching = false;
// Get filter elements
const eventTypeFilter = document.getElementById('eventTypeFilter');
const dateRangeFilter = document.getElementById('dateRangeFilter');
const userFilter = document.getElementById('userFilter');
- const applyFiltersBtn = document.getElementById('applyFilters');
+ const clearFiltersBtn = document.getElementById('clearFilters');
// Get pagination elements
const prevPageBtn = document.getElementById('prevPage');
const nextPageBtn = document.getElementById('nextPage');
const currentPageSpan = document.getElementById('currentPage');
+ const totalPagesSpan = document.getElementById('totalPages');
+ const eventsTableBody = document.getElementById('eventsTableBody');
// Event details modal
const eventDetailsModal = document.getElementById('eventDetailsModal');
@@ -21,22 +24,76 @@ document.addEventListener('DOMContentLoaded', function() {
// Function to update URL with current filters
function updateURL() {
const params = new URLSearchParams(window.location.search);
+ params.set('tab', 'events');
params.set('page', currentPage);
- if (eventTypeFilter.value) params.set('event_type', eventTypeFilter.value);
- if (dateRangeFilter.value) params.set('date_range', dateRangeFilter.value);
- if (userFilter.value) params.set('user_id', userFilter.value);
+ params.set('event_type', eventTypeFilter.value);
+ params.set('date_range', dateRangeFilter.value);
+ params.set('user_id', userFilter.value);
window.history.replaceState({}, '', `${window.location.pathname}?${params.toString()}`);
}
- // Function to load events with current filters
- function loadEvents() {
- const params = new URLSearchParams();
- params.set('page', currentPage);
- if (eventTypeFilter.value) params.set('event_type', eventTypeFilter.value);
- if (dateRangeFilter.value) params.set('date_range', dateRangeFilter.value);
- if (userFilter.value) params.set('user_id', userFilter.value);
+ // Function to fetch filtered events
+ function fetchEvents() {
+ if (isFetching) return;
+ isFetching = true;
- window.location.href = `${window.location.pathname}?${params.toString()}`;
+ // Show loading state
+ eventsTableBody.innerHTML = '
| Loading... |
';
+
+ const params = new URLSearchParams({
+ tab: 'events',
+ page: currentPage,
+ event_type: eventTypeFilter.value,
+ date_range: dateRangeFilter.value,
+ user_id: userFilter.value,
+ ajax: 'true'
+ });
+
+ fetch(`${window.location.pathname}?${params.toString()}`, {
+ headers: {
+ 'X-Requested-With': 'XMLHttpRequest'
+ }
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ return response.text();
+ })
+ .then(html => {
+ const parser = new DOMParser();
+ const doc = parser.parseFromString(html, 'text/html');
+ const newTableBody = doc.getElementById('eventsTableBody');
+
+ if (newTableBody) {
+ eventsTableBody.innerHTML = newTableBody.innerHTML;
+
+ // Update pagination
+ const newCurrentPage = parseInt(doc.getElementById('currentPage').textContent) || 1;
+ const newTotalPages = parseInt(doc.getElementById('totalPages').textContent) || 1;
+ currentPage = newCurrentPage;
+ totalPages = newTotalPages;
+ currentPageSpan.textContent = currentPage;
+ totalPagesSpan.textContent = totalPages;
+
+ // Update pagination buttons
+ prevPageBtn.disabled = currentPage <= 1;
+ nextPageBtn.disabled = currentPage >= totalPages;
+
+ // Update URL
+ updateURL();
+ } else {
+ console.error('Could not find events table in response');
+ eventsTableBody.innerHTML = '| Error loading events |
';
+ }
+ })
+ .catch(error => {
+ console.error('Error fetching events:', error);
+ eventsTableBody.innerHTML = '| Error loading events |
';
+ })
+ .finally(() => {
+ isFetching = false;
+ });
}
// Function to load event details
@@ -51,14 +108,7 @@ document.addEventListener('DOMContentLoaded', function() {
console.log('Received event data:', data);
// Format the details for display
- const formattedDetails = {
- // 'Event ID': data.id,
- // 'Event Type': data.event_type,
- // 'Timestamp': new Date(data.timestamp).toLocaleString(),
- // 'User': data.user ? `${data.user.username} (${data.user.last_name})` : 'N/A',
- // 'IP Address': data.ip_address || 'N/A',
- // 'User Agent': data.user_agent || 'N/A'
- };
+ const formattedDetails = {};
// Handle details separately
if (data.details) {
@@ -85,24 +135,41 @@ document.addEventListener('DOMContentLoaded', function() {
});
}
- // Event listeners for filters
- applyFiltersBtn.addEventListener('click', function() {
+ // Add event listeners for filters with debounce
+ let filterTimeout;
+ function debouncedFetch() {
+ clearTimeout(filterTimeout);
+ filterTimeout = setTimeout(() => {
+ currentPage = 1; // Reset to first page when filters change
+ fetchEvents();
+ }, 300);
+ }
+
+ eventTypeFilter.addEventListener('change', debouncedFetch);
+ dateRangeFilter.addEventListener('change', debouncedFetch);
+ userFilter.addEventListener('change', debouncedFetch);
+
+ // Event listener for clear filters
+ clearFiltersBtn.addEventListener('click', function() {
+ eventTypeFilter.value = '';
+ dateRangeFilter.value = '24h';
+ userFilter.value = '';
currentPage = 1;
- loadEvents();
+ fetchEvents();
});
// Event listeners for pagination
prevPageBtn.addEventListener('click', function() {
if (currentPage > 1) {
currentPage--;
- loadEvents();
+ fetchEvents();
}
});
nextPageBtn.addEventListener('click', function() {
if (currentPage < totalPages) {
currentPage++;
- loadEvents();
+ fetchEvents();
}
});
@@ -115,13 +182,13 @@ document.addEventListener('DOMContentLoaded', function() {
// Initialize filters from URL parameters
const urlParams = new URLSearchParams(window.location.search);
- if (urlParams.has('event_type')) eventTypeFilter.value = urlParams.get('event_type');
- if (urlParams.has('date_range')) dateRangeFilter.value = urlParams.get('date_range');
- if (urlParams.has('user_id')) userFilter.value = urlParams.get('user_id');
- if (urlParams.has('page')) currentPage = parseInt(urlParams.get('page'));
+ eventTypeFilter.value = urlParams.get('event_type') || '';
+ dateRangeFilter.value = urlParams.get('date_range') || '24h';
+ userFilter.value = urlParams.get('user_id') || '';
+ currentPage = parseInt(urlParams.get('page')) || 1;
- // Update pagination buttons state
- prevPageBtn.disabled = currentPage === 1;
- nextPageBtn.disabled = currentPage === totalPages;
- currentPageSpan.textContent = currentPage;
+ // Initial fetch if filters are set
+ if (eventTypeFilter.value || dateRangeFilter.value !== '24h' || userFilter.value) {
+ fetchEvents();
+ }
});
\ No newline at end of file
diff --git a/templates/settings/tabs/events.html b/templates/settings/tabs/events.html
index e961d64..7aa6528 100644
--- a/templates/settings/tabs/events.html
+++ b/templates/settings/tabs/events.html
@@ -8,7 +8,8 @@
-
+
+
@@ -24,11 +25,15 @@
+
+
+
+
-
+
-
+
@@ -65,13 +72,15 @@
{{ event.timestamp.strftime('%Y-%m-%d %H:%M:%S') }} |
{% if event.event_type == 'user_login' %}
- User Login
+ User Login
{% elif event.event_type == 'user_logout' %}
- User Logout
- {% elif event.event_type == 'user_register' %}
- User Registration
+ User Logout
+ {% elif event.event_type == 'user_create' %}
+ User Create
+ {% elif event.event_type == 'user_delete' %}
+ User Delete
{% elif event.event_type == 'user_update' %}
- User Update
+ User Update
{% elif event.event_type == 'file_upload' %}
File Upload
{% elif event.event_type == 'file_delete' %}
@@ -81,13 +90,13 @@
{% elif event.event_type == 'file_restore' %}
File Restore
{% elif event.event_type == 'file_move' %}
- File Move
+ File Move
{% elif event.event_type == 'file_rename' %}
- File Rename
+ File Rename
{% elif event.event_type == 'file_star' %}
File Star
{% elif event.event_type == 'file_unstar' %}
- File Unstar
+ File Unstar
{% elif event.event_type == 'file_delete_permanent' %}
File Delete Permanent
{% elif event.event_type == 'folder_create' %}
@@ -97,19 +106,27 @@
{% elif event.event_type == 'room_delete' %}
Room Delete
{% elif event.event_type == 'room_update' %}
- Room Update
+ Room Update
{% elif event.event_type == 'room_open' %}
Room Open
+ {% elif event.event_type == 'room_member_add' %}
+ Room Member Add
+ {% elif event.event_type == 'room_member_remove' %}
+ Room Member Remove
{% elif event.event_type == 'room_member_permissions_update' %}
- Room Member Permissions Update
+ Room Member Permissions Update
+ {% elif event.event_type == 'room_permission_update' %}
+ Room Permission Update
{% elif event.event_type == 'conversation_create' %}
Conversation Create
+ {% elif event.event_type == 'conversation_update' %}
+ Conversation Update
{% elif event.event_type == 'conversation_delete' %}
Conversation Delete
{% elif event.event_type == 'conversation_open' %}
Conversation Open
- {% elif event.event_type == 'message_sent' %}
- Message Sent
+ {% elif event.event_type == 'message_create' %}
+ Message Create
{% elif event.event_type == 'attachment_download' %}
Attachment Download
{% else %}
@@ -161,6 +178,140 @@
+
+
{% endmacro %}
{% block content %}
|