@page "/decos" @using ErsatzTV.Application.Scheduling @using ErsatzTV.Application.Tree @implements IDisposable @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @inject IDialogService Dialog
Deco Groups
Deco Group Name
Add Deco Group
Decos
Deco Group
@foreach (DecoGroupViewModel decoGroup in _decoGroups) { @decoGroup.Name }
Deco Name
Add Deco
@item.Value.Text
@foreach (int decoId in Optional(item.Value.DecoId)) { }
@code { private CancellationTokenSource _cts; private readonly List> _treeItems = []; private List _decoGroups = []; private DecoGroupViewModel _selectedDecoGroup; private string _decoGroupName; private string _decoName; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _decoGroups = await Mediator.Send(new GetAllDecoGroups(), token); _treeItems.Clear(); TreeViewModel tree = await Mediator.Send(new GetDecoTree(), token); foreach (TreeGroupViewModel group in tree.Groups) { _treeItems.Add(new TreeItemData { Value = new DecoTreeItemViewModel(group) }); } } catch (OperationCanceledException) { // do nothing } } 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) }); _treeItems.Sort((x, y) => string.Compare(x.Value?.Text, y.Value?.Text, StringComparison.CurrentCulture)); _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.Map(i => i.Value).Where(item => item.DecoGroupId == _selectedDecoGroup.Id)) { item.TreeItems.Add(new TreeItemData { Value = new DecoTreeItemViewModel(deco) }); item.TreeItems.Sort((x, y) => string.Compare(x.Value?.Text, y.Value?.Text, StringComparison.CurrentCulture)); } _decoName = null; await InvokeAsync(StateHasChanged); } } } 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); if (_selectedDecoGroup?.Id == decoGroupId) { _selectedDecoGroup = null; } _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(i => i.Value == treeItem); } await InvokeAsync(StateHasChanged); } } } }