// Images to PDF - JavaScript Functionality let imagesToPdfFiles = []; let imagesToPdfSortable = null; // DOM elements let uploadArea, fileInput, fileList, filesContainer, convertBtn, clearBtn; let progressBar, progressText, uploadProgress, resultArea, errorArea; let downloadLink; // Initialize when page loads document.addEventListener('DOMContentLoaded', function() { // Get DOM elements uploadArea = document.getElementById('upload-area'); fileInput = document.getElementById('file-input'); fileList = document.getElementById('file-list'); filesContainer = document.getElementById('files-container'); convertBtn = document.getElementById('convert-btn'); clearBtn = document.getElementById('clear-btn'); progressBar = document.getElementById('progress-bar'); progressText = document.getElementById('progress-text'); uploadProgress = document.getElementById('upload-progress'); resultArea = document.getElementById('result-area'); errorArea = document.getElementById('error-area'); downloadLink = document.getElementById('download-link'); // Setup event listeners setupEventListeners(); // Setup drag and drop setupDragAndDrop(uploadArea, handleFiles); }); function setupEventListeners() { // File input change fileInput.addEventListener('change', function(e) { handleFiles(Array.from(e.target.files)); }); // Convert button convertBtn.addEventListener('click', convertToPdf); // Clear button clearBtn.addEventListener('click', clearFiles); // Upload area click uploadArea.addEventListener('click', function() { fileInput.click(); }); } function handleFiles(files) { // Hide previous results/errors hideResults(); if (!files || files.length === 0) { showError('Keine Dateien ausgewählt.'); return; } // Filter valid image files const validFiles = files.filter(file => { const isValid = file.type.startsWith('image/'); if (!isValid) { showNotification(`${file.name} ist keine gültige Bilddatei.`, 'warning'); } return isValid; }); if (validFiles.length === 0) { showError('Keine gültigen Bilddateien gefunden.'); return; } // Show upload progress showUploadProgress(); // Upload files uploadImages(validFiles); } async function uploadImages(files) { try { const response = await uploadFiles(files, '/api/upload-images', updateProgress); if (response.success) { imagesToPdfFiles = response.files; displayFiles(); showNotification(response.message, 'success'); } else { throw new Error(response.error || 'Upload fehlgeschlagen'); } } catch (error) { showError(`Upload-Fehler: ${error.message}`); } finally { hideUploadProgress(); } } function updateProgress(percent) { progressBar.style.width = percent + '%'; progressText.textContent = Math.round(percent) + '%'; } function displayFiles() { filesContainer.innerHTML = ''; imagesToPdfFiles.forEach((file, index) => { const fileItem = createFileItem(file, index); filesContainer.appendChild(fileItem); }); // Show file list fileList.style.display = 'block'; // Enable convert button convertBtn.disabled = false; // Setup sortable setupSortableList(); } function createFileItem(file, index) { const div = document.createElement('div'); div.className = 'list-group-item file-item'; div.dataset.index = index; div.innerHTML = `