feat(ui): list reordering, quick actions, and resizable modals
- Drag-to-reorder user lists in the sidebar, persisted via a new list sort_order column (AddListSortOrder migration, backfilled by creation time) and ListRepository.ReorderAsync - "Open in Explorer" / "Open in Terminal" context-menu actions on lists - "Clear all completed" button on the Tasks island - Inline-edit subtask titles (empty text deletes the step) and click-to-copy task ID in the Details island - Make modal and planning windows resizable (BorderOnly decorations with min sizes) instead of fixed-size borderless Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -840,6 +840,35 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
|
||||
CloseDetail?.Invoke();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async System.Threading.Tasks.Task CommitSubtaskEditAsync(SubtaskRowViewModel? row)
|
||||
{
|
||||
if (row is null || !row.IsEditing) return;
|
||||
row.IsEditing = false;
|
||||
|
||||
var title = row.Title?.Trim() ?? "";
|
||||
await using var ctx = _dbFactory.CreateDbContext();
|
||||
var repo = new SubtaskRepository(ctx);
|
||||
|
||||
// Emptying the text removes the step.
|
||||
if (string.IsNullOrEmpty(title))
|
||||
{
|
||||
await repo.DeleteAsync(row.Id);
|
||||
Subtasks.Remove(row);
|
||||
return;
|
||||
}
|
||||
|
||||
var subs = await repo.GetByTaskIdAsync(Task?.Id ?? "");
|
||||
var entity = subs.FirstOrDefault(s => s.Id == row.Id);
|
||||
if (entity is null) return;
|
||||
if (entity.Title != title)
|
||||
{
|
||||
entity.Title = title;
|
||||
await repo.UpdateAsync(entity);
|
||||
}
|
||||
row.Title = title;
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async System.Threading.Tasks.Task AddSubtaskAsync()
|
||||
{
|
||||
@@ -943,6 +972,7 @@ public sealed partial class SubtaskRowViewModel : ViewModelBase
|
||||
public required string Id { get; init; }
|
||||
[ObservableProperty] private string _title = "";
|
||||
[ObservableProperty] private bool _done;
|
||||
[ObservableProperty] private bool _isEditing;
|
||||
[ObservableProperty] private ClaudeDo.Data.Models.TaskStatus _status;
|
||||
[ObservableProperty] private ClaudeDo.Data.Models.WorktreeState _worktreeState = ClaudeDo.Data.Models.WorktreeState.Active;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user