// DOM elements const singleModeBtn = document.getElementById('single-mode-btn'); const batchModeBtn = document.getElementById('batch-mode-btn'); const singleInput = document.querySelector('.single-input'); const batchInput = document.querySelector('.batch-input'); const docIdInput = document.getElementById('doc-id'); const batchIdsInput = document.getElementById('batch-ids'); const searchBtn = document.getElementById('search-btn'); const batchSearchBtn = document.getElementById('batch-search-btn'); const loader = document.getElementById('loader'); const resultsContainer = document.getElementById('results-container'); const resultsList = document.getElementById('results-list'); const resultsStats = document.getElementById('results-stats'); const errorMessage = document.getElementById('error-message'); const indexedDocs = document.getElementById('indexed-docs'); const indexedCount = document.getElementById('indexed-count'); const indexedList = document.getElementById('indexed-list'); // Search mode toggle singleModeBtn.addEventListener('click', () => { singleModeBtn.classList.add('active'); batchModeBtn.classList.remove('active'); singleInput.style.display = 'block'; batchInput.style.display = 'none'; }); batchModeBtn.addEventListener('click', () => { batchModeBtn.classList.add('active'); singleModeBtn.classList.remove('active'); batchInput.style.display = 'block'; singleInput.style.display = 'none'; }); // Single document search searchBtn.addEventListener('click', async () => { const docId = docIdInput.value.trim(); if (!docId) { showError('Please enter a document ID'); return; } showLoader(); hideError(); try { const response = await fetch(`/find`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ doc_id: docId, release: null }) }); const data = await response.json(); if (response.ok) { displaySingleResult(data); loadIndexedDocuments(); // Refresh indexed docs } else { displaySingleNotFound(docId, data.detail); } } catch (error) { showError('Error connecting to the server. Please check if the API is running.'); console.error('Error:', error); } finally { hideLoader(); } }); // Batch document search batchSearchBtn.addEventListener('click', async () => { const batchText = batchIdsInput.value.trim(); if (!batchText) { showError('Please enter at least one document ID'); return; } const docIds = batchText.split('\n') .map(id => id.trim()) .filter(id => id !== ''); if (docIds.length === 0) { showError('Please enter at least one valid document ID'); return; } showLoader(); hideError(); try { const response = await fetch(`/batch`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ doc_ids: docIds }) }); const data = await response.json(); if (response.ok) { displayBatchResults(data); loadIndexedDocuments(); // Refresh indexed docs } else { showError('Error processing batch request'); } } catch (error) { showError('Error connecting to the server. Please check if the API is running.'); console.error('Error:', error); } finally { hideLoader(); } }); // Display single result function displaySingleResult(data) { resultsList.innerHTML = ''; const resultItem = document.createElement('div'); resultItem.className = 'result-item'; resultItem.innerHTML = `
${data.doc_id}
Found
${data.url}
`; resultsList.appendChild(resultItem); resultsStats.textContent = `Found in ${data.search_time.toFixed(2)} seconds`; resultsContainer.style.display = 'block'; } // Display single not found result function displaySingleNotFound(docId, message) { resultsList.innerHTML = ''; const resultItem = document.createElement('div'); resultItem.className = 'result-item'; resultItem.innerHTML = `
${docId}
Not Found
${message}
`; resultsList.appendChild(resultItem); resultsStats.textContent = 'Document not found'; resultsContainer.style.display = 'block'; } // Display batch results function displayBatchResults(data) { resultsList.innerHTML = ''; // Found documents Object.entries(data.results).forEach(([docId, url]) => { const resultItem = document.createElement('div'); resultItem.className = 'result-item'; resultItem.innerHTML = `
${docId}
Found
${url}
`; resultsList.appendChild(resultItem); }); // Not found documents data.missing.forEach(docId => { const resultItem = document.createElement('div'); resultItem.className = 'result-item'; resultItem.innerHTML = `
${docId}
Not Found
`; resultsList.appendChild(resultItem); }); const foundCount = Object.keys(data.results).length; const totalCount = foundCount + data.missing.length; resultsStats.textContent = `Found ${foundCount} of ${totalCount} documents in ${data.search_time.toFixed(2)} seconds`; resultsContainer.style.display = 'block'; } // Load indexed documents async function loadIndexedDocuments() { try { const response = await fetch(`/indexed`); if (response.ok) { const data = await response.json(); displayIndexedDocuments(data); } } catch (error) { console.error('Error loading indexed documents:', error); } } // Display indexed documents function displayIndexedDocuments(docIds) { indexedList.innerHTML = ''; indexedCount.textContent = `${docIds.length} documents`; if (docIds.length === 0) { const emptyMessage = document.createElement('p'); emptyMessage.textContent = 'No documents have been indexed yet.'; indexedList.appendChild(emptyMessage); return; } docIds.forEach(docId => { const docItem = document.createElement('div'); docItem.className = 'indexed-item'; docItem.textContent = docId; docItem.addEventListener('click', () => { docIdInput.value = docId; singleModeBtn.click(); searchBtn.click(); }); indexedList.appendChild(docItem); }); } // Show loader function showLoader() { loader.style.display = 'block'; } // Hide loader function hideLoader() { loader.style.display = 'none'; } // Show error message function showError(message) { errorMessage.textContent = message; errorMessage.style.display = 'block'; } // Hide error message function hideError() { errorMessage.style.display = 'none'; } // Enter key event for single search docIdInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { searchBtn.click(); } }); // Load indexed documents on page load document.addEventListener('DOMContentLoaded', loadIndexedDocuments);