From 0a3c25840f56a066d702433ffd170efd8f3d3a6c Mon Sep 17 00:00:00 2001 From: mika kuns Date: Wed, 29 Jul 2026 08:57:55 +0200 Subject: [PATCH] =?UTF-8?q?=EF=BB=BFfeat(claude-do):=20Neu=20angelegter=20?= =?UTF-8?q?Task=20soll=20direkt=20ausgew=C3=A4hlt=20werden=20(Detailpan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Nach "Neuen Task hinzufügen" (Eingabefeld im Tasks-Header, `Ctrl+N`) wird der Task angelegt und in die Liste eingefügt, aber **nicht ausgewählt**. Um Beschreibung/Config zu ergänzen, muss man ihn erst manuell anklicken. ## Ist-Zustand `src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs`, `AddAsync()` (ab Zeile ~424): legt die `TaskEntity` an, speichert über `TaskRepository.AddA ClaudeDo-Task: 5af6ac9acb4447929e3e550c3c233a25 --- .../Islands/TasksIslandViewModel.cs | 1 + .../TasksIslandAddAndSelectTests.cs | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs index c11597d8..968b5ade 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs @@ -443,6 +443,7 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable row.ShowListChip = _currentList?.Kind == ListKind.Virtual; Items.Add(row); Regroup(); + SelectedTask = row; NewTaskTitle = ""; UpdateSubtitle(); TasksChanged?.Invoke(this, EventArgs.Empty); diff --git a/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs b/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs new file mode 100644 index 00000000..2084300b --- /dev/null +++ b/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs @@ -0,0 +1,76 @@ +using ClaudeDo.Data; +using ClaudeDo.Data.Models; +using ClaudeDo.Ui.ViewModels.Islands; +using Microsoft.EntityFrameworkCore; + +namespace ClaudeDo.Ui.Tests.ViewModels; + +public class TasksIslandAddAndSelectTests : IDisposable +{ + private readonly string _dbPath; + + public TasksIslandAddAndSelectTests() + { + _dbPath = Path.Combine(Path.GetTempPath(), $"claudedo_ui_addselect_{Guid.NewGuid():N}.db"); + using var ctx = NewContext(); + ctx.Database.EnsureCreated(); + } + + public void Dispose() + { + try { File.Delete(_dbPath); } catch { } + try { File.Delete(_dbPath + "-wal"); } catch { } + try { File.Delete(_dbPath + "-shm"); } catch { } + } + + private ClaudeDoDbContext NewContext() + { + var opts = new DbContextOptionsBuilder() + .UseSqlite($"Data Source={_dbPath}") + .Options; + return new ClaudeDoDbContext(opts); + } + + private sealed class TestDbFactory : IDbContextFactory + { + private readonly Func _create; + public TestDbFactory(Func create) => _create = create; + public ClaudeDoDbContext CreateDbContext() => _create(); + } + + private async Task SeedListAsync() + { + await using var db = NewContext(); + db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow }); + await db.SaveChangesAsync(); + } + + [Fact] + public async Task AddAsync_SelectsNewTask() + { + await SeedListAsync(); + var vm = new TasksIslandViewModel(new TestDbFactory(NewContext), worker: null); + vm.LoadForList(new ListNavItemViewModel { Id = "user:L1", Name = "Work", Kind = ListKind.User }); + await vm.LoadTask!; + + vm.NewTaskTitle = "My new task"; + await vm.AddCommand.ExecuteAsync(null); + + Assert.NotNull(vm.SelectedTask); + Assert.Equal("My new task", vm.SelectedTask!.Title); + } + + [Fact] + public async Task AddAsync_EmptyTitle_DoesNotChangeSelection() + { + await SeedListAsync(); + var vm = new TasksIslandViewModel(new TestDbFactory(NewContext), worker: null); + vm.LoadForList(new ListNavItemViewModel { Id = "user:L1", Name = "Work", Kind = ListKind.User }); + await vm.LoadTask!; + + vm.NewTaskTitle = ""; + await vm.AddCommand.ExecuteAsync(null); + + Assert.Null(vm.SelectedTask); + } +}