-
+
+ {#if $$slots.icon}
+
+
+
+ {/if}
+
+
- {/if}
-
-
+ {#if $$slots['icon-after']}
+
+
+
+ {/if}
- {#if $$slots['icon-after']}
-
-
-
- {/if}
diff --git a/src/lib/components/NavigationDebugger.svelte b/src/lib/components/DebugElements.svelte
similarity index 61%
rename from src/lib/components/NavigationDebugger.svelte
rename to src/lib/components/DebugElements.svelte
index 1ab0738..e82c262 100644
--- a/src/lib/components/NavigationDebugger.svelte
+++ b/src/lib/components/DebugElements.svelte
@@ -49,7 +49,39 @@
{#if showOverlay}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{/if}
diff --git a/src/lib/components/Dialog/ConfirmDialog.svelte b/src/lib/components/Dialog/ConfirmDialog.svelte
new file mode 100644
index 0000000..369ec52
--- /dev/null
+++ b/src/lib/components/Dialog/ConfirmDialog.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/Dialog/Dialog.ts b/src/lib/components/Dialog/Dialog.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/components/MediaManager/FileList.svelte b/src/lib/components/MediaManager/FileList.svelte
index cf1d3d7..526b546 100644
--- a/src/lib/components/MediaManager/FileList.svelte
+++ b/src/lib/components/MediaManager/FileList.svelte
@@ -1,49 +1,88 @@
-
- {#await files}
- {#each new Array(5) as _, index}
-
-
-
+{#await files}
+ {#each new Array(5) as _, index}
+
+
+
+ {/each}
+{:then files}
+
+
+ Title
+ Runtime
+ Size
+ Quality
+
+
+ {#each files as file}
+
{/each}
- {:then files}
- {#each files as file, index}
-
-
-
- {:else}
-
No local files found
- {/each}
- {/await}
-
+
+ {#if files?.length}
+
+
+
+ {:else}
+
+
No local files found
+
Your local files will appear here.
+
+ {/if}
+{/await}
diff --git a/src/lib/components/MediaManager/ReleaseList.svelte b/src/lib/components/MediaManager/ReleaseList.svelte
index 0e1f9c4..5c4b2be 100644
--- a/src/lib/components/MediaManager/ReleaseList.svelte
+++ b/src/lib/components/MediaManager/ReleaseList.svelte
@@ -1,26 +1,26 @@
-
- {#if $isLoading}
- {#each new Array(5) as _, index}
-
-
-
- {/each}
- {:else}
-
-
-
-
-
- Title
-
-
-
-
-
-
- Size
-
-
-
-
-
-
- Peers
-
-
-
-
-
-
- Quality
-
-
-
- |
-
-
-
- {#each $filteredReleases?.filter((r) => r.guid && r.indexerId) || [] as release, index}
-
+{#await releases}
+ {#each new Array(5) as _, index}
+
+
+
+ {/each}
+{:then releases}
+
+
+ Age
+ Size
+ Peers
+ Quality
+
+
+
+ {#each getRecommendedReleases(releases).sort(getSortFn(sortBy, sortDirection)) as release, index}
+
{/each}
-
All Releases
-
- {#each $releases?.filter((r) => r.guid && r.indexerId) || [] as release, index}
-
- {/each}
-
- {/if}
-
-
-
-
-
-
-
-
-
-
+
+
All Releases
+
+ {#each releases
+ .filter((r) => r.guid && r.indexerId)
+ .sort(getSortFn(sortBy, sortDirection)) as release, index}
+
+ {/each}
+
+{/await}
diff --git a/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte b/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte
index d9c2bb0..7a29522 100644
--- a/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte
+++ b/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte
@@ -26,7 +26,7 @@
const handleGrabRelease = (guid: string, indexerId: number) =>
sonarrApi
- .downloadSonarrEpisode(guid, indexerId)
+ .downloadSonarrRelease(guid, indexerId)
.then((ok) => {
if (!ok) {
// TODO: Show error
diff --git a/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte b/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte
new file mode 100644
index 0000000..40cb919
--- /dev/null
+++ b/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte
@@ -0,0 +1,11 @@
+
+
+
+ Delete file?
+ Are you sure you want to permanently delete this file?
+
diff --git a/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte b/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte
new file mode 100644
index 0000000..dd367c7
--- /dev/null
+++ b/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+ {file.sceneName}
+
+
+ {file.mediaInfo?.runTime}
+ {formatSize(file.size || 0)}
+ {file.quality?.quality?.name}
+
+
+ modalStack.create(MMConfirmDeleteFileDialog, {
+ deleteFile: () => deleteFile(file.id || -1)
+ })}
+ >
+
+
+
+
diff --git a/src/lib/components/MediaManagerModal/MMMainLayout.svelte b/src/lib/components/MediaManagerModal/MMMainLayout.svelte
index 3039099..bd41d6c 100644
--- a/src/lib/components/MediaManagerModal/MMMainLayout.svelte
+++ b/src/lib/components/MediaManagerModal/MMMainLayout.svelte
@@ -6,7 +6,7 @@
-
+
-
+
(activeTab = 'releases')}
>
Releases
(activeTab = 'local-files')}
>
Local Files
-
+
(activeTab = 'releases')}
- class={classNames('transition-all row-start-1 col-start-1 px-6 -mx-6', {
- 'opacity-50 -translate-x-full': activeTab !== 'releases'
- })}
+ class={classNames(
+ 'row-start-1 col-start-1 pb-16 mx-16',
+ 'transition-all overflow-y-auto overflow-x-hidden scrollbar-hide',
+ {
+ 'opacity-30 -translate-x-full': activeTab !== 'releases'
+ }
+ )}
>
(activeTab = 'local-files')}
- class={classNames('transition-all row-start-1 col-start-1 px-6 -mx-6', {
- 'opacity-50 translate-x-full': activeTab !== 'local-files'
- })}
+ class={classNames(
+ 'row-start-1 col-start-1 pb-16 mx-16',
+ 'transition-all overflow-y-auto overflow-x-hidden scrollbar-hide',
+ {
+ 'opacity-30 translate-x-full': activeTab !== 'local-files'
+ }
+ )}
>
diff --git a/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte b/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte
index deef71f..1127b94 100644
--- a/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte
+++ b/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte
@@ -2,102 +2,60 @@
import { formatMinutesToTime, formatSize } from '../../utils.js';
import type { RadarrRelease } from '../../apis/radarr/radarr-api';
import type { SonarrRelease } from '../../apis/sonarr/sonarr-api';
- import Container from '../../../Container.svelte';
- import classNames from 'classnames';
import { scrollIntoView } from '../../selectable';
- import { Download } from 'radix-icons-svelte';
- import type { Readable } from 'svelte/store';
+ import { Check, Download } from 'radix-icons-svelte';
+ import TableRow from '../Table/TableRow.svelte';
+ import type { GrabRelease } from './MediaManagerModal';
+ import TableButton from '../Table/TableButton.svelte';
+ import TableCell from '../Table/TableCell.svelte';
export let release: RadarrRelease | SonarrRelease;
- let hasFocusWithin: Readable;
+ export let grabRelease: GrabRelease;
+ let fetching = false;
+ let didGrab = false;
+
+ function handleGrabRelease() {
+ fetching = true;
+ grabRelease(release).then((ok) => {
+ fetching = false;
+ didGrab = ok;
+ });
+ }
-
-
-
-
-
-
- {formatMinutesToTime(release.ageMinutes || 0)} ago
-
- {release.title} |
-
+
+
+
+
+ {formatMinutesToTime(release.ageMinutes || 0)} ago
+
+ {release.title}
+
+
+
{formatSize(release.size || 0)}
- |
-
+
+
{release.seeders} / {release.leechers}
- |
-
+
+
{release.quality?.quality?.name}
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
+
+
+
+
+
+
+
diff --git a/src/lib/components/MediaManagerModal/MediaManagerModal.ts b/src/lib/components/MediaManagerModal/MediaManagerModal.ts
new file mode 100644
index 0000000..38d8275
--- /dev/null
+++ b/src/lib/components/MediaManagerModal/MediaManagerModal.ts
@@ -0,0 +1,4 @@
+import type { Release } from '../../apis/combined-types';
+
+export type GrabRelease = (release: Release) => Promise;
+export type DeleteFile = (id: number) => Promise;
diff --git a/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte b/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte
index a455cd9..8925cbf 100644
--- a/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte
+++ b/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte
@@ -6,6 +6,8 @@
import ReleaseList from '../MediaManager/ReleaseList.svelte';
import DownloadList from '../MediaManager/DownloadList.svelte';
import FileList from '../MediaManager/FileList.svelte';
+ import type { DeleteFile, GrabRelease } from './MediaManagerModal';
+ import type { Release } from '../../apis/combined-types';
export let id: number; // Tmdb ID
export let season: number;
@@ -16,12 +18,15 @@
const downloads = sonarrItem.then((si) => sonarrApi.getDownloadsBySeriesId(si?.id || -1));
const files = sonarrItem.then((si) => sonarrApi.getFilesBySeriesId(si?.id || -1));
- const getReleases = () =>
- sonarrItem.then((si) => sonarrApi.getSeasonReleases(si?.id || -1, season));
- const selectRelease = () => {};
+ // Releases
+ const releases: Promise = sonarrItem.then((si) =>
+ sonarrApi.getSeasonReleases(si?.id || -1, season)
+ );
+ const grabRelease: GrabRelease = (release) =>
+ sonarrApi.downloadSonarrRelease(release.guid || '', release.indexerId || -1);
const cancelDownload = sonarrApi.cancelDownloadSonarrEpisode;
- const handleSelectFile = () => {};
+ const deleteFile: DeleteFile = sonarrApi.deleteSonarrEpisode;
@@ -32,9 +37,9 @@
{series?.title}
Season {season} Packs
-
+
+
-
{/if}
{/await}
diff --git a/src/lib/components/Table/Table.svelte b/src/lib/components/Table/Table.svelte
new file mode 100644
index 0000000..d8d7618
--- /dev/null
+++ b/src/lib/components/Table/Table.svelte
@@ -0,0 +1,14 @@
+
+
+
diff --git a/src/lib/components/Table/TableButton.svelte b/src/lib/components/Table/TableButton.svelte
new file mode 100644
index 0000000..8de9172
--- /dev/null
+++ b/src/lib/components/Table/TableButton.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/src/lib/components/Table/TableCell.svelte b/src/lib/components/Table/TableCell.svelte
new file mode 100644
index 0000000..9019271
--- /dev/null
+++ b/src/lib/components/Table/TableCell.svelte
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/src/lib/components/Table/TableHeaderCell.svelte b/src/lib/components/Table/TableHeaderCell.svelte
new file mode 100644
index 0000000..3a8cb8b
--- /dev/null
+++ b/src/lib/components/Table/TableHeaderCell.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/Table/TableHeaderRow.svelte b/src/lib/components/Table/TableHeaderRow.svelte
new file mode 100644
index 0000000..f5a0e8c
--- /dev/null
+++ b/src/lib/components/Table/TableHeaderRow.svelte
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/src/lib/components/Table/TableHeaderSortBy.svelte b/src/lib/components/Table/TableHeaderSortBy.svelte
new file mode 100644
index 0000000..1cbcb8c
--- /dev/null
+++ b/src/lib/components/Table/TableHeaderSortBy.svelte
@@ -0,0 +1,29 @@
+
+
+
+
+
+ {#if icon}
+
+ {/if}
+
+
diff --git a/src/lib/components/Table/TableRow.svelte b/src/lib/components/Table/TableRow.svelte
new file mode 100644
index 0000000..81a0d22
--- /dev/null
+++ b/src/lib/components/Table/TableRow.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/TextField.svelte b/src/lib/components/TextField.svelte
index 598384b..a61d9c9 100644
--- a/src/lib/components/TextField.svelte
+++ b/src/lib/components/TextField.svelte
@@ -33,7 +33,7 @@
Label