fix(downloads): move column reset into the header menu

Keep the action column reserved for row actions and expose the global layout reset through the existing column-header context menu.
This commit is contained in:
Sucukdeluxe
2026-08-21 00:04:10 +02:00
parent 09caf8f364
commit 4f7b8d31ef
2 changed files with 33 additions and 21 deletions
+21 -14
View File
@@ -4804,21 +4804,23 @@ export function App(): ReactElement {
}
}), [actionBusy, columnOrder, downloadDisclosureRevision, downloadPackageSpeeds, downloadQueueTotalBytes, downloadRemaining, downloadsSortColumn, downloadsSortDescending, downloadsViewCore, editingName, editingPackageId, gridTemplate, liveDownloadSpeedBps, providerStats.length, scheduleCountdown, schedulePickerOpen, scheduleTimeInput, snapshot.canPause, snapshot.canStart, snapshot.canStop, snapshot.clipboardActive, snapshot.etaText, snapshot.reconnectSeconds, snapshot.session.items, snapshot.session.paused, snapshot.session.reconnectReason, snapshot.session.running, snapshot.settings.animatePackageDisclosure, snapshot.settings.scheduledStartEpochMs, snapshot.stats.totalDownloaded, snapshot.stats.totalPackages]);
const resetColumnLayout = useCallback((): void => {
if (columnDragSettleTimerRef.current !== null) {
window.clearTimeout(columnDragSettleTimerRef.current);
columnDragSettleTimerRef.current = null;
}
cancelColumnDragAnimations();
if (columnDragSessionRef.current) {
clearDownloadColumnDrag(columnDragSessionRef.current);
columnDragSessionRef.current = null;
}
setColumnOrder(DEFAULT_COLUMN_ORDER);
persistColumnOrder(DEFAULT_COLUMN_ORDER);
showToast("Spaltenlayout zurückgesetzt", 1800);
}, [cancelColumnDragAnimations, persistColumnOrder, showToast]);
const downloadsActions: DownloadsViewActions = {
onResetColumnLayout: () => {
if (columnDragSettleTimerRef.current !== null) {
window.clearTimeout(columnDragSettleTimerRef.current);
columnDragSettleTimerRef.current = null;
}
cancelColumnDragAnimations();
if (columnDragSessionRef.current) {
clearDownloadColumnDrag(columnDragSessionRef.current);
columnDragSessionRef.current = null;
}
setColumnOrder(DEFAULT_COLUMN_ORDER);
persistColumnOrder(DEFAULT_COLUMN_ORDER);
showToast("Spaltenlayout zurückgesetzt", 1800);
},
onResetColumnLayout: resetColumnLayout,
onDisplayModeChange: setDownloadDisplayMode,
onFilterChange: setDownloadFilter,
onProviderFilterChange: setDownloadProviderFilter,
@@ -6484,6 +6486,11 @@ export function App(): ReactElement {
</button>
);
})}
<div className="ctx-menu-sep" />
<button className="ctx-menu-item" onClick={() => {
resetColumnLayout();
setColHeaderCtx(null);
}}>Spaltenlayout zurücksetzen</button>
</ContextMenu>
) : null}
historyContextMenu={historyCtxMenu ? (() => {
+9 -4
View File
@@ -85,12 +85,17 @@ describe("desktop shell", () => {
it("resets the download columns immediately and persists the default order", () => {
const source = readFileSync(new URL("../src/renderer/App.tsx", import.meta.url), "utf8");
const reset = source.slice(source.indexOf("const resetColumnLayout"), source.indexOf("const downloadsActions"));
const actions = source.slice(source.indexOf("const downloadsActions"), source.indexOf("const statisticsActions"));
const menu = source.slice(source.indexOf("columnContextMenu={"), source.indexOf("historyContextMenu={"));
expect(actions).toContain("onResetColumnLayout");
expect(actions).toContain("setColumnOrder(DEFAULT_COLUMN_ORDER)");
expect(actions).toContain("persistColumnOrder(DEFAULT_COLUMN_ORDER)");
expect(actions).toContain('showToast("Spaltenlayout zurückgesetzt"');
expect(reset).toContain("setColumnOrder(DEFAULT_COLUMN_ORDER)");
expect(reset).toContain("persistColumnOrder(DEFAULT_COLUMN_ORDER)");
expect(reset).toContain('showToast("Spaltenlayout zurückgesetzt"');
expect(actions).toContain("onResetColumnLayout: resetColumnLayout");
expect(menu).toContain("Spaltenlayout zurücksetzen");
expect(menu).toContain("resetColumnLayout()");
expect(menu).toContain("setColHeaderCtx(null)");
});
it("keeps application menus mounted for animated opening and closing", () => {