@page "/blocks" @using ErsatzTV.Application.Scheduling @implements IDisposable @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @inject IDialogService Dialog Blocks
Add Block Group
@foreach (BlockGroupViewModel blockGroup in _blockGroups) { @blockGroup.Name }
Add Block
@item.Value.Text @if (!string.IsNullOrWhiteSpace(item.Value.EndText)) { @item.Value.EndText }
@foreach (int blockId in Optional(item.Value.BlockId)) { }
@code { private readonly CancellationTokenSource _cts = new(); private List> TreeItems { get; set; } = []; private List _blockGroups = []; private BlockGroupViewModel _selectedBlockGroup; private string _blockGroupName; private string _blockName; public void Dispose() { _cts.Cancel(); _cts.Dispose(); } protected override async Task OnParametersSetAsync() { await ReloadBlockGroups(); await InvokeAsync(StateHasChanged); } private async Task ReloadBlockGroups() { _blockGroups = await Mediator.Send(new GetAllBlockGroups(), _cts.Token); TreeItems = _blockGroups.Map(g => new TreeItemData { Value = new BlockTreeItemViewModel(g) }).ToList(); } private async Task AddBlockGroup() { if (!string.IsNullOrWhiteSpace(_blockGroupName)) { Either result = await Mediator.Send(new CreateBlockGroup(_blockGroupName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding block group: {Error}", error.Value); } foreach (BlockGroupViewModel blockGroup in result.RightToSeq()) { TreeItems.Add(new TreeItemData { Value = new BlockTreeItemViewModel(blockGroup) }); _blockGroupName = null; _blockGroups = await Mediator.Send(new GetAllBlockGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } } private async Task AddBlock() { if (_selectedBlockGroup is not null && !string.IsNullOrWhiteSpace(_blockName)) { Either result = await Mediator.Send(new CreateBlock(_selectedBlockGroup.Id, _blockName), _cts.Token); foreach (BaseError error in result.LeftToSeq()) { Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error adding block: {Error}", error.Value); } foreach (BlockViewModel block in result.RightToSeq()) { foreach (BlockTreeItemViewModel item in TreeItems.Map(i => i.Value).Where(item => item.BlockGroupId == _selectedBlockGroup.Id)) { item.TreeItems.Add(new TreeItemData { Value = new BlockTreeItemViewModel(block) }); } _blockName = null; await InvokeAsync(StateHasChanged); } } } private async Task>> LoadServerData(BlockTreeItemViewModel parentNode) { foreach (int blockGroupId in Optional(parentNode.BlockGroupId)) { List result = await Mediator.Send(new GetBlocksByBlockGroupId(blockGroupId), _cts.Token); foreach (BlockViewModel block in result) { parentNode.TreeItems.Add(new TreeItemData { Value = new BlockTreeItemViewModel(block) }); } } return parentNode.TreeItems; } private async Task DeleteItem(BlockTreeItemViewModel treeItem) { foreach (int blockGroupId in Optional(treeItem.BlockGroupId)) { var parameters = new DialogParameters { { "EntityType", "block group" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Block Group", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteBlockGroup(blockGroupId), _cts.Token); TreeItems.RemoveAll(i => i.Value?.BlockGroupId == blockGroupId); _blockGroups = await Mediator.Send(new GetAllBlockGroups(), _cts.Token); await InvokeAsync(StateHasChanged); } } foreach (int blockId in Optional(treeItem.BlockId)) { var parameters = new DialogParameters { { "EntityType", "block" }, { "EntityName", treeItem.Text } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Block", parameters, options); DialogResult result = await dialog.Result; if (result is not null && !result.Canceled) { await Mediator.Send(new DeleteBlock(blockId), _cts.Token); foreach (BlockTreeItemViewModel parent in TreeItems.Map(i => i.Value)) { parent.TreeItems.RemoveAll(i => i.Value == treeItem); } await InvokeAsync(StateHasChanged); } } } }