@page "/media/movies" @page "/media/movies/page/{PageNumber:int}" @using LanguageExt.UnsafeValueAccess @using Microsoft.AspNetCore.WebUtilities @using Microsoft.Extensions.Primitives @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections.Commands @using ErsatzTV.Application.Search.Queries @using Unit = LanguageExt.Unit @inherits MultiSelectBase @inject NavigationManager _navigationManager @inject ChannelWriter _channel
@if (IsSelectMode()) { @SelectionLabel()
Add To Collection Clear Selection
} else { @_query
@Math.Min((PageNumber - 1) * PageSize + 1, _data.Count)-@Math.Min(_data.Count, PageNumber * PageSize) of @_data.Count
}
@if (_data.PageMap.IsSome) { } @code { private static int PageSize => 100; [Parameter] public int PageNumber { get; set; } private MovieCardResultsViewModel _data; private string _query; protected override Task OnParametersSetAsync() { if (PageNumber == 0) { PageNumber = 1; } string query = new Uri(_navigationManager.Uri).Query; if (QueryHelpers.ParseQuery(query).TryGetValue("query", out StringValues value)) { _query = value; } else { _query = null; } return RefreshData(); } protected override async Task RefreshData() { string searchQuery = string.IsNullOrWhiteSpace(_query) ? "type:movie" : $"type:movie AND ({_query})"; _data = await Mediator.Send(new QuerySearchIndexMovies(searchQuery, PageNumber, PageSize)); } private void PrevPage() { var uri = $"/media/movies/page/{PageNumber - 1}"; if (!string.IsNullOrWhiteSpace(_query)) { uri = QueryHelpers.AddQueryString(uri, "query", _query); } _navigationManager.NavigateTo(uri); } private void NextPage() { var uri = $"/media/movies/page/{PageNumber + 1}"; if (!string.IsNullOrWhiteSpace(_query)) { uri = QueryHelpers.AddQueryString(uri, "query", _query); } _navigationManager.NavigateTo(uri); } private void SelectClicked(MediaCardViewModel card, MouseEventArgs e) { List GetSortedItems() { return _data.Cards.OrderBy(m => m.SortTitle).ToList(); } SelectClicked(GetSortedItems, card, e); } private async Task AddToCollection(MediaCardViewModel card) { if (card is MovieCardViewModel movie) { var parameters = new DialogParameters { { "EntityType", "movie" }, { "EntityName", movie.Title } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) { var request = new AddMovieToCollection(collection.Id, movie.MovieId); Either addResult = await Mediator.Send(request); addResult.Match( Left: error => { Snackbar.Add($"Unexpected error adding movie to collection: {error.Value}"); Logger.LogError("Unexpected error adding movie to collection: {Error}", error.Value); }, Right: _ => Snackbar.Add($"Added {movie.Title} to collection {collection.Name}", Severity.Success)); } } } }