@page "/playouts/add" @page "/playouts/add/{kind}" @using System.Globalization @using ErsatzTV.Application.Channels @using ErsatzTV.Application.ProgramSchedules @using ErsatzTV.Validators @using FluentValidation.Results @implements IDisposable @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator Add Playout
Playout
Channel
@foreach (ChannelViewModel channel in _channels) { @($"{channel.Number} - {channel.Name}") }
@switch (Kind) { case PlayoutKind.ExternalJson:
JSON (dizqueTV) Schedule
break; case PlayoutKind.Sequential:
Sequential Schedule
break; case PlayoutKind.Scripted:
Scripted Schedule
break; case PlayoutKind.Block:
Block templates are added later
break; default:
Classic Schedule
@foreach (ProgramScheduleViewModel schedule in _programSchedules) { @schedule.Name }
break; }
@code { private CancellationTokenSource _cts; private readonly PlayoutEditViewModel _model = new(); private readonly PlayoutEditViewModelValidator _validator = new(); private MudForm _form; private List _channels = []; private List _programSchedules = []; [Parameter] public string Kind { get; set; } public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _model.Kind = Kind; _channels = await Mediator.Send(new GetAllChannels(), token) .Map(list => list.OrderBy(vm => decimal.Parse(vm.Number, CultureInfo.InvariantCulture)).ToList()); if (string.IsNullOrWhiteSpace(Kind)) { _programSchedules = await Mediator.Send(new GetAllProgramSchedules(), token) .Map(list => list.OrderBy(vm => vm.Name).ToList()); } } catch (OperationCanceledException) { // do nothing } } private async Task HandleSubmitAsync() { await _form.Validate(); ValidationResult result = await _validator.ValidateAsync(_model, _cts.Token); if (result.IsValid) { Seq errorMessage = (await Mediator.Send(_model.ToCreate(), _cts.Token)).LeftToSeq(); errorMessage.HeadOrNone().Match( error => { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error saving playout: {Error}", error.Value); }, () => NavigationManager.NavigateTo("playouts")); } } }