function loadFileList(path = '') {
currentPath = path;
$("current-path").textContent = "/" + path;
fetch(`/api/files?username=${username}&path=${encodeURIComponent(path)}`)
.then(r => r.json())
.then(data => {
const list = $("file-list");
list.innerHTML = '';
if (path) {
list.innerHTML += `
⬅️ ..`;
}
data.sort((a, b) => a.name.localeCompare(b.name));
data.forEach(entry => {
const itemPath = path ? `${path}/${entry.name}` : entry.name;
const html = entry.is_dir
? `📁 ${entry.name}
`
: `📄 ${entry.name}
`;
list.innerHTML += html;
});
});
}
function deleteItem(path) {
if (!confirm(`Czy na pewno chcesz usunąć: ${path}?`)) return;
fetch('/api/files/delete', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, path })
})
.then(res => res.json())
.then(data => {
if (data.success) {
loadFileList(currentPath);
} else {
alert("Błąd podczas usuwania: " + (data.error || "Nieznany"));
}
})
.catch(err => {
console.error(err);
alert("Błąd połączenia z serwerem.");
});
}
document.querySelector('[onclick="showTab(\'files\')"]').addEventListener('click', () => loadFileList());
const dropZone = document.getElementById('drop-zone');
const fileInput = document.getElementById('file-input');
const progressBar = document.getElementById('progress-bar');
const progressWrapper = document.getElementById('upload-progress');
dropZone.addEventListener('click', () => fileInput.click());
dropZone.addEventListener('dragover', e => {
e.preventDefault();
dropZone.classList.add('dragover');
});
dropZone.addEventListener('dragleave', e => {
e.preventDefault();
dropZone.classList.remove('dragover');
});
dropZone.addEventListener('drop', e => {
e.preventDefault();
dropZone.classList.remove('dragover');
handleFiles(e.dataTransfer.files);
});
fileInput.addEventListener('change', () => {
handleFiles(fileInput.files);
});
function handleFiles(files) {
if (!files.length) return;
const formData = new FormData();
for (const file of files) {
formData.append('files', file);
}
formData.append('username', username);
formData.append('path', currentPath);
progressWrapper.classList.remove('hidden');
progressBar.style.width = '0%';
const xhr = new XMLHttpRequest();
xhr.open('POST', `/api/files/upload?username=${username}&path=${encodeURIComponent(currentPath)}`);
xhr.upload.addEventListener('progress', e => {
if (e.lengthComputable) {
const percent = (e.loaded / e.total) * 100;
progressBar.style.width = `${percent}%`;
}
});
xhr.onload = () => {
progressWrapper.classList.add('hidden');
if (xhr.status === 200) {
loadFileList(currentPath);
} else {
alert("Upload się nie udał.");
}
};
xhr.onerror = () => {
progressWrapper.classList.add('hidden');
alert("Upload się nie udał.");
};
xhr.send(formData);
}