@page "/deco-templates" @using ErsatzTV.Application.Scheduling @using ErsatzTV.Application.Tree @implements IDisposable @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @inject IDialogService Dialog
Deco Template Groups
Deco Template Group Name
Add Deco Template Group
Deco Templates
Deco Template Group
@foreach (DecoTemplateGroupViewModel decoTemplateGroup in _decoTemplateGroups) { @decoTemplateGroup.Name }
Deco Template Name
Add Deco Template
@item.Value.Text
@foreach (int decoTemplateId in Optional(item.Value.DecoTemplateId)) { }
@code { private CancellationTokenSource _cts; private readonly List> _treeItems = []; private List _decoTemplateGroups = []; private DecoTemplateGroupViewModel _selectedDecoTemplateGroup; private string _decoTemplateGroupName; private string _decoTemplateName; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _decoTemplateGroups = await Mediator.Send(new GetAllDecoTemplateGroups(), token); _treeItems.Clear(); TreeViewModel tree = await Mediator.Send(new GetDecoTemplateTree(), token); foreach (TreeGroupViewModel group in tree.Groups) { _treeItems.Add(new TreeItemData { Value = new DecoTemplateTreeItemViewModel(group) }); } } catch (OperationCanceledException) { // do nothing } } private async Task AddDecoTemplateGroup() { if (!string.IsNullOrWhiteSpace(_decoTemplateGroupName)) { Either result = await Mediator.Send(new CreateDecoTemplateGroup(_decoTemplateGroupName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding decoTemplate group: {Error}", error.Value); } foreach (DecoTemplateGroupViewModel decoTemplateGroup in result.RightToSeq()) { _treeItems.Add(new TreeItemData { Value = new DecoTemplateTreeItemViewModel(decoTemplateGroup) }); _treeItems.Sort((x, y) => string.Compare(x.Value?.Text, y.Value?.Text, StringComparison.CurrentCulture)); _decoTemplateGroupName = null; _decoTemplateGroups = await Mediator.Send(new GetAllDecoTemplateGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } } private async Task AddDecoTemplate() { if (_selectedDecoTemplateGroup is not null && !string.IsNullOrWhiteSpace(_decoTemplateName)) { Either result = await Mediator.Send(new CreateDecoTemplate(_selectedDecoTemplateGroup.Id, _decoTemplateName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding decoTemplate: {Error}", error.Value); } foreach (DecoTemplateViewModel decoTemplate in result.RightToSeq()) { foreach (DecoTemplateTreeItemViewModel item in _treeItems.Map(i => i.Value).Where(item => item.DecoTemplateGroupId == _selectedDecoTemplateGroup.Id)) { item.TreeItems.Add(new TreeItemData { Value = new DecoTemplateTreeItemViewModel(decoTemplate) }); item.TreeItems.Sort((x, y) => string.Compare(x.Value?.Text, y.Value?.Text, StringComparison.CurrentCulture)); } _decoTemplateName = null; await InvokeAsync(StateHasChanged); } } } private async Task DeleteItem(DecoTemplateTreeItemViewModel treeItem) { foreach (int decoTemplateGroupId in Optional(treeItem.DecoTemplateGroupId)) { var parameters = new DialogParameters { { "EntityType", "decoTemplate group" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete DecoTemplate Group", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteDecoTemplateGroup(decoTemplateGroupId), _cts.Token); _treeItems.RemoveAll(i => i.Value?.DecoTemplateGroupId == decoTemplateGroupId); if (_selectedDecoTemplateGroup?.Id == decoTemplateGroupId) { _selectedDecoTemplateGroup = null; } _decoTemplateGroups = await Mediator.Send(new GetAllDecoTemplateGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } foreach (int decoTemplateId in Optional(treeItem.DecoTemplateId)) { var parameters = new DialogParameters { { "EntityType", "decoTemplate" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete DecoTemplate", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteDecoTemplate(decoTemplateId), _cts.Token); foreach (DecoTemplateTreeItemViewModel parent in _treeItems.Map(i => i.Value)) { parent.TreeItems.RemoveAll(i => i.Value == treeItem); } await InvokeAsync(StateHasChanged); } } } }