|
|
|
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'); |
|
|
|
|
|
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'; |
|
}); |
|
|
|
|
|
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); |
|
} 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(); |
|
} |
|
}); |
|
|
|
|
|
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); |
|
} 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(); |
|
} |
|
}); |
|
|
|
|
|
function displaySingleResult(data) { |
|
resultsList.innerHTML = ''; |
|
|
|
const resultItem = document.createElement('div'); |
|
resultItem.className = 'result-item'; |
|
resultItem.innerHTML = ` |
|
<div class="result-header"> |
|
<div class="result-id">${data.doc_id}</div> |
|
<div class="result-status status-found">Found</div> |
|
</div> |
|
<div class="result-url"> |
|
<a href="${data.url}" target="_blank">${data.url}</a> |
|
</div> |
|
`; |
|
|
|
resultsList.appendChild(resultItem); |
|
resultsStats.textContent = `Found in ${data.search_time.toFixed(2)} seconds`; |
|
resultsContainer.style.display = 'block'; |
|
} |
|
|
|
|
|
function displaySingleNotFound(docId, message) { |
|
resultsList.innerHTML = ''; |
|
|
|
const resultItem = document.createElement('div'); |
|
resultItem.className = 'result-item'; |
|
resultItem.innerHTML = ` |
|
<div class="result-header"> |
|
<div class="result-id">${docId}</div> |
|
<div class="result-status status-not-found">Not Found</div> |
|
</div> |
|
<div>${message}</div> |
|
`; |
|
|
|
resultsList.appendChild(resultItem); |
|
resultsStats.textContent = 'Document not found'; |
|
resultsContainer.style.display = 'block'; |
|
} |
|
|
|
|
|
function displayBatchResults(data) { |
|
resultsList.innerHTML = ''; |
|
|
|
|
|
Object.entries(data.results).forEach(([docId, url]) => { |
|
const resultItem = document.createElement('div'); |
|
resultItem.className = 'result-item'; |
|
resultItem.innerHTML = ` |
|
<div class="result-header"> |
|
<div class="result-id">${docId}</div> |
|
<div class="result-status status-found">Found</div> |
|
</div> |
|
<div class="result-url"> |
|
<a href="${url}" target="_blank">${url}</a> |
|
</div> |
|
`; |
|
resultsList.appendChild(resultItem); |
|
}); |
|
|
|
|
|
data.missing.forEach(docId => { |
|
const resultItem = document.createElement('div'); |
|
resultItem.className = 'result-item'; |
|
resultItem.innerHTML = ` |
|
<div class="result-header"> |
|
<div class="result-id">${docId}</div> |
|
<div class="result-status status-not-found">Not Found</div> |
|
</div> |
|
`; |
|
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'; |
|
} |
|
|
|
|
|
function showLoader() { |
|
loader.style.display = 'block'; |
|
} |
|
|
|
|
|
function hideLoader() { |
|
loader.style.display = 'none'; |
|
} |
|
|
|
|
|
function showError(message) { |
|
errorMessage.textContent = message; |
|
errorMessage.style.display = 'block'; |
|
} |
|
|
|
|
|
function hideError() { |
|
errorMessage.style.display = 'none'; |
|
} |
|
|
|
|
|
docIdInput.addEventListener('keypress', (e) => { |
|
if (e.key === 'Enter') { |
|
searchBtn.click(); |
|
} |
|
}); |