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(); }); });