PAGES.buscar = { navcss: 'btn1', icon: 'static/appico/view.svg', Title: 'Buscar', AccessControl: true, Esconder: true, index: function () { const searchInput = safeuuid(); const resultsContainer = safeuuid(); const searchButton = safeuuid(); const recentSearches = safeuuid(); const moduleFilter = safeuuid(); container.innerHTML = html`

🔍 Búsqueda Global

Busca en todos los módulos: personas, materiales, café, comedor, notas y avisos

Opciones de búsqueda
Resultados
🔍 Introduce un término de búsqueda para comenzar

Puedes buscar por nombres, referencias, fechas, ubicaciones...

💡 Consejos de búsqueda
  • Busca por nombres: "María", "García"
  • Busca por fechas: "2024-10-01" o "01/10/2024"
  • Busca por ubicación: "aula", "laboratorio"
  • Usa filtros: selecciona un módulo específico
  • Atajos de teclado: Ctrl+F para buscar, Esc para limpiar
`; // Initialize global search const globalSearch = GlobalSearch(); globalSearch.loadAllData(); // Get accessible modules for the current user const accessibleModules = globalSearch.getAccessibleModules(); const searchInputEl = document.getElementById(searchInput); const resultsEl = document.getElementById(resultsContainer); const searchButtonEl = document.getElementById(searchButton); const recentSearchesEl = document.getElementById(recentSearches); const moduleFilterEl = document.getElementById(moduleFilter); // Populate module filter dropdown with only accessible modules function populateModuleFilter() { // Clear existing options except "Todos los módulos" moduleFilterEl.innerHTML = ''; // Add only accessible modules accessibleModules.forEach((module) => { const option = document.createElement('option'); option.value = module.key; option.textContent = `${getModuleIcon(module.key)} ${module.title}`; moduleFilterEl.appendChild(option); }); } // Helper function to get module icons (fallback for older module mappings) function getModuleIcon(moduleKey) { const iconMap = { personas: '👤', materiales: '📦', supercafe: '☕', comedor: '🍽️', avisos: '🔔', aulas: '🏫', resumen_diario: '📊', }; return iconMap[moduleKey] || '📋'; } // Load recent searches from localStorage function loadRecentSearches() { const recent = JSON.parse(localStorage.getItem('telesec_recent_searches') || '[]'); if (recent.length > 0) { recentSearchesEl.innerHTML = html`
Búsquedas recientes ${recent .map( (term) => ` ` ) .join('')}
`; } } // Populate the module filter dropdown populateModuleFilter(); // Save search term to recent searches function saveToRecent(term) { if (!term || term.length < 2) return; let recent = JSON.parse(localStorage.getItem('telesec_recent_searches') || '[]'); recent = recent.filter((t) => t !== term); // Remove if exists recent.unshift(term); // Add to beginning recent = recent.slice(0, 5); // Keep only 5 most recent localStorage.setItem('telesec_recent_searches', JSON.stringify(recent)); loadRecentSearches(); } // Perform search function performSearch() { const searchTerm = searchInputEl.value.trim(); const selectedModule = moduleFilterEl.value; if (searchTerm.length < 2) { resultsEl.innerHTML = html`
Error
⚠️ Por favor, introduce al menos 2 caracteres para buscar
`; return; } // Show loading resultsEl.innerHTML = html`
Buscando...
⏳ Procesando búsqueda...
`; // Add small delay to show loading state setTimeout(() => { let results = globalSearch.performSearch(searchTerm); // Filter by module if selected if (selectedModule) { results = results.filter((result) => result._module === selectedModule); } globalSearch.renderResults(results, resultsEl); saveToRecent(searchTerm); // Add stats if (results.length > 0) { const statsDiv = document.createElement('fieldset'); const legend = document.createElement('legend'); legend.textContent = 'Estadísticas'; statsDiv.appendChild(legend); let filterText = selectedModule ? ` en ${moduleFilterEl.options[moduleFilterEl.selectedIndex].text}` : ''; const content = document.createElement('div'); content.innerHTML = html`📊 Se encontraron ${results.length} resultados para "${searchTerm}"${filterText}`; statsDiv.appendChild(content); resultsEl.insertBefore(statsDiv, resultsEl.firstChild); } }, 500); } // Event listeners searchButtonEl.onclick = performSearch; // Filter change listener moduleFilterEl.onchange = () => { if (searchInputEl.value.trim().length >= 2) { performSearch(); } }; // Auto-search as user types (with debounce) let searchTimeout; searchInputEl.oninput = () => { clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { if (searchInputEl.value.trim().length >= 2) { performSearch(); } }, 1501); }; // Focus on search input searchInputEl.focus(); // Add keyboard shortcuts document.addEventListener('keydown', function (e) { // Ctrl+F or Cmd+F to focus search if ((e.ctrlKey || e.metaKey) && e.key === 'f') { e.preventDefault(); searchInputEl.focus(); searchInputEl.select(); } // Escape to clear search if (e.key === 'Escape') { searchInputEl.value = ''; searchInputEl.focus(); resultsEl.innerHTML = html`
Resultados
🔍 Introduce un término de búsqueda para comenzar

Puedes buscar por nombres, referencias, fechas, ubicaciones...

💡 Consejos de búsqueda
`; } }); // Check for quick search term from header const quickSearchTerm = sessionStorage.getItem('telesec_quick_search'); if (quickSearchTerm) { searchInputEl.value = quickSearchTerm; sessionStorage.removeItem('telesec_quick_search'); // Perform search automatically setTimeout(performSearch, 100); } // Load recent searches loadRecentSearches(); }, };