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 @@
+ +