From 0d5fd83e014cc2109b34743c4647775e2dc778bc Mon Sep 17 00:00:00 2001 From: Kobe Date: Fri, 30 May 2025 21:31:25 +0200 Subject: [PATCH] fixed filters --- routes/__pycache__/room_files.cpython-313.pyc | Bin 47025 -> 47025 bytes static/js/events.js | 135 +++++++++---- templates/settings/tabs/events.html | 181 ++++++++++++++++-- 3 files changed, 267 insertions(+), 49 deletions(-) diff --git a/routes/__pycache__/room_files.cpython-313.pyc b/routes/__pycache__/room_files.cpython-313.pyc index 1d28c1bbda7a6f17c4fba9dd56d028dc4ba84c8b..89e16b88e34215dd9862411bb9f466ba2ec81639 100644 GIT binary patch delta 21 bcmdn^o@wKICa%xCyj%=GaEoOl*YfQESBD2( delta 21 bcmdn^o@wKICa%xCyj%=G@SJ%g*YfQESI`G( 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 %}