diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs index 384e7d14..b5c16431 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs @@ -73,6 +73,10 @@ public sealed partial class TaskRowViewModel : ViewModelBase public int StepsCount { get; init; } public int StepsCompleted { get; init; } + // Number is 0 for rows created outside TaskNumberAllocator (test seeds, a future import + // path); a bare "#0" would be meaningless, so hide the badge entirely below 1. + public bool ShowNumberBadge => Number > 0; + public bool IsChild => !string.IsNullOrEmpty(ParentTaskId); public bool IsAgentSuggested => IsChild && !string.IsNullOrEmpty(CreatedBy) && CreatedBy == ParentTaskId; public bool IsPlanningParent => PlanningPhase != PlanningPhase.None @@ -318,6 +322,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase OnPropertyChanged(nameof(CanQueuePlan)); } + partial void OnNumberChanged(int value) => OnPropertyChanged(nameof(ShowNumberBadge)); partial void OnBranchChanged(string? value) => OnPropertyChanged(nameof(HasBranch)); partial void OnWorktreeStateChanged(ClaudeDo.Data.Models.WorktreeState? value) { diff --git a/src/ClaudeDo.Ui/Views/Islands/TaskRowView.axaml b/src/ClaudeDo.Ui/Views/Islands/TaskRowView.axaml index 1f1ec0fa..07af2efa 100644 --- a/src/ClaudeDo.Ui/Views/Islands/TaskRowView.axaml +++ b/src/ClaudeDo.Ui/Views/Islands/TaskRowView.axaml @@ -34,15 +34,6 @@ HorizontalAlignment="Right" Margin="0,4"/> - - - - - + + + + + diff --git a/tests/ClaudeDo.Worker.Tests/UiVm/TaskRowViewModelTests.cs b/tests/ClaudeDo.Worker.Tests/UiVm/TaskRowViewModelTests.cs index 46c3eaa0..d25486e1 100644 --- a/tests/ClaudeDo.Worker.Tests/UiVm/TaskRowViewModelTests.cs +++ b/tests/ClaudeDo.Worker.Tests/UiVm/TaskRowViewModelTests.cs @@ -40,6 +40,30 @@ public class TaskRowViewModelTests Assert.Equal(123, vm.Number); } + [Theory] + [InlineData(-1, false)] + [InlineData(0, false)] + [InlineData(1, true)] + [InlineData(42, true)] + public void ShowNumberBadge_Hides_For_Zero_And_Negative(int number, bool expected) + { + var vm = new TaskRowViewModel { Id = "t" }; + vm.Number = number; + Assert.Equal(expected, vm.ShowNumberBadge); + } + + [Fact] + public void ShowNumberBadge_Raises_PropertyChanged_On_Number_Change() + { + var vm = new TaskRowViewModel { Id = "t" }; + var raised = new List(); + vm.PropertyChanged += (_, e) => raised.Add(e.PropertyName); + + vm.Number = 5; + + Assert.Contains(nameof(TaskRowViewModel.ShowNumberBadge), raised); + } + [Fact] public void IsDropTarget_Follows_Either_DropHint_And_Raises_PropertyChanged() {