diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs index 8bb1ae4..55f8c5f 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs @@ -106,6 +106,9 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase // Set by the view so OpenWorktreeCommand can show the modal as a dialog public Func? ShowWorktreeModal { get; set; } + // Set by the view so ApproveMergeCommand can show the modal as a dialog + public Func? ShowMergeModal { get; set; } + // Set by the view so DeleteTaskCommand can prompt yes/no before deleting public Func>? ConfirmAsync { get; set; } @@ -126,6 +129,7 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase RunNowCommand.NotifyCanExecuteChanged(); ContinueCommand.NotifyCanExecuteChanged(); ResetCommand.NotifyCanExecuteChanged(); + ApproveMergeCommand.NotifyCanExecuteChanged(); } }; @@ -304,6 +308,10 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase { WorktreePath = WorktreePath, BaseRef = WorktreeBaseCommit, + TaskId = Task?.Id, + TaskTitle = Task?.Title ?? "", + ShowMergeModal = ShowMergeModal, + ResolveMergeVm = () => _services.GetRequiredService(), }; await diffVm.LoadAsync(); await ShowDiffModal(diffVm); @@ -332,6 +340,7 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase { OpenDiffCommand.NotifyCanExecuteChanged(); OpenWorktreeCommand.NotifyCanExecuteChanged(); + ApproveMergeCommand.NotifyCanExecuteChanged(); } [RelayCommand] @@ -379,14 +388,18 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase await repo.UpdateAsync(entity); } - [RelayCommand] + [RelayCommand(CanExecute = nameof(CanMerge))] private async System.Threading.Tasks.Task ApproveMergeAsync() { - if (Task == null) return; - // TODO: call worker merge hub method when available - await System.Threading.Tasks.Task.CompletedTask; + if (Task == null || ShowMergeModal == null) return; + var vm = _services.GetRequiredService(); + await vm.InitializeAsync(Task.Id, Task.Title); + await ShowMergeModal(vm); } + private bool CanMerge() => + Task != null && _worker.IsConnected && WorktreePath != null; + [RelayCommand] private async System.Threading.Tasks.Task StopAsync() {