diff --git a/web/src/lib/components/download-movie-dialog.svelte b/web/src/lib/components/download-movie-dialog.svelte
index c15324a..7823148 100644
--- a/web/src/lib/components/download-movie-dialog.svelte
+++ b/web/src/lib/components/download-movie-dialog.svelte
@@ -15,13 +15,36 @@
let { movie } = $props();
let dialogueState = $state(false);
- let torrentsPromise: any = $state(null);
- let tabState: string = $state('basic');
- let isLoading: boolean = $state(false);
- let advancedMode: boolean = $derived(tabState === 'advanced');
+ let torrentsError: string | null = $state(null);
let queryOverride: string = $state('');
let filePathSuffix: string = $state('');
- let torrentsError: string | null = $state(null);
+
+ let torrentsPromise: any = $state(null);
+ let torrentsData: any[] | null = $state(null);
+ let tabState: string = $state('basic');
+ let isLoading: boolean = $state(false);
+ let sortBy = $state({ col: 'score', ascending: false });
+
+ let advancedMode: boolean = $derived(tabState === 'advanced');
+
+ function arrowClass(column: string | undefined): string {
+ return sortBy.col === column ? `sorted-${sortBy.ascending ? 'asc' : 'desc'}` : '';
+ }
+
+ function sortData(column?: string | undefined) {
+ if (column !== undefined) {
+ if (column === sortBy.col) {
+ sortBy.ascending = !sortBy.ascending;
+ } else {
+ sortBy = { col: column, ascending: true };
+ }
+ }
+
+ let modifier = sortBy.ascending ? 1 : -1;
+ torrentsData?.sort((a, b) =>
+ a[sortBy.col] < b[sortBy.col] ? -1 * modifier : a[sortBy.col] > b[sortBy.col] ? modifier : 0
+ );
+ }
async function downloadTorrent(result_id: string) {
torrentsError = null;
@@ -56,6 +79,7 @@
async function search() {
isLoading = true;
torrentsError = null;
+ torrentsData = null;
torrentsPromise = client
.GET('/api/v1/movies/{movie_id}/torrents', {
params: {
@@ -67,9 +91,13 @@
}
}
})
+ .then((data) => data?.data)
.finally(() => (isLoading = false));
toast.info('Searching for torrents...');
- toast.info('Found ' + (await torrentsPromise).data?.length + ' torrents.');
+
+ torrentsData = await torrentsPromise;
+ sortData();
+ toast.info('Found ' + torrentsData?.length + ' torrents.');
}
@@ -131,23 +159,22 @@
Loading torrents...
- {:then data}
+ {:then}
Found Torrents:
-
+
- Title
- Size
- Seeders
- Score
- Indexer
- Indexer Flags
+ {#each [['Title', 'title'], ['Size', 'size'], ['Seeders', 'seeders'], ['Score', 'score'], ['Indexer', 'indexer'], ['Indexer Flags', 'flags']] as [name, id]}
+ sortData(id)} class="{arrowClass(id)} sortable">
+ {name}
+
+ {/each}
Actions
- {#each data?.data as torrent (torrent.id)}
+ {#each torrentsData as torrent (torrent.id)}
{torrent.title}
{(torrent.size / 1024 / 1024 / 1024).toFixed(2)}GB
@@ -168,7 +195,7 @@
{:else}
- {#if data === null}
+ {#if torrentsData === null}
Start searching by clicking the search button!
@@ -190,3 +217,28 @@
+
+
diff --git a/web/src/lib/components/download-season-dialog.svelte b/web/src/lib/components/download-season-dialog.svelte
index 5415488..de26cd1 100644
--- a/web/src/lib/components/download-season-dialog.svelte
+++ b/web/src/lib/components/download-season-dialog.svelte
@@ -22,10 +22,32 @@
let filePathSuffix: string = $state('');
let torrentsPromise: any = $state();
+ let torrentsData: any[] | null = $state(null);
let tabState: string = $state('basic');
let isLoading: boolean = $state(false);
+ let sortBy = $state({ col: 'score', ascending: false });
+
let advancedMode: boolean = $derived(tabState === 'advanced');
+ function arrowClass(column: string | undefined): string {
+ return sortBy.col === column ? `sorted-${sortBy.ascending ? 'asc' : 'desc'}` : '';
+ }
+
+ function sortData(column?: string | undefined) {
+ if (column !== undefined) {
+ if (column === sortBy.col) {
+ sortBy.ascending = !sortBy.ascending;
+ } else {
+ sortBy = { col: column, ascending: true };
+ }
+ }
+
+ let modifier = sortBy.ascending ? 1 : -1;
+ torrentsData?.sort((a, b) =>
+ a[sortBy.col] < b[sortBy.col] ? -1 * modifier : a[sortBy.col] > b[sortBy.col] ? modifier : 0
+ );
+ }
+
async function downloadTorrent(result_id: string) {
torrentsError = null;
const { response } = await client.POST('/api/v1/tv/torrents', {
@@ -56,6 +78,7 @@
async function search() {
isLoading = true;
torrentsError = null;
+ torrentsData = null;
torrentsPromise = client
.GET('/api/v1/tv/torrents', {
params: {
@@ -66,9 +89,14 @@
}
}
})
+ .then((data) => data?.data)
.finally(() => (isLoading = false));
+
toast.info('Searching for torrents...');
- toast.info('Found ' + (await torrentsPromise).data?.length + ' torrents.');
+
+ torrentsData = await torrentsPromise;
+ sortData();
+ toast.info('Found ' + torrentsData?.length + ' torrents.');
}
@@ -146,26 +174,22 @@
Loading torrents...
- {:then data}
+ {:then}
Found Torrents:
-
+
- Title
- Size
- Usenet
- Seeders
- Age
- Score
- Indexer
- Indexer Flags
- Seasons
+ {#each [['Title', 'title'], ['Size', 'size'], ['Usenet', 'usenet'], ['Seeders', 'seeders'], ['Age', 'age'], ['Score', 'score'], ['Indexer', 'indexer'], ['Indexer Flags', 'flags'], ['Seasons', 'season']] as [name, id]}
+ sortData(id)} class="{arrowClass(id)} sortable">
+ {name}
+
+ {/each}
Actions
- {#each data?.data as torrent (torrent.id)}
+ {#each torrentsData as torrent (torrent.id)}
{torrent.title}
{(torrent.size / 1024 / 1024 / 1024).toFixed(2)}GB
@@ -201,7 +225,7 @@
{:else}
- {#if data === null}
+ {#if torrentsData === null}
Start searching by clicking the search button!
@@ -223,3 +247,28 @@
+
+