From 20da34beb2a928e7d6297baeb0012c3b746e0f7d Mon Sep 17 00:00:00 2001 From: wisecolt Date: Mon, 2 Feb 2026 22:49:26 +0300 Subject: [PATCH] =?UTF-8?q?feat(ui):=20silme=20i=C5=9Flemini=20iki=20a?= =?UTF-8?q?=C5=9Famal=C4=B1=20onay=20sistemine=20d=C3=B6n=C3=BC=C5=9Ft?= =?UTF-8?q?=C3=BCr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tarayıcı doğrulama penceresi yerine inline onay mekanizması eklendi. Kullanıcı dosya silmek için "Sil" butonuna ilk tıkladığında buton kırmızıya dönerek "Emin misiniz?" sorusunu gösterir ve ikinci tıklamada silme işlemini gerçekleştirir. Bu yaklaşım kullanıcı deneyimini iyileştirir ve uygulama tutarlılığını artırır. --- client/src/routes/Files.svelte | 94 ++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/client/src/routes/Files.svelte b/client/src/routes/Files.svelte index 2332ee7..5903095 100644 --- a/client/src/routes/Files.svelte +++ b/client/src/routes/Files.svelte @@ -468,6 +468,7 @@ let pendingPlayTarget = null; let activeMenu = null; // Aktif menü öğesi let menuPosition = { top: 0, left: 0 }; // Menü pozisyonu + let deleteConfirmPending = false; // Silme onayı beklemede mi let showMatchModal = false; let matchingFile = null; let matchTitle = ""; @@ -1444,48 +1445,53 @@ async function deleteFile(item) { if (!item) return; - const target = resolveDeletionTargets(item); - if (!target) { + + // Eğer onay beklemedeyse, silme işlemini gerçekleştir + if (deleteConfirmPending) { + const target = resolveDeletionTargets(item); + if (!target) { + closeMenu(); + return; + } + + const result = await performDeletion(target); + deleteConfirmPending = false; // Reset flag + + if (!result.ok) { + alert("Silme hatası: " + (result.error || "Bilinmeyen hata")); + closeMenu(); + return; + } + + if (item.isDirectory) { + const displayKey = normalizePath( + item.displayPath || + (item.name?.startsWith("dir:") ? item.name.slice(4) : ""), + ); + if (displayKey || displayKey === "") { + pendingFolders.delete(displayKey); + } + } + + await loadFiles(); + await Promise.all([refreshMovieCount(), refreshTvShowCount(), fetchTrashItems()]); + selectedItems = new Set( + [...selectedItems].filter((name) => name !== item.name), + ); closeMenu(); return; } - const label = - target.type === "directory" - ? target.label || item.displayName || "Klasör" - : target.label || cleanFileName(item.name); - const message = - target.type === "directory" - ? `"${label}" klasörünü silmek istediğine emin misin?` - : `"${label}" dosyasını silmek istediğinizden emin misiniz?`; - - if (!confirm(message)) { - closeMenu(); - return; - } - - const result = await performDeletion(target); - if (!result.ok) { - alert("Silme hatası: " + (result.error || "Bilinmeyen hata")); - closeMenu(); - return; - } - if (item.isDirectory) { - const displayKey = normalizePath( - item.displayPath || - (item.name?.startsWith("dir:") ? item.name.slice(4) : ""), - ); - if (displayKey || displayKey === "") { - pendingFolders.delete(displayKey); - } + // İlk tıklama - onay moduna geç + deleteConfirmPending = true; } - await loadFiles(); - await Promise.all([refreshMovieCount(), refreshTvShowCount(), fetchTrashItems()]); - selectedItems = new Set( - [...selectedItems].filter((name) => name !== item.name), - ); - closeMenu(); + // Menü kapandığında onay durumunu resetle + function closeMenu() { + activeMenu = null; + deleteConfirmPending = false; + showMatchModal = false; + matchingFile = null; } // Klasör oluşturma fonksiyonları @@ -2419,11 +2425,11 @@ {/if} @@ -3979,7 +3985,17 @@ .menu-item.delete { color: #e53935; } - + + .menu-item.delete.confirming { + color: #fff; + background-color: #e53935; + font-weight: 600; + } + + .menu-item.delete.confirming:hover { + background-color: #c62828; + } + .menu-item.delete:hover { background-color: #ffebee; }