@page "/playouts/block/{Id:int}" @using ErsatzTV.Application.Channels @using ErsatzTV.Application.Scheduling @implements IDisposable @inject NavigationManager NavigationManager @inject ISnackbar Snackbar @inject IMediator Mediator @inject IEntityLocker EntityLocker; @inject ILogger Logger Save Default Deco
@_channelName - Block Playout
Playout Templates
Edit Templates
Default Deco
Enable Default Deco
@if (_enableDefaultDeco) {
Deco Group
@foreach (DecoGroupViewModel decoGroup in _decoGroups) { @decoGroup.Name }
Deco
@foreach (DecoViewModel deco in _decos) { @deco.Name }
} Maintenance
Playout Items and History
Erase Items
Erase Items and History
@code { private CancellationTokenSource _cts; [Parameter] public int Id { get; set; } private readonly List _decoGroups = []; private readonly List _decos = []; private string _channelName; private bool _enableDefaultDeco; private DecoGroupViewModel _selectedDefaultDecoGroup; private DecoViewModel _defaultDeco; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { Option maybeName = await Mediator.Send(new GetChannelNameByPlayoutId(Id), token); if (maybeName.IsNone) { NavigationManager.NavigateTo("playouts"); return; } foreach (string name in maybeName) { _channelName = name; } _decoGroups.Clear(); _decoGroups.AddRange(await Mediator.Send(new GetAllDecoGroups(), token)); Option maybeDefaultDeco = await Mediator.Send(new GetDecoByPlayoutId(Id), token); foreach (DecoViewModel defaultDeco in maybeDefaultDeco) { _enableDefaultDeco = true; _selectedDefaultDecoGroup = _decoGroups.SingleOrDefault(dg => dg.Id == defaultDeco.DecoGroupId); await UpdateDefaultDecoTemplateGroupItems(_selectedDefaultDecoGroup); _defaultDeco = defaultDeco; } } catch (OperationCanceledException) { // do nothing } } private async Task UpdateDefaultDecoTemplateGroupItems(DecoGroupViewModel decoGroup) { _selectedDefaultDecoGroup = decoGroup; _decos.Clear(); _decos.AddRange(await Mediator.Send(new GetDecosByDecoGroupId(_selectedDefaultDecoGroup.Id), _cts.Token)); } private async Task EraseItems(bool eraseHistory) { IRequest request = eraseHistory ? new ErasePlayoutHistory(Id) : new ErasePlayoutItems(Id); await Mediator.Send(request, _cts.Token); string message = eraseHistory ? "Erased playout items and history" : "Erased playout items"; Snackbar.Add(message, Severity.Info); } private async Task SaveDefaultDeco() { int? decoId = _enableDefaultDeco ? _defaultDeco?.Id : null; Option result = await Mediator.Send(new UpdateDefaultDeco(Id, decoId), _cts.Token); result.Match( error => { Snackbar.Add($"Unexpected error saving default deco: {error.Value}", Severity.Error); Logger.LogError("Unexpected error saving default deco: {Error}", error.Value); }, () => { Snackbar.Add($"Saved default deco for playout {_channelName}", Severity.Success); }); } }