diff --git a/CHANGELOG.md b/CHANGELOG.md index d97430e..7ef5128 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to Multi-Debrid Downloader are documented in this file. +## [2.0.22] - 2026-08-11 + +### History management + +- Added a permanently visible destructive toolbar action for clearing the complete download history without selecting individual entries. +- Kept full-history deletion behind the existing confirmation dialog and disabled the action while history is empty or loading. +- Added complete English localization for the new history action. + +### Reliability and testing + +- Added regression coverage for full-history action visibility, danger styling, loading state, empty state, and dispatch behavior. +- Verified the updated History toolbar at 1920 and 1120 pixel window widths without horizontal overflow. + ## [2.0.21] - 2026-08-11 ### Responsive interface diff --git a/package-lock.json b/package-lock.json index 675ab4f..c47ce4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "real-debrid-downloader", - "version": "2.0.21", + "version": "2.0.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "real-debrid-downloader", - "version": "2.0.21", + "version": "2.0.22", "license": "MIT", "dependencies": { "adm-zip": "0.6.0", diff --git a/package.json b/package.json index b2d130f..6eec620 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "real-debrid-downloader", - "version": "2.0.21", + "version": "2.0.22", "description": "Desktop downloader", "main": "build/main/main/main.js", "author": "Sucukdeluxe", diff --git a/src/renderer/i18n.ts b/src/renderer/i18n.ts index 2db91ab..6c4859e 100644 --- a/src/renderer/i18n.ts +++ b/src/renderer/i18n.ts @@ -52,7 +52,7 @@ const pairs = [ ["Rotations-Verlauf", "Rotation history"], ["Sammlung", "Collection"], ["URL oder Rohzeile", "URL or raw line"], ["Zeile", "Line"], ["Paket / Datei", "Package / file"], ["Größe", "Size"], ["Gestartet", "Started"], ["Beendet", "Finished"], ["Alle Einträge", "All entries"], ["Heute", "Today"], ["Letzte 7 Tage", "Last 7 days"], ["Älter", "Older"], ["Gelöscht", "Deleted"], ["Fehlgeschlagen", "Failed"], ["Dauer", "Duration"], ["Durchschnitt", "Average"], ["Zielordner", "Destination folder"], ["Verlaufsfilter", "History filters"], ["Verlauf leeren", "Clear history"], ["Verlaufsaktionen", "History actions"], - ["Einträge", "Entries"], ["Erneut hinzufügen", "Add again"], ["Im Ordner zeigen", "Show in folder"], ["Auswahl löschen", "Clear selection"], ["Verlauf durchsuchen", "Search history"], ["Name, Pfad, Hoster oder Provider", "Name, path, hoster or provider"], + ["Einträge", "Entries"], ["Erneut hinzufügen", "Add again"], ["Im Ordner zeigen", "Show in folder"], ["Auswahl löschen", "Clear selection"], ["Gesamtverlauf löschen", "Delete all history"], ["Verlauf durchsuchen", "Search history"], ["Name, Pfad, Hoster oder Provider", "Name, path, hoster or provider"], ["Verlaufstabelle", "History table"], ["Verlaufsseiten", "History pages"], ["Vorherige Verlaufsseite", "Previous history page"], ["Nächste Verlaufsseite", "Next history page"], ["Zurück", "Back"], ["Vor", "Next"], ["Verlauf wird geladen", "Loading history"], ["Die gespeicherten Einträge werden geladen.", "Saved entries are being loaded."], ["Verlauf wird geladen. Die gespeicherten Einträge werden geladen.", "History is loading. Saved entries are being loaded."], ["Noch kein Verlauf", "No history yet"], ["Keine passenden Einträge", "No matching entries"], ["Abgeschlossene und gelöschte Pakete erscheinen hier.", "Completed and deleted packages appear here."], ["Passe Filter oder Suche an.", "Adjust the filter or search."], ["Öffne die Ansicht erneut, um es noch einmal zu versuchen.", "Open the view again to retry."], ["Alle sichtbaren Einträge auswählen", "Select all visible entries"], ["Details anzeigen", "Show details"], ["Details ausblenden", "Hide details"], diff --git a/src/renderer/views/history/HistoryView.tsx b/src/renderer/views/history/HistoryView.tsx index 2be4f4b..1e2796b 100644 --- a/src/renderer/views/history/HistoryView.tsx +++ b/src/renderer/views/history/HistoryView.tsx @@ -97,6 +97,7 @@ export function HistoryToolbar({ model, actions }: HistoryViewProps): ReactEleme + { ]); }); - it("renders expanded paths and URLs as copyable details without changing the 48px main-row contract", () => { + it("keeps the full-history delete action visible without a selection and disables it only for unavailable history", () => { + const calls: string[] = []; + const populated = buildHistoryViewModel(entries, "all", "", [], [], false, "", now); + const empty = buildHistoryViewModel([], "all", "", [], [], false, "", now); + const loading = buildHistoryViewModel(entries, "all", "", [], [], true, "", now); + const actions = createActions({ onClearHistory: () => calls.push("clear-history") }); + + const populatedButton = findButton(HistoryToolbar({ actions, model: populated }), "Gesamtverlauf löschen"); + const emptyButton = findButton(HistoryToolbar({ actions, model: empty }), "Gesamtverlauf löschen"); + const loadingButton = findButton(HistoryToolbar({ actions, model: loading }), "Gesamtverlauf löschen"); + + expect(populatedButton.props.className).toContain("history-action-danger"); + expect(populatedButton.props.disabled).toBe(false); + expect(emptyButton.props.disabled).toBe(true); + expect(loadingButton.props.disabled).toBe(true); + populatedButton.props.onClick(); + expect(calls).toEqual(["clear-history"]); + }); + + it("renders expanded paths and URLs as copyable details without changing the 48px main-row contract", () => { const html = renderToStaticMarkup( { ["Gelöscht", "Deleted"], ["Fehlgeschlagen", "Failed"], ["Verlauf leeren", "Clear history"], + ["Gesamtverlauf löschen", "Delete all history"], ["Erneut hinzufügen", "Add again"], ["Im Ordner zeigen", "Show in folder"], ["Auswahl löschen", "Clear selection"],