Browse Source

allow deleting media collections

pull/26/head
Jason Dove 6 years ago
parent
commit
3ff8983e2c
  1. 10
      ErsatzTV.Application/MediaCards/Mapper.cs
  2. 5
      ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs
  3. 9
      ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs
  4. 5
      ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs
  5. 2
      ErsatzTV/Pages/MediaCollectionEditor.razor
  6. 2
      ErsatzTV/Pages/MediaCollectionItems.razor
  7. 27
      ErsatzTV/Pages/MediaCollections.razor

10
ErsatzTV.Application/MediaCards/Mapper.cs

@ -1,4 +1,5 @@
using System.Linq; using System;
using System.Linq;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
namespace ErsatzTV.Application.MediaCards namespace ErsatzTV.Application.MediaCards
@ -28,6 +29,7 @@ namespace ErsatzTV.Application.MediaCards
TelevisionEpisodeMediaItem televisionEpisode) => TelevisionEpisodeMediaItem televisionEpisode) =>
new( new(
televisionEpisode.Id, televisionEpisode.Id,
televisionEpisode.Metadata.Aired ?? DateTime.MinValue,
televisionEpisode.Season.TelevisionShow.Metadata.Title, televisionEpisode.Season.TelevisionShow.Metadata.Title,
televisionEpisode.Metadata.Title, televisionEpisode.Metadata.Title,
$"Episode {televisionEpisode.Metadata.Episode}", $"Episode {televisionEpisode.Metadata.Episode}",
@ -38,9 +40,9 @@ namespace ErsatzTV.Application.MediaCards
internal static MovieCardViewModel ProjectToViewModel(MovieMediaItem movie) => internal static MovieCardViewModel ProjectToViewModel(MovieMediaItem movie) =>
new( new(
movie.Id, movie.Id,
movie.Metadata.Title, movie.Metadata?.Title,
movie.Metadata.Year.ToString(), movie.Metadata?.Year?.ToString(),
movie.Metadata.SortTitle, movie.Metadata?.SortTitle,
movie.Poster); movie.Poster);
internal static SimpleMediaCollectionCardResultsViewModel internal static SimpleMediaCollectionCardResultsViewModel

5
ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs

@ -1,8 +1,11 @@
namespace ErsatzTV.Application.MediaCards using System;
namespace ErsatzTV.Application.MediaCards
{ {
public record TelevisionEpisodeCardViewModel public record TelevisionEpisodeCardViewModel
( (
int EpisodeId, int EpisodeId,
DateTime Aired,
string ShowTitle, string ShowTitle,
string Title, string Title,
string Subtitle, string Subtitle,

9
ErsatzTV.Application/MediaCollections/Commands/CreateSimpleMediaCollectionHandler.cs

@ -29,7 +29,14 @@ namespace ErsatzTV.Application.MediaCollections.Commands
_mediaCollectionRepository.Add(c).Map(ProjectToViewModel); _mediaCollectionRepository.Add(c).Map(ProjectToViewModel);
private Task<Validation<BaseError, SimpleMediaCollection>> Validate(CreateSimpleMediaCollection request) => private Task<Validation<BaseError, SimpleMediaCollection>> Validate(CreateSimpleMediaCollection request) =>
ValidateName(request).MapT(name => new SimpleMediaCollection { Name = name }); ValidateName(request).MapT(name => new SimpleMediaCollection
{
Name = name,
Movies = new List<MovieMediaItem>(),
TelevisionShows = new List<TelevisionShow>(),
TelevisionEpisodes = new List<TelevisionEpisodeMediaItem>(),
TelevisionSeasons = new List<TelevisionSeason>()
});
private async Task<Validation<BaseError, string>> ValidateName(CreateSimpleMediaCollection createCollection) private async Task<Validation<BaseError, string>> ValidateName(CreateSimpleMediaCollection createCollection)
{ {

5
ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs

@ -38,6 +38,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.Include(c => c.Playouts) .Include(c => c.Playouts)
.ThenInclude(p => p.Items) .ThenInclude(p => p.Items)
.ThenInclude(i => i.MediaItem) .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(); .ToListAsync();
public async Task Update(Channel channel) public async Task Update(Channel channel)

2
ErsatzTV/Pages/MediaCollectionEditor.razor

@ -75,7 +75,7 @@
Snackbar.Add(error.Value, Severity.Error); Snackbar.Add(error.Value, Severity.Error);
Logger.LogError("Error saving simple media collection: {Error}", error.Value); 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"));
} }
} }

2
ErsatzTV/Pages/MediaCollectionItems.razor

@ -64,7 +64,7 @@
<MudText GutterBottom="true" Typo="Typo.h4">Television Episodes</MudText> <MudText GutterBottom="true" Typo="Typo.h4">Television Episodes</MudText>
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
@foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards) @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"/media/tv/episodes/{card.EpisodeId}")" Link="@($"/media/tv/episodes/{card.EpisodeId}")"

27
ErsatzTV/Pages/MediaCollections.razor

@ -2,31 +2,18 @@
@using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections
@using ErsatzTV.Application.MediaCollections.Commands @using ErsatzTV.Application.MediaCollections.Commands
@using ErsatzTV.Application.MediaCollections.Queries @using ErsatzTV.Application.MediaCollections.Queries
@using ErsatzTV.Application.MediaCards
@inject IDialogService Dialog @inject IDialogService Dialog
@inject IMediator Mediator @inject IMediator Mediator
@* @if (context.IsSimple) *@
@* { *@
@* <MudMenu Icon="@Icons.Material.Filled.MoreVert"> *@
@* <MudMenuItem Icon="@Icons.Material.Filled.Edit" Link="@($"/media/collections/{context.Id}")"> *@
@* Edit Properties *@
@* </MudMenuItem> *@
@* <MudMenuItem Icon="@Icons.Material.Filled.Edit" Link="@($"/media/collections/{context.Id}/items")"> *@
@* Edit Media Items *@
@* </MudMenuItem> *@
@* <MudMenuItem Icon="@Icons.Material.Filled.Delete" OnClick="@(_ => DeleteMediaCollectionAsync(context))"> *@
@* Delete *@
@* </MudMenuItem> *@
@* </MudMenu> *@
@* } *@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
@foreach (MediaCollectionViewModel card in _data) @foreach (MediaCollectionViewModel card in _data)
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"/media/collections/{card.Id}")" Link="@($"/media/collections/{card.Id}")"
ContainerClass="media-card-episode-container mr-4" ContainerClass="media-card-episode-container mr-4"
CardClass="media-card-episode"/> CardClass="media-card-episode"
DeleteClicked="@DeleteMediaCollection"/>
} }
</MudContainer> </MudContainer>
@ -44,18 +31,18 @@
private async Task RefreshData() => private async Task RefreshData() =>
_data = await Mediator.Send(new GetAllMediaCollections()); _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 }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = Dialog.Show<DeleteDialog>("Delete Media Collection", parameters, options); IDialogReference dialog = Dialog.Show<DeleteDialog>("Delete Media Collection", parameters, options);
DialogResult result = await dialog.Result; DialogResult result = await dialog.Result;
if (!result.Cancelled) if (!result.Cancelled)
{ {
await Mediator.Send(new DeleteSimpleMediaCollection(mediaCollection.Id)); await Mediator.Send(new DeleteSimpleMediaCollection(collection.Id));
await RefreshData(); await RefreshData();
} }
} }

Loading…
Cancel
Save