style(ui): subtasks, notes, details metadata footer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-04-20 11:39:40 +02:00
parent 01af8cb7d7
commit 9b1178ca2f
5 changed files with 158 additions and 30 deletions

View File

@@ -66,6 +66,12 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
private CancellationTokenSource? _loadCts;
// Set by shell so CloseDetailCommand can clear SelectedTask
public Action? CloseDetail { get; set; }
// Set by shell so DeleteTaskCommand can remove from list
public Func<TaskRowViewModel, System.Threading.Tasks.Task>? DeleteFromList { get; set; }
// Set by the view so OpenDiffCommand can show the modal as a dialog
public Func<DiffModalViewModel, System.Threading.Tasks.Task>? ShowDiffModal { get; set; }
@@ -198,6 +204,34 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
await System.Threading.Tasks.Task.CompletedTask;
}
[RelayCommand]
private void CloseDetails() => CloseDetail?.Invoke();
[RelayCommand]
private async System.Threading.Tasks.Task DeleteTaskAsync()
{
if (Task == null) return;
var row = Task;
await using var ctx = _dbFactory.CreateDbContext();
var repo = new TaskRepository(ctx);
await repo.DeleteAsync(row.Id);
if (DeleteFromList != null)
await DeleteFromList(row);
CloseDetail?.Invoke();
}
[RelayCommand]
private async System.Threading.Tasks.Task SaveNotesAsync()
{
if (Task == null) return;
await using var ctx = _dbFactory.CreateDbContext();
var repo = new TaskRepository(ctx);
var entity = await repo.GetByIdAsync(Task.Id);
if (entity == null) return;
entity.Notes = Notes;
await repo.UpdateAsync(entity);
}
[RelayCommand]
private async System.Threading.Tasks.Task ApproveMergeAsync()
{

View File

@@ -22,6 +22,9 @@ public sealed partial class TaskRowViewModel : ViewModelBase
[ObservableProperty] private int _diffAdditions;
[ObservableProperty] private int _diffDeletions;
public DateTime CreatedAt { get; init; }
public string CreatedAtFormatted => CreatedAt == default ? "—" : $"Created {CreatedAt:MMM d}";
public IReadOnlyList<string> Tags { get; init; } = Array.Empty<string>();
public int StepsCount { get; init; }
public int StepsCompleted { get; init; }
@@ -78,6 +81,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase
ScheduledFor = t.ScheduledFor,
DiffAdditions = add,
DiffDeletions = del,
CreatedAt = t.CreatedAt,
};
}