From 062662781a71f0261ed713e692c4991aa07d1500 Mon Sep 17 00:00:00 2001 From: Youwes09 Date: Fri, 15 May 2026 19:49:26 -0500 Subject: [PATCH] Feat: Bulk-Source Migration (#66) --- .../ExtensionLibrary.svelte} | 83 +++- .../extensions/components/Extensions.svelte | 4 +- .../panels/SourceMigrateModal.svelte | 448 ++++++++++++++++++ .../series/panels/MigrateModal.svelte | 235 ++++----- 4 files changed, 641 insertions(+), 129 deletions(-) rename src/features/extensions/{panels/ExtensionLibraryPanel.svelte => components/ExtensionLibrary.svelte} (65%) create mode 100644 src/features/extensions/panels/SourceMigrateModal.svelte diff --git a/src/features/extensions/panels/ExtensionLibraryPanel.svelte b/src/features/extensions/components/ExtensionLibrary.svelte similarity index 65% rename from src/features/extensions/panels/ExtensionLibraryPanel.svelte rename to src/features/extensions/components/ExtensionLibrary.svelte index f67da52..6e79655 100644 --- a/src/features/extensions/panels/ExtensionLibraryPanel.svelte +++ b/src/features/extensions/components/ExtensionLibrary.svelte @@ -1,11 +1,12 @@
- {#if iconUrl} @@ -71,7 +87,7 @@
{#if sources.length > 0} - {/if} @@ -92,9 +108,32 @@ {allManga.length === 0 ? "Nothing from this extension is in your library." : "No matches."}
{:else} + {#if groups.length > 1} +
+ {#each groups as group} +
+ {group.displayName} + {group.manga.length} + +
+ {/each} +
+ {:else if groups.length === 1} +
+ {groups[0].displayName} + +
+ {/if} +
{#each filtered as m (m.id)} - {@const isCompleted = !m.unreadCount && (m.downloadCount > 0)} + {@const isCompleted = !m.unreadCount && m.downloadCount > 0}
@@ -209,7 +211,7 @@ {#if i < stepIdx}{:else}{i + 1}{/if} - {st === "source" ? "Pick source" : st === "search" ? (selectedSource ? selectedSource.displayName : "Search") : "Confirm"} + {st === "source" ? "Pick source" : st === "search" ? (selectedSource?.displayName ?? "Search") : "Confirm"} {/each} @@ -241,11 +243,10 @@ {/if}
{#each visibleSources as src} -
@@ -274,7 +277,7 @@ bind:value={query} onkeydown={(e) => e.key === "Enter" && selectedSource && searchSource(selectedSource, query)} placeholder="Search title…" - use:focusOnMount /> + autofocus /> {/each} - {#if results.length === 0 && !error} + {#if results.length === 0 && !error && !searching}
{query ? "No results — try a different title." : "Enter a title to search."}
@@ -339,18 +340,18 @@
- +

{manga.title}

{manga.source?.displayName ?? "Unknown"}

Current
-
- +
+
- +

{selectedMatch.manga.title}

{selectedSource?.displayName ?? "Unknown"}

@@ -378,8 +379,8 @@
- Read progress to carry over - {selectedMatch.readCount} / {readCount} chapters + Read progress to carry + {selectedMatch.readCount} / {readCount}
@@ -413,54 +414,60 @@ \ No newline at end of file