const folderBtn = document.getElementById('folderBtn'); const zipBtn = document.getElementById('zipBtn'); const dropZone = document.getElementById('dropZone'); const output = document.getElementById('output'); const destinationInput = document.getElementById('destinationInput'); const browseDestinationBtn = document.getElementById('browseDestinationBtn'); const saveDestinationBtn = document.getElementById('saveDestinationBtn'); const openUnroutedBtn = document.getElementById('openUnroutedBtn'); const destinationStatus = document.getElementById('destinationStatus'); const unroutedPreviewOverlay = document.getElementById('unroutedPreviewOverlay'); const closeUnroutedPreviewBtn = document.getElementById('closeUnroutedPreviewBtn'); const unroutedPreviewMeta = document.getElementById('unroutedPreviewMeta'); const unroutedPreviewList = document.getElementById('unroutedPreviewList'); const defaultDropZoneText = 'Trascina qui una cartella o un file .zip'; let isProcessing = false; function setLoading(isLoading) { folderBtn.disabled = isLoading; zipBtn.disabled = isLoading; } function setDestinationLoading(isLoading) { destinationInput.disabled = isLoading; browseDestinationBtn.disabled = isLoading; saveDestinationBtn.disabled = isLoading; openUnroutedBtn.disabled = isLoading; } function formatBytes(bytes) { const value = Number(bytes || 0); if (value < 1024) return `${value} B`; if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`; if (value < 1024 * 1024 * 1024) return `${(value / (1024 * 1024)).toFixed(1)} MB`; return `${(value / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function showUnroutedPreview(payload) { const files = payload?.files || []; const directory = payload?.directory || ''; const lines = files.length ? files.map((file) => `- ${file.relativePath} | ${formatBytes(file.size)}`).join('\n') : 'Nessun file presente in __NON_SMISTATI.'; unroutedPreviewMeta.textContent = `cartella: ${directory} | file totali: ${files.length}`; unroutedPreviewList.textContent = lines; unroutedPreviewOverlay.classList.add('visible'); } function hideUnroutedPreview() { unroutedPreviewOverlay.classList.remove('visible'); } function renderResult(title, result) { const details = (result.details || []).slice(0, 20); const detailsText = details.length ? details .map((d) => (d.destination ? `- ${d.file} -> ${d.destination}` : `- ${d.file}: ${d.reason}`)) .join('\n') : '- nessun dettaglio'; output.textContent = [ title, `scansionati: ${result.scanned ?? 0}`, `copiati: ${result.copied ?? 0}`, `saltati: ${result.skipped ?? 0}`, `non smistati: ${result.unrouted ?? 0}`, '', 'dettagli (max 20):', detailsText, ].join('\n'); } async function handleAction(actionName, actionFn) { if (isProcessing) { return; } isProcessing = true; setLoading(true); output.textContent = `${actionName} in corso...`; try { const result = await actionFn(); if (!result || result.canceled) { output.textContent = `${actionName} annullato.`; return; } renderResult(actionName, result); } catch (error) { output.textContent = `${actionName} fallito:\n${error.message}`; } finally { setLoading(false); isProcessing = false; } } folderBtn.addEventListener('click', () => handleAction('Process Folder', window.api.selectFolder)); zipBtn.addEventListener('click', () => handleAction('Process ZIP', window.api.selectZip)); function resetDropZoneText() { dropZone.textContent = defaultDropZoneText; } function setDropZoneError(message) { dropZone.textContent = message; dropZone.classList.add('error'); setTimeout(() => { dropZone.classList.remove('error'); resetDropZoneText(); }, 1800); } dropZone.addEventListener('dragover', (event) => { event.preventDefault(); dropZone.classList.add('active'); }); dropZone.addEventListener('dragleave', () => { dropZone.classList.remove('active'); }); window.addEventListener('dragover', (event) => { event.preventDefault(); }); window.addEventListener('drop', (event) => { if (event.target instanceof Node && dropZone.contains(event.target)) { return; } event.preventDefault(); }); dropZone.addEventListener('drop', async (event) => { event.preventDefault(); dropZone.classList.remove('active'); const droppedFile = event.dataTransfer?.files?.[0] || event.dataTransfer?.items?.[0]?.getAsFile?.(); let droppedPath = ''; if (droppedFile) { try { droppedPath = window.api.getPathForDroppedFile(droppedFile) || droppedFile.path || ''; } catch { droppedPath = ''; } } if (!droppedPath) { setDropZoneError('Elemento non valido. Trascina una cartella o un file .zip'); return; } await handleAction('Process Drag & Drop', () => window.api.processDroppedPath(droppedPath)); }); browseDestinationBtn.addEventListener('click', async () => { try { setDestinationLoading(true); destinationStatus.textContent = 'Seleziona una cartella...'; const result = await window.api.selectDestinationFolder(); if (!result || result.canceled) { destinationStatus.textContent = 'Selezione annullata.'; return; } destinationInput.value = result.path; destinationStatus.textContent = 'Cartella selezionata. Premi Salva.'; } catch (error) { destinationStatus.textContent = `Errore: ${error.message}`; } finally { setDestinationLoading(false); } }); saveDestinationBtn.addEventListener('click', async () => { const destination = destinationInput.value.trim(); if (!destination) { destinationStatus.textContent = 'Inserisci una destinazione valida.'; return; } try { setDestinationLoading(true); destinationStatus.textContent = 'Salvataggio in corso...'; const result = await window.api.updateDestination(destination); destinationInput.value = result.destination; destinationStatus.textContent = 'Destinazione salvata.'; } catch (error) { destinationStatus.textContent = `Errore: ${error.message}`; } finally { setDestinationLoading(false); } }); openUnroutedBtn.addEventListener('click', async () => { try { setDestinationLoading(true); destinationStatus.textContent = 'Caricamento anteprima non smistati...'; const result = await window.api.listUnroutedFiles(); showUnroutedPreview(result); destinationStatus.textContent = `Anteprima caricata (${result.files?.length || 0} file).`; } catch (error) { destinationStatus.textContent = `Errore: ${error.message}`; } finally { setDestinationLoading(false); } }); closeUnroutedPreviewBtn.addEventListener('click', hideUnroutedPreview); unroutedPreviewOverlay.addEventListener('click', (event) => { if (event.target === unroutedPreviewOverlay) { hideUnroutedPreview(); } }); window.addEventListener('keydown', (event) => { if (event.key === 'Escape' && unroutedPreviewOverlay.classList.contains('visible')) { hideUnroutedPreview(); } }); async function initConfigUI() { try { const destinationResult = await window.api.getDestination(); destinationInput.value = destinationResult.destination || ''; destinationStatus.textContent = ''; } catch (error) { destinationStatus.textContent = 'Impossibile caricare la destinazione.'; } } initConfigUI();