Browse Source

list episode details on tv season page

pull/56/head
Jason Dove 5 years ago
parent
commit
4ee338a781
  1. 9
      ErsatzTV.Application/MediaCards/Mapper.cs
  2. 13
      ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs
  3. 15
      ErsatzTV/Pages/CollectionItems.razor
  4. 82
      ErsatzTV/Pages/TelevisionEpisodeList.razor

9
ErsatzTV.Application/MediaCards/Mapper.cs

@ -33,11 +33,12 @@ namespace ErsatzTV.Application.MediaCards @@ -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(

13
ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs

@ -7,14 +7,15 @@ namespace ErsatzTV.Application.MediaCards @@ -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)
{
}

15
ErsatzTV/Pages/CollectionItems.razor

@ -74,7 +74,7 @@ @@ -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"/>
}
</MudContainer>
@ -139,17 +139,14 @@ @@ -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<int> { episode.EpisodeId }
};
MediaItemIds = new List<int> { episode.EpisodeId }
};
await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request);
}
await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request);
}
private async Task RemoveItemsWithConfirmation(

82
ErsatzTV/Pages/TelevisionEpisodeList.razor

@ -53,16 +53,33 @@ @@ -53,16 +53,33 @@
</div>
</div>
</MudContainer>
<MudContainer MaxWidth="MaxWidth.Large" Class="media-card-grid mt-8">
@foreach (TelevisionEpisodeCardViewModel card in _data.Cards)
<MudContainer MaxWidth="MaxWidth.Large" Class="mt-8">
@foreach (TelevisionEpisodeCardViewModel episode in _data.Cards)
{
<MediaCard Data="@card"
Placeholder="@card.Placeholder"
Link="@($"/media/tv/episodes/{card.EpisodeId}")"
AddToCollectionClicked="@AddEpisodeToCollection"
ContainerClass="media-card-episode-container mx-2"
CardClass="media-card-episode"
ArtworkKind="@ArtworkKind.Thumbnail"/>
<MudCard Class="mb-6">
<div style="display: flex; flex-direction: row;">
@if (!string.IsNullOrWhiteSpace(episode.Poster))
{
<MudPaper style="display: flex; flex-direction: column">
<MudCardMedia Image="@($"/artwork/thumbnails/{episode.Poster}")" Style="flex-grow: 1; height: 220px; width: 392px;"/>
</MudPaper>
}
<MudCardContent Class="ml-3">
<div style="display: flex; flex-direction: column; height: 100%">
<MudText Typo="Typo.h4">@episode.Episode. @episode.Title</MudText>
<MudText Style="flex-grow: 1">@episode.Plot</MudText>
<div class="mt-6">
<MudButton Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.Add"
OnClick="@(_ => AddEpisodeToCollection(episode))">
Add To Collection
</MudButton>
</div>
</div>
</MudCardContent>
</div>
</MudCard>
}
</MudContainer>
@ -89,12 +106,12 @@ @@ -89,12 +106,12 @@
_data = await Mediator.Send(new GetTelevisionEpisodeCards(SeasonId, _pageNumber, _pageSize));
// _breadcrumbs = new List<BreadcrumbItem>
// {
// new("TV Shows", "/media/tv/shows"),
// new($"{_season.Title} ({_season.Year})", ),
// new(_season.Name, null, true)
// };
// _breadcrumbs = new List<BreadcrumbItem>
// {
// new("TV Shows", "/media/tv/shows"),
// new($"{_season.Title} ({_season.Year})", ),
// new(_season.Name, null, true)
// };
}
private async Task AddToCollection()
@ -126,27 +143,24 @@ @@ -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<AddToCollectionDialog>("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<AddToCollectionDialog>("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<BaseError, Unit> 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<BaseError, Unit> 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));
}
}

Loading…
Cancel
Save