@page "/media/multi-collections/{Id:int}/edit" @page "/media/multi-collections/add" @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections.Commands @using ErsatzTV.Application.MediaCollections.Queries @inject IMediator _mediator @inject NavigationManager _navigationManager @inject ISnackbar _snackbar @inject ILogger _logger
@(IsEdit ? "Edit Multi Collection" : "Add Multi Collection") Add Collection 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 { [Parameter] public int Id { get; set; } private readonly MultiCollectionEditViewModel _model = new(); private EditContext _editContext; private ValidationMessageStore _messageStore; private List _collections; private List _smartCollections; private MediaCollectionViewModel _selectedCollection; private SmartCollectionViewModel _selectedSmartCollection; private MudAutocomplete _collectionAutocomplete; private MudAutocomplete _smartCollectionAutocomplete; protected override async Task OnParametersSetAsync() { _collections = await _mediator.Send(new GetAllCollections()) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); _smartCollections = await _mediator.Send(new GetAllSmartCollections()) .Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList()); if (IsEdit) { Option maybeCollection = await _mediator.Send(new GetMultiCollectionById(Id)); 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()))).LeftToSeq() : (await _mediator.Send(new CreateMultiCollection(_model.Name, GetCreateItems()))).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 void AddCollection() { if (_selectedCollection != null && _model.Items.All(i => i.Collection != _selectedCollection)) { _model.Items.Add(new MultiCollectionItemEditViewModel { Collection = _selectedCollection, PlaybackOrder = PlaybackOrder.Chronological }); _selectedCollection = null; _collectionAutocomplete.Reset(); } } private void AddSmartCollection() { if (_selectedSmartCollection != null && _model.Items.OfType().All(i => i.SmartCollection != _selectedSmartCollection)) { _model.Items.Add(new MultiCollectionSmartItemEditViewModel { SmartCollection = _selectedSmartCollection, PlaybackOrder = PlaybackOrder.Chronological }); _selectedSmartCollection = null; _smartCollectionAutocomplete.Reset(); } } private Task> SearchCollections(string value) => _collections.Filter(c => _model.Items.All(i => i.Collection != c) && c.Name.Contains(value ?? string.Empty, StringComparison.OrdinalIgnoreCase)).AsTask(); private Task> SearchSmartCollections(string value) => _smartCollections.Filter(c => _model.Items.OfType().All(i => i.SmartCollection != c) && c.Name.Contains(value ?? string.Empty, StringComparison.OrdinalIgnoreCase)).AsTask(); }