From 3ff8983e2caa7dc94cd2747d5e018b232e15c632 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 20 Feb 2021 11:34:43 -0600 Subject: [PATCH] allow deleting media collections --- ErsatzTV.Application/MediaCards/Mapper.cs | 10 ++++--- .../TelevisionEpisodeCardViewModel.cs | 5 +++- .../CreateSimpleMediaCollectionHandler.cs | 9 ++++++- .../Data/Repositories/ChannelRepository.cs | 5 ++++ ErsatzTV/Pages/MediaCollectionEditor.razor | 2 +- ErsatzTV/Pages/MediaCollectionItems.razor | 2 +- ErsatzTV/Pages/MediaCollections.razor | 27 +++++-------------- 7 files changed, 32 insertions(+), 28 deletions(-) diff --git a/ErsatzTV.Application/MediaCards/Mapper.cs b/ErsatzTV.Application/MediaCards/Mapper.cs index 0a683c872..486c45880 100644 --- a/ErsatzTV.Application/MediaCards/Mapper.cs +++ b/ErsatzTV.Application/MediaCards/Mapper.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using ErsatzTV.Core.Domain; namespace ErsatzTV.Application.MediaCards @@ -28,6 +29,7 @@ namespace ErsatzTV.Application.MediaCards TelevisionEpisodeMediaItem televisionEpisode) => new( televisionEpisode.Id, + televisionEpisode.Metadata.Aired ?? DateTime.MinValue, televisionEpisode.Season.TelevisionShow.Metadata.Title, televisionEpisode.Metadata.Title, $"Episode {televisionEpisode.Metadata.Episode}", @@ -38,9 +40,9 @@ namespace ErsatzTV.Application.MediaCards internal static MovieCardViewModel ProjectToViewModel(MovieMediaItem movie) => new( movie.Id, - movie.Metadata.Title, - movie.Metadata.Year.ToString(), - movie.Metadata.SortTitle, + movie.Metadata?.Title, + movie.Metadata?.Year?.ToString(), + movie.Metadata?.SortTitle, movie.Poster); internal static SimpleMediaCollectionCardResultsViewModel diff --git a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs index 6ad21ff0c..c14521e49 100644 --- a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs +++ b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs @@ -1,8 +1,11 @@ -namespace ErsatzTV.Application.MediaCards +using System; + +namespace ErsatzTV.Application.MediaCards { public record TelevisionEpisodeCardViewModel ( int EpisodeId, + DateTime Aired, string ShowTitle, string Title, string Subtitle, diff --git a/ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs b/ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs index 8940f7103..152e37861 100644 --- a/ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs +++ b/ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs @@ -29,7 +29,14 @@ namespace ErsatzTV.Application.MediaCollections.Commands _mediaCollectionRepository.Add(c).Map(ProjectToViewModel); private Task> Validate(CreateSimpleMediaCollection request) => - ValidateName(request).MapT(name => new SimpleMediaCollection { Name = name }); + ValidateName(request).MapT(name => new SimpleMediaCollection + { + Name = name, + Movies = new List(), + TelevisionShows = new List(), + TelevisionEpisodes = new List(), + TelevisionSeasons = new List() + }); private async Task> ValidateName(CreateSimpleMediaCollection createCollection) { diff --git a/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs index bceb67e6e..a7c6f5ddb 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs @@ -38,6 +38,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .Include(c => c.Playouts) .ThenInclude(p => p.Items) .ThenInclude(i => i.MediaItem) + .ThenInclude(i => (i as TelevisionEpisodeMediaItem).Metadata) + .Include(c => c.Playouts) + .ThenInclude(p => p.Items) + .ThenInclude(i => i.MediaItem) + .ThenInclude(i => (i as MovieMediaItem).Metadata) .ToListAsync(); public async Task Update(Channel channel) diff --git a/ErsatzTV/Pages/MediaCollectionEditor.razor b/ErsatzTV/Pages/MediaCollectionEditor.razor index db154d6cb..ca417b1bd 100644 --- a/ErsatzTV/Pages/MediaCollectionEditor.razor +++ b/ErsatzTV/Pages/MediaCollectionEditor.razor @@ -75,7 +75,7 @@ Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Error saving simple media collection: {Error}", error.Value); }, - () => NavigationManager.NavigateTo($"/media/collections/{Id}")); + () => NavigationManager.NavigateTo(_model.Id > 0 ? $"/media/collections/{_model.Id}" : "/media/collections")); } } diff --git a/ErsatzTV/Pages/MediaCollectionItems.razor b/ErsatzTV/Pages/MediaCollectionItems.razor index 006ab9b34..a5f5569ab 100644 --- a/ErsatzTV/Pages/MediaCollectionItems.razor +++ b/ErsatzTV/Pages/MediaCollectionItems.razor @@ -64,7 +64,7 @@ Television Episodes - @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards) + @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired)) { *@ -@* *@ -@* Edit Properties *@ -@* *@ -@* *@ -@* Edit Media Items *@ -@* *@ -@* *@ -@* Delete *@ -@* *@ -@* *@ -@* } *@ - @foreach (MediaCollectionViewModel card in _data) { + CardClass="media-card-episode" + DeleteClicked="@DeleteMediaCollection"/> } @@ -44,18 +31,18 @@ private async Task RefreshData() => _data = await Mediator.Send(new GetAllMediaCollections()); - private async Task DeleteMediaCollectionAsync(MediaCollectionSummaryViewModel mediaCollection) + private async Task DeleteMediaCollection(MediaCardViewModel vm) { - if (mediaCollection.IsSimple) + if (vm is MediaCollectionViewModel collection) { - var parameters = new DialogParameters { { "EntityType", "media collection" }, { "EntityName", mediaCollection.Name } }; + var parameters = new DialogParameters { { "EntityType", "media collection" }, { "EntityName", collection.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Delete Media Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled) { - await Mediator.Send(new DeleteSimpleMediaCollection(mediaCollection.Id)); + await Mediator.Send(new DeleteSimpleMediaCollection(collection.Id)); await RefreshData(); } }