@page "/media/multi-collections/{Id:int}/edit" @page "/media/multi-collections/add" @using ErsatzTV.Application.MediaCollections @implements IDisposable @inject IMediator Mediator @inject NavigationManager NavigationManager @inject ISnackbar Snackbar @inject ILogger Logger @(IsEdit ? "Save Multi Collection" : "Add Multi Collection")
Multi Collection
Name
Collections
@foreach (MediaCollectionViewModel collection in _collections) { @collection.Name }
Add Collection
Smart Collections
@foreach (SmartCollectionViewModel collection in _smartCollections) { @collection.Name }
Add Smart Collection
@_model.Name Items Collection Schedule As Group Playback Order @context.Collection.Name @if (context.ScheduleAsGroup) { @(context.Collection.UseCustomPlaybackOrder ? "Custom" : "Chronological") }
@code { private CancellationTokenSource _cts; [Parameter] public int Id { get; set; } private readonly MultiCollectionEditViewModel _model = new() { Items = new List() }; private MudForm _form; private bool _success; private List _collections = new(); private List _smartCollections = new(); private MediaCollectionViewModel _selectedCollection; private SmartCollectionViewModel _selectedSmartCollection; private MudSelect _collectionSelect; private MudSelect _smartCollectionSelect; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _collections = await Mediator.Send(new GetAllCollections(), token) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); _smartCollections = await Mediator.Send(new GetAllSmartCollections(), token) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); if (IsEdit) { Option maybeCollection = await Mediator.Send(new GetMultiCollectionById(Id), token); maybeCollection.IfSome(collection => { _model.Id = collection.Id; _model.Name = collection.Name; _model.Items = collection.Items .Map(item => new MultiCollectionItemEditViewModel { Collection = item.Collection, ScheduleAsGroup = item.ScheduleAsGroup, PlaybackOrder = item.PlaybackOrder }) .Append( collection.SmartItems.Map(item => new MultiCollectionSmartItemEditViewModel { SmartCollection = item.SmartCollection, ScheduleAsGroup = item.ScheduleAsGroup, PlaybackOrder = item.PlaybackOrder })).ToList(); }); } else { _model.Name = "New Multi Collection"; _model.Items = new List(); } } catch (OperationCanceledException) { // do nothing } } private bool IsEdit => Id != 0; private async Task HandleSubmitAsync() { await _form.Validate(); if (_success) { Seq errorMessage = IsEdit ? (await Mediator.Send(new UpdateMultiCollection(Id, _model.Name, GetUpdateItems()), _cts.Token)).LeftToSeq() : (await Mediator.Send(new CreateMultiCollection(_model.Name, GetCreateItems()), _cts.Token)).LeftToSeq(); errorMessage.HeadOrNone().Match( error => { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Error saving collection: {Error}", error.Value); }, () => NavigationManager.NavigateTo("media/multi-collections")); } } private List GetUpdateItems() => _model.Items.Map(i => i switch { MultiCollectionSmartItemEditViewModel smartVm => new UpdateMultiCollectionItem( null, smartVm.SmartCollection.Id, smartVm.ScheduleAsGroup, smartVm.PlaybackOrder), _ => new UpdateMultiCollectionItem(i.Collection.Id, null, i.ScheduleAsGroup, i.PlaybackOrder) }).ToList(); private List GetCreateItems() => _model.Items.Map(i => i switch { MultiCollectionSmartItemEditViewModel smartVm => new CreateMultiCollectionItem( null, smartVm.SmartCollection.Id, smartVm.ScheduleAsGroup, smartVm.PlaybackOrder), _ => new CreateMultiCollectionItem(i.Collection.Id, null, i.ScheduleAsGroup, i.PlaybackOrder) }).ToList(); private void RemoveCollection(MultiCollectionItemEditViewModel item) => _model.Items.Remove(item); private async Task AddCollection() { if (_selectedCollection != null && _model.Items.All(i => i.Collection != _selectedCollection)) { _model.Items.Add( new MultiCollectionItemEditViewModel { Collection = _selectedCollection, PlaybackOrder = PlaybackOrder.Chronological }); _selectedCollection = null; await _collectionSelect.ResetAsync(); } } private async Task AddSmartCollection() { if (_selectedSmartCollection != null && _model.Items.OfType().All(i => i.SmartCollection != _selectedSmartCollection)) { _model.Items.Add( new MultiCollectionSmartItemEditViewModel { SmartCollection = _selectedSmartCollection, PlaybackOrder = PlaybackOrder.Chronological }); _selectedSmartCollection = null; await _smartCollectionSelect.ResetAsync(); } } }