let selectedFiles = []; let scanResults = []; let selectedIndex = -1; const fileInput = document.getElementById('fileInput'); const uploadInfo = document.getElementById('uploadInfo'); const resultsBody = document.getElementById('resultsBody'); const detailsContent = document.getElementById('detailsContent'); const emptyState = document.getElementById('emptyState'); const btnScan = document.getElementById('btnScan'); const btnSanitize = document.getElementById('btnSanitize'); const statusText = document.getElementById('statusText'); const dropZone = document.getElementById('dropZone'); fileInput.addEventListener('change', handleFileSelect); dropZone.addEventListener('dragover', (e) => { e.preventDefault(); dropZone.classList.add('drag-over'); }); dropZone.addEventListener('dragleave', () => { dropZone.classList.remove('drag-over'); }); dropZone.addEventListener('drop', (e) => { e.preventDefault(); dropZone.classList.remove('drag-over'); if (e.dataTransfer.files.length) { fileInput.files = e.dataTransfer.files; handleFileSelect(); } }); function handleFileSelect() { selectedFiles = Array.from(fileInput.files); if (selectedFiles.length === 0) { uploadInfo.textContent = 'No files selected'; } else if (selectedFiles.length === 1) { uploadInfo.textContent = selectedFiles[0].name; } else { uploadInfo.textContent = `${selectedFiles.length} files selected`; } } async function uploadFiles() { if (!selectedFiles.length) return false; setStatus('Uploading files...'); const formData = new FormData(); for (const file of selectedFiles) { formData.append('files', file); } try { const resp = await fetch('/api/upload', { method: 'POST', body: formData }); const data = await resp.json(); if (data.error) { setStatus('Upload failed: ' + data.error); return false; } setStatus(`Uploaded ${data.count} file(s)`); return true; } catch (e) { setStatus('Upload failed: ' + e.message); return false; } } async function startScan() { const context = document.getElementById('context').value; const recursive = document.getElementById('recursive').checked; const uploaded = await uploadFiles(); if (!uploaded && !selectedFiles.length) { setStatus('No files to scan. Select files first.'); return; } btnScan.disabled = true; btnScan.textContent = 'Scanning...'; setStatus('Scanning...'); try { const resp = await fetch('/api/scan', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ target: '', recursive, context }) }); const data = await resp.json(); if (data.error) { setStatus('Scan failed: ' + data.error); return; } scanResults = data.results; selectedIndex = -1; renderTable(); setStatus(`Scan complete: ${data.count} file(s) analyzed`); } catch (e) { setStatus('Scan failed: ' + e.message); } finally { btnScan.disabled = false; btnScan.textContent = 'Scan'; } } function renderTable() { resultsBody.innerHTML = ''; emptyState.style.display = scanResults.length ? 'none' : 'block'; scanResults.forEach((r, i) => { const tr = document.createElement('tr'); tr.dataset.index = i; const author = r.metadata.author || r.metadata.last_modified_by || ''; tr.innerHTML = `