async function deleteFiles(filePaths) { try { const response = await fetch('/delete_files', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ file_paths: filePaths }) }); const data = await response.json(); if (data.success) { alert('Files deleted successfully'); location.reload(); } else { alert(`Error deleting files: ${JSON.stringify(data.errors)}`); } } catch (error) { console.error('Error:', error); alert('An error occurred while deleting files.'); } } function getSelectedFiles() { return Array.from(document.querySelectorAll('input[name="fileCheckbox"]:checked')) .map(checkbox => checkbox.value); } function deleteSelectedFiles() { const selectedFiles = getSelectedFiles(); if (selectedFiles.length > 0) { deleteFiles(selectedFiles); } else { alert('No files selected'); } } async function downloadSelectedFiles() { const selectedFiles = getSelectedFiles(); if (selectedFiles.length === 0) { alert('No files selected'); return; } try { const response = await fetch('/download_files', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ file_paths: selectedFiles }) }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to download files.'); } const blob = await response.blob(); if (blob.type !== 'application/zip') { throw new Error('Received invalid ZIP file.'); } const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'files.zip'; document.body.appendChild(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); } catch (error) { console.error('Download error:', error); alert(`Error: ${error.message}`); } } function sortTable(columnIndex, tableId) { const table = document.getElementById(tableId); const tbody = table.querySelector('tbody'); const rows = Array.from(tbody.rows); const isAscending = table.dataset.sortAsc === 'true'; rows.sort((rowA, rowB) => { const cellA = rowA.cells[columnIndex].innerText.trim().toLowerCase(); const cellB = rowB.cells[columnIndex].innerText.trim().toLowerCase(); return cellA.localeCompare(cellB) * (isAscending ? 1 : -1); }); // Toggle sorting order for next click table.dataset.sortAsc = !isAscending; // Reinsert sorted rows rows.forEach(row => tbody.appendChild(row)); }