Files
docupulse/static/js/rooms/searchManager.js
2025-05-31 12:24:48 +02:00

107 lines
3.8 KiB
JavaScript

/**
* @fileoverview Manages search functionality for the room interface.
* This file handles:
* - Quick search input processing
* - Debounced search execution
* - File filtering based on search terms
* - Search state management
* - Clear search functionality
*/
/**
* @class SearchManager
* @classdesc Manages search operations including input handling, debounced search execution,
* and file filtering based on search criteria.
*/
export class SearchManager {
/**
* Creates a new SearchManager instance.
* @param {RoomManager} roomManager - The parent RoomManager instance
*/
constructor(roomManager) {
this.roomManager = roomManager;
this.searchInput = document.getElementById('quickSearchInput');
this.clearSearchBtn = document.getElementById('clearSearchBtn');
this.isSearching = false;
}
/**
* Initializes the search functionality.
* Sets up event listeners for search input and clear button.
* Creates a debounced search function to prevent excessive searches.
*/
initialize() {
if (!this.searchInput) return;
// Create debounced search function
const debouncedSearch = this.debounce((searchTerm) => {
if (searchTerm) {
this.isSearching = true;
this.performSearch(searchTerm);
this.clearSearchBtn.style.display = 'block';
} else {
this.isSearching = false;
this.roomManager.fileManager.fetchFiles(); // Reset to show all files
this.clearSearchBtn.style.display = 'none';
}
}, 300);
// Add input event listener
this.searchInput.addEventListener('input', (e) => {
const searchTerm = e.target.value.trim();
debouncedSearch(searchTerm);
});
// Add clear search button functionality
if (this.clearSearchBtn) {
this.clearSearchBtn.addEventListener('click', () => {
this.searchInput.value = '';
this.isSearching = false;
this.roomManager.fileManager.fetchFiles(); // Reset to show all files
this.clearSearchBtn.style.display = 'none';
});
}
}
/**
* Performs the search operation using the server-side search endpoint.
* @param {string} searchTerm - The term to search for
*/
performSearch(searchTerm) {
// Fetch all files from the server for searching
fetch(`/api/rooms/${this.roomManager.roomId}/search?query=${encodeURIComponent(searchTerm)}`)
.then(response => response.json())
.then(files => {
// Modify the file objects to show full paths in search results
const modifiedFiles = files.map(file => ({
...file,
displayName: this.isSearching ? file.full_path : file.name
}));
this.roomManager.viewManager.renderFiles(modifiedFiles);
})
.catch(error => {
console.error('Error performing search:', error);
});
}
/**
* Creates a debounced version of a function.
* Delays the execution of the function until after a specified wait time
* has elapsed since the last time it was invoked.
* @param {Function} func - The function to debounce
* @param {number} wait - The number of milliseconds to delay
* @returns {Function} The debounced function
*/
debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
}