// ============================================================ // DOCUMENTS.JS — S3 document upload & management UI // ============================================================ (function() { function loadDocuments() { var container = document.getElementById('documents-list'); if (!container) return; fetch('/api/documents', { headers: getAuthHeaders() }) .then(function(r) { return r.json(); }) .then(function(data) { if (!data.s3_configured) { container.innerHTML = '

S3 storage not configured. Set S3_BUCKET in server environment.

'; var uploadArea = document.getElementById('doc-upload-area'); if (uploadArea) uploadArea.style.display = 'none'; return; } var docs = data.documents || []; if (docs.length === 0) { container.innerHTML = '

No documents uploaded yet.

'; return; } container.innerHTML = docs.map(function(doc) { var sizeStr = doc.size_bytes < 1024 ? doc.size_bytes + ' B' : doc.size_bytes < 1048576 ? Math.round(doc.size_bytes / 1024) + ' KB' : (doc.size_bytes / 1048576).toFixed(1) + ' MB'; var date = doc.created_at ? new Date(doc.created_at).toLocaleDateString() : ''; return '
' + '
' + '
' + '' + esc(doc.filename) + '
' + '
' + sizeStr + ' · ' + date + (doc.description ? ' · ' + esc(doc.description) : '') + '
' + '
' + '' + '' + '
'; }).join(''); container.querySelectorAll('.doc-download-btn').forEach(function(btn) { btn.addEventListener('click', function() { downloadDocument(btn.dataset.id); }); }); container.querySelectorAll('.doc-delete-btn').forEach(function(btn) { btn.addEventListener('click', function() { deleteDocument(btn.dataset.id); }); }); }) .catch(function() { container.innerHTML = '

Failed to load documents.

'; }); } function uploadDocument() { var fileInput = document.getElementById('doc-file-input'); var descInput = document.getElementById('doc-description'); if (!fileInput || !fileInput.files[0]) { showToast('Select a file first', 'error'); return; } var formData = new FormData(); formData.append('file', fileInput.files[0]); formData.append('description', descInput ? descInput.value : ''); showLoading('Uploading document...'); fetch('/api/documents/upload', { method: 'POST', headers: window.IS_NATIVE_APP ? { 'Authorization': 'Bearer ' + (window.AUTH_TOKEN || (window.SecureStorage && window.SecureStorage.getSync('ped_scribe_token')) || '') } : {}, // web: httpOnly cookie sent automatically via credentials:'same-origin' default credentials: 'same-origin', body: formData }) .then(function(r) { return r.json(); }) .then(function(data) { hideLoading(); if (data.success) { showToast('Document uploaded: ' + data.filename, 'success'); fileInput.value = ''; if (descInput) descInput.value = ''; loadDocuments(); } else { showToast(data.error || 'Upload failed', 'error'); } }) .catch(function(err) { hideLoading(); showToast('Upload failed: ' + err.message, 'error'); }); } function downloadDocument(id) { fetch('/api/documents/' + id + '/download', { headers: getAuthHeaders() }) .then(function(r) { return r.json(); }) .then(function(data) { if (data.success && data.url) { window.open(data.url, '_blank'); } else { showToast(data.error || 'Download failed', 'error'); } }) .catch(function() { showToast('Download failed', 'error'); }); } function deleteDocument(id) { showConfirm('Delete this document permanently?', function() { fetch('/api/documents/' + id, { method: 'DELETE', headers: getAuthHeaders() }) .then(function(r) { return r.json(); }) .then(function(data) { if (data.success) { showToast('Document deleted', 'info'); loadDocuments(); } else showToast(data.error || 'Delete failed', 'error'); }) .catch(function() { showToast('Delete failed', 'error'); }); }, { danger: true, confirmText: 'Delete' }); } function esc(str) { if (!str) return ''; return String(str).replace(/&/g, '&').replace(//g, '>'); } // Expose for settings tab load window.loadDocuments = loadDocuments; // Wire upload button document.addEventListener('click', function(e) { if (e.target.closest('#btn-doc-upload')) uploadDocument(); }); console.log('Documents module loaded'); })();