From 3436fcdd2485effaf137f1ca5c207ad874226042 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Fri, 4 Sep 2026 21:59:18 +0200 Subject: [PATCH] Default offline cleanup dialog to entire packages first --- CHANGELOG.md | 2 +- PROJECT_MEMORY.md | 2 ++ src/renderer/App.tsx | 6 +++--- .../views/downloads/OfflineRemovalScopeChoice.tsx | 12 ++++++------ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c850db..6e76f5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to Multi-Debrid Downloader are documented in this file. ### Added -- Add “Remove packages with offline links …” to the download context menu. The confirmation defaults to removing only affected archive sets, with an option to remove entire parent packages. One offline part removes all parts of that archive while other episodes remain in archive-set mode. Both modes cover the entire queue regardless of filters or selection, keep downloaded files, and recheck the confirmed package IDs before removal. +- Add “Remove packages with offline links …” to the download context menu. The confirmation lists entire parent packages first and selects that option by default; affected archive sets are available as the second option. One offline part removes all parts of that archive while other episodes remain in archive-set mode. Both modes cover the entire queue regardless of filters or selection, keep downloaded files, and recheck the confirmed package IDs before removal. ### Fixed diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index c3de0cc..5d0318d 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -235,6 +235,8 @@ Diese Datei hält den verifizierten technischen Arbeitsstand fest. Sie enthält ### Unveröffentlichte Offline-Paketbereinigung vom 4. September 2026 +- Aktuelle Bedienvorgabe: „Ganze Pakete“ steht im Bestätigungsdialog oben und wird bei jedem Öffnen vorausgewählt. „Nur betroffene Archivsätze“ folgt darunter. Beide Modi bleiben wählbar; der gewählte Scope wird ausdrücklich an das Backend übergeben. Browserprüfung bestätigt Reihenfolge `package`, `archive` und ausschließlich `package` als vorausgewählt; TypeScript fehlerfrei. Änderung per Hot-Reload in der Dev-App geladen. + - Erweiterung nach Saschas Rückmeldung: Die Bestätigung enthält jetzt zwei Radiooptionen. Standard bei jedem Öffnen ist „Nur betroffene Archivsätze“; alternativ „Ganze Pakete“. Im Archivsatz-Modus entfernt ein Offline-Part alle zusammengehörigen Parts derselben Folge, einschließlich bereits abgeschlossener Queue-Einträge; andere Folgen bleiben im Oberpaket. Leere Oberpakete verschwinden automatisch. Dateien bleiben in beiden Modi erhalten. Der Scope wird separat vom automatischen Offline-Überspringen übergeben und verändert dessen Einstellung nicht. - Die vorhandene Offline-Archivzuordnung wurde in `src/shared/offline-archive-items.ts` gemeinsam nutzbar gemacht; der bisherige Main-Export bleibt kompatibel. Die Zuordnung unterstützt `partN.rar`, `.rar`/`.rNN`, `.zip.NNN`, `.7z.NNN` und generische `.NNN`-Teile. Einzeldateien ohne passende Geschwister werden einzeln entfernt. Main und visuelle Test-API verwenden denselben Matcher. - Erweiterung verifiziert: 175 fokussierte Tests und 30 bestehende Offline-/Archivzuordnungs-/Abbruch-/Entfernungsfälle erfolgreich, TypeScript sowie Main-/Renderer-Build erfolgreich. Fünf neue Manager-/Dateisystemfälle bestätigen die Archivformate, den Erhalt anderer Folgen und unveränderte Dateien. Browserprüfung unter `?motion=on&offline-cleanup=multipart` bestätigt vorausgewählten Archivsatz-Modus, Folge 3 entfernt/Folge 4 erhalten und alternativ vollständige Paketentfernung. Dialoglayout im Dark-Theme geprüft. Dev-App für den aktualisierten Main-/Preload-Pfad regulär neu gestartet; weiterhin unveröffentlicht. diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 9e5ea3e..d4f6777 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1921,7 +1921,7 @@ export function App(): ReactElement { const [startConflictPrompt, setStartConflictPrompt] = useState(null); const startConflictResolverRef = useRef<((result: { policy: Extract; applyToAll: boolean } | null) => void) | null>(null); const [confirmPrompt, setConfirmPrompt] = useState(null); - const offlineRemovalScopeRef = useRef("archive"); + const offlineRemovalScopeRef = useRef("package"); const [backupPassphraseMode, setBackupPassphraseMode] = useState(null); const [onlineBackupDialog, setOnlineBackupDialog] = useState(null); const [remoteDiag, setRemoteDiag] = useState(null); @@ -4864,9 +4864,9 @@ export function App(): ReactElement { const english = normalizeLanguage(settings.language) === "en"; const count = candidates.length.toLocaleString(english ? "en-US" : "de-DE"); const packageLabel = english ? (candidates.length === 1 ? "package" : "packages") : (candidates.length === 1 ? "Paket" : "Pakete"); - offlineRemovalScopeRef.current = "archive"; + offlineRemovalScopeRef.current = "package"; const confirmed = await askConfirmPrompt({ - offlineScope: "archive", + offlineScope: "package", title: english ? "Remove packages with offline links" : "Pakete mit Offline-Links entfernen", message: english ? `${count} ${packageLabel} with offline links in the entire queue. This applies regardless of filters or selection.` diff --git a/src/renderer/views/downloads/OfflineRemovalScopeChoice.tsx b/src/renderer/views/downloads/OfflineRemovalScopeChoice.tsx index beddb4d..799cb24 100644 --- a/src/renderer/views/downloads/OfflineRemovalScopeChoice.tsx +++ b/src/renderer/views/downloads/OfflineRemovalScopeChoice.tsx @@ -8,18 +8,18 @@ export function OfflineRemovalScopeChoice({ scope, english, onChange }: { return (
{english ? "What should be removed?" : "Was soll entfernt werden?"} - +

{english ? "Active downloads being removed will stop. Downloaded files are kept in both cases." : "Die zu entfernenden laufenden Downloads werden gestoppt. Heruntergeladene Dateien bleiben in beiden Fällen erhalten."}

);