Fix: Derive Auto-Download List from Filter (#39)

This commit is contained in:
Youwes09
2026-04-23 11:27:54 -05:00
parent 63a829ddca
commit b12ff4cbaa
3 changed files with 28 additions and 8 deletions
@@ -17,7 +17,6 @@
cropCovers: boolean; cropCovers: boolean;
libraryFilter: string; libraryFilter: string;
bulkWorking: boolean; bulkWorking: boolean;
bulkMoveOpen: boolean;
visibleCategories: Category[]; visibleCategories: Category[];
onCardClick: (e: MouseEvent, m: Manga) => void; onCardClick: (e: MouseEvent, m: Manga) => void;
onCardContextMenu: (e: MouseEvent, m: Manga) => void; onCardContextMenu: (e: MouseEvent, m: Manga) => void;
@@ -30,16 +29,28 @@
onSelectAll: () => void; onSelectAll: () => void;
onBulkMove: (cat: Category) => void; onBulkMove: (cat: Category) => void;
onBulkRemove: () => void; onBulkRemove: () => void;
onCategoryMove: (cat: Category) => void;
} }
let { let {
visibleManga, filtered, loading, cols, anims, selectMode, selectedIds, visibleManga, filtered, loading, cols, anims, selectMode, selectedIds,
hasMore, remainingCount, renderLimit, cropCovers, libraryFilter, hasMore, remainingCount, renderLimit, cropCovers, libraryFilter,
bulkWorking, bulkMoveOpen, visibleCategories, bulkWorking, visibleCategories,
onCardClick, onCardContextMenu, onCardPointerDown, onCardPointerUp, onCardPointerLeave, onCardClick, onCardContextMenu, onCardPointerDown, onCardPointerUp, onCardPointerLeave,
onLoadMore, onRetry, onExitSelectMode, onSelectAll, onBulkMove, onBulkRemove, onCategoryMove, onLoadMore, onRetry, onExitSelectMode, onSelectAll, onBulkMove, onBulkRemove,
}: Props = $props(); }: Props = $props();
let bulkMoveOpen: boolean = $state(false);
$effect(() => {
if (!bulkMoveOpen) return;
function onOutside(e: MouseEvent) {
if (!(e.target as HTMLElement).closest(".bulk-move-wrap")) bulkMoveOpen = false;
}
setTimeout(() => document.addEventListener("mousedown", onOutside, true), 0);
return () => document.removeEventListener("mousedown", onOutside, true);
});
$effect(() => { if (!selectMode) bulkMoveOpen = false; });
</script> </script>
{#if selectMode} {#if selectMode}
@@ -57,7 +68,7 @@
<button <button
class="sel-btn sel-move" class="sel-btn sel-move"
disabled={selectedIds.size === 0 || bulkWorking} disabled={selectedIds.size === 0 || bulkWorking}
onclick={() => onBulkMove(visibleCategories[0])} onclick={() => bulkMoveOpen = !bulkMoveOpen}
> >
<Folder size={13} weight="bold" /> <Folder size={13} weight="bold" />
Move to folder Move to folder
@@ -65,7 +76,7 @@
{#if bulkMoveOpen} {#if bulkMoveOpen}
<div class="bulk-folder-list"> <div class="bulk-folder-list">
{#each visibleCategories as cat} {#each visibleCategories as cat}
<button class="bulk-folder-item" onclick={() => onCategoryMove(cat)}> <button class="bulk-folder-item" onclick={() => { onBulkMove(cat); bulkMoveOpen = false; }}>
<Folder size={11} weight="bold" /> <Folder size={11} weight="bold" />
{cat.name} {cat.name}
</button> </button>
@@ -160,7 +160,14 @@
function applyChapters(nodes: Chapter[]) { function applyChapters(nodes: Chapter[]) {
if (get("autoDownload") && _prevChapterIds.size > 0) { if (get("autoDownload") && _prevChapterIds.size > 0) {
const newChapters = nodes.filter(c => !_prevChapterIds.has(c.id) && !c.isDownloaded); const filtered = buildChapterList(nodes, {
sortMode, sortDir,
preferredScanlator: get("preferredScanlator") as string,
scanlatorFilter: scanlatorFilter as string[],
scanlatorBlacklist: scanlatorBlacklist as string[],
scanlatorForce: scanlatorForce as boolean,
});
const newChapters = filtered.filter(c => !_prevChapterIds.has(c.id) && !c.isDownloaded);
if (newChapters.length) enqueueMultiple(newChapters.map(c => c.id)); if (newChapters.length) enqueueMultiple(newChapters.map(c => c.id));
} }
_prevChapterIds = new Set(nodes.map(c => c.id)); _prevChapterIds = new Set(nodes.map(c => c.id));
+2
View File
@@ -85,12 +85,14 @@ export interface MangaPrefs {
deleteDelayHours: number; maxKeepChapters: number; pauseUpdates: boolean; deleteDelayHours: number; maxKeepChapters: number; pauseUpdates: boolean;
refreshInterval: "global" | "daily" | "weekly" | "manual"; refreshInterval: "global" | "daily" | "weekly" | "manual";
preferredScanlator: string; scanlatorFilter: string[]; preferredScanlator: string; scanlatorFilter: string[];
autoDownloadScanlators: string[];
} }
export const DEFAULT_MANGA_PREFS: MangaPrefs = { export const DEFAULT_MANGA_PREFS: MangaPrefs = {
autoDownload: false, downloadAhead: 0, deleteOnRead: false, autoDownload: false, downloadAhead: 0, deleteOnRead: false,
deleteDelayHours: 0, maxKeepChapters: 0, pauseUpdates: false, deleteDelayHours: 0, maxKeepChapters: 0, pauseUpdates: false,
refreshInterval: "global", preferredScanlator: "", scanlatorFilter: [], refreshInterval: "global", preferredScanlator: "", scanlatorFilter: [],
autoDownloadScanlators: [],
}; };
export interface Settings { export interface Settings {