document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('keyword-input');
const apiKey = document.getElementById('apikey-input');
const limitInput = document.getElementById("limit-input");
const searchButton = document.getElementById('search-button');
const researchButton = document.getElementById('plan-button');
const limitCheckbox = document.getElementById("limit-check");
const popupText = document.querySelector(".scrollable-text");
const popupTitle = document.getElementById("popup-title");
const body = document.body;
const resultsContainer = document.getElementById('results-container');
async function performResearch() {
const keyword = searchInput.value.trim();
let limit = limitInput.value.trim();
if (!keyword) {
resultsContainer.innerHTML = '
Please enter a search keyword.
';
return;
}
if (!limit){
limit = 15;
}
// Show loading indicator
resultsContainer.innerHTML = 'Generating research plan about "' + keyword + '"...
';
try {
const response = await fetch('/search/plan', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
"GROQ_TOKEN": apiKey.value
},
body: JSON.stringify({
model: "llama-3.3-70b-versatile",
user: keyword,
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (data.error) {
resultsContainer.innerHTML = `Error: ${data.message}
`;
return;
}
displayPlan(data.message.plan);
} catch (error) {
console.error('Search error:', error);
resultsContainer.innerHTML = `Error performing generation: ${error.message}
`;
}
}
async function performSearch() {
const keyword = searchInput.value.trim();
let limit = limitInput.value.trim();
if (!keyword) {
resultsContainer.innerHTML = 'Please enter a search keyword.
';
return;
}
if (!limit){
limit = 15;
}
// Show loading indicator
resultsContainer.innerHTML = 'Searching for ' + limit.toString() + ' papers about "' + keyword + '"...
';
try {
const response = await fetch('/search', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
keyword: keyword,
limit: limit
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (data.error) {
resultsContainer.innerHTML = `Search error: ${data.message}
`;
return;
}
displayResults(data.message);
} catch (error) {
console.error('Search error:', error);
resultsContainer.innerHTML = `Error performing search: ${error.message}
`;
}
}
function handleCustomLimit(){
if(limitCheckbox.checked){
limitInput.removeAttribute("disabled")
} else {
limitInput.value = 15;
limitInput.setAttribute("disabled", "")
}
}
function displayPlan(results) {
console.log(results);
resultsContainer.innerHTML = '';
if (!results || Object.keys(results).length === 0) {
resultsContainer.innerHTML = 'Try again !
';
return;
}
const resultsCount = Object.keys(results).length;
const resultsHeader = document.createElement('h2');
resultsHeader.textContent = `Got ${resultsCount} steps to follow`;
resultsContainer.appendChild(resultsHeader);
Object.entries(results).forEach(([id, step]) => {
const stepElement = document.createElement('div');
stepElement.classList.add('paper-result');
stepElement.innerHTML = `
Step no. ${step.step_index}
${step.step_text}
Keywords: ${step.keywords}
`;
resultsContainer.appendChild(stepElement);
})
}
function displayResults(results) {
resultsContainer.innerHTML = '';
if (!results || Object.keys(results).length === 0) {
resultsContainer.innerHTML = 'No results found. Try a different keyword.
';
return;
}
const resultsCount = Object.keys(results).length;
const resultsHeader = document.createElement('h2');
resultsHeader.textContent = `Found ${resultsCount} paper${resultsCount > 1 ? 's' : ''}`;
resultsContainer.appendChild(resultsHeader);
Object.entries(results).forEach(([id, paper]) => {
const paperElement = document.createElement('div');
paperElement.classList.add('paper-result');
// Format the abstract to preserve line breaks
const formattedAbstract = paper.abstract;
paperElement.innerHTML = `
${paper.title}
${paper.authors}
Published: ${paper.date}
${formattedAbstract}
ArXiv ID: ${id}
Show PDF
`;
resultsContainer.appendChild(paperElement);
});
document.querySelectorAll(".extractText").forEach(btn => {
btn.addEventListener("click", async function () {
let id_doc = btn.getAttribute("doc");
popupTitle.textContent = `PDF extraction - Document no ${id_doc}`;
try {
const response = await fetch('/extract_pdf/arxiv_id', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
doc_id: id_doc
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (data.error) {
popupText.innerHTML = `Search error: ${data.message}
`;
return;
}
text = "";
popupText.textContent = data.message.text;
} catch (error) {
console.error('Search error:', error);
popupText.innerHTML = `Error performing search: ${error.message}
`;
}
document.getElementById("popup").style.display = "flex";
body.classList.add("no-scroll")
});
})
}
// Add event listeners
document.querySelector(".close").addEventListener("click", () => {
document.getElementById("popup").style.display = "none";
body.classList.remove("no-scroll");
})
window.addEventListener("click", function (event) {
if (event.target === popup) {
popup.style.display = "none";
body.classList.remove("no-scroll");
}
});
searchButton.addEventListener('click', performSearch);
researchButton.addEventListener('click', performResearch);
limitCheckbox.addEventListener("change", handleCustomLimit);
searchInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') performSearch();
});
});