feat(FN-1030): enhance workflow results tab with summary bar, collapsible output, and always-visible tab

- Make Workflow tab always visible in TaskDetailModal (not conditional on enabled steps)
- Add summary bar showing pass/fail/skip counts with color-coded badges
- Make workflow step output collapsible with expand/collapse toggle
- Add enhanced empty states for no steps configured, all skipped, and no results
- Add CSS styles for summary bar, collapsible output, and empty state variants
- Update TaskDetailModal tests to reflect always-visible Workflow tab
- Add comprehensive tests for WorkflowResultsTab new features
This commit is contained in:
gsxdsm
2026-04-06 03:40:40 -07:00
parent 76770e6e14
commit 8fa3401d82
5 changed files with 304 additions and 52 deletions

View File

@@ -272,9 +272,8 @@ export function TaskDetailModal({
}, [projectId]);
// Load workflow results when workflow tab is active
const hasWorkflowSteps = (task.enabledWorkflowSteps?.length ?? 0) > 0 || (task.workflowStepResults?.length ?? 0) > 0;
useEffect(() => {
if (activeTab !== "workflow" || !hasWorkflowSteps) return;
if (activeTab !== "workflow") return;
let cancelled = false;
setWorkflowResultsLoading(true);
fetchWorkflowResults(task.id, projectId)
@@ -290,7 +289,7 @@ export function TaskDetailModal({
if (!cancelled) setWorkflowResultsLoading(false);
});
return () => { cancelled = true; };
}, [activeTab, task.id, projectId, hasWorkflowSteps, addToast]);
}, [activeTab, task.id, projectId, addToast]);
// Reset dependency search when dropdown closes
useEffect(() => {
@@ -862,18 +861,21 @@ export function TaskDetailModal({
>
Model
</button>
{hasWorkflowSteps && (
<button
className={`detail-tab${activeTab === "workflow" ? " detail-tab-active" : ""}`}
onClick={() => setActiveTab("workflow")}
>
Workflow
</button>
)}
<button
className={`detail-tab${activeTab === "workflow" ? " detail-tab-active" : ""}`}
onClick={() => setActiveTab("workflow")}
>
Workflow
</button>
</div>
{activeTab === "workflow" ? (
<div className="detail-section">
<WorkflowResultsTab taskId={task.id} results={workflowResults} loading={workflowResultsLoading} />
<WorkflowResultsTab
taskId={task.id}
results={workflowResults}
loading={workflowResultsLoading}
enabledWorkflowSteps={task.enabledWorkflowSteps}
/>
</div>
) : activeTab === "model" ? (
<div className="detail-section">