class CustomFileUpload extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
`;
const dropArea = this.shadowRoot.getElementById('dropArea');
const fileInput = this.shadowRoot.getElementById('fileInput');
const fileList = this.shadowRoot.getElementById('fileList');
const uploadButton = this.shadowRoot.getElementById('uploadButton');
let files = [];
dropArea.addEventListener('click', () => fileInput.click());
fileInput.addEventListener('change', (e) => {
files = Array.from(e.target.files);
updateFileList();
});
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
dropArea.addEventListener(eventName, preventDefaults, false);
});
['dragenter', 'dragover'].forEach(eventName => {
dropArea.addEventListener(eventName, highlight, false);
});
['dragleave', 'drop'].forEach(eventName => {
dropArea.addEventListener(eventName, unhighlight, false);
});
dropArea.addEventListener('drop', handleDrop, false);
uploadButton.addEventListener('click', uploadFiles);
function preventDefaults(e) {
e.preventDefault();
e.stopPropagation();
}
function highlight() {
dropArea.classList.add('highlight');
}
function unhighlight() {
dropArea.classList.remove('highlight');
}
function handleDrop(e) {
const dt = e.dataTransfer;
files = Array.from(dt.files);
updateFileList();
}
function updateFileList() {
fileList.innerHTML = '';
files.forEach(file => {
const fileItem = document.createElement('div');
fileItem.className = 'file-item';
fileItem.innerHTML = `
${file.name} (${formatFileSize(file.size)})
`;
fileList.appendChild(fileItem);
});
feather.replace();
}
async function uploadFiles() {
if (files.length === 0) return;
const formData = new FormData();
files.forEach(file => formData.append('files', file));
try {
const response = await fetch('/api/files/upload', {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.ok) {
alert(`${data.files.length} fichiers envoyés avec succès à Rosalinda`);
files = [];
updateFileList();
}
} catch (error) {
console.error('Error uploading files:', error);
alert('Erreur lors de l\'envoi des fichiers');
}
}
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
}
}
customElements.define('custom-file-upload', CustomFileUpload);