Backup:
- Neues Setting backupIncludeDownloads (Default aus) — Backup sichert
standardmaessig NUR Einstellungen, nicht die Download-Liste/History.
- buildBackupPayload/planBackupImport (testbare backup-payload.ts): Export
omittet session+history wenn Flag aus (explizites kind-Marker); Import folgt
dem FILE-Inhalt, nicht dem lokalen Toggle.
- importBackup: settings-only -> frueher Return nach setSettings, KEIN stop/
Queue-Wipe/Relaunch. Return {restored,relaunch,message}; main.ts gated den
Auto-Relaunch auf relaunch. Renderer re-seeded settingsDraft bei !relaunch.
Bugfixes:
- Ctrl+A waehlte das ungefilterte Paket-Map -> Loeschen nach Suche traf
versteckte Pakete. Jetzt visibleOrderIds (sichtbare Zeilen, inkl. Items).
- selectedIds nie geprunt bei Delta-Removal -> aufgeblaehte Counts. Neue pure
pruneSelection (selection.ts) + Effect.
- link-status-dot conditional -> Dateiname sprang ~14px. Platzhalter-Slot.
- sortPackagesForDisplay sortierte aktive Pakete nach Live-Progress -> Reshuffle
pro Tick. Jetzt stabile Queue-Reihenfolge je Gruppe (Anti-Flicker).
+17 Tests (backup-payload 9, selection 5, package-order anti-flicker 3).
28 lines
977 B
TypeScript
28 lines
977 B
TypeScript
import type { SessionState } from "../shared/types";
|
|
|
|
/**
|
|
* Drop selected ids whose package OR item no longer exists in the session.
|
|
* The selection set mixes package and item ids; when entries vanish (delta
|
|
* removal, backup-driven session swap, completed-cleanup) a stale id would
|
|
* otherwise inflate the selection count and the "(N)" action labels and keep
|
|
* "multi" styling alive for ghosts.
|
|
*
|
|
* Returns the SAME set instance when nothing changed, so callers can use it
|
|
* directly as a React state updater without forcing a re-render.
|
|
*/
|
|
export function pruneSelection(
|
|
selected: ReadonlySet<string>,
|
|
session: Pick<SessionState, "packages" | "items">
|
|
): Set<string> {
|
|
if (selected.size === 0) {
|
|
return selected as Set<string>;
|
|
}
|
|
const next = new Set<string>();
|
|
for (const id of selected) {
|
|
if (session.packages[id] || session.items[id]) {
|
|
next.add(id);
|
|
}
|
|
}
|
|
return next.size === selected.size ? (selected as Set<string>) : next;
|
|
}
|