@page "/decos" @using ErsatzTV.Application.Scheduling @implements IDisposable @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @inject IDialogService Dialog Decos
Add Deco Group
@foreach (DecoGroupViewModel decoGroup in _decoGroups) { @decoGroup.Name }
Add Deco
@item.Value.Text @if (!string.IsNullOrWhiteSpace(item.Value.EndText)) { @item.Value.EndText }
@foreach (int decoId in Optional(item.Value.DecoId)) { }
@code { private readonly CancellationTokenSource _cts = new(); private List> TreeItems { get; set; } = []; private List _decoGroups = []; private DecoGroupViewModel _selectedDecoGroup; private string _decoGroupName; private string _decoName; public void Dispose() { _cts.Cancel(); _cts.Dispose(); } protected override async Task OnParametersSetAsync() { await ReloadDecoGroups(); await InvokeAsync(StateHasChanged); } private async Task ReloadDecoGroups() { _decoGroups = await Mediator.Send(new GetAllDecoGroups(), _cts.Token); TreeItems = _decoGroups.Map(g => new TreeItemData { Value = new DecoTreeItemViewModel(g) }).ToList(); } private async Task AddDecoGroup() { if (!string.IsNullOrWhiteSpace(_decoGroupName)) { Either result = await Mediator.Send(new CreateDecoGroup(_decoGroupName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding deco group: {Error}", error.Value); } foreach (DecoGroupViewModel decoGroup in result.RightToSeq()) { TreeItems.Add(new TreeItemData { Value = new DecoTreeItemViewModel(decoGroup) }); _decoGroupName = null; _decoGroups = await Mediator.Send(new GetAllDecoGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } } private async Task AddDeco() { if (_selectedDecoGroup is not null && !string.IsNullOrWhiteSpace(_decoName)) { Either result = await Mediator.Send(new CreateDeco(_selectedDecoGroup.Id, _decoName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding deco: {Error}", error.Value); } foreach (DecoViewModel deco in result.RightToSeq()) { foreach (DecoTreeItemViewModel item in TreeItems.Where(item => item.Value!.DecoGroupId == _selectedDecoGroup.Id).Map(i => i.Value)) { item.TreeItems.Add(new TreeItemData { Value = new DecoTreeItemViewModel(deco) }); } _decoName = null; await InvokeAsync(StateHasChanged); } } } private async Task>> LoadServerData(DecoTreeItemViewModel parentNode) { foreach (int decoGroupId in Optional(parentNode.DecoGroupId)) { List result = await Mediator.Send(new GetDecosByDecoGroupId(decoGroupId), _cts.Token); foreach (DecoViewModel deco in result) { parentNode.TreeItems.Add(new TreeItemData { Value = new DecoTreeItemViewModel(deco) }); } } return parentNode.TreeItems; } private async Task DeleteItem(DecoTreeItemViewModel treeItem) { foreach (int decoGroupId in Optional(treeItem.DecoGroupId)) { var parameters = new DialogParameters { { "EntityType", "deco group" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Deco Group", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteDecoGroup(decoGroupId), _cts.Token); TreeItems.RemoveAll(i => i.Value?.DecoGroupId == decoGroupId); _decoGroups = await Mediator.Send(new GetAllDecoGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } foreach (int decoId in Optional(treeItem.DecoId)) { var parameters = new DialogParameters { { "EntityType", "deco" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Deco", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteDeco(decoId), _cts.Token); foreach (DecoTreeItemViewModel parent in TreeItems.Map(i => i.Value)) { parent.TreeItems.RemoveAll(ti => ti.Value == treeItem); } await InvokeAsync(StateHasChanged); } } } }