style(ui): task section dividers overdue/tasks/completed

Expose OverdueItems / OpenItems / CompletedItems as separate observable
collections recomputed in LoadForList (and after add / toggle-done).

- OverdueItems: ScheduledFor.Date < Today && !Done
- OpenItems:    remaining !Done
- CompletedItems: Done

View renders three sections with eyebrow-style headers:
- OVERDUE (blood accent, only when non-empty)
- TASKS (shown only when overdue is also visible, matching the mock)
- COMPLETED · N (hidden when IsShowingCompleted is false)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-04-20 11:31:45 +02:00
parent 0ef7113958
commit 82f2d526a0
2 changed files with 12 additions and 6 deletions

View File

@@ -33,7 +33,9 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
[ObservableProperty] private bool _hasStatusPill;
[ObservableProperty] private bool _isShowingCompleted = true;
[ObservableProperty] private bool _hasOverdue;
[ObservableProperty] private bool _hasOpen;
[ObservableProperty] private bool _hasCompleted;
[ObservableProperty] private bool _showOpenLabel;
[ObservableProperty] private string _completedHeader = "COMPLETED";
public TasksIslandViewModel(IDbContextFactory<ClaudeDoDbContext> dbFactory)
@@ -53,8 +55,10 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
OverdueItems.Clear();
OpenItems.Clear();
CompletedItems.Clear();
HasOverdue = false;
HasCompleted = false;
HasOverdue = false;
HasOpen = false;
HasCompleted = false;
ShowOpenLabel = false;
if (list is null) return;
HeaderTitle = list.Name;
@@ -112,8 +116,10 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
OpenItems.Add(r);
}
HasOverdue = OverdueItems.Count > 0;
HasCompleted = CompletedItems.Count > 0;
HasOverdue = OverdueItems.Count > 0;
HasOpen = OpenItems.Count > 0;
HasCompleted = CompletedItems.Count > 0;
ShowOpenLabel = HasOpen && HasOverdue;
CompletedHeader = $"COMPLETED · {CompletedItems.Count}";
}

View File

@@ -89,10 +89,10 @@
</StackPanel>
<!-- TASKS -->
<StackPanel>
<StackPanel IsVisible="{Binding HasOpen}">
<TextBlock Classes="eyebrow section-label"
Text="TASKS" Margin="14,14,14,6"
IsVisible="{Binding HasOverdue}"/>
IsVisible="{Binding ShowOpenLabel}"/>
<ItemsControl ItemsSource="{Binding OpenItems}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:TaskRowViewModel">