@page "/schedules/{Id:int}" @page "/schedules/add" @using ErsatzTV.Application.ProgramSchedules @using ErsatzTV.Core.Scheduling @implements IDisposable @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @(IsEdit ? "Save Schedule" : "Add Schedule")
Schedule
Name
Keep Multi-Part Episodes Together
Group multi-part episodes when shuffling
Treat Collections As Shows
This is useful for multi-part crossover episodes
Shuffle Schedule Items
Note: this disables fixed start times and flood mode
Random Start Point
Fixed Start Time Behavior
Strict - Wait For Exact Start Time Flexible - Start As Soon As Possible
@code { private CancellationTokenSource _cts; [Parameter] public int Id { get; set; } private readonly ProgramScheduleEditViewModel _model = new(); private MudForm _form; private bool _success; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { if (IsEdit) { Option maybeProgramSchedule = await Mediator.Send(new GetProgramScheduleById(Id), token); maybeProgramSchedule.Match( viewModel => { _model.Id = viewModel.Id; _model.Name = viewModel.Name; _model.ShuffleScheduleItems = viewModel.ShuffleScheduleItems; _model.KeepMultiPartEpisodesTogether = viewModel.KeepMultiPartEpisodesTogether; _model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows; _model.RandomStartPoint = viewModel.RandomStartPoint; _model.FixedStartTimeBehavior = viewModel.FixedStartTimeBehavior; }, () => NavigationManager.NavigateTo("404")); } else { _model.Name = "New Schedule"; } } catch (OperationCanceledException) { // do nothing } } private bool IsEdit => Id > 0; private async Task HandleSubmitAsync() { await _form.Validate(); if (_success) { Either result = IsEdit ? await Mediator.Send(_model.ToUpdate(), _cts.Token).MapT(r => r as EntityIdResult) : await Mediator.Send(_model.ToCreate(), _cts.Token).MapT(r => r as EntityIdResult); result.Match( programSchedule => { string destination = IsEdit ? "/schedules" : $"/schedules/{programSchedule.Id}/items"; NavigationManager.NavigateTo(destination); }, error => { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error saving schedule: {Error}", error.Value); }); } } }