@page "/media/collections/{Id:int}" @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCards.Queries @using ErsatzTV.Application.MediaCollections.Commands @inherits MultiSelectBase @inject NavigationManager _navigationManager @inject ChannelWriter _channel @inject IJSRuntime _jsRuntime
@if (IsSelectMode()) { @SelectionLabel()
Remove From Collection Clear Selection
} else {
@_data.Name
@if (_data.MovieCards.Any()) { @_data.MovieCards.Count Movies } @if (_data.ShowCards.Any()) { @_data.ShowCards.Count Shows } @if (_data.SeasonCards.Any()) { @_data.SeasonCards.Count Seasons } @if (_data.EpisodeCards.Any()) { @_data.EpisodeCards.Count Episodes } @if (_data.ArtistCards.Any()) { @_data.ArtistCards.Count Artists } @if (_data.MusicVideoCards.Any()) { @_data.MusicVideoCards.Count Music Videos } @if (SupportsCustomOrdering()) {
} }
@if (_data.MovieCards.Any()) { Movies @foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards)) { } } @if (_data.ShowCards.Any()) { Television Shows @foreach (TelevisionShowCardViewModel card in _data.ShowCards.OrderBy(m => m.SortTitle)) { } } @if (_data.SeasonCards.Any()) { Television Seasons @foreach (TelevisionSeasonCardViewModel card in _data.SeasonCards.OrderBy(m => m.SortTitle)) { } } @if (_data.EpisodeCards.Any()) { Television Episodes @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired)) { } } @if (_data.ArtistCards.Any()) { Artists @foreach (ArtistCardViewModel card in _data.ArtistCards.OrderBy(e => e.SortTitle)) { } } @if (_data.MusicVideoCards.Any()) { Music Videos @foreach (MusicVideoCardViewModel card in _data.MusicVideoCards.OrderBy(e => e.SortTitle)) { } } @code { [Parameter] public int Id { get; set; } private CollectionCardResultsViewModel _data; private bool SupportsCustomOrdering() => _data.MovieCards.Any() && !_data.ShowCards.Any() && !_data.SeasonCards.Any() && !_data.EpisodeCards.Any(); protected override async Task OnParametersSetAsync() => await RefreshData(); protected override async Task RefreshData() { Either maybeResult = await Mediator.Send(new GetCollectionCards(Id)); maybeResult.Match( result => _data = result, error => _navigationManager.NavigateTo("404")); } private IOrderedEnumerable OrderMovies(List movies) { if (_data.UseCustomPlaybackOrder) { return movies.OrderBy(m => m.CustomIndex); } return movies.OrderBy(m => m.SortTitle); } protected override async Task OnAfterRenderAsync(bool firstRender) { await _jsRuntime.InvokeVoidAsync("sortableCollection", Id); if (_data.UseCustomPlaybackOrder) { await _jsRuntime.InvokeVoidAsync("enableSorting"); } else { await _jsRuntime.InvokeVoidAsync("disableSorting"); } await base.OnAfterRenderAsync(firstRender); } private void SelectClicked(MediaCardViewModel card, MouseEventArgs e) { List GetSortedItems() { return _data.MovieCards.OrderBy(m => m.SortTitle) .Append(_data.ShowCards.OrderBy(s => s.SortTitle)) .Append(_data.SeasonCards.OrderBy(s => s.SortTitle)) .Append(_data.EpisodeCards.OrderBy(ep => ep.Aired)) .Append(_data.ArtistCards.OrderBy(a => a.SortTitle)) .Append(_data.MusicVideoCards.OrderBy(mv => mv.SortTitle)) .ToList(); } SelectClicked(GetSortedItems, card, e); } private async Task RemoveMovieFromCollection(MediaCardViewModel vm) { if (vm is MovieCardViewModel movie) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { movie.MovieId } }; await RemoveItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request); } } private async Task RemoveArtistFromCollection(MediaCardViewModel vm) { if (vm is ArtistCardViewModel artist) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { artist.ArtistId } }; await RemoveItemsWithConfirmation( "artist", string.IsNullOrWhiteSpace(artist.Subtitle) ? artist.Title : $"{artist.Title} ({artist.Subtitle})", request); } } private async Task RemoveMusicVideoFromCollection(MediaCardViewModel vm) { if (vm is MusicVideoCardViewModel musicVideo) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { musicVideo.MusicVideoId } }; await RemoveItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request); } } private async Task RemoveShowFromCollection(MediaCardViewModel vm) { if (vm is TelevisionShowCardViewModel show) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { show.TelevisionShowId } }; await RemoveItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request); } } private async Task RemoveSeasonFromCollection(MediaCardViewModel vm) { if (vm is TelevisionSeasonCardViewModel season) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { season.TelevisionSeasonId } }; await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request); } } private async Task RemoveEpisodeFromCollection(TelevisionEpisodeCardViewModel episode) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = new List { episode.EpisodeId } }; await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); } private async Task RemoveItemsWithConfirmation( string entityType, string entityName, RemoveItemsFromCollection request) { var parameters = new DialogParameters { { "EntityType", entityType }, { "EntityName", entityName } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Remove From Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled) { await Mediator.Send(request); await RefreshData(); } } private async Task OnUseCustomOrderChanged() { _data.UseCustomPlaybackOrder = !_data.UseCustomPlaybackOrder; var request = new UpdateCollection(Id, _data.Name) { UseCustomPlaybackOrder = _data.UseCustomPlaybackOrder }; await Mediator.Send(request); } }