diff --git a/src/features/library/components/LibraryGrid.svelte b/src/features/library/components/LibraryGrid.svelte index c39135b..09ee8f3 100644 --- a/src/features/library/components/LibraryGrid.svelte +++ b/src/features/library/components/LibraryGrid.svelte @@ -17,7 +17,6 @@ cropCovers: boolean; libraryFilter: string; bulkWorking: boolean; - bulkMoveOpen: boolean; visibleCategories: Category[]; onCardClick: (e: MouseEvent, m: Manga) => void; onCardContextMenu: (e: MouseEvent, m: Manga) => void; @@ -30,16 +29,28 @@ onSelectAll: () => void; onBulkMove: (cat: Category) => void; onBulkRemove: () => void; - onCategoryMove: (cat: Category) => void; } let { visibleManga, filtered, loading, cols, anims, selectMode, selectedIds, hasMore, remainingCount, renderLimit, cropCovers, libraryFilter, - bulkWorking, bulkMoveOpen, visibleCategories, + bulkWorking, visibleCategories, onCardClick, onCardContextMenu, onCardPointerDown, onCardPointerUp, onCardPointerLeave, - onLoadMore, onRetry, onExitSelectMode, onSelectAll, onBulkMove, onBulkRemove, onCategoryMove, + onLoadMore, onRetry, onExitSelectMode, onSelectAll, onBulkMove, onBulkRemove, }: 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; }); {#if selectMode} @@ -57,7 +68,7 @@ @@ -217,4 +228,4 @@ .load-more-count { color: var(--text-faint); font-size: var(--text-2xs); } .center { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 60%; color: var(--text-muted); font-size: var(--text-sm); gap: var(--sp-2); text-align: center; line-height: var(--leading-base); } @keyframes fadeIn { from { opacity: 0 } to { opacity: 1 } } - + \ No newline at end of file diff --git a/src/features/series/components/SeriesDetail.svelte b/src/features/series/components/SeriesDetail.svelte index 01fd474..555376e 100644 --- a/src/features/series/components/SeriesDetail.svelte +++ b/src/features/series/components/SeriesDetail.svelte @@ -160,7 +160,14 @@ function applyChapters(nodes: Chapter[]) { 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)); } _prevChapterIds = new Set(nodes.map(c => c.id)); diff --git a/src/store/state.svelte.ts b/src/store/state.svelte.ts index d847f08..d9ffde2 100644 --- a/src/store/state.svelte.ts +++ b/src/store/state.svelte.ts @@ -85,12 +85,14 @@ export interface MangaPrefs { deleteDelayHours: number; maxKeepChapters: number; pauseUpdates: boolean; refreshInterval: "global" | "daily" | "weekly" | "manual"; preferredScanlator: string; scanlatorFilter: string[]; + autoDownloadScanlators: string[]; } export const DEFAULT_MANGA_PREFS: MangaPrefs = { autoDownload: false, downloadAhead: 0, deleteOnRead: false, deleteDelayHours: 0, maxKeepChapters: 0, pauseUpdates: false, refreshInterval: "global", preferredScanlator: "", scanlatorFilter: [], + autoDownloadScanlators: [], }; export interface Settings {