@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 ? "Edit Multi Collection" : "Add Multi Collection") @if (_editContext is not null) { @foreach (MediaCollectionViewModel collection in _collections) { @collection.Name } Add Collection @foreach (SmartCollectionViewModel collection in _smartCollections) { @collection.Name } Add Smart Collection @(IsEdit ? "Save Changes" : "Add Multi Collection") }
@_model.Name Items Collection Schedule As Group Playback Order @context.Collection.Name @if (context.ScheduleAsGroup) { @(context.Collection.UseCustomPlaybackOrder ? "Custom" : "Chronological") }
@code { private readonly CancellationTokenSource _cts = new(); [Parameter] public int Id { get; set; } private readonly MultiCollectionEditViewModel _model = new() { Items = new List() }; private EditContext _editContext; private ValidationMessageStore _messageStore; 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() { _collections = await Mediator.Send(new GetAllCollections(), _cts.Token) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); _smartCollections = await Mediator.Send(new GetAllSmartCollections(), _cts.Token) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); if (IsEdit) { Option maybeCollection = await Mediator.Send(new GetMultiCollectionById(Id), _cts.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(); } } protected override void OnInitialized() { _editContext = new EditContext(_model); _messageStore = new ValidationMessageStore(_editContext); } private bool IsEdit => Id != 0; private async Task HandleSubmitAsync() { _messageStore.Clear(); if (_editContext.Validate()) { 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/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(); } } }