From c0b9ec9d1701631fe373011bd70175203bb6e027 Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 12 Mar 2026 04:01:09 +0100 Subject: [PATCH] feat: add drop target overlay and statusbar colons - Full-window drop overlay with large "+" icon when dragging files over the app - Works from any tab, not just the upload view - Added colons to all statusbar labels for consistency Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- renderer/app.js | 41 +++++++++++++++++++++++++++++++++++------ renderer/index.html | 7 +++++++ renderer/styles.css | 30 ++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 9587410..bfa3837 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "multi-hoster-uploader", - "version": "1.9.5", + "version": "1.9.6", "description": "Upload files to doodstream, voe, vidmoly, byse simultaneously", "main": "main.js", "scripts": { diff --git a/renderer/app.js b/renderer/app.js index 3f2d2b8..56c6137 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -414,11 +414,39 @@ function setupDragDrop() { const dropZone = document.getElementById('dropZone'); // Allow drop on the entire upload view const uploadView = document.getElementById('upload-view'); + const dropOverlay = document.getElementById('dropOverlay'); + + // Window-level drag overlay + let dragCounter = 0; + window.addEventListener('dragenter', (e) => { + e.preventDefault(); + if (!e.dataTransfer.types.includes('Files')) return; + dragCounter++; + dropOverlay.classList.add('visible'); + }); + window.addEventListener('dragleave', (e) => { + e.preventDefault(); + dragCounter--; + if (dragCounter <= 0) { dragCounter = 0; dropOverlay.classList.remove('visible'); } + }); + window.addEventListener('dragover', (e) => { e.preventDefault(); }); + let _dropHandled = false; + window.addEventListener('drop', (e) => { + e.preventDefault(); + dragCounter = 0; + dropOverlay.classList.remove('visible'); + // Process files dropped anywhere (fallback if no specific handler caught it) + if (!_dropHandled && e.dataTransfer.files.length > 0) { + addDroppedFiles(e.dataTransfer.files).catch(console.error); + } + _dropHandled = false; + }); dropZone.addEventListener('dragover', (e) => { e.preventDefault(); e.stopPropagation(); dropZone.classList.add('drag-over'); }); dropZone.addEventListener('dragleave', (e) => { e.preventDefault(); dropZone.classList.remove('drag-over'); }); dropZone.addEventListener('drop', (e) => { e.preventDefault(); e.stopPropagation(); dropZone.classList.remove('drag-over'); + _dropHandled = true; addDroppedFiles(e.dataTransfer.files).catch(console.error); }); dropZone.addEventListener('click', () => pickFiles()); @@ -428,6 +456,7 @@ function setupDragDrop() { uploadView.addEventListener('drop', (e) => { e.preventDefault(); if (e.target.closest('.drop-zone')) return; // handled above + _dropHandled = true; addDroppedFiles(e.dataTransfer.files).catch(console.error); }); } @@ -1636,12 +1665,12 @@ function updateStatusBar() { const uploadedSize = Math.max(0, stats.totalSize - stats.remainingSize); document.getElementById('sbTotal').textContent = `${formatSize(uploadedSize)} / ${formatSize(stats.totalSize)}`; document.getElementById('sbEta').textContent = `ETA ${etaSeconds > 0 ? formatTime(etaSeconds) : '--:--'}`; - document.getElementById('sbConnections').textContent = `Aktive Verbindungen ${lastUploadStats.activeJobs || 0}`; - document.getElementById('sbQueueCount').textContent = `Gesamt ${stats.total}`; - document.getElementById('sbRemainingCount').textContent = `Remaining ${stats.remaining}`; - document.getElementById('sbInProgressCount').textContent = `In Progress ${stats.inProgress}`; - document.getElementById('sbDoneCount').textContent = `Done ${stats.done}`; - document.getElementById('sbErrorCount').textContent = `Error ${stats.errors}`; + document.getElementById('sbConnections').textContent = `Aktive Verbindungen: ${lastUploadStats.activeJobs || 0}`; + document.getElementById('sbQueueCount').textContent = `Gesamt: ${stats.total}`; + document.getElementById('sbRemainingCount').textContent = `Remaining: ${stats.remaining}`; + document.getElementById('sbInProgressCount').textContent = `In Progress: ${stats.inProgress}`; + document.getElementById('sbDoneCount').textContent = `Done: ${stats.done}`; + document.getElementById('sbErrorCount').textContent = `Error: ${stats.errors}`; } // --- Health Check --- diff --git a/renderer/index.html b/renderer/index.html index 523c9ee..b23afc7 100644 --- a/renderer/index.html +++ b/renderer/index.html @@ -7,6 +7,13 @@ +
+
+
+
+

Dateien hier ablegen

+
+
+