diff --git a/src/ClaudeDo.Ui/ViewModels/MissionControlViewModel.cs b/src/ClaudeDo.Ui/ViewModels/MissionControlViewModel.cs index 3462aaf..bf9a828 100644 --- a/src/ClaudeDo.Ui/ViewModels/MissionControlViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/MissionControlViewModel.cs @@ -95,6 +95,26 @@ public sealed partial class MissionControlViewModel : ViewModelBase, IDisposable catch { /* best-effort queue refresh */ } } + // Drop-to-queue: a task dragged from the main app onto Mission Control gets queued. + public async System.Threading.Tasks.Task EnqueueTaskAsync(string taskId) + { + if (string.IsNullOrEmpty(taskId)) return; + try + { + await using var db = await _dbFactory.CreateDbContextAsync(); + var entity = await db.Tasks.FirstOrDefaultAsync(t => t.Id == taskId); + if (entity is null + || entity.Status == ClaudeDo.Data.Models.TaskStatus.Running + || entity.Status == ClaudeDo.Data.Models.TaskStatus.Queued) + return; + entity.Status = ClaudeDo.Data.Models.TaskStatus.Queued; + await db.SaveChangesAsync(); + await _worker.WakeQueueAsync(); + } + catch { /* best-effort enqueue */ } + await RefreshQueueAsync(); + } + private void SeedActive() { foreach (var a in _worker.GetActiveTasks()) diff --git a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs index 962450d..0bdd650 100644 --- a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs +++ b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs @@ -15,7 +15,8 @@ namespace ClaudeDo.Ui.Views.Islands; public partial class TasksIslandView : UserControl { - private static readonly DataFormat TaskRowFormat = + // Public so the Mission Control window can accept the same drag payload (drop-to-queue). + public static readonly DataFormat TaskRowFormat = DataFormat.CreateStringApplicationFormat("claudedo-task-row"); public TasksIslandView() diff --git a/src/ClaudeDo.Ui/Views/MissionControl/MissionControlView.axaml b/src/ClaudeDo.Ui/Views/MissionControl/MissionControlView.axaml index 465870a..f242d42 100644 --- a/src/ClaudeDo.Ui/Views/MissionControl/MissionControlView.axaml +++ b/src/ClaudeDo.Ui/Views/MissionControl/MissionControlView.axaml @@ -6,7 +6,8 @@ xmlns:loc="using:ClaudeDo.Ui.Localization" x:DataType="vm:MissionControlViewModel" x:Class="ClaudeDo.Ui.Views.MissionControl.MissionControlView"> - + q.Id == "idleTask"); + + await using var verify = NewContext(); + var entity = await verify.Tasks.FirstAsync(t => t.Id == "idleTask"); + Assert.Equal(TaskStatus.Queued, entity.Status); + } }