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