From cecf18a7b54efd41079ddb0a492ac5d7c086c982 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:28:51 +0000 Subject: [PATCH] improve mobile layout for some media source pages (#2132) --- ErsatzTV/Pages/LocalLibraries.razor | 102 ++++++----- ErsatzTV/Pages/PlexMediaSources.razor | 165 ++++++++++-------- .../RemoteMediaSourceLibrariesEditor.razor | 77 ++++---- ErsatzTV/Shared/RemoteMediaSources.razor | 146 ++++++++-------- 4 files changed, 268 insertions(+), 222 deletions(-) diff --git a/ErsatzTV/Pages/LocalLibraries.razor b/ErsatzTV/Pages/LocalLibraries.razor index 19db8e01..9e1fb55b 100644 --- a/ErsatzTV/Pages/LocalLibraries.razor +++ b/ErsatzTV/Pages/LocalLibraries.razor @@ -5,46 +5,53 @@ @inject IMediator Mediator @inject IEntityLocker Locker - - - - Local Libraries - - - - - - - - Name - Media Kind - - - - @context.Name - @context.MediaKind - -
- - - - - - - - -
-
-
-
- - Add Local Library - -
+ + + + Add Local Library + + +
+ + Local Libraries + + + + + + + + + + + Name + Media Kind + + + + @context.Name + @StringForMediaKind(context.MediaKind) + +
+ + + + + + + + +
+
+
+
+
+
+
@code { private readonly CancellationTokenSource _cts = new(); @@ -74,13 +81,25 @@ IDialogReference dialog = await Dialog.ShowAsync("Delete Library", parameters, options); DialogResult result = await dialog.Result; - if (!result.Canceled) + if (result is { Canceled: false }) { await Mediator.Send(new DeleteLocalLibrary(library.Id), _cts.Token); await LoadLibraries(_cts.Token); } } + private static string StringForMediaKind(LibraryMediaKind mediaKind) => + mediaKind switch + { + LibraryMediaKind.Movies => "Movies", + LibraryMediaKind.Shows => "Shows", + LibraryMediaKind.MusicVideos => "Music Videos", + LibraryMediaKind.OtherVideos => "Other Videos", + LibraryMediaKind.Songs => "Songs", + LibraryMediaKind.Images => "Images", + _ => "Unknown" + }; + void IDisposable.Dispose() { Locker.OnLibraryChanged -= LockChanged; @@ -89,4 +108,5 @@ _cts.Dispose(); } + } \ No newline at end of file diff --git a/ErsatzTV/Pages/PlexMediaSources.razor b/ErsatzTV/Pages/PlexMediaSources.razor index d2079852..15e03513 100644 --- a/ErsatzTV/Pages/PlexMediaSources.razor +++ b/ErsatzTV/Pages/PlexMediaSources.razor @@ -11,79 +11,85 @@ @inject IPlexSecretStore PlexSecretStore @inject ChannelWriter ScannerWorkerChannel - - - - Plex Media Sources - - - - - - - - Name - Address - - - - @context.Name - @context.Address - -
- - - - - - - - - - - - -
-
-
-
- @if (_mediaSources.Any()) - { - - Sign out of plex - - } - else - { - - Sign in to plex - - } - - @if (_mediaSources.Any() && !_isAuthorized) - { - - Fix Plex Credentials - - } + + + @if (_mediaSources.Any()) + { + + Sign out of plex + + } + else + { + + Sign in to plex + + } -
+ @if (_mediaSources.Any() && !_isAuthorized) + { + + Fix Plex Credentials + + } + +
+ + Plex Media Sources + + + + + + + + + + + Name + Address + + + + @context.Name + @context.Address + +
+ + + + + + + + + + + + +
+
+
+
+
+
+ @code { private List _mediaSources = new(); @@ -106,7 +112,7 @@ var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; IDialogReference dialog = await Dialog.ShowAsync("Sign out of Plex", options); DialogResult result = await dialog.Result; - if (!result.Canceled) + if (result is { Canceled: false }) { if (Locker.LockPlex()) { @@ -126,7 +132,7 @@ { try { - await JsRuntime.InvokeAsync("open", new object[] { url, "_blank" }); + await JsRuntime.InvokeAsync("open", [url, "_blank"]); } catch (Exception) { @@ -145,8 +151,15 @@ private async void PlexChanged(object sender, EventArgs e) { - await InvokeAsync(LoadMediaSources); - await InvokeAsync(StateHasChanged); + try + { + await InvokeAsync(LoadMediaSources); + await InvokeAsync(StateHasChanged); + } + catch (Exception) + { + // do nothing + } } private async Task RefreshLibraries(int mediaSourceId) => diff --git a/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor b/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor index 52be2558..79b64205 100644 --- a/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor +++ b/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor @@ -6,41 +6,48 @@ @inject ISnackbar Snackbar @inject IEntityLocker Locker - - - - @_source.Name Libraries - - - - - - - - - - Name - - - - - Media Kind - - - Synchronize - - - @context.Name - @context.MediaKind - - - - - - - Save Changes - - + + + + Save Changes + + +
+ + @_source.Name Libraries + + + + + + + + + + + + + Name + + + + + Media Kind + + + Synchronize + + + @context.Name + @context.MediaKind + + + + + + +
+
@code { private readonly CancellationTokenSource _cts = new(); diff --git a/ErsatzTV/Shared/RemoteMediaSources.razor b/ErsatzTV/Shared/RemoteMediaSources.razor index ed00682c..6130898a 100644 --- a/ErsatzTV/Shared/RemoteMediaSources.razor +++ b/ErsatzTV/Shared/RemoteMediaSources.razor @@ -7,76 +7,82 @@ @inject IDialogService Dialog @inject IEntityLocker Locker - - - - @Name Media Sources - - - - - - - - Name - Address - - - - @context.Name - @context.Address - -
- - - - - - - - - - - - -
-
-
-
- @if (_mediaSources.Any()) - { - - Disconnect @Name - - } - else - { - - Connect @Name - - } - - @if (_mediaSources.Any() && !_isAuthorized) - { - - Fix @Name Connection - - } + + + @if (_mediaSources.Any()) + { + + Disconnect @Name + + } + else + { + + Connect @Name + + } -
+ @if (_mediaSources.Any() && !_isAuthorized) + { + + Fix @Name Connection + + } + +
+ + @Name Media Sources + + + + + + + + + + + Name + Address + + + + @context.Name + @context.Address + +
+ + + + + + + + + + + + +
+
+
+
+
+
+ @code { private readonly CancellationTokenSource _cts = new(); @@ -121,7 +127,7 @@ var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; IDialogReference dialog = await Dialog.ShowAsync($"Disconnect {Name}", parameters, options); DialogResult result = await dialog.Result; - if (!result.Canceled) + if (result is { Canceled: false }) { if (Locker.LockRemoteMediaSource()) {