@page "/media/collections/{Id:int}" @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCollections @inherits MultiSelectBase @inject NavigationManager NavigationManager @inject IJSRuntime JsRuntime
@if (IsSelectMode()) {
@SelectionLabel()
Remove From Collection Clear Selection
} else {
@_data?.Name
@if (_data?.MovieCards.Count > 0) { @_data.MovieCards.Count Movies } @if (_data?.ShowCards.Count > 0) { @_data.ShowCards.Count Shows } @if (_data?.SeasonCards.Count > 0) { @_data.SeasonCards.Count Seasons } @if (_data?.EpisodeCards.Count > 0) { @_data.EpisodeCards.Count Episodes } @if (_data?.ArtistCards.Count > 0) { @_data.ArtistCards.Count Artists } @if (_data?.MusicVideoCards.Count > 0) { @_data.MusicVideoCards.Count Music Videos } @if (_data?.OtherVideoCards.Count > 0) { @_data.OtherVideoCards.Count Other Videos } @if (_data?.SongCards.Count > 0) { @_data.SongCards.Count Songs } @if (_data?.ImageCards.Count > 0) { @_data.ImageCards.Count Images } @if (_data?.RemoteStreamCards.Count > 0) { @_data.RemoteStreamCards.Count Remote Streams }
@if (SupportsCustomOrdering()) {
}
}
@if (_data?.MovieCards.Count > 0) { Movies @foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards)) { } } @if (_data?.ShowCards.Count > 0) { Shows @foreach (TelevisionShowCardViewModel card in _data.ShowCards.OrderBy(m => m.SortTitle)) { } } @if (_data?.SeasonCards.Count > 0) { Seasons @foreach (TelevisionSeasonCardViewModel card in _data.SeasonCards.OrderBy(m => m.SortTitle)) { } } @if (_data?.EpisodeCards.Count > 0) { Episodes @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired)) { } } @if (_data?.ArtistCards.Count > 0) { Artists @foreach (ArtistCardViewModel card in _data.ArtistCards.OrderBy(e => e.SortTitle)) { } } @if (_data?.MusicVideoCards.Count > 0) { Music Videos @foreach (MusicVideoCardViewModel card in _data.MusicVideoCards.OrderBy(e => e.SortTitle)) { } } @if (_data?.OtherVideoCards.Count > 0) { Other Videos @foreach (OtherVideoCardViewModel card in _data.OtherVideoCards.OrderBy(e => e.SortTitle)) { } } @if (_data?.SongCards.Count > 0) { Songs @foreach (SongCardViewModel card in _data.SongCards.OrderBy(e => e.SortTitle)) { } } @if (_data?.ImageCards.Count > 0) { Images @foreach (ImageCardViewModel card in _data.ImageCards.OrderBy(e => e.SortTitle)) { } } @if (_data?.RemoteStreamCards.Count > 0) { Remote Streams @foreach (RemoteStreamCardViewModel card in _data.RemoteStreamCards.OrderBy(e => e.SortTitle)) { } }
@code { [Parameter] public int Id { get; set; } private CollectionCardResultsViewModel _data; private bool SupportsCustomOrdering() => _data is not null && _data.MovieCards.Any() && !_data.ShowCards.Any() && !_data.SeasonCards.Any() && !_data.EpisodeCards.Any(); protected override async Task OnParametersSetAsync() => await RefreshData(CancellationToken); protected override async Task RefreshData(CancellationToken cancellationToken) { Either maybeResult = await Mediator.Send(new GetCollectionCards(Id), cancellationToken); maybeResult.Match( result => _data = result, _ => 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) { try { await JsRuntime.InvokeVoidAsync("sortableCollection", Id); if (_data.UseCustomPlaybackOrder) { await JsRuntime.InvokeVoidAsync("enableSorting"); } else { await JsRuntime.InvokeVoidAsync("disableSorting"); } } catch (Exception) { // ignored } 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)) .Append(_data.OtherVideoCards.OrderBy(ov => ov.SortTitle)) .Append(_data.SongCards.OrderBy(s => s.SortTitle)) .ToList(); } SelectClicked(GetSortedItems, card, e); } private async Task RemoveMovieFromCollection(MediaCardViewModel vm) { if (vm is MovieCardViewModel movie) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [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 = [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 = [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 = [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 = [season.TelevisionSeasonId] }; await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request); } } private async Task RemoveEpisodeFromCollection(TelevisionEpisodeCardViewModel episode) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [episode.EpisodeId] }; await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); } private async Task RemoveOtherVideoFromCollection(MediaCardViewModel vm) { if (vm is OtherVideoCardViewModel otherVideo) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [otherVideo.OtherVideoId] }; await RemoveItemsWithConfirmation("other video", $"{otherVideo.Title}", request); } } private async Task RemoveSongFromCollection(MediaCardViewModel vm) { if (vm is SongCardViewModel song) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [song.SongId] }; await RemoveItemsWithConfirmation("song", $"{song.Title}", request); } } private async Task RemoveImageFromCollection(MediaCardViewModel vm) { if (vm is ImageCardViewModel image) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [image.ImageId] }; await RemoveItemsWithConfirmation("image", $"{image.Title}", request); } } private async Task RemoveRemoteStreamFromCollection(MediaCardViewModel vm) { if (vm is RemoteStreamCardViewModel remoteStream) { var request = new RemoveItemsFromCollection(Id) { MediaItemIds = [remoteStream.RemoteStreamId] }; await RemoveItemsWithConfirmation("remote stream", $"{remoteStream.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 = await Dialog.ShowAsync("Remove From Collection", parameters, options); DialogResult result = await dialog.Result; if (result is { Canceled: false }) { await Mediator.Send(request, CancellationToken); await RefreshData(CancellationToken); } } private async Task OnUseCustomOrderChanged() { _data.UseCustomPlaybackOrder = !_data.UseCustomPlaybackOrder; var request = new UpdateCollection(Id, _data.Name) { UseCustomPlaybackOrder = _data.UseCustomPlaybackOrder }; await Mediator.Send(request, CancellationToken); } }