fix(ui): silent no-ops raise ErrorReported instead of swallowing failures (UX-Audit #1)

Stop/Enqueue/Dequeue/Reset&Retry (DetailsIslandViewModel), status/cancel/reject
commands (TasksIslandViewModel), Mission Control's drag-enqueue and queue
refresh, and "Open findings folder" (ListsIslandViewModel) used to catch {}
or silently return on a blocked precondition. They now report through the
existing ErrorReported -> FlashFooterError path, with new en/de locale keys
and Ui.Tests covering each converted command.
This commit is contained in:
mika kuns
2026-08-21 09:13:00 +02:00
parent fdd0e1e56a
commit 99bb5be5da
10 changed files with 468 additions and 20 deletions
@@ -119,7 +119,7 @@ public sealed partial class MissionControlViewModel : ViewModelBase, IDisposable
}
OnPropertyChanged(nameof(HasQueued));
}
catch { /* best-effort queue refresh */ }
catch (Exception ex) { ErrorReported?.Invoke(Loc.T("missionControl.queueRefreshFailed", ex.Message)); }
}
// Drop-to-queue: a task dragged from the main app onto Mission Control gets queued. Goes
@@ -130,7 +130,11 @@ public sealed partial class MissionControlViewModel : ViewModelBase, IDisposable
public async System.Threading.Tasks.Task EnqueueTaskAsync(string taskId)
{
if (string.IsNullOrEmpty(taskId)) return;
if (ConPtySessions.Any(s => s.TaskId == taskId)) return;
if (ConPtySessions.Any(s => s.TaskId == taskId))
{
ErrorReported?.Invoke(Loc.T("missionControl.enqueueAlreadyOpen"));
return;
}
try
{
var baseDirty = await _worker.SetTaskStatusAsync(taskId, ClaudeDo.Data.Models.TaskStatus.Queued);
@@ -138,7 +142,7 @@ public sealed partial class MissionControlViewModel : ViewModelBase, IDisposable
ErrorReported?.Invoke(Loc.T(
"vm.queue.baseDirtyWarning", baseDirty.ModifiedCount, baseDirty.UntrackedCount));
}
catch { /* best-effort enqueue */ }
catch (Exception ex) { ErrorReported?.Invoke(Loc.T("missionControl.enqueueFailed", ex.Message)); }
await RefreshQueueAsync();
}