Spaces:
Running
Running
/** | |
* RAG κ²μ μ±λ΄ λ¬Έμ κ΄λ¦¬ JavaScript | |
*/ | |
// DOM μμ 미리 μ μΈ | |
let uploadForm, documentFile, fileName, uploadButton, uploadStatus; | |
let refreshDocsButton, docsList, docsLoading, noDocsMessage; | |
/** | |
* λ¬Έμ κ΄λ¦¬ DOM μμ μ΄κΈ°ν | |
*/ | |
function initDocsElements() { | |
console.log('λ¬Έμ κ΄λ¦¬ DOM μμ μ΄κΈ°ν μ€...'); | |
uploadForm = document.getElementById('uploadForm'); | |
documentFile = document.getElementById('documentFile'); | |
fileName = document.getElementById('fileName'); | |
uploadButton = document.getElementById('uploadButton'); | |
uploadStatus = document.getElementById('uploadStatus'); | |
refreshDocsButton = document.getElementById('refreshDocsButton'); | |
docsList = document.getElementById('docsList'); | |
docsLoading = document.getElementById('docsLoading'); | |
noDocsMessage = document.getElementById('noDocsMessage'); | |
console.log('λ¬Έμ κ΄λ¦¬ DOM μμ μ΄κΈ°ν μλ£'); | |
// λ¬Έμ κ΄λ¦¬ μ΄λ²€νΈ 리μ€λ μ΄κΈ°ν | |
initDocsEventListeners(); | |
} | |
/** | |
* λ¬Έμ κ΄λ¦¬ μ΄λ²€νΈ 리μ€λ μ΄κΈ°ν | |
*/ | |
function initDocsEventListeners() { | |
console.log('λ¬Έμ κ΄λ¦¬ μ΄λ²€νΈ 리μ€λ μ΄κΈ°ν μ€...'); | |
// λ¬Έμ μ λ‘λ μ΄λ²€νΈ 리μ€λ | |
documentFile.addEventListener('change', (event) => { | |
if (event.target.files.length > 0) { | |
fileName.textContent = event.target.files[0].name; | |
console.log(`νμΌ μ νλ¨: ${event.target.files[0].name}`); | |
} else { | |
fileName.textContent = 'μ νλ νμΌ μμ'; | |
console.log('νμΌ μ ν μ·¨μλ¨'); | |
} | |
}); | |
uploadForm.addEventListener('submit', (event) => { | |
event.preventDefault(); | |
console.log('μ λ‘λ νΌ μ μΆλ¨'); | |
uploadDocument(); | |
}); | |
// λ¬Έμ λͺ©λ‘ μλ‘κ³ μΉ¨ μ΄λ²€νΈ 리μ€λ | |
refreshDocsButton.addEventListener('click', () => { | |
console.log('λ¬Έμ λͺ©λ‘ μλ‘κ³ μΉ¨ μμ²'); | |
loadDocuments(); | |
}); | |
console.log('λ¬Έμ κ΄λ¦¬ μ΄λ²€νΈ 리μ€λ μ΄κΈ°ν μλ£'); | |
} | |
/** | |
* λ¬Έμ μ λ‘λ ν¨μ | |
*/ | |
async function uploadDocument() { | |
if (documentFile.files.length === 0) { | |
console.log('μ λ‘λν νμΌμ΄ μ νλμ§ μμ'); | |
alert('νμΌμ μ νν΄ μ£ΌμΈμ.'); | |
return; | |
} | |
console.log(`νμΌ μ λ‘λ μμ: ${documentFile.files[0].name}`); | |
// UI μ λ°μ΄νΈ | |
uploadStatus.classList.remove('hidden'); | |
uploadStatus.className = 'upload-status'; | |
uploadStatus.innerHTML = '<div class="spinner"></div><p>μ λ‘λ μ€...</p>'; | |
uploadButton.disabled = true; | |
try { | |
const formData = new FormData(); | |
formData.append('document', documentFile.files[0]); | |
console.log('λ¬Έμ μ λ‘λ API μμ² μ μ‘'); | |
// API μμ² | |
const response = await fetch('/api/upload', { | |
method: 'POST', | |
body: formData | |
}); | |
const data = await response.json(); | |
console.log('λ¬Έμ μ λ‘λ API μλ΅ μμ '); | |
// μλ΅ μ²λ¦¬ | |
if (data.error) { | |
console.error('μ λ‘λ μ€λ₯:', data.error); | |
uploadStatus.className = 'upload-status error'; | |
uploadStatus.textContent = `μ€λ₯: ${data.error}`; | |
} else if (data.warning) { | |
console.warn('μ λ‘λ κ²½κ³ :', data.message); | |
uploadStatus.className = 'upload-status warning'; | |
uploadStatus.textContent = data.message; | |
} else { | |
console.log('μ λ‘λ μ±κ³΅:', data.message); | |
uploadStatus.className = 'upload-status success'; | |
uploadStatus.textContent = data.message; | |
// λ¬Έμ λͺ©λ‘ μλ‘κ³ μΉ¨ | |
loadDocuments(); | |
// μ λ ₯ νλ μ΄κΈ°ν | |
documentFile.value = ''; | |
fileName.textContent = 'μ νλ νμΌ μμ'; | |
} | |
} catch (error) { | |
console.error('μ λ‘λ μ²λ¦¬ μ€ μ€λ₯:', error); | |
uploadStatus.className = 'upload-status error'; | |
uploadStatus.textContent = 'μ λ‘λ μ€ μ€λ₯κ° λ°μνμ΅λλ€. λ€μ μλν΄ μ£ΌμΈμ.'; | |
} finally { | |
uploadButton.disabled = false; | |
} | |
} | |
/** | |
* λ¬Έμ λͺ©λ‘ λ‘λ ν¨μ | |
*/ | |
async function loadDocuments() { | |
console.log('λ¬Έμ λͺ©λ‘ λ‘λ μμ'); | |
// UI μ λ°μ΄νΈ | |
docsList.querySelector('tbody').innerHTML = ''; | |
docsLoading.classList.remove('hidden'); | |
noDocsMessage.classList.add('hidden'); | |
try { | |
console.log('λ¬Έμ λͺ©λ‘ API μμ² μ μ‘'); | |
// API μμ² | |
const response = await fetch('/api/documents'); | |
if (!response.ok) { | |
throw new Error(`HTTP error! status: ${response.status}`); | |
} | |
const data = await response.json(); | |
console.log(`λ¬Έμ λͺ©λ‘ API μλ΅ μμ : ${data.documents ? data.documents.length : 0}κ° λ¬Έμ`); | |
// μλ΅ μ²λ¦¬ | |
docsLoading.classList.add('hidden'); | |
if (!data.documents || data.documents.length === 0) { | |
console.log('λ‘λλ λ¬Έμκ° μμ'); | |
noDocsMessage.classList.remove('hidden'); | |
return; | |
} | |
// λ¬Έμ λͺ©λ‘ μ λ°μ΄νΈ | |
const tbody = docsList.querySelector('tbody'); | |
data.documents.forEach(doc => { | |
console.log(`λ¬Έμ νμ: ${doc.filename || doc.source}`); | |
const row = document.createElement('tr'); | |
const fileNameCell = document.createElement('td'); | |
fileNameCell.textContent = doc.filename || doc.source; | |
row.appendChild(fileNameCell); | |
const chunksCell = document.createElement('td'); | |
chunksCell.textContent = doc.chunks; | |
row.appendChild(chunksCell); | |
const typeCell = document.createElement('td'); | |
typeCell.textContent = doc.filetype || '-'; | |
row.appendChild(typeCell); | |
tbody.appendChild(row); | |
}); | |
console.log('λ¬Έμ λͺ©λ‘ μ λ°μ΄νΈ μλ£'); | |
} catch (error) { | |
console.error('λ¬Έμ λͺ©λ‘ λ‘λ μ€λ₯:', error); | |
docsLoading.classList.add('hidden'); | |
noDocsMessage.classList.remove('hidden'); | |
noDocsMessage.querySelector('p').textContent = 'λ¬Έμ λͺ©λ‘μ λΆλ¬μ€λ μ€ μ€λ₯κ° λ°μνμ΅λλ€.'; | |
} | |
} | |
// νμ΄μ§ λ‘λ μ λͺ¨λ μ΄κΈ°ν | |
document.addEventListener('DOMContentLoaded', function() { | |
console.log('λ¬Έμ κ΄λ¦¬ λͺ¨λ μ΄κΈ°ν'); | |
// λΉλκΈ°μ μΌλ‘ μ΄κΈ°ν (DOM μμκ° μ€λΉλ ν) | |
setTimeout(() => { | |
initDocsElements(); | |
}, 100); | |
}); | |