diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2e141cebd..f68d4ded7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -84,6 +84,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Use smaller batch size for search index updates (100, down from 1000)
- This should help newly scanned items appear in the UI more quickly
- Replace favicon and logo in background image used for error streams
+- Block schedule template editor:
+ - Auto scroll day view to block item time when adding and removing block items from template
+ - Allow keyboard selection of block groups and blocks
## [25.8.0] - 2025-10-26
### Added
diff --git a/ErsatzTV/Pages/TemplateEditor.razor b/ErsatzTV/Pages/TemplateEditor.razor
index 5c05fdea3..504a67b70 100644
--- a/ErsatzTV/Pages/TemplateEditor.razor
+++ b/ErsatzTV/Pages/TemplateEditor.razor
@@ -35,10 +35,10 @@
Block Group
-
+
@foreach (BlockGroupViewModel blockGroup in _blockGroups)
{
- @blockGroup.Name
+ @blockGroup.Name
}
@@ -46,10 +46,10 @@
Block
-
+
@foreach (BlockViewModel block in _blocks)
{
- @block.Name
+ @block.Name
}
@@ -94,7 +94,8 @@
Content
- _calendar;
public void Dispose()
{
@@ -194,12 +196,22 @@
End = item.EndTime
};
- private async Task UpdateBlockGroupItems(BlockGroupViewModel blockGroup)
+ private async Task UpdateBlockGroupItems(string blockGroupName)
{
- _selectedBlockGroup = blockGroup;
+ Option maybeBlockGroup = Optional(_blockGroups.Find(bg => bg.Name == blockGroupName));
+ foreach (var blockGroup in maybeBlockGroup)
+ {
+ _selectedBlockGroup = blockGroup;
+
+ _blocks.Clear();
+ _blocks.AddRange(await Mediator.Send(new GetBlocksByBlockGroupId(_selectedBlockGroup.Id), _cts.Token));
+ }
+ }
- _blocks.Clear();
- _blocks.AddRange(await Mediator.Send(new GetBlocksByBlockGroupId(_selectedBlockGroup.Id), _cts.Token));
+ private void UpdateSelectedBlock(string blockName)
+ {
+ _selectedBlock = _blocks.Find(bg => bg.Name == blockName);
+ InvokeAsync(StateHasChanged);
}
private void AddBlockToTemplate()
@@ -223,6 +235,8 @@
_template.Items.Add(item);
+ InvokeAsync(() => { _calendar.ScrollToTime(TimeOnly.FromDateTime(item.Start)); });
+
break;
}
@@ -235,6 +249,9 @@
if (_blockToRemove is not null)
{
_template.Items.Remove(_blockToRemove);
+
+ await InvokeAsync(() => { _calendar.ScrollToTime(TimeOnly.FromDateTime(_blockToRemove.Start)); });
+
_blockToRemove = null;
await InvokeAsync(StateHasChanged);