diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/WorktreesOverviewModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/WorktreesOverviewModalViewModel.cs index f55ac3b..9a1a930 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/WorktreesOverviewModalViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/WorktreesOverviewModalViewModel.cs @@ -12,6 +12,8 @@ using TaskStatus = ClaudeDo.Data.Models.TaskStatus; namespace ClaudeDo.Ui.ViewModels.Modals; +public enum BatchMergeOutcome { None, Merging, Merged, Conflict, Blocked, Failed } + public sealed partial class WorktreeOverviewRowViewModel : ViewModelBase { [ObservableProperty] private string _taskId = ""; @@ -27,6 +29,14 @@ public sealed partial class WorktreeOverviewRowViewModel : ViewModelBase [ObservableProperty][NotifyPropertyChangedFor(nameof(AgeText))] private DateTime _createdAt; [ObservableProperty] private bool _pathExistsOnDisk; [ObservableProperty] private bool _isSelected; + [ObservableProperty] private bool _isChecked; + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsConflict))] + [NotifyPropertyChangedFor(nameof(HasOutcome))] + private BatchMergeOutcome _mergeOutcome; + + public bool IsConflict => MergeOutcome == BatchMergeOutcome.Conflict; + public bool HasOutcome => MergeOutcome != BatchMergeOutcome.None; public string AgeText => FormatAge(DateTime.UtcNow - CreatedAt); public bool IsActive => State == WorktreeState.Active; diff --git a/tests/ClaudeDo.Ui.Tests/ViewModels/WorktreesOverviewBatchMergeTests.cs b/tests/ClaudeDo.Ui.Tests/ViewModels/WorktreesOverviewBatchMergeTests.cs new file mode 100644 index 0000000..4db056d --- /dev/null +++ b/tests/ClaudeDo.Ui.Tests/ViewModels/WorktreesOverviewBatchMergeTests.cs @@ -0,0 +1,31 @@ +using ClaudeDo.Data.Models; +using ClaudeDo.Ui.ViewModels.Modals; +using TaskStatus = ClaudeDo.Data.Models.TaskStatus; +using Xunit; + +namespace ClaudeDo.Ui.Tests.ViewModels; + +public class WorktreesOverviewBatchMergeTests +{ + private static WorktreeOverviewRowViewModel ActiveRow(string id) => new() + { + TaskId = id, + TaskTitle = $"Task {id}", + TaskStatus = TaskStatus.WaitingForReview, + State = WorktreeState.Active, + }; + + [Fact] + public void Row_outcome_helpers_reflect_state() + { + var row = ActiveRow("a"); + Assert.Equal(BatchMergeOutcome.None, row.MergeOutcome); + Assert.False(row.IsConflict); + + row.MergeOutcome = BatchMergeOutcome.Conflict; + Assert.True(row.IsConflict); + + row.MergeOutcome = BatchMergeOutcome.Merged; + Assert.False(row.IsConflict); + } +}