feat(ui): surface review actions and WaitingForReview status in task rows

Adds Approve/Reject/Park/Cancel buttons with a feedback flyout, a review
status chip, and a friendly status label for WaitingForReview tasks.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-06-02 07:46:37 +02:00
parent 21f1cf2a85
commit 6c27ffbdca
8 changed files with 152 additions and 9 deletions

View File

@@ -602,6 +602,42 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
catch { /* worker offline; the broadcast will reconcile when it returns */ }
}
// ── Review actions (visible when a task is WaitingForReview) ─────────────
// Each delegates to the worker hub, which performs the transition and
// broadcasts TaskUpdated; the row refreshes from that broadcast.
[RelayCommand]
private async Task ApproveReviewAsync(TaskRowViewModel? row)
{
if (row is null || !row.IsWaitingForReview || _worker is null) return;
try { await _worker.ApproveReviewAsync(row.Id); }
catch { /* offline; broadcast reconciles on return */ }
}
public async Task RejectReviewToQueueAsync(TaskRowViewModel row, string feedback)
{
if (!row.IsWaitingForReview || _worker is null) return;
if (string.IsNullOrWhiteSpace(feedback)) return;
try { await _worker.RejectReviewToQueueAsync(row.Id, feedback); }
catch { /* offline; broadcast reconciles on return */ }
}
[RelayCommand]
private async Task RejectReviewToIdleAsync(TaskRowViewModel? row)
{
if (row is null || !row.IsWaitingForReview || _worker is null) return;
try { await _worker.RejectReviewToIdleAsync(row.Id); }
catch { /* offline; broadcast reconciles on return */ }
}
[RelayCommand]
private async Task CancelReviewAsync(TaskRowViewModel? row)
{
if (row is null || !row.IsWaitingForReview || _worker is null) return;
try { await _worker.CancelReviewAsync(row.Id); }
catch { /* offline; broadcast reconciles on return */ }
}
public async Task SetScheduledForAsync(TaskRowViewModel row, DateTime? when)
{
if (row is null) return;