@page "/media/trash" @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.Search.Queries @using ErsatzTV.Extensions @using Unit = LanguageExt.Unit @using ErsatzTV.Application.Maintenance.Commands @inherits MultiSelectBase @inject NavigationManager _navigationManager @inject ChannelWriter _channel
@if (IsSelectMode()) { @SelectionLabel()
Delete From Database Clear Selection
} else { if (_movies?.Count > 0) { @_movies.Count Movies } if (_shows?.Count > 0) { @_shows.Count Shows } if (_seasons?.Count > 0) { @_seasons.Count Seasons } if (_episodes?.Count > 0) { @_episodes.Count Episodes } if (_artists?.Count > 0) { @_artists.Count Artists } if (_musicVideos?.Count > 0) { @_musicVideos.Count Music Videos } if (_otherVideos?.Count > 0) { @_otherVideos.Count Other Videos } if (_songs?.Count > 0) { @_songs.Count Songs } if (_movies?.Count == 0 && _shows?.Count == 0 && _seasons?.Count == 0 && _episodes?.Count == 0 && _artists?.Count == 0 && _musicVideos?.Count == 0 && _otherVideos?.Count == 0 && _songs?.Count == 0) { Nothing to see here... } }
@if (_movies?.Count > 0) {
Movies @if (_movies.Count > 50) { See All >> }
@foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle)) { } } @if (_shows?.Count > 0) {
Shows @if (_shows.Count > 50) { See All >> }
@foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle)) { } } @if (_seasons?.Count > 0) {
Seasons @if (_seasons.Count > 50) { See All >> }
@foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle)) { } } @if (_episodes?.Count > 0) {
Episodes @if (_episodes.Count > 50) { See All >> }
@foreach (TelevisionEpisodeCardViewModel card in _episodes.Cards.OrderBy(s => s.SortTitle)) { } } @if (_artists?.Count > 0) {
Artists @if (_artists.Count > 50) { See All >> }
@foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle)) { } } @if (_musicVideos?.Count > 0) {
Music Videos @if (_musicVideos.Count > 50) { See All >> }
@foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle)) { } } @if (_otherVideos?.Count > 0) {
Other Videos @if (_otherVideos.Count > 50) { See All >> }
@foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle)) { } } @if (_songs?.Count > 0) {
Songs @if (_songs.Count > 50) { See All >> }
@foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle)) { } }
@code { private string _query; private MovieCardResultsViewModel _movies; private TelevisionShowCardResultsViewModel _shows; private TelevisionSeasonCardResultsViewModel _seasons; private TelevisionEpisodeCardResultsViewModel _episodes; private MusicVideoCardResultsViewModel _musicVideos; private OtherVideoCardResultsViewModel _otherVideos; private SongCardResultsViewModel _songs; private ArtistCardResultsViewModel _artists; protected override Task OnInitializedAsync() => RefreshData(); protected override async Task RefreshData() { _query = "state:FileNotFound"; if (!string.IsNullOrWhiteSpace(_query)) { _movies = await Mediator.Send(new QuerySearchIndexMovies($"type:movie AND ({_query})", 1, 50)); _shows = await Mediator.Send(new QuerySearchIndexShows($"type:show AND ({_query})", 1, 50)); _seasons = await Mediator.Send(new QuerySearchIndexSeasons($"type:season AND ({_query})", 1, 50)); _episodes = await Mediator.Send(new QuerySearchIndexEpisodes($"type:episode AND ({_query})", 1, 50)); _musicVideos = await Mediator.Send(new QuerySearchIndexMusicVideos($"type:music_video AND ({_query})", 1, 50)); _otherVideos = await Mediator.Send(new QuerySearchIndexOtherVideos($"type:other_video AND ({_query})", 1, 50)); _songs = await Mediator.Send(new QuerySearchIndexSongs($"type:song AND ({_query})", 1, 50)); _artists = await Mediator.Send(new QuerySearchIndexArtists($"type:artist AND ({_query})", 1, 50)); } } private void SelectClicked(MediaCardViewModel card, MouseEventArgs e) { List GetSortedItems() { return _movies.Cards.OrderBy(m => m.SortTitle) .Append(_shows.Cards.OrderBy(s => s.SortTitle)) .Append(_seasons.Cards.OrderBy(s => s.SortTitle)) .Append(_episodes.Cards.OrderBy(ep => ep.SortTitle)) .Append(_artists.Cards.OrderBy(a => a.SortTitle)) .Append(_musicVideos.Cards.OrderBy(mv => mv.SortTitle)) .Append(_otherVideos.Cards.OrderBy(ov => ov.SortTitle)) .Append(_songs.Cards.OrderBy(ov => ov.SortTitle)) .ToList(); } SelectClicked(GetSortedItems, card, e); } private string GetMoviesLink() { var uri = "/media/movies/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetShowsLink() { var uri = "/media/tv/shows/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetSeasonsLink() { var uri = "/media/tv/seasons/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetEpisodesLink() { var uri = "/media/tv/episodes/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetArtistsLink() { var uri = "/media/music/artists/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetMusicVideosLink() { var uri = "/media/music/videos/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetOtherVideosLink() { var uri = "/media/other/videos/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private string GetSongsLink() { var uri = "/media/music/songs/page/1"; if (!string.IsNullOrWhiteSpace(_query)) { (string key, string value) = _query.EncodeQuery(); uri = $"{uri}?{key}={value}"; } return uri; } private Task DeleteFromDatabase() => DeleteItemsFromDatabase( SelectedItems.OfType().Map(m => m.MovieId).ToList(), SelectedItems.OfType().Map(s => s.TelevisionShowId).ToList(), SelectedItems.OfType().Map(s => s.TelevisionSeasonId).ToList(), SelectedItems.OfType().Map(e => e.EpisodeId).ToList(), SelectedItems.OfType().Map(a => a.ArtistId).ToList(), SelectedItems.OfType().Map(mv => mv.MusicVideoId).ToList(), SelectedItems.OfType().Map(ov => ov.OtherVideoId).ToList(), SelectedItems.OfType().Map(s => s.SongId).ToList()); private async Task DeleteItemsFromDatabase( List movieIds, List showIds, List seasonIds, List episodeIds, List artistIds, List musicVideoIds, List otherVideoIds, List songIds, string entityName = "selected items") { int count = movieIds.Count + showIds.Count + seasonIds.Count + episodeIds.Count + artistIds.Count + musicVideoIds.Count + otherVideoIds.Count + songIds.Count; var parameters = new DialogParameters { { "EntityType", count.ToString() }, { "EntityName", entityName } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Delete From Database", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled) { var request = new DeleteItemsFromDatabase( movieIds.Append(showIds) .Append(seasonIds) .Append(episodeIds) .Append(artistIds) .Append(musicVideoIds) .Append(otherVideoIds) .Append(songIds) .ToList()); Either addResult = await Mediator.Send(request); await addResult.Match( Left: error => { Snackbar.Add($"Unexpected error deleting items from database: {error.Value}"); Logger.LogError("Unexpected error deleting items from database: {Error}", error.Value); return Task.CompletedTask; }, Right: async _ => { Snackbar.Add($"Deleted {count} items from the database", Severity.Success); ClearSelection(); await RefreshData(); }); } } private async Task DeleteItemFromDatabase(MediaCardViewModel vm) { DeleteItemsFromDatabase request; switch (vm) { case MovieCardViewModel movie: request = new DeleteItemsFromDatabase(new List { movie.MovieId }); await DeleteItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request); break; case TelevisionShowCardViewModel show: request = new DeleteItemsFromDatabase(new List { show.TelevisionShowId }); await DeleteItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request); break; case TelevisionSeasonCardViewModel season: request = new DeleteItemsFromDatabase(new List { season.TelevisionSeasonId }); await DeleteItemsWithConfirmation("season", $"{season.Title} ({season.Subtitle})", request); break; case TelevisionEpisodeCardViewModel episode: request = new DeleteItemsFromDatabase(new List { episode.EpisodeId }); await DeleteItemsWithConfirmation("episode", $"{episode.Title} ({episode.Subtitle})", request); break; case ArtistCardViewModel artist: request = new DeleteItemsFromDatabase(new List { artist.ArtistId }); await DeleteItemsWithConfirmation("artist", $"{artist.Title} ({artist.Subtitle})", request); break; case MusicVideoCardViewModel musicVideo: request = new DeleteItemsFromDatabase(new List { musicVideo.MusicVideoId }); await DeleteItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request); break; case OtherVideoCardViewModel otherVideo: request = new DeleteItemsFromDatabase(new List { otherVideo.OtherVideoId }); await DeleteItemsWithConfirmation("other video", $"{otherVideo.Title} ({otherVideo.Subtitle})", request); break; case SongCardViewModel song: request = new DeleteItemsFromDatabase(new List { song.SongId }); await DeleteItemsWithConfirmation("song", $"{song.Title} ({song.Subtitle})", request); break; } } private async Task DeleteItemsWithConfirmation( string entityType, string entityName, DeleteItemsFromDatabase request) { var parameters = new DialogParameters { { "EntityType", entityType }, { "EntityName", entityName } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Delete From Database", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled) { await Mediator.Send(request); await RefreshData(); } } }