diff --git a/ErsatzTV.Application/MediaCards/Mapper.cs b/ErsatzTV.Application/MediaCards/Mapper.cs index b0fd36993..c801f9bf6 100644 --- a/ErsatzTV.Application/MediaCards/Mapper.cs +++ b/ErsatzTV.Application/MediaCards/Mapper.cs @@ -33,11 +33,12 @@ namespace ErsatzTV.Application.MediaCards episodeMetadata.EpisodeId, episodeMetadata.ReleaseDate ?? DateTime.MinValue, episodeMetadata.Episode.Season.Show.ShowMetadata.HeadOrNone().Map(m => m.Title).IfNone(string.Empty), + episodeMetadata.Episode.Season.ShowId, + episodeMetadata.Episode.SeasonId, + episodeMetadata.Episode.EpisodeNumber, episodeMetadata.Title, - $"Episode {episodeMetadata.Episode.EpisodeNumber}", - episodeMetadata.Episode.EpisodeNumber.ToString(), - GetThumbnail(episodeMetadata), - episodeMetadata.Episode.EpisodeNumber.ToString()); + episodeMetadata.Episode.EpisodeMetadata.HeadOrNone().Map(em => em.Plot).IfNone(string.Empty), + GetThumbnail(episodeMetadata)); internal static MovieCardViewModel ProjectToViewModel(MovieMetadata movieMetadata) => new( diff --git a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs index c14521e49..b0e43226d 100644 --- a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs +++ b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs @@ -7,14 +7,15 @@ namespace ErsatzTV.Application.MediaCards int EpisodeId, DateTime Aired, string ShowTitle, + int ShowId, + int SeasonId, + int Episode, string Title, - string Subtitle, - string SortTitle, - string Poster, - string Placeholder) : MediaCardViewModel( + string Plot, + string Poster) : MediaCardViewModel( Title, - Subtitle, - SortTitle, + $"Episode {Episode}", + $"Episode {Episode}", Poster) { } diff --git a/ErsatzTV/Pages/CollectionItems.razor b/ErsatzTV/Pages/CollectionItems.razor index e5927e4f0..4d1ac4313 100644 --- a/ErsatzTV/Pages/CollectionItems.razor +++ b/ErsatzTV/Pages/CollectionItems.razor @@ -74,7 +74,7 @@ Subtitle="@card.Title" ContainerClass="media-card-episode-container mx-2" CardClass="media-card-episode" - DeleteClicked="@RemoveEpisodeFromCollection" + DeleteClicked="@(_ => RemoveEpisodeFromCollection(card))" ArtworkKind="@ArtworkKind.Thumbnail"/> } @@ -139,17 +139,14 @@ } } - private async Task RemoveEpisodeFromCollection(MediaCardViewModel vm) + private async Task RemoveEpisodeFromCollection(TelevisionEpisodeCardViewModel episode) { - if (vm is TelevisionEpisodeCardViewModel episode) + var request = new RemoveItemsFromCollection(Id) { - var request = new RemoveItemsFromCollection(Id) - { - MediaItemIds = new List { episode.EpisodeId } - }; + MediaItemIds = new List { episode.EpisodeId } + }; - await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); - } + await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); } private async Task RemoveItemsWithConfirmation( diff --git a/ErsatzTV/Pages/TelevisionEpisodeList.razor b/ErsatzTV/Pages/TelevisionEpisodeList.razor index a93f6b0c9..95cae9e85 100644 --- a/ErsatzTV/Pages/TelevisionEpisodeList.razor +++ b/ErsatzTV/Pages/TelevisionEpisodeList.razor @@ -53,16 +53,33 @@ - - @foreach (TelevisionEpisodeCardViewModel card in _data.Cards) + + @foreach (TelevisionEpisodeCardViewModel episode in _data.Cards) { - + +
+ @if (!string.IsNullOrWhiteSpace(episode.Poster)) + { + + + + } + +
+ @episode.Episode. @episode.Title + @episode.Plot +
+ + Add To Collection + +
+
+
+
+
}
@@ -89,12 +106,12 @@ _data = await Mediator.Send(new GetTelevisionEpisodeCards(SeasonId, _pageNumber, _pageSize)); - // _breadcrumbs = new List - // { - // new("TV Shows", "/media/tv/shows"), - // new($"{_season.Title} ({_season.Year})", ), - // new(_season.Name, null, true) - // }; + // _breadcrumbs = new List + // { + // new("TV Shows", "/media/tv/shows"), + // new($"{_season.Title} ({_season.Year})", ), + // new(_season.Name, null, true) + // }; } private async Task AddToCollection() @@ -126,27 +143,24 @@ } } - private async Task AddEpisodeToCollection(MediaCardViewModel card) + private async Task AddEpisodeToCollection(TelevisionEpisodeCardViewModel episode) { - if (card is TelevisionEpisodeCardViewModel episode) + var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", episode.Title } }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; + + IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); + DialogResult result = await dialog.Result; + if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) { - var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", episode.Title } }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - - IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); - DialogResult result = await dialog.Result; - if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) - { - var request = new AddEpisodeToCollection(collection.Id, episode.EpisodeId); - Either addResult = await Mediator.Send(request); - addResult.Match( - Left: error => - { - Snackbar.Add($"Unexpected error adding episode to collection: {error.Value}"); - Logger.LogError("Unexpected error adding episode to collection: {Error}", error.Value); - }, - Right: _ => Snackbar.Add($"Added {episode.Title} to collection {collection.Name}", Severity.Success)); - } + var request = new AddEpisodeToCollection(collection.Id, episode.EpisodeId); + Either addResult = await Mediator.Send(request); + addResult.Match( + Left: error => + { + Snackbar.Add($"Unexpected error adding episode to collection: {error.Value}"); + Logger.LogError("Unexpected error adding episode to collection: {Error}", error.Value); + }, + Right: _ => Snackbar.Add($"Added {episode.Title} to collection {collection.Name}", Severity.Success)); } }