fix(ui): Aktions- und Bestätigungs-Konsistenz (UX-Audit #3)

Sechs Konsistenz-Fixes: Delete-Task ins Zeilen-Kontextmenü (routet über den
Worker wie DetailsIslandViewModel.DeleteTaskAsync, damit ein gelöschtes Child
den WaitingForChildren-Parent korrekt weiterschaltet); EnqueueCommand als
"Send to queue"-Button im Detail-Pane verdrahtet; Settings-Eintrag im
Listen-Kontextmenü ergänzt; Worktree-Discard und Reset-All laufen jetzt über
das jeweils vorhandene Confirm-Hook (ConfirmAction / neuer ConfirmAsync-Hook
auf WorktreesSettingsTabViewModel) statt ohne Rückfrage bzw. über ein
Inline-Reveal-Banner; killSessionTip/closeSession und die deutschen
Queue-Strings im usageMonitor vereinheitlicht.

Kein zweiter Dialog-Mechanismus eingeführt — überall die vorhandenen Hooks
wiederverwendet.
This commit is contained in:
mika kuns
2026-08-21 09:51:51 +02:00
parent cc60cb4f0a
commit 2935eef75a
12 changed files with 144 additions and 32 deletions
@@ -1146,6 +1146,42 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable
"vm.queue.baseDirtyWarning", warning.ModifiedCount, warning.UntrackedCount));
}
// Row-level delete for the task context menu. Routed through the worker (mirrors
// DetailsIslandViewModel.DeleteTaskAsync) so a deleted child correctly advances a
// WaitingForChildren parent instead of bypassing TaskStateService.
[RelayCommand]
private async Task DeleteTaskAsync(TaskRowViewModel? row)
{
if (row is null || _worker is null) return;
if (ConfirmAsync is not null)
{
var ok = await ConfirmAsync(Loc.T("vm.tasksIsland.deleteTaskConfirm", row.Title));
if (!ok) return;
}
bool deleted;
string? error;
try
{
(deleted, error) = await _worker.DeleteTaskAsync(row.Id);
}
catch (Exception ex)
{
ErrorReported?.Invoke(Loc.T("vm.tasksIsland.deleteTaskFailed", ex.Message));
return;
}
if (!deleted)
{
ErrorReported?.Invoke(error ?? Loc.T("vm.tasksIsland.deleteTaskFailed", "unknown error"));
return;
}
Items.Remove(row);
Regroup();
UpdateSubtitle();
TasksChanged?.Invoke(this, EventArgs.Empty);
}
[RelayCommand]
private async Task SendToQueueAsync(TaskRowViewModel? row)
{